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);