hostapd: add ubus notifications for adding/removing vlan interfaces
authorFelix Fietkau <nbd@nbd.name>
Tue, 18 May 2021 10:16:11 +0000 (12:16 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 18 May 2021 10:52:52 +0000 (12:52 +0200)
This can be used to handle network configuration of dynamically created vlan
interfaces in a more flexible way

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/services/hostapd/patches/600-ubus_support.patch
package/network/services/hostapd/patches/700-wifi-reload.patch
package/network/services/hostapd/src/src/ap/ubus.c
package/network/services/hostapd/src/src/ap/ubus.h

index 938840755a79c5147d3b135c89f24f1240c42a4e..0d1cb2c3e48b8139e3acb6b0d30147cc4b5cdf85 100644 (file)
  }
  
  
+--- a/src/ap/vlan_init.c
++++ b/src/ap/vlan_init.c
+@@ -22,6 +22,7 @@
+ static int vlan_if_add(struct hostapd_data *hapd, struct hostapd_vlan *vlan,
+                      int existsok)
+ {
++      bool vlan_exists = iface_exists(vlan->ifname);
+       int ret;
+ #ifdef CONFIG_WEP
+       int i;
+@@ -36,7 +37,7 @@ static int vlan_if_add(struct hostapd_da
+       }
+ #endif /* CONFIG_WEP */
+-      if (!iface_exists(vlan->ifname))
++      if (!vlan_exists)
+               ret = hostapd_vlan_if_add(hapd, vlan->ifname);
+       else if (!existsok)
+               return -1;
+@@ -51,6 +52,9 @@ static int vlan_if_add(struct hostapd_da
+       if (hapd->wpa_auth)
+               ret = wpa_auth_ensure_group(hapd->wpa_auth, vlan->vlan_id);
++      if (!ret && !vlan_exists)
++              hostapd_ubus_add_vlan(hapd, vlan);
++
+       if (ret == 0)
+               return ret;
+@@ -77,6 +81,8 @@ int vlan_if_remove(struct hostapd_data *
+                          "WPA deinitialization for VLAN %d failed (%d)",
+                          vlan->vlan_id, ret);
++      hostapd_ubus_remove_vlan(hapd, vlan);
++
+       return hostapd_vlan_if_remove(hapd, vlan->ifname);
+ }
index d5520d0b77dca541fb4fb044303f861ee45598ac..b68c1aaa9da9a33f91c0fc1922dcbad95cf8ff02 100644 (file)
  hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
 --- a/src/drivers/driver_nl80211.c
 +++ b/src/drivers/driver_nl80211.c
-@@ -4493,6 +4493,9 @@ static int wpa_driver_nl80211_set_ap(voi
+@@ -4511,6 +4511,9 @@ static int wpa_driver_nl80211_set_ap(voi
        if (ret) {
                wpa_printf(MSG_DEBUG, "nl80211: Beacon set failed: %d (%s)",
                           ret, strerror(-ret));
index d03b848f94bfc763af93f15dbaf6f33b114b72bb..a34695f36a249c0368719de977383cd3177fad68 100644 (file)
@@ -1364,6 +1364,43 @@ void hostapd_ubus_free_bss(struct hostapd_data *hapd)
        free(name);
 }
 
+static void
+hostapd_ubus_vlan_action(struct hostapd_data *hapd, struct hostapd_vlan *vlan,
+                        const char *action)
+{
+       struct vlan_description *desc = &vlan->vlan_desc;
+       void *c;
+       int i;
+
+       if (!hapd->ubus.obj.has_subscribers)
+               return;
+
+       blob_buf_init(&b, 0);
+       blobmsg_add_string(&b, "ifname", vlan->ifname);
+       blobmsg_add_string(&b, "bridge", vlan->bridge);
+       blobmsg_add_u32(&b, "vlan_id", vlan->vlan_id);
+
+       if (desc->notempty) {
+               blobmsg_add_u32(&b, "untagged", desc->untagged);
+               c = blobmsg_open_array(&b, "tagged");
+               for (i = 0; i < ARRAY_SIZE(desc->tagged) && desc->tagged[i]; i++)
+                       blobmsg_add_u32(&b, "", desc->tagged[i]);
+               blobmsg_close_array(&b, c);
+       }
+
+       ubus_notify(ctx, &hapd->ubus.obj, action, b.head, -1);
+}
+
+void hostapd_ubus_add_vlan(struct hostapd_data *hapd, struct hostapd_vlan *vlan)
+{
+       hostapd_ubus_vlan_action(hapd, vlan, "vlan_add");
+}
+
+void hostapd_ubus_remove_vlan(struct hostapd_data *hapd, struct hostapd_vlan *vlan)
+{
+       hostapd_ubus_vlan_action(hapd, vlan, "vlan_remove");
+}
+
 static const struct ubus_method daemon_methods[] = {
        UBUS_METHOD("config_add", hostapd_config_add, config_add_policy),
        UBUS_METHOD("config_remove", hostapd_config_remove, config_remove_policy),
index e16017394fd8a0fb2093a3fd0ede3783577f0af5..de0d1182fd300c47522886f0b7f4af1410a9247c 100644 (file)
@@ -43,6 +43,8 @@ void hostapd_ubus_add_iface(struct hostapd_iface *iface);
 void hostapd_ubus_free_iface(struct hostapd_iface *iface);
 void hostapd_ubus_add_bss(struct hostapd_data *hapd);
 void hostapd_ubus_free_bss(struct hostapd_data *hapd);
+void hostapd_ubus_add_vlan(struct hostapd_data *hapd, struct hostapd_vlan *vlan);
+void hostapd_ubus_remove_vlan(struct hostapd_data *hapd, struct hostapd_vlan *vlan);
 
 int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct hostapd_ubus_request *req);
 void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *mac);