Skip to content

Commit 8a9922e

Browse files
guangmuzhuPaolo Abeni
authored andcommitted
ipvlan: Fix return value of ipvlan_queue_xmit()
ipvlan_queue_xmit() should return NET_XMIT_XXX, but ipvlan_xmit_mode_l2/l3() returns rx_handler_result_t or NET_RX_XXX in some cases. ipvlan_rcv_frame() will only return RX_HANDLER_CONSUMED in ipvlan_xmit_mode_l2/l3() because 'local' is true. It's equal to NET_XMIT_SUCCESS. But dev_forward_skb() can return NET_RX_SUCCESS or NET_RX_DROP, and returning NET_RX_DROP(NET_XMIT_DROP) will increase both ipvlan and ipvlan->phy_dev drops counter. The skb to forward can be treated as xmitted successfully. This patch makes ipvlan_queue_xmit() return NET_XMIT_SUCCESS for forward skb. Fixes: 2ad7bf3 ("ipvlan: Initial check-in of the IPVLAN driver.") Signed-off-by: Cambda Zhu <cambda@linux.alibaba.com> Link: https://lore.kernel.org/r/20230626093347.7492-1-cambda@linux.alibaba.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 6709d4b commit 8a9922e

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

drivers/net/ipvlan/ipvlan_core.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,8 @@ static int ipvlan_xmit_mode_l3(struct sk_buff *skb, struct net_device *dev)
585585
consume_skb(skb);
586586
return NET_XMIT_DROP;
587587
}
588-
return ipvlan_rcv_frame(addr, &skb, true);
588+
ipvlan_rcv_frame(addr, &skb, true);
589+
return NET_XMIT_SUCCESS;
589590
}
590591
}
591592
out:
@@ -611,7 +612,8 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
611612
consume_skb(skb);
612613
return NET_XMIT_DROP;
613614
}
614-
return ipvlan_rcv_frame(addr, &skb, true);
615+
ipvlan_rcv_frame(addr, &skb, true);
616+
return NET_XMIT_SUCCESS;
615617
}
616618
}
617619
skb = skb_share_check(skb, GFP_ATOMIC);
@@ -623,7 +625,8 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
623625
* the skb for the main-dev. At the RX side we just return
624626
* RX_PASS for it to be processed further on the stack.
625627
*/
626-
return dev_forward_skb(ipvlan->phy_dev, skb);
628+
dev_forward_skb(ipvlan->phy_dev, skb);
629+
return NET_XMIT_SUCCESS;
627630

628631
} else if (is_multicast_ether_addr(eth->h_dest)) {
629632
skb_reset_mac_header(skb);

0 commit comments

Comments
 (0)