* pull-request: can 2020-08-15
@ 2020-08-15 9:21 Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 1/4] can: j1939: fix support for multipacket broadcast message Marc Kleine-Budde
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2020-08-15 9:21 UTC (permalink / raw)
To: netdev; +Cc: davem, linux-can, kernel
Hello David,
this is a pull request of 4 patches for net/master.
All patches are by Zhang Changzhong and fix broadcast related problems in the
j1939 CAN networking stack.
regards,
Marc
---
The following changes since commit 4ca0d9ac3fd8f9f90b72a15d8da2aca3ffb58418:
bonding: show saner speed for broadcast mode (2020-08-14 20:39:33 -0700)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git tags/linux-can-fixes-for-5.9-20200815
for you to fetch changes up to 0ae18a82686f9b9965a8ce0dd81371871b306ffe:
can: j1939: add rxtimer for multipacket broadcast session (2020-08-15 11:12:58 +0200)
----------------------------------------------------------------
linux-can-fixes-for-5.9-20200815
----------------------------------------------------------------
Zhang Changzhong (4):
can: j1939: fix support for multipacket broadcast message
can: j1939: cancel rxtimer on multipacket broadcast session complete
can: j1939: abort multipacket broadcast session when timeout occurs
can: j1939: add rxtimer for multipacket broadcast session
net/can/j1939/transport.c | 48 +++++++++++++++++++++++++++++++++++------------
1 file changed, 36 insertions(+), 12 deletions(-)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/4] can: j1939: fix support for multipacket broadcast message
2020-08-15 9:21 pull-request: can 2020-08-15 Marc Kleine-Budde
@ 2020-08-15 9:21 ` Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 2/4] can: j1939: cancel rxtimer on multipacket broadcast session complete Marc Kleine-Budde
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2020-08-15 9:21 UTC (permalink / raw)
To: netdev
Cc: davem, linux-can, kernel, Zhang Changzhong, Oleksij Rempel,
Marc Kleine-Budde
From: Zhang Changzhong <zhangchangzhong@huawei.com>
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>
---
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 5cf107cb447c..868ecb2bfa45 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);
@@ -1865,6 +1869,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 */
@@ -1956,7 +1967,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;
@@ -2020,7 +2031,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.28.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/4] can: j1939: cancel rxtimer on multipacket broadcast session complete
2020-08-15 9:21 pull-request: can 2020-08-15 Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 1/4] can: j1939: fix support for multipacket broadcast message Marc Kleine-Budde
@ 2020-08-15 9:21 ` Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 3/4] can: j1939: abort multipacket broadcast session when timeout occurs Marc Kleine-Budde
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2020-08-15 9:21 UTC (permalink / raw)
To: netdev
Cc: davem, linux-can, kernel, Zhang Changzhong, Oleksij Rempel,
Marc Kleine-Budde
From: Zhang Changzhong <zhangchangzhong@huawei.com>
If j1939_xtp_rx_dat_one() receive last frame of multipacket broadcast message,
j1939_session_timers_cancel() should be called to cancel rxtimer.
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-3-git-send-email-zhangchangzhong@huawei.com
Acked-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
net/can/j1939/transport.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c
index 868ecb2bfa45..2f3c3afd5071 100644
--- a/net/can/j1939/transport.c
+++ b/net/can/j1939/transport.c
@@ -1824,6 +1824,7 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session,
}
if (final) {
+ j1939_session_timers_cancel(session);
j1939_session_completed(session);
} else if (do_cts_eoma) {
j1939_tp_set_rxtimeout(session, 1250);
--
2.28.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/4] can: j1939: abort multipacket broadcast session when timeout occurs
2020-08-15 9:21 pull-request: can 2020-08-15 Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 1/4] can: j1939: fix support for multipacket broadcast message Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 2/4] can: j1939: cancel rxtimer on multipacket broadcast session complete Marc Kleine-Budde
@ 2020-08-15 9:21 ` Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 4/4] can: j1939: add rxtimer for multipacket broadcast session Marc Kleine-Budde
2020-08-16 23:05 ` pull-request: can 2020-08-15 David Miller
4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2020-08-15 9:21 UTC (permalink / raw)
To: netdev
Cc: davem, linux-can, kernel, Zhang Changzhong, Oleksij Rempel,
Marc Kleine-Budde
From: Zhang Changzhong <zhangchangzhong@huawei.com>
If timeout occurs, j1939_tp_rxtimer() first calls hrtimer_start() to restart
rxtimer, and then calls __j1939_session_cancel() to set session->state =
J1939_SESSION_WAITING_ABORT. At next timeout expiration, because of the
J1939_SESSION_WAITING_ABORT session state j1939_tp_rxtimer() will call
j1939_session_deactivate_activate_next() to deactivate current session, and
rxtimer won't be set.
But for multipacket broadcast session, __j1939_session_cancel() don't set
session->state = J1939_SESSION_WAITING_ABORT, thus current session won't be
deactivate and hrtimer_start() is called to start new rxtimer again and again.
So fix it by moving session->state = J1939_SESSION_WAITING_ABORT out of if
(!j1939_cb_is_broadcast(&session->skcb)) statement.
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-4-git-send-email-zhangchangzhong@huawei.com
Acked-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
net/can/j1939/transport.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c
index 2f3c3afd5071..047118d5270b 100644
--- a/net/can/j1939/transport.c
+++ b/net/can/j1939/transport.c
@@ -1074,9 +1074,9 @@ static void __j1939_session_cancel(struct j1939_session *session,
lockdep_assert_held(&session->priv->active_session_list_lock);
session->err = j1939_xtp_abort_to_errno(priv, err);
+ session->state = J1939_SESSION_WAITING_ABORT;
/* do not send aborts on incoming broadcasts */
if (!j1939_cb_is_broadcast(&session->skcb)) {
- session->state = J1939_SESSION_WAITING_ABORT;
j1939_xtp_tx_abort(priv, &session->skcb,
!session->transmission,
err, session->skcb.addr.pgn);
--
2.28.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/4] can: j1939: add rxtimer for multipacket broadcast session
2020-08-15 9:21 pull-request: can 2020-08-15 Marc Kleine-Budde
` (2 preceding siblings ...)
2020-08-15 9:21 ` [PATCH 3/4] can: j1939: abort multipacket broadcast session when timeout occurs Marc Kleine-Budde
@ 2020-08-15 9:21 ` Marc Kleine-Budde
2020-08-16 23:05 ` pull-request: can 2020-08-15 David Miller
4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2020-08-15 9:21 UTC (permalink / raw)
To: netdev
Cc: davem, linux-can, kernel, Zhang Changzhong, Oleksij Rempel,
Marc Kleine-Budde
From: Zhang Changzhong <zhangchangzhong@huawei.com>
According to SAE J1939/21 (Chapter 5.12.3 and APPENDIX C), for transmit side
the required time interval between packets of a multipacket broadcast message
is 50 to 200 ms, the responder shall use a timeout of 250ms (provides margin
allowing for the maximumm spacing of 200ms). For receive side a timeout will
occur when a time of greater than 750 ms elapsed between two message packets
when more packets were expected.
So this patch fix and add rxtimer for multipacket broadcast session.
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-5-git-send-email-zhangchangzhong@huawei.com
Acked-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
net/can/j1939/transport.c | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c
index 047118d5270b..a8dd956b5e8e 100644
--- a/net/can/j1939/transport.c
+++ b/net/can/j1939/transport.c
@@ -723,10 +723,12 @@ static int j1939_session_tx_rts(struct j1939_session *session)
return ret;
session->last_txcmd = dat[0];
- if (dat[0] == J1939_TP_CMD_BAM)
+ if (dat[0] == J1939_TP_CMD_BAM) {
j1939_tp_schedule_txtimer(session, 50);
-
- j1939_tp_set_rxtimeout(session, 1250);
+ j1939_tp_set_rxtimeout(session, 250);
+ } else {
+ j1939_tp_set_rxtimeout(session, 1250);
+ }
netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session);
@@ -1687,11 +1689,15 @@ static void j1939_xtp_rx_rts(struct j1939_priv *priv, struct sk_buff *skb,
}
session->last_cmd = cmd;
- j1939_tp_set_rxtimeout(session, 1250);
-
- if (cmd != J1939_TP_CMD_BAM && !session->transmission) {
- j1939_session_txtimer_cancel(session);
- j1939_tp_schedule_txtimer(session, 0);
+ if (cmd == J1939_TP_CMD_BAM) {
+ if (!session->transmission)
+ j1939_tp_set_rxtimeout(session, 750);
+ } else {
+ if (!session->transmission) {
+ j1939_session_txtimer_cancel(session);
+ j1939_tp_schedule_txtimer(session, 0);
+ }
+ j1939_tp_set_rxtimeout(session, 1250);
}
j1939_session_put(session);
@@ -1742,6 +1748,7 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session,
int offset;
int nbytes;
bool final = false;
+ bool remain = false;
bool do_cts_eoma = false;
int packet;
@@ -1817,6 +1824,8 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session,
j1939_cb_is_broadcast(&session->skcb)) {
if (session->pkt.rx >= session->pkt.total)
final = true;
+ else
+ remain = true;
} else {
/* never final, an EOMA must follow */
if (session->pkt.rx >= session->pkt.last)
@@ -1826,6 +1835,9 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session,
if (final) {
j1939_session_timers_cancel(session);
j1939_session_completed(session);
+ } else if (remain) {
+ if (!session->transmission)
+ j1939_tp_set_rxtimeout(session, 750);
} else if (do_cts_eoma) {
j1939_tp_set_rxtimeout(session, 1250);
if (!session->transmission)
--
2.28.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: pull-request: can 2020-08-15
2020-08-15 9:21 pull-request: can 2020-08-15 Marc Kleine-Budde
` (3 preceding siblings ...)
2020-08-15 9:21 ` [PATCH 4/4] can: j1939: add rxtimer for multipacket broadcast session Marc Kleine-Budde
@ 2020-08-16 23:05 ` David Miller
4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2020-08-16 23:05 UTC (permalink / raw)
To: mkl; +Cc: netdev, linux-can, kernel
From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: Sat, 15 Aug 2020 11:21:12 +0200
> this is a pull request of 4 patches for net/master.
>
> All patches are by Zhang Changzhong and fix broadcast related problems in the
> j1939 CAN networking stack.
Pulled, thanks Marc.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-08-16 23:05 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-15 9:21 pull-request: can 2020-08-15 Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 1/4] can: j1939: fix support for multipacket broadcast message Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 2/4] can: j1939: cancel rxtimer on multipacket broadcast session complete Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 3/4] can: j1939: abort multipacket broadcast session when timeout occurs Marc Kleine-Budde
2020-08-15 9:21 ` [PATCH 4/4] can: j1939: add rxtimer for multipacket broadcast session Marc Kleine-Budde
2020-08-16 23:05 ` pull-request: can 2020-08-15 David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.