asphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget$/translations/zh_CN/bpf/map_lpm_triemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/zh_TW/bpf/map_lpm_triemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/it_IT/bpf/map_lpm_triemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/ja_JP/bpf/map_lpm_triemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/ko_KR/bpf/map_lpm_triemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/sp_SP/bpf/map_lpm_triemodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h%SPDX-License-Identifier: GPL-2.0-onlyh]h%SPDX-License-Identifier: GPL-2.0-only}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh>/var/lib/git/docbuild/linux/Documentation/bpf/map_lpm_trie.rsthKubh)}(h Copyright (C) 2022 Red Hat, Inc.h]h Copyright (C) 2022 Red Hat, Inc.}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsection)}(hhh](htitle)}(hBPF_MAP_TYPE_LPM_TRIEh]hBPF_MAP_TYPE_LPM_TRIE}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhnote)}(hA- ``BPF_MAP_TYPE_LPM_TRIE`` was introduced in kernel version 4.11h]h bullet_list)}(hhh]h list_item)}(h?``BPF_MAP_TYPE_LPM_TRIE`` was introduced in kernel version 4.11h]h paragraph)}(hhh](hliteral)}(h``BPF_MAP_TYPE_LPM_TRIE``h]hBPF_MAP_TYPE_LPM_TRIE}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh& was introduced in kernel version 4.11}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]bullet-uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hXf``BPF_MAP_TYPE_LPM_TRIE`` provides a longest prefix match algorithm that can be used to match IP addresses to a stored set of prefixes. Internally, data is stored in an unbalanced trie of nodes that uses ``prefixlen,data`` pairs as its keys. The ``data`` is interpreted in network byte order, i.e. big endian, so ``data[0]`` stores the most significant byte.h](h)}(h``BPF_MAP_TYPE_LPM_TRIE``h]hBPF_MAP_TYPE_LPM_TRIE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh provides a longest prefix match algorithm that can be used to match IP addresses to a stored set of prefixes. Internally, data is stored in an unbalanced trie of nodes that uses }(hjhhhNhNubh)}(h``prefixlen,data``h]hprefixlen,data}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh pairs as its keys. The }(hjhhhNhNubh)}(h``data``h]hdata}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh; is interpreted in network byte order, i.e. big endian, so }(hjhhhNhNubh)}(h ``data[0]``h]hdata[0]}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh" stores the most significant byte.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hLPM tries may be created with a maximum prefix length that is a multiple of 8, in the range from 8 to 2048. The key used for lookup and update operations is a ``struct bpf_lpm_trie_key_u8``, extended by ``max_prefixlen/8`` bytes.h](hLPM tries may be created with a maximum prefix length that is a multiple of 8, in the range from 8 to 2048. The key used for lookup and update operations is a }(hjmhhhNhNubh)}(h``struct bpf_lpm_trie_key_u8``h]hstruct bpf_lpm_trie_key_u8}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmubh, extended by }(hjmhhhNhNubh)}(h``max_prefixlen/8``h]hmax_prefixlen/8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmubh bytes.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h-For IPv4 addresses the data length is 4 bytesh]h)}(hjh]h-For IPv4 addresses the data length is 4 bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(h/For IPv6 addresses the data length is 16 bytes h]h)}(h.For IPv6 addresses the data length is 16 bytesh]h.For IPv6 addresses the data length is 16 bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1hhhhKhhhhubh)}(hCThe value type stored in the LPM trie can be any user defined type.h]hCThe value type stored in the LPM trie can be any user defined type.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hbWhen creating a map of type ``BPF_MAP_TYPE_LPM_TRIE`` you must set the ``BPF_F_NO_PREALLOC`` flag.h]h)}(hbWhen creating a map of type ``BPF_MAP_TYPE_LPM_TRIE`` you must set the ``BPF_F_NO_PREALLOC`` flag.h](hWhen creating a map of type }(hjhhhNhNubh)}(h``BPF_MAP_TYPE_LPM_TRIE``h]hBPF_MAP_TYPE_LPM_TRIE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh you must set the }(hjhhhNhNubh)}(h``BPF_F_NO_PREALLOC``h]hBPF_F_NO_PREALLOC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh flag.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hhh](h)}(hUsageh]hUsage}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhK!ubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hhhhhK$ubh)}(hhh](h)}(hbpf_map_lookup_elem()h]hbpf_map_lookup_elem()}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChhhhhK'ubh literal_block)}(h?void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)h]h?void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)}hjVsbah}(h]h ]h"]h$]h&]hhforcelanguagechighlight_args}uh1jThhhK)hjChhubh)}(hThe longest prefix entry for a given data value can be found using the ``bpf_map_lookup_elem()`` helper. This helper returns a pointer to the value associated with the longest matching ``key``, or ``NULL`` if no entry was found.h](hGThe longest prefix entry for a given data value can be found using the }(hjihhhNhNubh)}(h``bpf_map_lookup_elem()``h]hbpf_map_lookup_elem()}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiubhY helper. This helper returns a pointer to the value associated with the longest matching }(hjihhhNhNubh)}(h``key``h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiubh, or }(hjihhhNhNubh)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjiubh if no entry was found.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK-hjChhubh)}(hThe ``key`` should have ``prefixlen`` set to ``max_prefixlen`` when performing longest prefix lookups. For example, when searching for the longest prefix match for an IPv4 address, ``prefixlen`` should be set to ``32``.h](hThe }(hjhhhNhNubh)}(h``key``h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh should have }(hjhhhNhNubh)}(h ``prefixlen``h]h prefixlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh set to }(hjhhhNhNubh)}(h``max_prefixlen``h]h max_prefixlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhw when performing longest prefix lookups. For example, when searching for the longest prefix match for an IPv4 address, }(hjhhhNhNubh)}(h ``prefixlen``h]h prefixlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh should be set to }(hjhhhNhNubh)}(h``32``h]h32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK2hjChhubeh}(h]bpf-map-lookup-elemah ]h"]bpf_map_lookup_elem()ah$]h&]uh1hhj2hhhhhK'ubh)}(hhh](h)}(hbpf_map_update_elem()h]hbpf_map_update_elem()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK8ubjU)}(h\long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)h]h\long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)}hj.sbah}(h]h ]h"]h$]h&]hhjdjejfjg}uh1jThhhK:hjhhubh)}(hPrefix entries can be added or updated using the ``bpf_map_update_elem()`` helper. This helper replaces existing elements atomically.h](h1Prefix entries can be added or updated using the }(hj=hhhNhNubh)}(h``bpf_map_update_elem()``h]hbpf_map_update_elem()}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=ubh; helper. This helper replaces existing elements atomically.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK>hjhhubh)}(hY``bpf_map_update_elem()`` returns ``0`` on success, or negative error in case of failure.h](h)}(h``bpf_map_update_elem()``h]hbpf_map_update_elem()}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]ubh returns }(hj]hhhNhNubh)}(h``0``h]h0}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]ubh2 on success, or negative error in case of failure.}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKAhjhhubh block_quote)}(h.. note:: The flags parameter must be one of BPF_ANY, BPF_NOEXIST or BPF_EXIST, but the value is ignored, giving BPF_ANY semantics. h]h)}(hyThe flags parameter must be one of BPF_ANY, BPF_NOEXIST or BPF_EXIST, but the value is ignored, giving BPF_ANY semantics.h]h)}(hyThe flags parameter must be one of BPF_ANY, BPF_NOEXIST or BPF_EXIST, but the value is ignored, giving BPF_ANY semantics.h]hyThe flags parameter must be one of BPF_ANY, BPF_NOEXIST or BPF_EXIST, but the value is ignored, giving BPF_ANY semantics.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhhhKDhjhhubeh}(h]bpf-map-update-elemah ]h"]bpf_map_update_elem()ah$]h&]uh1hhj2hhhhhK8ubh)}(hhh](h)}(hbpf_map_delete_elem()h]hbpf_map_delete_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKIubjU)}(h>long bpf_map_delete_elem(struct bpf_map *map, const void *key)h]h>long bpf_map_delete_elem(struct bpf_map *map, const void *key)}hjsbah}(h]h ]h"]h$]h&]hhjdjejfjg}uh1jThhhKKhjhhubh)}(hPrefix entries can be deleted using the ``bpf_map_delete_elem()`` helper. This helper will return 0 on success, or negative error in case of failure.h](h(Prefix entries can be deleted using the }(hjhhhNhNubh)}(h``bpf_map_delete_elem()``h]hbpf_map_delete_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhT helper. This helper will return 0 on success, or negative error in case of failure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKOhjhhubeh}(h]bpf-map-delete-elemah ]h"]bpf_map_delete_elem()ah$]h&]uh1hhj2hhhhhKIubeh}(h] kernel-bpfah ]h"]h$] kernel bpfah&]uh1hhj!hhhhhK$ referencedKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKTubh)}(hgAccess from userspace uses libbpf APIs with the same names as above, with the map identified by ``fd``.h](h`Access from userspace uses libbpf APIs with the same names as above, with the map identified by }(hjhhhNhNubh)}(h``fd``h]hfd}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKVhjhhubh)}(hhh](h)}(hbpf_map_get_next_key()h]hbpf_map_get_next_key()}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hhhhhKZubjU)}(hFint bpf_map_get_next_key (int fd, const void *cur_key, void *next_key)h]hFint bpf_map_get_next_key (int fd, const void *cur_key, void *next_key)}hjJsbah}(h]h ]h"]h$]h&]hhjdjejfjg}uh1jThhhK\hj9hhubh)}(hXA userspace program can iterate through the entries in an LPM trie using libbpf's ``bpf_map_get_next_key()`` function. The first key can be fetched by calling ``bpf_map_get_next_key()`` with ``cur_key`` set to ``NULL``. Subsequent calls will fetch the next key that follows the current key. ``bpf_map_get_next_key()`` returns ``0`` on success, ``-ENOENT`` if ``cur_key`` is the last key in the trie, or negative error in case of failure.h](hTA userspace program can iterate through the entries in an LPM trie using libbpf’s }(hjYhhhNhNubh)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh3 function. The first key can be fetched by calling }(hjYhhhNhNubh)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh with }(hjYhhhNhNubh)}(h ``cur_key``h]hcur_key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh set to }(hjYhhhNhNubh)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubhI. Subsequent calls will fetch the next key that follows the current key. }(hjYhhhNhNubh)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh returns }(hjYhhhNhNubh)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh on success, }(hjYhhhNhNubh)}(h ``-ENOENT``h]h-ENOENT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh if }(hjYhhhNhNubh)}(h ``cur_key``h]hcur_key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubhC is the last key in the trie, or negative error in case of failure.}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK`hj9hhubh)}(h``bpf_map_get_next_key()`` will iterate through the LPM trie elements from leftmost leaf first. This means that iteration will return more specific keys before less specific ones.h](h)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh will iterate through the LPM trie elements from leftmost leaf first. This means that iteration will return more specific keys before less specific ones.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhj9hhubeh}(h]bpf-map-get-next-keyah ]h"]bpf_map_get_next_key()ah$]h&]uh1hhjhhhhhKZubeh}(h] userspaceah ]h"]h$] userspaceah&]uh1hhj!hhhhhKTjKubeh}(h]usageah ]h"]usageah$]h&]uh1hhhhhhhhK!ubh)}(hhh](h)}(hExamplesh]hExamples}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hhhhhKmubh)}(hPlease see ``tools/testing/selftests/bpf/test_lpm_map.c`` for examples of LPM trie usage from userspace. The code snippets below demonstrate API usage.h](h Please see }(hj<hhhNhNubh)}(h.``tools/testing/selftests/bpf/test_lpm_map.c``h]h*tools/testing/selftests/bpf/test_lpm_map.c}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<ubh^ for examples of LPM trie usage from userspace. The code snippets below demonstrate API usage.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKohj+hhubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hhhhhKtubh)}(h]The following BPF code snippet shows how to declare a new LPM trie for IPv4 address prefixes:h]h]The following BPF code snippet shows how to declare a new LPM trie for IPv4 address prefixes:}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhj\hhubjU)}(hXf#include #include struct ipv4_lpm_key { __u32 prefixlen; __u32 data; }; struct { __uint(type, BPF_MAP_TYPE_LPM_TRIE); __type(key, struct ipv4_lpm_key); __type(value, __u32); __uint(map_flags, BPF_F_NO_PREALLOC); __uint(max_entries, 255); } ipv4_lpm_map SEC(".maps");h]hXf#include #include struct ipv4_lpm_key { __u32 prefixlen; __u32 data; }; struct { __uint(type, BPF_MAP_TYPE_LPM_TRIE); __type(key, struct ipv4_lpm_key); __type(value, __u32); __uint(map_flags, BPF_F_NO_PREALLOC); __uint(max_entries, 255); } ipv4_lpm_map SEC(".maps");}hj{sbah}(h]h ]h"]h$]h&]hhjdjejfjg}uh1jThhhKyhj\hhubh)}(hCThe following BPF code snippet shows how to lookup by IPv4 address:h]hCThe following BPF code snippet shows how to lookup by IPv4 address:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj\hhubjU)}(hvoid *lookup(__u32 ipaddr) { struct ipv4_lpm_key key = { .prefixlen = 32, .data = ipaddr }; return bpf_map_lookup_elem(&ipv4_lpm_map, &key); }h]hvoid *lookup(__u32 ipaddr) { struct ipv4_lpm_key key = { .prefixlen = 32, .data = ipaddr }; return bpf_map_lookup_elem(&ipv4_lpm_map, &key); }}hjsbah}(h]h ]h"]h$]h&]hhjdjejfjg}uh1jThhhKhj\hhubeh}(h]id1ah ]h"]h$]jah&]uh1hhj+hhhhhKtjKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hPThe following snippet shows how to insert an IPv4 prefix entry into an LPM trie:h]hPThe following snippet shows how to insert an IPv4 prefix entry into an LPM trie:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjU)}(hXint add_prefix_entry(int lpm_fd, __u32 addr, __u32 prefixlen, struct value *value) { struct ipv4_lpm_key ipv4_key = { .prefixlen = prefixlen, .data = addr }; return bpf_map_update_elem(lpm_fd, &ipv4_key, value, BPF_ANY); }h]hXint add_prefix_entry(int lpm_fd, __u32 addr, __u32 prefixlen, struct value *value) { struct ipv4_lpm_key ipv4_key = { .prefixlen = prefixlen, .data = addr }; return bpf_map_update_elem(lpm_fd, &ipv4_key, value, BPF_ANY); }}hjsbah}(h]h ]h"]h$]h&]hhjdjejfjg}uh1jThhhKhjhhubh)}(h[The following snippet shows a userspace program walking through the entries of an LPM trie:h]h[The following snippet shows a userspace program walking through the entries of an LPM trie:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjU)}(hX#include #include void iterate_lpm_trie(int map_fd) { struct ipv4_lpm_key *cur_key = NULL; struct ipv4_lpm_key next_key; struct value value; int err; for (;;) { err = bpf_map_get_next_key(map_fd, cur_key, &next_key); if (err) break; bpf_map_lookup_elem(map_fd, &next_key, &value); /* Use key and value here */ cur_key = &next_key; } }h]hX#include #include void iterate_lpm_trie(int map_fd) { struct ipv4_lpm_key *cur_key = NULL; struct ipv4_lpm_key next_key; struct value value; int err; for (;;) { err = bpf_map_get_next_key(map_fd, cur_key, &next_key); if (err) break; bpf_map_lookup_elem(map_fd, &next_key, &value); /* Use key and value here */ cur_key = &next_key; } }}hjsbah}(h]h ]h"]h$]h&]hhjdjejfjg}uh1jThhhKhjhhubeh}(h]id2ah ]h"]h$]j!ah&]uh1hhj+hhhhhKjKubeh}(h]examplesah ]h"]examplesah$]h&]uh1hhhhhhhhKmubeh}(h]bpf-map-type-lpm-trieah ]h"]bpf_map_type_lpm_trieah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj3error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j j j(j% kernel bpfNjjjjjj userspaceNjjjju nametypes}(j j(jwjjjjxjjuh}(j hj%j!jj2jjCjjjjjjjj9jj+jj\jju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jAKsRparse_messages](hsystem_message)}(hhh]h)}(h-Duplicate implicit target name: "kernel bpf".h]h1Duplicate implicit target name: “kernel bpf”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]jalevelKtypeINFOsourcehlineKtuh1jhj\hhhhhKtubj)}(hhh]h)}(h,Duplicate implicit target name: "userspace".h]h0Duplicate implicit target name: “userspace”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]jalevelKtypejsourcehlineKuh1jhjhhhhhKubetransform_messages] transformerN include_log] decorationNhhub.