Files
wlan-ap/patches/0031-netifd-backport-bridge_isolate-patches.patch
John Crispin d329e3a9ca patches/: re-order and fold patches
Signed-off-by: John Crispin <john@phrozen.org>
2024-04-27 16:15:25 +02:00

264 lines
9.0 KiB
Diff

From 1c032d319de40e3eaf457fead60e558620005459 Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
Date: Wed, 22 Nov 2023 12:16:52 +0100
Subject: [PATCH 31/68] netifd: backport bridge_isolate patches
Signed-off-by: John Crispin <john@phrozen.org>
---
...-bogus-debug-error-messages-on-addin.patch | 45 +++++
...2-wireless-add-bridge_isolate-option.patch | 190 ++++++++++++++++++
2 files changed, 235 insertions(+)
create mode 100644 package/network/config/netifd/patches/0001-system-linux-fix-bogus-debug-error-messages-on-addin.patch
create mode 100644 package/network/config/netifd/patches/0002-wireless-add-bridge_isolate-option.patch
diff --git a/package/network/config/netifd/patches/0001-system-linux-fix-bogus-debug-error-messages-on-addin.patch b/package/network/config/netifd/patches/0001-system-linux-fix-bogus-debug-error-messages-on-addin.patch
new file mode 100644
index 0000000000..3f1ef587ea
--- /dev/null
+++ b/package/network/config/netifd/patches/0001-system-linux-fix-bogus-debug-error-messages-on-addin.patch
@@ -0,0 +1,45 @@
+From 7642eaba383869cab997d2e7ffdb1b58fd536e29 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Mon, 20 Nov 2023 18:35:49 +0100
+Subject: [PATCH 1/2] system-linux: fix bogus debug error messages on adding
+ bridge members
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ system-linux.c | 17 ++++++++++-------
+ 1 file changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/system-linux.c b/system-linux.c
+index cc1b5e9..96cc993 100644
+--- a/system-linux.c
++++ b/system-linux.c
+@@ -948,16 +948,19 @@ int system_bridge_addif(struct device *bridge, struct device *dev)
+ int tries = 0;
+ int ret;
+
+-retry:
+- ret = 0;
+- oldbr = system_get_bridge(dev->ifname, dev_buf, sizeof(dev_buf));
+- if (!oldbr || strcmp(oldbr, bridge->ifname) != 0) {
++
++ for (tries = 0; tries < 3; tries++) {
++ ret = 0;
++ oldbr = system_get_bridge(dev->ifname, dev_buf, sizeof(dev_buf));
++ if (oldbr && !strcmp(oldbr, bridge->ifname))
++ break;
++
+ ret = system_bridge_if(bridge->ifname, dev, SIOCBRADDIF, NULL);
+- tries++;
++ if (!ret)
++ break;
++
+ D(SYSTEM, "Failed to add device '%s' to bridge '%s' (tries=%d): %s\n",
+ dev->ifname, bridge->ifname, tries, strerror(errno));
+- if (tries <= 3)
+- goto retry;
+ }
+
+ if (dev->wireless)
+--
+2.34.1
+
diff --git a/package/network/config/netifd/patches/0002-wireless-add-bridge_isolate-option.patch b/package/network/config/netifd/patches/0002-wireless-add-bridge_isolate-option.patch
new file mode 100644
index 0000000000..2a2378ed38
--- /dev/null
+++ b/package/network/config/netifd/patches/0002-wireless-add-bridge_isolate-option.patch
@@ -0,0 +1,190 @@
+From f3e06e81b347bbdec1c6c71603328b6e442728d4 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Mon, 20 Nov 2023 19:03:06 +0100
+Subject: [PATCH 2/2] wireless: add bridge_isolate option
+
+This enables the device bridge port isolate flag
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ device.c | 5 +++-
+ scripts/netifd-wireless.sh | 2 ++
+ wireless.c | 48 +++++++++++++++++++++++++++-----------
+ wireless.h | 2 ++
+ 4 files changed, 42 insertions(+), 15 deletions(-)
+
+diff --git a/device.c b/device.c
+index 199622f..839f7ec 100644
+--- a/device.c
++++ b/device.c
+@@ -354,7 +354,10 @@ device_init_settings(struct device *dev, struct blob_attr **tb)
+ struct ether_addr *ea;
+ bool disabled = false;
+
+- s->flags = 0;
++ if (dev->wireless)
++ s->flags &= DEV_OPT_ISOLATE;
++ else
++ s->flags = 0;
+ if ((cur = tb[DEV_ATTR_ENABLED]))
+ disabled = !blobmsg_get_bool(cur);
+
+diff --git a/scripts/netifd-wireless.sh b/scripts/netifd-wireless.sh
+index 7f088cc..5b852e0 100644
+--- a/scripts/netifd-wireless.sh
++++ b/scripts/netifd-wireless.sh
+@@ -378,10 +378,12 @@ _wdev_common_device_config() {
+
+ _wdev_common_iface_config() {
+ config_add_string mode ssid encryption 'key:wpakey'
++ config_add_boolean bridge_isolate
+ }
+
+ _wdev_common_vlan_config() {
+ config_add_string name vid iface
++ config_add_boolean bridge_isolate
+ }
+
+ _wdev_common_station_config() {
+diff --git a/wireless.c b/wireless.c
+index 91663e8..654c87e 100644
+--- a/wireless.c
++++ b/wireless.c
+@@ -63,6 +63,7 @@ enum {
+ VIF_ATTR_DISABLED,
+ VIF_ATTR_NETWORK,
+ VIF_ATTR_NETWORK_VLAN,
++ VIF_ATTR_BRIDGE_ISOLATE,
+ VIF_ATTR_ISOLATE,
+ VIF_ATTR_MODE,
+ VIF_ATTR_PROXYARP,
+@@ -74,6 +75,7 @@ static const struct blobmsg_policy vif_policy[__VIF_ATTR_MAX] = {
+ [VIF_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
+ [VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY },
+ [VIF_ATTR_NETWORK_VLAN] = { .name = "network_vlan", .type = BLOBMSG_TYPE_ARRAY },
++ [VIF_ATTR_BRIDGE_ISOLATE] = { .name = "bridge_isolate", .type = BLOBMSG_TYPE_BOOL },
+ [VIF_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
+ [VIF_ATTR_MODE] = { .name = "mode", .type = BLOBMSG_TYPE_STRING },
+ [VIF_ATTR_PROXYARP] = { .name = "proxy_arp", .type = BLOBMSG_TYPE_BOOL },
+@@ -89,6 +91,7 @@ enum {
+ VLAN_ATTR_DISABLED,
+ VLAN_ATTR_NETWORK,
+ VLAN_ATTR_NETWORK_VLAN,
++ VLAN_ATTR_BRIDGE_ISOLATE,
+ VLAN_ATTR_ISOLATE,
+ VLAN_ATTR_MCAST_TO_UCAST,
+ __VLAN_ATTR_MAX,
+@@ -98,6 +101,7 @@ static const struct blobmsg_policy vlan_policy[__VLAN_ATTR_MAX] = {
+ [VLAN_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
+ [VLAN_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY },
+ [VLAN_ATTR_NETWORK_VLAN] = { .name = "network_vlan", .type = BLOBMSG_TYPE_ARRAY },
++ [VLAN_ATTR_BRIDGE_ISOLATE] = { .name = "bridge_isolate", .type = BLOBMSG_TYPE_BOOL },
+ [VLAN_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
+ [VLAN_ATTR_MCAST_TO_UCAST] = { .name = "multicast_to_unicast", .type = BLOBMSG_TYPE_BOOL },
+ };
+@@ -338,6 +342,7 @@ static void wireless_interface_handle_link(struct wireless_interface *vif, const
+ struct interface *iface;
+ struct blob_attr *cur;
+ const char *network;
++ struct device *dev;
+ size_t rem;
+
+ if (!vif->network || !vif->ifname)
+@@ -346,19 +351,27 @@ static void wireless_interface_handle_link(struct wireless_interface *vif, const
+ if (!ifname)
+ ifname = vif->ifname;
+
+- if (up) {
+- struct device *dev = __device_get(ifname, 2, false);
++ if (!up)
++ goto out;
+
+- if (dev && !strcmp(ifname, vif->ifname)) {
+- dev->wireless_isolate = vif->isolate;
+- dev->wireless_proxyarp = vif->proxyarp;
+- dev->wireless = true;
+- dev->wireless_ap = vif->ap_mode;
+- wireless_device_set_mcast_to_unicast(dev, vif->multicast_to_unicast);
+- dev->bpdu_filter = dev->wireless_ap;
+- }
+- }
++ dev = __device_get(ifname, 2, false);
++ if (!dev)
++ goto out;
+
++ dev->wireless = true;
++ dev->settings.flags |= DEV_OPT_ISOLATE;
++ dev->settings.isolate = vif->bridge_isolate;
++
++ if (strcmp(ifname, vif->ifname) != 0)
++ goto out;
++
++ dev->wireless_isolate = vif->isolate;
++ dev->wireless_proxyarp = vif->proxyarp;
++ dev->wireless_ap = vif->ap_mode;
++ wireless_device_set_mcast_to_unicast(dev, vif->multicast_to_unicast);
++ dev->bpdu_filter = dev->wireless_ap;
++
++out:
+ blobmsg_for_each_attr(cur, vif->network, rem) {
+ network = blobmsg_data(cur);
+
+@@ -387,6 +400,8 @@ static void wireless_vlan_handle_link(struct wireless_vlan *vlan, bool up)
+ dev->wireless = true;
+ dev->wireless_ap = true;
+ dev->bpdu_filter = true;
++ dev->settings.flags |= DEV_OPT_ISOLATE;
++ dev->settings.isolate = vlan->bridge_isolate;
+ wireless_device_set_mcast_to_unicast(dev, vlan->multicast_to_unicast);
+ }
+ }
+@@ -834,8 +849,11 @@ wireless_interface_init_config(struct wireless_interface *vif)
+ cur = tb[VIF_ATTR_MODE];
+ vif->ap_mode = cur && !strcmp(blobmsg_get_string(cur), "ap");
+
++ cur = tb[VIF_ATTR_BRIDGE_ISOLATE];
++ vif->bridge_isolate = cur && blobmsg_get_bool(cur);
++
+ cur = tb[VIF_ATTR_ISOLATE];
+- vif->isolate = vif->ap_mode && cur && blobmsg_get_bool(cur);
++ vif->isolate = cur && blobmsg_get_bool(cur);
+
+ cur = tb[VIF_ATTR_PROXYARP];
+ vif->proxyarp = vif->ap_mode && cur && blobmsg_get_bool(cur);
+@@ -912,9 +930,11 @@ wireless_vlan_init_config(struct wireless_vlan *vlan)
+ if ((cur = tb[VLAN_ATTR_NETWORK_VLAN]))
+ vlan->network_vlan = cur;
+
++ cur = tb[VLAN_ATTR_BRIDGE_ISOLATE];
++ vlan->bridge_isolate = cur && blobmsg_get_bool(cur);
++
+ cur = tb[VLAN_ATTR_ISOLATE];
+- if (cur)
+- vlan->isolate = blobmsg_get_bool(cur);
++ vlan->isolate = cur && blobmsg_get_bool(cur);
+
+ cur = tb[VLAN_ATTR_MCAST_TO_UCAST];
+ vlan->multicast_to_unicast = cur ? blobmsg_get_bool(cur) : -1;
+diff --git a/wireless.h b/wireless.h
+index f8bbd2f..7059723 100644
+--- a/wireless.h
++++ b/wireless.h
+@@ -90,6 +90,7 @@ struct wireless_interface {
+ struct blob_attr *network_vlan;
+ bool proxyarp;
+ bool isolate;
++ bool bridge_isolate;
+ bool ap_mode;
+ int multicast_to_unicast;
+ int vlan_idx;
+@@ -110,6 +111,7 @@ struct wireless_vlan {
+ struct blob_attr *network_vlan;
+ int multicast_to_unicast;
+ bool isolate;
++ bool bridge_isolate;
+ };
+
+ struct wireless_station {
+--
+2.34.1
+
--
2.34.1