€•MJŒ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_of_maps”Œ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_of_maps”Œ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_of_maps”Œ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_of_maps”Œ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_of_maps”Œ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_of_maps”Œ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_of_maps”Œ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³Œ=/var/lib/git/docbuild/linux/Documentation/bpf/map_of_maps.rst”h´Kubh¶)�”}”(hŒ Copyright (C) 2022 Red Hat, Inc.”h]”hŒ Copyright (C) 2022 Red Hat, Inc.”…”�”}”hhÈsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÇh´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ8BPF_MAP_TYPE_ARRAY_OF_MAPS and BPF_MAP_TYPE_HASH_OF_MAPS”h]”hŒ8BPF_MAP_TYPE_ARRAY_OF_MAPS and BPF_MAP_TYPE_HASH_OF_MAPS”…”�”}”(hhÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhhØh²hh³hÇh´KubhŒnote”“”)�”}”(hŒk- ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”hŒ bullet_list”“”)�”}”(hhh]”hŒ list_item”“”)�”}”(hŒg``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”hŒ paragraph”“”)�”}”(hŒg``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` were introduced in kernel version 4.12”h]”(hŒliteral”“”)�”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhþubhŒ and ”…”�”}”(hhþh²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhþubhŒ' were introduced in kernel version 4.12”…”�”}”(hhþh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhøubah}”(h]”h ]”h"]”h$]”h&]”uh1höhhóubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1hñh³hÇh´K hhíubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhhØh²hh³Nh´Nubhý)�”}”(hX ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` and ``BPF_MAP_TYPE_HASH_OF_MAPS`` provide general purpose support for map in map storage. One level of nesting is supported, where an outer map contains instances of a single type of inner map, for example ``array_of_maps->sock_map``.”h]”(j)�”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubhŒ and ”…”�”}”(hjBh²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubhŒ­ provide general purpose support for map in map storage. One level of nesting is supported, where an outer map contains instances of a single type of inner map, for example ”…”�”}”(hjBh²hh³Nh´Nubj)�”}”(hŒ``array_of_maps->sock_map``”h]”hŒarray_of_maps->sock_map”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubhŒ.”…”�”}”(hjBh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhØh²hubhý)�”}”(hŒöWhen creating an outer map, an inner map instance is used to initialize the metadata that the outer map holds about its inner maps. This inner map has a separate lifetime from the outer map and can be deleted after the outer map has been created.”h]”hŒöWhen creating an outer map, an inner map instance is used to initialize the metadata that the outer map holds about its inner maps. This inner map has a separate lifetime from the outer map and can be deleted after the outer map has been created.”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KhhØh²hubhý)�”}”(hŒ¤The outer map supports element lookup, update and delete from user space using the syscall API. A BPF program is only allowed to do element lookup in the outer map.”h]”hŒ¤The outer map supports element lookup, update and delete from user space using the syscall API. A BPF program is only allowed to do element lookup in the outer map.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KhhØh²hubhì)�”}”(hŒ¼- Multi-level nesting is not supported. - Any BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``. - A BPF program cannot update or delete outer map entries.”h]”hò)�”}”(hhh]”(h÷)�”}”(hŒ%Multi-level nesting is not supported.”h]”hý)�”}”(hj§h]”hŒ%Multi-level nesting is not supported.”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj¢ubh÷)�”}”(hŒUAny BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``.”h]”hý)�”}”(hŒUAny BPF map type can be used as an inner map, except for ``BPF_MAP_TYPE_PROG_ARRAY``.”h]”(hŒ9Any BPF map type can be used as an inner map, except for ”…”�”}”(hjÀh²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_PROG_ARRAY``”h]”hŒBPF_MAP_TYPE_PROG_ARRAY”…”�”}”(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´Khj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj¢ubh÷)�”}”(hŒ8A BPF program cannot update or delete outer map entries.”h]”hý)�”}”(hjèh]”hŒ8A BPF program cannot update or delete outer map entries.”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khjæubah}”(h]”h ]”h"]”h$]”h&]”uh1höhj¢ubeh}”(h]”h ]”h"]”h$]”h&]”j:j;uh1hñh³hÇh´Khjžubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhhØh²hh³Nh´Nubhý)�”}”(hŒ¾For ``BPF_MAP_TYPE_ARRAY_OF_MAPS`` the key is an unsigned 32-bit integer index into the array. The array is a fixed size with ``max_entries`` elements that are zero initialized when created.”h]”(hŒFor ”…”�”}”(hj h²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_ARRAY_OF_MAPS``”h]”hŒBPF_MAP_TYPE_ARRAY_OF_MAPS”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ\ the key is an unsigned 32-bit integer index into the array. The array is a fixed size with ”…”�”}”(hj h²hh³Nh´Nubj)�”}”(hŒ``max_entries``”h]”hŒ max_entries”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ1 elements that are zero initialized when created.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhØh²hubhý)�”}”(hXmFor ``BPF_MAP_TYPE_HASH_OF_MAPS`` the key type can be chosen when defining the map. The kernel is responsible for allocating and freeing key/value pairs, up to the max_entries limit that you specify. Hash maps use pre-allocation of hash table elements by default. The ``BPF_F_NO_PREALLOC`` flag can be used to disable pre-allocation when it is too memory expensive.”h]”(hŒFor ”…”�”}”(hj;h²hh³Nh´Nubj)�”}”(hŒ``BPF_MAP_TYPE_HASH_OF_MAPS``”h]”hŒBPF_MAP_TYPE_HASH_OF_MAPS”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj;ubhŒë the key type can be chosen when defining the map. The kernel is responsible for allocating and freeing key/value pairs, up to the max_entries limit that you specify. Hash maps use pre-allocation of hash table elements by default. The ”…”�”}”(hj;h²hh³Nh´Nubj)�”}”(hŒ``BPF_F_NO_PREALLOC``”h]”hŒBPF_F_NO_PREALLOC”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj;ubhŒL flag can be used to disable pre-allocation when it is too memory expensive.”…”�”}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K$hhØh²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒUsage”h]”hŒUsage”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjmh²hh³hÇh´K+ubh×)�”}”(hhh]”(hÜ)�”}”(hŒKernel BPF Helper”h]”hŒKernel BPF Helper”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj~h²hh³hÇh´K.ubh×)�”}”(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´K1ubhŒ 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)”…”�”}”hj¢sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1j h³hÇh´K3hj�h²hubhý)�”}”(hŒšInner maps can be retrieved using the ``bpf_map_lookup_elem()`` helper. This helper returns a pointer to the inner map, or ``NULL`` if no entry was found.”h]”(hŒ&Inner maps 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. This helper returns a pointer to the inner map, or ”…”�”}”(hjµh²hh³Nh´Nubj)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjµubhŒ if no entry was found.”…”�”}”(hjµh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K7hj�h²hubeh}”(h]”Œbpf-map-lookup-elem”ah ]”h"]”Œbpf_map_lookup_elem()”ah$]”h&]”uh1hÖhj~h²hh³hÇh´K1ubeh}”(h]”Œkernel-bpf-helper”ah ]”h"]”Œkernel bpf helper”ah$]”h&]”uh1hÖhjmh²hh³hÇh´K.ubeh}”(h]”Œusage”ah ]”h"]”Œusage”ah$]”h&]”uh1hÖhhØh²hh³hÇh´K+ubh×)�”}”(hhh]”(hÜ)�”}”(hŒExamples”h]”hŒExamples”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjÿh²hh³hÇh´K;ubh×)�”}”(hhh]”(hÜ)�”}”(hŒKernel BPF Example”h]”hŒKernel BPF Example”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´K>ubhý)�”}”(hŒ«This snippet shows how to create and initialise an array of devmaps in a BPF program. Note that the outer array can only be modified from user space using the syscall API.”h]”hŒ«This snippet shows how to create and initialise an array of devmaps in a BPF program. Note that the outer array can only be modified from user space using the syscall API.”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K@hjh²hubj¡)�”}”(hXÒstruct inner_map { __uint(type, BPF_MAP_TYPE_DEVMAP); __uint(max_entries, 10); __type(key, __u32); __type(value, __u32); } inner_map1 SEC(".maps"), inner_map2 SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); __uint(max_entries, 2); __type(key, __u32); __array(values, struct inner_map); } outer_map SEC(".maps") = { .values = { &inner_map1, &inner_map2 } };”h]”hXÒstruct inner_map { __uint(type, BPF_MAP_TYPE_DEVMAP); __uint(max_entries, 10); __type(key, __u32); __type(value, __u32); } inner_map1 SEC(".maps"), inner_map2 SEC(".maps"); struct { __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); __uint(max_entries, 2); __type(key, __u32); __array(values, struct inner_map); } outer_map SEC(".maps") = { .values = { &inner_map1, &inner_map2 } };”…”�”}”hj/sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj°‰j±j²j³}”uh1j h³hÇh´KDhjh²hubhý)�”}”(hŒ…See ``progs/test_btf_map_in_map.c`` in ``tools/testing/selftests/bpf`` for more examples of declarative initialisation of outer maps.”h]”(hŒSee ”…”�”}”(hj>h²hh³Nh´Nubj)�”}”(hŒ``progs/test_btf_map_in_map.c``”h]”hŒprogs/test_btf_map_in_map.c”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj>ubhŒ in ”…”�”}”(hj>h²hh³Nh´Nubj)�”}”(hŒ``tools/testing/selftests/bpf``”h]”hŒtools/testing/selftests/bpf”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj>ubhŒ? for more examples of declarative initialisation of outer maps.”…”�”}”(hj>h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KWhjh²hubeh}”(h]”Œkernel-bpf-example”ah ]”h"]”Œkernel bpf example”ah$]”h&]”uh1hÖhjÿh²hh³hÇh´K>ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ User Space”h]”hŒ User Space”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjxh²hh³hÇh´K[ubhý)�”}”(hŒ:This snippet shows how to create an array based outer map:”h]”hŒ:This snippet shows how to create an array based outer map:”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K]hjxh²hubj¡)�”}”(hXint create_outer_array(int inner_fd) { LIBBPF_OPTS(bpf_map_create_opts, opts, .inner_map_fd = inner_fd); int fd; fd = bpf_map_create(BPF_MAP_TYPE_ARRAY_OF_MAPS, "example_array", /* name */ sizeof(__u32), /* key size */ sizeof(__u32), /* value size */ 256, /* max entries */ &opts); /* create opts */ return fd; }”h]”hXint create_outer_array(int inner_fd) { LIBBPF_OPTS(bpf_map_create_opts, opts, .inner_map_fd = inner_fd); int fd; fd = bpf_map_create(BPF_MAP_TYPE_ARRAY_OF_MAPS, "example_array", /* name */ sizeof(__u32), /* key size */ sizeof(__u32), /* value size */ 256, /* max entries */ &opts); /* create opts */ return fd; }”…”�”}”hj—sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj°‰j±j²j³}”uh1j h³hÇh´K_hjxh²hubhý)�”}”(hŒ;This snippet shows how to add an inner map to an outer map:”h]”hŒ;This snippet shows how to add an inner map to an outer map:”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kohjxh²hubj¡)�”}”(hX?int add_devmap(int outer_fd, int index, const char *name) { int fd; fd = bpf_map_create(BPF_MAP_TYPE_DEVMAP, name, sizeof(__u32), sizeof(__u32), 256, NULL); if (fd < 0) return fd; return bpf_map_update_elem(outer_fd, &index, &fd, BPF_ANY); }”h]”hX?int add_devmap(int outer_fd, int index, const char *name) { int fd; fd = bpf_map_create(BPF_MAP_TYPE_DEVMAP, name, sizeof(__u32), sizeof(__u32), 256, NULL); if (fd < 0) return fd; return bpf_map_update_elem(outer_fd, &index, &fd, BPF_ANY); }”…”�”}”hj´sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj°‰j±j²j³}”uh1j h³hÇh´Kqhjxh²hubeh}”(h]”Œ user-space”ah ]”h"]”Œ user space”ah$]”h&]”uh1hÖhjÿh²hh³hÇh´K[ubeh}”(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´Kubhò)�”}”(hhh]”(h÷)�”}”(hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-3-kafai@fb.com/”h]”hý)�”}”(hjéh]”hŒ reference”“”)�”}”(hjéh]”hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-3-kafai@fb.com/”…”�”}”(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ŒDhttps://lore.kernel.org/netdev/20170322170035.923581-4-kafai@fb.com/”h]”hý)�”}”(hj h]”jï)�”}”(hj h]”hŒDhttps://lore.kernel.org/netdev/20170322170035.923581-4-kafai@fb.com/”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j uh1jîhjubah}”(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&]”j:j;uh1hñh³hÇh´K�hjÓh²hubeh}”(h]”Œ references”ah ]”h"]”Œ references”ah$]”h&]”uh1hÖhhØh²hh³hÇh´Kubeh}”(h]”Œ8bpf-map-type-array-of-maps-and-bpf-map-type-hash-of-maps”ah ]”h"]”Œ8bpf_map_type_array_of_maps and bpf_map_type_hash_of_maps”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”jdŒ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”}”(j>j;jüjùjôjñjìjéjÐjÍjujrjÈjÅj6j3uŒ nametypes”}”(j>‰jü‰jô‰jì‰jЉju‰jȉj6‰uh}”(j;hØjùjmjñj~jéj�jÍjÿjrjjÅjxj3jÓ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”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.