vlan.c (c1d3ee9925ca714a5ed3f8fce01a7027137f4e3f) vlan.c (e89fe42cd03c8fd3686df82d8390a235717a66de)
1/*
2 * INET 802.1Q VLAN
3 * Ethernet-type device handling.
4 *
5 * Authors: Ben Greear <greearb@candelatech.com>
6 * Please send support related email to: vlan@scry.wanfear.com
7 * VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
8 *

--- 433 unchanged lines hidden (view full) ---

442 /* was already registered. */
443 printk(VLAN_DBG "%s: ALREADY had VLAN registered\n", __FUNCTION__);
444 return -EEXIST;
445 }
446
447 return 0;
448}
449
1/*
2 * INET 802.1Q VLAN
3 * Ethernet-type device handling.
4 *
5 * Authors: Ben Greear <greearb@candelatech.com>
6 * Please send support related email to: vlan@scry.wanfear.com
7 * VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
8 *

--- 433 unchanged lines hidden (view full) ---

442 /* was already registered. */
443 printk(VLAN_DBG "%s: ALREADY had VLAN registered\n", __FUNCTION__);
444 return -EEXIST;
445 }
446
447 return 0;
448}
449
450static int register_vlan_dev(struct net_device *dev)
451{
452 struct vlan_dev_info *vlan = VLAN_DEV_INFO(dev);
453 struct net_device *real_dev = vlan->real_dev;
454 unsigned short vlan_id = vlan->vlan_id;
455 struct vlan_group *grp, *ngrp = NULL;
456 int err;
457
458 grp = __vlan_find_group(real_dev->ifindex);
459 if (!grp) {
460 ngrp = grp = vlan_group_alloc(real_dev->ifindex);
461 if (!grp)
462 return -ENOBUFS;
463 }
464
465 err = register_netdevice(dev);
466 if (err < 0)
467 goto out_free_group;
468
469 /* Account for reference in struct vlan_dev_info */
470 dev_hold(real_dev);
471
472 vlan_transfer_operstate(real_dev, dev);
473 linkwatch_fire_event(dev); /* _MUST_ call rfc2863_policy() */
474
475 /* So, got the sucker initialized, now lets place
476 * it into our local structure.
477 */
478 vlan_group_set_device(grp, vlan_id, dev);
479 if (ngrp && real_dev->features & NETIF_F_HW_VLAN_RX)
480 real_dev->vlan_rx_register(real_dev, ngrp);
481 if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
482 real_dev->vlan_rx_add_vid(real_dev, vlan_id);
483
484 if (vlan_proc_add_dev(dev) < 0)
485 printk(KERN_WARNING "VLAN: failed to add proc entry for %s\n",
486 dev->name);
487 return 0;
488
489out_free_group:
490 if (ngrp)
491 vlan_group_free(ngrp);
492 return err;
493}
494
450/* Attach a VLAN device to a mac address (ie Ethernet Card).
451 * Returns the device that was created, or NULL if there was
452 * an error of some kind.
453 */
454static struct net_device *register_vlan_device(struct net_device *real_dev,
455 unsigned short VLAN_ID)
456{
495/* Attach a VLAN device to a mac address (ie Ethernet Card).
496 * Returns the device that was created, or NULL if there was
497 * an error of some kind.
498 */
499static struct net_device *register_vlan_device(struct net_device *real_dev,
500 unsigned short VLAN_ID)
501{
457 struct vlan_group *grp, *ngrp = NULL;
458 struct net_device *new_dev;
459 char name[IFNAMSIZ];
460
461#ifdef VLAN_DEBUG
462 printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n",
463 __FUNCTION__, eth_IF_name, VLAN_ID);
464#endif
465

--- 51 unchanged lines hidden (view full) ---

517 sizeof(struct vlan_dev_info));
518#endif
519
520 VLAN_DEV_INFO(new_dev)->vlan_id = VLAN_ID; /* 1 through VLAN_VID_MASK */
521 VLAN_DEV_INFO(new_dev)->real_dev = real_dev;
522 VLAN_DEV_INFO(new_dev)->dent = NULL;
523 VLAN_DEV_INFO(new_dev)->flags = 1;
524
502 struct net_device *new_dev;
503 char name[IFNAMSIZ];
504
505#ifdef VLAN_DEBUG
506 printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n",
507 __FUNCTION__, eth_IF_name, VLAN_ID);
508#endif
509

--- 51 unchanged lines hidden (view full) ---

561 sizeof(struct vlan_dev_info));
562#endif
563
564 VLAN_DEV_INFO(new_dev)->vlan_id = VLAN_ID; /* 1 through VLAN_VID_MASK */
565 VLAN_DEV_INFO(new_dev)->real_dev = real_dev;
566 VLAN_DEV_INFO(new_dev)->dent = NULL;
567 VLAN_DEV_INFO(new_dev)->flags = 1;
568
525#ifdef VLAN_DEBUG
526 printk(VLAN_DBG "About to go find the group for idx: %i\n",
527 real_dev->ifindex);
528#endif
529 grp = __vlan_find_group(real_dev->ifindex);
530 if (!grp) {
531 ngrp = grp = vlan_group_alloc(real_dev->ifindex);
532 if (!grp)
533 goto out_free_newdev;
534 }
569 if (register_vlan_dev(new_dev) < 0)
570 goto out_free_newdev;
535
571
536 if (register_netdevice(new_dev))
537 goto out_free_group;
538
539 vlan_transfer_operstate(real_dev, new_dev);
540 linkwatch_fire_event(new_dev); /* _MUST_ call rfc2863_policy() */
541
542 /* So, got the sucker initialized, now lets place
543 * it into our local structure.
544 */
545 if (ngrp && real_dev->features & NETIF_F_HW_VLAN_RX)
546 real_dev->vlan_rx_register(real_dev, ngrp);
547
548 vlan_group_set_device(grp, VLAN_ID, new_dev);
549
550 if (vlan_proc_add_dev(new_dev)<0)/* create it's proc entry */
551 printk(KERN_WARNING "VLAN: failed to add proc entry for %s\n",
552 new_dev->name);
553
554 if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
555 real_dev->vlan_rx_add_vid(real_dev, VLAN_ID);
556
557 /* Account for reference in struct vlan_dev_info */
558 dev_hold(real_dev);
559#ifdef VLAN_DEBUG
560 printk(VLAN_DBG "Allocated new device successfully, returning.\n");
561#endif
562 return new_dev;
563
572 /* Account for reference in struct vlan_dev_info */
573 dev_hold(real_dev);
574#ifdef VLAN_DEBUG
575 printk(VLAN_DBG "Allocated new device successfully, returning.\n");
576#endif
577 return new_dev;
578
564out_free_group:
565 if (ngrp)
566 vlan_group_free(ngrp);
567
568out_free_newdev:
569 free_netdev(new_dev);
570
571out_ret_null:
572 return NULL;
573}
574
575static int vlan_device_event(struct notifier_block *unused, unsigned long event, void *ptr)

--- 234 unchanged lines hidden ---
579out_free_newdev:
580 free_netdev(new_dev);
581
582out_ret_null:
583 return NULL;
584}
585
586static int vlan_device_event(struct notifier_block *unused, unsigned long event, void *ptr)

--- 234 unchanged lines hidden ---