[PATCH 0/3] Bridge patches for 2.6.27

STALE6619d

9 messages, 2 authors, 2008-06-17 · open the first message on its own page

[PATCH 0/3] Bridge patches for 2.6.27

From: Stephen Hemminger <hidden>
Date: 2008-06-17 16:52:55

-- 

[PATCH 1/3] bridge: handle process all link-local frames

From: Stephen Hemminger <hidden>
Date: 2008-06-17 16:52:55

Any frame addressed to link-local addresses should be processed by local
receive path. The earlier code would process them only if STP was enabled.
Since there are other frames like LACP for bonding, we should always
process them.

Signed-off-by: Stephen Hemminger <redacted>

--- a/net/bridge/br_input.c	2008-06-17 09:10:52.000000000 -0700
+++ b/net/bridge/br_input.c	2008-06-17 09:11:23.000000000 -0700
@@ -136,14 +136,11 @@ struct sk_buff *br_handle_frame(struct n
 		if (skb->protocol == htons(ETH_P_PAUSE))
 			goto drop;
 
-		/* Process STP BPDU's through normal netif_receive_skb() path */
-		if (p->br->stp_enabled != BR_NO_STP) {
-			if (NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
-				    NULL, br_handle_local_finish))
-				return NULL;
-			else
-				return skb;
-		}
+		if (NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev,
+			    NULL, br_handle_local_finish))
+			return NULL;	/* frame consumed by filter */
+		else
+			return skb;	/* continue processing */
 	}
 
 	switch (p->state) {
-- 

Re: [PATCH 1/3] bridge: handle process all link-local frames

From: David Miller <davem@davemloft.net>
Date: 2008-06-17 23:11:19

From: Stephen Hemminger <redacted>
Date: Tue, 17 Jun 2008 09:52:12 -0700
Any frame addressed to link-local addresses should be processed by local
receive path. The earlier code would process them only if STP was enabled.
Since there are other frames like LACP for bonding, we should always
process them.

Signed-off-by: Stephen Hemminger <redacted>
Applied.

[PATCH 3/3] bridge: use statistics in net_device

From: Stephen Hemminger <hidden>
Date: 2008-06-17 16:52:55

Move statistics to net_device structure. Also, update last_rx on bridge
device (even though only bonding seems to use it).

Signed-off-by: Stephen Hemminger <redacted>

--- a/net/bridge/br_device.c	2008-06-17 09:31:24.000000000 -0700
+++ b/net/bridge/br_device.c	2008-06-17 09:34:01.000000000 -0700
@@ -21,12 +21,6 @@
 #include <asm/uaccess.h>
 #include "br_private.h"
 
-static struct net_device_stats *br_dev_get_stats(struct net_device *dev)
-{
-	struct net_bridge *br = netdev_priv(dev);
-	return &br->statistics;
-}
-
 /* net device transmit always called with no BH (preempt_disabled) */
 int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 {
@@ -34,8 +28,8 @@ int br_dev_xmit(struct sk_buff *skb, str
 	const unsigned char *dest = skb->data;
 	struct net_bridge_fdb_entry *dst;
 
-	br->statistics.tx_packets++;
-	br->statistics.tx_bytes += skb->len;
+	dev->stats.tx_packets++;
+	dev->stats.tx_bytes += skb->len;
 
 	skb_reset_mac_header(skb);
 	skb_pull(skb, ETH_HLEN);
@@ -162,7 +156,6 @@ void br_dev_setup(struct net_device *dev
 	ether_setup(dev);
 
 	dev->do_ioctl = br_dev_ioctl;
-	dev->get_stats = br_dev_get_stats;
 	dev->hard_start_xmit = br_dev_xmit;
 	dev->open = br_dev_open;
 	dev->set_multicast_list = br_dev_set_multicast_list;
--- a/net/bridge/br_forward.c	2008-06-17 09:32:32.000000000 -0700
+++ b/net/bridge/br_forward.c	2008-06-17 09:34:37.000000000 -0700
@@ -115,7 +115,7 @@ static void br_flood(struct net_bridge *
 				struct sk_buff *skb2;
 
 				if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL) {
-					br->statistics.tx_dropped++;
+					br->dev->stats.tx_dropped++;
 					kfree_skb(skb);
 					return;
 				}
--- a/net/bridge/br_input.c	2008-06-17 09:32:52.000000000 -0700
+++ b/net/bridge/br_input.c	2008-06-17 09:35:49.000000000 -0700
@@ -24,13 +24,15 @@ const u8 br_group_address[ETH_ALEN] = { 
 
 static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb)
 {
+	struct net_device *brdev = br->dev;
 	struct net_device *indev;
 
-	br->statistics.rx_packets++;
-	br->statistics.rx_bytes += skb->len;
+	brdev->stats.rx_packets++;
+	brdev->stats.rx_bytes += skb->len;
+	brdev->last_rx = jiffies;
 
 	indev = skb->dev;
-	skb->dev = br->dev;
+	skb->dev = brdev;
 
 	NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
 		netif_receive_skb);
@@ -64,7 +66,7 @@ int br_handle_frame_finish(struct sk_buf
 	dst = NULL;
 
 	if (is_multicast_ether_addr(dest)) {
-		br->statistics.multicast++;
+		br->dev->stats.multicast++;
 		skb2 = skb;
 	} else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) {
 		skb2 = skb;
--- a/net/bridge/br_private.h	2008-06-17 09:21:43.000000000 -0700
+++ b/net/bridge/br_private.h	2008-06-17 09:21:58.000000000 -0700
@@ -90,7 +90,7 @@ struct net_bridge
 	spinlock_t			lock;
 	struct list_head		port_list;
 	struct net_device		*dev;
-	struct net_device_stats		statistics;
+
 	spinlock_t			hash_lock;
 	struct hlist_head		hash[BR_HASH_SIZE];
 	struct list_head		age_list;
-- 

Re: [PATCH 3/3] bridge: use statistics in net_device

From: David Miller <davem@davemloft.net>
Date: 2008-06-17 23:14:09

From: Stephen Hemminger <redacted>
Date: Tue, 17 Jun 2008 09:52:14 -0700
Move statistics to net_device structure. Also, update last_rx on bridge
device (even though only bonding seems to use it).

Signed-off-by: Stephen Hemminger <redacted>
This patch doesn't apply even remotely to anything I have in my tree.
What did you generate this against?

For example:
quoted hunk
--- a/net/bridge/br_device.c	2008-06-17 09:31:24.000000000 -0700
+++ b/net/bridge/br_device.c	2008-06-17 09:34:01.000000000 -0700
@@ -21,12 +21,6 @@
 #include <asm/uaccess.h>
 #include "br_private.h"
 
-static struct net_device_stats *br_dev_get_stats(struct net_device *dev)
-{
-	struct net_bridge *br = netdev_priv(dev);
-	return &br->statistics;
-}
-
 /* net device transmit always called with no BH (preempt_disabled) */
 int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 {
In my tree that function does not exist.

I see, Pavel already made this conversion already.  Stephen, please
actually generate your patches against the tree you claim they should
be applied to, thanks :-)

commit a339f1c881fdb8092ef9b118610307e10e885fc8
Author: Pavel Emelyanov [off-list ref]
Date:   Wed May 21 14:13:47 2008 -0700

    bridge: Use on-device stats instead of private ones.
    
    Even though bridges require 6 fields from struct net_device_stats,
    the on-device stats are always there, so we may just use them.
    
    The br_dev_get_stats is no longer required after this.
    
    Signed-off-by: Pavel Emelyanov [off-list ref]
    Signed-off-by: David S. Miller [off-list ref]
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index bf77873..626c779 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -21,12 +21,6 @@
 #include <asm/uaccess.h>
 #include "br_private.h"
 
-static struct net_device_stats *br_dev_get_stats(struct net_device *dev)
-{
-	struct net_bridge *br = netdev_priv(dev);
-	return &br->statistics;
-}
-
 /* net device transmit always called with no BH (preempt_disabled) */
 int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 {
@@ -34,8 +28,8 @@ int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
 	const unsigned char *dest = skb->data;
 	struct net_bridge_fdb_entry *dst;
 
-	br->statistics.tx_packets++;
-	br->statistics.tx_bytes += skb->len;
+	dev->stats.tx_packets++;
+	dev->stats.tx_bytes += skb->len;
 
 	skb_reset_mac_header(skb);
 	skb_pull(skb, ETH_HLEN);
@@ -161,7 +155,6 @@ void br_dev_setup(struct net_device *dev)
 	ether_setup(dev);
 
 	dev->do_ioctl = br_dev_ioctl;
-	dev->get_stats = br_dev_get_stats;
 	dev->hard_start_xmit = br_dev_xmit;
 	dev->open = br_dev_open;
 	dev->set_multicast_list = br_dev_set_multicast_list;
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c
index bdd7c35..a471167 100644
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -115,7 +115,7 @@ static void br_flood(struct net_bridge *br, struct sk_buff *skb,
 				struct sk_buff *skb2;
 
 				if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL) {
-					br->statistics.tx_dropped++;
+					br->dev->stats.tx_dropped++;
 					kfree_skb(skb);
 					return;
 				}
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index 255c00f..fa0f571 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -24,13 +24,13 @@ const u8 br_group_address[ETH_ALEN] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 };
 
 static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb)
 {
-	struct net_device *indev;
+	struct net_device *indev, *brdev = br->dev;
 
-	br->statistics.rx_packets++;
-	br->statistics.rx_bytes += skb->len;
+	brdev->stats.rx_packets++;
+	brdev->stats.rx_bytes += skb->len;
 
 	indev = skb->dev;
-	skb->dev = br->dev;
+	skb->dev = brdev;
 
 	NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
 		netif_receive_skb);
@@ -64,7 +64,7 @@ int br_handle_frame_finish(struct sk_buff *skb)
 	dst = NULL;
 
 	if (is_multicast_ether_addr(dest)) {
-		br->statistics.multicast++;
+		br->dev->stats.multicast++;
 		skb2 = skb;
 	} else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) {
 		skb2 = skb;
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index c11b554..0243cb4 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -90,7 +90,6 @@ struct net_bridge
 	spinlock_t			lock;
 	struct list_head		port_list;
 	struct net_device		*dev;
-	struct net_device_stats		statistics;
 	spinlock_t			hash_lock;
 	struct hlist_head		hash[BR_HASH_SIZE];
 	struct list_head		age_list;

Re: [PATCH 3/3] bridge: use statistics in net_device

From: Stephen Hemminger <hidden>
Date: 2008-06-17 23:35:29

On Tue, 17 Jun 2008 16:14:09 -0700 (PDT)
David Miller [off-list ref] wrote:
From: Stephen Hemminger <redacted>
Date: Tue, 17 Jun 2008 09:52:14 -0700
quoted
Move statistics to net_device structure. Also, update last_rx on bridge
device (even though only bonding seems to use it).

Signed-off-by: Stephen Hemminger <redacted>
This patch doesn't apply even remotely to anything I have in my tree.
What did you generate this against?

Patch was against 2.6.26-rc6

Re: [PATCH 3/3] bridge: use statistics in net_device

From: David Miller <davem@davemloft.net>
Date: 2008-06-17 23:50:25

From: Stephen Hemminger <redacted>
Date: Tue, 17 Jun 2008 16:35:27 -0700
On Tue, 17 Jun 2008 16:14:09 -0700 (PDT)
David Miller [off-list ref] wrote:
quoted
From: Stephen Hemminger <redacted>
Date: Tue, 17 Jun 2008 09:52:14 -0700
quoted
Move statistics to net_device structure. Also, update last_rx on bridge
device (even though only bonding seems to use it).

Signed-off-by: Stephen Hemminger <redacted>
This patch doesn't apply even remotely to anything I have in my tree.
What did you generate this against?

Patch was against 2.6.26-rc6
Yet claimed for "2.6.27" :-)

[PATCH 2/3] bridge: make bridge address settings sticky

From: Stephen Hemminger <hidden>
Date: 2008-06-17 16:52:55

Normally, the bridge just chooses the smallest mac address as the
bridge id and mac address of bridge device. But if the administrator
has explictly set the interface address then don't change it.

Signed-off-by: Stephen Hemminger <redacted>

--- a/net/bridge/br_device.c	2008-06-17 09:18:02.000000000 -0700
+++ b/net/bridge/br_device.c	2008-06-17 09:18:16.000000000 -0700
@@ -95,6 +95,7 @@ static int br_set_mac_address(struct net
 	spin_lock_bh(&br->lock);
 	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
 	br_stp_change_bridge_id(br, addr->sa_data);
+	br->flags |= BR_SET_MAC_ADDR;
 	spin_unlock_bh(&br->lock);
 
 	return 0;
--- a/net/bridge/br_private.h	2008-06-17 09:14:42.000000000 -0700
+++ b/net/bridge/br_private.h	2008-06-17 09:21:10.000000000 -0700
@@ -95,6 +95,8 @@ struct net_bridge
 	struct hlist_head		hash[BR_HASH_SIZE];
 	struct list_head		age_list;
 	unsigned long			feature_mask;
+	unsigned long			flags;
+#define BR_SET_MAC_ADDR		0x00000001
 
 	/* STP */
 	bridge_id			designated_root;
--- a/net/bridge/br_stp_if.c	2008-06-17 09:20:06.000000000 -0700
+++ b/net/bridge/br_stp_if.c	2008-06-17 09:21:00.000000000 -0700
@@ -216,6 +216,10 @@ void br_stp_recalculate_bridge_id(struct
 	const unsigned char *addr = br_mac_zero;
 	struct net_bridge_port *p;
 
+	/* user has chosen a value so keep it */
+	if (br->flags & BR_SET_MAC_ADDR)
+		return;
+
 	list_for_each_entry(p, &br->port_list, list) {
 		if (addr == br_mac_zero ||
 		    memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
-- 

Re: [PATCH 2/3] bridge: make bridge address settings sticky

From: David Miller <davem@davemloft.net>
Date: 2008-06-17 23:11:25

From: Stephen Hemminger <redacted>
Date: Tue, 17 Jun 2008 09:52:13 -0700
Normally, the bridge just chooses the smallest mac address as the
bridge id and mac address of bridge device. But if the administrator
has explictly set the interface address then don't change it.

Signed-off-by: Stephen Hemminger <redacted>
Applied.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help