Commit eacb1160 authored by Xiao Liang's avatar Xiao Liang Committed by Jakub Kicinski
Browse files

net: ip_tunnel: Use link netns in newlink() of rtnl_link_ops



When link_net is set, use it as link netns instead of dev_net(). This
prepares for rtnetlink core to create device in target netns directly,
in which case the two namespaces may be different.

Convert common ip_tunnel_newlink() to accept an extra link netns
argument.

Signed-off-by: default avatarXiao Liang <shaw.leon@gmail.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250219125039.18024-7-shaw.leon@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9e17b2a1
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -407,8 +407,9 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
		  bool log_ecn_error);
int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
			 struct ip_tunnel_parm_kern *p, __u32 fwmark);
int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
		      struct ip_tunnel_parm_kern *p, __u32 fwmark);
int ip_tunnel_newlink(struct net *net, struct net_device *dev,
		      struct nlattr *tb[], struct ip_tunnel_parm_kern *p,
		      __u32 fwmark);
void ip_tunnel_setup(struct net_device *dev, unsigned int net_id);

bool ip_tunnel_netlink_encap_parms(struct nlattr *data[],
+5 −3
Original line number Diff line number Diff line
@@ -1413,7 +1413,8 @@ static int ipgre_newlink(struct net_device *dev,
	err = ipgre_netlink_parms(dev, data, tb, &p, &fwmark);
	if (err < 0)
		return err;
	return ip_tunnel_newlink(dev, tb, &p, fwmark);
	return ip_tunnel_newlink(params->link_net ? : dev_net(dev), dev, tb, &p,
				 fwmark);
}

static int erspan_newlink(struct net_device *dev,
@@ -1433,7 +1434,8 @@ static int erspan_newlink(struct net_device *dev,
	err = erspan_netlink_parms(dev, data, tb, &p, &fwmark);
	if (err)
		return err;
	return ip_tunnel_newlink(dev, tb, &p, fwmark);
	return ip_tunnel_newlink(params->link_net ? : dev_net(dev), dev, tb, &p,
				 fwmark);
}

static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
@@ -1701,7 +1703,7 @@ static struct rtnl_link_ops erspan_link_ops __read_mostly = {
struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
					u8 name_assign_type)
{
	struct rtnl_newlink_params params = { .net = net };
	struct rtnl_newlink_params params = { .src_net = net };
	struct nlattr *tb[IFLA_MAX + 1];
	struct net_device *dev;
	LIST_HEAD(list_kill);
+3 −3
Original line number Diff line number Diff line
@@ -1213,11 +1213,11 @@ void ip_tunnel_delete_nets(struct list_head *net_list, unsigned int id,
}
EXPORT_SYMBOL_GPL(ip_tunnel_delete_nets);

int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
		      struct ip_tunnel_parm_kern *p, __u32 fwmark)
int ip_tunnel_newlink(struct net *net, struct net_device *dev,
		      struct nlattr *tb[], struct ip_tunnel_parm_kern *p,
		      __u32 fwmark)
{
	struct ip_tunnel *nt;
	struct net *net = dev_net(dev);
	struct ip_tunnel_net *itn;
	int mtu;
	int err;
+2 −1
Original line number Diff line number Diff line
@@ -585,7 +585,8 @@ static int vti_newlink(struct net_device *dev,
	__u32 fwmark = 0;

	vti_netlink_parms(data, &parms, &fwmark);
	return ip_tunnel_newlink(dev, tb, &parms, fwmark);
	return ip_tunnel_newlink(params->link_net ? : dev_net(dev), dev, tb,
				 &parms, fwmark);
}

static int vti_changelink(struct net_device *dev, struct nlattr *tb[],
+2 −1
Original line number Diff line number Diff line
@@ -455,7 +455,8 @@ static int ipip_newlink(struct net_device *dev,
	}

	ipip_netlink_parms(data, &p, &t->collect_md, &fwmark);
	return ip_tunnel_newlink(dev, tb, &p, fwmark);
	return ip_tunnel_newlink(params->link_net ? : dev_net(dev), dev, tb, &p,
				 fwmark);
}

static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],