mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-30 10:02:53 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			264 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| 
 | 
