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
PS: I'm resending this mail because after 7 hours I don't see it in the ml.
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,