diff options
-rw-r--r-- | drivers/net/bonding/bond_main.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 0d87e11e7f1d..8c0a0908875d 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1170,9 +1170,26 @@ static rx_handler_result_t bond_handle_frame(struct sk_buff **pskb) | |||
1170 | } | 1170 | } |
1171 | } | 1171 | } |
1172 | 1172 | ||
1173 | /* don't change skb->dev for link-local packets */ | 1173 | /* Link-local multicast packets should be passed to the |
1174 | if (is_link_local_ether_addr(eth_hdr(skb)->h_dest)) | 1174 | * stack on the link they arrive as well as pass them to the |
1175 | * bond-master device. These packets are mostly usable when | ||
1176 | * stack receives it with the link on which they arrive | ||
1177 | * (e.g. LLDP) they also must be available on master. Some of | ||
1178 | * the use cases include (but are not limited to): LLDP agents | ||
1179 | * that must be able to operate both on enslaved interfaces as | ||
1180 | * well as on bonds themselves; linux bridges that must be able | ||
1181 | * to process/pass BPDUs from attached bonds when any kind of | ||
1182 | * STP version is enabled on the network. | ||
1183 | */ | ||
1184 | if (is_link_local_ether_addr(eth_hdr(skb)->h_dest)) { | ||
1185 | struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC); | ||
1186 | |||
1187 | if (nskb) { | ||
1188 | nskb->dev = bond->dev; | ||
1189 | netif_rx(nskb); | ||
1190 | } | ||
1175 | return RX_HANDLER_PASS; | 1191 | return RX_HANDLER_PASS; |
1192 | } | ||
1176 | if (bond_should_deliver_exact_match(skb, slave, bond)) | 1193 | if (bond_should_deliver_exact_match(skb, slave, bond)) |
1177 | return RX_HANDLER_EXACT; | 1194 | return RX_HANDLER_EXACT; |
1178 | 1195 | ||