mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-30 10:39:04 +00:00
67 lines
2.1 KiB
Diff
67 lines
2.1 KiB
Diff
|
From: Felix Fietkau <nbd@nbd.name>
|
||
|
Subject: [PATCH] bridge: port isolate
|
||
|
|
||
|
Isolating individual bridge ports
|
||
|
---
|
||
|
--- a/include/linux/if_bridge.h
|
||
|
+++ b/include/linux/if_bridge.h
|
||
|
@@ -47,6 +47,7 @@ struct br_ip_list {
|
||
|
#define BR_PROXYARP_WIFI BIT(10)
|
||
|
#define BR_MCAST_FLOOD BIT(11)
|
||
|
#define BR_MULTICAST_TO_UNICAST BIT(12)
|
||
|
+#define BR_ISOLATE_MODE BIT(13)
|
||
|
|
||
|
#define BR_DEFAULT_AGEING_TIME (300 * HZ)
|
||
|
|
||
|
--- a/net/bridge/br_sysfs_if.c
|
||
|
+++ b/net/bridge/br_sysfs_if.c
|
||
|
@@ -172,6 +172,7 @@ BRPORT_ATTR_FLAG(unicast_flood, BR_FLOOD
|
||
|
BRPORT_ATTR_FLAG(proxyarp, BR_PROXYARP);
|
||
|
BRPORT_ATTR_FLAG(proxyarp_wifi, BR_PROXYARP_WIFI);
|
||
|
BRPORT_ATTR_FLAG(multicast_flood, BR_MCAST_FLOOD);
|
||
|
+BRPORT_ATTR_FLAG(isolate_mode, BR_ISOLATE_MODE);
|
||
|
|
||
|
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
|
||
|
static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
|
||
|
@@ -220,6 +221,7 @@ static const struct brport_attribute *br
|
||
|
&brport_attr_proxyarp,
|
||
|
&brport_attr_proxyarp_wifi,
|
||
|
&brport_attr_multicast_flood,
|
||
|
+ &brport_attr_isolate_mode,
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
--- a/net/bridge/br_forward.c
|
||
|
+++ b/net/bridge/br_forward.c
|
||
|
@@ -141,6 +141,9 @@ static int deliver_clone(const struct ne
|
||
|
void br_forward(const struct net_bridge_port *to,
|
||
|
struct sk_buff *skb, bool local_rcv, bool local_orig)
|
||
|
{
|
||
|
+ if (to->flags & BR_ISOLATE_MODE)
|
||
|
+ to = NULL;
|
||
|
+
|
||
|
if (to && should_deliver(to, skb)) {
|
||
|
if (local_rcv)
|
||
|
deliver_clone(to, skb, local_orig);
|
||
|
@@ -206,6 +209,8 @@ void br_flood(struct net_bridge *br, str
|
||
|
struct net_bridge_port *p;
|
||
|
|
||
|
list_for_each_entry_rcu(p, &br->port_list, list) {
|
||
|
+ if (!local_orig && (p->flags & BR_ISOLATE_MODE))
|
||
|
+ continue;
|
||
|
/* Do not flood unicast traffic to ports that turn it off */
|
||
|
if (pkt_type == BR_PKT_UNICAST && !(p->flags & BR_FLOOD))
|
||
|
continue;
|
||
|
--- a/net/bridge/br_input.c
|
||
|
+++ b/net/bridge/br_input.c
|
||
|
@@ -174,6 +174,9 @@ int br_handle_frame_finish(struct net *n
|
||
|
if (IS_ENABLED(CONFIG_INET) && skb->protocol == htons(ETH_P_ARP))
|
||
|
br_do_proxy_arp(skb, br, vid, p);
|
||
|
|
||
|
+ if (p->flags & BR_ISOLATE_MODE)
|
||
|
+ return br_pass_frame_up(skb);
|
||
|
+
|
||
|
switch (pkt_type) {
|
||
|
case BR_PKT_MULTICAST:
|
||
|
mdst = br_mdb_get(br, skb, vid);
|