Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vlan.c
Go to the documentation of this file.
1 /*
2  * INET 802.1Q VLAN
3  * Ethernet-type device handling.
4  *
5  * Authors: Ben Greear <[email protected]>
6  * Please send support related email to: [email protected]
7  * VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
8  *
9  * Fixes:
10  * Fix for packet capture - Nick Eggleston <[email protected]>;
11  * Add HW acceleration hooks - David S. Miller <[email protected]>;
12  * Correct all the locking - David S. Miller <[email protected]>;
13  * Use hash table for VLAN groups - David S. Miller <[email protected]>
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version
18  * 2 of the License, or (at your option) any later version.
19  */
20 
21 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
22 
23 #include <linux/capability.h>
24 #include <linux/module.h>
25 #include <linux/netdevice.h>
26 #include <linux/skbuff.h>
27 #include <linux/slab.h>
28 #include <linux/init.h>
29 #include <linux/rculist.h>
30 #include <net/p8022.h>
31 #include <net/arp.h>
32 #include <linux/rtnetlink.h>
33 #include <linux/notifier.h>
34 #include <net/rtnetlink.h>
35 #include <net/net_namespace.h>
36 #include <net/netns/generic.h>
37 #include <asm/uaccess.h>
38 
39 #include <linux/if_vlan.h>
40 #include "vlan.h"
41 #include "vlanproc.h"
42 
43 #define DRV_VERSION "1.8"
44 
45 /* Global VLAN variables */
46 
48 
49 const char vlan_fullname[] = "802.1Q VLAN Support";
50 const char vlan_version[] = DRV_VERSION;
51 
52 /* End of global variables definitions. */
53 
54 static int vlan_group_prealloc_vid(struct vlan_group *vg, u16 vlan_id)
55 {
56  struct net_device **array;
57  unsigned int size;
58 
59  ASSERT_RTNL();
60 
61  array = vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN];
62  if (array != NULL)
63  return 0;
64 
65  size = sizeof(struct net_device *) * VLAN_GROUP_ARRAY_PART_LEN;
66  array = kzalloc(size, GFP_KERNEL);
67  if (array == NULL)
68  return -ENOBUFS;
69 
70  vg->vlan_devices_arrays[vlan_id / VLAN_GROUP_ARRAY_PART_LEN] = array;
71  return 0;
72 }
73 
75 {
76  struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
77  struct net_device *real_dev = vlan->real_dev;
78  struct vlan_info *vlan_info;
79  struct vlan_group *grp;
80  u16 vlan_id = vlan->vlan_id;
81 
82  ASSERT_RTNL();
83 
84  vlan_info = rtnl_dereference(real_dev->vlan_info);
85  BUG_ON(!vlan_info);
86 
87  grp = &vlan_info->grp;
88 
89  /* Take it out of our own structures, but be sure to interlock with
90  * HW accelerating devices or SW vlan input packet processing if
91  * VLAN is not 0 (leave it there for 802.1p).
92  */
93  if (vlan_id)
94  vlan_vid_del(real_dev, vlan_id);
95 
96  grp->nr_vlan_devs--;
97 
98  if (vlan->flags & VLAN_FLAG_GVRP)
100 
101  vlan_group_set_device(grp, vlan_id, NULL);
102  /* Because unregister_netdevice_queue() makes sure at least one rcu
103  * grace period is respected before device freeing,
104  * we dont need to call synchronize_net() here.
105  */
106  unregister_netdevice_queue(dev, head);
107 
108  if (grp->nr_vlan_devs == 0)
109  vlan_gvrp_uninit_applicant(real_dev);
110 
111  /* Get rid of the vlan's reference to real_dev */
112  dev_put(real_dev);
113 }
114 
116 {
117  const char *name = real_dev->name;
118  const struct net_device_ops *ops = real_dev->netdev_ops;
119 
120  if (real_dev->features & NETIF_F_VLAN_CHALLENGED) {
121  pr_info("VLANs not supported on %s\n", name);
122  return -EOPNOTSUPP;
123  }
124 
125  if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) &&
126  (!ops->ndo_vlan_rx_add_vid || !ops->ndo_vlan_rx_kill_vid)) {
127  pr_info("Device %s has buggy VLAN hw accel\n", name);
128  return -EOPNOTSUPP;
129  }
130 
131  if (vlan_find_dev(real_dev, vlan_id) != NULL)
132  return -EEXIST;
133 
134  return 0;
135 }
136 
138 {
139  struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
140  struct net_device *real_dev = vlan->real_dev;
141  u16 vlan_id = vlan->vlan_id;
142  struct vlan_info *vlan_info;
143  struct vlan_group *grp;
144  int err;
145 
146  err = vlan_vid_add(real_dev, vlan_id);
147  if (err)
148  return err;
149 
150  vlan_info = rtnl_dereference(real_dev->vlan_info);
151  /* vlan_info should be there now. vlan_vid_add took care of it */
152  BUG_ON(!vlan_info);
153 
154  grp = &vlan_info->grp;
155  if (grp->nr_vlan_devs == 0) {
156  err = vlan_gvrp_init_applicant(real_dev);
157  if (err < 0)
158  goto out_vid_del;
159  }
160 
161  err = vlan_group_prealloc_vid(grp, vlan_id);
162  if (err < 0)
163  goto out_uninit_applicant;
164 
165  err = register_netdevice(dev);
166  if (err < 0)
167  goto out_uninit_applicant;
168 
169  /* Account for reference in struct vlan_dev_priv */
170  dev_hold(real_dev);
171 
172  netif_stacked_transfer_operstate(real_dev, dev);
173  linkwatch_fire_event(dev); /* _MUST_ call rfc2863_policy() */
174 
175  /* So, got the sucker initialized, now lets place
176  * it into our local structure.
177  */
178  vlan_group_set_device(grp, vlan_id, dev);
179  grp->nr_vlan_devs++;
180 
181  return 0;
182 
183 out_uninit_applicant:
184  if (grp->nr_vlan_devs == 0)
185  vlan_gvrp_uninit_applicant(real_dev);
186 out_vid_del:
187  vlan_vid_del(real_dev, vlan_id);
188  return err;
189 }
190 
191 /* Attach a VLAN device to a mac address (ie Ethernet Card).
192  * Returns 0 if the device was created or a negative error code otherwise.
193  */
194 static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
195 {
196  struct net_device *new_dev;
197  struct net *net = dev_net(real_dev);
198  struct vlan_net *vn = net_generic(net, vlan_net_id);
199  char name[IFNAMSIZ];
200  int err;
201 
202  if (vlan_id >= VLAN_VID_MASK)
203  return -ERANGE;
204 
205  err = vlan_check_real_dev(real_dev, vlan_id);
206  if (err < 0)
207  return err;
208 
209  /* Gotta set up the fields for the device. */
210  switch (vn->name_type) {
212  /* name will look like: eth1.0005 */
213  snprintf(name, IFNAMSIZ, "%s.%.4i", real_dev->name, vlan_id);
214  break;
216  /* Put our vlan.VID in the name.
217  * Name will look like: vlan5
218  */
219  snprintf(name, IFNAMSIZ, "vlan%i", vlan_id);
220  break;
222  /* Put our vlan.VID in the name.
223  * Name will look like: eth0.5
224  */
225  snprintf(name, IFNAMSIZ, "%s.%i", real_dev->name, vlan_id);
226  break;
228  /* Put our vlan.VID in the name.
229  * Name will look like: vlan0005
230  */
231  default:
232  snprintf(name, IFNAMSIZ, "vlan%.4i", vlan_id);
233  }
234 
235  new_dev = alloc_netdev(sizeof(struct vlan_dev_priv), name, vlan_setup);
236 
237  if (new_dev == NULL)
238  return -ENOBUFS;
239 
240  dev_net_set(new_dev, net);
241  /* need 4 bytes for extra VLAN header info,
242  * hope the underlying device can handle it.
243  */
244  new_dev->mtu = real_dev->mtu;
245 
246  vlan_dev_priv(new_dev)->vlan_id = vlan_id;
247  vlan_dev_priv(new_dev)->real_dev = real_dev;
248  vlan_dev_priv(new_dev)->dent = NULL;
250 
251  new_dev->rtnl_link_ops = &vlan_link_ops;
252  err = register_vlan_dev(new_dev);
253  if (err < 0)
254  goto out_free_newdev;
255 
256  return 0;
257 
258 out_free_newdev:
259  free_netdev(new_dev);
260  return err;
261 }
262 
263 static void vlan_sync_address(struct net_device *dev,
264  struct net_device *vlandev)
265 {
266  struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev);
267 
268  /* May be called without an actual change */
269  if (ether_addr_equal(vlan->real_dev_addr, dev->dev_addr))
270  return;
271 
272  /* vlan address was different from the old address and is equal to
273  * the new address */
274  if (!ether_addr_equal(vlandev->dev_addr, vlan->real_dev_addr) &&
275  ether_addr_equal(vlandev->dev_addr, dev->dev_addr))
276  dev_uc_del(dev, vlandev->dev_addr);
277 
278  /* vlan address was equal to the old address and is different from
279  * the new address */
280  if (ether_addr_equal(vlandev->dev_addr, vlan->real_dev_addr) &&
281  !ether_addr_equal(vlandev->dev_addr, dev->dev_addr))
282  dev_uc_add(dev, vlandev->dev_addr);
283 
284  memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN);
285 }
286 
287 static void vlan_transfer_features(struct net_device *dev,
288  struct net_device *vlandev)
289 {
290  vlandev->gso_max_size = dev->gso_max_size;
291 
292  if (dev->features & NETIF_F_HW_VLAN_TX)
293  vlandev->hard_header_len = dev->hard_header_len;
294  else
295  vlandev->hard_header_len = dev->hard_header_len + VLAN_HLEN;
296 
297 #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
298  vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid;
299 #endif
300 
301  netdev_update_features(vlandev);
302 }
303 
304 static void __vlan_device_event(struct net_device *dev, unsigned long event)
305 {
306  switch (event) {
307  case NETDEV_CHANGENAME:
308  vlan_proc_rem_dev(dev);
309  if (vlan_proc_add_dev(dev) < 0)
310  pr_warn("failed to change proc name for %s\n",
311  dev->name);
312  break;
313  case NETDEV_REGISTER:
314  if (vlan_proc_add_dev(dev) < 0)
315  pr_warn("failed to add proc entry for %s\n", dev->name);
316  break;
317  case NETDEV_UNREGISTER:
318  vlan_proc_rem_dev(dev);
319  break;
320  }
321 }
322 
323 static int vlan_device_event(struct notifier_block *unused, unsigned long event,
324  void *ptr)
325 {
326  struct net_device *dev = ptr;
327  struct vlan_group *grp;
328  struct vlan_info *vlan_info;
329  int i, flgs;
330  struct net_device *vlandev;
331  struct vlan_dev_priv *vlan;
332  LIST_HEAD(list);
333 
334  if (is_vlan_dev(dev))
335  __vlan_device_event(dev, event);
336 
337  if ((event == NETDEV_UP) &&
338  (dev->features & NETIF_F_HW_VLAN_FILTER)) {
339  pr_info("adding VLAN 0 to HW filter on device %s\n",
340  dev->name);
341  vlan_vid_add(dev, 0);
342  }
343 
344  vlan_info = rtnl_dereference(dev->vlan_info);
345  if (!vlan_info)
346  goto out;
347  grp = &vlan_info->grp;
348 
349  /* It is OK that we do not hold the group lock right now,
350  * as we run under the RTNL lock.
351  */
352 
353  switch (event) {
354  case NETDEV_CHANGE:
355  /* Propagate real device state to vlan devices */
356  for (i = 0; i < VLAN_N_VID; i++) {
357  vlandev = vlan_group_get_device(grp, i);
358  if (!vlandev)
359  continue;
360 
361  netif_stacked_transfer_operstate(dev, vlandev);
362  }
363  break;
364 
365  case NETDEV_CHANGEADDR:
366  /* Adjust unicast filters on underlying device */
367  for (i = 0; i < VLAN_N_VID; i++) {
368  vlandev = vlan_group_get_device(grp, i);
369  if (!vlandev)
370  continue;
371 
372  flgs = vlandev->flags;
373  if (!(flgs & IFF_UP))
374  continue;
375 
376  vlan_sync_address(dev, vlandev);
377  }
378  break;
379 
380  case NETDEV_CHANGEMTU:
381  for (i = 0; i < VLAN_N_VID; i++) {
382  vlandev = vlan_group_get_device(grp, i);
383  if (!vlandev)
384  continue;
385 
386  if (vlandev->mtu <= dev->mtu)
387  continue;
388 
389  dev_set_mtu(vlandev, dev->mtu);
390  }
391  break;
392 
393  case NETDEV_FEAT_CHANGE:
394  /* Propagate device features to underlying device */
395  for (i = 0; i < VLAN_N_VID; i++) {
396  vlandev = vlan_group_get_device(grp, i);
397  if (!vlandev)
398  continue;
399 
400  vlan_transfer_features(dev, vlandev);
401  }
402 
403  break;
404 
405  case NETDEV_DOWN:
406  if (dev->features & NETIF_F_HW_VLAN_FILTER)
407  vlan_vid_del(dev, 0);
408 
409  /* Put all VLANs for this dev in the down state too. */
410  for (i = 0; i < VLAN_N_VID; i++) {
411  vlandev = vlan_group_get_device(grp, i);
412  if (!vlandev)
413  continue;
414 
415  flgs = vlandev->flags;
416  if (!(flgs & IFF_UP))
417  continue;
418 
419  vlan = vlan_dev_priv(vlandev);
420  if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
421  dev_change_flags(vlandev, flgs & ~IFF_UP);
422  netif_stacked_transfer_operstate(dev, vlandev);
423  }
424  break;
425 
426  case NETDEV_UP:
427  /* Put all VLANs for this dev in the up state too. */
428  for (i = 0; i < VLAN_N_VID; i++) {
429  vlandev = vlan_group_get_device(grp, i);
430  if (!vlandev)
431  continue;
432 
433  flgs = vlandev->flags;
434  if (flgs & IFF_UP)
435  continue;
436 
437  vlan = vlan_dev_priv(vlandev);
438  if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
439  dev_change_flags(vlandev, flgs | IFF_UP);
440  netif_stacked_transfer_operstate(dev, vlandev);
441  }
442  break;
443 
444  case NETDEV_UNREGISTER:
445  /* twiddle thumbs on netns device moves */
446  if (dev->reg_state != NETREG_UNREGISTERING)
447  break;
448 
449  for (i = 0; i < VLAN_N_VID; i++) {
450  vlandev = vlan_group_get_device(grp, i);
451  if (!vlandev)
452  continue;
453 
454  /* removal of last vid destroys vlan_info, abort
455  * afterwards */
456  if (vlan_info->nr_vids == 1)
457  i = VLAN_N_VID;
458 
459  unregister_vlan_dev(vlandev, &list);
460  }
462  break;
463 
465  /* Forbid underlaying device to change its type. */
466  if (vlan_uses_dev(dev))
467  return NOTIFY_BAD;
468  break;
469 
470  case NETDEV_NOTIFY_PEERS:
472  /* Propagate to vlan devices */
473  for (i = 0; i < VLAN_N_VID; i++) {
474  vlandev = vlan_group_get_device(grp, i);
475  if (!vlandev)
476  continue;
477 
478  call_netdevice_notifiers(event, vlandev);
479  }
480  break;
481  }
482 
483 out:
484  return NOTIFY_DONE;
485 }
486 
487 static struct notifier_block vlan_notifier_block __read_mostly = {
488  .notifier_call = vlan_device_event,
489 };
490 
491 /*
492  * VLAN IOCTL handler.
493  * o execute requested action or pass command to the device driver
494  * arg is really a struct vlan_ioctl_args __user *.
495  */
496 static int vlan_ioctl_handler(struct net *net, void __user *arg)
497 {
498  int err;
499  struct vlan_ioctl_args args;
500  struct net_device *dev = NULL;
501 
502  if (copy_from_user(&args, arg, sizeof(struct vlan_ioctl_args)))
503  return -EFAULT;
504 
505  /* Null terminate this sucker, just in case. */
506  args.device1[23] = 0;
507  args.u.device2[23] = 0;
508 
509  rtnl_lock();
510 
511  switch (args.cmd) {
514  case SET_VLAN_FLAG_CMD:
515  case ADD_VLAN_CMD:
516  case DEL_VLAN_CMD:
518  case GET_VLAN_VID_CMD:
519  err = -ENODEV;
520  dev = __dev_get_by_name(net, args.device1);
521  if (!dev)
522  goto out;
523 
524  err = -EINVAL;
525  if (args.cmd != ADD_VLAN_CMD && !is_vlan_dev(dev))
526  goto out;
527  }
528 
529  switch (args.cmd) {
531  err = -EPERM;
532  if (!capable(CAP_NET_ADMIN))
533  break;
535  args.u.skb_priority,
536  args.vlan_qos);
537  err = 0;
538  break;
539 
541  err = -EPERM;
542  if (!capable(CAP_NET_ADMIN))
543  break;
545  args.u.skb_priority,
546  args.vlan_qos);
547  break;
548 
549  case SET_VLAN_FLAG_CMD:
550  err = -EPERM;
551  if (!capable(CAP_NET_ADMIN))
552  break;
553  err = vlan_dev_change_flags(dev,
554  args.vlan_qos ? args.u.flag : 0,
555  args.u.flag);
556  break;
557 
559  err = -EPERM;
560  if (!capable(CAP_NET_ADMIN))
561  break;
562  if ((args.u.name_type >= 0) &&
563  (args.u.name_type < VLAN_NAME_TYPE_HIGHEST)) {
564  struct vlan_net *vn;
565 
566  vn = net_generic(net, vlan_net_id);
567  vn->name_type = args.u.name_type;
568  err = 0;
569  } else {
570  err = -EINVAL;
571  }
572  break;
573 
574  case ADD_VLAN_CMD:
575  err = -EPERM;
576  if (!capable(CAP_NET_ADMIN))
577  break;
578  err = register_vlan_device(dev, args.u.VID);
579  break;
580 
581  case DEL_VLAN_CMD:
582  err = -EPERM;
583  if (!capable(CAP_NET_ADMIN))
584  break;
586  err = 0;
587  break;
588 
590  err = 0;
591  vlan_dev_get_realdev_name(dev, args.u.device2);
592  if (copy_to_user(arg, &args,
593  sizeof(struct vlan_ioctl_args)))
594  err = -EFAULT;
595  break;
596 
597  case GET_VLAN_VID_CMD:
598  err = 0;
599  args.u.VID = vlan_dev_vlan_id(dev);
600  if (copy_to_user(arg, &args,
601  sizeof(struct vlan_ioctl_args)))
602  err = -EFAULT;
603  break;
604 
605  default:
606  err = -EOPNOTSUPP;
607  break;
608  }
609 out:
610  rtnl_unlock();
611  return err;
612 }
613 
614 static int __net_init vlan_init_net(struct net *net)
615 {
616  struct vlan_net *vn = net_generic(net, vlan_net_id);
617  int err;
618 
620 
621  err = vlan_proc_init(net);
622 
623  return err;
624 }
625 
626 static void __net_exit vlan_exit_net(struct net *net)
627 {
628  vlan_proc_cleanup(net);
629 }
630 
631 static struct pernet_operations vlan_net_ops = {
632  .init = vlan_init_net,
633  .exit = vlan_exit_net,
634  .id = &vlan_net_id,
635  .size = sizeof(struct vlan_net),
636 };
637 
638 static int __init vlan_proto_init(void)
639 {
640  int err;
641 
642  pr_info("%s v%s\n", vlan_fullname, vlan_version);
643 
644  err = register_pernet_subsys(&vlan_net_ops);
645  if (err < 0)
646  goto err0;
647 
648  err = register_netdevice_notifier(&vlan_notifier_block);
649  if (err < 0)
650  goto err2;
651 
652  err = vlan_gvrp_init();
653  if (err < 0)
654  goto err3;
655 
656  err = vlan_netlink_init();
657  if (err < 0)
658  goto err4;
659 
660  vlan_ioctl_set(vlan_ioctl_handler);
661  return 0;
662 
663 err4:
665 err3:
666  unregister_netdevice_notifier(&vlan_notifier_block);
667 err2:
668  unregister_pernet_subsys(&vlan_net_ops);
669 err0:
670  return err;
671 }
672 
673 static void __exit vlan_cleanup_module(void)
674 {
677 
678  unregister_netdevice_notifier(&vlan_notifier_block);
679 
680  unregister_pernet_subsys(&vlan_net_ops);
681  rcu_barrier(); /* Wait for completion of call_rcu()'s */
682 
684 }
685 
686 module_init(vlan_proto_init);
687 module_exit(vlan_cleanup_module);
688 
689 MODULE_LICENSE("GPL");