bridge hub_enabled option
Subsystems (3)
PATCH 1/1 bridge hub_enabled option
Bridge hub_enabled patch:
this patch adds the hub_enabled option for bridge.
By default the hub_enabled flag is set to 1. In this case nothing changes, the bridge, as usually, acts as a hub and flood_forward the input pkts to all its ports. When hun_enabled is set to 0, the bridge stops to flood_forward the input traffic and takes only the pkts sent to it.
Disabling the hub option is useful to join multiple interfaces into a unique virtual one, thus becomes possible to have easily an ad-hoc network topology using multiple interfaces.
For example:
A(eth0) --- (eth1)B(eth0) --- (eth1)C BRIDGE NO HUB br0
A and C must not be directly connected, and B must have only one interface, in this case br0.
This scenario is possible only disabling the hub behavior of the bridge.
To clarify, this topology is the same of having:
A(wlan0)\ /(wlan0)C \ / \ / (wlan0) B
A and C don't see each other.
Maybe the hub_enabled option may be useful for something else ^_-
The patch is simple and stupid, and it seems to work.
It can be found also here:
http://freaknet.org/alpt/src/bridge-hub/bridge-2.6.11-hub.patch
The patch to update the bridge-utils is here:
http://freaknet.org/alpt/src/bridge-hub/bridge-utils-1.0.6-hub.patch
Here attached there is only the patch for the net/bridge code.
Best Regards
Signature · 6 lines
:wq! "I don't know nothing" The One Who reached the Thinking Matter '.' [ Alpt --- Freaknet Medialab ] [ GPG Key ID 441CF0EE ] [ Key fingerprint = 8B02 26E8 831A 7BB9 81A9 5277 BFF8 037E 441C F0EE ]
include/linux/if_bridge.h +2 -0
@@ -44,6 +44,7 @@#define BRCTL_SET_PORT_PRIORITY 16#define BRCTL_SET_PATH_COST 17#define BRCTL_GET_FDB_ENTRIES 18 +#define BRCTL_SET_BRIDGE_HUB_STATE 19#define BR_STATE_DISABLED 0#define BR_STATE_LISTENING 1
@@ -65,6 +66,7 @@__u8 topology_change;__u8 topology_change_detected;__u8 root_port; +__u8 hub_enabled;__u8 stp_enabled;__u32 ageing_time;__u32 gc_interval;
net/bridge/br_if.c +2 -0
@@ -155,6 +155,8 @@ br->bridge_id.prio[1 ] =0x00 ;memset (br->bridge_id.addr,0 ,ETH_ALEN ); + br->hub_enabled =1 ; + br->stp_enabled =0 ; br->designated_root = br->bridge_id; br->root_path_cost =0 ;
net/bridge/br_input.c +3 -2
@@ -80,12 +80,13 @@ goto out; } -if (dst !=NULL ) { +if (dst !=NULL && br->hub_enabled) {br_forward (dst->dst, skb); goto out; } -br_flood_forward (br, skb,0 ); +if (br->hub_enabled) +br_flood_forward (br, skb,0 ); out:return 0 ;
net/bridge/br_ioctl.c +8 -0
@@ -135,6 +135,7 @@ b.topology_change = br->topology_change; b.topology_change_detected = br->topology_change_detected; b.root_port = br->root_port; + b.hub_enabled = br->hub_enabled; b.stp_enabled = br->stp_enabled; b.ageing_time =jiffies_to_clock_t (br->ageing_time); b.hello_timer_value =br_timer_value (&br->hello_timer);
@@ -247,6 +248,13 @@return 0 ; } +case BRCTL_SET_BRIDGE_HUB_STATE : +if (!capable (CAP_NET_ADMIN )) +return -EPERM ; + + br->hub_enabled = args[1 ]?1 :0 ; +return 0 ; +case BRCTL_SET_BRIDGE_STP_STATE :if (!capable (CAP_NET_ADMIN ))return -EPERM ;
net/bridge/br_private.h +2 -0
@@ -93,6 +93,8 @@struct hlist_head hash[BR_HASH_SIZE ];struct list_head age_list; +unsigned char hub_enabled; +/* STP */ bridge_id designated_root;bridge_id bridge_id;
net/bridge/br_sysfs_br.c +23 -0
@@ -136,6 +136,28 @@ static CLASS_DEVICE_ATTR(ageing_time, S_IRUGO | S_IWUSR, show_ageing_time, store_ageing_time); + +static ssize_t show_hub_state (struct class_device *cd,char *buf) +{ +struct net_bridge *br =to_bridge (cd); +return sprintf (buf,"%d\n" , br->hub_enabled); +} + +static void set_hub_state (struct net_bridge *br,unsigned long val) +{ + br->hub_enabled = val; +} + +static ssize_t store_hub_state (struct class_device *cd, +const char *buf,size_t len) +{ +return store_bridge_parm (cd, buf, len, set_hub_state); +} + +static CLASS_DEVICE_ATTR(hub_state, S_IRUGO | S_IWUSR, show_hub_state, + store_hub_state); + +static ssize_t show_stp_state (struct class_device *cd,char *buf) {struct net_bridge *br =to_bridge (cd);
@@ -246,6 +268,7 @@ &class_device_attr_hello_time.attr, &class_device_attr_max_age.attr, &class_device_attr_ageing_time.attr, + &class_device_attr_hub_state.attr, &class_device_attr_stp_state.attr, &class_device_attr_priority.attr, &class_device_attr_bridge_id.attr,
Quoted 11 lines · On Sat, 26 Mar 2005 23:40:30 +0100 Alpt <[email protected]> wrote:
Bridge
hub_enabledpatch:
this patch adds thehub_enabledoption for bridge.By default the
hub_enabledflag is set to 1. In this case nothing changes, the bridge, as usually, acts as a hub andflood_forwardthe input pkts to all its ports. Whenhun_enabledis set to 0, the bridge stops toflood_forwardthe input traffic and takes only the pkts sent to it.
Disabling the hub option is useful to join multiple interfaces into a unique virtual one, thus becomes possible to have easily an ad-hoc network topology using multiple interfaces.
Could you give a better example of how this would be useful? Why would you not want A to talk to C?
Why not enforce the policy with ebtables?
Quoted 19 lines
For example:
A(eth0) --- (eth1)B(eth0) --- (eth1)C BRIDGE NO HUB br0A and C must not be directly connected, and B must have only one interface, in this case br0.
This scenario is possible only disabling the hub behavior of the bridge.To clarify, this topology is the same of having:
A(wlan0)\ /(wlan0)C \ / \ / (wlan0) B
Quoted 7 lines
A and C don't see each other.
Maybe the
hub_enabledoption may be useful for something else ^_-The patch is simple and stupid, and it seems to work.
Also, since you broken the connectivity, anybody who is using multiple bridges and spanning tree is going to create dead zones.
On Tue, Mar 29, 2005 at 02:27:19PM -0800, Stephen Hemminger wrote :
~> On Sat, 26 Mar 2005 23:40:30 +0100
~> Alpt <[email protected]> wrote:
~> > Bridge hub_enabled patch:
~> > this patch adds the hub_enabled option for bridge.
~> >
~> > By default the hub_enabled flag is set to 1. In this case nothing changes, the ~> > bridge, as usually, acts as a hub and flood_forward the input pkts to all its ~> > ports. When hun_enabled is set to 0, the bridge stops to flood_forward the input ~> > traffic and takes only the pkts sent to it.
~> > Disabling the hub option is useful to join multiple interfaces into a unique virtual ~> > one, thus becomes possible to have easily an ad-hoc network topology using multiple ~> > interfaces.
~>
~> Could you give a better example of how this would be useful?
~> Why would you not want A to talk to C?
For example to test a routing protocol.
~> Why not enforce the policy with ebtables?
To not rely to the ip addresses but just having x interfaces merged and to have a cleaner and simpler way to do it.
Regards
Signature · 6 lines
:wq! "I don't know nothing" The One Who reached the Thinking Matter '.' [ Alpt --- Freaknet Medialab ] [ GPG Key ID 441CF0EE ] [ Key fingerprint = 8B02 26E8 831A 7BB9 81A9 5277 BFF8 037E 441C F0EE ]