Lines Matching refs:call
27 struct rxrpc_call *call, rxrpc_seq_t seq) in rxrpc_proto_abort() argument
29 if (rxrpc_abort_call(why, call, seq, RX_PROTOCOL_ERROR, -EBADMSG)) { in rxrpc_proto_abort()
30 set_bit(RXRPC_CALL_EV_ABORT, &call->events); in rxrpc_proto_abort()
31 rxrpc_queue_call(call); in rxrpc_proto_abort()
38 static void rxrpc_congestion_management(struct rxrpc_call *call, in rxrpc_congestion_management() argument
44 unsigned int cumulative_acks = call->cong_cumul_acks; in rxrpc_congestion_management()
45 unsigned int cwnd = call->cong_cwnd; in rxrpc_congestion_management()
49 (call->tx_top - call->tx_hard_ack) - summary->nr_acks; in rxrpc_congestion_management()
51 if (test_and_clear_bit(RXRPC_CALL_RETRANS_TIMEOUT, &call->flags)) { in rxrpc_congestion_management()
53 call->cong_ssthresh = max_t(unsigned int, in rxrpc_congestion_management()
56 if (cwnd >= call->cong_ssthresh && in rxrpc_congestion_management()
57 call->cong_mode == RXRPC_CALL_SLOW_START) { in rxrpc_congestion_management()
58 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_congestion_management()
59 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
69 summary->mode = call->cong_mode; in rxrpc_congestion_management()
70 summary->cwnd = call->cong_cwnd; in rxrpc_congestion_management()
71 summary->ssthresh = call->cong_ssthresh; in rxrpc_congestion_management()
73 summary->dup_acks = call->cong_dup_acks; in rxrpc_congestion_management()
75 switch (call->cong_mode) { in rxrpc_congestion_management()
81 if (cwnd >= call->cong_ssthresh) { in rxrpc_congestion_management()
82 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_congestion_management()
83 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
94 if (call->peer->rtt_usage == 0) in rxrpc_congestion_management()
97 ktime_add_ns(call->cong_tstamp, in rxrpc_congestion_management()
98 call->peer->rtt))) in rxrpc_congestion_management()
101 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
112 call->cong_dup_acks = 1; in rxrpc_congestion_management()
113 if (call->cong_extra > 1) in rxrpc_congestion_management()
114 call->cong_extra = 1; in rxrpc_congestion_management()
118 call->cong_dup_acks++; in rxrpc_congestion_management()
119 if (call->cong_dup_acks < 3) in rxrpc_congestion_management()
123 call->cong_mode = RXRPC_CALL_FAST_RETRANSMIT; in rxrpc_congestion_management()
124 call->cong_ssthresh = max_t(unsigned int, in rxrpc_congestion_management()
126 cwnd = call->cong_ssthresh + 3; in rxrpc_congestion_management()
127 call->cong_extra = 0; in rxrpc_congestion_management()
128 call->cong_dup_acks = 0; in rxrpc_congestion_management()
136 call->cong_dup_acks++; in rxrpc_congestion_management()
137 if (call->cong_dup_acks == 2) { in rxrpc_congestion_management()
139 call->cong_dup_acks = 0; in rxrpc_congestion_management()
144 cwnd = call->cong_ssthresh; in rxrpc_congestion_management()
157 call->cong_dup_acks = 0; in rxrpc_congestion_management()
158 call->cong_extra = 0; in rxrpc_congestion_management()
159 call->cong_tstamp = skb->tstamp; in rxrpc_congestion_management()
160 if (cwnd < call->cong_ssthresh) in rxrpc_congestion_management()
161 call->cong_mode = RXRPC_CALL_SLOW_START; in rxrpc_congestion_management()
163 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_congestion_management()
169 call->cong_cwnd = cwnd; in rxrpc_congestion_management()
170 call->cong_cumul_acks = cumulative_acks; in rxrpc_congestion_management()
171 trace_rxrpc_congest(call, summary, acked_serial, change); in rxrpc_congestion_management()
172 if (resend && !test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events)) in rxrpc_congestion_management()
173 rxrpc_queue_call(call); in rxrpc_congestion_management()
178 call->cong_mode = RXRPC_CALL_PACKET_LOSS; in rxrpc_congestion_management()
179 call->cong_dup_acks = 0; in rxrpc_congestion_management()
186 if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] & in rxrpc_congestion_management()
188 summary->nr_acks != call->tx_top - call->tx_hard_ack) { in rxrpc_congestion_management()
189 call->cong_extra++; in rxrpc_congestion_management()
190 wake_up(&call->waitq); in rxrpc_congestion_management()
198 static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, in rxrpc_rotate_tx_window() argument
206 if (call->acks_lowest_nak == call->tx_hard_ack) { in rxrpc_rotate_tx_window()
207 call->acks_lowest_nak = to; in rxrpc_rotate_tx_window()
208 } else if (before_eq(call->acks_lowest_nak, to)) { in rxrpc_rotate_tx_window()
210 call->acks_lowest_nak = to; in rxrpc_rotate_tx_window()
213 spin_lock(&call->lock); in rxrpc_rotate_tx_window()
215 while (before(call->tx_hard_ack, to)) { in rxrpc_rotate_tx_window()
216 call->tx_hard_ack++; in rxrpc_rotate_tx_window()
217 ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK; in rxrpc_rotate_tx_window()
218 skb = call->rxtx_buffer[ix]; in rxrpc_rotate_tx_window()
219 annotation = call->rxtx_annotations[ix]; in rxrpc_rotate_tx_window()
221 call->rxtx_buffer[ix] = NULL; in rxrpc_rotate_tx_window()
222 call->rxtx_annotations[ix] = 0; in rxrpc_rotate_tx_window()
227 set_bit(RXRPC_CALL_TX_LAST, &call->flags); in rxrpc_rotate_tx_window()
234 spin_unlock(&call->lock); in rxrpc_rotate_tx_window()
236 trace_rxrpc_transmit(call, (rot_last ? in rxrpc_rotate_tx_window()
239 wake_up(&call->waitq); in rxrpc_rotate_tx_window()
257 static bool rxrpc_end_tx_phase(struct rxrpc_call *call, bool reply_begun, in rxrpc_end_tx_phase() argument
262 ASSERT(test_bit(RXRPC_CALL_TX_LAST, &call->flags)); in rxrpc_end_tx_phase()
264 write_lock(&call->state_lock); in rxrpc_end_tx_phase()
266 state = call->state; in rxrpc_end_tx_phase()
271 call->state = state = RXRPC_CALL_CLIENT_RECV_REPLY; in rxrpc_end_tx_phase()
273 call->state = state = RXRPC_CALL_CLIENT_AWAIT_REPLY; in rxrpc_end_tx_phase()
277 __rxrpc_call_completed(call); in rxrpc_end_tx_phase()
278 rxrpc_notify_socket(call); in rxrpc_end_tx_phase()
279 state = call->state; in rxrpc_end_tx_phase()
286 write_unlock(&call->state_lock); in rxrpc_end_tx_phase()
288 trace_rxrpc_transmit(call, rxrpc_transmit_await_reply); in rxrpc_end_tx_phase()
290 trace_rxrpc_transmit(call, rxrpc_transmit_end); in rxrpc_end_tx_phase()
295 write_unlock(&call->state_lock); in rxrpc_end_tx_phase()
296 kdebug("end_tx %s", rxrpc_call_states[call->state]); in rxrpc_end_tx_phase()
297 rxrpc_proto_abort(abort_why, call, call->tx_top); in rxrpc_end_tx_phase()
304 static bool rxrpc_receiving_reply(struct rxrpc_call *call) in rxrpc_receiving_reply() argument
308 rxrpc_seq_t top = READ_ONCE(call->tx_top); in rxrpc_receiving_reply()
310 if (call->ackr_reason) { in rxrpc_receiving_reply()
311 spin_lock_bh(&call->lock); in rxrpc_receiving_reply()
312 call->ackr_reason = 0; in rxrpc_receiving_reply()
313 spin_unlock_bh(&call->lock); in rxrpc_receiving_reply()
316 WRITE_ONCE(call->resend_at, timo); in rxrpc_receiving_reply()
317 WRITE_ONCE(call->ack_at, timo); in rxrpc_receiving_reply()
318 trace_rxrpc_timer(call, rxrpc_timer_init_for_reply, now); in rxrpc_receiving_reply()
321 if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags)) { in rxrpc_receiving_reply()
322 if (!rxrpc_rotate_tx_window(call, top, &summary)) { in rxrpc_receiving_reply()
323 rxrpc_proto_abort("TXL", call, top); in rxrpc_receiving_reply()
327 if (!rxrpc_end_tx_phase(call, true, "ETD")) in rxrpc_receiving_reply()
329 call->tx_phase = false; in rxrpc_receiving_reply()
391 static void rxrpc_input_dup_data(struct rxrpc_call *call, rxrpc_seq_t seq, in rxrpc_input_dup_data() argument
403 call->nr_jumbo_bad++; in rxrpc_input_dup_data()
412 static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) in rxrpc_input_data() argument
423 call->rx_hard_ack, call->rx_top, skb->len, seq0); in rxrpc_input_data()
428 state = READ_ONCE(call->state); in rxrpc_input_data()
434 if (call->state == RXRPC_CALL_SERVER_RECV_REQUEST) { in rxrpc_input_data()
435 unsigned long timo = READ_ONCE(call->next_req_timo); in rxrpc_input_data()
441 WRITE_ONCE(call->expect_req_by, expect_req_by); in rxrpc_input_data()
442 rxrpc_reduce_call_timer(call, expect_req_by, now, in rxrpc_input_data()
447 spin_lock(&call->input_lock); in rxrpc_input_data()
454 !rxrpc_receiving_reply(call)) in rxrpc_input_data()
457 call->ackr_prev_seq = seq0; in rxrpc_input_data()
458 hard_ack = READ_ONCE(call->rx_hard_ack); in rxrpc_input_data()
462 if (call->nr_jumbo_bad > 3) { in rxrpc_input_data()
481 if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && in rxrpc_input_data()
482 seq != call->rx_top) { in rxrpc_input_data()
483 rxrpc_proto_abort("LSN", call, seq); in rxrpc_input_data()
487 if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && in rxrpc_input_data()
488 after_eq(seq, call->rx_top)) { in rxrpc_input_data()
489 rxrpc_proto_abort("LSA", call, seq); in rxrpc_input_data()
501 trace_rxrpc_rx_data(call->debug_id, seq, serial, flags, annotation); in rxrpc_input_data()
509 if (call->rxtx_buffer[ix]) { in rxrpc_input_data()
510 rxrpc_input_dup_data(call, seq, nr_subpackets > 1, in rxrpc_input_data()
520 if (after(seq, hard_ack + call->rx_winsize)) { in rxrpc_input_data()
525 call->nr_jumbo_bad++; in rxrpc_input_data()
548 call->rxtx_annotations[ix] = annotation; in rxrpc_input_data()
550 call->rxtx_buffer[ix] = skb; in rxrpc_input_data()
551 if (after(seq, call->rx_top)) { in rxrpc_input_data()
552 smp_store_release(&call->rx_top, seq); in rxrpc_input_data()
553 } else if (before(seq, call->rx_top)) { in rxrpc_input_data()
572 set_bit(RXRPC_CALL_RX_LAST, &call->flags); in rxrpc_input_data()
577 trace_rxrpc_receive(call, rxrpc_receive_queue_last, serial, seq); in rxrpc_input_data()
579 trace_rxrpc_receive(call, rxrpc_receive_queue, serial, seq); in rxrpc_input_data()
582 if (after_eq(seq, call->rx_expect_next)) { in rxrpc_input_data()
583 if (after(seq, call->rx_expect_next)) { in rxrpc_input_data()
584 _net("OOS %u > %u", seq, call->rx_expect_next); in rxrpc_input_data()
588 call->rx_expect_next = seq + 1; in rxrpc_input_data()
594 rxrpc_propose_ACK(call, ack, ack_serial, in rxrpc_input_data()
598 rxrpc_propose_ACK(call, RXRPC_ACK_DELAY, serial, in rxrpc_input_data()
602 if (seq0 == READ_ONCE(call->rx_hard_ack) + 1) { in rxrpc_input_data()
603 trace_rxrpc_notify_socket(call->debug_id, serial); in rxrpc_input_data()
604 rxrpc_notify_socket(call); in rxrpc_input_data()
608 spin_unlock(&call->input_lock); in rxrpc_input_data()
616 static void rxrpc_input_requested_ack(struct rxrpc_call *call, in rxrpc_input_requested_ack() argument
627 skb = call->rxtx_buffer[ix]; in rxrpc_input_requested_ack()
642 rxrpc_peer_add_rtt(call, rxrpc_rtt_rx_requested_ack, in rxrpc_input_requested_ack()
653 static void rxrpc_input_check_for_lost_ack(struct rxrpc_call *call) in rxrpc_input_check_for_lost_ack() argument
658 spin_lock_bh(&call->lock); in rxrpc_input_check_for_lost_ack()
660 bottom = call->tx_hard_ack + 1; in rxrpc_input_check_for_lost_ack()
661 top = call->acks_lost_top; in rxrpc_input_check_for_lost_ack()
665 u8 annotation = call->rxtx_annotations[ix]; in rxrpc_input_check_for_lost_ack()
672 call->rxtx_annotations[ix] = annotation; in rxrpc_input_check_for_lost_ack()
677 spin_unlock_bh(&call->lock); in rxrpc_input_check_for_lost_ack()
679 if (resend && !test_and_set_bit(RXRPC_CALL_EV_RESEND, &call->events)) in rxrpc_input_check_for_lost_ack()
680 rxrpc_queue_call(call); in rxrpc_input_check_for_lost_ack()
686 static void rxrpc_input_ping_response(struct rxrpc_call *call, in rxrpc_input_ping_response() argument
694 ping_time = call->ping_time; in rxrpc_input_ping_response()
696 ping_serial = READ_ONCE(call->ping_serial); in rxrpc_input_ping_response()
698 if (orig_serial == call->acks_lost_ping) in rxrpc_input_ping_response()
699 rxrpc_input_check_for_lost_ack(call); in rxrpc_input_ping_response()
702 !test_and_clear_bit(RXRPC_CALL_PINGING, &call->flags)) in rxrpc_input_ping_response()
707 rxrpc_peer_add_rtt(call, rxrpc_rtt_rx_ping_response, in rxrpc_input_ping_response()
714 static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, in rxrpc_input_ackinfo() argument
728 if (call->tx_winsize != rwind) { in rxrpc_input_ackinfo()
731 if (rwind > call->tx_winsize) in rxrpc_input_ackinfo()
733 trace_rxrpc_rx_rwind_change(call, sp->hdr.serial, in rxrpc_input_ackinfo()
735 call->tx_winsize = rwind; in rxrpc_input_ackinfo()
738 if (call->cong_ssthresh > rwind) in rxrpc_input_ackinfo()
739 call->cong_ssthresh = rwind; in rxrpc_input_ackinfo()
743 peer = call->peer; in rxrpc_input_ackinfo()
753 wake_up(&call->waitq); in rxrpc_input_ackinfo()
765 static void rxrpc_input_soft_acks(struct rxrpc_call *call, u8 *acks, in rxrpc_input_soft_acks() argument
774 annotation = call->rxtx_annotations[ix]; in rxrpc_input_soft_acks()
783 call->rxtx_annotations[ix] = in rxrpc_input_soft_acks()
788 call->acks_lowest_nak != seq) { in rxrpc_input_soft_acks()
789 call->acks_lowest_nak = seq; in rxrpc_input_soft_acks()
798 call->rxtx_annotations[ix] = in rxrpc_input_soft_acks()
802 return rxrpc_proto_abort("SFT", call, 0); in rxrpc_input_soft_acks()
817 static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb) in rxrpc_input_ack() argument
835 return rxrpc_proto_abort("XAK", call, 0); in rxrpc_input_ack()
847 trace_rxrpc_rx_ack(call, sp->hdr.serial, acked_serial, in rxrpc_input_ack()
852 rxrpc_input_ping_response(call, skb->tstamp, acked_serial, in rxrpc_input_ack()
855 rxrpc_input_requested_ack(call, skb->tstamp, acked_serial, in rxrpc_input_ack()
860 rxrpc_propose_ACK(call, RXRPC_ACK_PING_RESPONSE, in rxrpc_input_ack()
864 rxrpc_propose_ACK(call, RXRPC_ACK_REQUESTED, in rxrpc_input_ack()
870 if (before(first_soft_ack, call->ackr_first_seq) || in rxrpc_input_ack()
871 before(prev_pkt, call->ackr_prev_seq)) in rxrpc_input_ack()
878 return rxrpc_proto_abort("XAI", call, 0); in rxrpc_input_ack()
880 spin_lock(&call->input_lock); in rxrpc_input_ack()
883 if (before(first_soft_ack, call->ackr_first_seq) || in rxrpc_input_ack()
884 before(prev_pkt, call->ackr_prev_seq)) in rxrpc_input_ack()
886 call->acks_latest_ts = skb->tstamp; in rxrpc_input_ack()
887 call->acks_latest = sp->hdr.serial; in rxrpc_input_ack()
889 call->ackr_first_seq = first_soft_ack; in rxrpc_input_ack()
890 call->ackr_prev_seq = prev_pkt; in rxrpc_input_ack()
894 rxrpc_input_ackinfo(call, skb, &buf.info); in rxrpc_input_ack()
897 rxrpc_proto_abort("AK0", call, 0); in rxrpc_input_ack()
902 switch (READ_ONCE(call->state)) { in rxrpc_input_ack()
912 if (before(hard_ack, call->tx_hard_ack) || in rxrpc_input_ack()
913 after(hard_ack, call->tx_top)) { in rxrpc_input_ack()
914 rxrpc_proto_abort("AKW", call, 0); in rxrpc_input_ack()
917 if (nr_acks > call->tx_top - hard_ack) { in rxrpc_input_ack()
918 rxrpc_proto_abort("AKN", call, 0); in rxrpc_input_ack()
922 if (after(hard_ack, call->tx_hard_ack)) { in rxrpc_input_ack()
923 if (rxrpc_rotate_tx_window(call, hard_ack, &summary)) { in rxrpc_input_ack()
924 rxrpc_end_tx_phase(call, false, "ETA"); in rxrpc_input_ack()
931 rxrpc_proto_abort("XSA", call, 0); in rxrpc_input_ack()
934 rxrpc_input_soft_acks(call, buf.acks, first_soft_ack, nr_acks, in rxrpc_input_ack()
938 if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] & in rxrpc_input_ack()
940 summary.nr_acks == call->tx_top - hard_ack && in rxrpc_input_ack()
941 rxrpc_is_client_call(call)) in rxrpc_input_ack()
942 rxrpc_propose_ACK(call, RXRPC_ACK_PING, sp->hdr.serial, in rxrpc_input_ack()
946 rxrpc_congestion_management(call, skb, &summary, acked_serial); in rxrpc_input_ack()
948 spin_unlock(&call->input_lock); in rxrpc_input_ack()
954 static void rxrpc_input_ackall(struct rxrpc_call *call, struct sk_buff *skb) in rxrpc_input_ackall() argument
961 spin_lock(&call->input_lock); in rxrpc_input_ackall()
963 if (rxrpc_rotate_tx_window(call, call->tx_top, &summary)) in rxrpc_input_ackall()
964 rxrpc_end_tx_phase(call, false, "ETL"); in rxrpc_input_ackall()
966 spin_unlock(&call->input_lock); in rxrpc_input_ackall()
972 static void rxrpc_input_abort(struct rxrpc_call *call, struct sk_buff *skb) in rxrpc_input_abort() argument
985 trace_rxrpc_rx_abort(call, sp->hdr.serial, abort_code); in rxrpc_input_abort()
989 if (rxrpc_set_call_completion(call, RXRPC_CALL_REMOTELY_ABORTED, in rxrpc_input_abort()
991 rxrpc_notify_socket(call); in rxrpc_input_abort()
997 static void rxrpc_input_call_packet(struct rxrpc_call *call, in rxrpc_input_call_packet() argument
1003 _enter("%p,%p", call, skb); in rxrpc_input_call_packet()
1005 timo = READ_ONCE(call->next_rx_timo); in rxrpc_input_call_packet()
1010 WRITE_ONCE(call->expect_rx_by, expect_rx_by); in rxrpc_input_call_packet()
1011 rxrpc_reduce_call_timer(call, expect_rx_by, now, in rxrpc_input_call_packet()
1017 rxrpc_input_data(call, skb); in rxrpc_input_call_packet()
1021 rxrpc_input_ack(call, skb); in rxrpc_input_call_packet()
1034 rxrpc_input_abort(call, skb); in rxrpc_input_call_packet()
1038 rxrpc_input_ackall(call, skb); in rxrpc_input_call_packet()
1058 struct rxrpc_call *call) in rxrpc_input_implicit_end_call() argument
1060 switch (READ_ONCE(call->state)) { in rxrpc_input_implicit_end_call()
1062 rxrpc_call_completed(call); in rxrpc_input_implicit_end_call()
1067 if (rxrpc_abort_call("IMP", call, 0, RX_CALL_DEAD, -ESHUTDOWN)) { in rxrpc_input_implicit_end_call()
1068 set_bit(RXRPC_CALL_EV_ABORT, &call->events); in rxrpc_input_implicit_end_call()
1069 rxrpc_queue_call(call); in rxrpc_input_implicit_end_call()
1071 trace_rxrpc_improper_term(call); in rxrpc_input_implicit_end_call()
1076 __rxrpc_disconnect_call(conn, call); in rxrpc_input_implicit_end_call()
1078 rxrpc_notify_socket(call); in rxrpc_input_implicit_end_call()
1172 struct rxrpc_call *call = NULL; in rxrpc_input_packet() local
1333 if (chan->call || in rxrpc_input_packet()
1356 call = rcu_dereference(chan->call); in rxrpc_input_packet()
1361 if (call) in rxrpc_input_packet()
1362 rxrpc_input_implicit_end_call(rx, conn, call); in rxrpc_input_packet()
1363 call = NULL; in rxrpc_input_packet()
1366 if (call) { in rxrpc_input_packet()
1367 if (sp->hdr.serviceId != call->service_id) in rxrpc_input_packet()
1368 call->service_id = sp->hdr.serviceId; in rxrpc_input_packet()
1369 if ((int)sp->hdr.serial - (int)call->rx_serial > 0) in rxrpc_input_packet()
1370 call->rx_serial = sp->hdr.serial; in rxrpc_input_packet()
1371 if (!test_bit(RXRPC_CALL_RX_HEARD, &call->flags)) in rxrpc_input_packet()
1372 set_bit(RXRPC_CALL_RX_HEARD, &call->flags); in rxrpc_input_packet()
1376 if (!call || atomic_read(&call->usage) == 0) { in rxrpc_input_packet()
1382 call = rxrpc_new_incoming_call(local, rx, skb); in rxrpc_input_packet()
1383 if (!call) in rxrpc_input_packet()
1390 rxrpc_input_call_packet(call, skb); in rxrpc_input_packet()