€•ÃUŒ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/prog_sk_lookup”Œ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/prog_sk_lookup”Œ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/prog_sk_lookup”Œ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/prog_sk_lookup”Œ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/prog_sk_lookup”Œ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/prog_sk_lookup”Œ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/prog_sk_lookup”Œ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Œ2SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)”h]”hŒ2SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ@/var/lib/git/docbuild/linux/Documentation/bpf/prog_sk_lookup.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒBPF sk_lookup program”h]”hŒBPF sk_lookup program”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)”}”(hŒµBPF sk_lookup program type (``BPF_PROG_TYPE_SK_LOOKUP``) introduces programmability into the socket lookup performed by the transport layer when a packet is to be delivered locally.”h]”(hŒBPF sk_lookup program type (”…””}”(hhßh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``BPF_PROG_TYPE_SK_LOOKUP``”h]”hŒBPF_PROG_TYPE_SK_LOOKUP”…””}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhßubhŒ~) introduces programmability into the socket lookup performed by the transport layer when a packet is to be delivered locally.”…””}”(hhßh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÞ)”}”(hŒ”When invoked BPF sk_lookup program can select a socket that will receive the incoming packet by calling the ``bpf_sk_assign()`` BPF helper function.”h]”(hŒlWhen invoked BPF sk_lookup program can select a socket that will receive the incoming packet by calling the ”…””}”(hjh²hh³Nh´Nubhè)”}”(hŒ``bpf_sk_assign()``”h]”hŒbpf_sk_assign()”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhŒ BPF helper function.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhÊh²hubhÞ)”}”(hŒOHooks for a common attach point (``BPF_SK_LOOKUP``) exist for both TCP and UDP.”h]”(hŒ!Hooks for a common attach point (”…””}”(hj!h²hh³Nh´Nubhè)”}”(hŒ``BPF_SK_LOOKUP``”h]”hŒ BPF_SK_LOOKUP”…””}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj!ubhŒ) exist for both TCP and UDP.”…””}”(hj!h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Motivation”h]”hŒ Motivation”…””}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjAh²hh³hÇh´KubhÞ)”}”(hŒBPF sk_lookup program type was introduced to address setup scenarios where binding sockets to an address with ``bind()`` socket call is impractical, such as:”h]”(hŒnBPF sk_lookup program type was introduced to address setup scenarios where binding sockets to an address with ”…””}”(hjRh²hh³Nh´Nubhè)”}”(hŒ ``bind()``”h]”hŒbind()”…””}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjRubhŒ% socket call is impractical, such as:”…””}”(hjRh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjAh²hubhŒenumerated_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒžreceiving connections on a range of IP addresses, e.g. 192.0.2.0/24, when binding to a wildcard address ``INADRR_ANY`` is not possible due to a port conflict,”h]”hÞ)”}”(hŒžreceiving connections on a range of IP addresses, e.g. 192.0.2.0/24, when binding to a wildcard address ``INADRR_ANY`` is not possible due to a port conflict,”h]”(hŒhreceiving connections on a range of IP addresses, e.g. 192.0.2.0/24, when binding to a wildcard address ”…””}”(hj}h²hh³Nh´Nubhè)”}”(hŒ``INADRR_ANY``”h]”hŒ INADRR_ANY”…””}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj}ubhŒ( is not possible due to a port conflict,”…””}”(hj}h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjyubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjth²hh³hÇh´Nubjx)”}”(hŒRreceiving connections on all or a wide range of ports, i.e. an L7 proxy use case. ”h]”hÞ)”}”(hŒQreceiving connections on all or a wide range of ports, i.e. an L7 proxy use case.”h]”hŒQreceiving connections on all or a wide range of ports, i.e. an L7 proxy use case.”…””}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjth²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1jrhjAh²hh³hÇh´KubhÞ)”}”(hŒÀSuch setups would require creating and ``bind()``'ing one socket to each of the IP address/port in the range, leading to resource consumption and potential latency spikes during socket lookup.”h]”(hŒ'Such setups would require creating and ”…””}”(hjÆh²hh³Nh´Nubhè)”}”(hŒ ``bind()``”h]”hŒbind()”…””}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÆubhŒ‘’ing one socket to each of the IP address/port in the range, leading to resource consumption and potential latency spikes during socket lookup.”…””}”(hjÆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjAh²hubeh}”(h]”Œ motivation”ah ]”h"]”Œ motivation”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Attachment”h]”hŒ Attachment”…””}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjîh²hh³hÇh´K"ubhÞ)”}”(hŒ»BPF sk_lookup program can be attached to a network namespace with ``bpf(BPF_LINK_CREATE, ...)`` syscall using the ``BPF_SK_LOOKUP`` attach type and a netns FD as attachment ``target_fd``.”h]”(hŒBBPF sk_lookup program can be attached to a network namespace with ”…””}”(hjÿh²hh³Nh´Nubhè)”}”(hŒ``bpf(BPF_LINK_CREATE, ...)``”h]”hŒbpf(BPF_LINK_CREATE, ...)”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÿubhŒ syscall using the ”…””}”(hjÿh²hh³Nh´Nubhè)”}”(hŒ``BPF_SK_LOOKUP``”h]”hŒ BPF_SK_LOOKUP”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÿubhŒ* attach type and a netns FD as attachment ”…””}”(hjÿh²hh³Nh´Nubhè)”}”(hŒ ``target_fd``”h]”hŒ target_fd”…””}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÿubhŒ.”…””}”(hjÿh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K$hjîh²hubhÞ)”}”(hŒ}Multiple programs can be attached to one network namespace. Programs will be invoked in the same order as they were attached.”h]”hŒ}Multiple programs can be attached to one network namespace. Programs will be invoked in the same order as they were attached.”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K(hjîh²hubeh}”(h]”Œ attachment”ah ]”h"]”Œ attachment”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K"ubhÉ)”}”(hhh]”(hÎ)”}”(hŒHooks”h]”hŒHooks”…””}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjYh²hh³hÇh´K,ubhÞ)”}”(hŒ›The attached BPF sk_lookup programs run whenever the transport layer needs to find a listening (TCP) or an unconnected (UDP) socket for an incoming packet.”h]”hŒ›The attached BPF sk_lookup programs run whenever the transport layer needs to find a listening (TCP) or an unconnected (UDP) socket for an incoming packet.”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K.hjYh²hubhÞ)”}”(hŒ‚Incoming traffic to established (TCP) and connected (UDP) sockets is delivered as usual without triggering the BPF sk_lookup hook.”h]”hŒ‚Incoming traffic to established (TCP) and connected (UDP) sockets is delivered as usual without triggering the BPF sk_lookup hook.”…””}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K1hjYh²hubhÞ)”}”(hX7The attached BPF programs must return with either ``SK_PASS`` or ``SK_DROP`` verdict code. As for other BPF program types that are network filters, ``SK_PASS`` signifies that the socket lookup should continue on to regular hashtable-based lookup, while ``SK_DROP`` causes the transport layer to drop the packet.”h]”(hŒ2The attached BPF programs must return with either ”…””}”(hj†h²hh³Nh´Nubhè)”}”(hŒ ``SK_PASS``”h]”hŒSK_PASS”…””}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj†ubhŒ or ”…””}”(hj†h²hh³Nh´Nubhè)”}”(hŒ ``SK_DROP``”h]”hŒSK_DROP”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj†ubhŒH verdict code. As for other BPF program types that are network filters, ”…””}”(hj†h²hh³Nh´Nubhè)”}”(hŒ ``SK_PASS``”h]”hŒSK_PASS”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj†ubhŒ^ signifies that the socket lookup should continue on to regular hashtable-based lookup, while ”…””}”(hj†h²hh³Nh´Nubhè)”}”(hŒ ``SK_DROP``”h]”hŒSK_DROP”…””}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj†ubhŒ/ causes the transport layer to drop the packet.”…””}”(hj†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K4hjYh²hubhÞ)”}”(hXA BPF sk_lookup program can also select a socket to receive the packet by calling ``bpf_sk_assign()`` BPF helper. Typically, the program looks up a socket in a map holding sockets, such as ``SOCKMAP`` or ``SOCKHASH``, and passes a ``struct bpf_sock *`` to ``bpf_sk_assign()`` helper to record the selection. Selecting a socket only takes effect if the program has terminated with ``SK_PASS`` code.”h]”(hŒRA BPF sk_lookup program can also select a socket to receive the packet by calling ”…””}”(hjÜh²hh³Nh´Nubhè)”}”(hŒ``bpf_sk_assign()``”h]”hŒbpf_sk_assign()”…””}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÜubhŒX BPF helper. Typically, the program looks up a socket in a map holding sockets, such as ”…””}”(hjÜh²hh³Nh´Nubhè)”}”(hŒ ``SOCKMAP``”h]”hŒSOCKMAP”…””}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÜubhŒ or ”…””}”(hjÜh²hh³Nh´Nubhè)”}”(hŒ ``SOCKHASH``”h]”hŒSOCKHASH”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÜubhŒ, and passes a ”…””}”(hjÜh²hh³Nh´Nubhè)”}”(hŒ``struct bpf_sock *``”h]”hŒstruct bpf_sock *”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÜubhŒ to ”…””}”(hjÜh²hh³Nh´Nubhè)”}”(hŒ``bpf_sk_assign()``”h]”hŒbpf_sk_assign()”…””}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÜubhŒi helper to record the selection. Selecting a socket only takes effect if the program has terminated with ”…””}”(hjÜh²hh³Nh´Nubhè)”}”(hŒ ``SK_PASS``”h]”hŒSK_PASS”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÜubhŒ code.”…””}”(hjÜh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K:hjYh²hubhÞ)”}”(hŒ‰When multiple programs are attached, the end result is determined from return codes of all the programs according to the following rules:”h]”hŒ‰When multiple programs are attached, the end result is determined from return codes of all the programs according to the following rules:”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KAhjYh²hubjs)”}”(hhh]”(jx)”}”(hŒwIf any program returned ``SK_PASS`` and selected a valid socket, the socket is used as the result of the socket lookup.”h]”hÞ)”}”(hŒwIf any program returned ``SK_PASS`` and selected a valid socket, the socket is used as the result of the socket lookup.”h]”(hŒIf any program returned ”…””}”(hjkh²hh³Nh´Nubhè)”}”(hŒ ``SK_PASS``”h]”hŒSK_PASS”…””}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjkubhŒT and selected a valid socket, the socket is used as the result of the socket lookup.”…””}”(hjkh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KDhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjdh²hh³hÇh´Nubjx)”}”(hŒeIf more than one program returned ``SK_PASS`` and selected a socket, the last selection takes effect.”h]”hÞ)”}”(hŒeIf more than one program returned ``SK_PASS`` and selected a socket, the last selection takes effect.”h]”(hŒ"If more than one program returned ”…””}”(hj•h²hh³Nh´Nubhè)”}”(hŒ ``SK_PASS``”h]”hŒSK_PASS”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj•ubhŒ8 and selected a socket, the last selection takes effect.”…””}”(hj•h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KFhj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjdh²hh³hÇh´Nubjx)”}”(hŒtIf any program returned ``SK_DROP``, and no program returned ``SK_PASS`` and selected a socket, socket lookup fails.”h]”hÞ)”}”(hŒtIf any program returned ``SK_DROP``, and no program returned ``SK_PASS`` and selected a socket, socket lookup fails.”h]”(hŒIf any program returned ”…””}”(hj¿h²hh³Nh´Nubhè)”}”(hŒ ``SK_DROP``”h]”hŒSK_DROP”…””}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj¿ubhŒ, and no program returned ”…””}”(hj¿h²hh³Nh´Nubhè)”}”(hŒ ``SK_PASS``”h]”hŒSK_PASS”…””}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj¿ubhŒ, and selected a socket, socket lookup fails.”…””}”(hj¿h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KHhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjdh²hh³hÇh´Nubjx)”}”(hŒeIf all programs returned ``SK_PASS`` and none of them selected a socket, socket lookup continues on. ”h]”hÞ)”}”(hŒdIf all programs returned ``SK_PASS`` and none of them selected a socket, socket lookup continues on.”h]”(hŒIf all programs returned ”…””}”(hjûh²hh³Nh´Nubhè)”}”(hŒ ``SK_PASS``”h]”hŒSK_PASS”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjûubhŒ@ and none of them selected a socket, socket lookup continues on.”…””}”(hjûh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KJhj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjdh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÁjÂjÃhjÄjÅuh1jrhjYh²hh³hÇh´KDubeh}”(h]”Œhooks”ah ]”h"]”Œhooks”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K,ubhÉ)”}”(hhh]”(hÎ)”}”(hŒAPI”h]”hŒAPI”…””}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj/h²hh³hÇh´KNubhÞ)”}”(hŒžIn its context, an instance of ``struct bpf_sk_lookup``, BPF sk_lookup program receives information about the packet that triggered the socket lookup. Namely:”h]”(hŒIn its context, an instance of ”…””}”(hj@h²hh³Nh´Nubhè)”}”(hŒ``struct bpf_sk_lookup``”h]”hŒstruct bpf_sk_lookup”…””}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj@ubhŒg, BPF sk_lookup program receives information about the packet that triggered the socket lookup. Namely:”…””}”(hj@h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KPhj/h²hubhŒ bullet_list”“”)”}”(hhh]”(jx)”}”(hŒ)IP version (``AF_INET`` or ``AF_INET6``),”h]”hÞ)”}”(hjgh]”(hŒ IP version (”…””}”(hjih²hh³Nh´Nubhè)”}”(hŒ ``AF_INET``”h]”hŒAF_INET”…””}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjiubhŒ or ”…””}”(hjih²hh³Nh´Nubhè)”}”(hŒ ``AF_INET6``”h]”hŒAF_INET6”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjiubhŒ),”…””}”(hjih²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KShjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jwhjbh²hh³hÇh´Nubjx)”}”(hŒ`_ man-page section for ``bpf_sk_assign()`` for details.”h]”(hŒ Refer to ”…””}”(hj;h²hh³Nh´Nubhè)”}”(hŒ``struct bpf_sk_lookup``”h]”hŒstruct bpf_sk_lookup”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj;ubhŒ declaration in ”…””}”(hj;h²hh³Nh´Nubhè)”}”(hŒ``linux/bpf.h``”h]”hŒ linux/bpf.h”…””}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj;ubhŒ user API header, and ”…””}”(hj;h²hh³Nh´NubhŒ reference”“”)”}”(hŒL`bpf-helpers(7) `_”h]”hŒbpf-helpers(7)”…””}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œbpf-helpers(7)”Œrefuri”Œ8https://man7.org/linux/man-pages/man7/bpf-helpers.7.html”uh1jghj;ubhŒtarget”“”)”}”(hŒ; ”h]”h}”(h]”Œ bpf-helpers-7”ah ]”h"]”Œbpf-helpers(7)”ah$]”h&]”Œrefuri”jzuh1j{Œ referenced”Khj;ubhŒ man-page section for ”…””}”(hj;h²hh³Nh´Nubhè)”}”(hŒ``bpf_sk_assign()``”h]”hŒbpf_sk_assign()”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj;ubhŒ for details.”…””}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KYhj/h²hubeh}”(h]”Œapi”ah ]”h"]”Œapi”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KNubhÉ)”}”(hhh]”(hÎ)”}”(hŒExample”h]”hŒExample”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¯h²hh³hÇh´K_ubhÞ)”}”(hŒ\See ``tools/testing/selftests/bpf/prog_tests/sk_lookup.c`` for the reference implementation.”h]”(hŒSee ”…””}”(hjÀh²hh³Nh´Nubhè)”}”(hŒ6``tools/testing/selftests/bpf/prog_tests/sk_lookup.c``”h]”hŒ2tools/testing/selftests/bpf/prog_tests/sk_lookup.c”…””}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÀubhŒ" for the reference implementation.”…””}”(hjÀh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kahj¯h²hubeh}”(h]”Œexample”ah ]”h"]”Œexample”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K_ubeh}”(h]”Œbpf-sk-lookup-program”ah ]”h"]”Œbpf sk_lookup program”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”}”(jíjêjëjèjVjSj,j)j¬j©j†jƒjåjâuŒ nametypes”}”(jí‰jë‰jV‰j,‰j¬‰j†ˆjå‰uh}”(jêhÊjèjAjSjîj)jYj©j/jƒj}jâ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”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.