rxrpc: Schedule an ACK if the reply to a client call appears overdue
If we've sent all the request data in a client call but haven't seen any sign of the reply data yet, schedule an ACK to be sent to the server to find out if the reply data got lost. If the server hasn't yet hard-ACK'd the request data, we send a PING ACK to demand a response to find out whether we need to retransmit. If the server says it has received all of the data, we send an IDLE ACK to tell the server that we haven't received anything in the receive phase as yet. To make this work, a non-immediate PING ACK must carry a delay. I've chosen the same as the IDLE ACK for the moment. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
parent
31a1b98950
commit
0d967960d3
@ -707,7 +707,9 @@ enum rxrpc_timer_trace {
|
||||
extern const char rxrpc_timer_traces[rxrpc_timer__nr_trace][8];
|
||||
|
||||
enum rxrpc_propose_ack_trace {
|
||||
rxrpc_propose_ack_client_tx_end,
|
||||
rxrpc_propose_ack_input_data,
|
||||
rxrpc_propose_ack_ping_for_lost_reply,
|
||||
rxrpc_propose_ack_ping_for_params,
|
||||
rxrpc_propose_ack_respond_to_ack,
|
||||
rxrpc_propose_ack_respond_to_ping,
|
||||
|
@ -100,6 +100,7 @@ static void __rxrpc_propose_ACK(struct rxrpc_call *call, u8 ack_reason,
|
||||
expiry = rxrpc_soft_ack_delay;
|
||||
break;
|
||||
|
||||
case RXRPC_ACK_PING:
|
||||
case RXRPC_ACK_IDLE:
|
||||
if (rxrpc_idle_ack_delay < expiry)
|
||||
expiry = rxrpc_idle_ack_delay;
|
||||
|
@ -138,6 +138,8 @@ static bool rxrpc_end_tx_phase(struct rxrpc_call *call, bool reply_begun,
|
||||
|
||||
write_unlock(&call->state_lock);
|
||||
if (call->state == RXRPC_CALL_CLIENT_AWAIT_REPLY) {
|
||||
rxrpc_propose_ACK(call, RXRPC_ACK_IDLE, 0, 0, false, true,
|
||||
rxrpc_propose_ack_client_tx_end);
|
||||
trace_rxrpc_transmit(call, rxrpc_transmit_await_reply);
|
||||
} else {
|
||||
trace_rxrpc_transmit(call, rxrpc_transmit_end);
|
||||
@ -684,6 +686,12 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
|
||||
return;
|
||||
}
|
||||
|
||||
if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] &
|
||||
RXRPC_TX_ANNO_LAST &&
|
||||
summary.nr_acks == call->tx_top - hard_ack)
|
||||
rxrpc_propose_ACK(call, RXRPC_ACK_PING, skew, sp->hdr.serial,
|
||||
false, true,
|
||||
rxrpc_propose_ack_ping_for_lost_reply);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -198,7 +198,9 @@ const char rxrpc_timer_traces[rxrpc_timer__nr_trace][8] = {
|
||||
};
|
||||
|
||||
const char rxrpc_propose_ack_traces[rxrpc_propose_ack__nr_trace][8] = {
|
||||
[rxrpc_propose_ack_client_tx_end] = "ClTxEnd",
|
||||
[rxrpc_propose_ack_input_data] = "DataIn ",
|
||||
[rxrpc_propose_ack_ping_for_lost_reply] = "LostRpl",
|
||||
[rxrpc_propose_ack_ping_for_params] = "Params ",
|
||||
[rxrpc_propose_ack_respond_to_ack] = "Rsp2Ack",
|
||||
[rxrpc_propose_ack_respond_to_ping] = "Rsp2Png",
|
||||
|
Loading…
Reference in New Issue
Block a user