• Martin KaFai Lau's avatar
    net: Add skb->mono_delivery_time to distinguish mono delivery_time from (rcv) timestamp · a1ac9c8a
    Martin KaFai Lau authored
    skb->tstamp was first used as the (rcv) timestamp.
    The major usage is to report it to the user (e.g. SO_TIMESTAMP).
    
    Later, skb->tstamp is also set as the (future) delivery_time (e.g. EDT in TCP)
    during egress and used by the qdisc (e.g. sch_fq) to make decision on when
    the skb can be passed to the dev.
    
    Currently, there is no way to tell skb->tstamp having the (rcv) timestamp
    or the delivery_time, so it is always reset to 0 whenever forwarded
    between egress and ingress.
    
    While it makes sense to always clear the (rcv) timestamp in skb->tstamp
    to avoid confusing sch_fq that expects the delivery_time, it is a
    performance issue [0] to clear the delivery_time if the skb finally
    egress to a fq@phy-dev.  For example, when forwarding from egress to
    ingress and then finally back to egress:
    
                tcp-sender => veth@netns => veth@hostns => fq@eth0@hostns
                                         ^              ^
                                         reset          rest
    
    This patch adds one bit skb->mono_delivery_time to flag the skb->tstamp
    is storing the mono delivery_time (EDT) instead of the (rcv) timestamp.
    
    The current use case is to keep the TCP mono delivery_time (EDT) and
    to be used with sch_fq.  A latter patch will also allow tc-bpf@ingress
    to read and change the mono delivery_time.
    
    In the future, another bit (e.g. skb->user_delivery_time) can be added
    for the SCM_TXTIME where the clock base is tracked by sk->sk_clockid.
    
    [ This patch is a prep work.  The following patches will
      get the other parts of the stack ready first.  Then another patch
      after that will finally set the skb->mono_delivery_time. ]
    
    skb_set_delivery_time() function is added.  It is used by the tcp_output.c
    and during ip[6] fragmentation to assign the delivery_time to
    the skb->tstamp and also set the skb->mono_delivery_time.
    
    A note on the change in ip_send_unicast_reply() in ip_output.c.
    It is only used by TCP to send reset/ack out of a ctl_sk.
    Like the new skb_set_delivery_time(), this patch sets
    the skb->mono_delivery_time to 0 for now as a place
    holder.  It will be enabled in a latter patch.
    A similar case in tcp_ipv6 can be done with
    skb_set_delivery_time() in tcp_v6_send_response().
    
    [0] (slide 22): https://linuxplumbersconf.org/event/11/contributions/953/attachments/867/1658/LPC_2021_BPF_Datapath_Extensions.pdfSigned-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a1ac9c8a
tcp_ipv6.c 57.7 KB