On Sun, Mar 27, 2005 at 11:27:00AM +0200, Alpt after a spiritual call 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. ~> [...] The document describing this patch is here: http://www.freaknet.org/alpt/src/bridge-hub/readme There is a small correction for this patch. The new version is attached here and be be found also here: http://www.freaknet.org/alpt/src/bridge-hub/bridge-2.6.11-hub.patch The patch for the bridge-utils: http://www.freaknet.org/alpt/src/bridge-hub/bridge-utils-1.0.6-hub.patch Thanks go to Craig Robson. Regards, let me know. -- :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 ]
diff -ru a-2.6.11/include/linux/if_bridge.h b-2.6.11/include/linux/if_bridge.h --- a-2.6.11/include/linux/if_bridge.h 2005-03-02 08:38:09.000000000 +0100 +++ b-2.6.11/include/linux/if_bridge.h 2005-03-25 23:57:19.000000000 +0100 @@ -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; diff -ru a-2.6.11/net/bridge/br_if.c b-2.6.11/net/bridge/br_if.c --- a-2.6.11/net/bridge/br_if.c 2005-03-02 08:38:33.000000000 +0100 +++ b-2.6.11/net/bridge/br_if.c 2005-03-25 23:56:56.000000000 +0100 @@ -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; diff -ru a-2.6.11/net/bridge/br_input.c b-2.6.11/net/bridge/br_input.c --- a-2.6.11/net/bridge/br_input.c 2005-03-02 08:37:50.000000000 +0100 +++ b-2.6.11/net/bridge/br_input.c 2005-03-29 13:07:04.000000000 +0200 @@ -65,7 +65,8 @@ } if (dest[0] & 1) { - br_flood_forward(br, skb, !passedup); + if(br->hub_enabled) + br_flood_forward(br, skb, !passedup); if (!passedup) br_pass_frame_up(br, skb); goto out; @@ -80,12 +81,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; diff -ru a-2.6.11/net/bridge/br_ioctl.c b-2.6.11/net/bridge/br_ioctl.c --- a-2.6.11/net/bridge/br_ioctl.c 2005-03-02 08:37:49.000000000 +0100 +++ b-2.6.11/net/bridge/br_ioctl.c 2005-03-25 23:56:56.000000000 +0100 @@ -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; diff -ru a-2.6.11/net/bridge/br_private.h b-2.6.11/net/bridge/br_private.h --- a-2.6.11/net/bridge/br_private.h 2005-03-02 08:37:50.000000000 +0100 +++ b-2.6.11/net/bridge/br_private.h 2005-03-25 23:56:56.000000000 +0100 @@ -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; diff -ru a-2.6.11/net/bridge/br_sysfs_br.c b-2.6.11/net/bridge/br_sysfs_br.c --- a-2.6.11/net/bridge/br_sysfs_br.c 2005-03-02 08:38:08.000000000 +0100 +++ b-2.6.11/net/bridge/br_sysfs_br.c 2005-03-25 23:56:56.000000000 +0100 @@ -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,
Attachment:
pgp0HdZGRahdF.pgp
Description: PGP signature
- Prev by Date: Re: [PATCH rc1-mm3] timers: simplify locking
- Next by Date: ALPS touchpad woes with 2.6.12rc1 and rc1-mm3
- Previous by thread: Block device size
- Next by thread: ALPS touchpad woes with 2.6.12rc1 and rc1-mm3
- Index(es):