bridge: allow receiption on disabled port

When an ethernet device is enslaved to a bridge, and the bridge STP
detects loss of carrier (or operational state down), then normally
packet receiption is blocked.

This breaks control applications like WPA which maybe expecting to
receive packets to negotiate to bring link up. The bridge needs to
block forwarding packets from these disabled ports, but there is no
hard requirement to not allow local packet delivery.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Git-Repo: https://git.openwrt.org/?p=openwrt/openwrt.git
Git-Commit: c16517d26de30c90dabce1e456615fd7fbdce07c
Change-Id: Ife5e4a02bfe86e792a80b6b0f50c3c77f8ad9221
[pooventh@codeaurora.org: fix indentation issue in net/bridge/br_input.c]
Signed-off-by: Pooventhiran G <pooventh@codeaurora.org>
This commit is contained in:
Stephen Hemminger 2021-09-28 13:02:30 +05:30 committed by Gerrit - the friendly Code Review server
parent e69f8d02fe
commit 2777c75ba4

View File

@ -190,7 +190,10 @@ static void __br_handle_local_finish(struct sk_buff *skb)
/* note: already called with rcu_read_lock */
static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
{
__br_handle_local_finish(skb);
struct net_bridge_port *p = br_port_get_rcu(skb->dev);
if (p->state != BR_STATE_DISABLED)
__br_handle_local_finish(skb);
/* return 1 to signal the okfn() was called so it's ok to use the skb */
return 1;
@ -340,6 +343,17 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
forward:
switch (p->state) {
case BR_STATE_DISABLED:
if (ether_addr_equal(p->br->dev->dev_addr, dest))
skb->pkt_type = PACKET_HOST;
if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING,
dev_net(skb->dev), NULL, skb, skb->dev, NULL,
br_handle_local_finish) == 1) {
return RX_HANDLER_PASS;
}
break;
case BR_STATE_FORWARDING:
case BR_STATE_LEARNING:
if (ether_addr_equal(p->br->dev->dev_addr, dest))