Patch "ipvlan: Fix return value of ipvlan_queue_xmit()" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ipvlan: Fix return value of ipvlan_queue_xmit()

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ipvlan-fix-return-value-of-ipvlan_queue_xmit.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 35f34daabd4d15e75c1c2170d9f2c1a226290375
Author: Cambda Zhu <cambda@xxxxxxxxxxxxxxxxx>
Date:   Mon Jun 26 17:33:47 2023 +0800

    ipvlan: Fix return value of ipvlan_queue_xmit()
    
    [ Upstream commit 8a9922e7be6d042fa00f894c376473b17a162b66 ]
    
    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: 2ad7bf363841 ("ipvlan: Initial check-in of the IPVLAN driver.")
    Signed-off-by: Cambda Zhu <cambda@xxxxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230626093347.7492-1-cambda@xxxxxxxxxxxxxxxxx
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ipvlan/ipvlan_core.c b/drivers/net/ipvlan/ipvlan_core.c
index 0a5b5ff597c6f..ab09d110760ec 100644
--- a/drivers/net/ipvlan/ipvlan_core.c
+++ b/drivers/net/ipvlan/ipvlan_core.c
@@ -586,7 +586,8 @@ static int ipvlan_xmit_mode_l3(struct sk_buff *skb, struct net_device *dev)
 				consume_skb(skb);
 				return NET_XMIT_DROP;
 			}
-			return ipvlan_rcv_frame(addr, &skb, true);
+			ipvlan_rcv_frame(addr, &skb, true);
+			return NET_XMIT_SUCCESS;
 		}
 	}
 out:
@@ -612,7 +613,8 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
 					consume_skb(skb);
 					return NET_XMIT_DROP;
 				}
-				return ipvlan_rcv_frame(addr, &skb, true);
+				ipvlan_rcv_frame(addr, &skb, true);
+				return NET_XMIT_SUCCESS;
 			}
 		}
 		skb = skb_share_check(skb, GFP_ATOMIC);
@@ -624,7 +626,8 @@ static int ipvlan_xmit_mode_l2(struct sk_buff *skb, struct net_device *dev)
 		 * the skb for the main-dev. At the RX side we just return
 		 * RX_PASS for it to be processed further on the stack.
 		 */
-		return dev_forward_skb(ipvlan->phy_dev, skb);
+		dev_forward_skb(ipvlan->phy_dev, skb);
+		return NET_XMIT_SUCCESS;
 
 	} else if (is_multicast_ether_addr(eth->h_dest)) {
 		skb_reset_mac_header(skb);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux