aboutsummaryrefslogtreecommitdiffstats
path: root/net/rxrpc/output.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-09-22 00:29:31 +0100
committerDavid Howells <dhowells@redhat.com>2016-09-22 08:21:24 +0100
commit50235c4b5a2fb9a9690f02cd1dea6ca047d7f79e (patch)
tree3dc5a178820b16d5eaef0484fe7751cb4f71375e /net/rxrpc/output.c
parentrxrpc: Add ktime_sub_ms() (diff)
downloadlinux-dev-50235c4b5a2fb9a9690f02cd1dea6ca047d7f79e.tar.xz
linux-dev-50235c4b5a2fb9a9690f02cd1dea6ca047d7f79e.zip
rxrpc: Obtain RTT data by requesting ACKs on DATA packets
In addition to sending a PING ACK to gain RTT data, we can set the RXRPC_REQUEST_ACK flag on a DATA packet and get a REQUESTED-ACK ACK. The ACK packet contains the serial number of the packet it is in response to, so we can look through the Tx buffer for a matching DATA packet. This requires that the data packets be stamped with the time of transmission as a ktime rather than having the resend_at time in jiffies. This further requires the resend code to do the resend determination in ktimes and convert to jiffies to set the timer. Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'net/rxrpc/output.c')
-rw-r--r--net/rxrpc/output.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c
index 0d89cd3f2c01..db01fbb70d23 100644
--- a/net/rxrpc/output.c
+++ b/net/rxrpc/output.c
@@ -300,9 +300,12 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb)
goto send_fragmentable;
done:
- if (ret == 0) {
- sp->resend_at = jiffies + rxrpc_resend_timeout;
+ if (ret >= 0) {
+ skb->tstamp = ktime_get_real();
+ smp_wmb();
sp->hdr.serial = serial;
+ if (whdr.flags & RXRPC_REQUEST_ACK)
+ trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_data, serial);
}
_leave(" = %d [%u]", ret, call->peer->maxdata);
return ret;