mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-28 09:22:08 +00:00

Ensure that a specific EID (remote or local) bind will match in preference to a MCTP_ADDR_ANY bind. This adds infrastructure for binding a socket to receive messages from a specific remote peer address, a future commit will expose an API for this. Signed-off-by: Matt Johnston <matt@codeconstruct.com.au> Link: https://patch.msgid.link/20250710-mctp-bind-v4-5-8ec2f6460c56@codeconstruct.com.au Signed-off-by: Paolo Abeni <pabeni@redhat.com>
50 lines
1.2 KiB
C
50 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* MCTP per-net structures
|
|
*/
|
|
|
|
#ifndef __NETNS_MCTP_H__
|
|
#define __NETNS_MCTP_H__
|
|
|
|
#include <linux/hash.h>
|
|
#include <linux/hashtable.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/types.h>
|
|
|
|
#define MCTP_BINDS_BITS 7
|
|
|
|
struct netns_mctp {
|
|
/* Only updated under RTNL, entries freed via RCU */
|
|
struct list_head routes;
|
|
|
|
/* Bound sockets: hash table of sockets, keyed by
|
|
* (type, src_eid, dest_eid).
|
|
* Specific src_eid/dest_eid entries also have an entry for
|
|
* MCTP_ADDR_ANY. This list is updated from non-atomic contexts
|
|
* (under bind_lock), and read (under rcu) in packet rx.
|
|
*/
|
|
struct mutex bind_lock;
|
|
DECLARE_HASHTABLE(binds, MCTP_BINDS_BITS);
|
|
|
|
/* tag allocations. This list is read and updated from atomic contexts,
|
|
* but elements are free()ed after a RCU grace-period
|
|
*/
|
|
spinlock_t keys_lock;
|
|
struct hlist_head keys;
|
|
|
|
/* MCTP network */
|
|
unsigned int default_net;
|
|
|
|
/* neighbour table */
|
|
struct mutex neigh_lock;
|
|
struct list_head neighbours;
|
|
};
|
|
|
|
static inline u32 mctp_bind_hash(u8 type, u8 local_addr, u8 peer_addr)
|
|
{
|
|
return hash_32(type | (u32)local_addr << 8 | (u32)peer_addr << 16,
|
|
MCTP_BINDS_BITS);
|
|
}
|
|
|
|
#endif /* __NETNS_MCTP_H__ */
|