Message ID | 20180924213942.234209-1-mahesh@bandewar.net |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | [net] bonding: pass link-local packets to bonding master also. | expand |
From: Mahesh Bandewar <mahesh@bandewar.net> Date: Mon, 24 Sep 2018 14:39:42 -0700 > From: Mahesh Bandewar <maheshb@google.com> > > Commit b89f04c61efe ("bonding: deliver link-local packets with > skb->dev set to link that packets arrived on") changed the behavior > of how link-local-multicast packets are processed. The change in > the behavior broke some legacy use cases where these packets are > expected to arrive on bonding master device also. > > This patch passes the packet to the stack with the link it arrived > on as well as passes to the bonding-master device to preserve the > legacy use case. > > Fixes: b89f04c61efe ("bonding: deliver link-local packets with skb->dev set to link that packets arrived on") > Reported-by: Michal Soltys <soltys@ziu.info> > Signed-off-by: Mahesh Bandewar <maheshb@google.com> Applied and queued up for -stable.
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 9866fa959a19..e3157aed656a 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1178,9 +1178,26 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb) } } - /* don't change skb->dev for link-local packets */ - if (is_link_local_ether_addr(eth_hdr(skb)->h_dest)) + /* Link-local multicast packets should be passed to the + * stack on the link they arrive as well as pass them to the + * bond-master device. These packets are mostly usable when + * stack receives it with the link on which they arrive + * (e.g. LLDP) they also must be available on master. Some of + * the use cases include (but are not limited to): LLDP agents + * that must be able to operate both on enslaved interfaces as + * well as on bonds themselves; linux bridges that must be able + * to process/pass BPDUs from attached bonds when any kind of + * STP version is enabled on the network. + */ + if (is_link_local_ether_addr(eth_hdr(skb)->h_dest)) { + struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC); + + if (nskb) { + nskb->dev = bond->dev; + netif_rx(nskb); + } return RX_HANDLER_PASS; + } if (bond_should_deliver_exact_match(skb, slave, bond)) return RX_HANDLER_EXACT;