rxrpc: Reinitialise the call ACK and timer state for client reply phase
authorDavid Howells <dhowells@redhat.com>
Sat, 24 Sep 2016 17:05:27 +0000 (18:05 +0100)
committerDavid Howells <dhowells@redhat.com>
Sat, 24 Sep 2016 22:49:46 +0000 (23:49 +0100)
Clear the ACK reason, ACK timer and resend timer when entering the client
reply phase when the first DATA packet is received.  New ACKs will be
proposed once the data is queued.

The resend timer is no longer relevant and we need to cancel ACKs scheduled
to probe for a lost reply.

Signed-off-by: David Howells <dhowells@redhat.com>
net/rxrpc/ar-internal.h
net/rxrpc/input.c
net/rxrpc/misc.c

index e3bf9c0e3ad113e19a535c2acad2a797516e9373..cdd35e2b40bab204efa8662ba1642c2120748f9b 100644 (file)
@@ -682,6 +682,7 @@ extern const char rxrpc_rtt_rx_traces[rxrpc_rtt_rx__nr_trace][5];
 
 enum rxrpc_timer_trace {
        rxrpc_timer_begin,
+       rxrpc_timer_init_for_reply,
        rxrpc_timer_expired,
        rxrpc_timer_set_for_ack,
        rxrpc_timer_set_for_resend,
index 757c16f033a074d8c7a23a2d287d21833b322710..bda11eb2ab2ad2de51aded7542753495d8a52690 100644 (file)
@@ -149,6 +149,15 @@ static bool rxrpc_receiving_reply(struct rxrpc_call *call)
 {
        rxrpc_seq_t top = READ_ONCE(call->tx_top);
 
+       if (call->ackr_reason) {
+               spin_lock_bh(&call->lock);
+               call->ackr_reason = 0;
+               call->resend_at = call->expire_at;
+               call->ack_at = call->expire_at;
+               spin_unlock_bh(&call->lock);
+               rxrpc_set_timer(call, rxrpc_timer_init_for_reply);
+       }
+
        if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags))
                rxrpc_rotate_tx_window(call, top);
        if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags)) {
index a473fd7dabaa0f9564766a785c56d49a87f091c3..901c012a2700f7b6160223f904d691fb8882ebbb 100644 (file)
@@ -191,6 +191,7 @@ const char rxrpc_rtt_rx_traces[rxrpc_rtt_rx__nr_trace][5] = {
 const char rxrpc_timer_traces[rxrpc_timer__nr_trace][8] = {
        [rxrpc_timer_begin]                     = "Begin ",
        [rxrpc_timer_expired]                   = "*EXPR*",
+       [rxrpc_timer_init_for_reply]            = "IniRpl",
        [rxrpc_timer_set_for_ack]               = "SetAck",
        [rxrpc_timer_set_for_send]              = "SetTx ",
        [rxrpc_timer_set_for_resend]            = "SetRTx",