Feature enhancement - Disable unicast flooding

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



For the project I'm working on I require that the bridging code not flood unicast frames when the destination mac address is unknown, similar to Cisco's "switchport block unicast" feature (http://www.cisco.com/en/US/products/ps6406/products_configuration_guide_chapter09186a00805a761a.html#wp1087814).

I have produced a small patch (against 2.6.20.4) to control this feature per bridge (rather than per port like a Cisco).

Have I gone about implementing this correctly?

Is this something other people may find useful, and hence worth incorporating into the mainstream code?

Is it worth the effort of taking this one step further, and controlling the behaviour per port rather than per bridge?

Thanks,

Dylan



diff -Naur linux-2.6.20.4/net/bridge/br_device.c linux-2.6.20.4-dodgy-bridge/net/bridge/br_device.c
--- linux-2.6.20.4/net/bridge/br_device.c	2007-03-24 07:52:51.000000000 +1200
+++ linux-2.6.20.4-dodgy-bridge/net/bridge/br_device.c	2007-04-12 22:55:18.000000000 +1200
@@ -44,9 +44,12 @@
 		br_flood_deliver(br, skb, 0);
 	else if ((dst = __br_fdb_get(br, dest)) != NULL)
 		br_deliver(dst->dst, skb);
+	else if (br->flood_unknown_unicast)
+	        br_flood_deliver(br, skb, 0);
 	else
-		br_flood_deliver(br, skb, 0);
-
+	  kfree_skb(skb);
+	  
+	
 	return 0;
 }
 
diff -Naur linux-2.6.20.4/net/bridge/br_if.c linux-2.6.20.4-dodgy-bridge/net/bridge/br_if.c
--- linux-2.6.20.4/net/bridge/br_if.c	2007-03-24 07:52:51.000000000 +1200
+++ linux-2.6.20.4-dodgy-bridge/net/bridge/br_if.c	2007-04-12 22:39:58.000000000 +1200
@@ -230,6 +230,8 @@
 	br->ageing_time = 300 * HZ;
 	INIT_LIST_HEAD(&br->age_list);
 
+	br->flood_unknown_unicast = 1;
+
 	br_stp_timer_init(br);
 
 	return dev;
diff -Naur linux-2.6.20.4/net/bridge/br_input.c linux-2.6.20.4-dodgy-bridge/net/bridge/br_input.c
--- linux-2.6.20.4/net/bridge/br_input.c	2007-03-24 07:52:51.000000000 +1200
+++ linux-2.6.20.4-dodgy-bridge/net/bridge/br_input.c	2007-04-12 22:56:38.000000000 +1200
@@ -87,7 +87,12 @@
 		goto out;
 	}
 
-	br_flood_forward(br, skb, 0);
+	if (br->flood_unknown_unicast) {
+	        br_flood_forward(br, skb, 0);
+		goto out;
+	}
+
+	goto drop;
 
 out:
 	return 0;
diff -Naur linux-2.6.20.4/net/bridge/br_private.h linux-2.6.20.4-dodgy-bridge/net/bridge/br_private.h
--- linux-2.6.20.4/net/bridge/br_private.h	2007-03-24 07:52:51.000000000 +1200
+++ linux-2.6.20.4-dodgy-bridge/net/bridge/br_private.h	2007-04-12 22:23:37.000000000 +1200
@@ -120,6 +120,8 @@
 	struct timer_list		topology_change_timer;
 	struct timer_list		gc_timer;
 	struct kobject			ifobj;
+
+        unsigned char                   flood_unknown_unicast;
 };
 
 extern struct notifier_block br_device_notifier;
diff -Naur linux-2.6.20.4/net/bridge/br_sysfs_br.c linux-2.6.20.4-dodgy-bridge/net/bridge/br_sysfs_br.c
--- linux-2.6.20.4/net/bridge/br_sysfs_br.c	2007-03-24 07:52:51.000000000 +1200
+++ linux-2.6.20.4-dodgy-bridge/net/bridge/br_sysfs_br.c	2007-04-12 23:32:22.000000000 +1200
@@ -290,6 +290,28 @@
 			 show_group_addr, store_group_addr);
 
 
+
+static ssize_t show_flood_unknown_unicast_state(struct class_device *cd, char *buf)
+{
+	struct net_bridge *br = to_bridge(cd);
+	return sprintf(buf, "%d\n", br->flood_unknown_unicast);
+}
+
+static void set_flood_unknown_unicast_state(struct net_bridge *br, unsigned long val)
+{
+	br->flood_unknown_unicast = val;
+}
+
+static ssize_t store_flood_unknown_unicast_state(struct class_device *cd,
+			       const char *buf, size_t len)
+{
+	return store_bridge_parm(cd, buf, len, set_flood_unknown_unicast_state);
+}
+
+static CLASS_DEVICE_ATTR(flood_unknown_unicast, S_IRUGO | S_IWUSR, show_flood_unknown_unicast_state,
+			 store_flood_unknown_unicast_state);
+
+
 static struct attribute *bridge_attrs[] = {
 	&class_device_attr_forward_delay.attr,
 	&class_device_attr_hello_time.attr,
@@ -308,6 +330,7 @@
 	&class_device_attr_topology_change_timer.attr,
 	&class_device_attr_gc_timer.attr,
 	&class_device_attr_group_addr.attr,
+	&class_device_attr_flood_unknown_unicast.attr,
 	NULL
 };
 
_______________________________________________
Bridge mailing list
Bridge@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/bridge

[Index of Archives]     [Netdev]     [AoE Tools]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]

  Powered by Linux