hostapd: use rtnl to set up interfaces
authorFelix Fietkau <nbd@nbd.name>
Wed, 8 Nov 2023 10:20:41 +0000 (11:20 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 8 Nov 2023 11:46:29 +0000 (12:46 +0100)
In wpa_supplicant, set up wlan interfaces before adding them

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/services/hostapd/files/common.uc
package/network/services/hostapd/files/wdev.uc
package/network/services/hostapd/files/wpa_supplicant.uc

index 8399d3ff960abcefaddb297ac1e850430427271e..4c33779af935e1051ad220310b2d4d5559aa1054 100644 (file)
@@ -144,6 +144,11 @@ function wdev_set_mesh_params(name, data)
        return nl80211.error();
 }
 
+function wdev_set_up(name, up)
+{
+       rtnl.request(rtnl.const.RTM_SETLINK, 0, { dev: name, change: 1, flags: up ? 1 : 0 });
+}
+
 function phy_sysfs_file(phy, name)
 {
        return trim(readfile(`/sys/class/ieee80211/${phy}/${name}`));
@@ -365,4 +370,4 @@ function vlist_new(cb) {
                }, vlist_proto);
 }
 
-export { wdev_remove, wdev_create, wdev_set_mesh_params, is_equal, vlist_new, phy_is_fullmac, phy_open };
+export { wdev_remove, wdev_create, wdev_set_mesh_params, wdev_set_up, is_equal, vlist_new, phy_is_fullmac, phy_open };
index 800bb32d24ffcb646bcf1e59d708bfeac54752c1..ff4d629fd64d0eb351938c7d7a371c6b76868fc8 100644 (file)
@@ -1,6 +1,6 @@
 #!/usr/bin/env ucode
 'use strict';
-import { vlist_new, is_equal, wdev_create, wdev_set_mesh_params, wdev_remove, phy_open } from "/usr/share/hostap/common.uc";
+import { vlist_new, is_equal, wdev_create, wdev_set_mesh_params, wdev_remove, wdev_set_up, phy_open } from "/usr/share/hostap/common.uc";
 import { readfile, writefile, basename, readlink, glob } from "fs";
 let libubus = require("ubus");
 
@@ -22,7 +22,7 @@ function iface_start(wdev)
        let ifname = wdev.ifname;
 
        if (readfile(`/sys/class/net/${ifname}/ifindex`)) {
-               system([ "ip", "link", "set", "dev", ifname, "down" ]);
+               wdev_set_up(ifname, false);
                wdev_remove(ifname);
        }
        let wdev_config = {};
@@ -31,7 +31,7 @@ function iface_start(wdev)
        if (!wdev_config.macaddr && wdev.mode != "monitor")
                wdev_config.macaddr = phydev.macaddr_next();
        wdev_create(phy, ifname, wdev_config);
-       system([ "ip", "link", "set", "dev", ifname, "up" ]);
+       wdev_set_up(ifname, true);
        if (wdev.freq)
                system(`iw dev ${ifname} set freq ${wdev.freq} ${wdev.htmode}`);
        if (wdev.mode == "adhoc") {
index c3fd73dfee8d5597bf08cf04d74abcd2c020ca5e..d624f27cddc1deb61a540fdbf3d39f5a378dbbb7 100644 (file)
@@ -1,6 +1,6 @@
 let libubus = require("ubus");
 import { open, readfile } from "fs";
-import { wdev_create, wdev_set_mesh_params, wdev_remove, is_equal, vlist_new, phy_open } from "common";
+import { wdev_create, wdev_set_mesh_params, wdev_remove, is_equal, wdev_set_up, vlist_new, phy_open } from "common";
 
 let ubus = libubus.connect();
 
@@ -40,6 +40,7 @@ function iface_start(phydev, iface, macaddr_list)
        let ret = wdev_create(phy, ifname, wdev_config);
        if (ret)
                wpas.printf(`Failed to create device ${ifname}: ${ret}`);
+       wdev_set_up(ifname, true);
        wpas.add_iface(iface.config);
        iface.running = true;
 }