提交 4672cd36 编写于 作者: E Egil Hjelmeland 提交者: David S. Miller

net: dsa: lan9303: Clear offload_fwd_mark for IGMP

Now that IGMP packets no longer is flooded in HW, we want the SW bridge to
forward packets based on bridge configuration. To make that happen,
IGMP packets must have skb->offload_fwd_mark = 0.
Signed-off-by: NEgil Hjelmeland <privat@egil-hjelmeland.no>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 2aee4307
...@@ -92,6 +92,8 @@ static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -92,6 +92,8 @@ static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev,
{ {
u16 *lan9303_tag; u16 *lan9303_tag;
unsigned int source_port; unsigned int source_port;
u16 ether_type_nw;
u8 ip_protocol;
if (unlikely(!pskb_may_pull(skb, LAN9303_TAG_LEN))) { if (unlikely(!pskb_may_pull(skb, LAN9303_TAG_LEN))) {
dev_warn_ratelimited(&dev->dev, dev_warn_ratelimited(&dev->dev,
...@@ -129,6 +131,17 @@ static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -129,6 +131,17 @@ static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev,
skb->offload_fwd_mark = !ether_addr_equal(skb->data - ETH_HLEN, skb->offload_fwd_mark = !ether_addr_equal(skb->data - ETH_HLEN,
eth_stp_addr); eth_stp_addr);
/* We also need IGMP packets to have skb->offload_fwd_mark = 0.
* Solving this for all conceivable situations would add more cost to
* every packet. Instead we handle just the common case:
* No VLAN tag + Ethernet II framing.
* Test least probable term first.
*/
ether_type_nw = lan9303_tag[2];
ip_protocol = *(skb->data + 9);
if (ip_protocol == IPPROTO_IGMP && ether_type_nw == htons(ETH_P_IP))
skb->offload_fwd_mark = 0;
return skb; return skb;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册