Background This change adds kernel and userspace support for SO_TXTIME in AF_XDP to include a specific TXTIME (aka "Launch Time") with XDP frames issued from userspace XDP applications. This feature may be used in conjunction with application-based traffic shaping methods to delay less critical traffic and prioritize latency sensitive packets to meet a desired QoS. Implementation notes The timestamp is stored in the XDP metadata area and passed down to the NIC driver to configure the launch time. The timestamp is internally conveyed to the sk_buff destined to generic mode NIC drivers. Alternatively, it may be read via a new Zero-Copy driver API. The structure of XDP metadata that stores the TXTIME takes a form (Shown below) that is aligned to ongoing work in the community for describing XDP metadata using BTF: struct xdp_user_tx_metadata { __u64 timestamp; __u32 md_valid; __u32 btf_id; }; On the control path from userspace XDP applications, this change repurposes the SO_TXTIME socket option to harness this feature, and adopts the above metadata struct for storing the TXTIME. The (libbpf) userspace API has been expanded with two helper functons: - int xsk_socket__enable_so_txtime(struct xsk_socket *xsk, bool enable) Sets the SO_TXTIME option on the AF_XDP socket (using setsockopt()). - void xsk_umem__set_md_txtime(void *umem_area, __u64 chunkAddr, __s64 txtime) Packages the application supplied TXTIME into the above md struct and stores it in the XDP metadata area, which precedes the XDP frame. In practice, a userspace XDP application must ensure the following: * Store the XDP packet at the location following the XDP metadata area: uint8_t *pkt = xsk_umem__get_data(xsk.buffer, chunkAddr) + sizeof(struct xdp_user_tx_metadata); * Correctly set the pkt addr in the TX descriptor: tx_desc->addr = chunkAddr + sizeof(struct xdp_user_tx_metadata); * Signal the kernel that it included metadata by setting the TX descriptor options: tx_desc->options = XDP_DESC_OPTION_METADATA; In the NIC driver, a new XSK Zero-Copy Driver API: s64 xsk_buff_get_txtime(struct xsk_buff_pool *pool, struct xdp_desc *desc) is used to retrieve and consume a Launch Time provided by the userspace XDP application. Accompanying the kernel and userspace changes are the following updates: * Launch Time support along the XDP ZC path in the IGC driver by exercising the new XSK ZC driver API. * SO_TXTIME support in the xdpsock sample application to illustrate the userspace API. Jithu Joseph (3): igc: Launchtime support in XDP Tx ZC path samples/bpf/xdpsock_user.c: Make get_nsecs() generic samples/bpf/xdpsock_user.c: Launchtime/TXTIME API usage Kishen Maloor (2): net: xdp: SO_TXTIME support in AF_XDP libbpf: SO_TXTIME support in AF_XDP drivers/net/ethernet/intel/igc/igc_main.c | 49 ++++++++++++++- include/net/xdp_sock.h | 1 + include/net/xdp_sock_drv.h | 10 +++ include/net/xsk_buff_pool.h | 1 + include/uapi/linux/if_xdp.h | 2 + include/uapi/linux/xdp_md_std.h | 14 +++++ net/xdp/xsk.c | 51 +++++++++++++++- net/xdp/xsk.h | 2 + net/xdp/xsk_buff_pool.c | 23 +++++++ net/xdp/xsk_queue.h | 4 +- samples/bpf/xdpsock_user.c | 74 ++++++++++++++++++++--- tools/include/uapi/linux/if_xdp.h | 2 + tools/include/uapi/linux/xdp_md_std.h | 14 +++++ tools/lib/bpf/xsk.h | 27 ++++++++- 14 files changed, 258 insertions(+), 16 deletions(-) create mode 100644 include/uapi/linux/xdp_md_std.h create mode 100644 tools/include/uapi/linux/xdp_md_std.h -- 2.24.3 (Apple Git-128)