82 lines
2.1 KiB
Diff
82 lines
2.1 KiB
Diff
|
From: Jiri Pirko <jpirko@redhat.com>
|
||
|
Date: Thu, 8 Dec 2011 04:11:19 +0000
|
||
|
Subject: [10/23] vlan: introduce functions to do mass addition/deletion of vids by
|
||
|
another device
|
||
|
|
||
|
commit 348a1443cc4303c72cf1ee3b26e476fec8e7b5fa upstream.
|
||
|
|
||
|
Introduce functions handy to copy vlan ids from one driver's list to
|
||
|
another.
|
||
|
|
||
|
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
[bwh: Assume ndo_vlan_rx_add_id still returns void]
|
||
|
---
|
||
|
--- a/include/linux/if_vlan.h
|
||
|
+++ b/include/linux/if_vlan.h
|
||
|
@@ -112,6 +112,10 @@
|
||
|
extern int vlan_vid_add(struct net_device *dev, unsigned short vid);
|
||
|
extern void vlan_vid_del(struct net_device *dev, unsigned short vid);
|
||
|
|
||
|
+extern int vlan_vids_add_by_dev(struct net_device *dev,
|
||
|
+ const struct net_device *by_dev);
|
||
|
+extern void vlan_vids_del_by_dev(struct net_device *dev,
|
||
|
+ const struct net_device *by_dev);
|
||
|
#else
|
||
|
static inline struct net_device *
|
||
|
__vlan_find_dev_deep(struct net_device *real_dev, u16 vlan_id)
|
||
|
@@ -151,6 +155,16 @@
|
||
|
static inline void vlan_vid_del(struct net_device *dev, unsigned short vid)
|
||
|
{
|
||
|
}
|
||
|
+
|
||
|
+static inline int vlan_vids_add_by_dev(struct net_device *dev,
|
||
|
+ const struct net_device *by_dev)
|
||
|
+{
|
||
|
+}
|
||
|
+
|
||
|
+static inline void vlan_vids_del_by_dev(struct net_device *dev,
|
||
|
+ const struct net_device *by_dev)
|
||
|
+{
|
||
|
+}
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
--- a/net/8021q/vlan_core.c
|
||
|
+++ b/net/8021q/vlan_core.c
|
||
|
@@ -202,3 +202,34 @@
|
||
|
}
|
||
|
}
|
||
|
EXPORT_SYMBOL(vlan_vid_del);
|
||
|
+
|
||
|
+int vlan_vids_add_by_dev(struct net_device *dev,
|
||
|
+ const struct net_device *by_dev)
|
||
|
+{
|
||
|
+ struct vlan_vid_info *vid_info;
|
||
|
+
|
||
|
+ ASSERT_RTNL();
|
||
|
+
|
||
|
+ if (!by_dev->vlan_info)
|
||
|
+ return;
|
||
|
+
|
||
|
+ list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list) {
|
||
|
+ vlan_vid_add(dev, vid_info->vid);
|
||
|
+ }
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+EXPORT_SYMBOL(vlan_vids_add_by_dev);
|
||
|
+
|
||
|
+void vlan_vids_del_by_dev(struct net_device *dev,
|
||
|
+ const struct net_device *by_dev)
|
||
|
+{
|
||
|
+ struct vlan_vid_info *vid_info;
|
||
|
+
|
||
|
+ ASSERT_RTNL();
|
||
|
+
|
||
|
+ if (!by_dev->vlan_info)
|
||
|
+ return;
|
||
|
+
|
||
|
+ list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list)
|
||
|
+ vlan_vid_del(dev, vid_info->vid);
|
||
|
+}
|