Arnd Bergmann wrote: > @@ -600,6 +594,18 @@ static int macvlan_validate(struct nlattr *tb[], struct nlattr *data[]) > if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) > return -EADDRNOTAVAIL; > } > + > + if (data && data[IFLA_MACVLAN_MODE]) { > + u32 mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); > + switch (mode) { > + case MACVLAN_MODE_PRIVATE: > + case MACVLAN_MODE_VEPA: > + case MACVLAN_MODE_BRIDGE: > + break; > + default: > + return -EINVAL; EINVAL is quite unspecific. In this case I think EOPNOTSUPP would be fine and provide more information. > + } > + } > return 0; > } > @@ -664,6 +670,13 @@ static int macvlan_newlink(struct net *src_net, struct net_device *dev, > vlan->dev = dev; > vlan->port = port; > > + vlan->mode = MACVLAN_MODE_VEPA; > + if (data && data[IFLA_MACVLAN_MODE]) { > + u32 mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); > + > + vlan->mode = mode; This looks a bit strange, like cut-and-paste without reformatting :) I'd suggest to simply use "vlan->mode = nla_get_u32(...)". > + } > + > err = register_netdevice(dev); > if (err < 0) > return err; > @@ -685,6 +698,39 @@ static void macvlan_dellink(struct net_device *dev, struct list_head *head) > macvlan_port_destroy(port->dev); > } > > +static int macvlan_changelink(struct net_device *dev, > + struct nlattr *tb[], struct nlattr *data[]) > +{ > + struct macvlan_dev *vlan = netdev_priv(dev); > + if (data && data[IFLA_MACVLAN_MODE]) { > + u32 mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); > + vlan->mode = mode; Same here. > + } > + > + return 0; > +} _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/virtualization