]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Use control port TX (status) in AP mode if possible
authorMarkus Theil <markus.theil@tu-ilmenau.de>
Wed, 10 Jun 2020 08:32:58 +0000 (10:32 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 21 Jun 2020 15:07:54 +0000 (18:07 +0300)
Check if nl80211 control port TX status is available in the kernel and
enable control port TX if so. With this feature, nl80211 control path is
able to provide the same feature set as nl80211 (management) + AF_PACKET
socket (control) before.

For debugging and testing, this can explicitly be disabled with
the driver parameter control_port_ap=0.

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
src/drivers/driver_nl80211.c

index 7e3b3f40dd362b989f690eee34d604f7ccd1b7e5..87a11a5959147062d6bb9f3ea1aebec71e1a8f2e 100644 (file)
@@ -2172,6 +2172,11 @@ static void * wpa_driver_nl80211_drv_init(void *ctx, const char *ifname,
        if (wpa_driver_nl80211_finish_drv_init(drv, set_addr, 1, driver_params))
                goto failed;
 
+       if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS) {
+               drv->control_port_ap = 1;
+               goto skip_wifi_status;
+       }
+
        drv->eapol_tx_sock = socket(PF_PACKET, SOCK_DGRAM, 0);
        if (drv->eapol_tx_sock < 0)
                goto failed;
@@ -2195,6 +2200,7 @@ static void * wpa_driver_nl80211_drv_init(void *ctx, const char *ifname,
                                drv, NULL);
                }
        }
+skip_wifi_status:
 
        if (drv->global) {
                nl80211_check_global(drv->global);
@@ -8313,12 +8319,19 @@ static int nl80211_set_param(void *priv, const char *param)
 
        if (os_strstr(param, "control_port=0")) {
                drv->capa.flags &= ~WPA_DRIVER_FLAGS_CONTROL_PORT;
-               drv->capa.flags2 &= ~WPA_DRIVER_FLAGS2_CONTROL_PORT_RX;
+               drv->capa.flags2 &= ~(WPA_DRIVER_FLAGS2_CONTROL_PORT_RX |
+                                     WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS);
+               drv->control_port_ap = 0;
        }
 
        if (os_strstr(param, "control_port_ap=1"))
                drv->control_port_ap = 1;
 
+       if (os_strstr(param, "control_port_ap=0")) {
+               drv->capa.flags2 &= ~WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS;
+               drv->control_port_ap = 0;
+       }
+
        if (os_strstr(param, "full_ap_client_state=0"))
                drv->capa.flags &= ~WPA_DRIVER_FLAGS_FULL_AP_CLIENT_STATE;