1===============
2XDP RX Metadata
3===============
4
5This document describes how an eXpress Data Path (XDP) program can access
6hardware metadata related to a packet using a set of helper functions,
7and how it can pass that metadata on to other consumers.
8
9General Design
10==============
11
12XDP has access to a set of kfuncs to manipulate the metadata in an XDP frame.
13Every device driver that wishes to expose additional packet metadata can
14implement these kfuncs. The set of kfuncs is declared in ``include/net/xdp.h``
15via ``XDP_METADATA_KFUNC_xxx``.
16
17Currently, the following kfuncs are supported. In the future, as more
18metadata is supported, this set will grow:
19
20.. kernel-doc:: net/core/xdp.c
21   :identifiers: bpf_xdp_metadata_rx_timestamp bpf_xdp_metadata_rx_hash
22
23An XDP program can use these kfuncs to read the metadata into stack
24variables for its own consumption. Or, to pass the metadata on to other
25consumers, an XDP program can store it into the metadata area carried
26ahead of the packet. Not all packets will necessary have the requested
27metadata available in which case the driver returns ``-ENODATA``.
28
29Not all kfuncs have to be implemented by the device driver; when not
30implemented, the default ones that return ``-EOPNOTSUPP`` will be used
31to indicate the device driver have not implemented this kfunc.
32
33
34Within an XDP frame, the metadata layout (accessed via ``xdp_buff``) is
35as follows::
36
37  +----------+-----------------+------+
38  | headroom | custom metadata | data |
39  +----------+-----------------+------+
40             ^                 ^
41             |                 |
42   xdp_buff->data_meta   xdp_buff->data
43
44An XDP program can store individual metadata items into this ``data_meta``
45area in whichever format it chooses. Later consumers of the metadata
46will have to agree on the format by some out of band contract (like for
47the AF_XDP use case, see below).
48
49AF_XDP
50======
51
52:doc:`af_xdp` use-case implies that there is a contract between the BPF
53program that redirects XDP frames into the ``AF_XDP`` socket (``XSK``) and
54the final consumer. Thus the BPF program manually allocates a fixed number of
55bytes out of metadata via ``bpf_xdp_adjust_meta`` and calls a subset
56of kfuncs to populate it. The userspace ``XSK`` consumer computes
57``xsk_umem__get_data() - METADATA_SIZE`` to locate that metadata.
58Note, ``xsk_umem__get_data`` is defined in ``libxdp`` and
59``METADATA_SIZE`` is an application-specific constant (``AF_XDP`` receive
60descriptor does _not_ explicitly carry the size of the metadata).
61
62Here is the ``AF_XDP`` consumer layout (note missing ``data_meta`` pointer)::
63
64  +----------+-----------------+------+
65  | headroom | custom metadata | data |
66  +----------+-----------------+------+
67                               ^
68                               |
69                        rx_desc->address
70
71XDP_PASS
72========
73
74This is the path where the packets processed by the XDP program are passed
75into the kernel. The kernel creates the ``skb`` out of the ``xdp_buff``
76contents. Currently, every driver has custom kernel code to parse
77the descriptors and populate ``skb`` metadata when doing this ``xdp_buff->skb``
78conversion, and the XDP metadata is not used by the kernel when building
79``skbs``. However, TC-BPF programs can access the XDP metadata area using
80the ``data_meta`` pointer.
81
82In the future, we'd like to support a case where an XDP program
83can override some of the metadata used for building ``skbs``.
84
85bpf_redirect_map
86================
87
88``bpf_redirect_map`` can redirect the frame to a different device.
89Some devices (like virtual ethernet links) support running a second XDP
90program after the redirect. However, the final consumer doesn't have
91access to the original hardware descriptor and can't access any of
92the original metadata. The same applies to XDP programs installed
93into devmaps and cpumaps.
94
95This means that for redirected packets only custom metadata is
96currently supported, which has to be prepared by the initial XDP program
97before redirect. If the frame is eventually passed to the kernel, the
98``skb`` created from such a frame won't have any hardware metadata populated
99in its ``skb``. If such a packet is later redirected into an ``XSK``,
100that will also only have access to the custom metadata.
101
102bpf_tail_call
103=============
104
105Adding programs that access metadata kfuncs to the ``BPF_MAP_TYPE_PROG_ARRAY``
106is currently not supported.
107
108Supported Devices
109=================
110
111It is possible to query which kfunc the particular netdev implements via
112netlink. See ``xdp-rx-metadata-features`` attribute set in
113``Documentation/netlink/specs/netdev.yaml``.
114
115Example
116=======
117
118See ``tools/testing/selftests/bpf/progs/xdp_metadata.c`` and
119``tools/testing/selftests/bpf/prog_tests/xdp_metadata.c`` for an example of
120BPF program that handles XDP metadata.
121