Commit bf7d620a authored by David Howells's avatar David Howells

rxrpc: Don't request an ACK on the last DATA packet of a call's Tx phase

Don't request an ACK on the last DATA packet of a call's Tx phase as for a
client there will be a reply packet or some sort of ACK to shift phase.  If
the ACK is requested, OpenAFS sends a REQUESTED-ACK ACK with soft-ACKs in
it and doesn't follow up with a hard-ACK.

If we don't set the flag, OpenAFS will send a DELAY ACK that hard-ACKs the
reply data, thereby allowing the call to terminate cleanly.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 9749fd2b
...@@ -307,11 +307,12 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb, ...@@ -307,11 +307,12 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
/* If our RTT cache needs working on, request an ACK. Also request /* If our RTT cache needs working on, request an ACK. Also request
* ACKs if a DATA packet appears to have been lost. * ACKs if a DATA packet appears to have been lost.
*/ */
if (retrans || if (!(sp->hdr.flags & RXRPC_LAST_PACKET) &&
call->cong_mode == RXRPC_CALL_SLOW_START || (retrans ||
(call->peer->rtt_usage < 3 && sp->hdr.seq & 1) || call->cong_mode == RXRPC_CALL_SLOW_START ||
ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), (call->peer->rtt_usage < 3 && sp->hdr.seq & 1) ||
ktime_get_real())) ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000),
ktime_get_real())))
whdr.flags |= RXRPC_REQUEST_ACK; whdr.flags |= RXRPC_REQUEST_ACK;
if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) { if (IS_ENABLED(CONFIG_AF_RXRPC_INJECT_LOSS)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment