Re: [PATCH net-next] vlan: implement vlan id and protocol changes

2018-06-10 Thread kbuild test robot
Hi Charles,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]

url:
https://github.com/0day-ci/linux/commits/Chas-Williams/vlan-implement-vlan-id-and-protocol-changes/20180611-072123
config: parisc-c3000_defconfig (attached as .config)
compiler: hppa-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=parisc 

All warnings (new ones prefixed by >>):

   net/core/dev.c: In function 'netdev_cmd_to_name':
>> net/core/dev.c:1580:2: warning: enumeration value 'NETDEV_CHANGEVLAN' not 
>> handled in switch [-Wswitch]
 switch (cmd) {
 ^~

vim +/NETDEV_CHANGEVLAN +1580 net/core/dev.c

56f5aa77 Michael Chan 2017-12-16  1574  
ede2762d Kirill Tkhai 2018-03-23  1575  const char *netdev_cmd_to_name(enum 
netdev_cmd cmd)
ede2762d Kirill Tkhai 2018-03-23  1576  {
ede2762d Kirill Tkhai 2018-03-23  1577  #define N(val)  
\
ede2762d Kirill Tkhai 2018-03-23  1578  case NETDEV_##val:  
\
ede2762d Kirill Tkhai 2018-03-23  1579  return "NETDEV_" 
__stringify(val);
ede2762d Kirill Tkhai 2018-03-23 @1580  switch (cmd) {
ede2762d Kirill Tkhai 2018-03-23  1581  N(UP) N(DOWN) N(REBOOT) 
N(CHANGE) N(REGISTER) N(UNREGISTER)
ede2762d Kirill Tkhai 2018-03-23  1582  N(CHANGEMTU) N(CHANGEADDR) 
N(GOING_DOWN) N(CHANGENAME) N(FEAT_CHANGE)
ede2762d Kirill Tkhai 2018-03-23  1583  N(BONDING_FAILOVER) N(PRE_UP) 
N(PRE_TYPE_CHANGE) N(POST_TYPE_CHANGE)
ede2762d Kirill Tkhai 2018-03-23  1584  N(POST_INIT) N(RELEASE) 
N(NOTIFY_PEERS) N(JOIN) N(CHANGEUPPER)
ede2762d Kirill Tkhai 2018-03-23  1585  N(RESEND_IGMP) N(PRECHANGEMTU) 
N(CHANGEINFODATA) N(BONDING_INFO)
ede2762d Kirill Tkhai 2018-03-23  1586  N(PRECHANGEUPPER) 
N(CHANGELOWERSTATE) N(UDP_TUNNEL_PUSH_INFO)
ede2762d Kirill Tkhai 2018-03-23  1587  N(UDP_TUNNEL_DROP_INFO) 
N(CHANGE_TX_QUEUE_LEN)
9daae9bd Gal Pressman 2018-03-28  1588  N(CVLAN_FILTER_PUSH_INFO) 
N(CVLAN_FILTER_DROP_INFO)
9daae9bd Gal Pressman 2018-03-28  1589  N(SVLAN_FILTER_PUSH_INFO) 
N(SVLAN_FILTER_DROP_INFO)
3f5ecd8a Kirill Tkhai 2018-04-26  1590  }
ede2762d Kirill Tkhai 2018-03-23  1591  #undef N
ede2762d Kirill Tkhai 2018-03-23  1592  return "UNKNOWN_NETDEV_EVENT";
ede2762d Kirill Tkhai 2018-03-23  1593  }
ede2762d Kirill Tkhai 2018-03-23  1594  EXPORT_SYMBOL_GPL(netdev_cmd_to_name);
ede2762d Kirill Tkhai 2018-03-23  1595  

:: The code at line 1580 was first introduced by commit
:: ede2762d93ff16e0974f7446516b46b1022db213 net: Make NETDEV_XXX commands 
enum { }

:: TO: Kirill Tkhai 
:: CC: David S. Miller 

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: application/gzip


[PATCH net-next] vlan: implement vlan id and protocol changes

2018-06-10 Thread Chas Williams
From: "Charles (Chas) Williams" 

vlan_changelink silently ignores attempts to change the vlan id
or protocol id of an existing vlan interface.  Implement by adding
the new vlan id and protocol to the interface's vlan group and then
removing the old vlan id and protocol from the vlan group.

Signed-off-by: Chas Williams <3ch...@gmail.com>
---
 include/linux/netdevice.h |  1 +
 net/8021q/vlan.c  |  4 ++--
 net/8021q/vlan.h  |  2 ++
 net/8021q/vlan_netlink.c  | 38 ++
 4 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 3ec9850c7936..a95ae238addf 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2409,6 +2409,7 @@ enum netdev_cmd {
NETDEV_CVLAN_FILTER_DROP_INFO,
NETDEV_SVLAN_FILTER_PUSH_INFO,
NETDEV_SVLAN_FILTER_DROP_INFO,
+   NETDEV_CHANGEVLAN,
 };
 const char *netdev_cmd_to_name(enum netdev_cmd cmd);
 
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 73a65789271b..b5e0ad1a581a 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -51,8 +51,8 @@ const char vlan_version[] = DRV_VERSION;
 
 /* End of global variables definitions. */
 
-static int vlan_group_prealloc_vid(struct vlan_group *vg,
-  __be16 vlan_proto, u16 vlan_id)
+int vlan_group_prealloc_vid(struct vlan_group *vg,
+   __be16 vlan_proto, u16 vlan_id)
 {
struct net_device **array;
unsigned int pidx, vidx;
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h
index 44df1c3df02d..c734dd21d70d 100644
--- a/net/8021q/vlan.h
+++ b/net/8021q/vlan.h
@@ -116,6 +116,8 @@ int register_vlan_dev(struct net_device *dev, struct 
netlink_ext_ack *extack);
 void unregister_vlan_dev(struct net_device *dev, struct list_head *head);
 bool vlan_dev_inherit_address(struct net_device *dev,
  struct net_device *real_dev);
+int vlan_group_prealloc_vid(struct vlan_group *vg,
+   __be16 vlan_proto, u16 vlan_id);
 
 static inline u32 vlan_get_ingress_priority(struct net_device *dev,
u16 vlan_tci)
diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c
index 9b60c1e399e2..0e59babe6651 100644
--- a/net/8021q/vlan_netlink.c
+++ b/net/8021q/vlan_netlink.c
@@ -107,10 +107,48 @@ static int vlan_changelink(struct net_device *dev, struct 
nlattr *tb[],
   struct nlattr *data[],
   struct netlink_ext_ack *extack)
 {
+   struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
struct ifla_vlan_flags *flags;
struct ifla_vlan_qos_mapping *m;
struct nlattr *attr;
int rem;
+   int err;
+   __be16 vlan_proto = vlan->vlan_proto;
+   u16 vlan_id = vlan->vlan_id;
+
+   if (data[IFLA_VLAN_ID])
+   vlan_id = nla_get_u16(data[IFLA_VLAN_ID]);
+
+   if (data[IFLA_VLAN_PROTOCOL])
+   vlan_proto = nla_get_be16(data[IFLA_VLAN_PROTOCOL]);
+
+   if (vlan->vlan_id != vlan_id || vlan->vlan_proto != vlan_proto) {
+   struct net_device *real_dev = vlan->real_dev;
+   struct vlan_info *vlan_info;
+   struct vlan_group *grp;
+   __be16 old_vlan_proto = vlan->vlan_proto;
+   u16 old_vlan_id = vlan->vlan_id;
+
+   err = vlan_vid_add(real_dev, vlan_proto, vlan_id);
+   if (err)
+   return err;
+   vlan_info = rtnl_dereference(real_dev->vlan_info);
+   grp = _info->grp;
+   err = vlan_group_prealloc_vid(grp, vlan_proto, vlan_id);
+   if (err < 0) {
+   vlan_vid_del(real_dev, vlan_proto, vlan_id);
+   return err;
+   }
+   vlan_group_set_device(grp, vlan_proto, vlan_id, dev);
+   vlan->vlan_proto = vlan_proto;
+   vlan->vlan_id = vlan_id;
+
+   vlan_group_set_device(grp, old_vlan_proto, old_vlan_id, NULL);
+   vlan_vid_del(real_dev, old_vlan_proto, old_vlan_id);
+
+   err = call_netdevice_notifiers(NETDEV_CHANGEVLAN, dev);
+   notifier_to_errno(err);
+   }
 
if (data[IFLA_VLAN_FLAGS]) {
flags = nla_data(data[IFLA_VLAN_FLAGS]);
-- 
2.14.3