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;
 
        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;
 
        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;
 
 
        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);
 
        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;
 
 /* 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;
 
 
        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;
 
        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,
 
 #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;
 
 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);
 
        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;
 
        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);
        /* 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;
 
 
 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;
 
        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;
 }
 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)
 
        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);
        /* 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;
 
 
 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;
        struct netkit *nk;
        int err;
 
+       tbp = tb;
        if (data) {
                if (data[IFLA_NETKIT_MODE])
                        mode = nla_get_u32(data[IFLA_NETKIT_MODE]);
 
        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;
 
 
        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,
 
        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);
 
 
        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;
 
        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;
 
        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;
 
 
        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);
 
 }
 
 /* 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])
 
        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);
 
 {
        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;
        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;
        }
 
 
 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);
 
                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
  *
                                            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[],
 
        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;
 
 
 /**
  * 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;
 
 
        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);
 
        }
 }
 
-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();
 
                               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];
 
        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) {
 
 /* 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;
 
        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;
 
 
        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;
        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;
 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);
        int err;
 
        memset(&tb, 0, sizeof(tb));
+       params.tb = tb;
 
        dev = rtnl_create_link(net, name, name_assign_type,
                               &ipgre_tap_ops, tb, NULL);
        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);
 
                *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);
 
                *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;
 
        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;
        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;
 
                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;
 
                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;
 
 
 }
 #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;
 
                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;