Bridge patches for 2.6.22
Subsystems (3)
cover Bridge patches for 2.6.22
Here are some patches for bridge code in 2.6.22. The user mode RSTP from Aji is working. Anyone who wants to test it can get it from:
git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/rstp.git
Thanks
PATCH 1/4 bridge: don't change packet type
The change to forward STP bpdu's (for usermode STP) through normal path, changed the packet type in the process. Since link local stuff is multicast, it should stay pkt_type = PACKET_MULTICAST. The code was probably copy/pasted incorrectly from the bridge pseudo-device receive path.
net/bridge/br_input.c +1 -4
@@ -131,12 +131,9 @@ struct sk_buff *br_handle_frame(struct nif (!is_valid_ether_addr (eth_hdr (skb)->h_source)) goto drop; -if (unlikely (is_link_local (dest))) { - skb->pkt_type =PACKET_HOST ; - +if (unlikely (is_link_local (dest)))return (NF_HOOK (PF_BRIDGE ,NF_BR_LOCAL_IN , skb, skb->dev,NULL , br_handle_local_finish) ==0 ) ? skb :NULL ; - }switch (p->state) {case BR_STATE_FORWARDING :
Re: [PATCH 1/4] bridge: don't change packet type
From: Stephen Hemminger <[email protected]>
Date: Wed, 25 Apr 2007 16:47:38 -0700
Quoted 6 lines
The change to forward STP bpdu's (for usermode STP) through normal path, changed the packet type in the process. Since link local stuff is multicast, it should stay
pkt_type=PACKET_MULTICAST. The code was probably copy/pasted incorrectly from the bridge pseudo-device receive path.Signed-off-by Stephen Hemminger <[email protected]>
Applied.
PATCH 2/4 bridge: drop PAUSE frames
In reply to Stephen HemmingerPause frames should never make it out of the network device into the stack. But if a device was misconfigured, it might happen. So drop pause frames in bridge.
include/linux/if_ether.h +1 -0
@@ -61,6 +61,7 @@#define ETH_P_8021Q 0x8100/* 802.1Q VLAN Extended Header */ #define ETH_P_IPX 0x8137/* IPX over DIX */ #define ETH_P_IPV6 0x86DD/* IPv6 over bluebook */ +#define ETH_P_PAUSE 0x8808/* IEEE Pause frames. See 802.3 31B */ #define ETH_P_SLOW 0x8809/* Slow Protocol. See 802.3ad 43B */ #define ETH_P_WCCP 0x883E/* Web-cache coordination protocol * defined in draft-wilson-wrec-wccp-v2-00.txt */
net/bridge/br_input.c +6 -1
@@ -131,9 +131,14 @@ struct sk_buff *br_handle_frame(struct nif (!is_valid_ether_addr (eth_hdr (skb)->h_source)) goto drop; -if (unlikely (is_link_local (dest))) +if (unlikely (is_link_local (dest))) { +/* Pause frames shouldn't be passed up by driver anyway */ +if (skb->protocol ==htons (ETH_P_PAUSE )) + goto drop; +return (NF_HOOK (PF_BRIDGE ,NF_BR_LOCAL_IN , skb, skb->dev,NULL , br_handle_local_finish) ==0 ) ? skb :NULL ; + }switch (p->state) {case BR_STATE_FORWARDING :
David Miller
maintainerRe: [PATCH 2/4] bridge: drop PAUSE frames
From: Stephen Hemminger <[email protected]>
Date: Wed, 25 Apr 2007 16:47:39 -0700
Quoted 5 lines
Pause frames should never make it out of the network device into the stack. But if a device was misconfigured, it might happen. So drop pause frames in bridge.
Signed-off-by Stephen Hemminger <[email protected]>
It can happen when in promiscuous mode, but that's the only legal case I can think of.
But that case shouldn't be hitting this path I don't think.
So this change is borderline and if anything we should put an assertion somewhere maybe, but applied for now.
PATCH 3/4 bridge: if no STP then forward all BPDUs
In reply to Stephen HemmingerIf a bridge is not running STP, then it has no way to detect a cycle in the network. But if it is not running STP and some other machine or device is running STP, then if STP BPDU's get forwarded to it can detect the cycle.
This is how the old 2.4 and early 2.6 code worked.
--- net/bridge/br_input.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
net/bridge/br_input.c +8 -2
@@ -136,8 +136,14 @@ struct sk_buff *br_handle_frame(struct nif (skb->protocol ==htons (ETH_P_PAUSE )) goto drop; -return (NF_HOOK (PF_BRIDGE ,NF_BR_LOCAL_IN , skb, skb->dev, -NULL , br_handle_local_finish) ==0 ) ? skb :NULL ; +/* 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; + } }switch (p->state) {
PATCH 4/4 bridge: missing rtnl
In reply to Stephen HemmingerWriting to /sys/class/net/brX/bridge/stp_state causes a warning because RTNL is not held when call br_stp_if.c
--- net/bridge/br_sysfs_br.c | 2 ++ 1 file changed, 2 insertions(+)
net/bridge/br_sysfs_br.c +2 -0
@@ -149,9 +149,11 @@ static ssize_t show_stp_state(struct devstatic void set_stp_state (struct net_bridge *br,unsigned long val) { +rtnl_lock ();spin_unlock_bh (&br->lock);br_stp_set_enabled (br, val);spin_lock_bh (&br->lock); +rtnl_unlock (); } static ssize_t store_stp_state(struct device *d,
Re: [PATCH 4/4] bridge: missing rtnl
From: Stephen Hemminger <[email protected]>
Date: Wed, 25 Apr 2007 16:47:41 -0700
Quoted 4 lines
Writing to
/sys/class/net/brX/bridge/stp_statecauses a warning because RTNL is not held when callbr_stp_if.cSigned-off-by Stephen Hemminger <[email protected]>
Applied, thanks Stephen.