Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp182065pxa; Tue, 4 Aug 2020 20:51:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxXyC6is/ogP8JF4BmRTlR7z+35B8BY8A2z7HxghkKNK2BxklHE/jjt2t6mS0IpLXLJ/R0s X-Received: by 2002:aa7:c513:: with SMTP id o19mr942627edq.327.1596599496616; Tue, 04 Aug 2020 20:51:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596599496; cv=none; d=google.com; s=arc-20160816; b=aV+o5TM8sdCCrLnm5Unf8pOP66z3EyqZ7EAy0HxbxqcVyDVz7jU0nhwT6n42pqrnV0 2pOELuftokV/2WIi2OCgWonBy/AH+BXQYVGkactn5ZI5lWIv7TYnMcZX86afiQS2o/cO ryBo3qzb5SMGnjhegINa3sgPLRMDxBv23d+M0t/O1x4R1w63F6cnIduMLemGlMVuD0Qq 10Vwnz7A9kYKzFIucwWCd5KoHVd+oRA2ywmz+deNq83E3ne3n0eUY4L9An8Aa3hpA16w 5jhQ/SVoVoBvqRrzov/Ndj/7jreUviVPr91f/pEH8VFTgtQuFiBs1sqKbb66LS4dlUfp b4yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=ke2BPRSUokdP1ovvbHs7NgfbLTK4ci6Oy1suHv0gxjM=; b=eoBl6QNMeYI9BSzu3JAyXcYqeH+xQnjJnQ2TZAMWaDfr/ggD7OxzyWkjr+wHd8U8bI +buRffiv3PpzVWm4pr/u5Vo+b59x4sRqpUgpL2x52bO9E8dLdzS9IB7ezMuqTiGWiL7o o8Icr+NQqiK4VWfRWzhgs9wMUCH11OHxzc6XPaklBNBQ3KGRqv1OOrX8bGD7+xcucHkB QQs7KiRNOBJqgJdjJFxvVpEt/usalp3B7k8IepubS+XyMD5z3ci5IY80uEjSxPuP9Ofn 1tvdSan+RMrZbQJOPcl9xPFvErbZJtyutYpTto4NGvJo73Vt0Zt7GyqU0vp0sssumBVt qv1A== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x23si519334ejw.267.2020.08.04.20.51.14; Tue, 04 Aug 2020 20:51:36 -0700 (PDT) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727051AbgHEDu6 (ORCPT + 99 others); Tue, 4 Aug 2020 23:50:58 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:9333 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726233AbgHEDu4 (ORCPT ); Tue, 4 Aug 2020 23:50:56 -0400 Received: from DGGEMS408-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id BF35688112AD7C521FA6; Wed, 5 Aug 2020 11:50:53 +0800 (CST) Received: from localhost.localdomain (10.175.112.70) by DGGEMS408-HUB.china.huawei.com (10.3.19.208) with Microsoft SMTP Server (TLS) id 14.3.487.0; Wed, 5 Aug 2020 11:50:48 +0800 From: Zhang Changzhong To: , , , , , , CC: , , Subject: [PATCH net 1/4] can: j1939: fix support for multipacket broadcast message Date: Wed, 5 Aug 2020 11:50:22 +0800 Message-ID: <1596599425-5534-2-git-send-email-zhangchangzhong@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1596599425-5534-1-git-send-email-zhangchangzhong@huawei.com> References: <1596599425-5534-1-git-send-email-zhangchangzhong@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.112.70] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently j1939_tp_im_involved_anydir() in j1939_tp_recv() check the previously set flags J1939_ECU_LOCAL_DST and J1939_ECU_LOCAL_SRC of incoming skb, thus multipacket broadcast message was aborted by receive side because it may come from remote ECUs and have no exact dst address. Similarly, j1939_tp_cmd_recv() and j1939_xtp_rx_dat() didn't process broadcast message. So fix it by checking and process broadcast message in j1939_tp_recv(), j1939_tp_cmd_recv() and j1939_xtp_rx_dat(). Fixes: 9d71dd0c7009 ("can: add support of SAE J1939 protocol") Signed-off-by: Zhang Changzhong --- net/can/j1939/transport.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index 9f99af5..e5188ac 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -1651,8 +1651,12 @@ static void j1939_xtp_rx_rts(struct j1939_priv *priv, struct sk_buff *skb, return; } session = j1939_xtp_rx_rts_session_new(priv, skb); - if (!session) + if (!session) { + if (cmd == J1939_TP_CMD_BAM && j1939_sk_recv_match(priv, skcb)) + netdev_info(priv->ndev, "%s: failed to create TP BAM session\n", + __func__); return; + } } else { if (j1939_xtp_rx_rts_session_active(session, skb)) { j1939_session_put(session); @@ -1829,6 +1833,13 @@ static void j1939_xtp_rx_dat(struct j1939_priv *priv, struct sk_buff *skb) else j1939_xtp_rx_dat_one(session, skb); } + + if (j1939_cb_is_broadcast(skcb)) { + session = j1939_session_get_by_addr(priv, &skcb->addr, false, + false); + if (session) + j1939_xtp_rx_dat_one(session, skb); + } } /* j1939 main intf */ @@ -1920,7 +1931,7 @@ static void j1939_tp_cmd_recv(struct j1939_priv *priv, struct sk_buff *skb) if (j1939_tp_im_transmitter(skcb)) j1939_xtp_rx_rts(priv, skb, true); - if (j1939_tp_im_receiver(skcb)) + if (j1939_tp_im_receiver(skcb) || j1939_cb_is_broadcast(skcb)) j1939_xtp_rx_rts(priv, skb, false); break; @@ -1984,7 +1995,7 @@ int j1939_tp_recv(struct j1939_priv *priv, struct sk_buff *skb) { struct j1939_sk_buff_cb *skcb = j1939_skb_to_cb(skb); - if (!j1939_tp_im_involved_anydir(skcb)) + if (!j1939_tp_im_involved_anydir(skcb) && !j1939_cb_is_broadcast(skcb)) return 0; switch (skcb->addr.pgn) { -- 2.9.5