net: add netlink_ext_ack argument to rtnl_link_ops.validate
authorMatthias Schiffer <mschiffer@universe-factory.net>
Sun, 25 Jun 2017 21:56:01 +0000 (23:56 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Jun 2017 03:13:22 +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>
28 files changed:
drivers/net/bonding/bond_netlink.c
drivers/net/can/dev.c
drivers/net/dummy.c
drivers/net/geneve.c
drivers/net/gtp.c
drivers/net/ifb.c
drivers/net/ipvlan/ipvlan_main.c
drivers/net/macsec.c
drivers/net/macvlan.c
drivers/net/nlmon.c
drivers/net/ppp/ppp_generic.c
drivers/net/team/team.c
drivers/net/tun.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/core/rtnetlink.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 cb803c026f1f8122f983ae84777edb1426c20f93..0a9d78de61387e8ce7d86d4f4a61f43c78f1a998 100644 (file)
@@ -118,7 +118,8 @@ static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX + 1] = {
        [IFLA_BOND_SLAVE_QUEUE_ID]      = { .type = NLA_U16 },
 };
 
-static int bond_validate(struct nlattr *tb[], struct nlattr *data[])
+static int bond_validate(struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index 6d8191f2ad325cf6ed135a74395d4e66face9133..365a8cc6240506ed165bc9141daf15ab29018541 100644 (file)
@@ -848,7 +848,8 @@ static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = {
                                = { .len = sizeof(struct can_bittiming_const) },
 };
 
-static int can_validate(struct nlattr *tb[], struct nlattr *data[])
+static int can_validate(struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        bool is_can_fd = false;
 
index 9905b52fe293c221b1ae9852d72016191ebbadda..d0c165d2086eaf03cfe686e1c88e654269b58989 100644 (file)
@@ -356,7 +356,8 @@ static void dummy_setup(struct net_device *dev)
        dev->max_mtu = ETH_MAX_MTU;
 }
 
-static int dummy_validate(struct nlattr *tb[], struct nlattr *data[])
+static int dummy_validate(struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index 0a72d914e1f9c0b168010f9700bd137a24f53c2e..eb77201cb71836c33453c58362115461e937e9dd 100644 (file)
@@ -1058,7 +1058,8 @@ static const struct nla_policy geneve_policy[IFLA_GENEVE_MAX + 1] = {
        [IFLA_GENEVE_UDP_ZERO_CSUM6_RX] = { .type = NLA_U8 },
 };
 
-static int geneve_validate(struct nlattr *tb[], struct nlattr *data[])
+static int geneve_validate(struct nlattr *tb[], struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index 9cfe8a24c1fc593db26669b3cfb67f539f6c9eba..1542e837fdfa777e96155f041bc6d2072946d0cc 100644 (file)
@@ -698,7 +698,8 @@ static const struct nla_policy gtp_policy[IFLA_GTP_MAX + 1] = {
        [IFLA_GTP_ROLE]                 = { .type = NLA_U32 },
 };
 
-static int gtp_validate(struct nlattr *tb[], struct nlattr *data[])
+static int gtp_validate(struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        if (!data)
                return -EINVAL;
index 144ea5ae8ab4abda588cb6b23292c9f3ccf06c9c..8870bd2a2e8a2439c4a0618506375db6b9b4f653 100644 (file)
@@ -273,7 +273,8 @@ static int ifb_open(struct net_device *dev)
        return 0;
 }
 
-static int ifb_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ifb_validate(struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index e7d54072d7b330d67217a37db9eb95e665c3b85d..f37e3c1fd4e73f27e46564a6ef2739ff658523df 100644 (file)
@@ -477,7 +477,8 @@ static size_t ipvlan_nl_getsize(const struct net_device *dev)
                );
 }
 
-static int ipvlan_nl_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ipvlan_nl_validate(struct nlattr *tb[], struct nlattr *data[],
+                             struct netlink_ext_ack *extack)
 {
        if (data && data[IFLA_IPVLAN_MODE]) {
                u16 mode = nla_get_u16(data[IFLA_IPVLAN_MODE]);
index 38ba3d73ac1502323b0a9b4caef80d465288485a..5e1ab11608560799bb6d956b213d06f58b8fc45e 100644 (file)
@@ -3287,7 +3287,8 @@ unregister:
        return err;
 }
 
-static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[])
+static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[],
+                               struct netlink_ext_ack *extack)
 {
        u64 csid = MACSEC_DEFAULT_CIPHER_ID;
        u8 icv_len = DEFAULT_ICV_LEN;
index 3064416578a9ab5bd07ed1cefc499ca25032d350..9ffff0362a11ceff45ad040c95c0b6a931ef44c1 100644 (file)
@@ -1162,7 +1162,8 @@ static void macvlan_port_destroy(struct net_device *dev)
        kfree(port);
 }
 
-static int macvlan_validate(struct nlattr *tb[], struct nlattr *data[])
+static int macvlan_validate(struct nlattr *tb[], struct nlattr *data[],
+                           struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index c4b3362da4a2e33184b02dff0df3082b4d7e45e4..4b22955de1918f13923a4ab4ba584d8de7981308 100644 (file)
@@ -127,7 +127,8 @@ static void nlmon_setup(struct net_device *dev)
        dev->min_mtu = sizeof(struct nlmsghdr);
 }
 
-static int nlmon_validate(struct nlattr *tb[], struct nlattr *data[])
+static int nlmon_validate(struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS])
                return -EINVAL;
index 8479c130fe2ecef1b54c54cd67c7b77504e61e74..13028833bee39e26641976dacb879b8ddf34c7a8 100644 (file)
@@ -1061,7 +1061,8 @@ static const struct nla_policy ppp_nl_policy[IFLA_PPP_MAX + 1] = {
        [IFLA_PPP_DEV_FD]       = { .type = NLA_S32 },
 };
 
-static int ppp_nl_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ppp_nl_validate(struct nlattr *tb[], struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        if (!data)
                return -EINVAL;
index bbe97bb7c9cc5bf21ee4baadd87bcda0940cdaee..4645704097963ca2b57bd90642171f6dfb8c892a 100644 (file)
@@ -2110,7 +2110,8 @@ static int team_newlink(struct net *src_net, struct net_device *dev,
        return register_netdevice(dev);
 }
 
-static int team_validate(struct nlattr *tb[], struct nlattr *data[])
+static int team_validate(struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index ae49f4b99b67d809a384a939fc66ffb5863c5e99..3d4c24572ecdcda8ffdd47070ce75dcb625441da 100644 (file)
@@ -1580,7 +1580,8 @@ static void tun_setup(struct net_device *dev)
 /* Trivial set of netlink ops to allow deleting tun or tap
  * device with netlink.
  */
-static int tun_validate(struct nlattr *tb[], struct nlattr *data[])
+static int tun_validate(struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        return -EINVAL;
 }
index 3db907cb7d07284a040f2344f056812e83cf9afd..b33553b1e19cd9c89bcaf5817a4cb08d54e5c434 100644 (file)
@@ -329,7 +329,8 @@ static void veth_setup(struct net_device *dev)
  * netlink interface
  */
 
-static int veth_validate(struct nlattr *tb[], struct nlattr *data[])
+static int veth_validate(struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
@@ -374,7 +375,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
                if (err < 0)
                        return err;
 
-               err = veth_validate(peer_tb, NULL);
+               err = veth_validate(peer_tb, NULL, extack);
                if (err < 0)
                        return err;
 
index 762f4d033e1b20e07d4f74ffd403d5e70cbb74d5..f4d0054981c63a5d0a6540c1fc1d40c3096ad726 100644 (file)
@@ -1372,7 +1372,8 @@ static void vrf_setup(struct net_device *dev)
        dev->priv_flags |= IFF_NO_QUEUE;
 }
 
-static int vrf_validate(struct nlattr *tb[], struct nlattr *data[])
+static int vrf_validate(struct nlattr *tb[], struct nlattr *data[],
+                       struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index 60c40349e73e53faa8f9881b16236109d2afd9af..0dafd8e6c6658820c8be6b16cbf75283805898d4 100644 (file)
@@ -2711,7 +2711,8 @@ static const struct nla_policy vxlan_policy[IFLA_VXLAN_MAX + 1] = {
        [IFLA_VXLAN_REMCSUM_NOPARTIAL]  = { .type = NLA_FLAG },
 };
 
-static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[])
+static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) {
index f7d0320f75b09478860d7b381863a0a61361bc45..11fe0ad60e43347ab665c1e219619abc96779b87 100644 (file)
@@ -63,7 +63,8 @@ struct rtnl_link_ops {
        int                     maxtype;
        const struct nla_policy *policy;
        int                     (*validate)(struct nlattr *tb[],
-                                           struct nlattr *data[]);
+                                           struct nlattr *data[],
+                                           struct netlink_ext_ack *extack);
 
        int                     (*newlink)(struct net *src_net,
                                           struct net_device *dev,
index f08b5e192e45f9251fae8855e629723340d9d1f6..5e831de3103e2f7092c7fa15534def403bc62fb4 100644 (file)
@@ -39,7 +39,8 @@ static inline int vlan_validate_qos_map(struct nlattr *attr)
                                   NULL);
 }
 
-static int vlan_validate(struct nlattr *tb[], struct nlattr *data[])
+static int vlan_validate(struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        struct ifla_vlan_flags *flags;
        u16 id;
index 37e4ec2953b2dd75c54d6caa62a3ad21f4b4439d..9af177ca4d318933abc9a43ae33e848b873b21aa 100644 (file)
@@ -858,7 +858,9 @@ int br_dellink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)
 
        return err;
 }
-static int br_validate(struct nlattr *tb[], struct nlattr *data[])
+
+static int br_validate(struct nlattr *tb[], struct nlattr *data[],
+                      struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
index bac81d1bb24d125a367b9f41c0f9fef4986d19d1..7136588e65e98974098ba1f3438cc846ad9a50aa 100644 (file)
@@ -2582,7 +2582,7 @@ replay:
                                data = attr;
                        }
                        if (ops->validate) {
-                               err = ops->validate(tb, data);
+                               err = ops->validate(tb, data, extack);
                                if (err < 0)
                                        return err;
                        }
index 1a4c585f3950b4be088901f7d842f9b9fdc61598..de2661cd0328500414c652af202a8928bd9ad89c 100644 (file)
@@ -111,7 +111,8 @@ static void lowpan_setup(struct net_device *ldev)
        ldev->features          |= NETIF_F_NETNS_LOCAL;
 }
 
-static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[])
+static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        if (tb[IFLA_ADDRESS]) {
                if (nla_len(tb[IFLA_ADDRESS]) != IEEE802154_ADDR_LEN)
index a63985c4bec71ed0dfa34407c2009314a73cf02a..7a7829e839c24ee624a046079f25545e035d5bc7 100644 (file)
@@ -779,7 +779,8 @@ static struct pernet_operations ipgre_net_ops = {
        .size = sizeof(struct ip_tunnel_net),
 };
 
-static int ipgre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ipgre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[],
+                                struct netlink_ext_ack *extack)
 {
        __be16 flags;
 
@@ -802,7 +803,8 @@ static int ipgre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[])
        return 0;
 }
 
-static int ipgre_tap_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ipgre_tap_validate(struct nlattr *tb[], struct nlattr *data[],
+                             struct netlink_ext_ack *extack)
 {
        __be32 daddr;
 
@@ -823,7 +825,7 @@ static int ipgre_tap_validate(struct nlattr *tb[], struct nlattr *data[])
        }
 
 out:
-       return ipgre_tunnel_validate(tb, data);
+       return ipgre_tunnel_validate(tb, data, extack);
 }
 
 static int ipgre_netlink_parms(struct net_device *dev,
index 24acff67a4f240d6a8a8424df7c8763337e7e143..0192c255e5088394792cb55b416c46e39b5839fd 100644 (file)
@@ -465,7 +465,8 @@ static struct pernet_operations vti_net_ops = {
        .size = sizeof(struct ip_tunnel_net),
 };
 
-static int vti_tunnel_validate(struct nlattr *tb[], struct nlattr *data[])
+static int vti_tunnel_validate(struct nlattr *tb[], struct nlattr *data[],
+                              struct netlink_ext_ack *extack)
 {
        return 0;
 }
index eb7fe7b0046f8fd45d5f709d96f46b1531c6992f..fb1ad22b5e292d5669c70b5640ad3207c353c6bb 100644 (file)
@@ -375,7 +375,8 @@ static int ipip_tunnel_init(struct net_device *dev)
        return ip_tunnel_init(dev);
 }
 
-static int ipip_tunnel_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ipip_tunnel_validate(struct nlattr *tb[], struct nlattr *data[],
+                               struct netlink_ext_ack *extack)
 {
        u8 proto;
 
index 7232b28425f3171afe54af316c169e99fd9be2dc..67ff2aaf5dcbbe9f64482e2a251f061be8007770 100644 (file)
@@ -1170,7 +1170,8 @@ static struct pernet_operations ip6gre_net_ops = {
        .size = sizeof(struct ip6gre_net),
 };
 
-static int ip6gre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ip6gre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[],
+                                 struct netlink_ext_ack *extack)
 {
        __be16 flags;
 
@@ -1188,7 +1189,8 @@ static int ip6gre_tunnel_validate(struct nlattr *tb[], struct nlattr *data[])
        return 0;
 }
 
-static int ip6gre_tap_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ip6gre_tap_validate(struct nlattr *tb[], struct nlattr *data[],
+                              struct netlink_ext_ack *extack)
 {
        struct in6_addr daddr;
 
@@ -1209,7 +1211,7 @@ static int ip6gre_tap_validate(struct nlattr *tb[], struct nlattr *data[])
        }
 
 out:
-       return ip6gre_tunnel_validate(tb, data);
+       return ip6gre_tunnel_validate(tb, data, extack);
 }
 
 
index d9f60a173107c76361ed21ae93cd7e2964b5703f..3a0ba2ae4b0f69659638b3e5521dcf9d4393dc75 100644 (file)
@@ -1885,7 +1885,8 @@ static int __net_init ip6_fb_tnl_dev_init(struct net_device *dev)
        return 0;
 }
 
-static int ip6_tnl_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ip6_tnl_validate(struct nlattr *tb[], struct nlattr *data[],
+                           struct netlink_ext_ack *extack)
 {
        u8 proto;
 
index 2afdddb48e69562c3b39154c6ab48e0660906e32..486c2305f53c258c1c68b6f04ba54c17bdcf7820 100644 (file)
@@ -907,7 +907,8 @@ static int __net_init vti6_fb_tnl_dev_init(struct net_device *dev)
        return 0;
 }
 
-static int vti6_validate(struct nlattr *tb[], struct nlattr *data[])
+static int vti6_validate(struct nlattr *tb[], struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        return 0;
 }
index b8000429f78dbc916e929192d5f93333c342f9d5..e9958b1398cb9edb54078c88bac2c921c79b3edd 100644 (file)
@@ -1406,7 +1406,8 @@ static void __net_init ipip6_fb_tunnel_init(struct net_device *dev)
        rcu_assign_pointer(sitn->tunnels_wc[0], tunnel);
 }
 
-static int ipip6_validate(struct nlattr *tb[], struct nlattr *data[])
+static int ipip6_validate(struct nlattr *tb[], struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        u8 proto;