Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mctp: Allow per-netns default networks

Currently we have a compile-time default network
(MCTP_INITIAL_DEFAULT_NET). This change introduces a default_net field
on the net namespace, allowing future configuration for new interfaces.

Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Matt Johnston and committed by
David S. Miller
03f2bbc4 26ab3fca

+23 -2
+2
include/net/mctp.h
··· 37 37 38 38 #define MCTP_HEADER_MAXLEN 4 39 39 40 + #define MCTP_INITIAL_DEFAULT_NET 1 41 + 40 42 static inline bool mctp_address_ok(mctp_eid_t eid) 41 43 { 42 44 return eid >= 8 && eid < 255;
+3
include/net/netns/mctp.h
··· 25 25 spinlock_t keys_lock; 26 26 struct hlist_head keys; 27 27 28 + /* MCTP network */ 29 + unsigned int default_net; 30 + 28 31 /* neighbour table */ 29 32 struct mutex neigh_lock; 30 33 struct list_head neighbours;
-1
include/uapi/linux/mctp.h
··· 26 26 }; 27 27 28 28 #define MCTP_NET_ANY 0x0 29 - #define MCTP_NET_DEFAULT 0x0 30 29 31 30 #define MCTP_ADDR_NULL 0x00 32 31 #define MCTP_ADDR_ANY 0xff
+3
net/mctp/af_mctp.c
··· 94 94 if (!capable(CAP_NET_RAW)) 95 95 return -EACCES; 96 96 97 + if (addr->smctp_network == MCTP_NET_ANY) 98 + addr->smctp_network = mctp_default_net(sock_net(sk)); 99 + 97 100 rt = mctp_route_lookup(sock_net(sk), addr->smctp_network, 98 101 addr->smctp_addr.s_addr); 99 102 if (!rt)
+1 -1
net/mctp/device.c
··· 267 267 268 268 spin_lock_init(&mdev->addrs_lock); 269 269 270 - mdev->net = MCTP_INITIAL_DEFAULT_NET; 270 + mdev->net = mctp_default_net(dev_net(dev)); 271 271 272 272 /* associate to net_device */ 273 273 rcu_assign_pointer(dev->mctp_ptr, mdev);
+14
net/mctp/route.c
··· 433 433 return rt; 434 434 } 435 435 436 + unsigned int mctp_default_net(struct net *net) 437 + { 438 + return READ_ONCE(net->mctp.default_net); 439 + } 440 + 441 + int mctp_default_net_set(struct net *net, unsigned int index) 442 + { 443 + if (index == 0) 444 + return -EINVAL; 445 + WRITE_ONCE(net->mctp.default_net, index); 446 + return 0; 447 + } 448 + 436 449 /* tag management */ 437 450 static void mctp_reserve_tag(struct net *net, struct mctp_sk_key *key, 438 451 struct mctp_sock *msk) ··· 1058 1045 mutex_init(&ns->bind_lock); 1059 1046 INIT_HLIST_HEAD(&ns->keys); 1060 1047 spin_lock_init(&ns->keys_lock); 1048 + WARN_ON(mctp_default_net_set(net, MCTP_INITIAL_DEFAULT_NET)); 1061 1049 return 0; 1062 1050 } 1063 1051