• Martin KaFai Lau's avatar
    tcp: Make use of MSG_EOR in tcp_sendmsg · c134ecb8
    Martin KaFai Lau authored
    This patch adds an eor bit to the TCP_SKB_CB.  When MSG_EOR
    is passed to tcp_sendmsg, the eor bit will be set at the skb
    containing the last byte of the userland's msg.  The eor bit
    will prevent data from appending to that skb in the future.
    
    The change in do_tcp_sendpages is to honor the eor set
    during the previous tcp_sendmsg(MSG_EOR) call.
    
    This patch handles the tcp_sendmsg case.  The followup patches
    will handle other skb coalescing and fragment cases.
    
    One potential use case is to use MSG_EOR with
    SOF_TIMESTAMPING_TX_ACK to get a more accurate
    TCP ack timestamping on application protocol with
    multiple outgoing response messages (e.g. HTTP2).
    
    Packetdrill script for testing:
    ~~~~~~
    +0 `sysctl -q -w net.ipv4.tcp_min_tso_segs=10`
    +0 `sysctl -q -w net.ipv4.tcp_no_metrics_save=1`
    +0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
    +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
    +0 bind(3, ..., ...) = 0
    +0 listen(3, 1) = 0
    
    0.100 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 7>
    0.100 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 7>
    0.200 < . 1:1(0) ack 1 win 257
    0.200 accept(3, ..., ...) = 4
    +0 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
    
    0.200 write(4, ..., 14600) = 14600
    0.200 sendto(4, ..., 730, MSG_EOR, ..., ...) = 730
    0.200 sendto(4, ..., 730, MSG_EOR, ..., ...) = 730
    
    0.200 > .  1:7301(7300) ack 1
    0.200 > P. 7301:14601(7300) ack 1
    
    0.300 < . 1:1(0) ack 14601 win 257
    0.300 > P. 14601:15331(730) ack 1
    0.300 > P. 15331:16061(730) ack 1
    
    0.400 < . 1:1(0) ack 16061 win 257
    0.400 close(4) = 0
    0.400 > F. 16061:16061(0) ack 1
    0.400 < F. 1:1(0) ack 16062 win 257
    0.400 > . 16062:16062(0) ack 2
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Cc: Soheil Hassas Yeganeh <soheil@google.com>
    Cc: Willem de Bruijn <willemb@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Suggested-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c134ecb8
tcp.c 84.2 KB