Skip to content

Commit 467aea0

Browse files
Stephen HemmingerDavid S. Miller
authored andcommitted
bridge: don't route packets while learning
While in the STP learning state, don't route packets; wait until forwarding delay has expired. The purpose of the forwarding delay is to detect loops in the network, and if a brouter started up and started forwarding, it could cause a flood. Signed-off-by: Stephen Hemminger <[email protected]>
1 parent 6229e36 commit 467aea0

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

net/bridge/br_input.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb)
129129
const unsigned char *dest = eth_hdr(skb)->h_dest;
130130

131131
if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
132-
goto err;
132+
goto drop;
133133

134134
if (unlikely(is_link_local(dest))) {
135135
skb->pkt_type = PACKET_HOST;
@@ -138,22 +138,25 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb)
138138
NULL, br_handle_local_finish) == 0) ? skb : NULL;
139139
}
140140

141-
if (p->state == BR_STATE_FORWARDING || p->state == BR_STATE_LEARNING) {
141+
switch (p->state) {
142+
case BR_STATE_FORWARDING:
143+
142144
if (br_should_route_hook) {
143145
if (br_should_route_hook(&skb))
144146
return skb;
145147
dest = eth_hdr(skb)->h_dest;
146148
}
147-
149+
/* fall through */
150+
case BR_STATE_LEARNING:
148151
if (!compare_ether_addr(p->br->dev->dev_addr, dest))
149152
skb->pkt_type = PACKET_HOST;
150153

151154
NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
152155
br_handle_frame_finish);
153-
return NULL;
156+
break;
157+
default:
158+
drop:
159+
kfree_skb(skb);
154160
}
155-
156-
err:
157-
kfree_skb(skb);
158161
return NULL;
159162
}

0 commit comments

Comments
 (0)