mirror of
https://github.com/torvalds/linux.git
synced 2025-04-12 16:47:42 +00:00
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>
This commit is contained in:
parent
69c7be1b90
commit
cf517ac16a
@ -101,8 +101,8 @@ static int ipoib_new_child_link(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net_device *pdev;
|
struct net_device *pdev;
|
||||||
struct ipoib_dev_priv *ppriv;
|
struct ipoib_dev_priv *ppriv;
|
||||||
@ -112,7 +112,7 @@ static int ipoib_new_child_link(struct net_device *dev,
|
|||||||
if (!tb[IFLA_LINK])
|
if (!tb[IFLA_LINK])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
pdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
|
pdev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
|
||||||
if (!pdev || pdev->type != ARPHRD_INFINIBAND)
|
if (!pdev || pdev->type != ARPHRD_INFINIBAND)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
@ -3165,13 +3165,13 @@ static int amt_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct amt_dev *amt = netdev_priv(dev);
|
struct amt_dev *amt = netdev_priv(dev);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net *net = params->net;
|
|
||||||
int err = -EINVAL;
|
int err = -EINVAL;
|
||||||
|
|
||||||
amt->net = net;
|
amt->net = link_net;
|
||||||
amt->mode = nla_get_u32(data[IFLA_AMT_MODE]);
|
amt->mode = nla_get_u32(data[IFLA_AMT_MODE]);
|
||||||
|
|
||||||
if (data[IFLA_AMT_MAX_TUNNELS] &&
|
if (data[IFLA_AMT_MAX_TUNNELS] &&
|
||||||
@ -3186,7 +3186,7 @@ static int amt_newlink(struct net_device *dev,
|
|||||||
amt->hash_buckets = AMT_HSIZE;
|
amt->hash_buckets = AMT_HSIZE;
|
||||||
amt->nr_tunnels = 0;
|
amt->nr_tunnels = 0;
|
||||||
get_random_bytes(&amt->hash_seed, sizeof(amt->hash_seed));
|
get_random_bytes(&amt->hash_seed, sizeof(amt->hash_seed));
|
||||||
amt->stream_dev = dev_get_by_index(net,
|
amt->stream_dev = dev_get_by_index(link_net,
|
||||||
nla_get_u32(data[IFLA_AMT_LINK]));
|
nla_get_u32(data[IFLA_AMT_LINK]));
|
||||||
if (!amt->stream_dev) {
|
if (!amt->stream_dev) {
|
||||||
NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_AMT_LINK],
|
NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_AMT_LINK],
|
||||||
|
@ -702,9 +702,9 @@ static int bareudp_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net *net = params->net;
|
|
||||||
struct bareudp_conf conf;
|
struct bareudp_conf conf;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -712,7 +712,7 @@ static int bareudp_newlink(struct net_device *dev,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = bareudp_configure(net, dev, &conf, extack);
|
err = bareudp_configure(link_net, dev, &conf, extack);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -176,8 +176,8 @@ static int vxcan_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *peer_net = rtnl_newlink_peer_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *peer_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct vxcan_priv *priv;
|
struct vxcan_priv *priv;
|
||||||
struct net_device *peer;
|
struct net_device *peer;
|
||||||
|
@ -121,9 +121,9 @@ static int rmnet_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION;
|
u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION;
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net_device *real_dev;
|
struct net_device *real_dev;
|
||||||
int mode = RMNET_EPMODE_VND;
|
int mode = RMNET_EPMODE_VND;
|
||||||
@ -137,7 +137,7 @@ static int rmnet_newlink(struct net_device *dev,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
|
real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
|
||||||
if (!real_dev) {
|
if (!real_dev) {
|
||||||
NL_SET_ERR_MSG_MOD(extack, "link does not exist");
|
NL_SET_ERR_MSG_MOD(extack, "link does not exist");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -1618,9 +1618,9 @@ static int geneve_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net *net = params->net;
|
|
||||||
struct geneve_config cfg = {
|
struct geneve_config cfg = {
|
||||||
.df = GENEVE_DF_UNSET,
|
.df = GENEVE_DF_UNSET,
|
||||||
.use_udp6_rx_checksums = false,
|
.use_udp6_rx_checksums = false,
|
||||||
@ -1634,7 +1634,7 @@ static int geneve_newlink(struct net_device *dev,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = geneve_configure(net, dev, extack, &cfg);
|
err = geneve_configure(link_net, dev, extack, &cfg);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -1466,8 +1466,8 @@ static int gtp_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
unsigned int role = GTP_ROLE_GGSN;
|
unsigned int role = GTP_ROLE_GGSN;
|
||||||
struct gtp_dev *gtp;
|
struct gtp_dev *gtp;
|
||||||
struct gtp_net *gn;
|
struct gtp_net *gn;
|
||||||
@ -1498,7 +1498,7 @@ static int gtp_newlink(struct net_device *dev,
|
|||||||
gtp->restart_count = nla_get_u8_default(data[IFLA_GTP_RESTART_COUNT],
|
gtp->restart_count = nla_get_u8_default(data[IFLA_GTP_RESTART_COUNT],
|
||||||
0);
|
0);
|
||||||
|
|
||||||
gtp->net = src_net;
|
gtp->net = link_net;
|
||||||
|
|
||||||
err = gtp_hashtable_new(gtp, hashsize);
|
err = gtp_hashtable_new(gtp, hashsize);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -1528,7 +1528,7 @@ static int gtp_newlink(struct net_device *dev,
|
|||||||
goto out_encap;
|
goto out_encap;
|
||||||
}
|
}
|
||||||
|
|
||||||
gn = net_generic(src_net, gtp_net_id);
|
gn = net_generic(link_net, gtp_net_id);
|
||||||
list_add(>p->list, &gn->gtp_dev_list);
|
list_add(>p->list, &gn->gtp_dev_list);
|
||||||
dev->priv_destructor = gtp_destructor;
|
dev->priv_destructor = gtp_destructor;
|
||||||
|
|
||||||
|
@ -535,9 +535,9 @@ err:
|
|||||||
int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params,
|
int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct ipvl_dev *ipvlan = netdev_priv(dev);
|
struct ipvl_dev *ipvlan = netdev_priv(dev);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct ipvl_port *port;
|
struct ipvl_port *port;
|
||||||
struct net_device *phy_dev;
|
struct net_device *phy_dev;
|
||||||
@ -547,7 +547,7 @@ int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params,
|
|||||||
if (!tb[IFLA_LINK])
|
if (!tb[IFLA_LINK])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
phy_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
|
phy_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
|
||||||
if (!phy_dev)
|
if (!phy_dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
@ -4145,10 +4145,10 @@ static int macsec_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct macsec_dev *macsec = macsec_priv(dev);
|
struct macsec_dev *macsec = macsec_priv(dev);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net *net = params->net;
|
|
||||||
rx_handler_func_t *rx_handler;
|
rx_handler_func_t *rx_handler;
|
||||||
u8 icv_len = MACSEC_DEFAULT_ICV_LEN;
|
u8 icv_len = MACSEC_DEFAULT_ICV_LEN;
|
||||||
struct net_device *real_dev;
|
struct net_device *real_dev;
|
||||||
@ -4157,7 +4157,7 @@ static int macsec_newlink(struct net_device *dev,
|
|||||||
|
|
||||||
if (!tb[IFLA_LINK])
|
if (!tb[IFLA_LINK])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
real_dev = __dev_get_by_index(net, nla_get_u32(tb[IFLA_LINK]));
|
real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
|
||||||
if (!real_dev)
|
if (!real_dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
if (real_dev->type != ARPHRD_ETHER)
|
if (real_dev->type != ARPHRD_ETHER)
|
||||||
|
@ -1444,9 +1444,9 @@ int macvlan_common_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct macvlan_dev *vlan = netdev_priv(dev);
|
struct macvlan_dev *vlan = netdev_priv(dev);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net_device *lowerdev;
|
struct net_device *lowerdev;
|
||||||
struct macvlan_port *port;
|
struct macvlan_port *port;
|
||||||
@ -1457,7 +1457,7 @@ int macvlan_common_newlink(struct net_device *dev,
|
|||||||
if (!tb[IFLA_LINK])
|
if (!tb[IFLA_LINK])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lowerdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
|
lowerdev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
|
||||||
if (lowerdev == NULL)
|
if (lowerdev == NULL)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
@ -331,13 +331,13 @@ static int netkit_new_link(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *peer_net = rtnl_newlink_peer_net(params);
|
||||||
enum netkit_scrub scrub_prim = NETKIT_SCRUB_DEFAULT;
|
enum netkit_scrub scrub_prim = NETKIT_SCRUB_DEFAULT;
|
||||||
enum netkit_scrub scrub_peer = NETKIT_SCRUB_DEFAULT;
|
enum netkit_scrub scrub_peer = NETKIT_SCRUB_DEFAULT;
|
||||||
struct nlattr *peer_tb[IFLA_MAX + 1], **tbp, *attr;
|
struct nlattr *peer_tb[IFLA_MAX + 1], **tbp, *attr;
|
||||||
enum netkit_action policy_prim = NETKIT_PASS;
|
enum netkit_action policy_prim = NETKIT_PASS;
|
||||||
enum netkit_action policy_peer = NETKIT_PASS;
|
enum netkit_action policy_peer = NETKIT_PASS;
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *peer_net = params->net;
|
|
||||||
enum netkit_mode mode = NETKIT_L3;
|
enum netkit_mode mode = NETKIT_L3;
|
||||||
unsigned char ifname_assign_type;
|
unsigned char ifname_assign_type;
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
|
@ -188,12 +188,12 @@ static int pfcp_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct pfcp_dev *pfcp = netdev_priv(dev);
|
struct pfcp_dev *pfcp = netdev_priv(dev);
|
||||||
struct net *net = params->net;
|
|
||||||
struct pfcp_net *pn;
|
struct pfcp_net *pn;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
pfcp->net = net;
|
pfcp->net = link_net;
|
||||||
|
|
||||||
err = pfcp_add_sock(pfcp);
|
err = pfcp_add_sock(pfcp);
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -207,7 +207,7 @@ static int pfcp_newlink(struct net_device *dev,
|
|||||||
goto exit_del_pfcp_sock;
|
goto exit_del_pfcp_sock;
|
||||||
}
|
}
|
||||||
|
|
||||||
pn = net_generic(net, pfcp_net_id);
|
pn = net_generic(link_net, pfcp_net_id);
|
||||||
list_add(&pfcp->list, &pn->pfcp_dev_list);
|
list_add(&pfcp->list, &pn->pfcp_dev_list);
|
||||||
|
|
||||||
netdev_dbg(dev, "registered new PFCP interface\n");
|
netdev_dbg(dev, "registered new PFCP interface\n");
|
||||||
|
@ -1307,8 +1307,8 @@ static int ppp_nl_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct ppp_config conf = {
|
struct ppp_config conf = {
|
||||||
.unit = -1,
|
.unit = -1,
|
||||||
@ -1346,7 +1346,7 @@ static int ppp_nl_newlink(struct net_device *dev,
|
|||||||
if (!tb[IFLA_IFNAME] || !nla_len(tb[IFLA_IFNAME]) || !*(char *)nla_data(tb[IFLA_IFNAME]))
|
if (!tb[IFLA_IFNAME] || !nla_len(tb[IFLA_IFNAME]) || !*(char *)nla_data(tb[IFLA_IFNAME]))
|
||||||
conf.ifname_is_set = false;
|
conf.ifname_is_set = false;
|
||||||
|
|
||||||
err = ppp_dev_configure(src_net, dev, &conf);
|
err = ppp_dev_configure(link_net, dev, &conf);
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
mutex_unlock(&ppp_mutex);
|
mutex_unlock(&ppp_mutex);
|
||||||
|
@ -1769,8 +1769,8 @@ static int veth_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *peer_net = rtnl_newlink_peer_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *peer_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
int err;
|
int err;
|
||||||
struct net_device *peer;
|
struct net_device *peer;
|
||||||
|
@ -4404,8 +4404,8 @@ static int vxlan_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct vxlan_config conf;
|
struct vxlan_config conf;
|
||||||
int err;
|
int err;
|
||||||
@ -4414,7 +4414,7 @@ static int vxlan_newlink(struct net_device *dev,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
return __vxlan_dev_create(src_net, dev, &conf, extack);
|
return __vxlan_dev_create(link_net, dev, &conf, extack);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
|
static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||||
|
@ -311,11 +311,11 @@ static int wg_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct wg_device *wg = netdev_priv(dev);
|
struct wg_device *wg = netdev_priv(dev);
|
||||||
struct net *src_net = params->net;
|
|
||||||
int ret = -ENOMEM;
|
int ret = -ENOMEM;
|
||||||
|
|
||||||
rcu_assign_pointer(wg->creating_net, src_net);
|
rcu_assign_pointer(wg->creating_net, link_net);
|
||||||
init_rwsem(&wg->static_identity.lock);
|
init_rwsem(&wg->static_identity.lock);
|
||||||
mutex_init(&wg->socket_update_lock);
|
mutex_init(&wg->socket_update_lock);
|
||||||
mutex_init(&wg->device_update_lock);
|
mutex_init(&wg->device_update_lock);
|
||||||
|
@ -524,7 +524,7 @@ static int virt_wifi_newlink(struct net_device *dev,
|
|||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
|
struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
|
||||||
struct net *src_net = params->net;
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -534,7 +534,7 @@ static int virt_wifi_newlink(struct net_device *dev,
|
|||||||
netif_carrier_off(dev);
|
netif_carrier_off(dev);
|
||||||
|
|
||||||
priv->upperdev = dev;
|
priv->upperdev = dev;
|
||||||
priv->lowerdev = __dev_get_by_index(src_net,
|
priv->lowerdev = __dev_get_by_index(link_net,
|
||||||
nla_get_u32(tb[IFLA_LINK]));
|
nla_get_u32(tb[IFLA_LINK]));
|
||||||
|
|
||||||
if (!priv->lowerdev)
|
if (!priv->lowerdev)
|
||||||
|
@ -1065,7 +1065,7 @@ static void wwan_create_default_link(struct wwan_device *wwandev,
|
|||||||
struct nlattr *tb[IFLA_MAX + 1], *linkinfo[IFLA_INFO_MAX + 1];
|
struct nlattr *tb[IFLA_MAX + 1], *linkinfo[IFLA_INFO_MAX + 1];
|
||||||
struct nlattr *data[IFLA_WWAN_MAX + 1];
|
struct nlattr *data[IFLA_WWAN_MAX + 1];
|
||||||
struct rtnl_newlink_params params = {
|
struct rtnl_newlink_params params = {
|
||||||
.net = &init_net,
|
.src_net = &init_net,
|
||||||
.tb = tb,
|
.tb = tb,
|
||||||
.data = data,
|
.data = data,
|
||||||
};
|
};
|
||||||
|
@ -88,6 +88,23 @@ struct rtnl_newlink_params {
|
|||||||
struct nlattr **data;
|
struct nlattr **data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Get effective link netns from newlink params. Generally, this is link_net
|
||||||
|
* and falls back to src_net. But for compatibility, a driver may * choose to
|
||||||
|
* use dev_net(dev) instead.
|
||||||
|
*/
|
||||||
|
static inline struct net *rtnl_newlink_link_net(struct rtnl_newlink_params *p)
|
||||||
|
{
|
||||||
|
return p->link_net ? : p->src_net;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get peer netns from newlink params. Fallback to link netns if peer netns is
|
||||||
|
* not specified explicitly.
|
||||||
|
*/
|
||||||
|
static inline struct net *rtnl_newlink_peer_net(struct rtnl_newlink_params *p)
|
||||||
|
{
|
||||||
|
return p->peer_net ? : rtnl_newlink_link_net(p);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct rtnl_link_ops - rtnetlink link operations
|
* struct rtnl_link_ops - rtnetlink link operations
|
||||||
*
|
*
|
||||||
|
@ -139,9 +139,9 @@ static int vlan_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
|
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
struct nlattr **tb = params->tb;
|
struct nlattr **tb = params->tb;
|
||||||
struct net_device *real_dev;
|
struct net_device *real_dev;
|
||||||
unsigned int max_mtu;
|
unsigned int max_mtu;
|
||||||
@ -158,7 +158,7 @@ static int vlan_newlink(struct net_device *dev,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
|
real_dev = __dev_get_by_index(link_net, nla_get_u32(tb[IFLA_LINK]));
|
||||||
if (!real_dev) {
|
if (!real_dev) {
|
||||||
NL_SET_ERR_MSG_MOD(extack, "link does not exist");
|
NL_SET_ERR_MSG_MOD(extack, "link does not exist");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -33,8 +33,8 @@ static int hsr_newlink(struct net_device *dev,
|
|||||||
struct rtnl_newlink_params *params,
|
struct rtnl_newlink_params *params,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct net *link_net = rtnl_newlink_link_net(params);
|
||||||
struct nlattr **data = params->data;
|
struct nlattr **data = params->data;
|
||||||
struct net *src_net = params->net;
|
|
||||||
enum hsr_version proto_version;
|
enum hsr_version proto_version;
|
||||||
unsigned char multicast_spec;
|
unsigned char multicast_spec;
|
||||||
u8 proto = HSR_PROTOCOL_HSR;
|
u8 proto = HSR_PROTOCOL_HSR;
|
||||||
@ -48,7 +48,7 @@ static int hsr_newlink(struct net_device *dev,
|
|||||||
NL_SET_ERR_MSG_MOD(extack, "Slave1 device not specified");
|
NL_SET_ERR_MSG_MOD(extack, "Slave1 device not specified");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
link[0] = __dev_get_by_index(src_net,
|
link[0] = __dev_get_by_index(link_net,
|
||||||
nla_get_u32(data[IFLA_HSR_SLAVE1]));
|
nla_get_u32(data[IFLA_HSR_SLAVE1]));
|
||||||
if (!link[0]) {
|
if (!link[0]) {
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Slave1 does not exist");
|
NL_SET_ERR_MSG_MOD(extack, "Slave1 does not exist");
|
||||||
@ -58,7 +58,7 @@ static int hsr_newlink(struct net_device *dev,
|
|||||||
NL_SET_ERR_MSG_MOD(extack, "Slave2 device not specified");
|
NL_SET_ERR_MSG_MOD(extack, "Slave2 device not specified");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
link[1] = __dev_get_by_index(src_net,
|
link[1] = __dev_get_by_index(link_net,
|
||||||
nla_get_u32(data[IFLA_HSR_SLAVE2]));
|
nla_get_u32(data[IFLA_HSR_SLAVE2]));
|
||||||
if (!link[1]) {
|
if (!link[1]) {
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Slave2 does not exist");
|
NL_SET_ERR_MSG_MOD(extack, "Slave2 does not exist");
|
||||||
@ -71,7 +71,7 @@ static int hsr_newlink(struct net_device *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data[IFLA_HSR_INTERLINK])
|
if (data[IFLA_HSR_INTERLINK])
|
||||||
interlink = __dev_get_by_index(src_net,
|
interlink = __dev_get_by_index(link_net,
|
||||||
nla_get_u32(data[IFLA_HSR_INTERLINK]));
|
nla_get_u32(data[IFLA_HSR_INTERLINK]));
|
||||||
|
|
||||||
if (interlink && interlink == link[0]) {
|
if (interlink && interlink == link[0]) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user