[PATCH 0/3] Bridge patches for 2.6.27
From: Stephen Hemminger <hidden>
Date: 2008-06-17 16:52:55
--
9 messages, 2 authors, 2008-06-17 · open the first message on its own page
From: Stephen Hemminger <hidden>
Date: 2008-06-17 16:52:55
--
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) {
--
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.
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;
--
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:
--- 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;
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 -0700quoted
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
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 -0700quoted
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" :-)
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)
--
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.