Lines Matching full:call
31 struct rxrpc_call *call, rxrpc_seq_t seq) in rxrpc_proto_abort() argument
33 if (rxrpc_abort_call(why, call, seq, RX_PROTOCOL_ERROR, -EBADMSG)) { in rxrpc_proto_abort()
34 set_bit(RXRPC_CALL_EV_ABORT, &call->events); in rxrpc_proto_abort()
35 rxrpc_queue_call(call); in rxrpc_proto_abort()
42 static void rxrpc_congestion_management(struct rxrpc_call *call, in rxrpc_congestion_management() argument
48 unsigned int cumulative_acks = call->cong_cumul_acks; in rxrpc_congestion_management()
49 unsigned int cwnd = call->cong_cwnd; in rxrpc_congestion_management()
53 (call->tx_top - call->tx_hard_ack) - summary->nr_acks; in rxrpc_congestion_management()
55 if (test_and_clear_bit(RXRPC_CALL_RETRANS_TIMEOUT, &call->flags)) { in rxrpc_congestion_management()
57 call->cong_ssthresh = max_t(unsigned int, in rxrpc_congestion_management()
60 if (cwnd >= call->cong_ssthresh && in rxrpc_congestion_management()
61 call->cong_mode == RXRPC_CALL_SLOW_START) { in rxrpc_congestion_management()
62 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_congestion_management()
63 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
73 summary->mode = call->cong_mode; in rxrpc_congestion_management()
74 summary->cwnd = call->cong_cwnd; in rxrpc_congestion_management()
75 summary->ssthresh = call->cong_ssthresh; in rxrpc_congestion_management()
77 summary->dup_acks = call->cong_dup_acks; in rxrpc_congestion_management()
79 switch (call->cong_mode) { in rxrpc_congestion_management()
85 if (cwnd >= call->cong_ssthresh) { in rxrpc_congestion_management()
86 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_congestion_management()
87 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
98 if (call->peer->rtt_usage == 0) in rxrpc_congestion_management()
101 ktime_add_ns(call->cong_tstamp, in rxrpc_congestion_management()
102 call->peer->rtt))) in rxrpc_congestion_management()
105 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
116 call->cong_dup_acks = 1; in rxrpc_congestion_management()
117 if (call->cong_extra > 1) in rxrpc_congestion_management()
118 call->cong_extra = 1; in rxrpc_congestion_management()
122 call->cong_dup_acks++; in rxrpc_congestion_management()
123 if (call->cong_dup_acks < 3) in rxrpc_congestion_management()
127 call->cong_mode = RXRPC_CALL_FAST_RETRANSMIT; in rxrpc_congestion_management()
128 call->cong_ssthresh = max_t(unsigned int, in rxrpc_congestion_management()
130 cwnd = call->cong_ssthresh + 3; in rxrpc_congestion_management()
131 call->cong_extra = 0; in rxrpc_congestion_management()
132 call->cong_dup_acks = 0; in rxrpc_congestion_management()
140 call->cong_dup_acks++; in rxrpc_congestion_management()
141 if (call->cong_dup_acks == 2) { in rxrpc_congestion_management()
143 call->cong_dup_acks = 0; in rxrpc_congestion_management()
148 cwnd = call->cong_ssthresh; in rxrpc_congestion_management()
161 call->cong_dup_acks = 0; in rxrpc_congestion_management()
162 call->cong_extra = 0; in rxrpc_congestion_management()
163 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
164 if (cwnd < call->cong_ssthresh) in rxrpc_congestion_management()
165 call->cong_mode = RXRPC_CALL_SLOW_START; in rxrpc_congestion_management()
167 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_congestion_management()
173 call->cong_cwnd = cwnd; in rxrpc_congestion_management()
174 call->cong_cumul_acks = cumulative_acks; in rxrpc_congestion_management()
175 trace_rxrpc_congest(call, summary, acked_serial, change); in rxrpc_congestion_management()
176 if (resend && !test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events)) in rxrpc_congestion_management()
177 rxrpc_queue_call(call); in rxrpc_congestion_management()
182 call->cong_mode = RXRPC_CALL_PACKET_LOSS; in rxrpc_congestion_management()
183 call->cong_dup_acks = 0; in rxrpc_congestion_management()
190 if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] & in rxrpc_congestion_management()
192 summary->nr_acks != call->tx_top - call->tx_hard_ack) { in rxrpc_congestion_management()
193 call->cong_extra++; in rxrpc_congestion_management()
194 wake_up(&call->waitq); in rxrpc_congestion_management()
203 static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb, in rxrpc_send_ping() argument
209 if (call->peer->rtt_usage < 3 || in rxrpc_send_ping()
210 ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), now)) in rxrpc_send_ping()
211 rxrpc_propose_ACK(call, RXRPC_ACK_PING, skew, sp->hdr.serial, in rxrpc_send_ping()
219 static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, in rxrpc_rotate_tx_window() argument
227 if (call->acks_lowest_nak == call->tx_hard_ack) { in rxrpc_rotate_tx_window()
228 call->acks_lowest_nak = to; in rxrpc_rotate_tx_window()
229 } else if (before_eq(call->acks_lowest_nak, to)) { in rxrpc_rotate_tx_window()
231 call->acks_lowest_nak = to; in rxrpc_rotate_tx_window()
234 spin_lock(&call->lock); in rxrpc_rotate_tx_window()
236 while (before(call->tx_hard_ack, to)) { in rxrpc_rotate_tx_window()
237 call->tx_hard_ack++; in rxrpc_rotate_tx_window()
238 ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK; in rxrpc_rotate_tx_window()
239 skb = call->rxtx_buffer[ix]; in rxrpc_rotate_tx_window()
240 annotation = call->rxtx_annotations[ix]; in rxrpc_rotate_tx_window()
242 call->rxtx_buffer[ix] = NULL; in rxrpc_rotate_tx_window()
243 call->rxtx_annotations[ix] = 0; in rxrpc_rotate_tx_window()
248 set_bit(RXRPC_CALL_TX_LAST, &call->flags); in rxrpc_rotate_tx_window()
255 spin_unlock(&call->lock); in rxrpc_rotate_tx_window()
257 trace_rxrpc_transmit(call, (rot_last ? in rxrpc_rotate_tx_window()
260 wake_up(&call->waitq); in rxrpc_rotate_tx_window()
273 * End the transmission phase of a call.
278 static bool rxrpc_end_tx_phase(struct rxrpc_call *call, bool reply_begun, in rxrpc_end_tx_phase() argument
283 ASSERT(test_bit(RXRPC_CALL_TX_LAST, &call->flags)); in rxrpc_end_tx_phase()
285 write_lock(&call->state_lock); in rxrpc_end_tx_phase()
287 state = call->state; in rxrpc_end_tx_phase()
292 call->state = state = RXRPC_CALL_CLIENT_RECV_REPLY; in rxrpc_end_tx_phase()
294 call->state = state = RXRPC_CALL_CLIENT_AWAIT_REPLY; in rxrpc_end_tx_phase()
298 __rxrpc_call_completed(call); in rxrpc_end_tx_phase()
299 rxrpc_notify_socket(call); in rxrpc_end_tx_phase()
300 state = call->state; in rxrpc_end_tx_phase()
307 write_unlock(&call->state_lock); in rxrpc_end_tx_phase()
309 trace_rxrpc_transmit(call, rxrpc_transmit_await_reply); in rxrpc_end_tx_phase()
311 trace_rxrpc_transmit(call, rxrpc_transmit_end); in rxrpc_end_tx_phase()
316 write_unlock(&call->state_lock); in rxrpc_end_tx_phase()
317 kdebug("end_tx %s", rxrpc_call_states[call->state]); in rxrpc_end_tx_phase()
318 rxrpc_proto_abort(abort_why, call, call->tx_top); in rxrpc_end_tx_phase()
323 * Begin the reply reception phase of a call.
325 static bool rxrpc_receiving_reply(struct rxrpc_call *call) in rxrpc_receiving_reply() argument
329 rxrpc_seq_t top = READ_ONCE(call->tx_top); in rxrpc_receiving_reply()
331 if (call->ackr_reason) { in rxrpc_receiving_reply()
332 spin_lock_bh(&call->lock); in rxrpc_receiving_reply()
333 call->ackr_reason = 0; in rxrpc_receiving_reply()
334 spin_unlock_bh(&call->lock); in rxrpc_receiving_reply()
337 WRITE_ONCE(call->resend_at, timo); in rxrpc_receiving_reply()
338 WRITE_ONCE(call->ack_at, timo); in rxrpc_receiving_reply()
339 trace_rxrpc_timer(call, rxrpc_timer_init_for_reply, now); in rxrpc_receiving_reply()
342 if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags)) { in rxrpc_receiving_reply()
343 if (!rxrpc_rotate_tx_window(call, top, &summary)) { in rxrpc_receiving_reply()
344 rxrpc_proto_abort("TXL", call, top); in rxrpc_receiving_reply()
348 if (!rxrpc_end_tx_phase(call, true, "ETD")) in rxrpc_receiving_reply()
350 call->tx_phase = false; in rxrpc_receiving_reply()
400 * space until the call times out.
403 * call. After that, we tell the other side we're no longer accepting jumbos
406 static void rxrpc_input_dup_data(struct rxrpc_call *call, rxrpc_seq_t seq, in rxrpc_input_dup_data() argument
415 * jumbos for this call. in rxrpc_input_dup_data()
418 call->nr_jumbo_bad++; in rxrpc_input_dup_data()
426 static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb, in rxrpc_input_data() argument
440 call->rx_hard_ack, call->rx_top, skb->len, seq); in rxrpc_input_data()
445 state = READ_ONCE(call->state); in rxrpc_input_data()
449 if (call->state == RXRPC_CALL_SERVER_RECV_REQUEST) { in rxrpc_input_data()
450 unsigned long timo = READ_ONCE(call->next_req_timo); in rxrpc_input_data()
456 WRITE_ONCE(call->expect_req_by, expect_req_by); in rxrpc_input_data()
457 rxrpc_reduce_call_timer(call, expect_req_by, now, in rxrpc_input_data()
462 spin_lock(&call->input_lock); in rxrpc_input_data()
469 !rxrpc_receiving_reply(call)) in rxrpc_input_data()
472 call->ackr_prev_seq = seq; in rxrpc_input_data()
474 hard_ack = READ_ONCE(call->rx_hard_ack); in rxrpc_input_data()
475 if (after(seq, hard_ack + call->rx_winsize)) { in rxrpc_input_data()
483 if (call->nr_jumbo_bad > 3) { in rxrpc_input_data()
499 if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && in rxrpc_input_data()
500 seq != call->rx_top) { in rxrpc_input_data()
501 rxrpc_proto_abort("LSN", call, seq); in rxrpc_input_data()
505 if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && in rxrpc_input_data()
506 after_eq(seq, call->rx_top)) { in rxrpc_input_data()
507 rxrpc_proto_abort("LSA", call, seq); in rxrpc_input_data()
512 trace_rxrpc_rx_data(call->debug_id, seq, serial, flags, annotation); in rxrpc_input_data()
524 if (call->rxtx_buffer[ix]) { in rxrpc_input_data()
525 rxrpc_input_dup_data(call, seq, annotation, &jumbo_bad); in rxrpc_input_data()
543 call->rxtx_annotations[ix] = annotation; in rxrpc_input_data()
545 call->rxtx_buffer[ix] = skb; in rxrpc_input_data()
546 if (after(seq, call->rx_top)) { in rxrpc_input_data()
547 smp_store_release(&call->rx_top, seq); in rxrpc_input_data()
548 } else if (before(seq, call->rx_top)) { in rxrpc_input_data()
557 set_bit(RXRPC_CALL_RX_LAST, &call->flags); in rxrpc_input_data()
558 trace_rxrpc_receive(call, rxrpc_receive_queue_last, serial, seq); in rxrpc_input_data()
560 trace_rxrpc_receive(call, rxrpc_receive_queue, serial, seq); in rxrpc_input_data()
564 if (after_eq(seq, call->rx_expect_next)) { in rxrpc_input_data()
565 if (after(seq, call->rx_expect_next)) { in rxrpc_input_data()
566 _net("OOS %u > %u", seq, call->rx_expect_next); in rxrpc_input_data()
570 call->rx_expect_next = seq + 1; in rxrpc_input_data()
577 rxrpc_proto_abort("XJF", call, seq); in rxrpc_input_data()
586 if (after(seq, hard_ack + call->rx_winsize)) { in rxrpc_input_data()
590 call->nr_jumbo_bad++; in rxrpc_input_data()
607 rxrpc_propose_ACK(call, ack, skew, ack_serial, in rxrpc_input_data()
611 rxrpc_propose_ACK(call, RXRPC_ACK_DELAY, skew, serial, in rxrpc_input_data()
615 trace_rxrpc_notify_socket(call->debug_id, serial); in rxrpc_input_data()
616 rxrpc_notify_socket(call); in rxrpc_input_data()
619 spin_unlock(&call->input_lock); in rxrpc_input_data()
626 static void rxrpc_input_requested_ack(struct rxrpc_call *call, in rxrpc_input_requested_ack() argument
637 skb = call->rxtx_buffer[ix]; in rxrpc_input_requested_ack()
652 rxrpc_peer_add_rtt(call, rxrpc_rtt_rx_requested_ack, in rxrpc_input_requested_ack()
663 static void rxrpc_input_check_for_lost_ack(struct rxrpc_call *call) in rxrpc_input_check_for_lost_ack() argument
668 spin_lock_bh(&call->lock); in rxrpc_input_check_for_lost_ack()
670 bottom = call->tx_hard_ack + 1; in rxrpc_input_check_for_lost_ack()
671 top = call->acks_lost_top; in rxrpc_input_check_for_lost_ack()
675 u8 annotation = call->rxtx_annotations[ix]; in rxrpc_input_check_for_lost_ack()
682 call->rxtx_annotations[ix] = annotation; in rxrpc_input_check_for_lost_ack()
687 spin_unlock_bh(&call->lock); in rxrpc_input_check_for_lost_ack()
689 if (resend && !test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events)) in rxrpc_input_check_for_lost_ack()
690 rxrpc_queue_call(call); in rxrpc_input_check_for_lost_ack()
696 static void rxrpc_input_ping_response(struct rxrpc_call *call, in rxrpc_input_ping_response() argument
704 ping_time = call->ping_time; in rxrpc_input_ping_response()
706 ping_serial = READ_ONCE(call->ping_serial); in rxrpc_input_ping_response()
708 if (orig_serial == call->acks_lost_ping) in rxrpc_input_ping_response()
709 rxrpc_input_check_for_lost_ack(call); in rxrpc_input_ping_response()
712 !test_and_clear_bit(RXRPC_CALL_PINGING, &call->flags)) in rxrpc_input_ping_response()
717 rxrpc_peer_add_rtt(call, rxrpc_rtt_rx_ping_response, in rxrpc_input_ping_response()
724 static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, in rxrpc_input_ackinfo() argument
740 if (call->tx_winsize != rwind) { in rxrpc_input_ackinfo()
741 if (rwind > call->tx_winsize) in rxrpc_input_ackinfo()
743 trace_rxrpc_rx_rwind_change(call, sp->hdr.serial, rwind, wake); in rxrpc_input_ackinfo()
744 call->tx_winsize = rwind; in rxrpc_input_ackinfo()
747 if (call->cong_ssthresh > rwind) in rxrpc_input_ackinfo()
748 call->cong_ssthresh = rwind; in rxrpc_input_ackinfo()
752 peer = call->peer; in rxrpc_input_ackinfo()
762 wake_up(&call->waitq); in rxrpc_input_ackinfo()
774 static void rxrpc_input_soft_acks(struct rxrpc_call *call, u8 *acks, in rxrpc_input_soft_acks() argument
783 annotation = call->rxtx_annotations[ix]; in rxrpc_input_soft_acks()
792 call->rxtx_annotations[ix] = in rxrpc_input_soft_acks()
797 call->acks_lowest_nak != seq) { in rxrpc_input_soft_acks()
798 call->acks_lowest_nak = seq; in rxrpc_input_soft_acks()
807 call->rxtx_annotations[ix] = in rxrpc_input_soft_acks()
811 return rxrpc_proto_abort("SFT", call, 0); in rxrpc_input_soft_acks()
820 static bool rxrpc_is_ack_valid(struct rxrpc_call *call, in rxrpc_is_ack_valid() argument
823 rxrpc_seq_t base = READ_ONCE(call->ackr_first_seq); in rxrpc_is_ack_valid()
831 if (after_eq(prev_pkt, call->ackr_prev_seq)) in rxrpc_is_ack_valid()
835 if (after_eq(prev_pkt, base + call->tx_winsize)) in rxrpc_is_ack_valid()
850 static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, in rxrpc_input_ack() argument
869 return rxrpc_proto_abort("XAK", call, 0); in rxrpc_input_ack()
881 trace_rxrpc_rx_ack(call, sp->hdr.serial, acked_serial, in rxrpc_input_ack()
886 rxrpc_input_ping_response(call, skb->tstamp, acked_serial, in rxrpc_input_ack()
889 rxrpc_input_requested_ack(call, skb->tstamp, acked_serial, in rxrpc_input_ack()
894 rxrpc_propose_ACK(call, RXRPC_ACK_PING_RESPONSE, in rxrpc_input_ack()
898 rxrpc_propose_ACK(call, RXRPC_ACK_REQUESTED, in rxrpc_input_ack()
904 if (!rxrpc_is_ack_valid(call, first_soft_ack, prev_pkt)) { in rxrpc_input_ack()
905 trace_rxrpc_rx_discard_ack(call->debug_id, sp->hdr.serial, in rxrpc_input_ack()
906 first_soft_ack, call->ackr_first_seq, in rxrpc_input_ack()
907 prev_pkt, call->ackr_prev_seq); in rxrpc_input_ack()
915 return rxrpc_proto_abort("XAI", call, 0); in rxrpc_input_ack()
917 spin_lock(&call->input_lock); in rxrpc_input_ack()
920 if (!rxrpc_is_ack_valid(call, first_soft_ack, prev_pkt)) { in rxrpc_input_ack()
921 trace_rxrpc_rx_discard_ack(call->debug_id, sp->hdr.serial, in rxrpc_input_ack()
922 first_soft_ack, call->ackr_first_seq, in rxrpc_input_ack()
923 prev_pkt, call->ackr_prev_seq); in rxrpc_input_ack()
926 call->acks_latest_ts = skb->tstamp; in rxrpc_input_ack()
927 call->acks_latest = sp->hdr.serial; in rxrpc_input_ack()
929 call->ackr_first_seq = first_soft_ack; in rxrpc_input_ack()
930 call->ackr_prev_seq = prev_pkt; in rxrpc_input_ack()
934 rxrpc_input_ackinfo(call, skb, &buf.info); in rxrpc_input_ack()
937 rxrpc_proto_abort("AK0", call, 0); in rxrpc_input_ack()
942 switch (READ_ONCE(call->state)) { in rxrpc_input_ack()
952 if (before(hard_ack, call->tx_hard_ack) || in rxrpc_input_ack()
953 after(hard_ack, call->tx_top)) { in rxrpc_input_ack()
954 rxrpc_proto_abort("AKW", call, 0); in rxrpc_input_ack()
957 if (nr_acks > call->tx_top - hard_ack) { in rxrpc_input_ack()
958 rxrpc_proto_abort("AKN", call, 0); in rxrpc_input_ack()
962 if (after(hard_ack, call->tx_hard_ack)) { in rxrpc_input_ack()
963 if (rxrpc_rotate_tx_window(call, hard_ack, &summary)) { in rxrpc_input_ack()
964 rxrpc_end_tx_phase(call, false, "ETA"); in rxrpc_input_ack()
971 rxrpc_proto_abort("XSA", call, 0); in rxrpc_input_ack()
974 rxrpc_input_soft_acks(call, buf.acks, first_soft_ack, nr_acks, in rxrpc_input_ack()
978 if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] & in rxrpc_input_ack()
980 summary.nr_acks == call->tx_top - hard_ack && in rxrpc_input_ack()
981 rxrpc_is_client_call(call)) in rxrpc_input_ack()
982 rxrpc_propose_ACK(call, RXRPC_ACK_PING, skew, sp->hdr.serial, in rxrpc_input_ack()
986 rxrpc_congestion_management(call, skb, &summary, acked_serial); in rxrpc_input_ack()
988 spin_unlock(&call->input_lock); in rxrpc_input_ack()
994 static void rxrpc_input_ackall(struct rxrpc_call *call, struct sk_buff *skb) in rxrpc_input_ackall() argument
1001 spin_lock(&call->input_lock); in rxrpc_input_ackall()
1003 if (rxrpc_rotate_tx_window(call, call->tx_top, &summary)) in rxrpc_input_ackall()
1004 rxrpc_end_tx_phase(call, false, "ETL"); in rxrpc_input_ackall()
1006 spin_unlock(&call->input_lock); in rxrpc_input_ackall()
1010 * Process an ABORT packet directed at a call.
1012 static void rxrpc_input_abort(struct rxrpc_call *call, struct sk_buff *skb) in rxrpc_input_abort() argument
1025 trace_rxrpc_rx_abort(call, sp->hdr.serial, abort_code); in rxrpc_input_abort()
1029 if (rxrpc_set_call_completion(call, RXRPC_CALL_REMOTELY_ABORTED, in rxrpc_input_abort()
1031 rxrpc_notify_socket(call); in rxrpc_input_abort()
1035 * Process an incoming call packet.
1037 static void rxrpc_input_call_packet(struct rxrpc_call *call, in rxrpc_input_call_packet() argument
1043 _enter("%p,%p", call, skb); in rxrpc_input_call_packet()
1045 timo = READ_ONCE(call->next_rx_timo); in rxrpc_input_call_packet()
1050 WRITE_ONCE(call->expect_rx_by, expect_rx_by); in rxrpc_input_call_packet()
1051 rxrpc_reduce_call_timer(call, expect_rx_by, now, in rxrpc_input_call_packet()
1057 rxrpc_input_data(call, skb, skew); in rxrpc_input_call_packet()
1061 rxrpc_input_ack(call, skb, skew); in rxrpc_input_call_packet()
1074 rxrpc_input_abort(call, skb); in rxrpc_input_call_packet()
1078 rxrpc_input_ackall(call, skb); in rxrpc_input_call_packet()
1089 * Handle a new service call on a channel implicitly completing the preceding
1090 * call on that channel. This does not apply to client conns.
1096 struct rxrpc_call *call) in rxrpc_input_implicit_end_call() argument
1098 switch (READ_ONCE(call->state)) { in rxrpc_input_implicit_end_call()
1100 rxrpc_call_completed(call); in rxrpc_input_implicit_end_call()
1105 if (rxrpc_abort_call("IMP", call, 0, RX_CALL_DEAD, -ESHUTDOWN)) { in rxrpc_input_implicit_end_call()
1106 set_bit(RXRPC_CALL_EV_ABORT, &call->events); in rxrpc_input_implicit_end_call()
1107 rxrpc_queue_call(call); in rxrpc_input_implicit_end_call()
1109 trace_rxrpc_improper_term(call); in rxrpc_input_implicit_end_call()
1114 __rxrpc_disconnect_call(conn, call); in rxrpc_input_implicit_end_call()
1116 rxrpc_notify_socket(call); in rxrpc_input_implicit_end_call()
1121 * - this includes challenges, responses, some aborts and call terminal packet
1210 struct rxrpc_call *call = NULL; in rxrpc_input_packet() local
1305 * that would begin a call are explicitly rejected and the rest in rxrpc_input_packet()
1353 /* Call-bound packets are routed by connection channel. */ in rxrpc_input_packet()
1362 if (chan->call || in rxrpc_input_packet()
1366 /* For the previous service call, if completed in rxrpc_input_packet()
1385 call = rcu_dereference(chan->call); in rxrpc_input_packet()
1390 if (call) in rxrpc_input_packet()
1391 rxrpc_input_implicit_end_call(rx, conn, call); in rxrpc_input_packet()
1392 call = NULL; in rxrpc_input_packet()
1395 if (call) { in rxrpc_input_packet()
1396 if (sp->hdr.serviceId != call->service_id) in rxrpc_input_packet()
1397 call->service_id = sp->hdr.serviceId; in rxrpc_input_packet()
1398 if ((int)sp->hdr.serial - (int)call->rx_serial > 0) in rxrpc_input_packet()
1399 call->rx_serial = sp->hdr.serial; in rxrpc_input_packet()
1400 if (!test_bit(RXRPC_CALL_RX_HEARD, &call->flags)) in rxrpc_input_packet()
1401 set_bit(RXRPC_CALL_RX_HEARD, &call->flags); in rxrpc_input_packet()
1405 if (!call || atomic_read(&call->usage) == 0) { in rxrpc_input_packet()
1411 call = rxrpc_new_incoming_call(local, rx, skb); in rxrpc_input_packet()
1412 if (!call) in rxrpc_input_packet()
1414 rxrpc_send_ping(call, skb, skew); in rxrpc_input_packet()
1415 mutex_unlock(&call->user_mutex); in rxrpc_input_packet()
1418 rxrpc_input_call_packet(call, skb, skew); in rxrpc_input_packet()