Osphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget#/translations/zh_CN/networking/mctpmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/zh_TW/networking/mctpmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/it_IT/networking/mctpmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ja_JP/networking/mctpmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ko_KR/networking/mctpmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/sp_SP/networking/mctpmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh=/var/lib/git/docbuild/linux/Documentation/networking/mctp.rsthKubhsection)}(hhh](htitle)}(h.Management Component Transport Protocol (MCTP)h]h.Management Component Transport Protocol (MCTP)}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hnet/mctp/ contains protocol support for MCTP, as defined by DMTF standard DSP0236. Physical interface drivers ("bindings" in the specification) are provided in drivers/net/mctp/.h]hnet/mctp/ contains protocol support for MCTP, as defined by DMTF standard DSP0236. Physical interface drivers (“bindings” in the specification) are provided in drivers/net/mctp/.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hyThe core code provides a socket-based interface to send and receive MCTP messages, through an AF_MCTP, SOCK_DGRAM socket.h]hyThe core code provides a socket-based interface to send and receive MCTP messages, through an AF_MCTP, SOCK_DGRAM socket.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hhh](h)}(h Structure: interfaces & networksh]h Structure: interfaces & networks}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hUThe kernel models the local MCTP topology through two items: interfaces and networks.h]hUThe kernel models the local MCTP topology through two items: interfaces and networks.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hAn interface (or "link") is an instance of an MCTP physical transport binding (as defined by DSP0236, section 3.2.47), likely connected to a specific hardware device. This is represented as a ``struct netdevice``.h](hAn interface (or “link”) is an instance of an MCTP physical transport binding (as defined by DSP0236, section 3.2.47), likely connected to a specific hardware device. This is represented as a }(hjhhhNhNubhliteral)}(h``struct netdevice``h]hstruct netdevice}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hA network defines a unique address space for MCTP endpoints by endpoint-ID (described by DSP0236, section 3.2.31). A network has a user-visible identifier to allow references from userspace. Route definitions are specific to one network.h]hA network defines a unique address space for MCTP endpoints by endpoint-ID (described by DSP0236, section 3.2.31). A network has a user-visible identifier to allow references from userspace. Route definitions are specific to one network.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hdInterfaces are associated with one network. A network may be associated with one or more interfaces.h]hdInterfaces are associated with one network. A network may be associated with one or more interfaces.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hoIf multiple networks are present, each may contain endpoint IDs (EIDs) that are also present on other networks.h]hoIf multiple networks are present, each may contain endpoint IDs (EIDs) that are also present on other networks.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]structure-interfaces-networksah ]h"] structure: interfaces & networksah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Sockets APIh]h Sockets API}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhhhhhK$ubh)}(hhh](h)}(hProtocol definitionsh]hProtocol definitions}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjkhhhhhK'ubh)}(hMCTP uses ``AF_MCTP`` / ``PF_MCTP`` for the address- and protocol- families. Since MCTP is message-based, only ``SOCK_DGRAM`` sockets are supported.h](h MCTP uses }(hj|hhhNhNubj)}(h ``AF_MCTP``h]hAF_MCTP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh / }(hj|hhhNhNubj)}(h ``PF_MCTP``h]hPF_MCTP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubhL for the address- and protocol- families. Since MCTP is message-based, only }(hj|hhhNhNubj)}(h``SOCK_DGRAM``h]h SOCK_DGRAM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh sockets are supported.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK)hjkhhubh literal_block)}(h(int sd = socket(AF_MCTP, SOCK_DGRAM, 0);h]h(int sd = socket(AF_MCTP, SOCK_DGRAM, 0);}hjsbah}(h]h ]h"]h$]h&]hhforcelanguageChighlight_args}uh1jhhhK,hjkhhubh)}(h= sizeof(buf)); assert(addr.smctp_family == AF_MCTP); printf("received %zd bytes from remote EID %d\n", rc, addr.smctp_addr);h]hXstruct sockaddr_mctp addr; socklen_t addrlen; char buf[14]; ssize_t len; addrlen = sizeof(addr); len = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr_mctp *)&addr, &addrlen); /* We can expect addr to describe an MCTP address */ assert(addrlen >= sizeof(buf)); assert(addr.smctp_family == AF_MCTP); printf("received %zd bytes from remote EID %d\n", rc, addr.smctp_addr);}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKhjEhhubh)}(hThe address argument to ``recvfrom`` and ``recvmsg`` is populated with the remote address of the incoming message, including tag value (this will be needed in order to reply to the message).h](hThe address argument to }(hjhhhNhNubj)}(h ``recvfrom``h]hrecvfrom}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h ``recvmsg``h]hrecvmsg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is populated with the remote address of the incoming message, including tag value (this will be needed in order to reply to the message).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hThe first byte of the message buffer will contain the message type byte. If an integrity check follows the message, it will be included in the received buffer.h]hThe first byte of the message buffer will contain the message type byte. If an integrity check follows the message, it will be included in the received buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hThe ``recv()`` system call behaves in a similar way, but does not provide a remote address to the application. Therefore, these are only useful if the remote address is already known, or the message does not require a reply.h](hThe }(hj-hhhNhNubj)}(h ``recv()``h]hrecv()}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubh system call behaves in a similar way, but does not provide a remote address to the application. Therefore, these are only useful if the remote address is already known, or the message does not require a reply.}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hLike the send calls, sockets will only receive responses to requests they have sent (TO=1) and may only respond (TO=0) to requests they have received.h]hLike the send calls, sockets will only receive responses to requests they have sent (TO=1) and may only respond (TO=0) to requests they have received.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubeh}(h]-recvfrom-recvmsg-recv-receive-an-mctp-messageah ]h"]7recvfrom(), recvmsg(), recv() : receive an mctp messageah$]h&]uh1hhj,hhhhhKubh)}(hhh](h)}(h:``ioctl(SIOCMCTPALLOCTAG)`` and ``ioctl(SIOCMCTPDROPTAG)``h](j)}(h``ioctl(SIOCMCTPALLOCTAG)``h]hioctl(SIOCMCTPALLOCTAG)}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh and }(hjfhhhNhNubj)}(h``ioctl(SIOCMCTPDROPTAG)``h]hioctl(SIOCMCTPDROPTAG)}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1hhjchhhhhKubh)}(hThese tags give applications more control over MCTP message tags, by allocating (and dropping) tag values explicitly, rather than the kernel automatically allocating a per-message tag at ``sendmsg()`` time.h](hThese tags give applications more control over MCTP message tags, by allocating (and dropping) tag values explicitly, rather than the kernel automatically allocating a per-message tag at }(hjhhhNhNubj)}(h ``sendmsg()``h]h sendmsg()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh time.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjchhubh)}(hXsIn general, you will only need to use these ioctls if your MCTP protocol does not fit the usual request/response model. For example, if you need to persist tags across multiple requests, or a request may generate more than one response. In these cases, the ioctls allow you to decouple the tag allocation (and release) from individual message send and receive operations.h]hXsIn general, you will only need to use these ioctls if your MCTP protocol does not fit the usual request/response model. For example, if you need to persist tags across multiple requests, or a request may generate more than one response. In these cases, the ioctls allow you to decouple the tag allocation (and release) from individual message send and receive operations.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjchhubh)}(hBBoth ioctls are passed a pointer to a ``struct mctp_ioc_tag_ctl``:h](h&Both ioctls are passed a pointer to a }(hjhhhNhNubj)}(h``struct mctp_ioc_tag_ctl``h]hstruct mctp_ioc_tag_ctl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjchhubj)}(hostruct mctp_ioc_tag_ctl { mctp_eid_t peer_addr; __u8 tag; __u16 flags; };h]hostruct mctp_ioc_tag_ctl { mctp_eid_t peer_addr; __u8 tag; __u16 flags; };}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKhjchhubh)}(h``SIOCMCTPALLOCTAG`` allocates a tag for a specific peer, which an application can use in future ``sendmsg()`` calls. The application populates the ``peer_addr`` member with the remote EID. Other fields must be zero.h](j)}(h``SIOCMCTPALLOCTAG``h]hSIOCMCTPALLOCTAG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhM allocates a tag for a specific peer, which an application can use in future }(hjhhhNhNubj)}(h ``sendmsg()``h]h sendmsg()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh& calls. The application populates the }(hjhhhNhNubj)}(h ``peer_addr``h]h peer_addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh7 member with the remote EID. Other fields must be zero.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjchhubh)}(hOn return, the ``tag`` member will be populated with the allocated tag value. The allocated tag will have the following tag bits set:h](hOn return, the }(hj-hhhNhNubj)}(h``tag``h]htag}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubho member will be populated with the allocated tag value. The allocated tag will have the following tag bits set:}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjchhubh block_quote)}(hX4- ``MCTP_TAG_OWNER``: it only makes sense to allocate tags if you're the tag owner - ``MCTP_TAG_PREALLOC``: to indicate to ``sendmsg()`` that this is a preallocated tag. - ... and the actual tag value, within the least-significant three bits (``MCTP_TAG_MASK``). Note that zero is a valid tag value. h]h bullet_list)}(hhh](h list_item)}(hQ``MCTP_TAG_OWNER``: it only makes sense to allocate tags if you're the tag owner h]h)}(hP``MCTP_TAG_OWNER``: it only makes sense to allocate tags if you're the tag ownerh](j)}(h``MCTP_TAG_OWNER``h]hMCTP_TAG_OWNER}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubh@: it only makes sense to allocate tags if you’re the tag owner}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjZubah}(h]h ]h"]h$]h&]uh1jXhjUubjY)}(hU``MCTP_TAG_PREALLOC``: to indicate to ``sendmsg()`` that this is a preallocated tag. h]h)}(hT``MCTP_TAG_PREALLOC``: to indicate to ``sendmsg()`` that this is a preallocated tag.h](j)}(h``MCTP_TAG_PREALLOC``h]hMCTP_TAG_PREALLOC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh: to indicate to }(hjhhhNhNubj)}(h ``sendmsg()``h]h sendmsg()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! that this is a preallocated tag.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jXhjUubjY)}(h... and the actual tag value, within the least-significant three bits (``MCTP_TAG_MASK``). Note that zero is a valid tag value. h]h)}(h... and the actual tag value, within the least-significant three bits (``MCTP_TAG_MASK``). Note that zero is a valid tag value.h](hG... and the actual tag value, within the least-significant three bits (}(hjhhhNhNubj)}(h``MCTP_TAG_MASK``h]h MCTP_TAG_MASK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh'). Note that zero is a valid tag value.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jXhjUubeh}(h]h ]h"]h$]h&]bullet-uh1jShhhKhjOubah}(h]h ]h"]h$]h&]uh1jMhhhKhjchhubh)}(h\The tag value should be used as-is for the ``smctp_tag`` member of ``struct sockaddr_mctp``.h](h+The tag value should be used as-is for the }(hjhhhNhNubj)}(h ``smctp_tag``h]h smctp_tag}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh member of }(hjhhhNhNubj)}(h``struct sockaddr_mctp``h]hstruct sockaddr_mctp}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjchhubh)}(hXX``SIOCMCTPDROPTAG`` releases a tag that has been previously allocated by a ``SIOCMCTPALLOCTAG`` ioctl. The ``peer_addr`` must be the same as used for the allocation, and the ``tag`` value must match exactly the tag returned from the allocation (including the ``MCTP_TAG_OWNER`` and ``MCTP_TAG_PREALLOC`` bits). The ``flags`` field must be zero.h](j)}(h``SIOCMCTPDROPTAG``h]hSIOCMCTPDROPTAG}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh8 releases a tag that has been previously allocated by a }(hj"hhhNhNubj)}(h``SIOCMCTPALLOCTAG``h]hSIOCMCTPALLOCTAG}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh ioctl. The }(hj"hhhNhNubj)}(h ``peer_addr``h]h peer_addr}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh6 must be the same as used for the allocation, and the }(hj"hhhNhNubj)}(h``tag``h]htag}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubhN value must match exactly the tag returned from the allocation (including the }(hj"hhhNhNubj)}(h``MCTP_TAG_OWNER``h]hMCTP_TAG_OWNER}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh and }(hj"hhhNhNubj)}(h``MCTP_TAG_PREALLOC``h]hMCTP_TAG_PREALLOC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh bits). The }(hj"hhhNhNubj)}(h ``flags``h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh field must be zero.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjchhubeh}(h]0ioctl-siocmctpalloctag-and-ioctl-siocmctpdroptagah ]h"]2ioctl(siocmctpalloctag) and ioctl(siocmctpdroptag)ah$]h&]uh1hhj,hhhhhKubeh}(h]syscall-behaviourah ]h"]syscall behaviourah$]h&]uh1hhjZhhhhhKJubeh}(h] sockets-apiah ]h"] sockets apiah$]h&]uh1hhhhhhhhK$ubh)}(hhh](h)}(hKernel internalsh]hKernel internals}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(h8There are a few possible packet flows in the MCTP stack:h]h8There are a few possible packet flows in the MCTP stack:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubhenumerated_list)}(hhh](jY)}(hlocal TX to remote endpoint, message <= MTU:: sendmsg() -> mctp_local_output() : route lookup -> rt->output() (== mctp_route_output) -> dev_queue_xmit() h](h)}(h-local TX to remote endpoint, message <= MTU::h]h,local TX to remote endpoint, message <= MTU:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubj)}(hzsendmsg() -> mctp_local_output() : route lookup -> rt->output() (== mctp_route_output) -> dev_queue_xmit()h]hzsendmsg() -> mctp_local_output() : route lookup -> rt->output() (== mctp_route_output) -> dev_queue_xmit()}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhMhjubeh}(h]h ]h"]h$]h&]uh1jXhjhhhhhNubjY)}(hXlocal TX to remote endpoint, message > MTU:: sendmsg() -> mctp_local_output() -> mctp_do_fragment_route() : creates packet-sized skbs. For each new skb: -> rt->output() (== mctp_route_output) -> dev_queue_xmit() h](h)}(h,local TX to remote endpoint, message > MTU::h]h+local TX to remote endpoint, message > MTU:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubj)}(hsendmsg() -> mctp_local_output() -> mctp_do_fragment_route() : creates packet-sized skbs. For each new skb: -> rt->output() (== mctp_route_output) -> dev_queue_xmit()h]hsendmsg() -> mctp_local_output() -> mctp_do_fragment_route() : creates packet-sized skbs. For each new skb: -> rt->output() (== mctp_route_output) -> dev_queue_xmit()}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj ubeh}(h]h ]h"]h$]h&]uh1jXhjhhhhhNubjY)}(hremote TX to local endpoint, single-packet message:: mctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup -> sock_queue_rcv_skb() h](h)}(h4remote TX to local endpoint, single-packet message::h]h3remote TX to local endpoint, single-packet message:}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj2 ubj)}(hymctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup -> sock_queue_rcv_skb()h]hymctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup -> sock_queue_rcv_skb()}hjD sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj2 ubeh}(h]h ]h"]h$]h&]uh1jXhjhhhhhNubjY)}(hXremote TX to local endpoint, multiple-packet message:: mctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup : stores skb in struct sk_key->reasm_head mctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup : finds existing reassembly in sk_key->reasm_head : appends new fragment -> sock_queue_rcv_skb() h](h)}(h6remote TX to local endpoint, multiple-packet message::h]h5remote TX to local endpoint, multiple-packet message:}(hj\ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM%hjX ubj)}(hXUmctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup : stores skb in struct sk_key->reasm_head mctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup : finds existing reassembly in sk_key->reasm_head : appends new fragment -> sock_queue_rcv_skb()h]hXUmctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup : stores skb in struct sk_key->reasm_head mctp_pkttype_receive() : route lookup -> rt->output() (== mctp_route_input) : sk_key lookup : finds existing reassembly in sk_key->reasm_head : appends new fragment -> sock_queue_rcv_skb()}hjj sbah}(h]h ]h"]h$]h&]hhuh1jhhhM'hjX ubeh}(h]h ]h"]h$]h&]uh1jXhjhhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjhhhhhM ubh)}(hhh](h)}(h Key refcountsh]h Key refcounts}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM6ubjN)}(hX+* keys are refed by: - a skb: during route output, stored in ``skb->cb``. - netns and sock lists. * keys can be associated with a device, in which case they hold a reference to the dev (set through ``key->dev``, counted through ``dev->key_count``). Multiple keys can reference the device.h]jT)}(hhh](jY)}(hbkeys are refed by: - a skb: during route output, stored in ``skb->cb``. - netns and sock lists. h](h)}(hkeys are refed by:h]hkeys are refed by:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM8hj ubjT)}(hhh](jY)}(h3a skb: during route output, stored in ``skb->cb``. h]h)}(h2a skb: during route output, stored in ``skb->cb``.h](h&a skb: during route output, stored in }(hj hhhNhNubj)}(h ``skb->cb``h]hskb->cb}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM:hj ubah}(h]h ]h"]h$]h&]uh1jXhj ubjY)}(hnetns and sock lists. h]h)}(hnetns and sock lists.h]hnetns and sock lists.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hj ubah}(h]h ]h"]h$]h&]uh1jXhj ubeh}(h]h ]h"]h$]h&]jjuh1jShhhM:hj ubeh}(h]h ]h"]h$]h&]uh1jXhj ubjY)}(hkeys can be associated with a device, in which case they hold a reference to the dev (set through ``key->dev``, counted through ``dev->key_count``). Multiple keys can reference the device.h]h)}(hkeys can be associated with a device, in which case they hold a reference to the dev (set through ``key->dev``, counted through ``dev->key_count``). Multiple keys can reference the device.h](hbkeys can be associated with a device, in which case they hold a reference to the dev (set through }(hj hhhNhNubj)}(h ``key->dev``h]hkey->dev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, counted through }(hj hhhNhNubj)}(h``dev->key_count``h]hdev->key_count}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh*). Multiple keys can reference the device.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM>hj ubah}(h]h ]h"]h$]h&]uh1jXhj ubeh}(h]h ]h"]h$]h&]j*uh1jShhhM8hj ubah}(h]h ]h"]h$]h&]uh1jMhhhM8hj hhubeh}(h] key-refcountsah ]h"] key refcountsah$]h&]uh1hhjhhhhhM6ubeh}(h]kernel-internalsah ]h"]kernel internalsah$]h&]uh1hhhhhhhhMubeh}(h],management-component-transport-protocol-mctpah ]h"].management component transport protocol (mctp)ah$]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_handlerj error_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}(jb j_ jWjTjjj)j&jjjjjBj?j`j]jjjZ jW jR jO u nametypes}(jb jWjj)jjjBj`jjZ jR uh}(j_ hjThjjZj&jkjj,jjKj?jj]jEjjcjW jjO j u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.