csphinx.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]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/pt_BR/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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhubh& 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](j)}(h``BPF_MAP_TYPE_LPM_TRIE``h]hBPF_MAP_TYPE_LPM_TRIE}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh 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 }(hj/hhhNhNubj)}(h``prefixlen,data``h]hprefixlen,data}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh pairs as its keys. The }(hj/hhhNhNubj)}(h``data``h]hdata}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh; is interpreted in network byte order, i.e. big endian, so }(hj/hhhNhNubj)}(h ``data[0]``h]hdata[0]}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh" stores the most significant byte.}(hj/hhhNhNubeh}(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 }(hjhhhNhNubj)}(h``struct bpf_lpm_trie_key_u8``h]hstruct bpf_lpm_trie_key_u8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, extended by }(hjhhhNhNubj)}(h``max_prefixlen/8``h]hmax_prefixlen/8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh bytes.}(hjhhhNhNubeh}(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&]j'j(uh1hhhhKhhhhubh)}(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 }(hjhhhNhNubj)}(h``BPF_MAP_TYPE_LPM_TRIE``h]hBPF_MAP_TYPE_LPM_TRIE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh you must set the }(hjhhhNhNubj)}(h``BPF_F_NO_PREALLOC``h]hBPF_F_NO_PREALLOC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh flag.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hhh](h)}(hUsageh]hUsage}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hhhhhK!ubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhhhhhK$ubh)}(hhh](h)}(hbpf_map_lookup_elem()h]hbpf_map_lookup_elem()}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhhhhhK'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)}hjjsbah}(h]h ]h"]h$]h&]hhƌforcelanguagechighlight_args}uh1jhhhhK)hjWhhubh)}(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 }(hj}hhhNhNubj)}(h``bpf_map_lookup_elem()``h]hbpf_map_lookup_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubhY helper. This helper returns a pointer to the value associated with the longest matching }(hj}hhhNhNubj)}(h``key``h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh, or }(hj}hhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh if no entry was found.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK-hjWhhubh)}(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 }(hjhhhNhNubj)}(h``key``h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh should have }(hjhhhNhNubj)}(h ``prefixlen``h]h prefixlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh set to }(hjhhhNhNubj)}(h``max_prefixlen``h]h max_prefixlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhw when performing longest prefix lookups. For example, when searching for the longest prefix match for an IPv4 address, }(hjhhhNhNubj)}(h ``prefixlen``h]h prefixlen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh should be set to }(hjhhhNhNubj)}(h``32``h]h32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK2hjWhhubeh}(h]bpf-map-lookup-elemah ]h"]bpf_map_lookup_elem()ah$]h&]uh1hhjFhhhhhK'ubh)}(hhh](h)}(hbpf_map_update_elem()h]hbpf_map_update_elem()}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hhhhhK8ubji)}(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)}hjBsbah}(h]h ]h"]h$]h&]hhjxjyjzj{}uh1jhhhhK:hj1hhubh)}(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 }(hjQhhhNhNubj)}(h``bpf_map_update_elem()``h]hbpf_map_update_elem()}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubh; helper. This helper replaces existing elements atomically.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK>hj1hhubh)}(hY``bpf_map_update_elem()`` returns ``0`` on success, or negative error in case of failure.h](j)}(h``bpf_map_update_elem()``h]hbpf_map_update_elem()}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh returns }(hjqhhhNhNubj)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh2 on success, or negative error in case of failure.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKAhj1hhubh 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&]uh1jhhhKDhj1hhubeh}(h]bpf-map-update-elemah ]h"]bpf_map_update_elem()ah$]h&]uh1hhjFhhhhhK8ubh)}(hhh](h)}(hbpf_map_delete_elem()h]hbpf_map_delete_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKIubji)}(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&]hhjxjyjzj{}uh1jhhhhKKhjhhubh)}(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 }(hjhhhNhNubj)}(h``bpf_map_delete_elem()``h]hbpf_map_delete_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhT 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&]uh1hhjFhhhhhKIubeh}(h] kernel-bpfah ]h"]h$] kernel bpfah&]uh1hhj5hhhhhK$ referencedKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hjhhhNhNubah}(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 }(hj-hhhNhNubj)}(h``fd``h]hfd}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubh.}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKVhjhhubh)}(hhh](h)}(hbpf_map_get_next_key()h]hbpf_map_get_next_key()}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhhhhhKZubji)}(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)}hj^sbah}(h]h ]h"]h$]h&]hhjxjyjzj{}uh1jhhhhK\hjMhhubh)}(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 }(hjmhhhNhNubj)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh3 function. The first key can be fetched by calling }(hjmhhhNhNubj)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh with }(hjmhhhNhNubj)}(h ``cur_key``h]hcur_key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh set to }(hjmhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhI. Subsequent calls will fetch the next key that follows the current key. }(hjmhhhNhNubj)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh returns }(hjmhhhNhNubj)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh on success, }(hjmhhhNhNubj)}(h ``-ENOENT``h]h-ENOENT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh if }(hjmhhhNhNubj)}(h ``cur_key``h]hcur_key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhC is the last key in the trie, or negative error in case of failure.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK`hjMhhubh)}(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](j)}(h``bpf_map_get_next_key()``h]hbpf_map_get_next_key()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh will iterate through the LPM trie elements from leftmost leaf first. This means that iteration will return more specific keys before less specific ones.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhjMhhubeh}(h]bpf-map-get-next-keyah ]h"]bpf_map_get_next_key()ah$]h&]uh1hhjhhhhhKZubeh}(h] userspaceah ]h"]h$] userspaceah&]uh1hhj5hhhhhKTjKubeh}(h]usageah ]h"]usageah$]h&]uh1hhhhhhhhK!ubh)}(hhh](h)}(hExamplesh]hExamples}(hjBhhhNhNubah}(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 }(hjPhhhNhNubj)}(h.``tools/testing/selftests/bpf/test_lpm_map.c``h]h*tools/testing/selftests/bpf/test_lpm_map.c}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh^ for examples of LPM trie usage from userspace. The code snippets below demonstrate API usage.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKohj?hhubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphhhhhKtubh)}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhjphhubji)}(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");}hjsbah}(h]h ]h"]h$]h&]hhjxjyjzj{}uh1jhhhhKyhjphhubh)}(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&]uh1hhhhKhjphhubji)}(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&]hhjxjyjzj{}uh1jhhhhKhjphhubeh}(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&]uh1hhhhKhjhhubji)}(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&]hhjxjyjzj{}uh1jhhhhKhjhhubh)}(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&]uh1hhhhKhjhhubji)}(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&]hhjxjyjzj{}uh1jhhhhKhjhhubeh}(h]id2ah ]h"]h$]j5ah&]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_handlerjGerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _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!jj<j9 kernel bpfNj.j+jjjj  userspaceNj,j)jju nametypes}(j!j<jj.jjjj,juh}(jhj9j5jjFj+jWjj1j jj1jj)jMjj?jjpjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jUKsRparse_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&]jalevelKtypeINFOsourcehnjlineKtuh1jhjphhhhhKtubj)}(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&]jalevelKtypejsourcehnjlineKuh1jhjhhhhhKubetransform_messages] transformerN include_log] decorationNhhub.