Skip to content

Commit

Permalink
doc/mctp: Add a little detail about kernel internals
Browse files Browse the repository at this point in the history
Describe common flows and refcounting behaviour.

Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jeremy Kerr authored and David S. Miller committed Sep 29, 2021
1 parent 97f09ab commit f4d41c5
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions Documentation/networking/mctp.rst
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,62 @@ remote address is already known, or the message does not require a reply.

Like 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.

Kernel internals
================

There are a few possible packet flows in the MCTP stack:

1. local TX to remote endpoint, message <= MTU::

sendmsg()
-> mctp_local_output()
: route lookup
-> rt->output() (== mctp_route_output)
-> dev_queue_xmit()

2. local 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()

3. remote TX to local endpoint, single-packet message::

mctp_pkttype_receive()
: route lookup
-> rt->output() (== mctp_route_input)
: sk_key lookup
-> sock_queue_rcv_skb()

4. remote 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()

Key refcounts
-------------

* 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.

0 comments on commit f4d41c5

Please sign in to comment.