From patchwork Wed Feb 19 12:50:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Liang X-Patchwork-Id: 866581 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 141B71E0DCD; Wed, 19 Feb 2025 12:51:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969477; cv=none; b=CV4O+MEXzSpwxrvWzAM8CNTjMl7n3YSrzdHjVk4UeMCTt4DGZq1ZZpsrnFoeFaaQFox/RWInY9WGROxkLvk1OKgOyBvTfkMhZUSRgzuxxRLDqP3qo075uj3LyLgaT+xMY/dtHRk0nixlUbg4L/iuLQUbozfCNDCYrQVKhZ5gN6I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969477; c=relaxed/simple; bh=vtwyK66ZLCNrjHC3imF1sIe3ur7BswtPCnz4Ve5sCIM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bVDmAIx12esBHiyJMTE4I+lzI2Sf5IgZ9Ay0epAXKywDQ+33ihx0Eiyb/rDj1h3utwqZFAC1WQn+kCMMfXs1r58TwGggGYpejG9C/cqkbSBl+A9PKZxoMK+tf4HMgiInkUhhlPfkt7rn/dwyic/y/K6rmBJ0Hs0gcfTtgtbV+xg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=drZucXv6; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="drZucXv6" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-220f048c038so87878055ad.2; Wed, 19 Feb 2025 04:51:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739969473; x=1740574273; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=93fOiXLiPOPHhDRJ9eVLB7ZJAOD1HkX3lWv5xa2feOw=; b=drZucXv6PtPQMuNU2NKd3b/VGRqbb4lzRdbfnmwAPi0O/DjxO3ZtYEYgVuavb0agVl +BwcpxOTtcfwdizvhznRd+kUSjNmkQGDujv6TmwJaZM/iMO+cSbayVwmK6CsLJ70VwDo XAP8Fkak2yxr3wvWgtFpOiOv3mmJsd7cB51foiAXH863TjPvj7l9Q85jfFyfX9HZiRZu NqSkUPxT4PyefZHj4+hM0iE2tEEgQevBybqoiziBMggOOFywWI8MQMSqnW5wQJAFcA9m QkTj9t8ijwtS9d6F5psCL054GN6w9FOJqr7UTRqbjEMEpnme9KMXK2uwrjP3QNJqy6Sb vZkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739969473; x=1740574273; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=93fOiXLiPOPHhDRJ9eVLB7ZJAOD1HkX3lWv5xa2feOw=; b=C1HKrJR9+sN0Z40qdQ3CkQSmJCUkFucubn2QWibfVQXttomImDDT/krrI4luavzyJw xRG/xcvAFoYMExMpiTzMtfdriHwy4bRisdde6K+c1RRYrg0/AUwCGNAaAxQ5rvN+dWhL +cLEcyb+lu/4GrrPJ/uUgUa5vxd40K7uCM++XT0ZkN77gzop4KRYbwrBUM/wDDQmlkWT PbRKEBU6Hb4mqxsxLt19UWV21u4BIvZY1jSpE9EEdF9rHSaI69PYQSMAf4DYeRhrMate GrzAlJp2eBNUAGArcoghuzkDP3SHtku1WNSkpNDGxopSF9236qxkwpF6OrHwTczdRBWQ 2XYg== X-Forwarded-Encrypted: i=1; AJvYcCUXXvaqFgbSeBatHLqPiklKKaZao60t1UFxUIW/p7ZiwdlQpdU9NGkQwOyDUQWm9udCpPpTI5p0/iFP@vger.kernel.org, AJvYcCVBpYQ/v7arI//w3xhxz9sn3oUKaxjQq2BzJoYRHZ2IMYRkUgyyyR13v+xokxHsdQdkyfDnCzkG+caU@vger.kernel.org, AJvYcCVoZJqJSZP0hi7rX/6MN+1JGy7R8w5fPcoPLsmw83s5NmqYG08hhUFC2gOwN13rZTpP/OYQ5bI2IGoXwg==@vger.kernel.org, AJvYcCVzsxVIPgZnTdM2z8KRj4V5JhBh8bp3HT+F76LmDDdazsAaPIho0tCVlvFf1IDGoP3jUp2uUPJc5JlsV6Wj@vger.kernel.org, AJvYcCWVI8LJNXgZf/GArMguGyuGp/UceSVQrGOxRNcUEXf9JUDawlqtVSpszHvB86MEsvscZwNy+G8t9lPqPzjECgnB@vger.kernel.org, AJvYcCX8/ZHs9yG/GkWEaeQ1b7iMoykkhjEn0AMROW8pwiIJrrcHa71A7Vx8HSsyV6peTQHlnw/kM7MCCbsvn/FVLKM=@vger.kernel.org, AJvYcCXOu2fgJb2Vku5HWYCttXJ/S+nR9JkTJBTRQbezceNLTHMaTwWkZ9bxc1nFVFFRr+GmHQ0=@vger.kernel.org, AJvYcCXk2QfiFmaU0zc+8etl9kqJIUNQWdHaVY9SiK3bRfd1yWWqq/Qs8bAkk+CvvukM9fndpUjaQuuVsO7NIw==@vger.kernel.org X-Gm-Message-State: AOJu0YyKx9IiMKbRTQwJTZQ4uBUW6UgKZbO04x4FXELWTywEon/HkpMX qRxk9lBYSjADOvyKTPGdDTZW5oV0zr+iPY7OFeNDydUnxJjCX1p0Hpycs0w5018= X-Gm-Gg: ASbGncsjoQIgr2Co3qI8EIwaabxCn5cnDOygQPAuMPNFyiRom4N+P9nZ5JEdmvtCDEs wl+5KDDqvYDWhAUtMrBrL6yGR8ccpSyQAjHwH3E02LP+RiNpzQjtubY/Qg/7L56SetHFNyfqVgC 6QXy1zqg2cjRfmuRx6eiw6U51owpSgbcF24HBSjbbKXFLKnjRuk7+iAU0w6b3bO+qyKRGUkQY0H eplfYfnyFr1WemOV8vJN+kPslMo0MKv4tjG1j81qk53o1bo5Pzb4yS6Bmw4yqGNmvrkPCd1+I7K TFt+6w== X-Google-Smtp-Source: AGHT+IFwrijUxTicBZSeJZUUaytXHE0DfRRF5DwivmwpPm4+n8c4+GP1YGLfqkZTKfGUAWsG4vSnVg== X-Received: by 2002:a17:902:ce03:b0:21f:6c81:f63 with SMTP id d9443c01a7336-22104020041mr311521055ad.16.1739969472430; Wed, 19 Feb 2025 04:51:12 -0800 (PST) Received: from ws.. ([103.167.140.11]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d536436fsm103427175ad.64.2025.02.19.04.51.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 04:51:11 -0800 (PST) From: Xiao Liang To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Kuniyuki Iwashima , Jakub Kicinski Cc: "David S. Miller" , David Ahern , Eric Dumazet , Paolo Abeni , Andrew Lunn , Simon Horman , Shuah Khan , Donald Hunter , Alexander Aring , Stefan Schmidt , Miquel Raynal , Steffen Klassert , Herbert Xu , linux-rdma@vger.kernel.org, linux-can@vger.kernel.org, osmocom-net-gprs@lists.osmocom.org, bpf@vger.kernel.org, linux-ppp@vger.kernel.org, wireguard@lists.zx2c4.com, linux-wireless@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org, bridge@lists.linux.dev, linux-wpan@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v10 02/13] rtnetlink: Pack newlink() params into struct Date: Wed, 19 Feb 2025 20:50:28 +0800 Message-ID: <20250219125039.18024-3-shaw.leon@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250219125039.18024-1-shaw.leon@gmail.com> References: <20250219125039.18024-1-shaw.leon@gmail.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 There are 4 net namespaces involved when creating links: - source netns - where the netlink socket resides, - target netns - where to put the device being created, - link netns - netns associated with the device (backend), - peer netns - netns of peer device. Currently, two nets are passed to newlink() callback - "src_net" parameter and "dev_net" (implicitly in net_device). They are set as follows, depending on netlink attributes in the request. +------------+-------------------+---------+---------+ | peer netns | IFLA_LINK_NETNSID | src_net | dev_net | +------------+-------------------+---------+---------+ | | absent | source | target | | absent +-------------------+---------+---------+ | | present | link | link | +------------+-------------------+---------+---------+ | | absent | peer | target | | present +-------------------+---------+---------+ | | present | peer | link | +------------+-------------------+---------+---------+ When IFLA_LINK_NETNSID is present, the device is created in link netns first and then moved to target netns. This has some side effects, including extra ifindex allocation, ifname validation and link events. These could be avoided if we create it in target netns from the beginning. On the other hand, the meaning of src_net parameter is ambiguous. It varies depending on how parameters are passed. It is the effective link (or peer netns) by design, but some drivers ignore it and use dev_net instead. To provide more netns context for drivers, this patch packs existing newlink() parameters, along with the source netns, link netns and peer netns, into a struct. The old "src_net" is renamed to "net" to avoid confusion with real source netns, and will be deprecated later. The use of src_net are converted to params->net trivially. Signed-off-by: Xiao Liang --- drivers/infiniband/ulp/ipoib/ipoib_netlink.c | 7 ++++-- drivers/net/amt.c | 7 ++++-- drivers/net/bareudp.c | 7 ++++-- drivers/net/bonding/bond_netlink.c | 6 +++-- drivers/net/can/dev/netlink.c | 4 +-- drivers/net/can/vxcan.c | 7 ++++-- .../ethernet/qualcomm/rmnet/rmnet_config.c | 7 ++++-- drivers/net/geneve.c | 7 ++++-- drivers/net/gtp.c | 6 +++-- drivers/net/ipvlan/ipvlan.h | 3 +-- drivers/net/ipvlan/ipvlan_main.c | 6 +++-- drivers/net/ipvlan/ipvtap.c | 6 ++--- drivers/net/macsec.c | 7 ++++-- drivers/net/macvlan.c | 19 ++++++++------ drivers/net/macvtap.c | 6 ++--- drivers/net/netkit.c | 14 +++++++---- drivers/net/pfcp.c | 5 ++-- drivers/net/ppp/ppp_generic.c | 7 ++++-- drivers/net/team/team_core.c | 6 +++-- drivers/net/veth.c | 7 ++++-- drivers/net/vrf.c | 5 ++-- drivers/net/vxlan/vxlan_core.c | 7 ++++-- drivers/net/wireguard/device.c | 5 ++-- drivers/net/wireless/virtual/virt_wifi.c | 6 +++-- drivers/net/wwan/wwan_core.c | 16 +++++++++--- include/linux/if_macvlan.h | 6 +++-- include/net/rtnetlink.h | 25 ++++++++++++++++--- net/8021q/vlan_netlink.c | 7 ++++-- net/batman-adv/soft-interface.c | 9 +++---- net/bridge/br_netlink.c | 6 +++-- net/caif/chnl_net.c | 5 ++-- net/core/rtnetlink.c | 15 ++++++++--- net/hsr/hsr_netlink.c | 6 +++-- net/ieee802154/6lowpan/core.c | 5 ++-- net/ipv4/ip_gre.c | 16 ++++++++---- net/ipv4/ip_vti.c | 6 +++-- net/ipv4/ipip.c | 6 +++-- net/ipv6/ip6_gre.c | 14 ++++++++--- net/ipv6/ip6_tunnel.c | 6 +++-- net/ipv6/ip6_vti.c | 5 ++-- net/ipv6/sit.c | 6 +++-- net/xfrm/xfrm_interface_core.c | 7 +++--- 42 files changed, 223 insertions(+), 110 deletions(-) diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c index 9ad8d9856275..16cb8ced9f35 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c @@ -97,10 +97,13 @@ static int ipoib_changelink(struct net_device *dev, struct nlattr *tb[], return ret; } -static int ipoib_new_child_link(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ipoib_new_child_link(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct net_device *pdev; struct ipoib_dev_priv *ppriv; u16 child_pkey; diff --git a/drivers/net/amt.c b/drivers/net/amt.c index 98c6205ed19f..96b7ec9a2c13 100644 --- a/drivers/net/amt.c +++ b/drivers/net/amt.c @@ -3161,11 +3161,14 @@ static int amt_validate(struct nlattr *tb[], struct nlattr *data[], return 0; } -static int amt_newlink(struct net *net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int amt_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct amt_dev *amt = netdev_priv(dev); + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; + struct net *net = params->net; int err = -EINVAL; amt->net = net; diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c index 70814303aab8..fc21dcfb4848 100644 --- a/drivers/net/bareudp.c +++ b/drivers/net/bareudp.c @@ -698,10 +698,13 @@ static void bareudp_dellink(struct net_device *dev, struct list_head *head) unregister_netdevice_queue(dev, head); } -static int bareudp_newlink(struct net *net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int bareudp_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; + struct net *net = params->net; struct bareudp_conf conf; int err; diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c index 2a6a424806aa..ac5e402c34bc 100644 --- a/drivers/net/bonding/bond_netlink.c +++ b/drivers/net/bonding/bond_netlink.c @@ -564,10 +564,12 @@ static int bond_changelink(struct net_device *bond_dev, struct nlattr *tb[], return 0; } -static int bond_newlink(struct net *src_net, struct net_device *bond_dev, - struct nlattr *tb[], struct nlattr *data[], +static int bond_newlink(struct net_device *bond_dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; int err; err = bond_changelink(bond_dev, tb, data, extack); diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index 01aacdcda260..f1db9b7ffd4d 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -624,8 +624,8 @@ static int can_fill_xstats(struct sk_buff *skb, const struct net_device *dev) return -EMSGSIZE; } -static int can_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int can_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { return -EOPNOTSUPP; diff --git a/drivers/net/can/vxcan.c b/drivers/net/can/vxcan.c index ca8811941085..6f8ebb1cfd7b 100644 --- a/drivers/net/can/vxcan.c +++ b/drivers/net/can/vxcan.c @@ -172,10 +172,13 @@ static void vxcan_setup(struct net_device *dev) /* forward declaration for rtnl_create_link() */ static struct rtnl_link_ops vxcan_link_ops; -static int vxcan_newlink(struct net *peer_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int vxcan_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct net *peer_net = params->net; + struct nlattr **tb = params->tb; struct vxcan_priv *priv; struct net_device *peer; diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index f3bea196a8f9..8151e91395e2 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -117,11 +117,14 @@ static void rmnet_unregister_bridge(struct rmnet_port *port) rmnet_unregister_real_device(bridge_dev); } -static int rmnet_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int rmnet_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { u32 data_format = RMNET_FLAGS_INGRESS_DEAGGREGATION; + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct net_device *real_dev; int mode = RMNET_EPMODE_VND; struct rmnet_endpoint *ep; diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 642155cb8315..d373a851930c 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -1614,10 +1614,13 @@ static void geneve_link_config(struct net_device *dev, geneve_change_mtu(dev, ldev_mtu - info->options_len); } -static int geneve_newlink(struct net *net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int geneve_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; + struct net *net = params->net; struct geneve_config cfg = { .df = GENEVE_DF_UNSET, .use_udp6_rx_checksums = false, diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c index d64740bf44ed..d6d4326cb908 100644 --- a/drivers/net/gtp.c +++ b/drivers/net/gtp.c @@ -1462,10 +1462,12 @@ static int gtp_create_sockets(struct gtp_dev *gtp, const struct nlattr *nla, #define GTP_TH_MAXLEN (sizeof(struct udphdr) + sizeof(struct gtp0_header)) #define GTP_IPV6_MAXLEN (sizeof(struct ipv6hdr) + GTP_TH_MAXLEN) -static int gtp_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int gtp_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct net *src_net = params->net; unsigned int role = GTP_ROLE_GGSN; struct gtp_dev *gtp; struct gtp_net *gn; diff --git a/drivers/net/ipvlan/ipvlan.h b/drivers/net/ipvlan/ipvlan.h index 025e0c19ec25..50de3ee204db 100644 --- a/drivers/net/ipvlan/ipvlan.h +++ b/drivers/net/ipvlan/ipvlan.h @@ -166,8 +166,7 @@ struct ipvl_addr *ipvlan_addr_lookup(struct ipvl_port *port, void *lyr3h, void *ipvlan_get_L3_hdr(struct ipvl_port *port, struct sk_buff *skb, int *type); void ipvlan_count_rx(const struct ipvl_dev *ipvlan, unsigned int len, bool success, bool mcast); -int ipvlan_link_new(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params, struct netlink_ext_ack *extack); void ipvlan_link_delete(struct net_device *dev, struct list_head *head); void ipvlan_link_setup(struct net_device *dev); diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c index da3a97a65507..19ce19ca7e32 100644 --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c @@ -532,11 +532,13 @@ static int ipvlan_nl_fillinfo(struct sk_buff *skb, return ret; } -int ipvlan_link_new(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +int ipvlan_link_new(struct net_device *dev, struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct ipvl_dev *ipvlan = netdev_priv(dev); + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct ipvl_port *port; struct net_device *phy_dev; int err; diff --git a/drivers/net/ipvlan/ipvtap.c b/drivers/net/ipvlan/ipvtap.c index 1afc4c47be73..edd13916831a 100644 --- a/drivers/net/ipvlan/ipvtap.c +++ b/drivers/net/ipvlan/ipvtap.c @@ -73,8 +73,8 @@ static void ipvtap_update_features(struct tap_dev *tap, netdev_update_features(vlan->dev); } -static int ipvtap_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ipvtap_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct ipvtap_dev *vlantap = netdev_priv(dev); @@ -97,7 +97,7 @@ static int ipvtap_newlink(struct net *src_net, struct net_device *dev, /* Don't put anything that may fail after macvlan_common_newlink * because we can't undo what it does. */ - err = ipvlan_link_new(src_net, dev, tb, data, extack); + err = ipvlan_link_new(dev, params, extack); if (err) { netdev_rx_handler_unregister(dev); return err; diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 1bc1e5993f56..1869b0513f57 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -4141,11 +4141,14 @@ static int macsec_add_dev(struct net_device *dev, sci_t sci, u8 icv_len) static struct lock_class_key macsec_netdev_addr_lock_key; -static int macsec_newlink(struct net *net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int macsec_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct macsec_dev *macsec = macsec_priv(dev); + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; + struct net *net = params->net; rx_handler_func_t *rx_handler; u8 icv_len = MACSEC_DEFAULT_ICV_LEN; struct net_device *real_dev; diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index fed4fe2a4748..f903b414eaeb 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -1440,16 +1440,19 @@ static int macvlan_changelink_sources(struct macvlan_dev *vlan, u32 mode, return 0; } -int macvlan_common_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +int macvlan_common_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct macvlan_dev *vlan = netdev_priv(dev); - struct macvlan_port *port; + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct net_device *lowerdev; - int err; - int macmode; + struct macvlan_port *port; bool create = false; + int macmode; + int err; if (!tb[IFLA_LINK]) return -EINVAL; @@ -1565,11 +1568,11 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, } EXPORT_SYMBOL_GPL(macvlan_common_newlink); -static int macvlan_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int macvlan_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { - return macvlan_common_newlink(src_net, dev, tb, data, extack); + return macvlan_common_newlink(dev, params, extack); } void macvlan_dellink(struct net_device *dev, struct list_head *head) diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 29a5929d48e5..b391a0f740a3 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c @@ -77,8 +77,8 @@ static void macvtap_update_features(struct tap_dev *tap, netdev_update_features(vlan->dev); } -static int macvtap_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int macvtap_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct macvtap_dev *vlantap = netdev_priv(dev); @@ -105,7 +105,7 @@ static int macvtap_newlink(struct net *src_net, struct net_device *dev, /* Don't put anything that may fail after macvlan_common_newlink * because we can't undo what it does. */ - err = macvlan_common_newlink(src_net, dev, tb, data, extack); + err = macvlan_common_newlink(dev, params, extack); if (err) { netdev_rx_handler_unregister(dev); return err; diff --git a/drivers/net/netkit.c b/drivers/net/netkit.c index 1e1b00756be7..640a2dbbbd28 100644 --- a/drivers/net/netkit.c +++ b/drivers/net/netkit.c @@ -327,17 +327,20 @@ static int netkit_validate(struct nlattr *tb[], struct nlattr *data[], static struct rtnl_link_ops netkit_link_ops; -static int netkit_new_link(struct net *peer_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int netkit_new_link(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { - struct nlattr *peer_tb[IFLA_MAX + 1], **tbp = tb, *attr; - enum netkit_action policy_prim = NETKIT_PASS; - enum netkit_action policy_peer = NETKIT_PASS; enum netkit_scrub scrub_prim = NETKIT_SCRUB_DEFAULT; enum netkit_scrub scrub_peer = NETKIT_SCRUB_DEFAULT; + struct nlattr *peer_tb[IFLA_MAX + 1], **tbp, *attr; + enum netkit_action policy_prim = NETKIT_PASS; + enum netkit_action policy_peer = NETKIT_PASS; + struct nlattr **data = params->data; + struct net *peer_net = params->net; enum netkit_mode mode = NETKIT_L3; unsigned char ifname_assign_type; + struct nlattr **tb = params->tb; u16 headroom = 0, tailroom = 0; struct ifinfomsg *ifmp = NULL; struct net_device *peer; @@ -345,6 +348,7 @@ static int netkit_new_link(struct net *peer_net, struct net_device *dev, struct netkit *nk; int err; + tbp = tb; if (data) { if (data[IFLA_NETKIT_MODE]) mode = nla_get_u32(data[IFLA_NETKIT_MODE]); diff --git a/drivers/net/pfcp.c b/drivers/net/pfcp.c index 68d0d9e92a22..7b0575940e1d 100644 --- a/drivers/net/pfcp.c +++ b/drivers/net/pfcp.c @@ -184,11 +184,12 @@ static int pfcp_add_sock(struct pfcp_dev *pfcp) return PTR_ERR_OR_ZERO(pfcp->sock); } -static int pfcp_newlink(struct net *net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int pfcp_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct pfcp_dev *pfcp = netdev_priv(dev); + struct net *net = params->net; struct pfcp_net *pn; int err; diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index 4583e15ad03a..b3340f8a6149 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -1303,10 +1303,13 @@ static int ppp_nl_validate(struct nlattr *tb[], struct nlattr *data[], return 0; } -static int ppp_nl_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ppp_nl_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct ppp_config conf = { .unit = -1, .ifname_is_set = true, diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c index f4019815f473..78edb8186b6d 100644 --- a/drivers/net/team/team_core.c +++ b/drivers/net/team/team_core.c @@ -2218,10 +2218,12 @@ static void team_setup(struct net_device *dev) dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX; } -static int team_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int team_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **tb = params->tb; + if (tb[IFLA_ADDRESS] == NULL) eth_hw_addr_random(dev); diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 01251868a9c2..7dfda89f072f 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -1765,10 +1765,13 @@ static int veth_init_queues(struct net_device *dev, struct nlattr *tb[]) return 0; } -static int veth_newlink(struct net *peer_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int veth_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct net *peer_net = params->net; + struct nlattr **tb = params->tb; int err; struct net_device *peer; struct veth_priv *priv; diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index 5f21ce1013c4..849c3ced2690 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c @@ -1675,11 +1675,12 @@ static void vrf_dellink(struct net_device *dev, struct list_head *head) unregister_netdevice_queue(dev, head); } -static int vrf_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int vrf_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct net_vrf *vrf = netdev_priv(dev); + struct nlattr **data = params->data; struct netns_vrf *nn_vrf; bool *add_fib_rules; struct net *net; diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index ac5bc78edfd7..09a4a5bf1038 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -4400,10 +4400,13 @@ static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[], return 0; } -static int vxlan_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int vxlan_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct vxlan_config conf; int err; diff --git a/drivers/net/wireguard/device.c b/drivers/net/wireguard/device.c index 6cf173a008e7..404cf05bd72b 100644 --- a/drivers/net/wireguard/device.c +++ b/drivers/net/wireguard/device.c @@ -307,11 +307,12 @@ static void wg_setup(struct net_device *dev) wg->dev = dev; } -static int wg_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int wg_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct wg_device *wg = netdev_priv(dev); + struct net *src_net = params->net; int ret = -ENOMEM; rcu_assign_pointer(wg->creating_net, src_net); diff --git a/drivers/net/wireless/virtual/virt_wifi.c b/drivers/net/wireless/virtual/virt_wifi.c index 4ee374080466..26905b2b3ba3 100644 --- a/drivers/net/wireless/virtual/virt_wifi.c +++ b/drivers/net/wireless/virtual/virt_wifi.c @@ -519,11 +519,13 @@ static rx_handler_result_t virt_wifi_rx_handler(struct sk_buff **pskb) } /* Called with rtnl lock held. */ -static int virt_wifi_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int virt_wifi_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct virt_wifi_netdev_priv *priv = netdev_priv(dev); + struct net *src_net = params->net; + struct nlattr **tb = params->tb; int err; if (!tb[IFLA_LINK]) diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c index a51e2755991a..a05c49b4e7f8 100644 --- a/drivers/net/wwan/wwan_core.c +++ b/drivers/net/wwan/wwan_core.c @@ -967,15 +967,18 @@ static struct net_device *wwan_rtnl_alloc(struct nlattr *tb[], return dev; } -static int wwan_rtnl_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int wwan_rtnl_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct wwan_device *wwandev = wwan_dev_get_by_parent(dev->dev.parent); - u32 link_id = nla_get_u32(data[IFLA_WWAN_LINK_ID]); struct wwan_netdev_priv *priv = netdev_priv(dev); + struct nlattr **data = params->data; + u32 link_id; int ret; + link_id = nla_get_u32(data[IFLA_WWAN_LINK_ID]); + if (IS_ERR(wwandev)) return PTR_ERR(wwandev); @@ -1061,6 +1064,11 @@ static void wwan_create_default_link(struct wwan_device *wwandev, { struct nlattr *tb[IFLA_MAX + 1], *linkinfo[IFLA_INFO_MAX + 1]; struct nlattr *data[IFLA_WWAN_MAX + 1]; + struct rtnl_newlink_params params = { + .net = &init_net, + .tb = tb, + .data = data, + }; struct net_device *dev; struct nlmsghdr *nlh; struct sk_buff *msg; @@ -1105,7 +1113,7 @@ static void wwan_create_default_link(struct wwan_device *wwandev, if (WARN_ON(IS_ERR(dev))) goto unlock; - if (WARN_ON(wwan_rtnl_newlink(&init_net, dev, tb, data, NULL))) { + if (WARN_ON(wwan_rtnl_newlink(dev, ¶ms, NULL))) { free_netdev(dev); goto unlock; } diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h index 523025106a64..0f7281e3e448 100644 --- a/include/linux/if_macvlan.h +++ b/include/linux/if_macvlan.h @@ -59,8 +59,10 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan, extern void macvlan_common_setup(struct net_device *dev); -extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +struct rtnl_newlink_params; + +extern int macvlan_common_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack); extern void macvlan_dellink(struct net_device *dev, struct list_head *head); diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index bc0069a8b6ea..563a6a27436c 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h @@ -69,6 +69,25 @@ static inline int rtnl_msg_family(const struct nlmsghdr *nlh) return AF_UNSPEC; } +/** + * struct rtnl_newlink_params - parameters of rtnl_link_ops::newlink() + * + * @net: Netns of interest + * @src_net: Source netns of rtnetlink socket + * @link_net: Link netns by IFLA_LINK_NETNSID, NULL if not specified + * @peer_net: Peer netns + * @tb: IFLA_* attributes + * @data: IFLA_INFO_DATA attributes + */ +struct rtnl_newlink_params { + struct net *net; + struct net *src_net; + struct net *link_net; + struct net *peer_net; + struct nlattr **tb; + struct nlattr **data; +}; + /** * struct rtnl_link_ops - rtnetlink link operations * @@ -125,10 +144,8 @@ struct rtnl_link_ops { struct nlattr *data[], struct netlink_ext_ack *extack); - int (*newlink)(struct net *src_net, - struct net_device *dev, - struct nlattr *tb[], - struct nlattr *data[], + int (*newlink)(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack); int (*changelink)(struct net_device *dev, struct nlattr *tb[], diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c index 134419667d59..91df0f96e32a 100644 --- a/net/8021q/vlan_netlink.c +++ b/net/8021q/vlan_netlink.c @@ -135,11 +135,14 @@ static int vlan_changelink(struct net_device *dev, struct nlattr *tb[], return 0; } -static int vlan_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int vlan_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct vlan_dev_priv *vlan = vlan_dev_priv(dev); + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct net_device *real_dev; unsigned int max_mtu; __be16 proto; diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index 822d788a5f86..d893c8013261 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c @@ -1077,19 +1077,18 @@ static int batadv_softif_validate(struct nlattr *tb[], struct nlattr *data[], /** * batadv_softif_newlink() - pre-initialize and register new batadv link - * @src_net: the applicable net namespace * @dev: network device to register - * @tb: IFLA_INFO_DATA netlink attributes - * @data: enum batadv_ifla_attrs attributes + * @params: rtnl newlink parameters * @extack: extended ACK report struct * * Return: 0 if successful or error otherwise. */ -static int batadv_softif_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int batadv_softif_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct batadv_priv *bat_priv = netdev_priv(dev); + struct nlattr **data = params->data; const char *algo_name; int err; diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 3e0f47203f2a..6e337937d0d7 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -1553,11 +1553,13 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[], return 0; } -static int br_dev_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int br_dev_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct net_bridge *br = netdev_priv(dev); + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; int err; err = register_netdevice(dev); diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 94ad09e36df2..fa6a3c2634a8 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c @@ -438,10 +438,11 @@ static void caif_netlink_parms(struct nlattr *data[], } } -static int ipcaif_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ipcaif_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; int ret; struct chnl_net *caifdev; ASSERT_RTNL(); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 0f3e2c6021de..9ebbde0d131c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -3767,7 +3767,13 @@ static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm, struct netlink_ext_ack *extack) { unsigned char name_assign_type = NET_NAME_USER; - struct net *net = sock_net(skb->sk); + struct rtnl_newlink_params params = { + .src_net = sock_net(skb->sk), + .link_net = link_net, + .peer_net = peer_net, + .tb = tb, + .data = data, + }; u32 portid = NETLINK_CB(skb).portid; struct net_device *dev; char ifname[IFNAMSIZ]; @@ -3792,13 +3798,14 @@ static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm, dev->ifindex = ifm->ifi_index; + params.net = params.src_net; if (link_net) - net = link_net; + params.net = link_net; if (peer_net) - net = peer_net; + params.net = peer_net; if (ops->newlink) - err = ops->newlink(net, dev, tb, data, extack); + err = ops->newlink(dev, ¶ms, extack); else err = register_netdevice(dev); if (err < 0) { diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c index b68f2f71d0e1..39add538ba99 100644 --- a/net/hsr/hsr_netlink.c +++ b/net/hsr/hsr_netlink.c @@ -29,10 +29,12 @@ static const struct nla_policy hsr_policy[IFLA_HSR_MAX + 1] = { /* Here, it seems a netdevice has already been allocated for us, and the * hsr_dev_setup routine has been executed. Nice! */ -static int hsr_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int hsr_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct net *src_net = params->net; enum hsr_version proto_version; unsigned char multicast_spec; u8 proto = HSR_PROTOCOL_HSR; diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c index 175efd860f7b..704bf9e3f097 100644 --- a/net/ieee802154/6lowpan/core.c +++ b/net/ieee802154/6lowpan/core.c @@ -129,10 +129,11 @@ static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[], return 0; } -static int lowpan_newlink(struct net *src_net, struct net_device *ldev, - struct nlattr *tb[], struct nlattr *data[], +static int lowpan_newlink(struct net_device *ldev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **tb = params->tb; struct net_device *wdev; int ret; diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index c9f11a046c26..1fe9b13d351c 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -1396,10 +1396,12 @@ ipgre_newlink_encap_setup(struct net_device *dev, struct nlattr *data[]) return 0; } -static int ipgre_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ipgre_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; struct ip_tunnel_parm_kern p; __u32 fwmark = 0; int err; @@ -1414,10 +1416,12 @@ static int ipgre_newlink(struct net *src_net, struct net_device *dev, return ip_tunnel_newlink(dev, tb, &p, fwmark); } -static int erspan_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int erspan_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; struct ip_tunnel_parm_kern p; __u32 fwmark = 0; int err; @@ -1697,6 +1701,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 nlattr *tb[IFLA_MAX + 1]; struct net_device *dev; LIST_HEAD(list_kill); @@ -1704,6 +1709,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, int err; memset(&tb, 0, sizeof(tb)); + params.tb = tb; dev = rtnl_create_link(net, name, name_assign_type, &ipgre_tap_ops, tb, NULL); @@ -1714,7 +1720,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, t = netdev_priv(dev); t->collect_md = true; - err = ipgre_newlink(net, dev, tb, NULL, NULL); + err = ipgre_newlink(dev, ¶ms, NULL); if (err < 0) { free_netdev(dev); return ERR_PTR(err); diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index f0b4419cef34..b901bee03e6d 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c @@ -575,11 +575,13 @@ static void vti_netlink_parms(struct nlattr *data[], *fwmark = nla_get_u32(data[IFLA_VTI_FWMARK]); } -static int vti_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int vti_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; struct ip_tunnel_parm_kern parms; + struct nlattr **tb = params->tb; __u32 fwmark = 0; vti_netlink_parms(data, &parms, &fwmark); diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index dc0db5895e0e..a8b844bcfc64 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c @@ -436,11 +436,13 @@ static void ipip_netlink_parms(struct nlattr *data[], *fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]); } -static int ipip_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ipip_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct ip_tunnel *t = netdev_priv(dev); + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; struct ip_tunnel_encap ipencap; struct ip_tunnel_parm_kern p; __u32 fwmark = 0; diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 235808cfec70..863852abe8ea 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -2005,11 +2005,14 @@ static int ip6gre_newlink_common(struct net *src_net, struct net_device *dev, return err; } -static int ip6gre_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ip6gre_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct ip6_tnl *nt = netdev_priv(dev); + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct net *net = dev_net(dev); struct ip6gre_net *ign; int err; @@ -2241,11 +2244,14 @@ static void ip6erspan_tap_setup(struct net_device *dev) netif_keep_dst(dev); } -static int ip6erspan_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ip6erspan_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { struct ip6_tnl *nt = netdev_priv(dev); + struct nlattr **data = params->data; + struct net *src_net = params->net; + struct nlattr **tb = params->tb; struct net *net = dev_net(dev); struct ip6gre_net *ign; int err; diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 48fd53b98972..54b843d20870 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c @@ -2002,10 +2002,12 @@ static void ip6_tnl_netlink_parms(struct nlattr *data[], parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]); } -static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ip6_tnl_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; struct net *net = dev_net(dev); struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); struct ip_tunnel_encap ipencap; diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index 590737c27537..993f85aeb882 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c @@ -997,10 +997,11 @@ static void vti6_netlink_parms(struct nlattr *data[], parms->fwmark = nla_get_u32(data[IFLA_VTI_FWMARK]); } -static int vti6_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int vti6_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; struct net *net = dev_net(dev); struct ip6_tnl *nt; diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 39bd8951bfca..e2bd52cabdee 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -1550,10 +1550,12 @@ static bool ipip6_netlink_6rd_parms(struct nlattr *data[], } #endif -static int ipip6_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], +static int ipip6_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; + struct nlattr **tb = params->tb; struct net *net = dev_net(dev); struct ip_tunnel *nt; struct ip_tunnel_encap ipencap; diff --git a/net/xfrm/xfrm_interface_core.c b/net/xfrm/xfrm_interface_core.c index c397eb99d867..5659a6cadd51 100644 --- a/net/xfrm/xfrm_interface_core.c +++ b/net/xfrm/xfrm_interface_core.c @@ -814,10 +814,11 @@ static void xfrmi_netlink_parms(struct nlattr *data[], parms->collect_md = true; } -static int xfrmi_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], - struct netlink_ext_ack *extack) +static int xfrmi_newlink(struct net_device *dev, + struct rtnl_newlink_params *params, + struct netlink_ext_ack *extack) { + struct nlattr **data = params->data; struct net *net = dev_net(dev); struct xfrm_if_parms p = {}; struct xfrm_if *xi; From patchwork Wed Feb 19 12:50:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Liang X-Patchwork-Id: 866580 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE0EF1E1A18; Wed, 19 Feb 2025 12:51:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969493; cv=none; b=NXgGbIvE/PpiCiXlDdQURBqEiQk2feLk3uh0TF9zpwyc1iW4RZFsHqCz1E0zTIRqnbrkXnjb+2YH/RX3g6uTKTiNdBNefXV/tjte2cF/vgmB9l9pGa/udsru2bJoS+aS2lFpJj8bGZvS9dPlf0aX4y7zkCMDYj2fu2swsdapR8U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969493; c=relaxed/simple; bh=wPBh+lm62MwNx5uxT7ebUmt4/Z+4/EESOV0PaYKRJhQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sDQmV1cBdR/4BP7wab3zZslnhgpbcdrXrcbVeoVjNc+Zr+XOJjeqQGePEG7Lx3JKCqmfEJQ3t/FmloOwj+zNOR5MEQj39u+lUL/ymvBvmFkZOLf2YajWsyPLyV3BGndLrXtyrmaFD8f5TBzJBRO1gJHaY9k20yA0TrgxMGiliGA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IqAKVtrs; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IqAKVtrs" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-220ecbdb4c2so2358725ad.3; Wed, 19 Feb 2025 04:51:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739969490; x=1740574290; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=so6ixpN3+kGL2R8Euj1cLc9vRqq6Wkcgz/xNsuJc6Sk=; b=IqAKVtrsIK9gPfYvB2qMyHNznqkv/bqL39s/TeYvl07ZnugiuA6iEKNeai4KI1M6G8 ICw8sihir6VBTGmR6m8LtIO9uBtzHXQxTgiZYXeYKH+cfufCVt74ziKaYs+NMr3boUOm eAGGBv8W7bpeBmsjvGVxIhNx8gj6KzXPS//YKVoNHbVoit5siXdtuzEe81ZilpbjIC51 ApjksghQhcb002RpAo9Hc9WO0Q8Qcnu1crjvqNlL16/5DGaqSrmlhWJ1NV+24BGyfwNs UDS4pewY33rqtWjR2ncQFgwhPywxfASXHHd9/1nJuwmhW9PGpVddb4ZO6o5BN85l+mGc 4iow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739969490; x=1740574290; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=so6ixpN3+kGL2R8Euj1cLc9vRqq6Wkcgz/xNsuJc6Sk=; b=WICITx8dW38A8p4vfYw64NcXz3zFVlHEw2wD+fePXjXyzb34NGPNlSzdht8JM6fNH7 U1EFom/XmbBSP9A1l6nm7wMXTrJjR3fD14ENwKQqVgoH9eM3j3gJL4InCG8QiIefHBVt lUSXJ9/dlITdw9VKVVVeXkroBnXK8ezgd8JN/uw0qn22+sgHv4fnC+Ie3vU6jBIZZ985 ibDy/tOvMSq7c9cLi46DjZN2RaKlYkpkMos0JoChawGDyrMDU1Rlm3NPZU0zjosPus48 YDDgNeEgM6E9H1LyYv0je/yMKfKRgxYCc04lEf0GFW4YOHEQ9VIyo1QuAB6V8n18buw/ NOcA== X-Forwarded-Encrypted: i=1; AJvYcCUTX5iYD4celzeoRnUPNXzhD0qjugCQ8dnrKQSjTqp14KH6r8GuOYiYBfn75hm6Gu4+7h4=@vger.kernel.org, AJvYcCUxcFoH08nYn6Ike5cSgoBX+AxuflvwwvhM6NLrl00NrxvCpOZyzbO+iyQt+TmFRhF05ODix6wl4HGoLw==@vger.kernel.org, AJvYcCWF8mseTqY3VvZmTT9+GYS9H/ZF3ZadpIhSgkwUerEv72x4I+ny94UKNxRJFWvyuF5m4hg6K2LIKhLiKwZ9gad3@vger.kernel.org, AJvYcCWpMeFmT0GlQFAQU3W8xF9hMRPY93Gfa+v5lJRAeU3ZJIRyIUEmEe21I7o2OViGYVu+U5eI72Yp2THV@vger.kernel.org, AJvYcCWpqL2+BmTFwAmiwD2InIlWDIAvNMAdCMzmHE5OPGDRcc1lH//NkRbSqAZZ2E5xYToFTaTXMGuYe5MUEU6m@vger.kernel.org, AJvYcCX0Zqt0Knq1/V8fVjFLrNGqh/BZwlgeo0nQlzF0gEqYS6LVmZ13gKMKPhyiGhEsn8QIGFOIzs+II6rFNg==@vger.kernel.org, AJvYcCXqa4DKLQ61oaFODfSX6zVnR44GsMSI3V/hzDf/w/Znv5lo8GKaeYTVUbrTit+HU+uX5XN24VMYCag7ahLjQIs=@vger.kernel.org, AJvYcCXzkzwDbk0YaZ1ml/FrUePO6kZtUpUCTjCRoIshSjltE1jl2yOP8YGI5ggMHPfVXDQB3G6JfkLaUpbq@vger.kernel.org X-Gm-Message-State: AOJu0YzF5793nj6pFhPx5qGD4s0kPRH0AJY6pxlY53aIWRWr+VCbmYve p/0MlQIDec0xOsf0iQ/pUJt/dm1aqRx6+9TN5+GEGBScGs5uizaRBh0qkV4IXTI= X-Gm-Gg: ASbGncvfhRn5+KnBSAN6Teg5/T+r9LZmP8ew2nVGFpLl0NROugO1yrm0naNt00zhwke QG0csqyg1TYi+uiA434zg6XeRiqjTl26/z9C8yb1HrykRRxyJSk2+riLtGvq1yKRT7ztpUquhOI hTffb3rUGyij1kyD3qr2qbwiT7qju0mnBrJYJPBz7Jx3zcQ5srHFS5Yxb2n4Ovfctlw9qqvwAj7 l8t5vi9wuUee6kxIjD2K8Flh5MfjMY0bFt++01czcZize9PkY/+Xh52c7pmI9p0kNHKeccvCZLR mTfDIA== X-Google-Smtp-Source: AGHT+IEqkCyGg/QTxep/fqv5CqcRvswNVHWV96b7TSvHtcfDnyWeYpeOAf5Az1bAxRJk7mW/W72uWQ== X-Received: by 2002:a17:902:ce0d:b0:215:a179:14ca with SMTP id d9443c01a7336-22103ef5861mr278510175ad.2.1739969490317; Wed, 19 Feb 2025 04:51:30 -0800 (PST) Received: from ws.. ([103.167.140.11]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d536436fsm103427175ad.64.2025.02.19.04.51.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 04:51:29 -0800 (PST) From: Xiao Liang To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Kuniyuki Iwashima , Jakub Kicinski Cc: "David S. Miller" , David Ahern , Eric Dumazet , Paolo Abeni , Andrew Lunn , Simon Horman , Shuah Khan , Donald Hunter , Alexander Aring , Stefan Schmidt , Miquel Raynal , Steffen Klassert , Herbert Xu , linux-rdma@vger.kernel.org, linux-can@vger.kernel.org, osmocom-net-gprs@lists.osmocom.org, bpf@vger.kernel.org, linux-ppp@vger.kernel.org, wireguard@lists.zx2c4.com, linux-wireless@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org, bridge@lists.linux.dev, linux-wpan@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v10 04/13] ieee802154: 6lowpan: Validate link netns in newlink() of rtnl_link_ops Date: Wed, 19 Feb 2025 20:50:30 +0800 Message-ID: <20250219125039.18024-5-shaw.leon@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250219125039.18024-1-shaw.leon@gmail.com> References: <20250219125039.18024-1-shaw.leon@gmail.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Device denoted by IFLA_LINK is in link_net (IFLA_LINK_NETNSID) or source netns by design, but 6lowpan uses dev_net. Note dev->netns_local is set to true and currently link_net is implemented via a netns change. These together effectively reject IFLA_LINK_NETNSID. This patch adds a validation to ensure link_net is either NULL or identical to dev_net. Thus it would be fine to continue using dev_net when rtnetlink core begins to create devices directly in target netns. Signed-off-by: Xiao Liang Reviewed-by: Kuniyuki Iwashima --- net/ieee802154/6lowpan/core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c index 704bf9e3f097..ee318d46817d 100644 --- a/net/ieee802154/6lowpan/core.c +++ b/net/ieee802154/6lowpan/core.c @@ -143,6 +143,8 @@ static int lowpan_newlink(struct net_device *ldev, if (!tb[IFLA_LINK]) return -EINVAL; + if (params->link_net && !net_eq(params->link_net, dev_net(ldev))) + return -EINVAL; /* find and hold wpan device */ wdev = dev_get_by_index(dev_net(ldev), nla_get_u32(tb[IFLA_LINK])); if (!wdev) From patchwork Wed Feb 19 12:50:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Liang X-Patchwork-Id: 866579 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D45391E1A14; Wed, 19 Feb 2025 12:51:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969511; cv=none; b=GIhJLN+fZWZSXXRZhoJGPj9p9wrcSHlNbyTK/DqN70zp1vVufsL2+9ydvqEMFQW3IQ3cpcOcQCr+TTlEMvHT6//jcQw9dYi8dXoRJFG/YdeaBbXBSpkAkNj0Igu6E1aMmFfqiWKLsm/ny3joc0v0dB/ZNVYDOd54pVZ7tshtZ50= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969511; c=relaxed/simple; bh=TB+PZXAS/vx8BG7x1KeG79/o2AKkUgqXidM5xP69mA0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nvg1Q3OA2dLuBCDemBFpZgbNLMIGWdDFAXUCuMTmS/sSh9eW/B3MYest1Vg0qD8nVFx5YCxVa+w9SJ++Umbl70EhRa5DE9dyLOUv4kb67fJ4Z04ZXakodTQdujt/m3BI2km0wShG7h7rTGvNFtRrdSeMqGAcImLLTXQi0ZAc4WE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lUnL246V; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lUnL246V" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-220d39a5627so97980375ad.1; Wed, 19 Feb 2025 04:51:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739969508; x=1740574308; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Y8g2ZzjSkLAnV2rJAeqcq6uVgaF3+M6uyZFMb8BU5Wo=; b=lUnL246V0nSup/DnSHF1uwpze1YPSFu+IKjYijoxO9efDv+Xno8bqofJwSldOGKF14 ANU5yMoA4hBt7yXFedNsnhxQE8/JgRyZL+0qF2Hs7ybxCZBXmZ0TJZ/oFNe6ndUUqwQm AqxT+Zyrj2zZVe1fNsf2eGPx2ldlJf+KV7W704SLBouDJCrF/l9gPKIolMUWWU7qA7a2 zSmiOfQMLZV8BIqGYppIekaDyp7RxMLSm0ef3z1f4TqQygmRTRBFKGWvB6fAcf8SHIn5 TYtSRd35WV265rAYk/wFuo0DRVoW+B9bZuCHw4SMVRJ7BQW+AbQdcHbaNwvLG/pK7hbu jKZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739969508; x=1740574308; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Y8g2ZzjSkLAnV2rJAeqcq6uVgaF3+M6uyZFMb8BU5Wo=; b=lIYkPz5eBnOJmCtcuy0s1EQSjOgRosNfbOlbNTnXDDO29iypUUhgMJVX0Hy6/RULca Xklm4YrrGFhrmmpKPSLdgnggBeOMKofX0rWnAGhECl0Kquq8Quop8FkSdmhzAciMnyCP Y8iNJ8bhychzUTfopkrNORYMuPrOxazWS2D1N5e8jvecdSMOg5+9rlaRSwBsKYkzOqpl QT4ZZ1vWi81CJRLwj/oBKOWWKhJ28NdY52ZdZ196B43YswpMSMlOhWFNbKA2XtqrMQ4Z gm9aRFwu2Tvyz64fwlrmU8NXnfoY+PfmAKwWvA5eQLBEOXjeesSMhWGrp6cvFy7IS3jJ 4AVA== X-Forwarded-Encrypted: i=1; AJvYcCVFkjzYCO1pt7UkgQRSGbrza3PkcuKpD/dY6rP9xbEoqDXM4WVTdVcHrpigOpaBiOEoUT8mGm3Y+Odz@vger.kernel.org, AJvYcCVaxv9FvMwb1+XyLty7HgVdoaLLOywyttShK+OeShIN0vfiyd0ru4ILpxLYuiL4SqKTBdzAU2O4cED4PvGPsA68@vger.kernel.org, AJvYcCW1NQ01DJcPlDM+PjFtnvjAMNdj3yLP/bMxFknDStqvPLIiyfLBbrV7zbQksgzJAaT3gbnIYQt6gmtf@vger.kernel.org, AJvYcCWCukGYV9pnFhP5DQh2wotPZEtisPOuoKXst/FSJ/i2VULpRimpu4ml7SKMJQpSunCHnOSgF0SSGuyi1I65@vger.kernel.org, AJvYcCWF6Xro3QoOM7aIch9XnwZs22nuGDsRhinX01zSq5RyZlOBXPhpvjX9z7sexSmrU47iUGGJJhw6Jb4mzg==@vger.kernel.org, AJvYcCXCgtlPdJOeuBguoWzrIIh+P93v2CyCsGB/hZegA+6MEG8bXAjZ+5ff87BRVbz+ih2PegM=@vger.kernel.org, AJvYcCXTJEV7MtHhCzEDVxhR4u3Iy19yL5LkkeKDDS/FFv5Tm78eipxhQNy7bJR0FIZXDiGJf3A/hk8CaGbeVwVRm9E=@vger.kernel.org, AJvYcCXUQVXRS8Z8OSfq32JdrSRVPVAUNf1wip4VMRzYQrhlaXahllQP/r3BKElWWINW9XhG8M5GNOHnJWoDlg==@vger.kernel.org X-Gm-Message-State: AOJu0YzrK7NnNI0HljjGkZS1ZlI8YSXLbMTRTdw4t/h+K6Rkh44TiHh0 Vk/WzVdRkgAm1Lpg9w/cTQosS4MrdNkFTw43ZgrcEImHRz0mXt4NN4Wvo6K/yWs= X-Gm-Gg: ASbGncthCU7toCPgGui/PfEFHMHpTVn+R13GRk5QfrQd2wf7AD/r5PpeWxeUlF+5wn2 CNrgsWu5zafKld+qqzvlhtpwdAApSrhEJtFLE6bx48y72/KT/doFER9Eo0zp+qYtkJVJGS7fXpl VDMvRn2fClFGpZUJyo3C3LXj2ONi1Rim9Ldyf+D0pSTCsSGb7OX9pIBpwYbJRdip2dNapBad9L5 b8uCnBD1eXauCWaMGp1nSrN+V4ggopAitSpu8cpOi9d4h0ZkcaBNTQjUnSpX3LB7QpyTzqFDW8q SSQ9LQ== X-Google-Smtp-Source: AGHT+IFYP0H8aiDg7L5uhsGsJLhgqrRsnWJTkGp9h+ijz9vj+qGa0NYcij3UcKBMYCMaV2Zll9Ie8g== X-Received: by 2002:a17:902:ec84:b0:220:d532:834e with SMTP id d9443c01a7336-221040255d9mr276303305ad.19.1739969508267; Wed, 19 Feb 2025 04:51:48 -0800 (PST) Received: from ws.. ([103.167.140.11]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d536436fsm103427175ad.64.2025.02.19.04.51.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 04:51:47 -0800 (PST) From: Xiao Liang To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Kuniyuki Iwashima , Jakub Kicinski Cc: "David S. Miller" , David Ahern , Eric Dumazet , Paolo Abeni , Andrew Lunn , Simon Horman , Shuah Khan , Donald Hunter , Alexander Aring , Stefan Schmidt , Miquel Raynal , Steffen Klassert , Herbert Xu , linux-rdma@vger.kernel.org, linux-can@vger.kernel.org, osmocom-net-gprs@lists.osmocom.org, bpf@vger.kernel.org, linux-ppp@vger.kernel.org, wireguard@lists.zx2c4.com, linux-wireless@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org, bridge@lists.linux.dev, linux-wpan@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v10 06/13] net: ip_tunnel: Use link netns in newlink() of rtnl_link_ops Date: Wed, 19 Feb 2025 20:50:32 +0800 Message-ID: <20250219125039.18024-7-shaw.leon@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250219125039.18024-1-shaw.leon@gmail.com> References: <20250219125039.18024-1-shaw.leon@gmail.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 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: Xiao Liang --- include/net/ip_tunnels.h | 5 +++-- net/ipv4/ip_gre.c | 8 +++++--- net/ipv4/ip_tunnel.c | 6 +++--- net/ipv4/ip_vti.c | 3 ++- net/ipv4/ipip.c | 3 ++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 1aa31bdb2b31..ae1f2dda4533 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h @@ -406,8 +406,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[], diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 1fe9b13d351c..26d15f907551 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -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); diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index dd4b4e5be998..011f2a5aab3b 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c @@ -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; diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index b901bee03e6d..159b4473290e 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c @@ -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[], diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index a8b844bcfc64..bab0bf90c908 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c @@ -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[], From patchwork Wed Feb 19 12:50:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Liang X-Patchwork-Id: 866578 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B37F01E834B; Wed, 19 Feb 2025 12:52:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969529; cv=none; b=aFQv1sLCuBmFDrMhSVoob5I5ZtyNXTX3Ab+VTSHt0JUGgnMMxuOwECfLDqkMUQBQV7tyHHjPsvDTX2/mEa9l+SZ0HTAYSGUfYcZF/BpNNJQzxIokdZShyZBoiq5v22M5Hr07NtzymqNVsjxKKDgKPBT+Hv1PLMzmd9qTm2T+r2c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969529; c=relaxed/simple; bh=WnqzfYihIgH7CnlxbfGoXmbwDyB/yLwFF1VQRuUd9SY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oEDRwJffGduQaL2Ncpu6JE0c4f0iXp2VT5xm1xip3LRal+/UPG5Hij6xG6i414yjw0iT/jw73bC90DXsGoLX0gzSPRhcMm4HmAG9IIZylmp6cTzak3N4xDC5Sq0W2J2RnYayVg7TjMsQO3CmAWsVTeK+Ar6vCX+/YWHutDkAR3A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HWFXqjxw; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HWFXqjxw" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-22101839807so92273015ad.3; Wed, 19 Feb 2025 04:52:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739969526; x=1740574326; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rsYd7KiB2vQaWNh0ASWhN8pl6PDFq3SaA7EkmHtk6YM=; b=HWFXqjxwR+Fx+mMWPLq85kKQMAr98hYpYLF5PyO3X/EEuuMAbxS5OMh0hVT0U1bVsV H3MqQGzZ28Cey10+iFPoGo/iPUqLHQ5KIOt0Yw5vG8QZbd6EG/tNfw2Sim0H1Bx2ypWO 2N0uBy64v8sKzYiIR8V/5KKX2Nmhli1j7Lj+I316Ft5cr6OmJOlwj7Gy+Lgr/iXvIbvT pNy0G8fqw38Uz7fqzsmsUS5H92EaQhGHcCxTEQikKASTadQQFRbGhwrzHwABTJkHNqR4 10CJIrbbdKdKJaA6IlHSk8F52bUWA+o8bV3JDrz+9yrAv+K4T3uHxwvNRqSFtC3OiqfQ yIKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739969526; x=1740574326; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rsYd7KiB2vQaWNh0ASWhN8pl6PDFq3SaA7EkmHtk6YM=; b=LS3a/jvUKwmLPyud9jr8bPcnaGB2nEl3xmbxmRWXXRyLWJXXjwLxPiMM8ae63ds1ua ao0itUFBWQedYUllDHUI644nhJt3WXZc/vrQ5F1uoXr2wQOcU0yKZL9KHDp84sPFG535 ugtpJNHFO660Dp3MCmZk6xZ19RZvJS+aI7U6deoUOCEdzv5II55AuYLJwE1jsPBH9Vl1 LqVbJPg/a/Zp9PupcdHgz/zB/jzYMcAdN9E/kMuzhGlFjvgDBSdM83ISNWoU/BwMqsfV /MNUOWbzwXmhvAocZbmzbAefUSwcZA5Nhz8vcTV9rC81WHa2WRpxPj74T5NWGmEhtRNp Z0Lg== X-Forwarded-Encrypted: i=1; AJvYcCU7zDAy3gjJxEflw57PqWeo2/DhnkDIIaQkagDgSPzuVQ/q9WvyRk66PljLiZGGILNmqeUgv7Us3JAg@vger.kernel.org, AJvYcCUvVU2eAd8uoaGqZiesgTVXVxcYa4sg5OP/UMeZzFU+mzLIEXX/aExXTIL+2n0pRDTPSoI=@vger.kernel.org, AJvYcCVCNBAUgOJ+3SKhEDKNGEHdpQEJSQWAaslJAuxPKSn/VQ0z6ym+3LMwyzZPNAIvVIo4yyLHNXmmlOrP9w==@vger.kernel.org, AJvYcCVPpq/3SovDndAYomqoSusDs3Tm91TcRyEjzQ8SO0JohvJmXBuwN5Ta32mltGlFE9HRJtp9rIMJjKfW8dba@vger.kernel.org, AJvYcCVwzeWGsbeuOBuCdWhlZ6Gx8SWiAQXAla6dLuq7+BD/nwJDU0S/U5q2JAEXLxaJgltgaC1FWPUBCo7ktP+8hUHM@vger.kernel.org, AJvYcCW5TElMvRi0ZKoje0D/PM2xNWJWchT82FasB2OcTxovpvVyriVS3BeF+id6pxbSCF8WlTKnJ6fqlt4hZA==@vger.kernel.org, AJvYcCWT6T+/1VJ5rrMeeVgEqtX9n8c4zwbXYqQxUNpBb+GJqSMvm1m7ZWimvsXjENAQu2DFC52qg/Zhurbs@vger.kernel.org, AJvYcCWaqom69t2+UD6x+mUi39muDvcbiwpO5vGqPUOHFAJ3sqXVlcborVTjh1cW3bFv4lvVYCD4XdqFyLvpokwgpIs=@vger.kernel.org X-Gm-Message-State: AOJu0YwvunrFre3Sdt1RHCV1RAAL8wqt6+ZuXhZQcg9aOovms4HdDMFl 9aT6CzAN+pcidL6nmK47ZetXqpkRdUy0sH3saolKwACOfpsMnIMvf72u1WbYHjI= X-Gm-Gg: ASbGnctGEd+AX09VIMaVCTE7LiAhn1TS2wFxK2/3bA04IlE/TEMx9cYqDY1nOfdKMxE a3OXVuQLB+yKZcFnsKuBacuV3bGjPY9belxgem8t42At0udpg/1XtLmeTm0EV/ct5kEW2DtmodF 1Cct3DRtodXvm5e5BW8Gw8vFkzu/EBzxUluwtK/rCqkXCZiI+CyO6lEuRlJql+FsQzynZAUdwAM PnKkzyTHr5kzi/JT0Aw+VocQD6nrhlNHdIQnbquYCj7+J9adLQ9Hw+A0LDIbdt+TcKS8gJq1pLA FrHxAA== X-Google-Smtp-Source: AGHT+IEmzyu5IbJEeeDhw+tXRaZzlcx6HaVQuXOtrNDJjpviTChMhHRF4glLxd0ys0/eE/gPyp4KqQ== X-Received: by 2002:a17:902:db0a:b0:21f:8677:5961 with SMTP id d9443c01a7336-2217119d382mr58688885ad.34.1739969526138; Wed, 19 Feb 2025 04:52:06 -0800 (PST) Received: from ws.. ([103.167.140.11]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d536436fsm103427175ad.64.2025.02.19.04.51.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 04:52:05 -0800 (PST) From: Xiao Liang To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Kuniyuki Iwashima , Jakub Kicinski Cc: "David S. Miller" , David Ahern , Eric Dumazet , Paolo Abeni , Andrew Lunn , Simon Horman , Shuah Khan , Donald Hunter , Alexander Aring , Stefan Schmidt , Miquel Raynal , Steffen Klassert , Herbert Xu , linux-rdma@vger.kernel.org, linux-can@vger.kernel.org, osmocom-net-gprs@lists.osmocom.org, bpf@vger.kernel.org, linux-ppp@vger.kernel.org, wireguard@lists.zx2c4.com, linux-wireless@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org, bridge@lists.linux.dev, linux-wpan@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v10 08/13] net: ipv6: Use link netns in newlink() of rtnl_link_ops Date: Wed, 19 Feb 2025 20:50:34 +0800 Message-ID: <20250219125039.18024-9-shaw.leon@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250219125039.18024-1-shaw.leon@gmail.com> References: <20250219125039.18024-1-shaw.leon@gmail.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 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. Signed-off-by: Xiao Liang Reviewed-by: Kuniyuki Iwashima --- net/ipv6/ip6_gre.c | 14 ++++++-------- net/ipv6/ip6_tunnel.c | 9 +++++---- net/ipv6/ip6_vti.c | 6 +++--- net/ipv6/sit.c | 6 +++--- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index d9e6b1fd9917..d31a4ce3b19f 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -1969,7 +1969,7 @@ static bool ip6gre_netlink_encap_parms(struct nlattr *data[], return ret; } -static int ip6gre_newlink_common(struct net *src_net, struct net_device *dev, +static int ip6gre_newlink_common(struct net *link_net, struct net_device *dev, struct nlattr *tb[], struct nlattr *data[], struct netlink_ext_ack *extack) { @@ -1990,7 +1990,7 @@ static int ip6gre_newlink_common(struct net *src_net, struct net_device *dev, eth_hw_addr_random(dev); nt->dev = dev; - nt->net = dev_net(dev); + nt->net = link_net; err = register_netdevice(dev); if (err) @@ -2007,11 +2007,10 @@ static int ip6gre_newlink(struct net_device *dev, struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct net *net = params->link_net ? : dev_net(dev); struct ip6_tnl *nt = netdev_priv(dev); struct nlattr **data = params->data; - struct net *src_net = params->net; struct nlattr **tb = params->tb; - struct net *net = dev_net(dev); struct ip6gre_net *ign; int err; @@ -2026,7 +2025,7 @@ static int ip6gre_newlink(struct net_device *dev, return -EEXIST; } - err = ip6gre_newlink_common(src_net, dev, tb, data, extack); + err = ip6gre_newlink_common(net, dev, tb, data, extack); if (!err) { ip6gre_tnl_link_config(nt, !tb[IFLA_MTU]); ip6gre_tunnel_link_md(ign, nt); @@ -2246,11 +2245,10 @@ static int ip6erspan_newlink(struct net_device *dev, struct rtnl_newlink_params *params, struct netlink_ext_ack *extack) { + struct net *net = params->link_net ? : dev_net(dev); struct ip6_tnl *nt = netdev_priv(dev); struct nlattr **data = params->data; - struct net *src_net = params->net; struct nlattr **tb = params->tb; - struct net *net = dev_net(dev); struct ip6gre_net *ign; int err; @@ -2266,7 +2264,7 @@ static int ip6erspan_newlink(struct net_device *dev, return -EEXIST; } - err = ip6gre_newlink_common(src_net, dev, tb, data, extack); + err = ip6gre_newlink_common(net, dev, tb, data, extack); if (!err) { ip6erspan_tnl_link_config(nt, !tb[IFLA_MTU]); ip6erspan_tunnel_link_md(ign, nt); diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 111a8777c2f7..89d206731af0 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c @@ -253,8 +253,7 @@ static void ip6_dev_free(struct net_device *dev) static int ip6_tnl_create2(struct net_device *dev) { struct ip6_tnl *t = netdev_priv(dev); - struct net *net = dev_net(dev); - struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); + struct ip6_tnl_net *ip6n = net_generic(t->net, ip6_tnl_net_id); int err; dev->rtnl_link_ops = &ip6_link_ops; @@ -2008,12 +2007,14 @@ static int ip6_tnl_newlink(struct net_device *dev, { struct nlattr **data = params->data; struct nlattr **tb = params->tb; - struct net *net = dev_net(dev); - struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); struct ip_tunnel_encap ipencap; + struct ip6_tnl_net *ip6n; struct ip6_tnl *nt, *t; + struct net *net; int err; + net = params->link_net ? : dev_net(dev); + ip6n = net_generic(net, ip6_tnl_net_id); nt = netdev_priv(dev); nt->net = net; diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index 16e0d74f99dd..83c055996fbb 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c @@ -177,8 +177,7 @@ vti6_tnl_unlink(struct vti6_net *ip6n, struct ip6_tnl *t) static int vti6_tnl_create2(struct net_device *dev) { struct ip6_tnl *t = netdev_priv(dev); - struct net *net = dev_net(dev); - struct vti6_net *ip6n = net_generic(net, vti6_net_id); + struct vti6_net *ip6n = net_generic(t->net, vti6_net_id); int err; dev->rtnl_link_ops = &vti6_link_ops; @@ -1002,9 +1001,10 @@ static int vti6_newlink(struct net_device *dev, struct netlink_ext_ack *extack) { struct nlattr **data = params->data; - struct net *net = dev_net(dev); struct ip6_tnl *nt; + struct net *net; + net = params->link_net ? : dev_net(dev); nt = netdev_priv(dev); vti6_netlink_parms(data, &nt->parms); diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 20453671ac50..f7b59bc957d3 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -201,8 +201,7 @@ static void ipip6_tunnel_clone_6rd(struct net_device *dev, struct sit_net *sitn) static int ipip6_tunnel_create(struct net_device *dev) { struct ip_tunnel *t = netdev_priv(dev); - struct net *net = dev_net(dev); - struct sit_net *sitn = net_generic(net, sit_net_id); + struct sit_net *sitn = net_generic(t->net, sit_net_id); int err; __dev_addr_set(dev, &t->parms.iph.saddr, 4); @@ -1556,14 +1555,15 @@ static int ipip6_newlink(struct net_device *dev, { struct nlattr **data = params->data; struct nlattr **tb = params->tb; - struct net *net = dev_net(dev); struct ip_tunnel *nt; struct ip_tunnel_encap ipencap; #ifdef CONFIG_IPV6_SIT_6RD struct ip_tunnel_6rd ip6rd; #endif + struct net *net; int err; + net = params->link_net ? : dev_net(dev); nt = netdev_priv(dev); nt->net = net; From patchwork Wed Feb 19 12:50:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Liang X-Patchwork-Id: 866577 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05A741E834B; Wed, 19 Feb 2025 12:52:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969546; cv=none; b=umdYnRf4JRrqmPWUFAnsm2sozO7oBA7az6rb9lRIAv39zTFPhe2/XSCsYNHpKQs+qeMXuylMEL59FqmRnBm2avbHNISoUdNe1kIY59HAWH76bzgo3lvLqILOCziokJsOSeb+HitA7Ud5yNdUQVz+2Khi9NFz7y/aCZvNaGMR8uc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969546; c=relaxed/simple; bh=vrqN/QDiEY3adtUjiHJ4zc9O1wCwDFXuoMcSbYrSEaE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nTM8qv3HXLN8y67e7xqntzaR8wstN25PxKRP82XfIRQdrc/08px8gfwuIkR3C+ZHbr2rc+aTZAD1aqX5DJLi6xL7u7gzt+TMV7M6fnvLZ7s6rTPxzM331oNHh6hBF/gmIxxptlec1F8qX7mszavVASfrRzwR/SVXopAO/4u0eic= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bbYCuAO/; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bbYCuAO/" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-220bff984a0so120192085ad.3; Wed, 19 Feb 2025 04:52:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739969544; x=1740574344; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HRequyiks98F4TvQO/vmtwESixnPXuO1TfB2/aKs1TA=; b=bbYCuAO/uPM/IAbhFhD0C8uVo+R70cult+/NQ5+tcP77DsIA2Z0vSjQnakXFXInxRc prK96zFSCARaa+l9DWe6xKsPbLZ4N5xQH3XlPMz55x4LpMnCdq0c4w5lpePiegNUr5+H XMmi324sskK0zPQF8C9D6x09yl22+MtHJACNbvri5uNRXFQ4peSl+ku3BKnUgqCbK4ko AzsxsVbdJgwWEbbGCaDuITa6j+//fYBkAj2uQOCvgxTQcYqfRyxtA5UCE163vkFa+c1G Fmbpiaway7M7UVT+zTuPEAt08l6Bdp+0nEJ/YyOOd9nGZeiMbIc5Fvko3whVVZzHYrDY Zf+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739969544; x=1740574344; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HRequyiks98F4TvQO/vmtwESixnPXuO1TfB2/aKs1TA=; b=L1knVZws6WmJ+dKG/mEM2TdmygUWUANsuStfFhzpbWEM5ODCNAoXreQNQrYl3Eyw6i HEXoqjQwiRbxXSu/9BhO7c5Fj2CukVMkKccOkMj4+hsWD8fbAssNxH3pAMO3uwTIikwb eacC04Q4v9LWb7j/0PMlexcr9NM8OTixMBpYnny7ine1bR4fZAQEz7q7+CLHX/cKUS3Q ivZK6jMBDHATVF+H47Tf8lE3Qpt8A5In1ebCzW1e6EHpC826y3PMN4eONlrnBv9Nyr2C Sxp6wTGimoia3oyEOMUufLUxb+T5//8evrqy0hGW04EFCkvlIO85zH/1grEwCQ1z40He nMoA== X-Forwarded-Encrypted: i=1; AJvYcCUYBBYvDoXQzsOpjJ2b0KGI4RsFBbErEsfDcW7v7fcGG0nHmB7s86iVfPv46SavK20weEUftT0Jo0QO@vger.kernel.org, AJvYcCUbT2/4Bnfn0n46fo2wPL/aQkZieUReQ1M+XrWEHypkMaNQl7xBdt2XYEBPoV5KidtXyFwCkpLwxpCN@vger.kernel.org, AJvYcCUds6RlnyvrQcltWnbFMiiWsUSfTicFMz1wexCRwhwtsFB6urOgfY4uM0/+tOM7g/8pS1Y5gqZkau3Fpg==@vger.kernel.org, AJvYcCUgL1o8xbjUKOatF2Pk7RkDy4FwLfT4m8ThJwjYfQ+CMLBKdxy9APkhE1gdcySZWUYI/SF7AGwpnjOXwlcYmty0@vger.kernel.org, AJvYcCVIQiFK0DShtd6Br6t/jgv2GBfBeHBsFtv7bloSp4Jyabl3WYZks/9GWMgiNG61yGxrYPlVyXXolMREqNTY@vger.kernel.org, AJvYcCWd74sf/8mPC4NRpWuKCrdZikU+fZgkFR/PVCIgzhTONZYQHNJiXohFZIkS0Bqg4pxXUj8=@vger.kernel.org, AJvYcCX8ASXmlI4P/ExrQuHqOhScTRHJepktNI6OkkvfAh0UU3qR595JWGj971Wf45JcNzl5Nsmc4ZWToteyXSAwjgg=@vger.kernel.org, AJvYcCX8BM3yxhSKb4bUO/ihAlNvNhFBzp+ZhCahVWAMy5xMCFm36ntuM/Gd4camEpsxVRL17q25ixQeOhIJOw==@vger.kernel.org X-Gm-Message-State: AOJu0YxLJ6PQk+f1sjekIzH8NY3GVjp+WLHDKm2K51gCSnBMjxftnuSD HGRI0q64MeaytVhRhrGD5/bn4TXOgxyVDKHt582Dq6TWp1y/iDY97VEbL3SWo+c= X-Gm-Gg: ASbGncuKt5MfL2vceU8WtlTDxVgphCFhjuwfsxayDf4znqIyHvOHorGsfAT5h5IlMrb khhZ/dvjFxLYAr7RSLJimD2qGQZDWE/xCj8bFqg69bRlhafIA8FaX5DoO1IovobPZktiqLQtbL+ MbMqTSW7PXh3WvYjwO6M8YguoT53ql0JcjMCEaWIB3TKnTuK0BukniCuTZ3pH+JoA1e/rLE/xcf HyvNyyBIbdnQqLYljtgdjyc7gXhFjYbPtbsQUeCc2GvXf0cDSlI6+PUUAse4WghbMCXlxjzM5uS qw087w== X-Google-Smtp-Source: AGHT+IHnb5v62m0BvDxfIowP9iMNtE/Y7pYhM/eIGIlagffbyppVP0uCqTnvfVFz3C1LICvyxAmpug== X-Received: by 2002:a17:902:e841:b0:21f:564:80a4 with SMTP id d9443c01a7336-221040a9a0emr294098225ad.33.1739969543796; Wed, 19 Feb 2025 04:52:23 -0800 (PST) Received: from ws.. ([103.167.140.11]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d536436fsm103427175ad.64.2025.02.19.04.52.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 04:52:23 -0800 (PST) From: Xiao Liang To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Kuniyuki Iwashima , Jakub Kicinski Cc: "David S. Miller" , David Ahern , Eric Dumazet , Paolo Abeni , Andrew Lunn , Simon Horman , Shuah Khan , Donald Hunter , Alexander Aring , Stefan Schmidt , Miquel Raynal , Steffen Klassert , Herbert Xu , linux-rdma@vger.kernel.org, linux-can@vger.kernel.org, osmocom-net-gprs@lists.osmocom.org, bpf@vger.kernel.org, linux-ppp@vger.kernel.org, wireguard@lists.zx2c4.com, linux-wireless@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org, bridge@lists.linux.dev, linux-wpan@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v10 10/13] rtnetlink: Remove "net" from newlink params Date: Wed, 19 Feb 2025 20:50:36 +0800 Message-ID: <20250219125039.18024-11-shaw.leon@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250219125039.18024-1-shaw.leon@gmail.com> References: <20250219125039.18024-1-shaw.leon@gmail.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Now that devices have been converted to use the specific netns instead of ambiguous "net", let's remove it from newlink parameters. Signed-off-by: Xiao Liang Reviewed-by: Kuniyuki Iwashima --- include/net/rtnetlink.h | 2 -- net/core/rtnetlink.c | 6 ------ 2 files changed, 8 deletions(-) diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index b22a106621fb..ec65a8cebb99 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h @@ -72,7 +72,6 @@ static inline int rtnl_msg_family(const struct nlmsghdr *nlh) /** * struct rtnl_newlink_params - parameters of rtnl_link_ops::newlink() * - * @net: Netns of interest * @src_net: Source netns of rtnetlink socket * @link_net: Link netns by IFLA_LINK_NETNSID, NULL if not specified * @peer_net: Peer netns @@ -80,7 +79,6 @@ static inline int rtnl_msg_family(const struct nlmsghdr *nlh) * @data: IFLA_INFO_DATA attributes */ struct rtnl_newlink_params { - struct net *net; struct net *src_net; struct net *link_net; struct net *peer_net; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9ebbde0d131c..e980481bdd28 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -3798,12 +3798,6 @@ static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm, dev->ifindex = ifm->ifi_index; - params.net = params.src_net; - if (link_net) - params.net = link_net; - if (peer_net) - params.net = peer_net; - if (ops->newlink) err = ops->newlink(dev, ¶ms, extack); else From patchwork Wed Feb 19 12:50:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Liang X-Patchwork-Id: 866576 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EB4A1E3DE7; Wed, 19 Feb 2025 12:52:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969565; cv=none; b=CVY9wtKrSm32R/M/dY6VriIGpiSOcAzbL70axbv9StasaEVR7XGagG5xbQzpIRD2+HW6vqI5eMDzgH1cHeEFod0cG/2hqfRggMRY24fx3poTCaqNSRADT8PB2h1sf1WwDl9wBQGdLEG6inhcSDK8Dw9Sz6/Gn1m2Fx2xoCa/Fbk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739969565; c=relaxed/simple; bh=d5YqzA1/hOIwxn+aPZBjNIWViPAXuH4DTCUtu2j0BLA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aIkDJDgNmBEOWl0Ypat5/TRHUh7QYmxPpMBa7tCJVu7K2OO2gWCAbka33iZznABQORJ/vy5n4TG7BDnGNE17pLuzFaS6QhpY+YlSTOQfSzBb/3f3hfIZjpwypP7Cx7yeMG7nhcgWaCK+UCH3e+TcHfZkm8QY6lKmJDwfe4Hn3rM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XRoOiMNE; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XRoOiMNE" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-2fcb6c42c47so1358452a91.1; Wed, 19 Feb 2025 04:52:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739969562; x=1740574362; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=h02RoEg/neSt/B+WrRVdIe6OiEkHR+ibxktqvHMDB4Y=; b=XRoOiMNEA5nlmQjsaluC8FmB83TRr12P3FH9/2uOpeg1O0xdxx+89DNwOViuJggJPw 67LOuu6KoHXBdizFr+mBEwE4j4r9J+aCVCJq9+MtAJ3QeVw7uw/IfPj9uDVeQZPMFw3m X3JwNUriD4UesMyl/gv70l9h2jw/s6uQ+v8i+oOTOQPzi3J4AIkvQbj6s3OXJDqU8/Ip WvaJHBgunrYMbKo9590Ti+WsFNK1VYb0YpwN/NiRYGAZ6wOgf62Y3SeMgBLU/EODJ+ww LJJfLHtspYbaKF3z24XiFeQzQjQXVoBkE+pEMNAZu9FKBAtJKbVkKOFW2Jus0/NHOHYU PNyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739969562; x=1740574362; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=h02RoEg/neSt/B+WrRVdIe6OiEkHR+ibxktqvHMDB4Y=; b=qxTTVaRciIyFxOLYJLBuX27dSDVRk9FguwrJXwxaY5UNWVoAAcub3ookwpdSWsBk4Q s4U+tP6NJOfbNh5Pdah5QpDMbyKErjyX2OnOUEcbT5Gigj//gHBiYJCsqWiWjfuzwpMH 2KEwonwpb6hquEtO2U/1PdXoluUnTQJjjLIq7dHnDvI5/8njGlE27Re9jtfQgaQvnq7d Z303oSqB10niKf5VUuCrFRxXbSeoPmrVw5iUcPVdKDWc2r3sEEDx5pzMwUngTGKzr1+c 0BM0hcXcGJbdHEjlCU9EiBmofSjhlAYcAwXcA7Ychb0KOFK4RKyQZOq1RIYk3vahNgm5 Nuuw== X-Forwarded-Encrypted: i=1; AJvYcCVHbnh4j2UJTE7NnfasZtuqjgTJTY17WmVSxq8s0zJQfPL+RJgdWbvtmDdpoqVAlNZJSkFhpToaMs97xA==@vger.kernel.org, AJvYcCW831ieJxjB68C26RqnP+xhYQIlPJBdqZQg6GP6QChDivhvRezDGUubcV4eP0w80ON6tpyLnT5AGkKFaQ==@vger.kernel.org, AJvYcCWC6D8tTjYzO8+hyqPpHLy189tvILJZ0fomh5c0nn7+oU4gylPcVSUX/ijTakkOD4J9DCRLGzRSit9T3aIG@vger.kernel.org, AJvYcCWu/uqwGbeLqQ+352HoAPZw6oZWQgM9FEN2Zy0xSAYHLKwxp3ieiQnoehWUUrbqw8ZXI8P5aq2yjMQA@vger.kernel.org, AJvYcCX0hyhFsDoVWeoAvUIgurfNG/2gyLsgKLtd+LtZWYnUGJOAFZKg4NBmVQZPee7lOMjOtok=@vger.kernel.org, AJvYcCX9FqNzgL7C+AxkMqiJPKbv8sLubiy4sRXQeWok5QkgwG/mWFGFFfeUpTFs00r77XJJjkbjeE9kkthn@vger.kernel.org, AJvYcCXY6ZwNOhwpRf8Sayq9COebHqI9CVgw8RRatz+qGjKKTftvJPj/2YFsAdtLXrFDe1xc9s7hdGaJeQCBwfZiTM8=@vger.kernel.org, AJvYcCXfnsfPTUuZqk8OK8z/irPrwA3xENfXW/XtRA+RjA3A7pFYImLhIkrAG6CvnnUtgUXCNtIjiVH+x5iSRMtpMved@vger.kernel.org X-Gm-Message-State: AOJu0YxGTyR1kKC/eIQK4OvYpAAI4w560/Y0G2PTJ4IfUP6H8V3YUHUu NeFK0LIqg4PZVFwKBSBDlze4eO3YqJ6BrufYb8AIX6LqxCz6aF6q/QHp8KNp X-Gm-Gg: ASbGnct6pPE++9k3dtjYeoKTxZfNc1C7DXi+YvgeikXDcM83aGCVc3F7hDyNzYHU33d qBMu+85LKDgy9tJHu2b2k/oDjQhRujQcUUC6Z8w8lD6hWi5lKmMdyfR/U14zKfh1F1WQkRPlI9g UZQEW6QSy82wkIqyjUKPf4vsebQJKSnnYVVNgao6FhqparN77oVmq9zANPJU2z1lITkOC9AFq6N 3r5TYBvDjY0GEHsmmq7Ehuyc8zB574PtSnjz+OOxzhpAlCi/yPS0RJjvSzlcI+2s9v81IAJlka8 TmI6Yw== X-Google-Smtp-Source: AGHT+IHPqeS3VaEOgvZ8Tx3PUVaGMIEIbKpPjORqTeM6yeMS+BbAs1PKrGLT5/zDq05f9NI0VnGgXw== X-Received: by 2002:a17:90b:2887:b0:2fa:1a23:c01d with SMTP id 98e67ed59e1d1-2fc40f26600mr24663034a91.21.1739969561721; Wed, 19 Feb 2025 04:52:41 -0800 (PST) Received: from ws.. ([103.167.140.11]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d536436fsm103427175ad.64.2025.02.19.04.52.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Feb 2025 04:52:41 -0800 (PST) From: Xiao Liang To: netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Kuniyuki Iwashima , Jakub Kicinski Cc: "David S. Miller" , David Ahern , Eric Dumazet , Paolo Abeni , Andrew Lunn , Simon Horman , Shuah Khan , Donald Hunter , Alexander Aring , Stefan Schmidt , Miquel Raynal , Steffen Klassert , Herbert Xu , linux-rdma@vger.kernel.org, linux-can@vger.kernel.org, osmocom-net-gprs@lists.osmocom.org, bpf@vger.kernel.org, linux-ppp@vger.kernel.org, wireguard@lists.zx2c4.com, linux-wireless@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org, bridge@lists.linux.dev, linux-wpan@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v10 12/13] selftests: net: Add python context manager for netns entering Date: Wed, 19 Feb 2025 20:50:38 +0800 Message-ID: <20250219125039.18024-13-shaw.leon@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250219125039.18024-1-shaw.leon@gmail.com> References: <20250219125039.18024-1-shaw.leon@gmail.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Change netns of current thread and switch back on context exit. For example: with NetNSEnter("ns1"): ip("link add dummy0 type dummy") The command be executed in netns "ns1". Signed-off-by: Xiao Liang --- tools/testing/selftests/net/lib/py/__init__.py | 2 +- tools/testing/selftests/net/lib/py/netns.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/lib/py/__init__.py b/tools/testing/selftests/net/lib/py/__init__.py index 729457859316..8697bd27dc30 100644 --- a/tools/testing/selftests/net/lib/py/__init__.py +++ b/tools/testing/selftests/net/lib/py/__init__.py @@ -2,7 +2,7 @@ from .consts import KSRC from .ksft import * -from .netns import NetNS +from .netns import NetNS, NetNSEnter from .nsim import * from .utils import * from .ynl import NlError, YnlFamily, EthtoolFamily, NetdevFamily, RtnlFamily, RtnlAddrFamily diff --git a/tools/testing/selftests/net/lib/py/netns.py b/tools/testing/selftests/net/lib/py/netns.py index ecff85f9074f..8e9317044eef 100644 --- a/tools/testing/selftests/net/lib/py/netns.py +++ b/tools/testing/selftests/net/lib/py/netns.py @@ -1,9 +1,12 @@ # SPDX-License-Identifier: GPL-2.0 from .utils import ip +import ctypes import random import string +libc = ctypes.cdll.LoadLibrary('libc.so.6') + class NetNS: def __init__(self, name=None): @@ -29,3 +32,18 @@ class NetNS: def __repr__(self): return f"NetNS({self.name})" + + +class NetNSEnter: + def __init__(self, ns_name): + self.ns_path = f"/run/netns/{ns_name}" + + def __enter__(self): + self.saved = open("/proc/thread-self/ns/net") + with open(self.ns_path) as ns_file: + libc.setns(ns_file.fileno(), 0) + return self + + def __exit__(self, exc_type, exc_value, traceback): + libc.setns(self.saved.fileno(), 0) + self.saved.close()