Lines Matching refs: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->peer->srtt_us) in rxrpc_propose_delay_ACK()
48 delay = (call->peer->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 void rxrpc_congestion_timeout(struct rxrpc_call *call) in rxrpc_congestion_timeout() argument
62 set_bit(RXRPC_CALL_RETRANS_TIMEOUT, &call->flags); in rxrpc_congestion_timeout()
68 void rxrpc_resend(struct rxrpc_call *call, struct sk_buff *ack_skb) in rxrpc_resend() argument
73 rxrpc_seq_t transmitted = call->tx_transmitted; in rxrpc_resend()
74 ktime_t next_resend = KTIME_MAX, rto = ns_to_ktime(call->peer->rto_us * NSEC_PER_USEC); in rxrpc_resend()
79 _enter("{%d,%d}", call->acks_hard_ack, call->tx_top); in rxrpc_resend()
83 if (list_empty(&call->tx_buffer)) in rxrpc_resend()
86 trace_rxrpc_resend(call, ack_skb); in rxrpc_resend()
87 txb = list_first_entry(&call->tx_buffer, struct rxrpc_txbuf, call_link); in rxrpc_resend()
106 list_for_each_entry_from(txb, &call->tx_buffer, call_link) { in rxrpc_resend()
114 if (after(txb->serial, call->acks_highest_serial)) { in rxrpc_resend()
123 trace_rxrpc_retransmit(call, txb->seq, txb->serial, in rxrpc_resend()
127 rxrpc_transmit_one(call, txb); in rxrpc_resend()
131 if (list_is_last(&txb->call_link, &call->tx_buffer)) in rxrpc_resend()
142 if (after_eq(call->acks_prev_seq, call->tx_transmitted)) in rxrpc_resend()
145 list_for_each_entry_from(txb, &call->tx_buffer, call_link) { in rxrpc_resend()
148 if (before_eq(txb->seq, call->acks_prev_seq)) in rxrpc_resend()
150 if (after(txb->seq, call->tx_transmitted)) in rxrpc_resend()
167 rxrpc_transmit_one(call, txb); in rxrpc_resend()
169 rxrpc_inc_stat(call->rxnet, stat_tx_data_retrans); in rxrpc_resend()
176 delay = rxrpc_get_rto_backoff(call->peer, did_send); in rxrpc_resend()
178 trace_rxrpc_timer_set(call, resend_at - now, rxrpc_timer_trace_resend_reset); in rxrpc_resend()
180 call->resend_at = resend_at; in rxrpc_resend()
183 rxrpc_congestion_timeout(call); in rxrpc_resend()
190 ktime_t next_ping = ktime_add_us(call->acks_latest_ts, in rxrpc_resend()
191 call->peer->srtt_us >> 3); in rxrpc_resend()
194 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_resend()
205 static void rxrpc_begin_service_reply(struct rxrpc_call *call) in rxrpc_begin_service_reply() argument
207 rxrpc_set_call_state(call, RXRPC_CALL_SERVER_SEND_REPLY); in rxrpc_begin_service_reply()
208 if (call->ackr_reason == RXRPC_ACK_DELAY) in rxrpc_begin_service_reply()
209 call->ackr_reason = 0; in rxrpc_begin_service_reply()
210 call->delay_ack_at = KTIME_MAX; in rxrpc_begin_service_reply()
211 trace_rxrpc_timer_can(call, rxrpc_timer_trace_delayed_ack); in rxrpc_begin_service_reply()
218 static void rxrpc_close_tx_phase(struct rxrpc_call *call) in rxrpc_close_tx_phase() argument
222 switch (__rxrpc_call_state(call)) { in rxrpc_close_tx_phase()
224 rxrpc_set_call_state(call, RXRPC_CALL_CLIENT_AWAIT_REPLY); in rxrpc_close_tx_phase()
227 rxrpc_set_call_state(call, RXRPC_CALL_SERVER_AWAIT_ACK); in rxrpc_close_tx_phase()
234 static bool rxrpc_tx_window_has_space(struct rxrpc_call *call) in rxrpc_tx_window_has_space() argument
236 unsigned int winsize = min_t(unsigned int, call->tx_winsize, in rxrpc_tx_window_has_space()
237 call->cong_cwnd + call->cong_extra); in rxrpc_tx_window_has_space()
238 rxrpc_seq_t window = call->acks_hard_ack, wtop = window + winsize; in rxrpc_tx_window_has_space()
239 rxrpc_seq_t tx_top = call->tx_top; in rxrpc_tx_window_has_space()
249 static void rxrpc_decant_prepared_tx(struct rxrpc_call *call) in rxrpc_decant_prepared_tx() argument
253 if (!test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_decant_prepared_tx()
254 if (list_empty(&call->tx_sendmsg)) in rxrpc_decant_prepared_tx()
256 rxrpc_expose_client_call(call); in rxrpc_decant_prepared_tx()
259 while ((txb = list_first_entry_or_null(&call->tx_sendmsg, in rxrpc_decant_prepared_tx()
261 spin_lock(&call->tx_lock); in rxrpc_decant_prepared_tx()
263 spin_unlock(&call->tx_lock); in rxrpc_decant_prepared_tx()
265 call->tx_top = txb->seq; in rxrpc_decant_prepared_tx()
266 list_add_tail(&txb->call_link, &call->tx_buffer); in rxrpc_decant_prepared_tx()
269 rxrpc_close_tx_phase(call); in rxrpc_decant_prepared_tx()
271 rxrpc_transmit_one(call, txb); in rxrpc_decant_prepared_tx()
273 if (!rxrpc_tx_window_has_space(call)) in rxrpc_decant_prepared_tx()
278 static void rxrpc_transmit_some_data(struct rxrpc_call *call) in rxrpc_transmit_some_data() argument
280 switch (__rxrpc_call_state(call)) { in rxrpc_transmit_some_data()
282 if (list_empty(&call->tx_sendmsg)) in rxrpc_transmit_some_data()
284 rxrpc_begin_service_reply(call); in rxrpc_transmit_some_data()
289 if (!rxrpc_tx_window_has_space(call)) in rxrpc_transmit_some_data()
291 if (list_empty(&call->tx_sendmsg)) { in rxrpc_transmit_some_data()
292 rxrpc_inc_stat(call->rxnet, stat_tx_data_underflow); in rxrpc_transmit_some_data()
295 rxrpc_decant_prepared_tx(call); in rxrpc_transmit_some_data()
306 static void rxrpc_send_initial_ping(struct rxrpc_call *call) in rxrpc_send_initial_ping() argument
308 if (call->peer->rtt_count < 3 || in rxrpc_send_initial_ping()
309 ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), in rxrpc_send_initial_ping()
311 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_send_initial_ping()
318 bool rxrpc_input_call_event(struct rxrpc_call *call, struct sk_buff *skb) in rxrpc_input_call_event() argument
324 rxrpc_see_call(call, rxrpc_call_see_input); in rxrpc_input_call_event()
328 call->debug_id, rxrpc_call_states[__rxrpc_call_state(call)], in rxrpc_input_call_event()
329 call->events); in rxrpc_input_call_event()
331 if (__rxrpc_call_is_complete(call)) in rxrpc_input_call_event()
335 abort_code = smp_load_acquire(&call->send_abort); in rxrpc_input_call_event()
337 rxrpc_abort_call(call, 0, call->send_abort, call->send_abort_err, in rxrpc_input_call_event()
338 call->send_abort_why); in rxrpc_input_call_event()
346 rxrpc_input_call_packet(call, skb); in rxrpc_input_call_event()
350 t = ktime_sub(call->expect_rx_by, now); in rxrpc_input_call_event()
352 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_expect_rx); in rxrpc_input_call_event()
356 t = ktime_sub(call->expect_req_by, now); in rxrpc_input_call_event()
358 call->expect_req_by = KTIME_MAX; in rxrpc_input_call_event()
359 if (__rxrpc_call_state(call) == RXRPC_CALL_SERVER_RECV_REQUEST) { in rxrpc_input_call_event()
360 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_idle); in rxrpc_input_call_event()
365 t = ktime_sub(READ_ONCE(call->expect_term_by), now); in rxrpc_input_call_event()
367 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_hard); in rxrpc_input_call_event()
371 t = ktime_sub(call->delay_ack_at, now); in rxrpc_input_call_event()
373 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_delayed_ack); in rxrpc_input_call_event()
374 call->delay_ack_at = KTIME_MAX; in rxrpc_input_call_event()
375 rxrpc_send_ACK(call, RXRPC_ACK_DELAY, 0, in rxrpc_input_call_event()
379 t = ktime_sub(call->ack_lost_at, now); in rxrpc_input_call_event()
381 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_lost_ack); in rxrpc_input_call_event()
382 call->ack_lost_at = KTIME_MAX; in rxrpc_input_call_event()
383 set_bit(RXRPC_CALL_EV_ACK_LOST, &call->events); in rxrpc_input_call_event()
386 t = ktime_sub(call->ping_at, now); in rxrpc_input_call_event()
388 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_ping); in rxrpc_input_call_event()
389 call->ping_at = KTIME_MAX; in rxrpc_input_call_event()
390 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
394 t = ktime_sub(call->resend_at, now); in rxrpc_input_call_event()
396 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_resend); in rxrpc_input_call_event()
397 call->resend_at = KTIME_MAX; in rxrpc_input_call_event()
401 rxrpc_transmit_some_data(call); in rxrpc_input_call_event()
404 t = ktime_sub(call->keepalive_at, now); in rxrpc_input_call_event()
406 trace_rxrpc_timer_exp(call, t, rxrpc_timer_trace_keepalive); in rxrpc_input_call_event()
407 call->keepalive_at = KTIME_MAX; in rxrpc_input_call_event()
408 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
416 rxrpc_congestion_degrade(call); in rxrpc_input_call_event()
419 if (test_and_clear_bit(RXRPC_CALL_EV_INITIAL_PING, &call->events)) in rxrpc_input_call_event()
420 rxrpc_send_initial_ping(call); in rxrpc_input_call_event()
423 if (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events)) in rxrpc_input_call_event()
424 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
428 __rxrpc_call_state(call) != RXRPC_CALL_CLIENT_RECV_REPLY && in rxrpc_input_call_event()
429 !test_bit(RXRPC_CALL_TX_ALL_ACKED, &call->flags)) in rxrpc_input_call_event()
430 rxrpc_resend(call, NULL); in rxrpc_input_call_event()
432 if (test_and_clear_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags)) in rxrpc_input_call_event()
433 rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, in rxrpc_input_call_event()
436 if (call->ackr_nr_unacked > 2) { in rxrpc_input_call_event()
437 if (call->peer->rtt_count < 3) in rxrpc_input_call_event()
438 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
440 else if (ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), in rxrpc_input_call_event()
442 rxrpc_send_ACK(call, RXRPC_ACK_PING, 0, in rxrpc_input_call_event()
445 rxrpc_send_ACK(call, RXRPC_ACK_IDLE, 0, in rxrpc_input_call_event()
450 if (!__rxrpc_call_is_complete(call)) { in rxrpc_input_call_event()
451 ktime_t next = READ_ONCE(call->expect_term_by), delay; in rxrpc_input_call_event()
455 set(call->expect_req_by); in rxrpc_input_call_event()
456 set(call->expect_rx_by); in rxrpc_input_call_event()
457 set(call->delay_ack_at); in rxrpc_input_call_event()
458 set(call->ack_lost_at); in rxrpc_input_call_event()
459 set(call->resend_at); in rxrpc_input_call_event()
460 set(call->keepalive_at); in rxrpc_input_call_event()
461 set(call->ping_at); in rxrpc_input_call_event()
466 rxrpc_poke_call(call, rxrpc_call_poke_timer_now); in rxrpc_input_call_event()
472 if (time_before(nextj, call->timer.expires) || in rxrpc_input_call_event()
473 !timer_pending(&call->timer)) { in rxrpc_input_call_event()
474 trace_rxrpc_timer_restart(call, delay, delayj); in rxrpc_input_call_event()
475 timer_reduce(&call->timer, nextj); in rxrpc_input_call_event()
481 if (__rxrpc_call_is_complete(call)) { in rxrpc_input_call_event()
482 del_timer_sync(&call->timer); in rxrpc_input_call_event()
483 if (!test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) in rxrpc_input_call_event()
484 rxrpc_disconnect_call(call); in rxrpc_input_call_event()
485 if (call->security) in rxrpc_input_call_event()
486 call->security->free_call_crypto(call); in rxrpc_input_call_event()
488 if (call->acks_hard_ack != call->tx_bottom) in rxrpc_input_call_event()
489 rxrpc_shrink_call_tx_buffer(call); in rxrpc_input_call_event()
494 if (test_bit(RXRPC_CALL_RX_HEARD, &call->flags) && in rxrpc_input_call_event()
495 (int)call->conn->hi_serial - (int)call->rx_serial > 0) { in rxrpc_input_call_event()
496 trace_rxrpc_call_reset(call); in rxrpc_input_call_event()
497 rxrpc_abort_call(call, 0, RX_CALL_DEAD, -ECONNRESET, in rxrpc_input_call_event()
500 rxrpc_abort_call(call, 0, RX_CALL_TIMEOUT, -ETIME, in rxrpc_input_call_event()