xref: /openbmc/linux/Documentation/networking/xdp-rx-metadata.rst (revision 915efd8a446b74442039d31689d5d863caf82517)
1a4aeb9d6SStanislav Fomichev===============
2a4aeb9d6SStanislav FomichevXDP RX Metadata
3a4aeb9d6SStanislav Fomichev===============
4a4aeb9d6SStanislav Fomichev
5a4aeb9d6SStanislav FomichevThis document describes how an eXpress Data Path (XDP) program can access
6a4aeb9d6SStanislav Fomichevhardware metadata related to a packet using a set of helper functions,
7a4aeb9d6SStanislav Fomichevand how it can pass that metadata on to other consumers.
8a4aeb9d6SStanislav Fomichev
9a4aeb9d6SStanislav FomichevGeneral Design
10a4aeb9d6SStanislav Fomichev==============
11a4aeb9d6SStanislav Fomichev
12a4aeb9d6SStanislav FomichevXDP has access to a set of kfuncs to manipulate the metadata in an XDP frame.
13a4aeb9d6SStanislav FomichevEvery device driver that wishes to expose additional packet metadata can
14a4aeb9d6SStanislav Fomichevimplement these kfuncs. The set of kfuncs is declared in ``include/net/xdp.h``
15a4aeb9d6SStanislav Fomichevvia ``XDP_METADATA_KFUNC_xxx``.
16a4aeb9d6SStanislav Fomichev
17a4aeb9d6SStanislav FomichevCurrently, the following kfuncs are supported. In the future, as more
18a4aeb9d6SStanislav Fomichevmetadata is supported, this set will grow:
19a4aeb9d6SStanislav Fomichev
20a4aeb9d6SStanislav Fomichev.. kernel-doc:: net/core/xdp.c
21a4aeb9d6SStanislav Fomichev   :identifiers: bpf_xdp_metadata_rx_timestamp bpf_xdp_metadata_rx_hash
22a4aeb9d6SStanislav Fomichev
23a4aeb9d6SStanislav FomichevAn XDP program can use these kfuncs to read the metadata into stack
24a4aeb9d6SStanislav Fomichevvariables for its own consumption. Or, to pass the metadata on to other
25a4aeb9d6SStanislav Fomichevconsumers, an XDP program can store it into the metadata area carried
26*915efd8aSJesper Dangaard Brouerahead of the packet. Not all packets will necessary have the requested
27*915efd8aSJesper Dangaard Brouermetadata available in which case the driver returns ``-ENODATA``.
28a4aeb9d6SStanislav Fomichev
29a4aeb9d6SStanislav FomichevNot all kfuncs have to be implemented by the device driver; when not
30*915efd8aSJesper Dangaard Brouerimplemented, the default ones that return ``-EOPNOTSUPP`` will be used
31*915efd8aSJesper Dangaard Brouerto indicate the device driver have not implemented this kfunc.
32*915efd8aSJesper Dangaard Brouer
33a4aeb9d6SStanislav Fomichev
34a4aeb9d6SStanislav FomichevWithin an XDP frame, the metadata layout (accessed via ``xdp_buff``) is
35a4aeb9d6SStanislav Fomichevas follows::
36a4aeb9d6SStanislav Fomichev
37a4aeb9d6SStanislav Fomichev  +----------+-----------------+------+
38a4aeb9d6SStanislav Fomichev  | headroom | custom metadata | data |
39a4aeb9d6SStanislav Fomichev  +----------+-----------------+------+
40a4aeb9d6SStanislav Fomichev             ^                 ^
41a4aeb9d6SStanislav Fomichev             |                 |
42a4aeb9d6SStanislav Fomichev   xdp_buff->data_meta   xdp_buff->data
43a4aeb9d6SStanislav Fomichev
44a4aeb9d6SStanislav FomichevAn XDP program can store individual metadata items into this ``data_meta``
45a4aeb9d6SStanislav Fomichevarea in whichever format it chooses. Later consumers of the metadata
46a4aeb9d6SStanislav Fomichevwill have to agree on the format by some out of band contract (like for
47a4aeb9d6SStanislav Fomichevthe AF_XDP use case, see below).
48a4aeb9d6SStanislav Fomichev
49a4aeb9d6SStanislav FomichevAF_XDP
50a4aeb9d6SStanislav Fomichev======
51a4aeb9d6SStanislav Fomichev
52a4aeb9d6SStanislav Fomichev:doc:`af_xdp` use-case implies that there is a contract between the BPF
53a4aeb9d6SStanislav Fomichevprogram that redirects XDP frames into the ``AF_XDP`` socket (``XSK``) and
54a4aeb9d6SStanislav Fomichevthe final consumer. Thus the BPF program manually allocates a fixed number of
55a4aeb9d6SStanislav Fomichevbytes out of metadata via ``bpf_xdp_adjust_meta`` and calls a subset
56a4aeb9d6SStanislav Fomichevof kfuncs to populate it. The userspace ``XSK`` consumer computes
57a4aeb9d6SStanislav Fomichev``xsk_umem__get_data() - METADATA_SIZE`` to locate that metadata.
58a4aeb9d6SStanislav FomichevNote, ``xsk_umem__get_data`` is defined in ``libxdp`` and
59a4aeb9d6SStanislav Fomichev``METADATA_SIZE`` is an application-specific constant (``AF_XDP`` receive
60a4aeb9d6SStanislav Fomichevdescriptor does _not_ explicitly carry the size of the metadata).
61a4aeb9d6SStanislav Fomichev
62a4aeb9d6SStanislav FomichevHere is the ``AF_XDP`` consumer layout (note missing ``data_meta`` pointer)::
63a4aeb9d6SStanislav Fomichev
64a4aeb9d6SStanislav Fomichev  +----------+-----------------+------+
65a4aeb9d6SStanislav Fomichev  | headroom | custom metadata | data |
66a4aeb9d6SStanislav Fomichev  +----------+-----------------+------+
67a4aeb9d6SStanislav Fomichev                               ^
68a4aeb9d6SStanislav Fomichev                               |
69a4aeb9d6SStanislav Fomichev                        rx_desc->address
70a4aeb9d6SStanislav Fomichev
71a4aeb9d6SStanislav FomichevXDP_PASS
72a4aeb9d6SStanislav Fomichev========
73a4aeb9d6SStanislav Fomichev
74a4aeb9d6SStanislav FomichevThis is the path where the packets processed by the XDP program are passed
75a4aeb9d6SStanislav Fomichevinto the kernel. The kernel creates the ``skb`` out of the ``xdp_buff``
76a4aeb9d6SStanislav Fomichevcontents. Currently, every driver has custom kernel code to parse
77a4aeb9d6SStanislav Fomichevthe descriptors and populate ``skb`` metadata when doing this ``xdp_buff->skb``
78a4aeb9d6SStanislav Fomichevconversion, and the XDP metadata is not used by the kernel when building
79a4aeb9d6SStanislav Fomichev``skbs``. However, TC-BPF programs can access the XDP metadata area using
80a4aeb9d6SStanislav Fomichevthe ``data_meta`` pointer.
81a4aeb9d6SStanislav Fomichev
82a4aeb9d6SStanislav FomichevIn the future, we'd like to support a case where an XDP program
83a4aeb9d6SStanislav Fomichevcan override some of the metadata used for building ``skbs``.
84a4aeb9d6SStanislav Fomichev
85a4aeb9d6SStanislav Fomichevbpf_redirect_map
86a4aeb9d6SStanislav Fomichev================
87a4aeb9d6SStanislav Fomichev
88a4aeb9d6SStanislav Fomichev``bpf_redirect_map`` can redirect the frame to a different device.
89a4aeb9d6SStanislav FomichevSome devices (like virtual ethernet links) support running a second XDP
90a4aeb9d6SStanislav Fomichevprogram after the redirect. However, the final consumer doesn't have
91a4aeb9d6SStanislav Fomichevaccess to the original hardware descriptor and can't access any of
92a4aeb9d6SStanislav Fomichevthe original metadata. The same applies to XDP programs installed
93a4aeb9d6SStanislav Fomichevinto devmaps and cpumaps.
94a4aeb9d6SStanislav Fomichev
95a4aeb9d6SStanislav FomichevThis means that for redirected packets only custom metadata is
96a4aeb9d6SStanislav Fomichevcurrently supported, which has to be prepared by the initial XDP program
97a4aeb9d6SStanislav Fomichevbefore redirect. If the frame is eventually passed to the kernel, the
98a4aeb9d6SStanislav Fomichev``skb`` created from such a frame won't have any hardware metadata populated
99a4aeb9d6SStanislav Fomichevin its ``skb``. If such a packet is later redirected into an ``XSK``,
100a4aeb9d6SStanislav Fomichevthat will also only have access to the custom metadata.
101a4aeb9d6SStanislav Fomichev
102a4aeb9d6SStanislav Fomichevbpf_tail_call
103a4aeb9d6SStanislav Fomichev=============
104a4aeb9d6SStanislav Fomichev
105a4aeb9d6SStanislav FomichevAdding programs that access metadata kfuncs to the ``BPF_MAP_TYPE_PROG_ARRAY``
106a4aeb9d6SStanislav Fomichevis currently not supported.
107a4aeb9d6SStanislav Fomichev
108a4aeb9d6SStanislav FomichevExample
109a4aeb9d6SStanislav Fomichev=======
110a4aeb9d6SStanislav Fomichev
111a4aeb9d6SStanislav FomichevSee ``tools/testing/selftests/bpf/progs/xdp_metadata.c`` and
112a4aeb9d6SStanislav Fomichev``tools/testing/selftests/bpf/prog_tests/xdp_metadata.c`` for an example of
113a4aeb9d6SStanislav FomichevBPF program that handles XDP metadata.
114