net: mctp: Add some detail on the key allocation implementation
We could do with a little more comment on where MCTP_ADDR_ANY will match in the key allocations. Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
ee076b73e5
commit
aee6479a45
@ -73,6 +73,40 @@ static struct mctp_sock *mctp_lookup_bind(struct net *net, struct sk_buff *skb)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* A note on the key allocations.
|
||||
*
|
||||
* struct net->mctp.keys contains our set of currently-allocated keys for
|
||||
* MCTP tag management. The lookup tuple for these is the peer EID,
|
||||
* local EID and MCTP tag.
|
||||
*
|
||||
* In some cases, the peer EID may be MCTP_EID_ANY: for example, when a
|
||||
* broadcast message is sent, we may receive responses from any peer EID.
|
||||
* Because the broadcast dest address is equivalent to ANY, we create
|
||||
* a key with (local = local-eid, peer = ANY). This allows a match on the
|
||||
* incoming broadcast responses from any peer.
|
||||
*
|
||||
* We perform lookups when packets are received, and when tags are allocated
|
||||
* in two scenarios:
|
||||
*
|
||||
* - when a packet is sent, with a locally-owned tag: we need to find an
|
||||
* unused tag value for the (local, peer) EID pair.
|
||||
*
|
||||
* - when a tag is manually allocated: we need to find an unused tag value
|
||||
* for the peer EID, but don't have a specific local EID at that stage.
|
||||
*
|
||||
* in the latter case, on successful allocation, we end up with a tag with
|
||||
* (local = ANY, peer = peer-eid).
|
||||
*
|
||||
* So, the key set allows both a local EID of ANY, as well as a peer EID of
|
||||
* ANY in the lookup tuple. Both may be ANY if we prealloc for a broadcast.
|
||||
* The matching (in mctp_key_match()) during lookup allows the match value to
|
||||
* be ANY in either the dest or source addresses.
|
||||
*
|
||||
* When allocating (+ inserting) a tag, we need to check for conflicts amongst
|
||||
* the existing tag set. This requires macthing either exactly on the local
|
||||
* and peer addresses, or either being ANY.
|
||||
*/
|
||||
|
||||
static bool mctp_key_match(struct mctp_sk_key *key, mctp_eid_t local,
|
||||
mctp_eid_t peer, u8 tag)
|
||||
{
|
||||
@ -368,6 +402,9 @@ static int mctp_route_input(struct mctp_route *route, struct sk_buff *skb)
|
||||
* key lookup to find the socket, but don't use this
|
||||
* key for reassembly - we'll create a more specific
|
||||
* one for future packets if required (ie, !EOM).
|
||||
*
|
||||
* this lookup requires key->peer to be MCTP_ADDR_ANY,
|
||||
* it doesn't match just any key->peer.
|
||||
*/
|
||||
any_key = mctp_lookup_key(net, skb, MCTP_ADDR_ANY, &f);
|
||||
if (any_key) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user