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>
        return -EMSGSIZE;
 }
 
-static int ipoib_changelink(struct net_device *dev,
-                           struct nlattr *tb[], struct nlattr *data[])
+static int ipoib_changelink(struct net_device *dev, struct nlattr *tb[],
+                           struct nlattr *data[],
+                           struct netlink_ext_ack *extack)
 {
        u16 mode, umcast;
        int ret = 0;
                               child_pkey, IPOIB_RTNL_CHILD);
 
        if (!err && data)
-               err = ipoib_changelink(dev, tb, data);
+               err = ipoib_changelink(dev, tb, data, extack);
        return err;
 }
 
 
        return 0;
 }
 
-static int bond_changelink(struct net_device *bond_dev,
-                          struct nlattr *tb[], struct nlattr *data[])
+static int bond_changelink(struct net_device *bond_dev, struct nlattr *tb[],
+                          struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        struct bonding *bond = netdev_priv(bond_dev);
        struct bond_opt_value newval;
 {
        int err;
 
-       err = bond_changelink(bond_dev, tb, data);
+       err = bond_changelink(bond_dev, tb, data, extack);
        if (err < 0)
                return err;
 
 
 }
 
 static int caif_hsi_changelink(struct net_device *dev, struct nlattr *tb[],
-                               struct nlattr *data[])
+                              struct nlattr *data[],
+                              struct netlink_ext_ack *extack)
 {
        cfhsi_netlink_parms(data, netdev_priv(dev));
        netdev_state_change(dev);
 
        return 0;
 }
 
-static int can_changelink(struct net_device *dev,
-                         struct nlattr *tb[], struct nlattr *data[])
+static int can_changelink(struct net_device *dev, struct nlattr *tb[],
+                         struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct can_priv *priv = netdev_priv(dev);
        int err;
 
 };
 
 static int ipvlan_nl_changelink(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 = ipvlan_port_get_rtnl(ipvlan->phy_dev);
 
 }
 
 static int macsec_changelink(struct net_device *dev, struct nlattr *tb[],
-                            struct nlattr *data[])
+                            struct nlattr *data[],
+                            struct netlink_ext_ack *extack)
 {
        if (!data)
                return 0;
 
 EXPORT_SYMBOL_GPL(macvlan_dellink);
 
 static int macvlan_changelink(struct net_device *dev,
-               struct nlattr *tb[], struct nlattr *data[])
+                             struct nlattr *tb[], struct nlattr *data[],
+                             struct netlink_ext_ack *extack)
 {
        struct macvlan_dev *vlan = netdev_priv(dev);
        enum macvlan_mode mode;
 
 }
 
 static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
-                           struct nlattr *data[])
+                           struct nlattr *data[],
+                           struct netlink_ext_ack *extack)
 {
        struct vxlan_dev *vxlan = netdev_priv(dev);
        struct vxlan_rdst *dst = &vxlan->default_dst;
 
                                           struct netlink_ext_ack *extack);
        int                     (*changelink)(struct net_device *dev,
                                              struct nlattr *tb[],
-                                             struct nlattr *data[]);
+                                             struct nlattr *data[],
+                                             struct netlink_ext_ack *extack);
        void                    (*dellink)(struct net_device *dev,
                                           struct list_head *head);
 
 
        return 0;
 }
 
-static int vlan_changelink(struct net_device *dev,
-                          struct nlattr *tb[], struct nlattr *data[])
+static int vlan_changelink(struct net_device *dev, struct nlattr *tb[],
+                          struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        struct ifla_vlan_flags *flags;
        struct ifla_vlan_qos_mapping *m;
        else if (dev->mtu > max_mtu)
                return -EINVAL;
 
-       err = vlan_changelink(dev, tb, data);
+       err = vlan_changelink(dev, tb, data, extack);
        if (err < 0)
                return err;
 
 
 };
 
 static int br_changelink(struct net_device *brdev, struct nlattr *tb[],
-                        struct nlattr *data[])
+                        struct nlattr *data[],
+                        struct netlink_ext_ack *extack)
 {
        struct net_bridge *br = netdev_priv(brdev);
        int err;
        if (err)
                return err;
 
-       err = br_changelink(dev, tb, data);
+       err = br_changelink(dev, tb, data, extack);
        if (err)
                unregister_netdevice(dev);
        return err;
 
 }
 
 static int ipcaif_changelink(struct net_device *dev, struct nlattr *tb[],
-                            struct nlattr *data[])
+                            struct nlattr *data[],
+                            struct netlink_ext_ack *extack)
 {
        struct chnl_net *caifdev;
        ASSERT_RTNL();
 
                                    !ops->changelink)
                                        return -EOPNOTSUPP;
 
-                               err = ops->changelink(dev, tb, data);
+                               err = ops->changelink(dev, tb, data, extack);
                                if (err < 0)
                                        return err;
                                status |= DO_SETLINK_NOTIFY;
 
 }
 
 static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
-                           struct nlattr *data[])
+                           struct nlattr *data[],
+                           struct netlink_ext_ack *extack)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_parm p;
 
 }
 
 static int vti_changelink(struct net_device *dev, struct nlattr *tb[],
-                         struct nlattr *data[])
+                         struct nlattr *data[],
+                         struct netlink_ext_ack *extack)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        __u32 fwmark = t->fwmark;
 
 }
 
 static int ipip_changelink(struct net_device *dev, struct nlattr *tb[],
-                          struct nlattr *data[])
+                          struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_parm p;
 
 }
 
 static int ip6gre_changelink(struct net_device *dev, struct nlattr *tb[],
-                           struct nlattr *data[])
+                            struct nlattr *data[],
+                            struct netlink_ext_ack *extack)
 {
        struct ip6_tnl *t, *nt = netdev_priv(dev);
        struct net *net = nt->net;
 
 }
 
 static int ip6_tnl_changelink(struct net_device *dev, struct nlattr *tb[],
-                             struct nlattr *data[])
+                             struct nlattr *data[],
+                             struct netlink_ext_ack *extack)
 {
        struct ip6_tnl *t = netdev_priv(dev);
        struct __ip6_tnl_parm p;
 
 }
 
 static int vti6_changelink(struct net_device *dev, struct nlattr *tb[],
-                          struct nlattr *data[])
+                          struct nlattr *data[],
+                          struct netlink_ext_ack *extack)
 {
        struct ip6_tnl *t;
        struct __ip6_tnl_parm p;
 
 }
 
 static int ipip6_changelink(struct net_device *dev, struct nlattr *tb[],
-                         struct nlattr *data[])
+                           struct nlattr *data[],
+                           struct netlink_ext_ack *extack)
 {
        struct ip_tunnel *t = netdev_priv(dev);
        struct ip_tunnel_parm p;