Lines Matching refs:call

48 static void rxrpc_tx_backoff(struct rxrpc_call *call, int ret)  in rxrpc_tx_backoff()  argument
51 if (call->tx_backoff < 1000) in rxrpc_tx_backoff()
52 call->tx_backoff += 100; in rxrpc_tx_backoff()
54 call->tx_backoff = 0; in rxrpc_tx_backoff()
66 static void rxrpc_set_keepalive(struct rxrpc_call *call, ktime_t now) in rxrpc_set_keepalive() argument
68 ktime_t delay = ms_to_ktime(READ_ONCE(call->next_rx_timo) / 6); in rxrpc_set_keepalive()
70 call->keepalive_at = ktime_add(ktime_get_real(), delay); in rxrpc_set_keepalive()
71 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_keepalive); in rxrpc_set_keepalive()
77 static void rxrpc_fill_out_ack(struct rxrpc_call *call, in rxrpc_fill_out_ack() argument
92 rxrpc_inc_stat(call->rxnet, stat_tx_ack_fill); in rxrpc_fill_out_ack()
94 window = call->ackr_window; in rxrpc_fill_out_ack()
95 wtop = call->ackr_wtop; in rxrpc_fill_out_ack()
96 sack = call->ackr_sack_base % RXRPC_SACK_SIZE; in rxrpc_fill_out_ack()
104 ack->previousPacket = htonl(call->rx_highest_seq); in rxrpc_fill_out_ack()
124 memcpy(sackp, call->ackr_sack_table + sack, ack->nAcks); in rxrpc_fill_out_ack()
126 memcpy(sackp, call->ackr_sack_table + sack, wrap); in rxrpc_fill_out_ack()
127 memcpy(sackp + wrap, call->ackr_sack_table, to - wrap); in rxrpc_fill_out_ack()
135 mtu = call->peer->if_mtu; in rxrpc_fill_out_ack()
136 mtu -= call->peer->hdrsize; in rxrpc_fill_out_ack()
138 qsize = (window - 1) - call->rx_consumed; in rxrpc_fill_out_ack()
139 rsize = max_t(int, call->rx_winsize - qsize, 0); in rxrpc_fill_out_ack()
150 static void rxrpc_begin_rtt_probe(struct rxrpc_call *call, rxrpc_serial_t serial, in rxrpc_begin_rtt_probe() argument
153 unsigned long avail = call->rtt_avail; in rxrpc_begin_rtt_probe()
160 if (!test_and_clear_bit(rtt_slot, &call->rtt_avail)) in rxrpc_begin_rtt_probe()
163 call->rtt_serial[rtt_slot] = serial; in rxrpc_begin_rtt_probe()
164 call->rtt_sent_at[rtt_slot] = now; in rxrpc_begin_rtt_probe()
166 set_bit(rtt_slot + RXRPC_CALL_RTT_PEND_SHIFT, &call->rtt_avail); in rxrpc_begin_rtt_probe()
168 trace_rxrpc_rtt_tx(call, why, rtt_slot, serial); in rxrpc_begin_rtt_probe()
172 trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_no_slot, rtt_slot, serial); in rxrpc_begin_rtt_probe()
178 static void rxrpc_send_ack_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) in rxrpc_send_ack_packet() argument
187 if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) in rxrpc_send_ack_packet()
190 conn = call->conn; in rxrpc_send_ack_packet()
192 msg.msg_name = &call->peer->srx.transport; in rxrpc_send_ack_packet()
193 msg.msg_namelen = call->peer->srx.transport_len; in rxrpc_send_ack_packet()
202 trace_rxrpc_tx_ack(call->debug_id, txb->serial, in rxrpc_send_ack_packet()
207 rxrpc_inc_stat(call->rxnet, stat_tx_ack_send); in rxrpc_send_ack_packet()
212 call->peer->last_tx_at = ktime_get_seconds(); in rxrpc_send_ack_packet()
214 trace_rxrpc_tx_fail(call->debug_id, txb->serial, ret, in rxrpc_send_ack_packet()
217 trace_rxrpc_tx_packet(call->debug_id, whdr, in rxrpc_send_ack_packet()
221 rxrpc_begin_rtt_probe(call, txb->serial, now, rxrpc_rtt_tx_ping); in rxrpc_send_ack_packet()
223 call->peer->rtt_last_req = now; in rxrpc_send_ack_packet()
224 rxrpc_set_keepalive(call, now); in rxrpc_send_ack_packet()
226 rxrpc_tx_backoff(call, ret); in rxrpc_send_ack_packet()
232 void rxrpc_send_ACK(struct rxrpc_call *call, u8 ack_reason, in rxrpc_send_ACK() argument
237 if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) in rxrpc_send_ACK()
240 rxrpc_inc_stat(call->rxnet, stat_tx_acks[ack_reason]); in rxrpc_send_ACK()
242 txb = rxrpc_alloc_ack_txbuf(call, call->ackr_wtop - call->ackr_window); in rxrpc_send_ACK()
250 rxrpc_fill_out_ack(call, txb, ack_reason, serial); in rxrpc_send_ACK()
251 call->ackr_nr_unacked = 0; in rxrpc_send_ACK()
252 atomic_set(&call->ackr_nr_consumed, 0); in rxrpc_send_ACK()
253 clear_bit(RXRPC_CALL_RX_IS_IDLE, &call->flags); in rxrpc_send_ACK()
255 trace_rxrpc_send_ack(call, why, ack_reason, serial); in rxrpc_send_ACK()
256 rxrpc_send_ack_packet(call, txb); in rxrpc_send_ACK()
263 int rxrpc_send_abort_packet(struct rxrpc_call *call) in rxrpc_send_abort_packet() argument
278 if (rxrpc_is_client_call(call) && in rxrpc_send_abort_packet()
279 test_bit(RXRPC_CALL_TX_ALL_ACKED, &call->flags)) in rxrpc_send_abort_packet()
282 if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) in rxrpc_send_abort_packet()
285 conn = call->conn; in rxrpc_send_abort_packet()
287 msg.msg_name = &call->peer->srx.transport; in rxrpc_send_abort_packet()
288 msg.msg_namelen = call->peer->srx.transport_len; in rxrpc_send_abort_packet()
294 pkt.whdr.cid = htonl(call->cid); in rxrpc_send_abort_packet()
295 pkt.whdr.callNumber = htonl(call->call_id); in rxrpc_send_abort_packet()
300 pkt.whdr.securityIndex = call->security_ix; in rxrpc_send_abort_packet()
302 pkt.whdr.serviceId = htons(call->dest_srx.srx_service); in rxrpc_send_abort_packet()
303 pkt.abort_code = htonl(call->abort_code); in rxrpc_send_abort_packet()
315 trace_rxrpc_tx_fail(call->debug_id, serial, ret, in rxrpc_send_abort_packet()
318 trace_rxrpc_tx_packet(call->debug_id, &pkt.whdr, in rxrpc_send_abort_packet()
320 rxrpc_tx_backoff(call, ret); in rxrpc_send_abort_packet()
327 static void rxrpc_prepare_data_subpacket(struct rxrpc_call *call, struct rxrpc_txbuf *txb, in rxrpc_prepare_data_subpacket() argument
332 struct rxrpc_connection *conn = call->conn; in rxrpc_prepare_data_subpacket()
353 else if (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events)) in rxrpc_prepare_data_subpacket()
357 else if (call->cong_mode == RXRPC_CALL_SLOW_START && call->cong_cwnd <= 2) in rxrpc_prepare_data_subpacket()
359 else if (call->tx_winsize <= 2) in rxrpc_prepare_data_subpacket()
361 else if (call->peer->rtt_count < 3 && txb->seq & 1) in rxrpc_prepare_data_subpacket()
363 else if (ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), ktime_get_real())) in rxrpc_prepare_data_subpacket()
368 rxrpc_inc_stat(call->rxnet, stat_why_req_ack[why]); in rxrpc_prepare_data_subpacket()
369 trace_rxrpc_req_ack(call->debug_id, txb->seq, why); in rxrpc_prepare_data_subpacket()
378 trace_rxrpc_tx_data(call, txb->seq, txb->serial, txb->flags, false); in rxrpc_prepare_data_subpacket()
384 static size_t rxrpc_prepare_data_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) in rxrpc_prepare_data_packet() argument
389 serial = rxrpc_get_next_serial(call->conn); in rxrpc_prepare_data_packet()
391 rxrpc_prepare_data_subpacket(call, txb, serial); in rxrpc_prepare_data_packet()
399 static void rxrpc_tstamp_data_packets(struct rxrpc_call *call, struct rxrpc_txbuf *txb) in rxrpc_tstamp_data_packets() argument
404 call->tx_last_sent = now; in rxrpc_tstamp_data_packets()
408 rxrpc_begin_rtt_probe(call, txb->serial, now, rxrpc_rtt_tx_data); in rxrpc_tstamp_data_packets()
410 call->peer->rtt_last_req = now; in rxrpc_tstamp_data_packets()
411 if (call->peer->rtt_count > 1) { in rxrpc_tstamp_data_packets()
412 ktime_t delay = rxrpc_get_rto_backoff(call->peer, false); in rxrpc_tstamp_data_packets()
414 call->ack_lost_at = ktime_add(now, delay); in rxrpc_tstamp_data_packets()
415 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_lost_ack); in rxrpc_tstamp_data_packets()
419 if (!test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER, &call->flags)) { in rxrpc_tstamp_data_packets()
420 ktime_t delay = ms_to_ktime(READ_ONCE(call->next_rx_timo)); in rxrpc_tstamp_data_packets()
422 call->expect_rx_by = ktime_add(now, delay); in rxrpc_tstamp_data_packets()
423 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_expect_rx); in rxrpc_tstamp_data_packets()
426 rxrpc_set_keepalive(call, now); in rxrpc_tstamp_data_packets()
432 static int rxrpc_send_data_packet(struct rxrpc_call *call, struct rxrpc_txbuf *txb) in rxrpc_send_data_packet() argument
435 struct rxrpc_connection *conn = call->conn; in rxrpc_send_data_packet()
443 len = rxrpc_prepare_data_packet(call, txb); in rxrpc_send_data_packet()
449 trace_rxrpc_tx_data(call, txb->seq, txb->serial, in rxrpc_send_data_packet()
457 msg.msg_name = &call->peer->srx.transport; in rxrpc_send_data_packet()
458 msg.msg_namelen = call->peer->srx.transport_len; in rxrpc_send_data_packet()
467 if (txb->seq == call->tx_transmitted + 1) in rxrpc_send_data_packet()
468 call->tx_transmitted = txb->seq; in rxrpc_send_data_packet()
472 if (txb->len >= call->peer->maxdata) { in rxrpc_send_data_packet()
487 rxrpc_inc_stat(call->rxnet, stat_tx_data_send); in rxrpc_send_data_packet()
492 rxrpc_inc_stat(call->rxnet, stat_tx_data_send_fail); in rxrpc_send_data_packet()
493 trace_rxrpc_tx_fail(call->debug_id, txb->serial, ret, frag); in rxrpc_send_data_packet()
495 trace_rxrpc_tx_packet(call->debug_id, whdr, frag); in rxrpc_send_data_packet()
498 rxrpc_tx_backoff(call, ret); in rxrpc_send_data_packet()
507 rxrpc_tstamp_data_packets(call, txb); in rxrpc_send_data_packet()
514 if (!test_and_set_bit(RXRPC_CALL_BEGAN_RX_TIMER, &call->flags)) in rxrpc_send_data_packet()
515 rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR, in rxrpc_send_data_packet()
519 _leave(" = %d [%u]", ret, call->peer->maxdata); in rxrpc_send_data_packet()
699 static inline void rxrpc_instant_resend(struct rxrpc_call *call, in rxrpc_instant_resend() argument
702 if (!__rxrpc_call_is_complete(call)) in rxrpc_instant_resend()
709 void rxrpc_transmit_one(struct rxrpc_call *call, struct rxrpc_txbuf *txb) in rxrpc_transmit_one() argument
713 ret = rxrpc_send_data_packet(call, txb); in rxrpc_transmit_one()
719 rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR, in rxrpc_transmit_one()
724 rxrpc_instant_resend(call, txb); in rxrpc_transmit_one()
727 ktime_t delay = ns_to_ktime(call->peer->rto_us * NSEC_PER_USEC); in rxrpc_transmit_one()
729 call->resend_at = ktime_add(ktime_get_real(), delay); in rxrpc_transmit_one()
730 trace_rxrpc_timer_set(call, delay, rxrpc_timer_trace_resend_tx); in rxrpc_transmit_one()