History

net-timestamp: allow reading recv cmsg on errqueue with origin tstamp

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: Willem 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: David S. Miller <davem@davemloft.net>

Willem de Bruijn committed 11 years ago

Commit 829ae9d1 parent 7ce875e4 files · +52 −6Browse files

Showing the changes to include/uapi/linux (1 of 4 files). Show all

Unified · Split

include/uapi/linux/net_tstamp.h+2−1
@@ -23,8 +23,9 @@ enum { · 22 unmodified lines
2323 SOF_TIMESTAMPING_OPT_ID = (1<<7),
2424 SOF_TIMESTAMPING_TX_SCHED = (1<<8),
2525 SOF_TIMESTAMPING_TX_ACK = (1<<9),
26+ SOF_TIMESTAMPING_OPT_CMSG = (1<<10),
2627
27− SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_TX_ACK,
28+ SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_CMSG,
2829 SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) |
2930 SOF_TIMESTAMPING_LAST
3031 };