Lines Matching full:call

23 void rxrpc_propose_ping(struct rxrpc_call *call, u32 serial,  in rxrpc_propose_ping()  argument
30 trace_rxrpc_propose_ack(call, why, RXRPC_ACK_PING, serial); in rxrpc_propose_ping()
31 if (ktime_before(ping_at, call->ping_at)) { in rxrpc_propose_ping()
32 call->ping_at = ping_at; in rxrpc_propose_ping()
33 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_ping); in rxrpc_propose_ping()
40 void rxrpc_propose_delay_ACK(struct rxrpc_call *call, rxrpc_serial_t serial, in rxrpc_propose_delay_ACK() argument
45 trace_rxrpc_propose_ack(call, why, RXRPC_ACK_DELAY, serial); in rxrpc_propose_delay_ACK()
47 if (call->srtt_us) in rxrpc_propose_delay_ACK()
48 delay = (call->srtt_us >> 3) * NSEC_PER_USEC; in rxrpc_propose_delay_ACK()
51 ktime_add_ms(delay, call->tx_backoff); in rxrpc_propose_delay_ACK()
53 call->delay_ack_at = ktime_add(now, delay); in rxrpc_propose_delay_ACK()
54 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_delayed_ack); in rxrpc_propose_delay_ACK()
60 static bool rxrpc_retransmit_data(struct rxrpc_call *call, in rxrpc_retransmit_data() argument
70 trace_rxrpc_retransmit(call, req, txb); in rxrpc_retransmit_data()
73 rxrpc_send_data_packet(call, req); in rxrpc_retransmit_data()
74 rxrpc_inc_stat(call->rxnet, stat_tx_data_retrans); in rxrpc_retransmit_data()
86 static void rxrpc_resend(struct rxrpc_call *call) in rxrpc_resend() argument
94 _enter("{%d,%d}", call->tx_bottom, call->tx_top); in rxrpc_resend()
96 trace_rxrpc_resend(call, call->acks_highest_serial); in rxrpc_resend()
99 for (tq = call->tx_queue; tq; tq = tq->next) { in rxrpc_resend()
102 if (after(tq->qbase, call->tx_transmitted)) in rxrpc_resend()
106 tq->segment_acked, tq->nr_reported_acks, call->debug_id, tq->qbase); in rxrpc_resend()
109 trace_rxrpc_resend_lost(call, tq, lost); in rxrpc_resend()
120 rxrpc_retransmit_data(call, &req); in rxrpc_resend()
124 rxrpc_get_rto_backoff(call, req.did_send); in rxrpc_resend()
131 void rxrpc_resend_tlp(struct rxrpc_call *call) in rxrpc_resend_tlp() argument
135 .seq = call->tx_transmitted, in rxrpc_resend_tlp()
142 req.tq = READ_ONCE(call->tx_qtail); in rxrpc_resend_tlp()
144 before(call->tx_transmitted, req.tq->qbase + RXRPC_NR_TXQUEUE)) { in rxrpc_resend_tlp()
145 rxrpc_retransmit_data(call, &req); in rxrpc_resend_tlp()
149 for (req.tq = call->tx_queue; req.tq; req.tq = req.tq->next) { in rxrpc_resend_tlp()
150 if (after_eq(call->tx_transmitted, req.tq->qbase) && in rxrpc_resend_tlp()
151 before(call->tx_transmitted, req.tq->qbase + RXRPC_NR_TXQUEUE)) { in rxrpc_resend_tlp()
152 rxrpc_retransmit_data(call, &req); in rxrpc_resend_tlp()
162 static void rxrpc_begin_service_reply(struct rxrpc_call *call) in rxrpc_begin_service_reply() argument
164 rxrpc_set_call_state(call, RXRPC_CALL_SERVER_SEND_REPLY); in rxrpc_begin_service_reply()
165 if (call->ackr_reason == RXRPC_ACK_DELAY) in rxrpc_begin_service_reply()
166 call->ackr_reason = 0; in rxrpc_begin_service_reply()
167 call->delay_ack_at = KTIME_MAX; in rxrpc_begin_service_reply()
168 trace_rxrpc_timer_can(call, rxrpc_timer_trace_delayed_ack); in rxrpc_begin_service_reply()
173 * transmitted in the call.
175 static void rxrpc_close_tx_phase(struct rxrpc_call *call) in rxrpc_close_tx_phase() argument
179 switch (__rxrpc_call_state(call)) { in rxrpc_close_tx_phase()
181 rxrpc_set_call_state(call, RXRPC_CALL_CLIENT_AWAIT_REPLY); in rxrpc_close_tx_phase()
184 rxrpc_set_call_state(call, RXRPC_CALL_SERVER_AWAIT_ACK); in rxrpc_close_tx_phase()
194 static void rxrpc_transmit_fresh_data(struct rxrpc_call *call, unsigned int limit, in rxrpc_transmit_fresh_data() argument
197 int space = rxrpc_tx_window_space(call); in rxrpc_transmit_fresh_data()
199 if (!test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_transmit_fresh_data()
200 if (call->send_top == call->tx_top) in rxrpc_transmit_fresh_data()
202 rxrpc_expose_client_call(call); in rxrpc_transmit_fresh_data()
208 .seq = call->tx_transmitted + 1, in rxrpc_transmit_fresh_data()
215 int limit = min(space, max(call->peer->pmtud_jumbo, 1)); in rxrpc_transmit_fresh_data()
220 send_top = smp_load_acquire(&call->send_top); in rxrpc_transmit_fresh_data()
221 if (call->tx_top == send_top) in rxrpc_transmit_fresh_data()
224 trace_rxrpc_transmit(call, send_top, space); in rxrpc_transmit_fresh_data()
226 tq = call->tx_qtail; in rxrpc_transmit_fresh_data()
227 seq = call->tx_top; in rxrpc_transmit_fresh_data()
228 trace_rxrpc_tq(call, tq, seq, rxrpc_tq_decant); in rxrpc_transmit_fresh_data()
237 trace_rxrpc_tq(call, tq, seq, rxrpc_tq_decant_advance); in rxrpc_transmit_fresh_data()
248 rxrpc_close_tx_phase(call); in rxrpc_transmit_fresh_data()
251 call->tx_qtail = tq; in rxrpc_transmit_fresh_data()
252 call->tx_top = seq; in rxrpc_transmit_fresh_data()
255 rxrpc_send_data_packet(call, &req); in rxrpc_transmit_fresh_data()
259 void rxrpc_transmit_some_data(struct rxrpc_call *call, unsigned int limit, in rxrpc_transmit_some_data() argument
262 switch (__rxrpc_call_state(call)) { in rxrpc_transmit_some_data()
264 if (call->tx_bottom == READ_ONCE(call->send_top)) in rxrpc_transmit_some_data()
266 rxrpc_begin_service_reply(call); in rxrpc_transmit_some_data()
271 if (!rxrpc_tx_window_space(call)) in rxrpc_transmit_some_data()
273 if (call->tx_bottom == READ_ONCE(call->send_top)) { in rxrpc_transmit_some_data()
274 rxrpc_inc_stat(call->rxnet, stat_tx_data_underflow); in rxrpc_transmit_some_data()
277 rxrpc_transmit_fresh_data(call, limit, trace); in rxrpc_transmit_some_data()
288 static void rxrpc_send_initial_ping(struct rxrpc_call *call) in rxrpc_send_initial_ping() argument
290 if (call->rtt_count < 3 || in rxrpc_send_initial_ping()
291 ktime_before(ktime_add_ms(call->rtt_last_req, 1000), in rxrpc_send_initial_ping()
293 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_send_initial_ping()
300 bool rxrpc_input_call_event(struct rxrpc_call *call) in rxrpc_input_call_event() argument
307 rxrpc_see_call(call, rxrpc_call_see_input); in rxrpc_input_call_event()
311 call->debug_id, rxrpc_call_states[__rxrpc_call_state(call)], in rxrpc_input_call_event()
312 call->events); in rxrpc_input_call_event()
315 abort_code = smp_load_acquire(&call->send_abort); in rxrpc_input_call_event()
317 rxrpc_abort_call(call, 0, call->send_abort, call->send_abort_err, in rxrpc_input_call_event()
318 call->send_abort_why); in rxrpc_input_call_event()
323 skb = __skb_dequeue(&call->rx_queue); in rxrpc_input_call_event()
327 if (__rxrpc_call_is_complete(call) || in rxrpc_input_call_event()
335 rxrpc_input_call_packet(call, skb); in rxrpc_input_call_event()
340 t = ktime_sub(call->rack_timo_at, ktime_get_real()); in rxrpc_input_call_event()
342 trace_rxrpc_timer_exp(call, t, in rxrpc_input_call_event()
343 rxrpc_timer_trace_rack_off + call->rack_timer_mode); in rxrpc_input_call_event()
344 call->rack_timo_at = KTIME_MAX; in rxrpc_input_call_event()
345 rxrpc_rack_timer_expired(call, t); in rxrpc_input_call_event()
348 } while (!skb_queue_empty(&call->rx_queue)); in rxrpc_input_call_event()
352 t = ktime_sub(call->expect_rx_by, now); in rxrpc_input_call_event()
354 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_expect_rx); in rxrpc_input_call_event()
358 t = ktime_sub(call->expect_req_by, now); in rxrpc_input_call_event()
360 call->expect_req_by = KTIME_MAX; in rxrpc_input_call_event()
361 if (__rxrpc_call_state(call) == RXRPC_CALL_SERVER_RECV_REQUEST) { in rxrpc_input_call_event()
362 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_idle); in rxrpc_input_call_event()
367 t = ktime_sub(READ_ONCE(call->expect_term_by), now); in rxrpc_input_call_event()
369 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_hard); in rxrpc_input_call_event()
373 t = ktime_sub(call->delay_ack_at, now); in rxrpc_input_call_event()
375 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_delayed_ack); in rxrpc_input_call_event()
376 call->delay_ack_at = KTIME_MAX; in rxrpc_input_call_event()
377 rxrpc_send_ACK(call, RXRPC_ACK_DELAY, 0, in rxrpc_input_call_event()
381 t = ktime_sub(call->ping_at, now); in rxrpc_input_call_event()
383 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_ping); in rxrpc_input_call_event()
384 call->ping_at = KTIME_MAX; in rxrpc_input_call_event()
385 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
390 t = ktime_sub(call->keepalive_at, now); in rxrpc_input_call_event()
392 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_keepalive); in rxrpc_input_call_event()
393 call->keepalive_at = KTIME_MAX; in rxrpc_input_call_event()
394 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
398 if (test_and_clear_bit(RXRPC_CALL_EV_INITIAL_PING, &call->events)) in rxrpc_input_call_event()
399 rxrpc_send_initial_ping(call); in rxrpc_input_call_event()
401 rxrpc_transmit_some_data(call, UINT_MAX, rxrpc_txdata_new_data); in rxrpc_input_call_event()
404 rxrpc_congestion_degrade(call); in rxrpc_input_call_event()
407 (__rxrpc_call_state(call) == RXRPC_CALL_CLIENT_SEND_REQUEST || in rxrpc_input_call_event()
408 __rxrpc_call_state(call) == RXRPC_CALL_SERVER_SEND_REPLY)) { in rxrpc_input_call_event()
409 t = ktime_sub(call->rack_timo_at, ktime_get_real()); in rxrpc_input_call_event()
410 trace_rxrpc_rack(call, t); in rxrpc_input_call_event()
414 if (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events)) in rxrpc_input_call_event()
415 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
418 if (call->tx_nr_lost > 0 && in rxrpc_input_call_event()
419 __rxrpc_call_state(call) != RXRPC_CALL_CLIENT_RECV_REPLY && in rxrpc_input_call_event()
420 !test_bit(RXRPC_CALL_TX_ALL_ACKED, &call->flags)) in rxrpc_input_call_event()
421 rxrpc_resend(call); in rxrpc_input_call_event()
423 if (test_and_clear_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags)) in rxrpc_input_call_event()
424 rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, in rxrpc_input_call_event()
427 if (call->ackr_nr_unacked > 2) { in rxrpc_input_call_event()
428 if (call->rtt_count < 3) in rxrpc_input_call_event()
429 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
431 else if (ktime_before(ktime_add_ms(call->rtt_last_req, 1000), in rxrpc_input_call_event()
433 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
436 rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, in rxrpc_input_call_event()
441 if (!__rxrpc_call_is_complete(call)) { in rxrpc_input_call_event()
442 ktime_t next = READ_ONCE(call->expect_term_by), delay; in rxrpc_input_call_event()
446 set(call->expect_req_by); in rxrpc_input_call_event()
447 set(call->expect_rx_by); in rxrpc_input_call_event()
448 set(call->delay_ack_at); in rxrpc_input_call_event()
449 set(call->rack_timo_at); in rxrpc_input_call_event()
450 set(call->keepalive_at); in rxrpc_input_call_event()
451 set(call->ping_at); in rxrpc_input_call_event()
456 rxrpc_poke_call(call, rxrpc_call_poke_timer_now); in rxrpc_input_call_event()
462 if (time_before(nextj, call->timer.expires) || in rxrpc_input_call_event()
463 !timer_pending(&call->timer)) { in rxrpc_input_call_event()
464 trace_rxrpc_timer_restart(call, delay, delayj); in rxrpc_input_call_event()
465 timer_reduce(&call->timer, nextj); in rxrpc_input_call_event()
471 if (__rxrpc_call_is_complete(call)) { in rxrpc_input_call_event()
472 del_timer_sync(&call->timer); in rxrpc_input_call_event()
473 if (!test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) in rxrpc_input_call_event()
474 rxrpc_disconnect_call(call); in rxrpc_input_call_event()
475 if (call->security) in rxrpc_input_call_event()
476 call->security->free_call_crypto(call); in rxrpc_input_call_event()
479 call->peer->ackr_adv_pmtud && in rxrpc_input_call_event()
480 call->peer->pmtud_pending) in rxrpc_input_call_event()
481 rxrpc_send_probe_for_pmtud(call); in rxrpc_input_call_event()
487 if (test_bit(RXRPC_CALL_RX_HEARD, &call->flags) && in rxrpc_input_call_event()
488 (int)call->conn->hi_serial - (int)call->rx_serial > 0) { in rxrpc_input_call_event()
489 trace_rxrpc_call_reset(call); in rxrpc_input_call_event()
490 rxrpc_abort_call(call, 0, RX_CALL_DEAD, -ECONNRESET, in rxrpc_input_call_event()
493 rxrpc_abort_call(call, 0, RX_CALL_TIMEOUT, -ETIME, in rxrpc_input_call_event()