hostapd: fix wpa_supplicant bringup with non-nl80211 drivers
authorFelix Fietkau <nbd@nbd.name>
Fri, 22 Sep 2023 05:58:45 +0000 (07:58 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 22 Sep 2023 06:11:04 +0000 (08:11 +0200)
Needed for wired 802.1x

Signed-off-by: Felix Fietkau <nbd@nbd.name>
(cherry picked from commit fd6d7aafb2c3d335a3d192c308ffdace8d292e9f)

package/network/services/hostapd/src/wpa_supplicant/ucode.c

index 55d22584ff4d4d8a9309edfe3b87a54ed7f17e73..6cba73dcd53240758d33bd917b0405ea32a5a6b5 100644 (file)
@@ -136,6 +136,7 @@ static uc_value_t *
 uc_wpas_add_iface(uc_vm_t *vm, size_t nargs)
 {
        uc_value_t *info = uc_fn_arg(0);
+       uc_value_t *driver = ucv_object_get(info, "driver", NULL);
        uc_value_t *ifname = ucv_object_get(info, "iface", NULL);
        uc_value_t *bridge = ucv_object_get(info, "bridge", NULL);
        uc_value_t *config = ucv_object_get(info, "config", NULL);
@@ -154,6 +155,22 @@ uc_wpas_add_iface(uc_vm_t *vm, size_t nargs)
                .ctrl_interface = ucv_string_get(ctrl),
        };
 
+       if (driver) {
+               const char *drvname;
+               if (ucv_type(driver) != UC_STRING)
+                       goto out;
+
+               iface.driver = NULL;
+               drvname = ucv_string_get(driver);
+               for (int i = 0; wpa_drivers[i]; i++) {
+                       if (!strcmp(drvname, wpa_drivers[i]->name))
+                               iface.driver = wpa_drivers[i]->name;
+               }
+
+               if (!iface.driver)
+                       goto out;
+       }
+
        if (!iface.ifname || !iface.confname)
                goto out;