net: add netlink_ext_ack argument to rtnl_link_ops.newlink
authorMatthias Schiffer <mschiffer@universe-factory.net>
Sun, 25 Jun 2017 21:55:59 +0000 (23:55 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Jun 2017 03:13:21 +0000 (23:13 -0400)
Add support for extended error reporting.

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
Acked-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
32 files changed:
drivers/infiniband/ulp/ipoib/ipoib_netlink.c
drivers/net/bonding/bond_netlink.c
drivers/net/caif/caif_hsi.c
drivers/net/can/dev.c
drivers/net/can/vxcan.c
drivers/net/geneve.c
drivers/net/gtp.c
drivers/net/ipvlan/ipvlan.h
drivers/net/ipvlan/ipvlan_main.c
drivers/net/ipvlan/ipvtap.c
drivers/net/macsec.c
drivers/net/macvlan.c
drivers/net/macvtap.c
drivers/net/ppp/ppp_generic.c
drivers/net/team/team.c
drivers/net/veth.c
drivers/net/vrf.c
drivers/net/vxlan.c
include/net/rtnetlink.h
net/8021q/vlan_netlink.c
net/bridge/br_netlink.c
net/caif/chnl_net.c
net/core/rtnetlink.c
net/hsr/hsr_netlink.c
net/ieee802154/6lowpan/core.c
net/ipv4/ip_gre.c
net/ipv4/ip_vti.c
net/ipv4/ipip.c
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c
net/ipv6/ip6_vti.c
net/ipv6/sit.c

index 2888478..8b75f80 100644 (file)
@@ -93,7 +93,8 @@ out_err:
 }
 
 static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,
-                              struct nlattr *tb[], struct nlattr *data[])
+                               struct nlattr *tb[], struct nlattr *data[],
+                               struct netlink_ext_ack *extack)
 {
        struct net_device *pdev;
        struct ipoib_dev_priv *ppriv;
index 47a8103..f817fb8 100644 (file)
@@ -438,7 +438,8 @@ static int bond_changelink(struct net_device *bond_dev,
 }
 
 static int bond_newlink(struct net *src_net, struct net_device *bond_dev,
-                       struct nlattr *tb[], struct nlattr *data[])
+                       struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        int err;
 
index 11ba6e3..ed4723a 100644 (file)
@@ -1399,7 +1399,8 @@ static int caif_hsi_fill_info(struct sk_buff *skb, const struct net_device *dev)
 }
 
 static int caif_hsi_newlink(struct net *src_net, struct net_device *dev,
-                         struct nlattr *tb[], struct nlattr *data[])
+                           struct nlattr *tb[], struct nlattr *data[],
+                           struct netlink_ext_ack *extack)
 {
        struct cfhsi *cfhsi = NULL;
        struct cfhsi_ops *(*get_ops)(void);
index a3011c0..7f99e8a 100644 (file)
@@ -1146,7 +1146,8 @@ nla_put_failure:
 }
 
 static int can_newlink(struct net *src_net, struct net_device *dev,
-                      struct nlattr *tb[], struct nlattr *data[])
+                      struct nlattr *tb[], struct nlattr *data[],
+                      struct netlink_ext_ack *extack)
 {
        return -EOPNOTSUPP;
 }
index cfe889e..8404e88 100644 (file)
@@ -163,7 +163,8 @@ static void vxcan_setup(struct net_device *dev)
 static struct rtnl_link_ops vxcan_link_ops;
 
 static int vxcan_newlink(struct net *net, struct net_device *dev,
-                        struct nlattr *tb[], struct nlattr *data[])
+                        struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        struct vxcan_priv *priv;
        struct net_device *peer;
index d586ad9..0a72d91 100644 (file)
@@ -1181,7 +1181,8 @@ static void init_tnl_info(struct ip_tunnel_info *info, __u16 dst_port)
 }
 
 static int geneve_newlink(struct net *net, struct net_device *dev,
-                         struct nlattr *tb[], struct nlattr *data[])
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        bool use_udp6_rx_checksums = false;
        struct ip_tunnel_info info;
index 8e333a8..9cfe8a2 100644 (file)
@@ -636,7 +636,8 @@ static void gtp_hashtable_free(struct gtp_dev *gtp);
 static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]);
 
 static int gtp_newlink(struct net *src_net, struct net_device *dev,
-                       struct nlattr *tb[], struct nlattr *data[])
+                      struct nlattr *tb[], struct nlattr *data[],
+                      struct netlink_ext_ack *extack)
 {
        struct gtp_dev *gtp;
        struct gtp_net *gn;
index 7919369..ba8173a 100644 (file)
@@ -140,7 +140,8 @@ unsigned int ipvlan_nf_input(void *priv, struct sk_buff *skb,
 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[]);
+                   struct nlattr *tb[], struct nlattr *data[],
+                   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);
 int ipvlan_link_register(struct rtnl_link_ops *ops);
index dc888dd..7bda5f6 100644 (file)
@@ -508,7 +508,8 @@ err:
 }
 
 int ipvlan_link_new(struct net *src_net, struct net_device *dev,
-                   struct nlattr *tb[], struct nlattr *data[])
+                   struct nlattr *tb[], struct nlattr *data[],
+                   struct netlink_ext_ack *extack)
 {
        struct ipvl_dev *ipvlan = netdev_priv(dev);
        struct ipvl_port *port;
index 2b713b6..22f133e 100644 (file)
@@ -73,10 +73,9 @@ 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 *src_net, struct net_device *dev,
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct ipvtap_dev *vlantap = netdev_priv(dev);
        int err;
@@ -98,7 +97,7 @@ static int ipvtap_newlink(struct net *src_net,
        /* 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);
+       err =  ipvlan_link_new(src_net, dev, tb, data, extack);
        if (err) {
                netdev_rx_handler_unregister(dev);
                return err;
index e370d7c..60f3e30 100644 (file)
@@ -3203,7 +3203,8 @@ static int macsec_add_dev(struct net_device *dev, sci_t sci, u8 icv_len)
 }
 
 static int macsec_newlink(struct net *net, struct net_device *dev,
-                         struct nlattr *tb[], struct nlattr *data[])
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct macsec_dev *macsec = macsec_priv(dev);
        struct net_device *real_dev;
index 8ca274c..526d23d 100644 (file)
@@ -1390,7 +1390,8 @@ destroy_macvlan_port:
 EXPORT_SYMBOL_GPL(macvlan_common_newlink);
 
 static int macvlan_newlink(struct net *src_net, struct net_device *dev,
-                          struct nlattr *tb[], struct nlattr *data[])
+                          struct nlattr *tb[], struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        return macvlan_common_newlink(src_net, dev, tb, data);
 }
index da85057..91e7b19 100644 (file)
@@ -77,10 +77,9 @@ 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 *src_net, struct net_device *dev,
+                          struct nlattr *tb[], struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        struct macvtap_dev *vlantap = netdev_priv(dev);
        int err;
index d42091f..8479c13 100644 (file)
@@ -1075,7 +1075,8 @@ static int ppp_nl_validate(struct nlattr *tb[], struct nlattr *data[])
 }
 
 static int ppp_nl_newlink(struct net *src_net, struct net_device *dev,
-                         struct nlattr *tb[], struct nlattr *data[])
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct ppp_config conf = {
                .unit = -1,
index 629a412..bbe97bb 100644 (file)
@@ -2101,7 +2101,8 @@ static void team_setup(struct net_device *dev)
 }
 
 static int team_newlink(struct net *src_net, struct net_device *dev,
-                       struct nlattr *tb[], struct nlattr *data[])
+                       struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS] == NULL)
                eth_hw_addr_random(dev);
index 0156fe8..3db907c 100644 (file)
@@ -347,7 +347,8 @@ static int veth_validate(struct nlattr *tb[], struct nlattr *data[])
 static struct rtnl_link_ops veth_link_ops;
 
 static int veth_newlink(struct net *src_net, struct net_device *dev,
-                        struct nlattr *tb[], struct nlattr *data[])
+                       struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        int err;
        struct net_device *peer;
index 997ef25..762f4d0 100644 (file)
@@ -1389,7 +1389,8 @@ static void vrf_dellink(struct net_device *dev, struct list_head *head)
 }
 
 static int vrf_newlink(struct net *src_net, struct net_device *dev,
-                      struct nlattr *tb[], struct nlattr *data[])
+                      struct nlattr *tb[], struct nlattr *data[],
+                      struct netlink_ext_ack *extack)
 {
        struct net_vrf *vrf = netdev_priv(dev);
        bool *add_fib_rules;
index 653b2bb..50a2087 100644 (file)
@@ -3333,7 +3333,8 @@ static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[],
 }
 
 static int vxlan_newlink(struct net *src_net, struct net_device *dev,
-                        struct nlattr *tb[], struct nlattr *data[])
+                        struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        struct vxlan_config conf;
        int err;
index 78fa5fe..33332a1 100644 (file)
@@ -68,7 +68,8 @@ struct rtnl_link_ops {
        int                     (*newlink)(struct net *src_net,
                                           struct net_device *dev,
                                           struct nlattr *tb[],
-                                          struct nlattr *data[]);
+                                          struct nlattr *data[],
+                                          struct netlink_ext_ack *extack);
        int                     (*changelink)(struct net_device *dev,
                                              struct nlattr *tb[],
                                              struct nlattr *data[]);
index 9c94aad..11b74e2 100644 (file)
@@ -115,7 +115,8 @@ static int vlan_changelink(struct net_device *dev,
 }
 
 static int vlan_newlink(struct net *src_net, struct net_device *dev,
-                       struct nlattr *tb[], struct nlattr *data[])
+                       struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
        struct net_device *real_dev;
index 63dca34..39c1fa1 100644 (file)
@@ -1213,7 +1213,8 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[],
 }
 
 static int br_dev_newlink(struct net *src_net, struct net_device *dev,
-                         struct nlattr *tb[], struct nlattr *data[])
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct net_bridge *br = netdev_priv(dev);
        int err;
index fe3c53e..3ad833c 100644 (file)
@@ -461,7 +461,8 @@ 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[])
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        int ret;
        struct chnl_net *caifdev;
index 9a1bd51..8b3faa0 100644 (file)
@@ -2705,7 +2705,8 @@ replay:
                dev->ifindex = ifm->ifi_index;
 
                if (ops->newlink) {
-                       err = ops->newlink(link_net ? : net, dev, tb, data);
+                       err = ops->newlink(link_net ? : net, dev, tb, data,
+                                          extack);
                        /* Drivers should call free_netdev() in ->destructor
                         * and unregister it on failure after registration
                         * so that device could be finally freed in rtnl_unlock.
index 81dac16..b9cce0f 100644 (file)
@@ -33,7 +33,8 @@ static const struct nla_policy hsr_policy[IFLA_HSR_MAX + 1] = {
  * 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[])
+                      struct nlattr *tb[], struct nlattr *data[],
+                      struct netlink_ext_ack *extack)
 {
        struct net_device *link[2];
        unsigned char multicast_spec, hsr_version;
index 0a866f3..1a4c585 100644 (file)
@@ -121,7 +121,8 @@ static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[])
 }
 
 static int lowpan_newlink(struct net *src_net, struct net_device *ldev,
-                         struct nlattr *tb[], struct nlattr *data[])
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct net_device *wdev;
        int ret;
index 41394a4..989f29f 100644 (file)
@@ -957,7 +957,8 @@ static void ipgre_tap_setup(struct net_device *dev)
 }
 
 static int ipgre_newlink(struct net *src_net, struct net_device *dev,
-                        struct nlattr *tb[], struct nlattr *data[])
+                        struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        struct ip_tunnel_parm p;
        struct ip_tunnel_encap ipencap;
@@ -1155,7 +1156,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);
+       err = ipgre_newlink(net, dev, tb, NULL, NULL);
        if (err < 0) {
                free_netdev(dev);
                return ERR_PTR(err);
index 4ec9aff..d748c50 100644 (file)
@@ -503,7 +503,8 @@ static void vti_netlink_parms(struct nlattr *data[],
 }
 
 static int vti_newlink(struct net *src_net, struct net_device *dev,
-                      struct nlattr *tb[], struct nlattr *data[])
+                      struct nlattr *tb[], struct nlattr *data[],
+                      struct netlink_ext_ack *extack)
 {
        struct ip_tunnel_parm parms;
        __u32 fwmark = 0;
index 1e441c6..5113206 100644 (file)
@@ -469,7 +469,8 @@ static bool ipip_netlink_encap_parms(struct nlattr *data[],
 }
 
 static int ipip_newlink(struct net *src_net, struct net_device *dev,
-                       struct nlattr *tb[], struct nlattr *data[])
+                       struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_parm p;
index e0e726c..f7c949d 100644 (file)
@@ -1342,7 +1342,8 @@ static bool ip6gre_netlink_encap_parms(struct nlattr *data[],
 }
 
 static int ip6gre_newlink(struct net *src_net, struct net_device *dev,
-       struct nlattr *tb[], struct nlattr *data[])
+                         struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct ip6_tnl *nt;
        struct net *net = dev_net(dev);
index 8c6c3c8..ca12b2e 100644 (file)
@@ -1974,7 +1974,8 @@ static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],
 }
 
 static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev,
-                          struct nlattr *tb[], struct nlattr *data[])
+                          struct nlattr *tb[], struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        struct net *net = dev_net(dev);
        struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
index 837ea1e..736a4f3 100644 (file)
@@ -940,7 +940,8 @@ static void vti6_netlink_parms(struct nlattr *data[],
 }
 
 static int vti6_newlink(struct net *src_net, struct net_device *dev,
-                       struct nlattr *tb[], struct nlattr *data[])
+                       struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        struct net *net = dev_net(dev);
        struct ip6_tnl *nt;
index 2378503..f7445fd 100644 (file)
@@ -1537,7 +1537,8 @@ 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[])
+                        struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        struct net *net = dev_net(dev);
        struct ip_tunnel *nt;