Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp3970925pxb; Tue, 25 Jan 2022 00:17:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJyINI1/as7EtVZXJTqc7pFRN+ikpU6S1Dvn05g6o61ahLHPQW86wb4MCQSrGpzl50jyjbM+ X-Received: by 2002:a17:906:1559:: with SMTP id c25mr15046718ejd.31.1643098678331; Tue, 25 Jan 2022 00:17:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643098678; cv=none; d=google.com; s=arc-20160816; b=El0TuTxK4FwZ7skI+1UV3wcjEj0ukziahfyNqDRmJNrmIBjfgHIXxhU38WSY0HfDBH Kvom+3e29pTYDpoZkJSjuWIU/DXJRHu04TK3yC68hNEHj8ZiEumoSFUTRmSrwdhihrml FZYlmHTWCgMqRrybL+UWk+qzzs+v/2c4RY9r9mq/mq0BOZUdBQBO8hihwYGvPtXxAedr vK1U8tYkgNPdwXeTebmEFZFMkJLX9Ko8U50uYpADpYkcZ7tuCa9mfL4l0z1/S751Zat1 4svbLBmtKkZyba8yIT4ehS5f7CY0fzASLYQsPLX24hK4cixNDC+oNzcFPtxaQYZdlga2 jH7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=snLBswcLciqBg6BgsVGr4jK/tYMyM91SLxjP77kM8lM=; b=Nd0myePefARzu0ijV0+oelO287ourNb7Wbsi2ooLvqiYS5HdGfkusXQ4yfHs6hrEXF 6fQ3b31rg+WodsjPGKMnPeQyIk4QVIpnF8nJcS4wKqkY7fCeE7MxBKfBCsbT1TCgkKs2 teGeiP+m44ig7K3Trtv9RuquhMEs6c1bJDMUZr8kryj1taqlXB0GOQjE9ysQBwJh4pgn EVFaH6M4P8Lr7xIm4MAx3SjKJlSypCvAybubAMAOCOPdPy+hE/MbLa6xLwmbXPEAEW60 fhq2GP0Nqn+GTD1ZK5wCQY35Wp8ZkLAwlhZUMkGhv+nItBv498FWorEx6avF/yrK6MWR EpdQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=oWBr1KHc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dt2si1828524ejc.361.2022.01.25.00.17.27; Tue, 25 Jan 2022 00:17:58 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=oWBr1KHc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S3412613AbiAYAhT (ORCPT + 99 others); Mon, 24 Jan 2022 19:37:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2366256AbiAXXwd (ORCPT ); Mon, 24 Jan 2022 18:52:33 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A099AC0419D9; Mon, 24 Jan 2022 13:45:41 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 45538B8119E; Mon, 24 Jan 2022 21:45:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5206DC340E4; Mon, 24 Jan 2022 21:45:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643060740; bh=50Ir92TQOFxSdBGUViRw6ImhL/CgOB1Kfhjsy+Ly+iM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oWBr1KHcf2MWXLBBfXxYGMEkDQBRbIf+QF+2xTppVvbiz/ZeBruFm8mrI8K+ZhsMB FBoWGxlcUzoGBr/wUon08Tk8+6hiK7+WcdJT7VTWlC5rVmTun2OCS6G2ywnr0ZNh2Q 4JljHLpcXj4w9MPui0EBY5najiDcqfJrtErPcRiU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jie Wang , Guangbin Huang , "David S. Miller" Subject: [PATCH 5.16 1009/1039] net: bonding: fix bond_xmit_broadcast return value error bug Date: Mon, 24 Jan 2022 19:46:38 +0100 Message-Id: <20220124184159.210894789@linuxfoundation.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124184125.121143506@linuxfoundation.org> References: <20220124184125.121143506@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jie Wang commit 4e5bd03ae34652cd932ab4c91c71c511793df75c upstream. In Linux bonding scenario, one packet is copied to several copies and sent by all slave device of bond0 in mode 3(broadcast mode). The mode 3 xmit function bond_xmit_broadcast() only ueses the last slave device's tx result as the final result. In this case, if the last slave device is down, then it always return NET_XMIT_DROP, even though the other slave devices xmit success. It may cause the tx statistics error, and cause the application (e.g. scp) consider the network is unreachable. For example, use the following command to configure server A. echo 3 > /sys/class/net/bond0/bonding/mode ifconfig bond0 up ifenslave bond0 eth0 eth1 ifconfig bond0 192.168.1.125 ifconfig eth0 up ifconfig eth1 down The slave device eth0 and eth1 are connected to server B(192.168.1.107). Run the ping 192.168.1.107 -c 3 -i 0.2 command, the following information is displayed. PING 192.168.1.107 (192.168.1.107) 56(84) bytes of data. 64 bytes from 192.168.1.107: icmp_seq=1 ttl=64 time=0.077 ms 64 bytes from 192.168.1.107: icmp_seq=2 ttl=64 time=0.056 ms 64 bytes from 192.168.1.107: icmp_seq=3 ttl=64 time=0.051 ms 192.168.1.107 ping statistics 0 packets transmitted, 3 received Actually, the slave device eth0 of the bond successfully sends three ICMP packets, but the result shows that 0 packets are transmitted. Also if we use scp command to get remote files, the command end with the following printings. ssh_exchange_identification: read: Connection timed out So this patch modifies the bond_xmit_broadcast to return NET_XMIT_SUCCESS if one slave device in the bond sends packets successfully. If all slave devices send packets fail, the discarded packets stats is increased. The skb is released when there is no slave device in the bond or the last slave device is down. Fixes: ae46f184bc1f ("bonding: propagate transmit status") Signed-off-by: Jie Wang Signed-off-by: Guangbin Huang Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/bonding/bond_main.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -4843,25 +4843,39 @@ static netdev_tx_t bond_xmit_broadcast(s struct bonding *bond = netdev_priv(bond_dev); struct slave *slave = NULL; struct list_head *iter; + bool xmit_suc = false; + bool skb_used = false; bond_for_each_slave_rcu(bond, slave, iter) { - if (bond_is_last_slave(bond, slave)) - break; - if (bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) { - struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); + struct sk_buff *skb2; + if (!(bond_slave_is_up(slave) && slave->link == BOND_LINK_UP)) + continue; + + if (bond_is_last_slave(bond, slave)) { + skb2 = skb; + skb_used = true; + } else { + skb2 = skb_clone(skb, GFP_ATOMIC); if (!skb2) { net_err_ratelimited("%s: Error: %s: skb_clone() failed\n", bond_dev->name, __func__); continue; } - bond_dev_queue_xmit(bond, skb2, slave->dev); } + + if (bond_dev_queue_xmit(bond, skb2, slave->dev) == NETDEV_TX_OK) + xmit_suc = true; } - if (slave && bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) - return bond_dev_queue_xmit(bond, skb, slave->dev); - return bond_tx_drop(bond_dev, skb); + if (!skb_used) + dev_kfree_skb_any(skb); + + if (xmit_suc) + return NETDEV_TX_OK; + + atomic_long_inc(&bond_dev->tx_dropped); + return NET_XMIT_DROP; } /*------------------------- Device initialization ---------------------------*/