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

net: Use link/peer netns in newlink() of rtnl_link_ops

Add two helper functions - rtnl_newlink_link_net() and
rtnl_newlink_peer_net() for netns fallback logic. Peer netns falls back
to link netns, and link netns falls back to source netns.

Convert the use of params->net in netdevice drivers to one of the helper
functions for clarity.

Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250219125039.18024-4-shaw.leon@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Xiao Liang and committed by
Jakub Kicinski
cf517ac1 69c7be1b

+58 -41
+2 -2
drivers/infiniband/ulp/ipoib/ipoib_netlink.c
··· 101 101 struct rtnl_newlink_params *params, 102 102 struct netlink_ext_ack *extack) 103 103 { 104 + struct net *link_net = rtnl_newlink_link_net(params); 104 105 struct nlattr **data = params->data; 105 - struct net *src_net = params->net; 106 106 struct nlattr **tb = params->tb; 107 107 struct net_device *pdev; 108 108 struct ipoib_dev_priv *ppriv; ··· 112 112 if (!tb[IFLA_LINK]) 113 113 return -EINVAL; 114 114 115 - pdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); 115 + pdev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK])); 116 116 if (!pdev || pdev->type != ARPHRD_INFINIBAND) 117 117 return -ENODEV; 118 118
+3 -3
drivers/net/amt.c
··· 3165 3165 struct rtnl_newlink_params *params, 3166 3166 struct netlink_ext_ack *extack) 3167 3167 { 3168 + struct net *link_net = rtnl_newlink_link_net(params); 3168 3169 struct amt_dev *amt = netdev_priv(dev); 3169 3170 struct nlattr **data = params->data; 3170 3171 struct nlattr **tb = params->tb; 3171 - struct net *net = params->net; 3172 3172 int err = -EINVAL; 3173 3173 3174 - amt->net = net; 3174 + amt->net = link_net; 3175 3175 amt->mode = nla_get_u32(data[IFLA_AMT_MODE]); 3176 3176 3177 3177 if (data[IFLA_AMT_MAX_TUNNELS] && ··· 3186 3186 amt->hash_buckets = AMT_HSIZE; 3187 3187 amt->nr_tunnels = 0; 3188 3188 get_random_bytes(&amt->hash_seed, sizeof(amt->hash_seed)); 3189 - amt->stream_dev = dev_get_by_index(net, 3189 + amt->stream_dev = dev_get_by_index(link_net, 3190 3190 nla_get_u32(data[IFLA_AMT_LINK])); 3191 3191 if (!amt->stream_dev) { 3192 3192 NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_AMT_LINK],
+2 -2
drivers/net/bareudp.c
··· 702 702 struct rtnl_newlink_params *params, 703 703 struct netlink_ext_ack *extack) 704 704 { 705 + struct net *link_net = rtnl_newlink_link_net(params); 705 706 struct nlattr **data = params->data; 706 707 struct nlattr **tb = params->tb; 707 - struct net *net = params->net; 708 708 struct bareudp_conf conf; 709 709 int err; 710 710 ··· 712 712 if (err) 713 713 return err; 714 714 715 - err = bareudp_configure(net, dev, &conf, extack); 715 + err = bareudp_configure(link_net, dev, &conf, extack); 716 716 if (err) 717 717 return err; 718 718
+1 -1
drivers/net/can/vxcan.c
··· 176 176 struct rtnl_newlink_params *params, 177 177 struct netlink_ext_ack *extack) 178 178 { 179 + struct net *peer_net = rtnl_newlink_peer_net(params); 179 180 struct nlattr **data = params->data; 180 - struct net *peer_net = params->net; 181 181 struct nlattr **tb = params->tb; 182 182 struct vxcan_priv *priv; 183 183 struct net_device *peer;
+2 -2
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
··· 121 121 struct rtnl_newlink_params *params, 122 122 struct netlink_ext_ack *extack) 123 123 { 124 + struct net *link_net = rtnl_newlink_link_net(params); 124 125 u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION; 125 126 struct nlattr **data = params->data; 126 - struct net *src_net = params->net; 127 127 struct nlattr **tb = params->tb; 128 128 struct net_device *real_dev; 129 129 int mode = RMNET_EPMODE_VND; ··· 137 137 return -EINVAL; 138 138 } 139 139 140 - real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); 140 + real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK])); 141 141 if (!real_dev) { 142 142 NL_SET_ERR_MSG_MOD(extack, "link does not exist"); 143 143 return -ENODEV;
+2 -2
drivers/net/geneve.c
··· 1618 1618 struct rtnl_newlink_params *params, 1619 1619 struct netlink_ext_ack *extack) 1620 1620 { 1621 + struct net *link_net = rtnl_newlink_link_net(params); 1621 1622 struct nlattr **data = params->data; 1622 1623 struct nlattr **tb = params->tb; 1623 - struct net *net = params->net; 1624 1624 struct geneve_config cfg = { 1625 1625 .df = GENEVE_DF_UNSET, 1626 1626 .use_udp6_rx_checksums = false, ··· 1634 1634 if (err) 1635 1635 return err; 1636 1636 1637 - err = geneve_configure(net, dev, extack, &cfg); 1637 + err = geneve_configure(link_net, dev, extack, &cfg); 1638 1638 if (err) 1639 1639 return err; 1640 1640
+3 -3
drivers/net/gtp.c
··· 1466 1466 struct rtnl_newlink_params *params, 1467 1467 struct netlink_ext_ack *extack) 1468 1468 { 1469 + struct net *link_net = rtnl_newlink_link_net(params); 1469 1470 struct nlattr **data = params->data; 1470 - struct net *src_net = params->net; 1471 1471 unsigned int role = GTP_ROLE_GGSN; 1472 1472 struct gtp_dev *gtp; 1473 1473 struct gtp_net *gn; ··· 1498 1498 gtp->restart_count = nla_get_u8_default(data[IFLA_GTP_RESTART_COUNT], 1499 1499 0); 1500 1500 1501 - gtp->net = src_net; 1501 + gtp->net = link_net; 1502 1502 1503 1503 err = gtp_hashtable_new(gtp, hashsize); 1504 1504 if (err < 0) ··· 1528 1528 goto out_encap; 1529 1529 } 1530 1530 1531 - gn = net_generic(src_net, gtp_net_id); 1531 + gn = net_generic(link_net, gtp_net_id); 1532 1532 list_add(&gtp->list, &gn->gtp_dev_list); 1533 1533 dev->priv_destructor = gtp_destructor; 1534 1534
+2 -2
drivers/net/ipvlan/ipvlan_main.c
··· 535 535 int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params, 536 536 struct netlink_ext_ack *extack) 537 537 { 538 + struct net *link_net = rtnl_newlink_link_net(params); 538 539 struct ipvl_dev *ipvlan = netdev_priv(dev); 539 540 struct nlattr **data = params->data; 540 - struct net *src_net = params->net; 541 541 struct nlattr **tb = params->tb; 542 542 struct ipvl_port *port; 543 543 struct net_device *phy_dev; ··· 547 547 if (!tb[IFLA_LINK]) 548 548 return -EINVAL; 549 549 550 - phy_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); 550 + phy_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK])); 551 551 if (!phy_dev) 552 552 return -ENODEV; 553 553
+2 -2
drivers/net/macsec.c
··· 4145 4145 struct rtnl_newlink_params *params, 4146 4146 struct netlink_ext_ack *extack) 4147 4147 { 4148 + struct net *link_net = rtnl_newlink_link_net(params); 4148 4149 struct macsec_dev *macsec = macsec_priv(dev); 4149 4150 struct nlattr **data = params->data; 4150 4151 struct nlattr **tb = params->tb; 4151 - struct net *net = params->net; 4152 4152 rx_handler_func_t *rx_handler; 4153 4153 u8 icv_len = MACSEC_DEFAULT_ICV_LEN; 4154 4154 struct net_device *real_dev; ··· 4157 4157 4158 4158 if (!tb[IFLA_LINK]) 4159 4159 return -EINVAL; 4160 - real_dev = __dev_get_by_index(net, nla_get_u32(tb[IFLA_LINK])); 4160 + real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK])); 4161 4161 if (!real_dev) 4162 4162 return -ENODEV; 4163 4163 if (real_dev->type != ARPHRD_ETHER)
+2 -2
drivers/net/macvlan.c
··· 1444 1444 struct rtnl_newlink_params *params, 1445 1445 struct netlink_ext_ack *extack) 1446 1446 { 1447 + struct net *link_net = rtnl_newlink_link_net(params); 1447 1448 struct macvlan_dev *vlan = netdev_priv(dev); 1448 1449 struct nlattr **data = params->data; 1449 - struct net *src_net = params->net; 1450 1450 struct nlattr **tb = params->tb; 1451 1451 struct net_device *lowerdev; 1452 1452 struct macvlan_port *port; ··· 1457 1457 if (!tb[IFLA_LINK]) 1458 1458 return -EINVAL; 1459 1459 1460 - lowerdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); 1460 + lowerdev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK])); 1461 1461 if (lowerdev == NULL) 1462 1462 return -ENODEV; 1463 1463
+1 -1
drivers/net/netkit.c
··· 331 331 struct rtnl_newlink_params *params, 332 332 struct netlink_ext_ack *extack) 333 333 { 334 + struct net *peer_net = rtnl_newlink_peer_net(params); 334 335 enum netkit_scrub scrub_prim = NETKIT_SCRUB_DEFAULT; 335 336 enum netkit_scrub scrub_peer = NETKIT_SCRUB_DEFAULT; 336 337 struct nlattr *peer_tb[IFLA_MAX + 1], **tbp, *attr; 337 338 enum netkit_action policy_prim = NETKIT_PASS; 338 339 enum netkit_action policy_peer = NETKIT_PASS; 339 340 struct nlattr **data = params->data; 340 - struct net *peer_net = params->net; 341 341 enum netkit_mode mode = NETKIT_L3; 342 342 unsigned char ifname_assign_type; 343 343 struct nlattr **tb = params->tb;
+3 -3
drivers/net/pfcp.c
··· 188 188 struct rtnl_newlink_params *params, 189 189 struct netlink_ext_ack *extack) 190 190 { 191 + struct net *link_net = rtnl_newlink_link_net(params); 191 192 struct pfcp_dev *pfcp = netdev_priv(dev); 192 - struct net *net = params->net; 193 193 struct pfcp_net *pn; 194 194 int err; 195 195 196 - pfcp->net = net; 196 + pfcp->net = link_net; 197 197 198 198 err = pfcp_add_sock(pfcp); 199 199 if (err) { ··· 207 207 goto exit_del_pfcp_sock; 208 208 } 209 209 210 - pn = net_generic(net, pfcp_net_id); 210 + pn = net_generic(link_net, pfcp_net_id); 211 211 list_add(&pfcp->list, &pn->pfcp_dev_list); 212 212 213 213 netdev_dbg(dev, "registered new PFCP interface\n");
+2 -2
drivers/net/ppp/ppp_generic.c
··· 1307 1307 struct rtnl_newlink_params *params, 1308 1308 struct netlink_ext_ack *extack) 1309 1309 { 1310 + struct net *link_net = rtnl_newlink_link_net(params); 1310 1311 struct nlattr **data = params->data; 1311 - struct net *src_net = params->net; 1312 1312 struct nlattr **tb = params->tb; 1313 1313 struct ppp_config conf = { 1314 1314 .unit = -1, ··· 1346 1346 if (!tb[IFLA_IFNAME] || !nla_len(tb[IFLA_IFNAME]) || !*(char *)nla_data(tb[IFLA_IFNAME])) 1347 1347 conf.ifname_is_set = false; 1348 1348 1349 - err = ppp_dev_configure(src_net, dev, &conf); 1349 + err = ppp_dev_configure(link_net, dev, &conf); 1350 1350 1351 1351 out_unlock: 1352 1352 mutex_unlock(&ppp_mutex);
+1 -1
drivers/net/veth.c
··· 1769 1769 struct rtnl_newlink_params *params, 1770 1770 struct netlink_ext_ack *extack) 1771 1771 { 1772 + struct net *peer_net = rtnl_newlink_peer_net(params); 1772 1773 struct nlattr **data = params->data; 1773 - struct net *peer_net = params->net; 1774 1774 struct nlattr **tb = params->tb; 1775 1775 int err; 1776 1776 struct net_device *peer;
+2 -2
drivers/net/vxlan/vxlan_core.c
··· 4404 4404 struct rtnl_newlink_params *params, 4405 4405 struct netlink_ext_ack *extack) 4406 4406 { 4407 + struct net *link_net = rtnl_newlink_link_net(params); 4407 4408 struct nlattr **data = params->data; 4408 - struct net *src_net = params->net; 4409 4409 struct nlattr **tb = params->tb; 4410 4410 struct vxlan_config conf; 4411 4411 int err; ··· 4414 4414 if (err) 4415 4415 return err; 4416 4416 4417 - return __vxlan_dev_create(src_net, dev, &conf, extack); 4417 + return __vxlan_dev_create(link_net, dev, &conf, extack); 4418 4418 } 4419 4419 4420 4420 static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
+2 -2
drivers/net/wireguard/device.c
··· 311 311 struct rtnl_newlink_params *params, 312 312 struct netlink_ext_ack *extack) 313 313 { 314 + struct net *link_net = rtnl_newlink_link_net(params); 314 315 struct wg_device *wg = netdev_priv(dev); 315 - struct net *src_net = params->net; 316 316 int ret = -ENOMEM; 317 317 318 - rcu_assign_pointer(wg->creating_net, src_net); 318 + rcu_assign_pointer(wg->creating_net, link_net); 319 319 init_rwsem(&wg->static_identity.lock); 320 320 mutex_init(&wg->socket_update_lock); 321 321 mutex_init(&wg->device_update_lock);
+2 -2
drivers/net/wireless/virtual/virt_wifi.c
··· 524 524 struct netlink_ext_ack *extack) 525 525 { 526 526 struct virt_wifi_netdev_priv *priv = netdev_priv(dev); 527 - struct net *src_net = params->net; 527 + struct net *link_net = rtnl_newlink_link_net(params); 528 528 struct nlattr **tb = params->tb; 529 529 int err; 530 530 ··· 534 534 netif_carrier_off(dev); 535 535 536 536 priv->upperdev = dev; 537 - priv->lowerdev = __dev_get_by_index(src_net, 537 + priv->lowerdev = __dev_get_by_index(link_net, 538 538 nla_get_u32(tb[IFLA_LINK])); 539 539 540 540 if (!priv->lowerdev)
+1 -1
drivers/net/wwan/wwan_core.c
··· 1065 1065 struct nlattr *tb[IFLA_MAX + 1], *linkinfo[IFLA_INFO_MAX + 1]; 1066 1066 struct nlattr *data[IFLA_WWAN_MAX + 1]; 1067 1067 struct rtnl_newlink_params params = { 1068 - .net = &init_net, 1068 + .src_net = &init_net, 1069 1069 .tb = tb, 1070 1070 .data = data, 1071 1071 };
+17
include/net/rtnetlink.h
··· 88 88 struct nlattr **data; 89 89 }; 90 90 91 + /* Get effective link netns from newlink params. Generally, this is link_net 92 + * and falls back to src_net. But for compatibility, a driver may * choose to 93 + * use dev_net(dev) instead. 94 + */ 95 + static inline struct net *rtnl_newlink_link_net(struct rtnl_newlink_params *p) 96 + { 97 + return p->link_net ? : p->src_net; 98 + } 99 + 100 + /* Get peer netns from newlink params. Fallback to link netns if peer netns is 101 + * not specified explicitly. 102 + */ 103 + static inline struct net *rtnl_newlink_peer_net(struct rtnl_newlink_params *p) 104 + { 105 + return p->peer_net ? : rtnl_newlink_link_net(p); 106 + } 107 + 91 108 /** 92 109 * struct rtnl_link_ops - rtnetlink link operations 93 110 *
+2 -2
net/8021q/vlan_netlink.c
··· 139 139 struct rtnl_newlink_params *params, 140 140 struct netlink_ext_ack *extack) 141 141 { 142 + struct net *link_net = rtnl_newlink_link_net(params); 142 143 struct vlan_dev_priv *vlan = vlan_dev_priv(dev); 143 144 struct nlattr **data = params->data; 144 - struct net *src_net = params->net; 145 145 struct nlattr **tb = params->tb; 146 146 struct net_device *real_dev; 147 147 unsigned int max_mtu; ··· 158 158 return -EINVAL; 159 159 } 160 160 161 - real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); 161 + real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK])); 162 162 if (!real_dev) { 163 163 NL_SET_ERR_MSG_MOD(extack, "link does not exist"); 164 164 return -ENODEV;
+4 -4
net/hsr/hsr_netlink.c
··· 33 33 struct rtnl_newlink_params *params, 34 34 struct netlink_ext_ack *extack) 35 35 { 36 + struct net *link_net = rtnl_newlink_link_net(params); 36 37 struct nlattr **data = params->data; 37 - struct net *src_net = params->net; 38 38 enum hsr_version proto_version; 39 39 unsigned char multicast_spec; 40 40 u8 proto = HSR_PROTOCOL_HSR; ··· 48 48 NL_SET_ERR_MSG_MOD(extack, "Slave1 device not specified"); 49 49 return -EINVAL; 50 50 } 51 - link[0] = __dev_get_by_index(src_net, 51 + link[0] = __dev_get_by_index(link_net, 52 52 nla_get_u32(data[IFLA_HSR_SLAVE1])); 53 53 if (!link[0]) { 54 54 NL_SET_ERR_MSG_MOD(extack, "Slave1 does not exist"); ··· 58 58 NL_SET_ERR_MSG_MOD(extack, "Slave2 device not specified"); 59 59 return -EINVAL; 60 60 } 61 - link[1] = __dev_get_by_index(src_net, 61 + link[1] = __dev_get_by_index(link_net, 62 62 nla_get_u32(data[IFLA_HSR_SLAVE2])); 63 63 if (!link[1]) { 64 64 NL_SET_ERR_MSG_MOD(extack, "Slave2 does not exist"); ··· 71 71 } 72 72 73 73 if (data[IFLA_HSR_INTERLINK]) 74 - interlink = __dev_get_by_index(src_net, 74 + interlink = __dev_get_by_index(link_net, 75 75 nla_get_u32(data[IFLA_HSR_INTERLINK])); 76 76 77 77 if (interlink && interlink == link[0]) {