Skip to contentSkip to conversation

bridge hub_enabled option

PATCH In review Alpt 2 participants 3 messages Mar 26, 2005 – Mar 30, 2005

Subsystems (3)
lore
Share & tools
lore

Alpt

author
#0 lore raw

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
diff -ru a-2.6.11/include/linux/if_bridge.h b-2.6.11/include/linux/if_bridge.h
@@ -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
diff -ru a-2.6.11/net/bridge/br_if.c b-2.6.11/net/bridge/br_if.c
@@ -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
diff -ru a-2.6.11/net/bridge/br_input.c b-2.6.11/net/bridge/br_input.c
@@ -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
diff -ru a-2.6.11/net/bridge/br_ioctl.c b-2.6.11/net/bridge/br_ioctl.c
@@ -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
diff -ru a-2.6.11/net/bridge/br_private.h b-2.6.11/net/bridge/br_private.h
@@ -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
diff -ru a-2.6.11/net/bridge/br_sysfs_br.c b-2.6.11/net/bridge/br_sysfs_br.c
@@ -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,
#1 lore raw
Quoted 11 lines · 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?
Why not enforce the policy with ebtables?

Quoted 19 lines

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
Quoted 7 lines

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.

Also, since you broken the connectivity, anybody who is using multiple bridges and spanning tree is going to create dead zones.

author
#2 lore raw

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 ]