Skip to content

Commit f4fd77f

Browse files
Zhang Changzhongmarckleinebudde
authored andcommitted
can: j1939: fix support for multipacket broadcast message
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: 9d71dd0 ("can: add support of SAE J1939 protocol") Signed-off-by: Zhang Changzhong <[email protected]> Link: https://lore.kernel.org/r/[email protected] Acked-by: Oleksij Rempel <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent 4ca0d9a commit f4fd77f

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

net/can/j1939/transport.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,8 +1673,12 @@ static void j1939_xtp_rx_rts(struct j1939_priv *priv, struct sk_buff *skb,
16731673
return;
16741674
}
16751675
session = j1939_xtp_rx_rts_session_new(priv, skb);
1676-
if (!session)
1676+
if (!session) {
1677+
if (cmd == J1939_TP_CMD_BAM && j1939_sk_recv_match(priv, skcb))
1678+
netdev_info(priv->ndev, "%s: failed to create TP BAM session\n",
1679+
__func__);
16771680
return;
1681+
}
16781682
} else {
16791683
if (j1939_xtp_rx_rts_session_active(session, skb)) {
16801684
j1939_session_put(session);
@@ -1865,6 +1869,13 @@ static void j1939_xtp_rx_dat(struct j1939_priv *priv, struct sk_buff *skb)
18651869
else
18661870
j1939_xtp_rx_dat_one(session, skb);
18671871
}
1872+
1873+
if (j1939_cb_is_broadcast(skcb)) {
1874+
session = j1939_session_get_by_addr(priv, &skcb->addr, false,
1875+
false);
1876+
if (session)
1877+
j1939_xtp_rx_dat_one(session, skb);
1878+
}
18681879
}
18691880

18701881
/* j1939 main intf */
@@ -1956,7 +1967,7 @@ static void j1939_tp_cmd_recv(struct j1939_priv *priv, struct sk_buff *skb)
19561967
if (j1939_tp_im_transmitter(skcb))
19571968
j1939_xtp_rx_rts(priv, skb, true);
19581969

1959-
if (j1939_tp_im_receiver(skcb))
1970+
if (j1939_tp_im_receiver(skcb) || j1939_cb_is_broadcast(skcb))
19601971
j1939_xtp_rx_rts(priv, skb, false);
19611972

19621973
break;
@@ -2020,7 +2031,7 @@ int j1939_tp_recv(struct j1939_priv *priv, struct sk_buff *skb)
20202031
{
20212032
struct j1939_sk_buff_cb *skcb = j1939_skb_to_cb(skb);
20222033

2023-
if (!j1939_tp_im_involved_anydir(skcb))
2034+
if (!j1939_tp_im_involved_anydir(skcb) && !j1939_cb_is_broadcast(skcb))
20242035
return 0;
20252036

20262037
switch (skcb->addr.pgn) {

0 commit comments

Comments
 (0)