123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- From e988390850731aa1697ed09d47b0932fac1af175 Mon Sep 17 00:00:00 2001
- From: Felix Fietkau <[email protected]>
- Date: Fri, 7 Jul 2017 17:20:03 +0200
- Subject: bridge: port isolate
- Isolating individual bridge ports
- Signed-off-by: Felix Fietkau <[email protected]>
- ---
- include/linux/if_bridge.h | 1 +
- net/bridge/br_forward.c | 5 +++++
- net/bridge/br_input.c | 3 +++
- net/bridge/br_sysfs_if.c | 2 ++
- 4 files changed, 11 insertions(+)
- Index: linux-4.9.34/include/linux/if_bridge.h
- ===================================================================
- --- linux-4.9.34.orig/include/linux/if_bridge.h
- +++ linux-4.9.34/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)
-
- Index: linux-4.9.34/net/bridge/br_forward.c
- ===================================================================
- --- linux-4.9.34.orig/net/bridge/br_forward.c
- +++ linux-4.9.34/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;
- Index: linux-4.9.34/net/bridge/br_input.c
- ===================================================================
- --- linux-4.9.34.orig/net/bridge/br_input.c
- +++ linux-4.9.34/net/bridge/br_input.c
- @@ -175,6 +175,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);
- Index: linux-4.9.34/net/bridge/br_sysfs_if.c
- ===================================================================
- --- linux-4.9.34.orig/net/bridge/br_sysfs_if.c
- +++ linux-4.9.34/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
- };
-
|