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->err) in j1939_session_destroy()
266 j1939_sk_errqueue(session, J1939_ERRQUEUE_ABORT); in j1939_session_destroy()
268 j1939_sk_errqueue(session, J1939_ERRQUEUE_ACK); in j1939_session_destroy()
270 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_destroy()
272 WARN_ON_ONCE(!list_empty(&session->sk_session_queue_entry)); in j1939_session_destroy()
273 WARN_ON_ONCE(!list_empty(&session->active_session_list_entry)); in j1939_session_destroy()
275 while ((skb = skb_dequeue(&session->skb_queue)) != NULL) { in j1939_session_destroy()
280 __j1939_session_drop(session); in j1939_session_destroy()
281 j1939_priv_put(session->priv); in j1939_session_destroy()
282 kfree(session); in j1939_session_destroy()
287 struct j1939_session *session = container_of(kref, struct j1939_session, in __j1939_session_release() local
290 j1939_session_destroy(session); in __j1939_session_release()
293 void j1939_session_put(struct j1939_session *session) in j1939_session_put() argument
295 kref_put(&session->kref, __j1939_session_release); in j1939_session_put()
298 static void j1939_session_txtimer_cancel(struct j1939_session *session) in j1939_session_txtimer_cancel() argument
300 if (hrtimer_cancel(&session->txtimer)) in j1939_session_txtimer_cancel()
301 j1939_session_put(session); in j1939_session_txtimer_cancel()
304 static void j1939_session_rxtimer_cancel(struct j1939_session *session) in j1939_session_rxtimer_cancel() argument
306 if (hrtimer_cancel(&session->rxtimer)) in j1939_session_rxtimer_cancel()
307 j1939_session_put(session); in j1939_session_rxtimer_cancel()
310 void j1939_session_timers_cancel(struct j1939_session *session) in j1939_session_timers_cancel() argument
312 j1939_session_txtimer_cancel(session); in j1939_session_timers_cancel()
313 j1939_session_rxtimer_cancel(session); in j1939_session_timers_cancel()
321 static void j1939_session_skb_drop_old(struct j1939_session *session) in j1939_session_skb_drop_old() argument
328 if (skb_queue_len(&session->skb_queue) < 2) in j1939_session_skb_drop_old()
331 offset_start = session->pkt.tx_acked * 7; in j1939_session_skb_drop_old()
333 spin_lock_irqsave(&session->skb_queue.lock, flags); in j1939_session_skb_drop_old()
334 do_skb = skb_peek(&session->skb_queue); in j1939_session_skb_drop_old()
338 __skb_unlink(do_skb, &session->skb_queue); in j1939_session_skb_drop_old()
341 spin_unlock_irqrestore(&session->skb_queue.lock, flags); in j1939_session_skb_drop_old()
345 spin_unlock_irqrestore(&session->skb_queue.lock, flags); in j1939_session_skb_drop_old()
349 void j1939_session_skb_queue(struct j1939_session *session, in j1939_session_skb_queue() argument
353 struct j1939_priv *priv = session->priv; in j1939_session_skb_queue()
364 skb_queue_tail(&session->skb_queue, skb); in j1939_session_skb_queue()
368 sk_buff *j1939_session_skb_get_by_offset(struct j1939_session *session, in j1939_session_skb_get_by_offset() argument
371 struct j1939_priv *priv = session->priv; in j1939_session_skb_get_by_offset()
377 spin_lock_irqsave(&session->skb_queue.lock, flags); in j1939_session_skb_get_by_offset()
378 skb_queue_walk(&session->skb_queue, do_skb) { in j1939_session_skb_get_by_offset()
390 spin_unlock_irqrestore(&session->skb_queue.lock, flags); in j1939_session_skb_get_by_offset()
394 __func__, session, offset_start, in j1939_session_skb_get_by_offset()
395 skb_queue_len(&session->skb_queue)); in j1939_session_skb_get_by_offset()
400 static struct sk_buff *j1939_session_skb_get(struct j1939_session *session) in j1939_session_skb_get() argument
404 offset_start = session->pkt.dpo * 7; in j1939_session_skb_get()
405 return j1939_session_skb_get_by_offset(session, offset_start); in j1939_session_skb_get()
514 struct j1939_session *session; in j1939_session_get_by_addr_locked() local
518 list_for_each_entry(session, root, active_session_list_entry) { in j1939_session_get_by_addr_locked()
519 j1939_session_get(session); in j1939_session_get_by_addr_locked()
520 if (j1939_session_match(&session->skcb.addr, addr, reverse) && in j1939_session_get_by_addr_locked()
521 session->transmission == transmitter) in j1939_session_get_by_addr_locked()
522 return session; in j1939_session_get_by_addr_locked()
523 j1939_session_put(session); in j1939_session_get_by_addr_locked()
534 struct j1939_session *session; in j1939_session_get_simple() local
538 list_for_each_entry(session, &priv->active_session_list, in j1939_session_get_simple()
540 j1939_session_get(session); in j1939_session_get_simple()
541 if (session->skcb.addr.type == J1939_SIMPLE && in j1939_session_get_simple()
542 session->tskey == skcb->tskey && session->sk == skb->sk) in j1939_session_get_simple()
543 return session; in j1939_session_get_simple()
544 j1939_session_put(session); in j1939_session_get_simple()
555 struct j1939_session *session; in j1939_session_get_by_addr() local
558 session = j1939_session_get_by_addr_locked(priv, in j1939_session_get_by_addr()
563 return session; in j1939_session_get_by_addr()
624 static int j1939_tp_tx_dat(struct j1939_session *session, in j1939_tp_tx_dat() argument
627 struct j1939_priv *priv = session->priv; in j1939_tp_tx_dat()
630 skb = j1939_tp_tx_dat_new(priv, &session->skcb, in j1939_tp_tx_dat()
665 static inline int j1939_tp_tx_ctl(struct j1939_session *session, in j1939_tp_tx_ctl() argument
668 struct j1939_priv *priv = session->priv; in j1939_tp_tx_ctl()
670 return j1939_xtp_do_tx_ctl(priv, &session->skcb, in j1939_tp_tx_ctl()
672 session->skcb.addr.pgn, dat); in j1939_tp_tx_ctl()
692 void j1939_tp_schedule_txtimer(struct j1939_session *session, int msec) in j1939_tp_schedule_txtimer() argument
694 j1939_session_get(session); in j1939_tp_schedule_txtimer()
695 hrtimer_start(&session->txtimer, ms_to_ktime(msec), in j1939_tp_schedule_txtimer()
699 static inline void j1939_tp_set_rxtimeout(struct j1939_session *session, in j1939_tp_set_rxtimeout() argument
702 j1939_session_rxtimer_cancel(session); in j1939_tp_set_rxtimeout()
703 j1939_session_get(session); in j1939_tp_set_rxtimeout()
704 hrtimer_start(&session->rxtimer, ms_to_ktime(msec), in j1939_tp_set_rxtimeout()
708 static int j1939_session_tx_rts(struct j1939_session *session) in j1939_session_tx_rts() argument
715 dat[1] = (session->total_message_size >> 0); in j1939_session_tx_rts()
716 dat[2] = (session->total_message_size >> 8); in j1939_session_tx_rts()
717 dat[3] = session->pkt.total; in j1939_session_tx_rts()
719 if (session->skcb.addr.type == J1939_ETP) { in j1939_session_tx_rts()
721 dat[1] = (session->total_message_size >> 0); in j1939_session_tx_rts()
722 dat[2] = (session->total_message_size >> 8); in j1939_session_tx_rts()
723 dat[3] = (session->total_message_size >> 16); in j1939_session_tx_rts()
724 dat[4] = (session->total_message_size >> 24); in j1939_session_tx_rts()
725 } else if (j1939_cb_is_broadcast(&session->skcb)) { in j1939_session_tx_rts()
728 session->pkt.tx = 0; in j1939_session_tx_rts()
734 if (dat[0] == session->last_txcmd) in j1939_session_tx_rts()
738 ret = j1939_tp_tx_ctl(session, false, dat); in j1939_session_tx_rts()
742 session->last_txcmd = dat[0]; in j1939_session_tx_rts()
744 j1939_tp_schedule_txtimer(session, 50); in j1939_session_tx_rts()
745 j1939_tp_set_rxtimeout(session, 250); in j1939_session_tx_rts()
747 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_rts()
750 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_tx_rts()
755 static int j1939_session_tx_dpo(struct j1939_session *session) in j1939_session_tx_dpo() argument
764 session->pkt.dpo = session->pkt.tx_acked; in j1939_session_tx_dpo()
765 pkt = session->pkt.dpo; in j1939_session_tx_dpo()
766 dat[1] = session->pkt.last - session->pkt.tx_acked; in j1939_session_tx_dpo()
771 ret = j1939_tp_tx_ctl(session, false, dat); in j1939_session_tx_dpo()
775 session->last_txcmd = dat[0]; in j1939_session_tx_dpo()
776 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_dpo()
777 session->pkt.tx = session->pkt.tx_acked; in j1939_session_tx_dpo()
779 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_tx_dpo()
784 static int j1939_session_tx_dat(struct j1939_session *session) in j1939_session_tx_dat() argument
786 struct j1939_priv *priv = session->priv; in j1939_session_tx_dat()
795 se_skb = j1939_session_skb_get_by_offset(session, session->pkt.tx * 7); in j1939_session_tx_dat()
803 if (session->skcb.addr.type != J1939_ETP && in j1939_session_tx_dat()
804 j1939_cb_is_broadcast(&session->skcb)) in j1939_session_tx_dat()
805 pkt_end = session->pkt.total; in j1939_session_tx_dat()
807 pkt_end = session->pkt.last; in j1939_session_tx_dat()
809 while (session->pkt.tx < pkt_end) { in j1939_session_tx_dat()
810 dat[0] = session->pkt.tx - session->pkt.dpo + 1; in j1939_session_tx_dat()
811 offset = (session->pkt.tx * 7) - skcb->offset; in j1939_session_tx_dat()
819 __func__, session, skcb->offset, se_skb->len , session->pkt.tx); in j1939_session_tx_dat()
830 ret = j1939_tp_tx_dat(session, dat, len + 1); in j1939_session_tx_dat()
836 __func__, session, ret); in j1939_session_tx_dat()
840 session->last_txcmd = 0xff; in j1939_session_tx_dat()
842 session->pkt.tx++; in j1939_session_tx_dat()
843 pdelay = j1939_cb_is_broadcast(&session->skcb) ? 50 : in j1939_session_tx_dat()
846 if (session->pkt.tx < session->pkt.total && pdelay) { in j1939_session_tx_dat()
847 j1939_tp_schedule_txtimer(session, pdelay); in j1939_session_tx_dat()
853 j1939_tp_set_rxtimeout(session, 250); in j1939_session_tx_dat()
864 static int j1939_xtp_txnext_transmiter(struct j1939_session *session) in j1939_xtp_txnext_transmiter() argument
866 struct j1939_priv *priv = session->priv; in j1939_xtp_txnext_transmiter()
869 if (!j1939_tp_im_transmitter(&session->skcb)) { in j1939_xtp_txnext_transmiter()
871 __func__, session); in j1939_xtp_txnext_transmiter()
875 switch (session->last_cmd) { in j1939_xtp_txnext_transmiter()
877 ret = j1939_session_tx_rts(session); in j1939_xtp_txnext_transmiter()
881 if (session->last_txcmd != J1939_ETP_CMD_DPO) { in j1939_xtp_txnext_transmiter()
882 ret = j1939_session_tx_dpo(session); in j1939_xtp_txnext_transmiter()
892 ret = j1939_session_tx_dat(session); in j1939_xtp_txnext_transmiter()
897 __func__, session, session->last_cmd); in j1939_xtp_txnext_transmiter()
903 static int j1939_session_tx_cts(struct j1939_session *session) in j1939_session_tx_cts() argument
905 struct j1939_priv *priv = session->priv; in j1939_session_tx_cts()
910 if (!j1939_sk_recv_match(priv, &session->skcb)) in j1939_session_tx_cts()
913 len = session->pkt.total - session->pkt.rx; in j1939_session_tx_cts()
914 len = min3(len, session->pkt.block, j1939_tp_block ?: 255); in j1939_session_tx_cts()
917 if (session->skcb.addr.type == J1939_ETP) { in j1939_session_tx_cts()
918 pkt = session->pkt.rx + 1; in j1939_session_tx_cts()
927 dat[2] = session->pkt.rx + 1; in j1939_session_tx_cts()
930 if (dat[0] == session->last_txcmd) in j1939_session_tx_cts()
934 ret = j1939_tp_tx_ctl(session, true, dat); in j1939_session_tx_cts()
940 session->last_txcmd = dat[0]; in j1939_session_tx_cts()
941 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_cts()
943 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_session_tx_cts()
948 static int j1939_session_tx_eoma(struct j1939_session *session) in j1939_session_tx_eoma() argument
950 struct j1939_priv *priv = session->priv; in j1939_session_tx_eoma()
954 if (!j1939_sk_recv_match(priv, &session->skcb)) in j1939_session_tx_eoma()
959 if (session->skcb.addr.type == J1939_ETP) { in j1939_session_tx_eoma()
961 dat[1] = session->total_message_size >> 0; in j1939_session_tx_eoma()
962 dat[2] = session->total_message_size >> 8; in j1939_session_tx_eoma()
963 dat[3] = session->total_message_size >> 16; in j1939_session_tx_eoma()
964 dat[4] = session->total_message_size >> 24; in j1939_session_tx_eoma()
967 dat[1] = session->total_message_size; in j1939_session_tx_eoma()
968 dat[2] = session->total_message_size >> 8; in j1939_session_tx_eoma()
969 dat[3] = session->pkt.total; in j1939_session_tx_eoma()
972 if (dat[0] == session->last_txcmd) in j1939_session_tx_eoma()
976 ret = j1939_tp_tx_ctl(session, true, dat); in j1939_session_tx_eoma()
980 session->last_txcmd = dat[0]; in j1939_session_tx_eoma()
983 j1939_tp_set_rxtimeout(session, 1250); in j1939_session_tx_eoma()
985 netdev_dbg(session->priv->ndev, "%p: 0x%p\n", __func__, session); in j1939_session_tx_eoma()
990 static int j1939_xtp_txnext_receiver(struct j1939_session *session) in j1939_xtp_txnext_receiver() argument
992 struct j1939_priv *priv = session->priv; in j1939_xtp_txnext_receiver()
995 if (!j1939_tp_im_receiver(&session->skcb)) { in j1939_xtp_txnext_receiver()
997 __func__, session); in j1939_xtp_txnext_receiver()
1001 switch (session->last_cmd) { in j1939_xtp_txnext_receiver()
1004 ret = j1939_session_tx_cts(session); in j1939_xtp_txnext_receiver()
1011 if ((session->skcb.addr.type == J1939_TP && in j1939_xtp_txnext_receiver()
1012 j1939_cb_is_broadcast(&session->skcb))) in j1939_xtp_txnext_receiver()
1015 if (session->pkt.rx >= session->pkt.total) { in j1939_xtp_txnext_receiver()
1016 ret = j1939_session_tx_eoma(session); in j1939_xtp_txnext_receiver()
1017 } else if (session->pkt.rx >= session->pkt.last) { in j1939_xtp_txnext_receiver()
1018 session->last_txcmd = 0; in j1939_xtp_txnext_receiver()
1019 ret = j1939_session_tx_cts(session); in j1939_xtp_txnext_receiver()
1024 __func__, session, session->last_cmd); in j1939_xtp_txnext_receiver()
1030 static int j1939_simple_txnext(struct j1939_session *session) in j1939_simple_txnext() argument
1032 struct j1939_priv *priv = session->priv; in j1939_simple_txnext()
1033 struct sk_buff *se_skb = j1939_session_skb_get(session); in j1939_simple_txnext()
1048 j1939_tp_set_rxtimeout(session, J1939_SIMPLE_ECHO_TIMEOUT_MS); in j1939_simple_txnext()
1054 j1939_sk_errqueue(session, J1939_ERRQUEUE_SCHED); in j1939_simple_txnext()
1055 j1939_sk_queue_activate_next(session); in j1939_simple_txnext()
1066 static bool j1939_session_deactivate_locked(struct j1939_session *session) in j1939_session_deactivate_locked() argument
1070 lockdep_assert_held(&session->priv->active_session_list_lock); in j1939_session_deactivate_locked()
1072 if (session->state >= J1939_SESSION_ACTIVE && in j1939_session_deactivate_locked()
1073 session->state < J1939_SESSION_ACTIVE_MAX) { in j1939_session_deactivate_locked()
1076 list_del_init(&session->active_session_list_entry); in j1939_session_deactivate_locked()
1077 session->state = J1939_SESSION_DONE; in j1939_session_deactivate_locked()
1078 j1939_session_put(session); in j1939_session_deactivate_locked()
1084 static bool j1939_session_deactivate(struct j1939_session *session) in j1939_session_deactivate() argument
1086 struct j1939_priv *priv = session->priv; in j1939_session_deactivate()
1093 WARN_ON_ONCE(kref_read(&session->kref) < 2); in j1939_session_deactivate()
1094 active = j1939_session_deactivate_locked(session); in j1939_session_deactivate()
1101 j1939_session_deactivate_activate_next(struct j1939_session *session) in j1939_session_deactivate_activate_next() argument
1103 if (j1939_session_deactivate(session)) in j1939_session_deactivate_activate_next()
1104 j1939_sk_queue_activate_next(session); in j1939_session_deactivate_activate_next()
1107 static void __j1939_session_cancel(struct j1939_session *session, in __j1939_session_cancel() argument
1110 struct j1939_priv *priv = session->priv; in __j1939_session_cancel()
1113 lockdep_assert_held(&session->priv->active_session_list_lock); in __j1939_session_cancel()
1115 session->err = j1939_xtp_abort_to_errno(priv, err); in __j1939_session_cancel()
1116 session->state = J1939_SESSION_WAITING_ABORT; in __j1939_session_cancel()
1118 if (!j1939_cb_is_broadcast(&session->skcb)) { in __j1939_session_cancel()
1119 j1939_xtp_tx_abort(priv, &session->skcb, in __j1939_session_cancel()
1120 !session->transmission, in __j1939_session_cancel()
1121 err, session->skcb.addr.pgn); in __j1939_session_cancel()
1124 if (session->sk) in __j1939_session_cancel()
1125 j1939_sk_send_loop_abort(session->sk, session->err); in __j1939_session_cancel()
1128 static void j1939_session_cancel(struct j1939_session *session, in j1939_session_cancel() argument
1131 j1939_session_list_lock(session->priv); in j1939_session_cancel()
1133 if (session->state >= J1939_SESSION_ACTIVE && in j1939_session_cancel()
1134 session->state < J1939_SESSION_WAITING_ABORT) { in j1939_session_cancel()
1135 j1939_tp_set_rxtimeout(session, J1939_XTP_ABORT_TIMEOUT_MS); in j1939_session_cancel()
1136 __j1939_session_cancel(session, err); in j1939_session_cancel()
1139 j1939_session_list_unlock(session->priv); in j1939_session_cancel()
1144 struct j1939_session *session = in j1939_tp_txtimer() local
1146 struct j1939_priv *priv = session->priv; in j1939_tp_txtimer()
1149 if (session->skcb.addr.type == J1939_SIMPLE) { in j1939_tp_txtimer()
1150 ret = j1939_simple_txnext(session); in j1939_tp_txtimer()
1152 if (session->transmission) in j1939_tp_txtimer()
1153 ret = j1939_xtp_txnext_transmiter(session); in j1939_tp_txtimer()
1155 ret = j1939_xtp_txnext_receiver(session); in j1939_tp_txtimer()
1161 if (session->tx_retry < J1939_XTP_TX_RETRY_LIMIT) { in j1939_tp_txtimer()
1162 session->tx_retry++; in j1939_tp_txtimer()
1163 j1939_tp_schedule_txtimer(session, in j1939_tp_txtimer()
1167 __func__, session); in j1939_tp_txtimer()
1168 session->err = -ENETUNREACH; in j1939_tp_txtimer()
1169 j1939_session_rxtimer_cancel(session); in j1939_tp_txtimer()
1170 j1939_session_deactivate_activate_next(session); in j1939_tp_txtimer()
1182 j1939_session_cancel(session, J1939_XTP_ABORT_ECTS_TOO_BIG); in j1939_tp_txtimer()
1185 session->tx_retry = 0; in j1939_tp_txtimer()
1189 __func__, session, ret); in j1939_tp_txtimer()
1190 if (session->skcb.addr.type != J1939_SIMPLE) { in j1939_tp_txtimer()
1191 j1939_session_cancel(session, J1939_XTP_ABORT_OTHER); in j1939_tp_txtimer()
1193 session->err = ret; in j1939_tp_txtimer()
1194 j1939_session_rxtimer_cancel(session); in j1939_tp_txtimer()
1195 j1939_session_deactivate_activate_next(session); in j1939_tp_txtimer()
1199 j1939_session_put(session); in j1939_tp_txtimer()
1204 static void j1939_session_completed(struct j1939_session *session) in j1939_session_completed() argument
1208 if (!session->transmission) { in j1939_session_completed()
1209 skb = j1939_session_skb_get(session); in j1939_session_completed()
1211 j1939_sk_recv(session->priv, skb); in j1939_session_completed()
1215 j1939_session_deactivate_activate_next(session); in j1939_session_completed()
1220 struct j1939_session *session = container_of(hrtimer, in j1939_tp_rxtimer() local
1223 struct j1939_priv *priv = session->priv; in j1939_tp_rxtimer()
1225 if (session->state == J1939_SESSION_WAITING_ABORT) { in j1939_tp_rxtimer()
1227 __func__, session); in j1939_tp_rxtimer()
1229 j1939_session_deactivate_activate_next(session); in j1939_tp_rxtimer()
1231 } else if (session->skcb.addr.type == J1939_SIMPLE) { in j1939_tp_rxtimer()
1233 __func__, session); in j1939_tp_rxtimer()
1238 session->err = -ETIME; in j1939_tp_rxtimer()
1239 j1939_session_deactivate(session); in j1939_tp_rxtimer()
1241 j1939_session_list_lock(session->priv); in j1939_tp_rxtimer()
1242 if (session->state >= J1939_SESSION_ACTIVE && in j1939_tp_rxtimer()
1243 session->state < J1939_SESSION_ACTIVE_MAX) { in j1939_tp_rxtimer()
1245 __func__, session); in j1939_tp_rxtimer()
1246 j1939_session_get(session); in j1939_tp_rxtimer()
1247 hrtimer_start(&session->rxtimer, in j1939_tp_rxtimer()
1250 __j1939_session_cancel(session, J1939_XTP_ABORT_TIMEOUT); in j1939_tp_rxtimer()
1252 j1939_session_list_unlock(session->priv); in j1939_tp_rxtimer()
1255 j1939_session_put(session); in j1939_tp_rxtimer()
1260 static bool j1939_xtp_rx_cmd_bad_pgn(struct j1939_session *session, in j1939_xtp_rx_cmd_bad_pgn() argument
1265 struct j1939_priv *priv = session->priv; in j1939_xtp_rx_cmd_bad_pgn()
1269 if (session->skcb.addr.pgn == pgn) in j1939_xtp_rx_cmd_bad_pgn()
1306 __func__, session, cmd, pgn, session->skcb.addr.pgn); in j1939_xtp_rx_cmd_bad_pgn()
1317 struct j1939_session *session; in j1939_xtp_rx_abort_one() local
1320 session = j1939_session_get_by_addr(priv, &skcb->addr, reverse, in j1939_xtp_rx_abort_one()
1322 if (!session) in j1939_xtp_rx_abort_one()
1325 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_abort_one()
1329 session, j1939_xtp_ctl_to_pgn(skb->data), abort, in j1939_xtp_rx_abort_one()
1332 j1939_session_timers_cancel(session); in j1939_xtp_rx_abort_one()
1333 session->err = j1939_xtp_abort_to_errno(priv, abort); in j1939_xtp_rx_abort_one()
1334 if (session->sk) in j1939_xtp_rx_abort_one()
1335 j1939_sk_send_loop_abort(session->sk, session->err); in j1939_xtp_rx_abort_one()
1336 j1939_session_deactivate_activate_next(session); in j1939_xtp_rx_abort_one()
1339 j1939_session_put(session); in j1939_xtp_rx_abort_one()
1352 j1939_xtp_rx_eoma_one(struct j1939_session *session, struct sk_buff *skb) in j1939_xtp_rx_eoma_one() argument
1358 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_eoma_one()
1368 if (session->total_message_size != len) { in j1939_xtp_rx_eoma_one()
1369 netdev_warn_once(session->priv->ndev, in j1939_xtp_rx_eoma_one()
1371 __func__, session, session->total_message_size, in j1939_xtp_rx_eoma_one()
1375 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_eoma_one()
1377 session->pkt.tx_acked = session->pkt.total; in j1939_xtp_rx_eoma_one()
1378 j1939_session_timers_cancel(session); in j1939_xtp_rx_eoma_one()
1380 j1939_session_completed(session); in j1939_xtp_rx_eoma_one()
1388 struct j1939_session *session; in j1939_xtp_rx_eoma() local
1390 session = j1939_session_get_by_addr(priv, &skcb->addr, true, in j1939_xtp_rx_eoma()
1392 if (!session) in j1939_xtp_rx_eoma()
1395 j1939_xtp_rx_eoma_one(session, skb); in j1939_xtp_rx_eoma()
1396 j1939_session_put(session); in j1939_xtp_rx_eoma()
1400 j1939_xtp_rx_cts_one(struct j1939_session *session, struct sk_buff *skb) in j1939_xtp_rx_cts_one() argument
1408 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_cts_one()
1411 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_cts_one()
1413 if (session->last_cmd == dat[0]) { in j1939_xtp_rx_cts_one()
1418 if (session->skcb.addr.type == J1939_ETP) in j1939_xtp_rx_cts_one()
1425 else if (dat[1] > session->pkt.block /* 0xff for etp */) in j1939_xtp_rx_cts_one()
1429 session->pkt.tx_acked = pkt - 1; in j1939_xtp_rx_cts_one()
1430 j1939_session_skb_drop_old(session); in j1939_xtp_rx_cts_one()
1431 session->pkt.last = session->pkt.tx_acked + dat[1]; in j1939_xtp_rx_cts_one()
1432 if (session->pkt.last > session->pkt.total) in j1939_xtp_rx_cts_one()
1434 session->pkt.last = session->pkt.total; in j1939_xtp_rx_cts_one()
1436 session->pkt.tx = session->pkt.tx_acked; in j1939_xtp_rx_cts_one()
1438 session->last_cmd = dat[0]; in j1939_xtp_rx_cts_one()
1440 j1939_tp_set_rxtimeout(session, 1250); in j1939_xtp_rx_cts_one()
1441 if (session->transmission) { in j1939_xtp_rx_cts_one()
1442 if (session->pkt.tx_acked) in j1939_xtp_rx_cts_one()
1443 j1939_sk_errqueue(session, in j1939_xtp_rx_cts_one()
1445 j1939_session_txtimer_cancel(session); in j1939_xtp_rx_cts_one()
1446 j1939_tp_schedule_txtimer(session, 0); in j1939_xtp_rx_cts_one()
1450 j1939_tp_set_rxtimeout(session, 550); in j1939_xtp_rx_cts_one()
1455 j1939_session_timers_cancel(session); in j1939_xtp_rx_cts_one()
1456 j1939_session_cancel(session, err); in j1939_xtp_rx_cts_one()
1463 struct j1939_session *session; in j1939_xtp_rx_cts() local
1465 session = j1939_session_get_by_addr(priv, &skcb->addr, true, in j1939_xtp_rx_cts()
1467 if (!session) in j1939_xtp_rx_cts()
1469 j1939_xtp_rx_cts_one(session, skb); in j1939_xtp_rx_cts()
1470 j1939_session_put(session); in j1939_xtp_rx_cts()
1476 struct j1939_session *session; in j1939_session_new() local
1479 session = kzalloc(sizeof(*session), gfp_any()); in j1939_session_new()
1480 if (!session) in j1939_session_new()
1483 INIT_LIST_HEAD(&session->active_session_list_entry); in j1939_session_new()
1484 INIT_LIST_HEAD(&session->sk_session_queue_entry); in j1939_session_new()
1485 kref_init(&session->kref); in j1939_session_new()
1488 session->priv = priv; in j1939_session_new()
1489 session->total_message_size = size; in j1939_session_new()
1490 session->state = J1939_SESSION_NEW; in j1939_session_new()
1492 skb_queue_head_init(&session->skb_queue); in j1939_session_new()
1493 skb_queue_tail(&session->skb_queue, skb); in j1939_session_new()
1496 memcpy(&session->skcb, skcb, sizeof(session->skcb)); in j1939_session_new()
1498 hrtimer_init(&session->txtimer, CLOCK_MONOTONIC, in j1939_session_new()
1500 session->txtimer.function = j1939_tp_txtimer; in j1939_session_new()
1501 hrtimer_init(&session->rxtimer, CLOCK_MONOTONIC, in j1939_session_new()
1503 session->rxtimer.function = j1939_tp_rxtimer; in j1939_session_new()
1506 __func__, session, skcb->addr.sa, skcb->addr.da); in j1939_session_new()
1508 return session; in j1939_session_new()
1518 struct j1939_session *session; in j1939_session_fresh_new() local
1531 session = j1939_session_new(priv, skb, size); in j1939_session_fresh_new()
1532 if (!session) { in j1939_session_fresh_new()
1540 return session; in j1939_session_fresh_new()
1543 int j1939_session_activate(struct j1939_session *session) in j1939_session_activate() argument
1545 struct j1939_priv *priv = session->priv; in j1939_session_activate()
1550 if (session->skcb.addr.type != J1939_SIMPLE) in j1939_session_activate()
1553 &session->skcb.addr, false, in j1939_session_activate()
1554 session->transmission); in j1939_session_activate()
1559 WARN_ON_ONCE(session->state != J1939_SESSION_NEW); in j1939_session_activate()
1560 list_add_tail(&session->active_session_list_entry, in j1939_session_activate()
1562 j1939_session_get(session); in j1939_session_activate()
1563 session->state = J1939_SESSION_ACTIVE; in j1939_session_activate()
1565 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", in j1939_session_activate()
1566 __func__, session); in j1939_session_activate()
1579 struct j1939_session *session; in j1939_xtp_rx_rts_session_new() local
1616 session = j1939_session_fresh_new(priv, len, &skcb); in j1939_xtp_rx_rts_session_new()
1617 if (!session) { in j1939_xtp_rx_rts_session_new()
1624 session->pkt.total = (len + 6) / 7; in j1939_xtp_rx_rts_session_new()
1625 session->pkt.block = 0xff; in j1939_xtp_rx_rts_session_new()
1627 if (dat[3] != session->pkt.total) in j1939_xtp_rx_rts_session_new()
1629 __func__, session, session->pkt.total, in j1939_xtp_rx_rts_session_new()
1631 session->pkt.total = dat[3]; in j1939_xtp_rx_rts_session_new()
1632 session->pkt.block = min(dat[3], dat[4]); in j1939_xtp_rx_rts_session_new()
1635 session->pkt.rx = 0; in j1939_xtp_rx_rts_session_new()
1636 session->pkt.tx = 0; in j1939_xtp_rx_rts_session_new()
1638 WARN_ON_ONCE(j1939_session_activate(session)); in j1939_xtp_rx_rts_session_new()
1640 return session; in j1939_xtp_rx_rts_session_new()
1643 static int j1939_xtp_rx_rts_session_active(struct j1939_session *session, in j1939_xtp_rx_rts_session_active() argument
1647 struct j1939_priv *priv = session->priv; in j1939_xtp_rx_rts_session_active()
1649 if (!session->transmission) { in j1939_xtp_rx_rts_session_active()
1650 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_rts_session_active()
1654 j1939_session_timers_cancel(session); in j1939_xtp_rx_rts_session_active()
1655 j1939_session_cancel(session, J1939_XTP_ABORT_BUSY); in j1939_xtp_rx_rts_session_active()
1658 if (session->last_cmd != 0) { in j1939_xtp_rx_rts_session_active()
1661 __func__, session, skcb->addr.sa, skcb->addr.da, in j1939_xtp_rx_rts_session_active()
1662 session->last_cmd); in j1939_xtp_rx_rts_session_active()
1664 j1939_session_timers_cancel(session); in j1939_xtp_rx_rts_session_active()
1665 j1939_session_cancel(session, J1939_XTP_ABORT_BUSY); in j1939_xtp_rx_rts_session_active()
1670 if (session->skcb.addr.sa != skcb->addr.sa || in j1939_xtp_rx_rts_session_active()
1671 session->skcb.addr.da != skcb->addr.da) in j1939_xtp_rx_rts_session_active()
1673 __func__, session, in j1939_xtp_rx_rts_session_active()
1674 session->skcb.addr.sa, skcb->addr.sa, in j1939_xtp_rx_rts_session_active()
1675 session->skcb.addr.da, skcb->addr.da); in j1939_xtp_rx_rts_session_active()
1680 session->skcb.addr.sa = skcb->addr.sa; in j1939_xtp_rx_rts_session_active()
1681 session->skcb.addr.da = skcb->addr.da; in j1939_xtp_rx_rts_session_active()
1683 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_rts_session_active()
1692 struct j1939_session *session; in j1939_xtp_rx_rts() local
1695 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_rts()
1698 if (!session) { in j1939_xtp_rx_rts()
1717 session = j1939_xtp_rx_rts_session_new(priv, skb); in j1939_xtp_rx_rts()
1718 if (!session) { in j1939_xtp_rx_rts()
1725 if (j1939_xtp_rx_rts_session_active(session, skb)) { in j1939_xtp_rx_rts()
1726 j1939_session_put(session); in j1939_xtp_rx_rts()
1730 session->last_cmd = cmd; in j1939_xtp_rx_rts()
1733 if (!session->transmission) in j1939_xtp_rx_rts()
1734 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_rts()
1736 if (!session->transmission) { in j1939_xtp_rx_rts()
1737 j1939_session_txtimer_cancel(session); in j1939_xtp_rx_rts()
1738 j1939_tp_schedule_txtimer(session, 0); in j1939_xtp_rx_rts()
1740 j1939_tp_set_rxtimeout(session, 1250); in j1939_xtp_rx_rts()
1743 j1939_session_put(session); in j1939_xtp_rx_rts()
1746 static void j1939_xtp_rx_dpo_one(struct j1939_session *session, in j1939_xtp_rx_dpo_one() argument
1751 if (j1939_xtp_rx_cmd_bad_pgn(session, skb)) in j1939_xtp_rx_dpo_one()
1754 netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); in j1939_xtp_rx_dpo_one()
1757 session->pkt.dpo = j1939_etp_ctl_to_packet(skb->data); in j1939_xtp_rx_dpo_one()
1758 session->last_cmd = dat[0]; in j1939_xtp_rx_dpo_one()
1759 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_dpo_one()
1766 struct j1939_session *session; in j1939_xtp_rx_dpo() local
1768 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dpo()
1770 if (!session) { in j1939_xtp_rx_dpo()
1776 j1939_xtp_rx_dpo_one(session, skb); in j1939_xtp_rx_dpo()
1777 j1939_session_put(session); in j1939_xtp_rx_dpo()
1780 static void j1939_xtp_rx_dat_one(struct j1939_session *session, in j1939_xtp_rx_dat_one() argument
1784 struct j1939_priv *priv = session->priv; in j1939_xtp_rx_dat_one()
1804 switch (session->last_cmd) { in j1939_xtp_rx_dat_one()
1818 session, session->last_cmd); in j1939_xtp_rx_dat_one()
1822 packet = (dat[0] - 1 + session->pkt.dpo); in j1939_xtp_rx_dat_one()
1823 if (packet > session->pkt.total || in j1939_xtp_rx_dat_one()
1824 (session->pkt.rx + 1) > session->pkt.total) { in j1939_xtp_rx_dat_one()
1826 __func__, session); in j1939_xtp_rx_dat_one()
1830 se_skb = j1939_session_skb_get_by_offset(session, packet * 7); in j1939_xtp_rx_dat_one()
1833 session); in j1939_xtp_rx_dat_one()
1844 __func__, session, nbytes, skb->len); in j1939_xtp_rx_dat_one()
1849 if (!session->transmission) { in j1939_xtp_rx_dat_one()
1858 __func__, session, in j1939_xtp_rx_dat_one()
1863 if (packet == session->pkt.rx) in j1939_xtp_rx_dat_one()
1864 session->pkt.rx++; in j1939_xtp_rx_dat_one()
1867 j1939_cb_is_broadcast(&session->skcb)) { in j1939_xtp_rx_dat_one()
1868 if (session->pkt.rx >= session->pkt.total) in j1939_xtp_rx_dat_one()
1874 if (session->pkt.rx >= session->pkt.last) in j1939_xtp_rx_dat_one()
1879 j1939_session_timers_cancel(session); in j1939_xtp_rx_dat_one()
1880 j1939_session_completed(session); in j1939_xtp_rx_dat_one()
1882 if (!session->transmission) in j1939_xtp_rx_dat_one()
1883 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_dat_one()
1885 j1939_tp_set_rxtimeout(session, 1250); in j1939_xtp_rx_dat_one()
1886 if (!session->transmission) in j1939_xtp_rx_dat_one()
1887 j1939_tp_schedule_txtimer(session, 0); in j1939_xtp_rx_dat_one()
1889 j1939_tp_set_rxtimeout(session, 750); in j1939_xtp_rx_dat_one()
1891 session->last_cmd = 0xff; in j1939_xtp_rx_dat_one()
1893 j1939_session_put(session); in j1939_xtp_rx_dat_one()
1899 j1939_session_timers_cancel(session); in j1939_xtp_rx_dat_one()
1900 j1939_session_cancel(session, abort); in j1939_xtp_rx_dat_one()
1901 j1939_session_put(session); in j1939_xtp_rx_dat_one()
1907 struct j1939_session *session; in j1939_xtp_rx_dat() local
1912 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dat()
1914 if (!session) in j1939_xtp_rx_dat()
1918 j1939_xtp_rx_dat_one(session, skb); in j1939_xtp_rx_dat()
1922 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dat()
1924 if (!session) in j1939_xtp_rx_dat()
1928 j1939_xtp_rx_dat_one(session, skb); in j1939_xtp_rx_dat()
1932 session = j1939_session_get_by_addr(priv, &skcb->addr, false, in j1939_xtp_rx_dat()
1934 if (session) in j1939_xtp_rx_dat()
1935 j1939_xtp_rx_dat_one(session, skb); in j1939_xtp_rx_dat()
1944 struct j1939_session *session; in j1939_tp_send() local
1982 session = j1939_session_new(priv, skb, size); in j1939_tp_send()
1983 if (!session) in j1939_tp_send()
1988 session->sk = skb->sk; in j1939_tp_send()
1989 session->transmission = true; in j1939_tp_send()
1990 session->pkt.total = (size + 6) / 7; in j1939_tp_send()
1991 session->pkt.block = skcb->addr.type == J1939_ETP ? 255 : in j1939_tp_send()
1992 min(j1939_tp_block ?: 255, session->pkt.total); in j1939_tp_send()
1994 if (j1939_cb_is_broadcast(&session->skcb)) in j1939_tp_send()
1996 session->pkt.last = session->pkt.total; in j1939_tp_send()
1998 skcb->tskey = session->sk->sk_tskey++; in j1939_tp_send()
1999 session->tskey = skcb->tskey; in j1939_tp_send()
2001 return session; in j1939_tp_send()
2132 struct j1939_session *session; in j1939_simple_recv() local
2142 session = j1939_session_get_simple(priv, skb); in j1939_simple_recv()
2144 if (!session) { in j1939_simple_recv()
2151 j1939_session_timers_cancel(session); in j1939_simple_recv()
2152 j1939_session_deactivate(session); in j1939_simple_recv()
2153 j1939_session_put(session); in j1939_simple_recv()
2158 struct j1939_session *session, *saved; in j1939_cancel_active_session() local
2162 list_for_each_entry_safe(session, saved, in j1939_cancel_active_session()
2165 if (!sk || sk == session->sk) { in j1939_cancel_active_session()
2166 if (hrtimer_try_to_cancel(&session->txtimer) == 1) in j1939_cancel_active_session()
2167 j1939_session_put(session); in j1939_cancel_active_session()
2168 if (hrtimer_try_to_cancel(&session->rxtimer) == 1) in j1939_cancel_active_session()
2169 j1939_session_put(session); in j1939_cancel_active_session()
2171 session->err = ESHUTDOWN; in j1939_cancel_active_session()
2172 j1939_session_deactivate_locked(session); in j1939_cancel_active_session()