Lines Matching refs:session
246 void j1939_session_get(struct j1939_session *session) in j1939_session_get() argument
248 kref_get(&session->kref); in j1939_session_get()
252 static void __j1939_session_drop(struct j1939_session *session) in __j1939_session_drop() argument
254 if (!session->transmission) in __j1939_session_drop()
257 j1939_sock_pending_del(session->sk); in __j1939_session_drop()
258 sock_put(session->sk); in __j1939_session_drop()
261 static void j1939_session_destroy(struct j1939_session *session) in j1939_session_destroy() argument
265 if (session->transmission) { in j1939_session_destroy()
266 if (session->err) in j1939_session_destroy()
267 j1939_sk_errqueue(session, J1939_ERRQUEUE_TX_ABORT); in j1939_session_destroy()
269 j1939_sk_errqueue(session, J1939_ERRQUEUE_TX_ACK); in j1939_session_destroy()
270 } else if (session->err) { in j1939_session_destroy()
271 j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_ABORT); in j1939_session_destroy()
274 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_destroy()
276 WARN_ON_ONCE(!list_empty(&session->sk_session_queue_entry)); in j1939_session_destroy()
277 WARN_ON_ONCE(!list_empty(&session->active_session_list_entry)); in j1939_session_destroy()
279 while ((skb = skb_dequeue(&session->skb_queue)) != NULL) { in j1939_session_destroy()
284 __j1939_session_drop(session); in j1939_session_destroy()
285 j1939_priv_put(session->priv); in j1939_session_destroy()
286 kfree(session); in j1939_session_destroy()
291 struct j1939_session *session = container_of(kref, struct j1939_session, in __j1939_session_release() local
294 j1939_session_destroy(session); in __j1939_session_release()
297 void j1939_session_put(struct j1939_session *session) in j1939_session_put() argument
299 kref_put(&session->kref, __j1939_session_release); in j1939_session_put()
302 static void j1939_session_txtimer_cancel(struct j1939_session *session) in j1939_session_txtimer_cancel() argument
304 if (hrtimer_cancel(&session->txtimer)) in j1939_session_txtimer_cancel()
305 j1939_session_put(session); in j1939_session_txtimer_cancel()
308 static void j1939_session_rxtimer_cancel(struct j1939_session *session) in j1939_session_rxtimer_cancel() argument
310 if (hrtimer_cancel(&session->rxtimer)) in j1939_session_rxtimer_cancel()
311 j1939_session_put(session); in j1939_session_rxtimer_cancel()
314 void j1939_session_timers_cancel(struct j1939_session *session) in j1939_session_timers_cancel() argument
316 j1939_session_txtimer_cancel(session); in j1939_session_timers_cancel()
317 j1939_session_rxtimer_cancel(session); in j1939_session_timers_cancel()
325 static void j1939_session_skb_drop_old(struct j1939_session *session) in j1939_session_skb_drop_old() argument
332 if (skb_queue_len(&session->skb_queue) < 2) in j1939_session_skb_drop_old()
335 offset_start = session->pkt.tx_acked * 7; in j1939_session_skb_drop_old()
337 spin_lock_irqsave(&session->skb_queue.lock, flags); in j1939_session_skb_drop_old()
338 do_skb = skb_peek(&session->skb_queue); in j1939_session_skb_drop_old()
342 __skb_unlink(do_skb, &session->skb_queue); in j1939_session_skb_drop_old()
345 spin_unlock_irqrestore(&session->skb_queue.lock, flags); in j1939_session_skb_drop_old()
349 spin_unlock_irqrestore(&session->skb_queue.lock, flags); in j1939_session_skb_drop_old()
353 void j1939_session_skb_queue(struct j1939_session *session, in j1939_session_skb_queue() argument
357 struct j1939_priv *priv = session->priv; in j1939_session_skb_queue()
368 skb_queue_tail(&session->skb_queue, skb); in j1939_session_skb_queue()
372 sk_buff *j1939_session_skb_get_by_offset(struct j1939_session *session, in j1939_session_skb_get_by_offset() argument
375 struct j1939_priv *priv = session->priv; in j1939_session_skb_get_by_offset()
381 spin_lock_irqsave(&session->skb_queue.lock, flags); in j1939_session_skb_get_by_offset()
382 skb_queue_walk(&session->skb_queue, do_skb) { in j1939_session_skb_get_by_offset()
394 spin_unlock_irqrestore(&session->skb_queue.lock, flags); in j1939_session_skb_get_by_offset()
398 __func__, session, offset_start, in j1939_session_skb_get_by_offset()
399 skb_queue_len(&session->skb_queue)); in j1939_session_skb_get_by_offset()
404 static struct sk_buff *j1939_session_skb_get(struct j1939_session *session) in j1939_session_skb_get() argument
408 offset_start = session->pkt.dpo * 7; in j1939_session_skb_get()
409 return j1939_session_skb_get_by_offset(session, offset_start); in j1939_session_skb_get()
518 struct j1939_session *session; in j1939_session_get_by_addr_locked() local
522 list_for_each_entry(session, root, active_session_list_entry) { in j1939_session_get_by_addr_locked()
523 j1939_session_get(session); in j1939_session_get_by_addr_locked()
524 if (j1939_session_match(&session->skcb.addr, addr, reverse) && in j1939_session_get_by_addr_locked()
525 session->transmission == transmitter) in j1939_session_get_by_addr_locked()
526 return session; in j1939_session_get_by_addr_locked()
527 j1939_session_put(session); in j1939_session_get_by_addr_locked()
538 struct j1939_session *session; in j1939_session_get_simple() local
542 list_for_each_entry(session, &priv->active_session_list, in j1939_session_get_simple()
544 j1939_session_get(session); in j1939_session_get_simple()
545 if (session->skcb.addr.type == J1939_SIMPLE && in j1939_session_get_simple()
546 session->tskey == skcb->tskey && session->sk == skb->sk) in j1939_session_get_simple()
547 return session; in j1939_session_get_simple()
548 j1939_session_put(session); in j1939_session_get_simple()
559 struct j1939_session *session; in j1939_session_get_by_addr() local
562 session = j1939_session_get_by_addr_locked(priv, in j1939_session_get_by_addr()
567 return session; in j1939_session_get_by_addr()
628 static int j1939_tp_tx_dat(struct j1939_session *session, in j1939_tp_tx_dat() argument
631 struct j1939_priv *priv = session->priv; in j1939_tp_tx_dat()
634 skb = j1939_tp_tx_dat_new(priv, &session->skcb, in j1939_tp_tx_dat()
669 static inline int j1939_tp_tx_ctl(struct j1939_session *session, in j1939_tp_tx_ctl() argument
672 struct j1939_priv *priv = session->priv; in j1939_tp_tx_ctl()
674 return j1939_xtp_do_tx_ctl(priv, &session->skcb, in j1939_tp_tx_ctl()
676 session->skcb.addr.pgn, dat); in j1939_tp_tx_ctl()
696 void j1939_tp_schedule_txtimer(struct j1939_session *session, int msec) in j1939_tp_schedule_txtimer() argument
698 j1939_session_get(session); in j1939_tp_schedule_txtimer()
699 hrtimer_start(&session->txtimer, ms_to_ktime(msec), in j1939_tp_schedule_txtimer()
703 static inline void j1939_tp_set_rxtimeout(struct j1939_session *session, in j1939_tp_set_rxtimeout() argument
706 j1939_session_rxtimer_cancel(session); in j1939_tp_set_rxtimeout()
707 j1939_session_get(session); in j1939_tp_set_rxtimeout()
708 hrtimer_start(&session->rxtimer, ms_to_ktime(msec), in j1939_tp_set_rxtimeout()
712 static int j1939_session_tx_rts(struct j1939_session *session) in j1939_session_tx_rts() argument
719 dat[1] = (session->total_message_size >> 0); in j1939_session_tx_rts()
720 dat[2] = (session->total_message_size >> 8); in j1939_session_tx_rts()
721 dat[3] = session->pkt.total; in j1939_session_tx_rts()
723 if (session->skcb.addr.type == J1939_ETP) { in j1939_session_tx_rts()
725 dat[1] = (session->total_message_size >> 0); in j1939_session_tx_rts()
726 dat[2] = (session->total_message_size >> 8); in j1939_session_tx_rts()
727 dat[3] = (session->total_message_size >> 16); in j1939_session_tx_rts()
728 dat[4] = (session->total_message_size >> 24); in j1939_session_tx_rts()
729 } else if (j1939_cb_is_broadcast(&session->skcb)) { in j1939_session_tx_rts()
732 session->pkt.tx = 0; in j1939_session_tx_rts()
738 if (dat[0] == session->last_txcmd) in j1939_session_tx_rts()
742 ret = j1939_tp_tx_ctl(session, false, dat); in j1939_session_tx_rts()
746 session->last_txcmd = dat[0]; in j1939_session_tx_rts()
748 j1939_tp_schedule_txtimer(session, 50); in j1939_session_tx_rts()
749 j1939_tp_set_rxtimeout(session, 250); in j1939_session_tx_rts()
751 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_rts()
754 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_tx_rts()
759 static int j1939_session_tx_dpo(struct j1939_session *session) in j1939_session_tx_dpo() argument
768 session->pkt.dpo = session->pkt.tx_acked; in j1939_session_tx_dpo()
769 pkt = session->pkt.dpo; in j1939_session_tx_dpo()
770 dat[1] = session->pkt.last - session->pkt.tx_acked; in j1939_session_tx_dpo()
775 ret = j1939_tp_tx_ctl(session, false, dat); in j1939_session_tx_dpo()
779 session->last_txcmd = dat[0]; in j1939_session_tx_dpo()
780 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_dpo()
781 session->pkt.tx = session->pkt.tx_acked; in j1939_session_tx_dpo()
783 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_tx_dpo()
788 static int j1939_session_tx_dat(struct j1939_session *session) in j1939_session_tx_dat() argument
790 struct j1939_priv *priv = session->priv; in j1939_session_tx_dat()
799 se_skb = j1939_session_skb_get_by_offset(session, session->pkt.tx * 7); in j1939_session_tx_dat()
807 if (session->skcb.addr.type != J1939_ETP && in j1939_session_tx_dat()
808 j1939_cb_is_broadcast(&session->skcb)) in j1939_session_tx_dat()
809 pkt_end = session->pkt.total; in j1939_session_tx_dat()
811 pkt_end = session->pkt.last; in j1939_session_tx_dat()
813 while (session->pkt.tx < pkt_end) { in j1939_session_tx_dat()
814 dat[0] = session->pkt.tx - session->pkt.dpo + 1; in j1939_session_tx_dat()
815 offset = (session->pkt.tx * 7) - se_skcb->offset; in j1939_session_tx_dat()
823 __func__, session, se_skcb->offset, in j1939_session_tx_dat()
824 se_skb->len , session->pkt.tx); in j1939_session_tx_dat()
835 ret = j1939_tp_tx_dat(session, dat, len + 1); in j1939_session_tx_dat()
841 __func__, session, ret); in j1939_session_tx_dat()
845 session->last_txcmd = 0xff; in j1939_session_tx_dat()
847 session->pkt.tx++; in j1939_session_tx_dat()
848 pdelay = j1939_cb_is_broadcast(&session->skcb) ? 50 : in j1939_session_tx_dat()
851 if (session->pkt.tx < session->pkt.total && pdelay) { in j1939_session_tx_dat()
852 j1939_tp_schedule_txtimer(session, pdelay); in j1939_session_tx_dat()
858 j1939_tp_set_rxtimeout(session, 250); in j1939_session_tx_dat()
869 static int j1939_xtp_txnext_transmiter(struct j1939_session *session) in j1939_xtp_txnext_transmiter() argument
871 struct j1939_priv *priv = session->priv; in j1939_xtp_txnext_transmiter()
874 if (!j1939_tp_im_transmitter(&session->skcb)) { in j1939_xtp_txnext_transmiter()
876 __func__, session); in j1939_xtp_txnext_transmiter()
880 switch (session->last_cmd) { in j1939_xtp_txnext_transmiter()
882 ret = j1939_session_tx_rts(session); in j1939_xtp_txnext_transmiter()
886 if (session->last_txcmd != J1939_ETP_CMD_DPO) { in j1939_xtp_txnext_transmiter()
887 ret = j1939_session_tx_dpo(session); in j1939_xtp_txnext_transmiter()
897 ret = j1939_session_tx_dat(session); in j1939_xtp_txnext_transmiter()
902 __func__, session, session->last_cmd); in j1939_xtp_txnext_transmiter()
908 static int j1939_session_tx_cts(struct j1939_session *session) in j1939_session_tx_cts() argument
910 struct j1939_priv *priv = session->priv; in j1939_session_tx_cts()
915 if (!j1939_sk_recv_match(priv, &session->skcb)) in j1939_session_tx_cts()
918 len = session->pkt.total - session->pkt.rx; in j1939_session_tx_cts()
919 len = min3(len, session->pkt.block, j1939_tp_block ?: 255); in j1939_session_tx_cts()
922 if (session->skcb.addr.type == J1939_ETP) { in j1939_session_tx_cts()
923 pkt = session->pkt.rx + 1; in j1939_session_tx_cts()
932 dat[2] = session->pkt.rx + 1; in j1939_session_tx_cts()
935 if (dat[0] == session->last_txcmd) in j1939_session_tx_cts()
939 ret = j1939_tp_tx_ctl(session, true, dat); in j1939_session_tx_cts()
945 session->last_txcmd = dat[0]; in j1939_session_tx_cts()
946 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_cts()
948 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_tx_cts()
953 static int j1939_session_tx_eoma(struct j1939_session *session) in j1939_session_tx_eoma() argument
955 struct j1939_priv *priv = session->priv; in j1939_session_tx_eoma()
959 if (!j1939_sk_recv_match(priv, &session->skcb)) in j1939_session_tx_eoma()
964 if (session->skcb.addr.type == J1939_ETP) { in j1939_session_tx_eoma()
966 dat[1] = session->total_message_size >> 0; in j1939_session_tx_eoma()
967 dat[2] = session->total_message_size >> 8; in j1939_session_tx_eoma()
968 dat[3] = session->total_message_size >> 16; in j1939_session_tx_eoma()
969 dat[4] = session->total_message_size >> 24; in j1939_session_tx_eoma()
972 dat[1] = session->total_message_size; in j1939_session_tx_eoma()
973 dat[2] = session->total_message_size >> 8; in j1939_session_tx_eoma()
974 dat[3] = session->pkt.total; in j1939_session_tx_eoma()
977 if (dat[0] == session->last_txcmd) in j1939_session_tx_eoma()
981 ret = j1939_tp_tx_ctl(session, true, dat); in j1939_session_tx_eoma()
985 session->last_txcmd = dat[0]; in j1939_session_tx_eoma()
988 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_eoma()
990 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_tx_eoma()
995 static int j1939_xtp_txnext_receiver(struct j1939_session *session) in j1939_xtp_txnext_receiver() argument
997 struct j1939_priv *priv = session->priv; in j1939_xtp_txnext_receiver()
1000 if (!j1939_tp_im_receiver(&session->skcb)) { in j1939_xtp_txnext_receiver()
1002 __func__, session); in j1939_xtp_txnext_receiver()
1006 switch (session->last_cmd) { in j1939_xtp_txnext_receiver()
1009 ret = j1939_session_tx_cts(session); in j1939_xtp_txnext_receiver()
1016 if ((session->skcb.addr.type == J1939_TP && in j1939_xtp_txnext_receiver()
1017 j1939_cb_is_broadcast(&session->skcb))) in j1939_xtp_txnext_receiver()
1020 if (session->pkt.rx >= session->pkt.total) { in j1939_xtp_txnext_receiver()
1021 ret = j1939_session_tx_eoma(session); in j1939_xtp_txnext_receiver()
1022 } else if (session->pkt.rx >= session->pkt.last) { in j1939_xtp_txnext_receiver()
1023 session->last_txcmd = 0; in j1939_xtp_txnext_receiver()
1024 ret = j1939_session_tx_cts(session); in j1939_xtp_txnext_receiver()
1029 __func__, session, session->last_cmd); in j1939_xtp_txnext_receiver()
1035 static int j1939_simple_txnext(struct j1939_session *session) in j1939_simple_txnext() argument
1037 struct j1939_priv *priv = session->priv; in j1939_simple_txnext()
1038 struct sk_buff *se_skb = j1939_session_skb_get(session); in j1939_simple_txnext()
1053 j1939_tp_set_rxtimeout(session, J1939_SIMPLE_ECHO_TIMEOUT_MS); in j1939_simple_txnext()
1059 j1939_sk_errqueue(session, J1939_ERRQUEUE_TX_SCHED); in j1939_simple_txnext()
1060 j1939_sk_queue_activate_next(session); in j1939_simple_txnext()
1071 static bool j1939_session_deactivate_locked(struct j1939_session *session) in j1939_session_deactivate_locked() argument
1075 lockdep_assert_held(&session->priv->active_session_list_lock); in j1939_session_deactivate_locked()
1077 if (session->state >= J1939_SESSION_ACTIVE && in j1939_session_deactivate_locked()
1078 session->state < J1939_SESSION_ACTIVE_MAX) { in j1939_session_deactivate_locked()
1081 list_del_init(&session->active_session_list_entry); in j1939_session_deactivate_locked()
1082 session->state = J1939_SESSION_DONE; in j1939_session_deactivate_locked()
1083 j1939_session_put(session); in j1939_session_deactivate_locked()
1089 static bool j1939_session_deactivate(struct j1939_session *session) in j1939_session_deactivate() argument
1091 struct j1939_priv *priv = session->priv; in j1939_session_deactivate()
1095 active = j1939_session_deactivate_locked(session); in j1939_session_deactivate()
1102 j1939_session_deactivate_activate_next(struct j1939_session *session) in j1939_session_deactivate_activate_next() argument
1104 if (j1939_session_deactivate(session)) in j1939_session_deactivate_activate_next()
1105 j1939_sk_queue_activate_next(session); in j1939_session_deactivate_activate_next()
1108 static void __j1939_session_cancel(struct j1939_session *session, in __j1939_session_cancel() argument
1111 struct j1939_priv *priv = session->priv; in __j1939_session_cancel()
1114 lockdep_assert_held(&session->priv->active_session_list_lock); in __j1939_session_cancel()
1116 session->err = j1939_xtp_abort_to_errno(priv, err); in __j1939_session_cancel()
1117 session->state = J1939_SESSION_WAITING_ABORT; in __j1939_session_cancel()
1119 if (!j1939_cb_is_broadcast(&session->skcb)) { in __j1939_session_cancel()
1120 j1939_xtp_tx_abort(priv, &session->skcb, in __j1939_session_cancel()
1121 !session->transmission, in __j1939_session_cancel()
1122 err, session->skcb.addr.pgn); in __j1939_session_cancel()
1125 if (session->sk) in __j1939_session_cancel()
1126 j1939_sk_send_loop_abort(session->sk, session->err); in __j1939_session_cancel()
1128 j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_ABORT); in __j1939_session_cancel()
1131 static void j1939_session_cancel(struct j1939_session *session, in j1939_session_cancel() argument
1134 j1939_session_list_lock(session->priv); in j1939_session_cancel()
1136 if (session->state >= J1939_SESSION_ACTIVE && in j1939_session_cancel()
1137 session->state < J1939_SESSION_WAITING_ABORT) { in j1939_session_cancel()
1138 j1939_tp_set_rxtimeout(session, J1939_XTP_ABORT_TIMEOUT_MS); in j1939_session_cancel()
1139 __j1939_session_cancel(session, err); in j1939_session_cancel()
1142 j1939_session_list_unlock(session->priv); in j1939_session_cancel()
1147 struct j1939_session *session = in j1939_tp_txtimer() local
1149 struct j1939_priv *priv = session->priv; in j1939_tp_txtimer()
1152 if (session->skcb.addr.type == J1939_SIMPLE) { in j1939_tp_txtimer()
1153 ret = j1939_simple_txnext(session); in j1939_tp_txtimer()
1155 if (session->transmission) in j1939_tp_txtimer()
1156 ret = j1939_xtp_txnext_transmiter(session); in j1939_tp_txtimer()
1158 ret = j1939_xtp_txnext_receiver(session); in j1939_tp_txtimer()
1164 if (session->tx_retry < J1939_XTP_TX_RETRY_LIMIT) { in j1939_tp_txtimer()
1165 session->tx_retry++; in j1939_tp_txtimer()
1166 j1939_tp_schedule_txtimer(session, in j1939_tp_txtimer()
1170 __func__, session); in j1939_tp_txtimer()
1171 session->err = -ENETUNREACH; in j1939_tp_txtimer()
1172 j1939_session_rxtimer_cancel(session); in j1939_tp_txtimer()
1173 j1939_session_deactivate_activate_next(session); in j1939_tp_txtimer()
1185 j1939_session_cancel(session, J1939_XTP_ABORT_ECTS_TOO_BIG); in j1939_tp_txtimer()
1188 session->tx_retry = 0; in j1939_tp_txtimer()
1192 __func__, session, ret); in j1939_tp_txtimer()
1193 if (session->skcb.addr.type != J1939_SIMPLE) { in j1939_tp_txtimer()
1194 j1939_session_cancel(session, J1939_XTP_ABORT_OTHER); in j1939_tp_txtimer()
1196 session->err = ret; in j1939_tp_txtimer()
1197 j1939_session_rxtimer_cancel(session); in j1939_tp_txtimer()
1198 j1939_session_deactivate_activate_next(session); in j1939_tp_txtimer()
1202 j1939_session_put(session); in j1939_tp_txtimer()
1207 static void j1939_session_completed(struct j1939_session *session) in j1939_session_completed() argument
1211 if (!session->transmission) { in j1939_session_completed()
1212 se_skb = j1939_session_skb_get(session); in j1939_session_completed()
1214 j1939_sk_recv(session->priv, se_skb); in j1939_session_completed()
1218 j1939_session_deactivate_activate_next(session); in j1939_session_completed()
1223 struct j1939_session *session = container_of(hrtimer, in j1939_tp_rxtimer() local
1226 struct j1939_priv *priv = session->priv; in j1939_tp_rxtimer()
1228 if (session->state == J1939_SESSION_WAITING_ABORT) { in j1939_tp_rxtimer()
1230 __func__, session); in j1939_tp_rxtimer()
1232 j1939_session_deactivate_activate_next(session); in j1939_tp_rxtimer()
1234 } else if (session->skcb.addr.type == J1939_SIMPLE) { in j1939_tp_rxtimer()
1236 __func__, session); in j1939_tp_rxtimer()
1241 session->err = -ETIME; in j1939_tp_rxtimer()
1242 j1939_session_deactivate(session); in j1939_tp_rxtimer()
1244 j1939_session_list_lock(session->priv); in j1939_tp_rxtimer()
1245 if (session->state >= J1939_SESSION_ACTIVE && in j1939_tp_rxtimer()
1246 session->state < J1939_SESSION_ACTIVE_MAX) { in j1939_tp_rxtimer()
1248 __func__, session); in j1939_tp_rxtimer()
1249 j1939_session_get(session); in j1939_tp_rxtimer()
1250 hrtimer_start(&session->rxtimer, in j1939_tp_rxtimer()
1253 __j1939_session_cancel(session, J1939_XTP_ABORT_TIMEOUT); in j1939_tp_rxtimer()
1255 j1939_session_list_unlock(session->priv); in j1939_tp_rxtimer()
1258 j1939_session_put(session); in j1939_tp_rxtimer()
1263 static bool j1939_xtp_rx_cmd_bad_pgn(struct j1939_session *session, in j1939_xtp_rx_cmd_bad_pgn() argument
1268 struct j1939_priv *priv = session->priv; in j1939_xtp_rx_cmd_bad_pgn()
1272 if (session->skcb.addr.pgn == pgn) in j1939_xtp_rx_cmd_bad_pgn()
1312 __func__, session, cmd, pgn, session->skcb.addr.pgn); in j1939_xtp_rx_cmd_bad_pgn()
1323 struct j1939_session *session; in j1939_xtp_rx_abort_one() local
1326 session = j1939_session_get_by_addr(priv, &skcb->addr, reverse, in j1939_xtp_rx_abort_one()
1328 if (!session) in j1939_xtp_rx_abort_one()
1331 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_abort_one()
1335 session, j1939_xtp_ctl_to_pgn(skb->data), abort, in j1939_xtp_rx_abort_one()
1338 j1939_session_timers_cancel(session); in j1939_xtp_rx_abort_one()
1339 session->err = j1939_xtp_abort_to_errno(priv, abort); in j1939_xtp_rx_abort_one()
1340 if (session->sk) in j1939_xtp_rx_abort_one()
1341 j1939_sk_send_loop_abort(session->sk, session->err); in j1939_xtp_rx_abort_one()
1343 j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_ABORT); in j1939_xtp_rx_abort_one()
1344 j1939_session_deactivate_activate_next(session); in j1939_xtp_rx_abort_one()
1347 j1939_session_put(session); in j1939_xtp_rx_abort_one()
1360 j1939_xtp_rx_eoma_one(struct j1939_session *session, struct sk_buff *skb) in j1939_xtp_rx_eoma_one() argument
1366 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_eoma_one()
1376 if (session->total_message_size != len) { in j1939_xtp_rx_eoma_one()
1377 netdev_warn_once(session->priv->ndev, in j1939_xtp_rx_eoma_one()
1379 __func__, session, session->total_message_size, in j1939_xtp_rx_eoma_one()
1383 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_eoma_one()
1385 session->pkt.tx_acked = session->pkt.total; in j1939_xtp_rx_eoma_one()
1386 j1939_session_timers_cancel(session); in j1939_xtp_rx_eoma_one()
1388 j1939_session_completed(session); in j1939_xtp_rx_eoma_one()
1396 struct j1939_session *session; in j1939_xtp_rx_eoma() local
1398 session = j1939_session_get_by_addr(priv, &skcb->addr, true, in j1939_xtp_rx_eoma()
1400 if (!session) in j1939_xtp_rx_eoma()
1403 j1939_xtp_rx_eoma_one(session, skb); in j1939_xtp_rx_eoma()
1404 j1939_session_put(session); in j1939_xtp_rx_eoma()
1408 j1939_xtp_rx_cts_one(struct j1939_session *session, struct sk_buff *skb) in j1939_xtp_rx_cts_one() argument
1416 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_cts_one()
1419 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_cts_one()
1421 if (session->last_cmd == dat[0]) { in j1939_xtp_rx_cts_one()
1426 if (session->skcb.addr.type == J1939_ETP) in j1939_xtp_rx_cts_one()
1433 else if (dat[1] > session->pkt.block /* 0xff for etp */) in j1939_xtp_rx_cts_one()
1437 session->pkt.tx_acked = pkt - 1; in j1939_xtp_rx_cts_one()
1438 j1939_session_skb_drop_old(session); in j1939_xtp_rx_cts_one()
1439 session->pkt.last = session->pkt.tx_acked + dat[1]; in j1939_xtp_rx_cts_one()
1440 if (session->pkt.last > session->pkt.total) in j1939_xtp_rx_cts_one()
1442 session->pkt.last = session->pkt.total; in j1939_xtp_rx_cts_one()
1444 session->pkt.tx = session->pkt.tx_acked; in j1939_xtp_rx_cts_one()
1446 session->last_cmd = dat[0]; in j1939_xtp_rx_cts_one()
1448 j1939_tp_set_rxtimeout(session, 1250); in j1939_xtp_rx_cts_one()
1449 if (session->transmission) { in j1939_xtp_rx_cts_one()
1450 if (session->pkt.tx_acked) in j1939_xtp_rx_cts_one()
1451 j1939_sk_errqueue(session, in j1939_xtp_rx_cts_one()
1453 j1939_session_txtimer_cancel(session); in j1939_xtp_rx_cts_one()
1454 j1939_tp_schedule_txtimer(session, 0); in j1939_xtp_rx_cts_one()
1458 j1939_tp_set_rxtimeout(session, 550); in j1939_xtp_rx_cts_one()
1463 j1939_session_timers_cancel(session); in j1939_xtp_rx_cts_one()
1464 j1939_session_cancel(session, err); in j1939_xtp_rx_cts_one()
1471 struct j1939_session *session; in j1939_xtp_rx_cts() local
1473 session = j1939_session_get_by_addr(priv, &skcb->addr, true, in j1939_xtp_rx_cts()
1475 if (!session) in j1939_xtp_rx_cts()
1477 j1939_xtp_rx_cts_one(session, skb); in j1939_xtp_rx_cts()
1478 j1939_session_put(session); in j1939_xtp_rx_cts()
1484 struct j1939_session *session; in j1939_session_new() local
1487 session = kzalloc(sizeof(*session), gfp_any()); in j1939_session_new()
1488 if (!session) in j1939_session_new()
1491 INIT_LIST_HEAD(&session->active_session_list_entry); in j1939_session_new()
1492 INIT_LIST_HEAD(&session->sk_session_queue_entry); in j1939_session_new()
1493 kref_init(&session->kref); in j1939_session_new()
1496 session->priv = priv; in j1939_session_new()
1497 session->total_message_size = size; in j1939_session_new()
1498 session->state = J1939_SESSION_NEW; in j1939_session_new()
1500 skb_queue_head_init(&session->skb_queue); in j1939_session_new()
1501 skb_queue_tail(&session->skb_queue, skb); in j1939_session_new()
1504 memcpy(&session->skcb, skcb, sizeof(session->skcb)); in j1939_session_new()
1506 hrtimer_init(&session->txtimer, CLOCK_MONOTONIC, in j1939_session_new()
1508 session->txtimer.function = j1939_tp_txtimer; in j1939_session_new()
1509 hrtimer_init(&session->rxtimer, CLOCK_MONOTONIC, in j1939_session_new()
1511 session->rxtimer.function = j1939_tp_rxtimer; in j1939_session_new()
1514 __func__, session, skcb->addr.sa, skcb->addr.da); in j1939_session_new()
1516 return session; in j1939_session_new()
1526 struct j1939_session *session; in j1939_session_fresh_new() local
1539 session = j1939_session_new(priv, skb, size); in j1939_session_fresh_new()
1540 if (!session) { in j1939_session_fresh_new()
1548 return session; in j1939_session_fresh_new()
1551 int j1939_session_activate(struct j1939_session *session) in j1939_session_activate() argument
1553 struct j1939_priv *priv = session->priv; in j1939_session_activate()
1558 if (session->skcb.addr.type != J1939_SIMPLE) in j1939_session_activate()
1561 &session->skcb.addr, false, in j1939_session_activate()
1562 session->transmission); in j1939_session_activate()
1567 WARN_ON_ONCE(session->state != J1939_SESSION_NEW); in j1939_session_activate()
1568 list_add_tail(&session->active_session_list_entry, in j1939_session_activate()
1570 j1939_session_get(session); in j1939_session_activate()
1571 session->state = J1939_SESSION_ACTIVE; in j1939_session_activate()
1573 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", in j1939_session_activate()
1574 __func__, session); in j1939_session_activate()
1587 struct j1939_session *session; in j1939_xtp_rx_rts_session_new() local
1624 session = j1939_session_fresh_new(priv, len, &skcb); in j1939_xtp_rx_rts_session_new()
1625 if (!session) { in j1939_xtp_rx_rts_session_new()
1632 session->pkt.total = (len + 6) / 7; in j1939_xtp_rx_rts_session_new()
1633 session->pkt.block = 0xff; in j1939_xtp_rx_rts_session_new()
1635 if (dat[3] != session->pkt.total) in j1939_xtp_rx_rts_session_new()
1637 __func__, session, session->pkt.total, in j1939_xtp_rx_rts_session_new()
1639 session->pkt.total = dat[3]; in j1939_xtp_rx_rts_session_new()
1640 session->pkt.block = min(dat[3], dat[4]); in j1939_xtp_rx_rts_session_new()
1643 session->pkt.rx = 0; in j1939_xtp_rx_rts_session_new()
1644 session->pkt.tx = 0; in j1939_xtp_rx_rts_session_new()
1646 session->tskey = priv->rx_tskey++; in j1939_xtp_rx_rts_session_new()
1647 j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_RTS); in j1939_xtp_rx_rts_session_new()
1649 WARN_ON_ONCE(j1939_session_activate(session)); in j1939_xtp_rx_rts_session_new()
1651 return session; in j1939_xtp_rx_rts_session_new()
1654 static int j1939_xtp_rx_rts_session_active(struct j1939_session *session, in j1939_xtp_rx_rts_session_active() argument
1658 struct j1939_priv *priv = session->priv; in j1939_xtp_rx_rts_session_active()
1660 if (!session->transmission) { in j1939_xtp_rx_rts_session_active()
1661 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_rts_session_active()
1665 j1939_session_timers_cancel(session); in j1939_xtp_rx_rts_session_active()
1666 j1939_session_cancel(session, J1939_XTP_ABORT_BUSY); in j1939_xtp_rx_rts_session_active()
1669 if (session->last_cmd != 0) { in j1939_xtp_rx_rts_session_active()
1672 __func__, session, skcb->addr.sa, skcb->addr.da, in j1939_xtp_rx_rts_session_active()
1673 session->last_cmd); in j1939_xtp_rx_rts_session_active()
1675 j1939_session_timers_cancel(session); in j1939_xtp_rx_rts_session_active()
1676 j1939_session_cancel(session, J1939_XTP_ABORT_BUSY); in j1939_xtp_rx_rts_session_active()
1681 if (session->skcb.addr.sa != skcb->addr.sa || in j1939_xtp_rx_rts_session_active()
1682 session->skcb.addr.da != skcb->addr.da) in j1939_xtp_rx_rts_session_active()
1684 __func__, session, in j1939_xtp_rx_rts_session_active()
1685 session->skcb.addr.sa, skcb->addr.sa, in j1939_xtp_rx_rts_session_active()
1686 session->skcb.addr.da, skcb->addr.da); in j1939_xtp_rx_rts_session_active()
1691 session->skcb.addr.sa = skcb->addr.sa; in j1939_xtp_rx_rts_session_active()
1692 session->skcb.addr.da = skcb->addr.da; in j1939_xtp_rx_rts_session_active()
1694 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_rts_session_active()
1703 struct j1939_session *session; in j1939_xtp_rx_rts() local
1706 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_rts()
1709 if (!session) { in j1939_xtp_rx_rts()
1728 session = j1939_xtp_rx_rts_session_new(priv, skb); in j1939_xtp_rx_rts()
1729 if (!session) { in j1939_xtp_rx_rts()
1736 if (j1939_xtp_rx_rts_session_active(session, skb)) { in j1939_xtp_rx_rts()
1737 j1939_session_put(session); in j1939_xtp_rx_rts()
1741 session->last_cmd = cmd; in j1939_xtp_rx_rts()
1744 if (!session->transmission) in j1939_xtp_rx_rts()
1745 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_rts()
1747 if (!session->transmission) { in j1939_xtp_rx_rts()
1748 j1939_session_txtimer_cancel(session); in j1939_xtp_rx_rts()
1749 j1939_tp_schedule_txtimer(session, 0); in j1939_xtp_rx_rts()
1751 j1939_tp_set_rxtimeout(session, 1250); in j1939_xtp_rx_rts()
1754 j1939_session_put(session); in j1939_xtp_rx_rts()
1757 static void j1939_xtp_rx_dpo_one(struct j1939_session *session, in j1939_xtp_rx_dpo_one() argument
1762 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_dpo_one()
1765 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_dpo_one()
1768 session->pkt.dpo = j1939_etp_ctl_to_packet(skb->data); in j1939_xtp_rx_dpo_one()
1769 session->last_cmd = dat[0]; in j1939_xtp_rx_dpo_one()
1770 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_dpo_one()
1772 if (!session->transmission) in j1939_xtp_rx_dpo_one()
1773 j1939_sk_errqueue(session, J1939_ERRQUEUE_RX_DPO); in j1939_xtp_rx_dpo_one()
1780 struct j1939_session *session; in j1939_xtp_rx_dpo() local
1782 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dpo()
1784 if (!session) { in j1939_xtp_rx_dpo()
1790 j1939_xtp_rx_dpo_one(session, skb); in j1939_xtp_rx_dpo()
1791 j1939_session_put(session); in j1939_xtp_rx_dpo()
1794 static void j1939_xtp_rx_dat_one(struct j1939_session *session, in j1939_xtp_rx_dat_one() argument
1798 struct j1939_priv *priv = session->priv; in j1939_xtp_rx_dat_one()
1818 switch (session->last_cmd) { in j1939_xtp_rx_dat_one()
1833 session, session->last_cmd); in j1939_xtp_rx_dat_one()
1837 packet = (dat[0] - 1 + session->pkt.dpo); in j1939_xtp_rx_dat_one()
1838 if (packet > session->pkt.total || in j1939_xtp_rx_dat_one()
1839 (session->pkt.rx + 1) > session->pkt.total) { in j1939_xtp_rx_dat_one()
1841 __func__, session); in j1939_xtp_rx_dat_one()
1845 se_skb = j1939_session_skb_get_by_offset(session, packet * 7); in j1939_xtp_rx_dat_one()
1848 session); in j1939_xtp_rx_dat_one()
1859 __func__, session, nbytes, skb->len); in j1939_xtp_rx_dat_one()
1864 if (!session->transmission) { in j1939_xtp_rx_dat_one()
1873 __func__, session, in j1939_xtp_rx_dat_one()
1878 if (packet == session->pkt.rx) in j1939_xtp_rx_dat_one()
1879 session->pkt.rx++; in j1939_xtp_rx_dat_one()
1882 j1939_cb_is_broadcast(&session->skcb)) { in j1939_xtp_rx_dat_one()
1883 if (session->pkt.rx >= session->pkt.total) in j1939_xtp_rx_dat_one()
1889 if (session->pkt.rx >= session->pkt.last) in j1939_xtp_rx_dat_one()
1894 j1939_session_timers_cancel(session); in j1939_xtp_rx_dat_one()
1895 j1939_session_completed(session); in j1939_xtp_rx_dat_one()
1897 if (!session->transmission) in j1939_xtp_rx_dat_one()
1898 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_dat_one()
1900 j1939_tp_set_rxtimeout(session, 1250); in j1939_xtp_rx_dat_one()
1901 if (!session->transmission) in j1939_xtp_rx_dat_one()
1902 j1939_tp_schedule_txtimer(session, 0); in j1939_xtp_rx_dat_one()
1904 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_dat_one()
1906 session->last_cmd = 0xff; in j1939_xtp_rx_dat_one()
1908 j1939_session_put(session); in j1939_xtp_rx_dat_one()
1914 j1939_session_timers_cancel(session); in j1939_xtp_rx_dat_one()
1915 j1939_session_cancel(session, abort); in j1939_xtp_rx_dat_one()
1916 j1939_session_put(session); in j1939_xtp_rx_dat_one()
1922 struct j1939_session *session; in j1939_xtp_rx_dat() local
1927 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dat()
1929 if (!session) in j1939_xtp_rx_dat()
1933 j1939_xtp_rx_dat_one(session, skb); in j1939_xtp_rx_dat()
1937 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dat()
1939 if (!session) in j1939_xtp_rx_dat()
1943 j1939_xtp_rx_dat_one(session, skb); in j1939_xtp_rx_dat()
1947 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dat()
1949 if (session) in j1939_xtp_rx_dat()
1950 j1939_xtp_rx_dat_one(session, skb); in j1939_xtp_rx_dat()
1959 struct j1939_session *session; in j1939_tp_send() local
1997 session = j1939_session_new(priv, skb, size); in j1939_tp_send()
1998 if (!session) in j1939_tp_send()
2003 session->sk = skb->sk; in j1939_tp_send()
2004 session->transmission = true; in j1939_tp_send()
2005 session->pkt.total = (size + 6) / 7; in j1939_tp_send()
2006 session->pkt.block = skcb->addr.type == J1939_ETP ? 255 : in j1939_tp_send()
2007 min(j1939_tp_block ?: 255, session->pkt.total); in j1939_tp_send()
2009 if (j1939_cb_is_broadcast(&session->skcb)) in j1939_tp_send()
2011 session->pkt.last = session->pkt.total; in j1939_tp_send()
2013 skcb->tskey = atomic_inc_return(&session->sk->sk_tskey) - 1; in j1939_tp_send()
2014 session->tskey = skcb->tskey; in j1939_tp_send()
2016 return session; in j1939_tp_send()
2147 struct j1939_session *session; in j1939_simple_recv() local
2157 session = j1939_session_get_simple(priv, skb); in j1939_simple_recv()
2159 if (!session) { in j1939_simple_recv()
2166 j1939_session_timers_cancel(session); in j1939_simple_recv()
2167 j1939_session_deactivate(session); in j1939_simple_recv()
2168 j1939_session_put(session); in j1939_simple_recv()
2173 struct j1939_session *session, *saved; in j1939_cancel_active_session() local
2177 list_for_each_entry_safe(session, saved, in j1939_cancel_active_session()
2180 if (!sk || sk == session->sk) { in j1939_cancel_active_session()
2181 if (hrtimer_try_to_cancel(&session->txtimer) == 1) in j1939_cancel_active_session()
2182 j1939_session_put(session); in j1939_cancel_active_session()
2183 if (hrtimer_try_to_cancel(&session->rxtimer) == 1) in j1939_cancel_active_session()
2184 j1939_session_put(session); in j1939_cancel_active_session()
2186 session->err = ESHUTDOWN; in j1939_cancel_active_session()
2187 j1939_session_deactivate_locked(session); in j1939_cancel_active_session()