This patch adds symlinks under /sys/net/*/wiphy pointing to
/sys/class/ieee80211/phyX.

This allows new interfaces to be added by writing a new name to e.g.
/sys/net/wlan0/wiphy/add_iface.

Signed-off-by: Jiri Benc <[EMAIL PROTECTED]>

---

 net/d80211/ieee80211_dev.c   |   16 +++++++++++++
 net/d80211/ieee80211_i.h     |    1 +
 net/d80211/ieee80211_sysfs.c |   51 +++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 67 insertions(+), 1 deletions(-)

8ac63bdfba39115673abc492d7eb867c364b0fc4
diff --git a/net/d80211/ieee80211_dev.c b/net/d80211/ieee80211_dev.c
index 4302506..6278cfa 100644
--- a/net/d80211/ieee80211_dev.c
+++ b/net/d80211/ieee80211_dev.c
@@ -83,3 +83,19 @@ struct ieee80211_local *ieee80211_dev_fi
        spin_unlock(&dev_list_lock);
        return dev_item ? dev_item->local : NULL;
 }
+
+int ieee80211_dev_find_index(struct ieee80211_local *local)
+{
+       struct ieee80211_dev_list *dev_item;
+       int index = -1;
+
+       spin_lock(&dev_list_lock);
+       list_for_each_entry(dev_item, &dev_list, list) {
+               if (dev_item->local == local) {
+                       index = dev_item->dev_index;
+                       break;
+               }
+       }
+       spin_unlock(&dev_list_lock);
+       return index;
+}
diff --git a/net/d80211/ieee80211_i.h b/net/d80211/ieee80211_i.h
index 0c1eeac..c217104 100644
--- a/net/d80211/ieee80211_i.h
+++ b/net/d80211/ieee80211_i.h
@@ -587,6 +587,7 @@ int ieee80211_sta_disassociate(struct ne
 int ieee80211_dev_alloc_index(struct ieee80211_local *local);
 void ieee80211_dev_free_index(struct ieee80211_local *local);
 struct ieee80211_local *ieee80211_dev_find(int index);
+int ieee80211_dev_find_index(struct ieee80211_local *local);
 
 /* ieee80211_sysfs.c */
 int ieee80211_register_sysfs(struct ieee80211_local *local);
diff --git a/net/d80211/ieee80211_sysfs.c b/net/d80211/ieee80211_sysfs.c
index 6e7d3ea..32fb380 100644
--- a/net/d80211/ieee80211_sysfs.c
+++ b/net/d80211/ieee80211_sysfs.c
@@ -10,6 +10,7 @@ #include <linux/kernel.h>
 #include <linux/device.h>
 #include <linux/if.h>
 #include <linux/interrupt.h>
+#include <linux/netdevice.h>
 #include <linux/rtnetlink.h>
 #include <net/d80211.h>
 #include "ieee80211_i.h"
@@ -124,12 +125,60 @@ void ieee80211_unregister_sysfs(struct i
        class_device_del(&local->class_dev);
 }
 
+static int ieee80211_add_netdevice(struct class_device *cd,
+                                  struct class_interface *cintf)
+{
+       struct net_device *dev = container_of(cd, struct net_device, class_dev);
+       struct ieee80211_local *local = dev->priv;
+
+       if (ieee80211_dev_find_index(local) < 0)
+               return 0;
+       return sysfs_create_link(&cd->kobj, &local->class_dev.kobj, "wiphy");
+}
+
+static void ieee80211_remove_netdevice(struct class_device *cd,
+                                      struct class_interface *cintf)
+{
+       struct net_device *dev = container_of(cd, struct net_device, class_dev);
+       struct ieee80211_local *local = dev->priv;
+
+       if (ieee80211_dev_find_index(local) >= 0)
+               sysfs_remove_link(&cd->kobj, "wiphy");
+}
+
+static struct class_interface ieee80211_wiphy_cintf = {
+       .add = ieee80211_add_netdevice,
+       .remove = ieee80211_remove_netdevice,
+};
+
+/* Adds class interface watching for new network devices and adding "wiphy"
+ * attribute (symlink) to them. */
+static int ieee80211_register_wiphy_cintf(void)
+{
+       ieee80211_wiphy_cintf.class = loopback_dev.class_dev.class;
+       return class_interface_register(&ieee80211_wiphy_cintf);
+}
+
+static void ieee80211_unregister_wiphy_cintf(void)
+{
+       class_interface_unregister(&ieee80211_wiphy_cintf);
+}
+
 int ieee80211_sysfs_init(void)
 {
-       return class_register(&ieee80211_class);
+       int result;
+
+       result = class_register(&ieee80211_class);
+       if (result)
+               return result;
+       result = ieee80211_register_wiphy_cintf();
+       if (result)
+               class_unregister(&ieee80211_class);
+       return result;
 }
 
 void ieee80211_sysfs_deinit(void)
 {
+       ieee80211_unregister_wiphy_cintf();
        class_unregister(&ieee80211_class);
 }
-- 
1.3.0

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to