For the errqueue we need to store error per session. In this case we can notify the user space about session state even if we have a queue of multiple sessions. Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx> --- net/can/j1939/j1939-priv.h | 1 + net/can/j1939/transport.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/net/can/j1939/j1939-priv.h b/net/can/j1939/j1939-priv.h index 4cb2e63a86c4..ff59301c9dc3 100644 --- a/net/can/j1939/j1939-priv.h +++ b/net/can/j1939/j1939-priv.h @@ -207,6 +207,7 @@ struct j1939_session { bool transmission; bool extd; unsigned int total_message_size; /* Total message size, number of bytes */ + int err; /* Packets counters for a (extended) transfer session. The packet is * maximal of 7 bytes. */ diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index 843c772c0659..62838d2e1173 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -874,6 +874,7 @@ static void j1939_session_cancel(struct j1939_session *session, WARN_ON_ONCE(!err); + session->err = j1939_xtp_abort_to_errno(priv, err); /* do not send aborts on incoming broadcasts */ if (!j1939_cb_is_broadcast(&session->skcb)) j1939_xtp_tx_abort(priv, &session->skcb, session->extd, @@ -881,8 +882,7 @@ static void j1939_session_cancel(struct j1939_session *session, err, session->skcb.addr.pgn); if (session->sk) - j1939_sk_send_multi_abort(priv, session->sk, - j1939_xtp_abort_to_errno(priv, err)); + j1939_sk_send_multi_abort(priv, session->sk, session->err); } static enum hrtimer_restart j1939_tp_rxtimer(struct hrtimer *hrtimer) @@ -957,9 +957,10 @@ static void j1939_xtp_rx_abort_one(struct j1939_priv *priv, struct sk_buff *skb, u8 abort = skb->data[1]; j1939_session_timers_cancel(session); + session->err = j1939_xtp_abort_to_errno(priv, abort); if (session->sk) j1939_sk_send_multi_abort(priv, session->sk, - j1939_xtp_abort_to_errno(priv, abort)); + session->err); } /* TODO: maybe cancel current connection -- 2.20.1