History

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.

Matt Johnston committed 5 years ago

Commit 03f2bbc1 parent 26ab3fc6 files · +23 −2Browse files

Unified · Split

6 files
  1. include/net/mctp.h +2 −0
  2. include/net/netns/mctp.h +3 −0
  3. include/uapi/linux/mctp.h +0 −1
  4. net/mctp/af_mctp.c +3 −0
  5. net/mctp/device.c +1 −1
  6. net/mctp/route.c +14 −0
include/net/mctp.h+2−0
@@ -37,6 +37,8 @@ struct mctp_hdr { · 36 unmodified lines
37 37
38#define MCTP_HEADER_MAXLEN 438#define MCTP_HEADER_MAXLEN 4
39 39
40#define MCTP_INITIAL_DEFAULT_NET 1
41
40static inline bool mctp_address_ok(mctp_eid_t eid)42static inline bool mctp_address_ok(mctp_eid_t eid)
41{43{
42 return eid >= 8 && eid < 255;44 return eid >= 8 && eid < 255;
include/net/netns/mctp.h+3−0
@@ -25,6 +25,9 @@ struct netns_mctp { · 24 unmodified lines
25 spinlock_t keys_lock;25 spinlock_t keys_lock;
26 struct hlist_head keys;26 struct hlist_head keys;
27 27
28 /* MCTP network */
29 unsigned int default_net;
30
28 /* neighbour table */31 /* neighbour table */
29 struct mutex neigh_lock;32 struct mutex neigh_lock;
30 struct list_head neighbours;33 struct list_head neighbours;
include/uapi/linux/mctp.h+0−1
@@ -26,7 +26,6 @@ struct sockaddr_mctp { · 25 unmodified lines
26};26};
27 27
28#define MCTP_NET_ANY 0x028#define MCTP_NET_ANY 0x0
29#define MCTP_NET_DEFAULT 0x0
30 29
31#define MCTP_ADDR_NULL 0x0030#define MCTP_ADDR_NULL 0x00
32#define MCTP_ADDR_ANY 0xff31#define MCTP_ADDR_ANY 0xff
net/mctp/af_mctp.c+3−0
@@ -94,6 +94,9 @@ static int mctp_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) · 93 unmodified lines
94 if (!capable(CAP_NET_RAW))94 if (!capable(CAP_NET_RAW))
95 return -EACCES;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 rt = mctp_route_lookup(sock_net(sk), addr->smctp_network,100 rt = mctp_route_lookup(sock_net(sk), addr->smctp_network,
98 addr->smctp_addr.s_addr);101 addr->smctp_addr.s_addr);
99 if (!rt)102 if (!rt)
net/mctp/device.c+1−1
@@ -267,7 +267,7 @@ static struct mctp_dev *mctp_add_dev(struct net_device *dev) · 266 unmodified lines
267 267
268 spin_lock_init(&mdev->addrs_lock);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 /* associate to net_device */272 /* associate to net_device */
273 rcu_assign_pointer(dev->mctp_ptr, mdev);273 rcu_assign_pointer(dev->mctp_ptr, mdev);
net/mctp/route.c+14−0
@@ -433,6 +433,19 @@ static struct mctp_route *mctp_route_alloc(void) · 432 unmodified lines
433 return rt;433 return rt;
434}434}
435 435
436unsigned int mctp_default_net(struct net *net)
437{
438 return READ_ONCE(net->mctp.default_net);
439}
440
441int 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/* tag management */449/* tag management */
437static void mctp_reserve_tag(struct net *net, struct mctp_sk_key *key,450static void mctp_reserve_tag(struct net *net, struct mctp_sk_key *key,
438 struct mctp_sock *msk)451 struct mctp_sock *msk)
@@ -1045,6 +1058,7 @@ static int __net_init mctp_routes_net_init(struct net *net) · 606 unmodified lines
1045 mutex_init(&ns->bind_lock);1058 mutex_init(&ns->bind_lock);
1046 INIT_HLIST_HEAD(&ns->keys);1059 INIT_HLIST_HEAD(&ns->keys);
1047 spin_lock_init(&ns->keys_lock);1060 spin_lock_init(&ns->keys_lock);
1061 WARN_ON(mctp_default_net_set(net, MCTP_INITIAL_DEFAULT_NET));
1048 return 0;1062 return 0;
1049}1063}
1050 1064