vlan.c (d2ed273d30c5ffd14f6b5ec7ecc751d960f832fc) | vlan.c (86fbe9bb599fcaf7e92e38dbfdad0414a2d68f7d) |
---|---|
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: netdev@vger.kernel.org 7 * VLAN Home Page: http://www.candelatech.com/~greear/vlan.html 8 * --- 81 unchanged lines hidden (view full) --- 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 | 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: netdev@vger.kernel.org 7 * VLAN Home Page: http://www.candelatech.com/~greear/vlan.html 8 * --- 81 unchanged lines hidden (view full) --- 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_MVRP) 99 vlan_mvrp_request_leave(dev); |
|
98 if (vlan->flags & VLAN_FLAG_GVRP) 99 vlan_gvrp_request_leave(dev); 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 netdev_upper_dev_unlink(real_dev, dev); 109 | 100 if (vlan->flags & VLAN_FLAG_GVRP) 101 vlan_gvrp_request_leave(dev); 102 103 vlan_group_set_device(grp, vlan_id, NULL); 104 /* Because unregister_netdevice_queue() makes sure at least one rcu 105 * grace period is respected before device freeing, 106 * we dont need to call synchronize_net() here. 107 */ 108 unregister_netdevice_queue(dev, head); 109 110 netdev_upper_dev_unlink(real_dev, dev); 111 |
110 if (grp->nr_vlan_devs == 0) | 112 if (grp->nr_vlan_devs == 0) { 113 vlan_mvrp_uninit_applicant(real_dev); |
111 vlan_gvrp_uninit_applicant(real_dev); | 114 vlan_gvrp_uninit_applicant(real_dev); |
115 } |
|
112 113 /* Get rid of the vlan's reference to real_dev */ 114 dev_put(real_dev); 115} 116 117int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id) 118{ 119 const char *name = real_dev->name; --- 26 unchanged lines hidden (view full) --- 146 /* vlan_info should be there now. vlan_vid_add took care of it */ 147 BUG_ON(!vlan_info); 148 149 grp = &vlan_info->grp; 150 if (grp->nr_vlan_devs == 0) { 151 err = vlan_gvrp_init_applicant(real_dev); 152 if (err < 0) 153 goto out_vid_del; | 116 117 /* Get rid of the vlan's reference to real_dev */ 118 dev_put(real_dev); 119} 120 121int vlan_check_real_dev(struct net_device *real_dev, u16 vlan_id) 122{ 123 const char *name = real_dev->name; --- 26 unchanged lines hidden (view full) --- 150 /* vlan_info should be there now. vlan_vid_add took care of it */ 151 BUG_ON(!vlan_info); 152 153 grp = &vlan_info->grp; 154 if (grp->nr_vlan_devs == 0) { 155 err = vlan_gvrp_init_applicant(real_dev); 156 if (err < 0) 157 goto out_vid_del; |
158 err = vlan_mvrp_init_applicant(real_dev); 159 if (err < 0) 160 goto out_uninit_gvrp; |
|
154 } 155 156 err = vlan_group_prealloc_vid(grp, vlan_id); 157 if (err < 0) | 161 } 162 163 err = vlan_group_prealloc_vid(grp, vlan_id); 164 if (err < 0) |
158 goto out_uninit_applicant; | 165 goto out_uninit_mvrp; |
159 160 err = netdev_upper_dev_link(real_dev, dev); 161 if (err) | 166 167 err = netdev_upper_dev_link(real_dev, dev); 168 if (err) |
162 goto out_uninit_applicant; | 169 goto out_uninit_mvrp; |
163 164 err = register_netdevice(dev); 165 if (err < 0) 166 goto out_upper_dev_unlink; 167 168 /* Account for reference in struct vlan_dev_priv */ 169 dev_hold(real_dev); 170 --- 5 unchanged lines hidden (view full) --- 176 */ 177 vlan_group_set_device(grp, vlan_id, dev); 178 grp->nr_vlan_devs++; 179 180 return 0; 181 182out_upper_dev_unlink: 183 netdev_upper_dev_unlink(real_dev, dev); | 170 171 err = register_netdevice(dev); 172 if (err < 0) 173 goto out_upper_dev_unlink; 174 175 /* Account for reference in struct vlan_dev_priv */ 176 dev_hold(real_dev); 177 --- 5 unchanged lines hidden (view full) --- 183 */ 184 vlan_group_set_device(grp, vlan_id, dev); 185 grp->nr_vlan_devs++; 186 187 return 0; 188 189out_upper_dev_unlink: 190 netdev_upper_dev_unlink(real_dev, dev); |
184out_uninit_applicant: | 191out_uninit_mvrp: |
185 if (grp->nr_vlan_devs == 0) | 192 if (grp->nr_vlan_devs == 0) |
193 vlan_mvrp_uninit_applicant(real_dev); 194out_uninit_gvrp: 195 if (grp->nr_vlan_devs == 0) |
|
186 vlan_gvrp_uninit_applicant(real_dev); 187out_vid_del: 188 vlan_vid_del(real_dev, vlan_id); 189 return err; 190} 191 192/* Attach a VLAN device to a mac address (ie Ethernet Card). 193 * Returns 0 if the device was created or a negative error code otherwise. --- 456 unchanged lines hidden (view full) --- 650 err = register_netdevice_notifier(&vlan_notifier_block); 651 if (err < 0) 652 goto err2; 653 654 err = vlan_gvrp_init(); 655 if (err < 0) 656 goto err3; 657 | 196 vlan_gvrp_uninit_applicant(real_dev); 197out_vid_del: 198 vlan_vid_del(real_dev, vlan_id); 199 return err; 200} 201 202/* Attach a VLAN device to a mac address (ie Ethernet Card). 203 * Returns 0 if the device was created or a negative error code otherwise. --- 456 unchanged lines hidden (view full) --- 660 err = register_netdevice_notifier(&vlan_notifier_block); 661 if (err < 0) 662 goto err2; 663 664 err = vlan_gvrp_init(); 665 if (err < 0) 666 goto err3; 667 |
658 err = vlan_netlink_init(); | 668 err = vlan_mvrp_init(); |
659 if (err < 0) 660 goto err4; 661 | 669 if (err < 0) 670 goto err4; 671 |
672 err = vlan_netlink_init(); 673 if (err < 0) 674 goto err5; 675 |
|
662 vlan_ioctl_set(vlan_ioctl_handler); 663 return 0; 664 | 676 vlan_ioctl_set(vlan_ioctl_handler); 677 return 0; 678 |
679err5: 680 vlan_mvrp_uninit(); |
|
665err4: 666 vlan_gvrp_uninit(); 667err3: 668 unregister_netdevice_notifier(&vlan_notifier_block); 669err2: 670 unregister_pernet_subsys(&vlan_net_ops); 671err0: 672 return err; --- 4 unchanged lines hidden (view full) --- 677 vlan_ioctl_set(NULL); 678 vlan_netlink_fini(); 679 680 unregister_netdevice_notifier(&vlan_notifier_block); 681 682 unregister_pernet_subsys(&vlan_net_ops); 683 rcu_barrier(); /* Wait for completion of call_rcu()'s */ 684 | 681err4: 682 vlan_gvrp_uninit(); 683err3: 684 unregister_netdevice_notifier(&vlan_notifier_block); 685err2: 686 unregister_pernet_subsys(&vlan_net_ops); 687err0: 688 return err; --- 4 unchanged lines hidden (view full) --- 693 vlan_ioctl_set(NULL); 694 vlan_netlink_fini(); 695 696 unregister_netdevice_notifier(&vlan_notifier_block); 697 698 unregister_pernet_subsys(&vlan_net_ops); 699 rcu_barrier(); /* Wait for completion of call_rcu()'s */ 700 |
701 vlan_mvrp_uninit(); |
|
685 vlan_gvrp_uninit(); 686} 687 688module_init(vlan_proto_init); 689module_exit(vlan_cleanup_module); 690 691MODULE_LICENSE("GPL"); 692MODULE_VERSION(DRV_VERSION); | 702 vlan_gvrp_uninit(); 703} 704 705module_init(vlan_proto_init); 706module_exit(vlan_cleanup_module); 707 708MODULE_LICENSE("GPL"); 709MODULE_VERSION(DRV_VERSION); |