lkml.org 
[lkml]   [2020]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 077/107] can: j1939: fix support for multipacket broadcast message
    Date
    From: Zhang Changzhong <zhangchangzhong@huawei.com>

    [ Upstream commit f4fd77fd87e9b214c26bb2ebd4f90055eaea5ade ]

    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 <zhangchangzhong@huawei.com>
    Link: https://lore.kernel.org/r/1596599425-5534-2-git-send-email-zhangchangzhong@huawei.com
    Acked-by: Oleksij Rempel <o.rempel@pengutronix.de>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 90a2baac8a4aa..67189b4c482c5 100644
    --- a/net/can/j1939/transport.c
    +++ b/net/can/j1939/transport.c
    @@ -1673,8 +1673,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);
    @@ -1852,6 +1856,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 */
    @@ -1943,7 +1954,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;
    @@ -2007,7 +2018,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.25.1


    \
     
     \ /
      Last update: 2020-08-24 11:35    [W:7.839 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site