netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Bridge patches for 2.6.27
@ 2008-06-17 16:52 Stephen Hemminger
  2008-06-17 16:52 ` [PATCH 1/3] bridge: handle process all link-local frames Stephen Hemminger
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Stephen Hemminger @ 2008-06-17 16:52 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

-- 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] bridge: handle process all link-local frames
  2008-06-17 16:52 [PATCH 0/3] Bridge patches for 2.6.27 Stephen Hemminger
@ 2008-06-17 16:52 ` Stephen Hemminger
  2008-06-17 23:11   ` David Miller
  2008-06-17 16:52 ` [PATCH 2/3] bridge: make bridge address settings sticky Stephen Hemminger
  2008-06-17 16:52 ` [PATCH 3/3] bridge: use statistics in net_device Stephen Hemminger
  2 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2008-06-17 16:52 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

[-- Attachment #1: br-link-local-pdu.patch --]
[-- Type: text/plain, Size: 1028 bytes --]

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 <shemminger@vyatta.com>


--- 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) {

-- 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/3] bridge: make bridge address settings sticky
  2008-06-17 16:52 [PATCH 0/3] Bridge patches for 2.6.27 Stephen Hemminger
  2008-06-17 16:52 ` [PATCH 1/3] bridge: handle process all link-local frames Stephen Hemminger
@ 2008-06-17 16:52 ` Stephen Hemminger
  2008-06-17 23:11   ` David Miller
  2008-06-17 16:52 ` [PATCH 3/3] bridge: use statistics in net_device Stephen Hemminger
  2 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2008-06-17 16:52 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

[-- Attachment #1: br-sticky-mac.patch --]
[-- Type: text/plain, Size: 1517 bytes --]

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 <shemminger@vyatta.com>


--- 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)

-- 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/3] bridge: use statistics in net_device
  2008-06-17 16:52 [PATCH 0/3] Bridge patches for 2.6.27 Stephen Hemminger
  2008-06-17 16:52 ` [PATCH 1/3] bridge: handle process all link-local frames Stephen Hemminger
  2008-06-17 16:52 ` [PATCH 2/3] bridge: make bridge address settings sticky Stephen Hemminger
@ 2008-06-17 16:52 ` Stephen Hemminger
  2008-06-17 23:14   ` David Miller
  2 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2008-06-17 16:52 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

[-- Attachment #1: br-stats.patch --]
[-- Type: text/plain, Size: 2969 bytes --]

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 <shemminger@vyatta.com>


--- 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;

-- 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] bridge: handle process all link-local frames
  2008-06-17 16:52 ` [PATCH 1/3] bridge: handle process all link-local frames Stephen Hemminger
@ 2008-06-17 23:11   ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2008-06-17 23:11 UTC (permalink / raw)
  To: shemminger; +Cc: netdev

From: Stephen Hemminger <shemminger@vyatta.com>
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 <shemminger@vyatta.com>

Applied.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] bridge: make bridge address settings sticky
  2008-06-17 16:52 ` [PATCH 2/3] bridge: make bridge address settings sticky Stephen Hemminger
@ 2008-06-17 23:11   ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2008-06-17 23:11 UTC (permalink / raw)
  To: shemminger; +Cc: netdev

From: Stephen Hemminger <shemminger@vyatta.com>
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 <shemminger@vyatta.com>

Applied.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] bridge: use statistics in net_device
  2008-06-17 16:52 ` [PATCH 3/3] bridge: use statistics in net_device Stephen Hemminger
@ 2008-06-17 23:14   ` David Miller
  2008-06-17 23:35     ` Stephen Hemminger
  0 siblings, 1 reply; 9+ messages in thread
From: David Miller @ 2008-06-17 23:14 UTC (permalink / raw)
  To: shemminger; +Cc: netdev

From: Stephen Hemminger <shemminger@vyatta.com>
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 <shemminger@vyatta.com>

This patch doesn't apply even remotely to anything I have in my tree.
What did you generate this against?

For example:

> --- 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 <xemul@openvz.org>
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 <xemul@openvz.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>

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;



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] bridge: use statistics in net_device
  2008-06-17 23:14   ` David Miller
@ 2008-06-17 23:35     ` Stephen Hemminger
  2008-06-17 23:50       ` David Miller
  0 siblings, 1 reply; 9+ messages in thread
From: Stephen Hemminger @ 2008-06-17 23:35 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

On Tue, 17 Jun 2008 16:14:09 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:

> From: Stephen Hemminger <shemminger@vyatta.com>
> 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 <shemminger@vyatta.com>
> 
> 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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] bridge: use statistics in net_device
  2008-06-17 23:35     ` Stephen Hemminger
@ 2008-06-17 23:50       ` David Miller
  0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2008-06-17 23:50 UTC (permalink / raw)
  To: shemminger; +Cc: netdev

From: Stephen Hemminger <shemminger@vyatta.com>
Date: Tue, 17 Jun 2008 16:35:27 -0700

> On Tue, 17 Jun 2008 16:14:09 -0700 (PDT)
> David Miller <davem@davemloft.net> wrote:
> 
> > From: Stephen Hemminger <shemminger@vyatta.com>
> > 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 <shemminger@vyatta.com>
> > 
> > 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" :-)


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2008-06-17 23:50 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-17 16:52 [PATCH 0/3] Bridge patches for 2.6.27 Stephen Hemminger
2008-06-17 16:52 ` [PATCH 1/3] bridge: handle process all link-local frames Stephen Hemminger
2008-06-17 23:11   ` David Miller
2008-06-17 16:52 ` [PATCH 2/3] bridge: make bridge address settings sticky Stephen Hemminger
2008-06-17 23:11   ` David Miller
2008-06-17 16:52 ` [PATCH 3/3] bridge: use statistics in net_device Stephen Hemminger
2008-06-17 23:14   ` David Miller
2008-06-17 23:35     ` Stephen Hemminger
2008-06-17 23:50       ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).