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.
Unified · Split
| @@ -37,6 +37,8 @@ struct mctp_hdr { · 36 unmodified lines | |||
| 37 | 37 | ||
| 38 | #define MCTP_HEADER_MAXLEN 4 | 38 | #define MCTP_HEADER_MAXLEN 4 |
| 39 | 39 | ||
| 40 | #define MCTP_INITIAL_DEFAULT_NET 1 | ||
| 41 | |||
| 40 | static inline bool mctp_address_ok(mctp_eid_t eid) | 42 | static inline bool mctp_address_ok(mctp_eid_t eid) |
| 41 | { | 43 | { |
| 42 | return eid >= 8 && eid < 255; | 44 | return eid >= 8 && eid < 255; |
| @@ -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; |
| @@ -26,7 +26,6 @@ struct sockaddr_mctp { · 25 unmodified lines | |||
| 26 | }; | 26 | }; |
| 27 | 27 | ||
| 28 | #define MCTP_NET_ANY 0x0 | 28 | #define MCTP_NET_ANY 0x0 |
| 29 | #define MCTP_NET_DEFAULT 0x0 | ||
| 30 | 29 | ||
| 31 | #define MCTP_ADDR_NULL 0x00 | 30 | #define MCTP_ADDR_NULL 0x00 |
| 32 | #define MCTP_ADDR_ANY 0xff | 31 | #define MCTP_ADDR_ANY 0xff |
| @@ -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) |
| @@ -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); |
| @@ -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 | ||
| 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 | /* tag management */ | 449 | /* tag management */ |
| 437 | static void mctp_reserve_tag(struct net *net, struct mctp_sk_key *key, | 450 | static 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 | ||