€•sphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ"/translations/zh_CN/bpf/map_devmap”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ"/translations/zh_TW/bpf/map_devmap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ"/translations/it_IT/bpf/map_devmap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ"/translations/ja_JP/bpf/map_devmap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ"/translations/ko_KR/bpf/map_devmap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ"/translations/pt_BR/bpf/map_devmap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ"/translations/sp_SP/bpf/map_devmap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ%SPDX-License-Identifier: GPL-2.0-only”h]”hŒ%SPDX-License-Identifier: GPL-2.0-only”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ or <``key``/ ``struct bpf_devmap_val``> pairs to update the maps with new net devices.”h]”(j)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP``”h]”hŒBPF_MAP_TYPE_DEVMAP”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒ and ”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP_HASH``”h]”hŒBPF_MAP_TYPE_DEVMAP_HASH”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒI are BPF maps primarily used as backend maps for the XDP BPF helper call ”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ``bpf_redirect_map()``”h]”hŒbpf_redirect_map()”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒ. ”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP``”h]”hŒBPF_MAP_TYPE_DEVMAP”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒc is backed by an array that uses the key as the index to lookup a reference to a net device. While ”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP_HASH``”h]”hŒBPF_MAP_TYPE_DEVMAP_HASH”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒl is backed by a hash table that uses a key to lookup a reference to a net device. The user provides either <”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒ/ ”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ ``ifindex``”h]”hŒifindex”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒ> or <”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒ/ ”…”�”}”hjTsbj)�”}”(hŒ``struct bpf_devmap_val``”h]”hŒstruct bpf_devmap_val”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTubhŒ0> pairs to update the maps with new net devices.”…”�”}”(hjTh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhØh²hubhì)�”}”(hŒÑ- The key to a hash map doesn't have to be an ``ifindex``. - While ``BPF_MAP_TYPE_DEVMAP_HASH`` allows for densely packing the net devices it comes at the cost of a hash of the key when performing a look up.”h]”hò)�”}”(hhh]”(h÷)�”}”(hŒ8The key to a hash map doesn't have to be an ``ifindex``.”h]”hý)�”}”(hj h]”(hŒ.The key to a hash map doesn’t have to be an ”…”�”}”(hj h²hh³Nh´Nubj)�”}”(hŒ ``ifindex``”h]”hŒifindex”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjubh÷)�”}”(hŒ’While ``BPF_MAP_TYPE_DEVMAP_HASH`` allows for densely packing the net devices it comes at the cost of a hash of the key when performing a look up.”h]”hý)�”}”(hŒ’While ``BPF_MAP_TYPE_DEVMAP_HASH`` allows for densely packing the net devices it comes at the cost of a hash of the key when performing a look up.”h]”(hŒWhile ”…”�”}”(hj4h²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP_HASH``”h]”hŒBPF_MAP_TYPE_DEVMAP_HASH”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj4ubhŒp allows for densely packing the net devices it comes at the cost of a hash of the key when performing a look up.”…”�”}”(hj4h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjubeh}”(h]”h ]”h"]”h$]”h&]”jLjMuh1hñh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhhØh²hh³Nh´Nubhý)�”}”(hŒ}The setup and packet enqueue/send code is shared between the two types of devmap; only the lookup and insertion is different.”h]”hŒ}The setup and packet enqueue/send code is shared between the two types of devmap; only the lookup and insertion is different.”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KhhØh²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒUsage”h]”hŒUsage”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjth²hh³hÇh´Kubh×)�”}”(hhh]”(hÜ)�”}”(hŒ Kernel BPF”h]”hŒ Kernel BPF”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj…h²hh³hÇh´Kubh×)�”}”(hhh]”(hÜ)�”}”(hŒbpf_redirect_map()”h]”hŒbpf_redirect_map()”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj–h²hh³hÇh´K!ubhŒ literal_block”“”)�”}”(hŒ>long bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags)”h]”hŒ>long bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags)”…”�”}”hj©sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1j§h³hÇh´K"hj–h²hubhý)�”}”(hŒâRedirect the packet to the endpoint referenced by ``map`` at index ``key``. For ``BPF_MAP_TYPE_DEVMAP`` and ``BPF_MAP_TYPE_DEVMAP_HASH`` this map contains references to net devices (for forwarding packets through other ports).”h]”(hŒ2Redirect the packet to the endpoint referenced by ”…”�”}”(hj¼h²hh³Nh´Nubj)�”}”(hŒ``map``”h]”hŒmap”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼ubhŒ at index ”…”�”}”(hj¼h²hh³Nh´Nubj)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼ubhŒ. For ”…”�”}”(hj¼h²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP``”h]”hŒBPF_MAP_TYPE_DEVMAP”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼ubhŒ and ”…”�”}”(hj¼h²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP_HASH``”h]”hŒBPF_MAP_TYPE_DEVMAP_HASH”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼ubhŒZ this map contains references to net devices (for forwarding packets through other ports).”…”�”}”(hj¼h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K&hj–h²hubhý)�”}”(hX7The lower two bits of *flags* are used as the return code if the map lookup fails. This is so that the return value can be one of the XDP program return codes up to ``XDP_TX``, as chosen by the caller. The higher bits of ``flags`` can be set to ``BPF_F_BROADCAST`` or ``BPF_F_EXCLUDE_INGRESS`` as defined below.”h]”(hŒThe lower two bits of ”…”�”}”(hjh²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ*flags*”h]”hŒflags”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒˆ are used as the return code if the map lookup fails. This is so that the return value can be one of the XDP program return codes up to ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ ``XDP_TX``”h]”hŒXDP_TX”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ., as chosen by the caller. The higher bits of ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ ``flags``”h]”hŒflags”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ can be set to ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ``BPF_F_BROADCAST``”h]”hŒBPF_F_BROADCAST”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ or ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ``BPF_F_EXCLUDE_INGRESS``”h]”hŒBPF_F_EXCLUDE_INGRESS”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ as defined below.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K*hj–h²hubhý)�”}”(hŒ±With ``BPF_F_BROADCAST`` the packet will be broadcast to all the interfaces in the map, with ``BPF_F_EXCLUDE_INGRESS`` the ingress interface will be excluded from the broadcast.”h]”(hŒWith ”…”�”}”(hj|h²hh³Nh´Nubj)�”}”(hŒ``BPF_F_BROADCAST``”h]”hŒBPF_F_BROADCAST”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubhŒE the packet will be broadcast to all the interfaces in the map, with ”…”�”}”(hj|h²hh³Nh´Nubj)�”}”(hŒ``BPF_F_EXCLUDE_INGRESS``”h]”hŒBPF_F_EXCLUDE_INGRESS”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubhŒ; the ingress interface will be excluded from the broadcast.”…”�”}”(hj|h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K0hj–h²hubhì)�”}”(hŒÑ- The key is ignored if BPF_F_BROADCAST is set. - The broadcast feature can also be used to implement multicast forwarding: simply create multiple DEVMAPs, each one corresponding to a single multicast group.”h]”hò)�”}”(hhh]”(h÷)�”}”(hŒ-The key is ignored if BPF_F_BROADCAST is set.”h]”hý)�”}”(hj·h]”hŒ-The key is ignored if BPF_F_BROADCAST is set.”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K5hjµubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj²ubh÷)�”}”(hŒ�The broadcast feature can also be used to implement multicast forwarding: simply create multiple DEVMAPs, each one corresponding to a single multicast group.”h]”hý)�”}”(hŒ�The broadcast feature can also be used to implement multicast forwarding: simply create multiple DEVMAPs, each one corresponding to a single multicast group.”h]”hŒ�The broadcast feature can also be used to implement multicast forwarding: simply create multiple DEVMAPs, each one corresponding to a single multicast group.”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K6hjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj²ubeh}”(h]”h ]”h"]”h$]”h&]”jLjMuh1hñh³hÇh´K5hj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhj–h²hh³Nh´Nubhý)�”}”(hŒŠThis helper will return ``XDP_REDIRECT`` on success, or the value of the two lower bits of the ``flags`` argument if the map lookup fails.”h]”(hŒThis helper will return ”…”�”}”(hjðh²hh³Nh´Nubj)�”}”(hŒ``XDP_REDIRECT``”h]”hŒ XDP_REDIRECT”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjðubhŒ7 on success, or the value of the two lower bits of the ”…”�”}”(hjðh²hh³Nh´Nubj)�”}”(hŒ ``flags``”h]”hŒflags”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjðubhŒ" argument if the map lookup fails.”…”�”}”(hjðh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K9hj–h²hubhý)�”}”(hŒ?More information about redirection can be found :doc:`redirect`”h]”(hŒ0More information about redirection can be found ”…”�”}”(hj"h²hh³Nh´Nubh)�”}”(hŒ:doc:`redirect`”h]”hŒinline”“”)�”}”(hj,h]”hŒredirect”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-doc”eh"]”h$]”h&]”uh1j.hj*ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œbpf/map_devmap”Œ refdomain”j;Œreftype”Œdoc”Œ refexplicit”‰Œrefwarn”ˆŒ reftarget”Œredirect”uh1hh³hÇh´K``tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c``”h]”hý)�”}”(hj¤h]”j)�”}”(hj¤h]”hŒ:tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kphj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjŸh²hh³hÇh´Nubh÷)�”}”(hŒE``tools/testing/selftests/bpf/progs/test_xdp_with_devmap_helpers.c`` ”h]”hý)�”}”(hŒD``tools/testing/selftests/bpf/progs/test_xdp_with_devmap_helpers.c``”h]”j)�”}”(hjÈh]”hŒ@tools/testing/selftests/bpf/progs/test_xdp_with_devmap_helpers.c”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KqhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjŸh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jLjMuh1hñh³hÇh´Kphj×h²hubeh}”(h]”Œbpf-map-update-elem”ah ]”h"]”Œbpf_map_update_elem()”ah$]”h&]”uh1hÖhj®h²hh³hÇh´KOubh×)�”}”(hhh]”(hÜ)�”}”(hŒbpf_map_lookup_elem()”h]”hŒbpf_map_lookup_elem()”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjñh²hh³hÇh´Ktubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´Kuhjñh²hubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œ bpf_map_lookup_elem (C function)”Œc.bpf_map_lookup_elem”hNt”auh1j hjñh²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ>int bpf_map_lookup_elem(int fd, const void *key, void *value);”h]”hŒdesc_signature_line”“”)�”}”(hŒ>int bpf_map_lookup_elem(int fd, const void *key, void *value);”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒint”h]”hŒint”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1j.hj*h²hh³hÇh´KwubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1j?hj*h²hh³hÇh´KwubhŒ desc_name”“”)�”}”(hŒbpf_map_lookup_elem”h]”hŒ desc_sig_name”“”)�”}”(hŒbpf_map_lookup_elem”h]”hŒbpf_map_lookup_elem”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jVhjRubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1jPhj*h²hh³hÇh´KwubhŒdesc_parameterlist”“”)�”}”(hŒ&(int fd, const void *key, void *value)”h]”(hŒdesc_parameter”“”)�”}”(hŒint fd”h]”(j/)�”}”(hŒint”h]”hŒint”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjwubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hjwubjW)�”}”(hŒfd”h]”hŒfd”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjwubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1juhjqubjv)�”}”(hŒconst void *key”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒconst”h]”hŒconst”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1j°hj¬ubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hj¬ubj/)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj¬ubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hj¬ubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1jëhj¬ubjW)�”}”(hŒkey”h]”hŒkey”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1juhjqubjv)�”}”(hŒ void *value”h]”(j/)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hjubjì)�”}”(hjïh]”hŒ*”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”jøah"]”h$]”h&]”uh1jëhjubjW)�”}”(hŒvalue”h]”hŒvalue”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1juhjqubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1johj*h²hh³hÇh´Kwubjì)�”}”(hŒ;”h]”hŒ;”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”jøah"]”h$]”h&]”uh1jëhj*h²hh³hÇh´Kwubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1j(Œsphinx_line_type”Œ declarator”hj$h²hh³hÇh´Kwubah}”(h]”jah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j"h³hÇh´Kwhjh²hubhŒ desc_content”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j{hjh²hh³hÇh´Kwubeh}”(h]”h ]”(j¹Œfunction”eh"]”h$]”h&]”Œdomain”j¹Œobjtype”j‰Œdesctype”j‰Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jh²hhjñh³Nh´Nubhý)�”}”(hŒONet device entries can be retrieved using the ``bpf_map_lookup_elem()`` helper.”h]”(hŒ.Net device entries can be retrieved using the ”…”�”}”(hj“h²hh³Nh´Nubj)�”}”(hŒ``bpf_map_lookup_elem()``”h]”hŒbpf_map_lookup_elem()”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj“ubhŒ helper.”…”�”}”(hj“h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kzhjñh²hubeh}”(h]”Œid1”ah ]”h"]”h$]”j£ah&]”uh1hÖhj®h²hh³hÇh´Ktj¥Kubh×)�”}”(hhh]”(hÜ)�”}”(hŒbpf_map_delete_elem()”h]”hŒbpf_map_delete_elem()”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjºh²hh³hÇh´K~ubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´Khjºh²hubj )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ bpf_map_delete_elem (C function)”Œc.bpf_map_delete_elem”hNt”auh1j hjºh²hh³Nh´Nubj)�”}”(hhh]”(j#)�”}”(hŒ1int bpf_map_delete_elem(int fd, const void *key);”h]”j))�”}”(hŒ1int bpf_map_delete_elem(int fd, const void *key);”h]”(j/)�”}”(hŒint”h]”hŒint”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjêh²hh³hÇh´K�ubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hjêh²hh³hÇh´K�ubjQ)�”}”(hŒbpf_map_delete_elem”h]”jW)�”}”(hŒbpf_map_delete_elem”h]”hŒbpf_map_delete_elem”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj ubah}”(h]”h ]”(jjjkeh"]”h$]”h&]”hÅhÆuh1jPhjêh²hh³hÇh´K�ubjp)�”}”(hŒ(int fd, const void *key)”h]”(jv)�”}”(hŒint fd”h]”(j/)�”}”(hŒint”h]”hŒint”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj& ubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj8 h²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hj& ubjW)�”}”(hŒfd”h]”hŒfd”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj& ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1juhj" ubjv)�”}”(hŒconst void *key”h]”(j±)�”}”(hj´h]”hŒconst”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”j½ah"]”h$]”h&]”uh1j°hj[ ubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjl h²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hj[ ubj/)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjz h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj[ ubj@)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjˆ h²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hj[ ubjì)�”}”(hjïh]”hŒ*”…”�”}”(hj– h²hh³Nh´Nubah}”(h]”h ]”jøah"]”h$]”h&]”uh1jëhj[ ubjW)�”}”(hŒkey”h]”hŒkey”…”�”}”(hj£ h²hh³Nh´Nubah}”(h]”h ]”jcah"]”h$]”h&]”uh1jVhj[ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1juhj" ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1johjêh²hh³hÇh´K�ubjì)�”}”(hj[h]”hŒ;”…”�”}”(hj¾ h²hh³Nh´Nubah}”(h]”h ]”jøah"]”h$]”h&]”uh1jëhjêh²hh³hÇh´K�ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjmˆuh1j(jnjohjæh²hh³hÇh´K�ubah}”(h]”jáah ]”(jsjteh"]”h$]”h&]”jxˆjy)jzhuh1j"h³hÇh´K�hjãh²hubj|)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j{hjãh²hh³hÇh´K�ubeh}”(h]”h ]”(j¹Œfunction”eh"]”h$]”h&]”j�j¹jŽjã j�jã j�‰j‘‰j’‰uh1jh²hhjºh³Nh´Nubhý)�”}”(hŒ™Net device 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Œ,Net device entries can be deleted using the ”…”�”}”(hjç h²hh³Nh´Nubj)�”}”(hŒ``bpf_map_delete_elem()``”h]”hŒbpf_map_delete_elem()”…”�”}”(hjï h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjç ubhŒT helper. This helper will return 0 on success, or negative error in case of failure.”…”�”}”(hjç h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K„hjºh²hubeh}”(h]”Œbpf-map-delete-elem”ah ]”h"]”Œbpf_map_delete_elem()”ah$]”h&]”uh1hÖhj®h²hh³hÇh´K~ubeh}”(h]”Œ user-space”ah ]”h"]”h$]”Œ user space”ah&]”uh1hÖhjth²hh³hÇh´KHj¥Kubeh}”(h]”Œusage”ah ]”h"]”Œusage”ah$]”h&]”uh1hÖhhØh²hh³hÇh´Kubh×)�”}”(hhh]”(hÜ)�”}”(hŒExamples”h]”hŒExamples”…”�”}”(hj" h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj h²hh³hÇh´K‰ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ Kernel BPF”h]”hŒ Kernel BPF”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj0 h²hh³hÇh´KŒubhý)�”}”(hŒYThe following code snippet shows how to declare a ``BPF_MAP_TYPE_DEVMAP`` called tx_port.”h]”(hŒ2The following code snippet shows how to declare a ”…”�”}”(hjA h²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP``”h]”hŒBPF_MAP_TYPE_DEVMAP”…”�”}”(hjI h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjA ubhŒ called tx_port.”…”�”}”(hjA h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KŽhj0 h²hubj¨)�”}”(hŒ—struct { __uint(type, BPF_MAP_TYPE_DEVMAP); __type(key, __u32); __type(value, __u32); __uint(max_entries, 256); } tx_port SEC(".maps");”h]”hŒ—struct { __uint(type, BPF_MAP_TYPE_DEVMAP); __type(key, __u32); __type(value, __u32); __uint(max_entries, 256); } tx_port SEC(".maps");”…”�”}”hja sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´K‘hj0 h²hubhý)�”}”(hŒbThe following code snippet shows how to declare a ``BPF_MAP_TYPE_DEVMAP_HASH`` called forward_map.”h]”(hŒ2The following code snippet shows how to declare a ”…”�”}”(hjp h²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_DEVMAP_HASH``”h]”hŒBPF_MAP_TYPE_DEVMAP_HASH”…”�”}”(hjx h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjp ubhŒ called forward_map.”…”�”}”(hjp h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kšhj0 h²hubj¨)�”}”(hŒ¯struct { __uint(type, BPF_MAP_TYPE_DEVMAP_HASH); __type(key, __u32); __type(value, struct bpf_devmap_val); __uint(max_entries, 32); } forward_map SEC(".maps");”h]”hŒ¯struct { __uint(type, BPF_MAP_TYPE_DEVMAP_HASH); __type(key, __u32); __type(value, struct bpf_devmap_val); __uint(max_entries, 32); } forward_map SEC(".maps");”…”�”}”hj� sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´K�hj0 h²hubhì)�”}”(hŒAThe value type in the DEVMAP above is a ``struct bpf_devmap_val``”h]”hý)�”}”(hj¡ h]”(hŒ(The value type in the DEVMAP above is a ”…”�”}”(hj£ h²hh³Nh´Nubj)�”}”(hŒ``struct bpf_devmap_val``”h]”hŒstruct bpf_devmap_val”…”�”}”(hjª h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj£ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K¨hjŸ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhj0 h²hh³hÇh´Nubhý)�”}”(hXThe following code snippet shows a simple xdp_redirect_map program. This program would work with a user space program that populates the devmap ``forward_map`` based on ingress ifindexes. The BPF program (below) is redirecting packets using the ingress ``ifindex`` as the ``key``.”h]”(hŒ�The following code snippet shows a simple xdp_redirect_map program. This program would work with a user space program that populates the devmap ”…”�”}”(hjÄ h²hh³Nh´Nubj)�”}”(hŒ``forward_map``”h]”hŒ forward_map”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄ ubhŒ^ based on ingress ifindexes. The BPF program (below) is redirecting packets using the ingress ”…”�”}”(hjÄ h²hh³Nh´Nubj)�”}”(hŒ ``ifindex``”h]”hŒifindex”…”�”}”(hjÞ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄ ubhŒ as the ”…”�”}”(hjÄ h²hh³Nh´Nubj)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hjð h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄ ubhŒ.”…”�”}”(hjÄ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kªhj0 h²hubj¨)�”}”(hŒ˜SEC("xdp") int xdp_redirect_map_func(struct xdp_md *ctx) { int index = ctx->ingress_ifindex; return bpf_redirect_map(&forward_map, index, 0); }”h]”hŒ˜SEC("xdp") int xdp_redirect_map_func(struct xdp_md *ctx) { int index = ctx->ingress_ifindex; return bpf_redirect_map(&forward_map, index, 0); }”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´K¯hj0 h²hubhý)�”}”(hŒ|The following code snippet shows a BPF program that is broadcasting packets to all the interfaces in the ``tx_port`` devmap.”h]”(hŒiThe following code snippet shows a BPF program that is broadcasting packets to all the interfaces in the ”…”�”}”(hj h²hh³Nh´Nubj)�”}”(hŒ ``tx_port``”h]”hŒtx_port”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ devmap.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K¹hj0 h²hubj¨)�”}”(hŒ�SEC("xdp") int xdp_redirect_map_func(struct xdp_md *ctx) { return bpf_redirect_map(&tx_port, 0, BPF_F_BROADCAST | BPF_F_EXCLUDE_INGRESS); }”h]”hŒ�SEC("xdp") int xdp_redirect_map_func(struct xdp_md *ctx) { return bpf_redirect_map(&tx_port, 0, BPF_F_BROADCAST | BPF_F_EXCLUDE_INGRESS); }”…”�”}”hj7 sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´K¼hj0 h²hubeh}”(h]”Œid2”ah ]”h"]”h$]”j¬ah&]”uh1hÖhj h²hh³hÇh´KŒj¥Kubh×)�”}”(hhh]”(hÜ)�”}”(hŒ User space”h]”hŒ User space”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjM h²hh³hÇh´KÅubhý)�”}”(hŒKThe following code snippet shows how to update a devmap called ``tx_port``.”h]”(hŒ?The following code snippet shows how to update a devmap called ”…”�”}”(hj^ h²hh³Nh´Nubj)�”}”(hŒ ``tx_port``”h]”hŒtx_port”…”�”}”(hjf h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj^ ubhŒ.”…”�”}”(hj^ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KÇhjM h²hubj¨)�”}”(hX#int update_devmap(int ifindex, int redirect_ifindex) { int ret; ret = bpf_map_update_elem(bpf_map__fd(tx_port), &ifindex, &redirect_ifindex, 0); if (ret < 0) { fprintf(stderr, "Failed to update devmap_ value: %s\n", strerror(errno)); } return ret; }”h]”hX#int update_devmap(int ifindex, int redirect_ifindex) { int ret; ret = bpf_map_update_elem(bpf_map__fd(tx_port), &ifindex, &redirect_ifindex, 0); if (ret < 0) { fprintf(stderr, "Failed to update devmap_ value: %s\n", strerror(errno)); } return ret; }”…”�”}”hj~ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´KÉhjM h²hubhý)�”}”(hŒTThe following code snippet shows how to update a hash_devmap called ``forward_map``.”h]”(hŒDThe following code snippet shows how to update a hash_devmap called ”…”�”}”(hj� h²hh³Nh´Nubj)�”}”(hŒ``forward_map``”h]”hŒ forward_map”…”�”}”(hj• h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj� ubhŒ.”…”�”}”(hj� h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KØhjM h²hubj¨)�”}”(hXhint update_devmap(int ifindex, int redirect_ifindex) { struct bpf_devmap_val devmap_val = { .ifindex = redirect_ifindex }; int ret; ret = bpf_map_update_elem(bpf_map__fd(forward_map), &ifindex, &devmap_val, 0); if (ret < 0) { fprintf(stderr, "Failed to update devmap_ value: %s\n", strerror(errno)); } return ret; }”h]”hXhint update_devmap(int ifindex, int redirect_ifindex) { struct bpf_devmap_val devmap_val = { .ifindex = redirect_ifindex }; int ret; ret = bpf_map_update_elem(bpf_map__fd(forward_map), &ifindex, &devmap_val, 0); if (ret < 0) { fprintf(stderr, "Failed to update devmap_ value: %s\n", strerror(errno)); } return ret; }”…”�”}”hj­ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj·‰j¸j¹jº}”uh1j§h³hÇh´KÚhjM h²hubeh}”(h]”Œid3”ah ]”h"]”h$]”j ah&]”uh1hÖhj h²hh³hÇh´KÅj¥Kubeh}”(h]”Œexamples”ah ]”h"]”Œexamples”ah$]”h&]”uh1hÖhhØh²hh³hÇh´K‰ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ References”h]”hŒ References”…”�”}”(hjÎ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjË h²hh³hÇh´Kêubhò)�”}”(hhh]”(h÷)�”}”(hŒ https://lwn.net/Articles/728146/”h]”hý)�”}”(hjá h]”hŒ reference”“”)�”}”(hjá h]”hŒ https://lwn.net/Articles/728146/”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”já uh1jæ hjã ubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kìhjß ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjÜ h²hh³hÇh´Nubh÷)�”}”(hŒthttps://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/commit/?id=6f9d451ab1a33728adb72d7ff66a7b374d665176”h]”hý)�”}”(hj h]”jç )�”}”(hj h]”hŒthttps://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/commit/?id=6f9d451ab1a33728adb72d7ff66a7b374d665176”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j uh1jæ hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kíhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjÜ h²hh³hÇh´Nubh÷)�”}”(hŒFhttps://elixir.bootlin.com/linux/latest/source/net/core/filter.c#L4106”h]”hý)�”}”(hj% h]”jç )�”}”(hj% h]”hŒFhttps://elixir.bootlin.com/linux/latest/source/net/core/filter.c#L4106”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j% uh1jæ hj' ubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kîhj# ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhjÜ h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jLjMuh1hñh³hÇh´KìhjË h²hubeh}”(h]”Œ references”ah ]”h"]”Œ references”ah$]”h&]”uh1hÖhhØh²hh³hÇh´Kêubeh}”(h]”Œ0bpf-map-type-devmap-and-bpf-map-type-devmap-hash”ah ]”h"]”Œ0bpf_map_type_devmap and bpf_map_type_devmap_hash”ah$]”h&]”uh1hÖhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÛNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j} Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jW jT j j Œ kernel bpf”NjZjWŒbpf_map_lookup_elem()”NŒ user space”Njîjëj j jÈ jÅ jO jL uŒ nametypes”}”(jW ‰j ‰jÁ ‰jZ‰j ‰jà ‰jî‰j ‰jÈ ‰jO ‰uh}”(jT hØj jtj¨j…jWj–jŸj]j j®jëj×jµjñjj$j jºjájæjÅ j jH j0 j¾ jM jL jË uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”j‹ Ks…”R”Œparse_messages”]”(hŒsystem_message”“”)�”}”(hhh]”hý)�”}”(hŒ8Duplicate implicit target name: "bpf_map_lookup_elem()".”h]”hŒ