• Willem de Bruijn's avatar
    net-timestamp: allow reading recv cmsg on errqueue with origin tstamp · 829ae9d6
    Willem de Bruijn authored
    Allow reading of timestamps and cmsg at the same time on all relevant
    socket families. One use is to correlate timestamps with egress
    device, by asking for cmsg IP_PKTINFO.
    
    on AF_INET sockets, call the relevant function (ip_cmsg_recv). To
    avoid changing legacy expectations, only do so if the caller sets a
    new timestamping flag SOF_TIMESTAMPING_OPT_CMSG.
    
    on AF_INET6 sockets, IPV6_PKTINFO and all other recv cmsg are already
    returned for all origins. only change is to set ifindex, which is
    not initialized for all error origins.
    
    In both cases, only generate the pktinfo message if an ifindex is
    known. This is not the case for ACK timestamps.
    
    The difference between the protocol families is probably a historical
    accident as a result of the different conditions for generating cmsg
    in the relevant ip(v6)_recv_error function:
    
    ipv4:        if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP) {
    ipv6:        if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) {
    
    At one time, this was the same test bar for the ICMP/ICMP6
    distinction. This is no longer true.
    Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
    
    ----
    
    Changes
      v1 -> v2
        large rewrite
        - integrate with existing pktinfo cmsg generation code
        - on ipv4: only send with new flag, to maintain legacy behavior
        - on ipv6: send at most a single pktinfo cmsg
        - on ipv6: initialize fields if not yet initialized
    
    The recv cmsg interfaces are also relevant to the discussion of
    whether looping packet headers is problematic. For v6, cmsgs that
    identify many headers are already returned. This patch expands
    that to v4. If it sounds reasonable, I will follow with patches
    
    1. request timestamps without payload with SOF_TIMESTAMPING_OPT_TSONLY
       (http://patchwork.ozlabs.org/patch/366967/)
    2. sysctl to conditionally drop all timestamps that have payload or
       cmsg from users without CAP_NET_RAW.
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    829ae9d6
ip_sockglue.c 32.5 KB