summaryrefslogtreecommitdiffstats
path: root/package/mac80211/src/wireless
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-11-16 03:10:56 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-11-16 03:10:56 +0000
commit5fe95d1b660bed238f8f53d6c7360f44b5ce9824 (patch)
treef75dc7eaabf7bd7baacc8cc8440484d88d3666e2 /package/mac80211/src/wireless
parenta4d094be2ac657698039b16163822b8ccd32f0d9 (diff)
fix up hostapd for mac80211
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@9554 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211/src/wireless')
-rw-r--r--package/mac80211/src/wireless/Kconfig31
-rw-r--r--package/mac80211/src/wireless/Makefile4
-rw-r--r--package/mac80211/src/wireless/core.c372
-rw-r--r--package/mac80211/src/wireless/core.h81
-rw-r--r--package/mac80211/src/wireless/nl80211.c431
-rw-r--r--package/mac80211/src/wireless/nl80211.h24
-rw-r--r--package/mac80211/src/wireless/radiotap.c261
-rw-r--r--package/mac80211/src/wireless/sysfs.c82
-rw-r--r--package/mac80211/src/wireless/sysfs.h9
9 files changed, 0 insertions, 1295 deletions
diff --git a/package/mac80211/src/wireless/Kconfig b/package/mac80211/src/wireless/Kconfig
deleted file mode 100644
index 6291f13bb..000000000
--- a/package/mac80211/src/wireless/Kconfig
+++ /dev/null
@@ -1,31 +0,0 @@
-config CFG80211
- tristate "Improved wireless configuration API"
-
-config NL80211
- bool "nl80211 new netlink interface support"
- depends CFG80211
- default y
- ---help---
- This option turns on the new netlink interface
- (nl80211) support in cfg80211.
-
- If =n, drivers using mac80211 will be configured via
- wireless extension support provided by that subsystem.
-
- If unsure, say Y.
-
-config WIRELESS_EXT
- bool "Wireless extensions"
- default n
- ---help---
- This option enables the legacy wireless extensions
- (wireless network interface configuration via ioctls.)
-
- Wireless extensions will be replaced by cfg80211 and
- will be required only by legacy drivers that implement
- wireless extension handlers. This option does not
- affect the wireless-extension backward compatibility
- code in cfg80211.
-
- Say N (if you can) unless you know you need wireless
- extensions for external modules.
diff --git a/package/mac80211/src/wireless/Makefile b/package/mac80211/src/wireless/Makefile
deleted file mode 100644
index 5664c2cfd..000000000
--- a/package/mac80211/src/wireless/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-obj-$(CONFIG_CFG80211) += cfg80211.o
-
-cfg80211-y += core.o sysfs.o radiotap.o
-cfg80211-$(CONFIG_NL80211) += nl80211.o
diff --git a/package/mac80211/src/wireless/core.c b/package/mac80211/src/wireless/core.c
deleted file mode 100644
index 35b79bee3..000000000
--- a/package/mac80211/src/wireless/core.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * This is the linux wireless configuration interface.
- *
- * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net>
- */
-
-#include <linux/if.h>
-#include <linux/module.h>
-#include <linux/err.h>
-#include <linux/mutex.h>
-#include <linux/list.h>
-#include <linux/nl80211.h>
-#include <linux/debugfs.h>
-#include <linux/notifier.h>
-#include <linux/device.h>
-#include <net/genetlink.h>
-#include <net/cfg80211.h>
-#include <net/wireless.h>
-#include "nl80211.h"
-#include "core.h"
-#include "sysfs.h"
-
-/* name for sysfs, %d is appended */
-#define PHY_NAME "phy"
-
-MODULE_AUTHOR("Johannes Berg");
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("wireless configuration support");
-
-/* RCU might be appropriate here since we usually
- * only read the list, and that can happen quite
- * often because we need to do it for each command */
-LIST_HEAD(cfg80211_drv_list);
-DEFINE_MUTEX(cfg80211_drv_mutex);
-static int wiphy_counter;
-
-/* for debugfs */
-static struct dentry *ieee80211_debugfs_dir;
-
-/* requires cfg80211_drv_mutex to be held! */
-static struct cfg80211_registered_device *cfg80211_drv_by_wiphy(int wiphy)
-{
- struct cfg80211_registered_device *result = NULL, *drv;
-
- list_for_each_entry(drv, &cfg80211_drv_list, list) {
- if (drv->idx == wiphy) {
- result = drv;
- break;
- }
- }
-
- return result;
-}
-
-/* requires cfg80211_drv_mutex to be held! */
-static struct cfg80211_registered_device *
-__cfg80211_drv_from_info(struct genl_info *info)
-{
- int ifindex;
- struct cfg80211_registered_device *bywiphy = NULL, *byifidx = NULL;
- struct net_device *dev;
- int err = -EINVAL;
-
- if (info->attrs[NL80211_ATTR_WIPHY]) {
- bywiphy = cfg80211_drv_by_wiphy(
- nla_get_u32(info->attrs[NL80211_ATTR_WIPHY]));
- err = -ENODEV;
- }
-
- if (info->attrs[NL80211_ATTR_IFINDEX]) {
- ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
- dev = dev_get_by_index(ifindex);
- if (dev) {
- if (dev->ieee80211_ptr)
- byifidx =
- wiphy_to_dev(dev->ieee80211_ptr->wiphy);
- dev_put(dev);
- }
- err = -ENODEV;
- }
-
- if (bywiphy && byifidx) {
- if (bywiphy != byifidx)
- return ERR_PTR(-EINVAL);
- else
- return bywiphy; /* == byifidx */
- }
- if (bywiphy)
- return bywiphy;
-
- if (byifidx)
- return byifidx;
-
- return ERR_PTR(err);
-}
-
-struct cfg80211_registered_device *
-cfg80211_get_dev_from_info(struct genl_info *info)
-{
- struct cfg80211_registered_device *drv;
-
- mutex_lock(&cfg80211_drv_mutex);
- drv = __cfg80211_drv_from_info(info);
-
- /* if it is not an error we grab the lock on
- * it to assure it won't be going away while
- * we operate on it */
- if (!IS_ERR(drv))
- mutex_lock(&drv->mtx);
-
- mutex_unlock(&cfg80211_drv_mutex);
-
- return drv;
-}
-
-struct cfg80211_registered_device *
-cfg80211_get_dev_from_ifindex(int ifindex)
-{
- struct cfg80211_registered_device *drv = ERR_PTR(-ENODEV);
- struct net_device *dev;
-
- mutex_lock(&cfg80211_drv_mutex);
- dev = dev_get_by_index(ifindex);
- if (!dev)
- goto out;
- if (dev->ieee80211_ptr) {
- drv = wiphy_to_dev(dev->ieee80211_ptr->wiphy);
- mutex_lock(&drv->mtx);
- } else
- drv = ERR_PTR(-ENODEV);
- dev_put(dev);
- out:
- mutex_unlock(&cfg80211_drv_mutex);
- return drv;
-}
-
-void cfg80211_put_dev(struct cfg80211_registered_device *drv)
-{
- BUG_ON(IS_ERR(drv));
- mutex_unlock(&drv->mtx);
-}
-
-int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
- char *newname)
-{
- int idx, taken = -1, result, digits;
-
- /* prohibit calling the thing phy%d when %d is not its number */
- sscanf(newname, PHY_NAME "%d%n", &idx, &taken);
- if (taken == strlen(newname) && idx != rdev->idx) {
- /* count number of places needed to print idx */
- digits = 1;
- while (idx /= 10)
- digits++;
- /*
- * deny the name if it is phy<idx> where <idx> is printed
- * without leading zeroes. taken == strlen(newname) here
- */
- if (taken == strlen(PHY_NAME) + digits)
- return -EINVAL;
- }
-
- /* this will check for collisions */
- result = device_rename(&rdev->wiphy.dev, newname);
- if (result)
- return result;
-
- if (!debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
- rdev->wiphy.debugfsdir,
- rdev->wiphy.debugfsdir->d_parent,
- newname))
- printk(KERN_ERR "cfg80211: failed to rename debugfs dir to %s!\n",
- newname);
-
- nl80211_notify_dev_rename(rdev);
-
- return 0;
-}
-
-/* exported functions */
-
-struct wiphy *wiphy_new(struct cfg80211_ops *ops, int sizeof_priv)
-{
- struct cfg80211_registered_device *drv;
- int alloc_size;
-
- alloc_size = sizeof(*drv) + sizeof_priv;
-
- drv = kzalloc(alloc_size, GFP_KERNEL);
- if (!drv)
- return NULL;
-
- drv->ops = ops;
-
- mutex_lock(&cfg80211_drv_mutex);
-
- drv->idx = wiphy_counter;
-
- /* now increase counter for the next device unless
- * it has wrapped previously */
- if (wiphy_counter >= 0)
- wiphy_counter++;
-
- mutex_unlock(&cfg80211_drv_mutex);
-
- if (unlikely(drv->idx < 0)) {
- /* ugh, wrapped! */
- kfree(drv);
- return NULL;
- }
-
- /* give it a proper name */
- snprintf(drv->wiphy.dev.bus_id, BUS_ID_SIZE,
- PHY_NAME "%d", drv->idx);
-
- mutex_init(&drv->mtx);
- mutex_init(&drv->devlist_mtx);
- INIT_LIST_HEAD(&drv->netdev_list);
-
- device_initialize(&drv->wiphy.dev);
- drv->wiphy.dev.class = &ieee80211_class;
- drv->wiphy.dev.platform_data = drv;
-
- return &drv->wiphy;
-}
-EXPORT_SYMBOL(wiphy_new);
-
-int wiphy_register(struct wiphy *wiphy)
-{
- struct cfg80211_registered_device *drv = wiphy_to_dev(wiphy);
- int res;
-
- mutex_lock(&cfg80211_drv_mutex);
-
- res = device_add(&drv->wiphy.dev);
- if (res)
- goto out_unlock;
-
- list_add(&drv->list, &cfg80211_drv_list);
-
- /* add to debugfs */
- drv->wiphy.debugfsdir =
- debugfs_create_dir(wiphy_name(&drv->wiphy),
- ieee80211_debugfs_dir);
-
- res = 0;
-out_unlock:
- mutex_unlock(&cfg80211_drv_mutex);
- return res;
-}
-EXPORT_SYMBOL(wiphy_register);
-
-void wiphy_unregister(struct wiphy *wiphy)
-{
- struct cfg80211_registered_device *drv = wiphy_to_dev(wiphy);
-
- /* protect the device list */
- mutex_lock(&cfg80211_drv_mutex);
-
- BUG_ON(!list_empty(&drv->netdev_list));
-
- /*
- * Try to grab drv->mtx. If a command is still in progress,
- * hopefully the driver will refuse it since it's tearing
- * down the device already. We wait for this command to complete
- * before unlinking the item from the list.
- * Note: as codified by the BUG_ON above we cannot get here if
- * a virtual interface is still associated. Hence, we can only
- * get to lock contention here if userspace issues a command
- * that identified the hardware by wiphy index.
- */
- mutex_lock(&drv->mtx);
- /* unlock again before freeing */
- mutex_unlock(&drv->mtx);
-
- list_del(&drv->list);
- device_del(&drv->wiphy.dev);
- debugfs_remove(drv->wiphy.debugfsdir);
-
- mutex_unlock(&cfg80211_drv_mutex);
-}
-EXPORT_SYMBOL(wiphy_unregister);
-
-void cfg80211_dev_free(struct cfg80211_registered_device *drv)
-{
- mutex_destroy(&drv->mtx);
- mutex_destroy(&drv->devlist_mtx);
- kfree(drv);
-}
-
-void wiphy_free(struct wiphy *wiphy)
-{
- put_device(&wiphy->dev);
-}
-EXPORT_SYMBOL(wiphy_free);
-
-static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
- unsigned long state,
- void *ndev)
-{
- struct net_device *dev = ndev;
- struct cfg80211_registered_device *rdev;
-
- if (!dev->ieee80211_ptr)
- return 0;
-
- rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy);
-
- switch (state) {
- case NETDEV_REGISTER:
- mutex_lock(&rdev->devlist_mtx);
- list_add(&dev->ieee80211_ptr->list, &rdev->netdev_list);
- if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
- "phy80211")) {
- printk(KERN_ERR "wireless: failed to add phy80211 "
- "symlink to netdev!\n");
- }
- dev->ieee80211_ptr->netdev = dev;
- mutex_unlock(&rdev->devlist_mtx);
- break;
- case NETDEV_UNREGISTER:
- mutex_lock(&rdev->devlist_mtx);
- if (!list_empty(&dev->ieee80211_ptr->list)) {
- sysfs_remove_link(&dev->dev.kobj, "phy80211");
- list_del_init(&dev->ieee80211_ptr->list);
- }
- mutex_unlock(&rdev->devlist_mtx);
- break;
- }
-
- return 0;
-}
-
-static struct notifier_block cfg80211_netdev_notifier = {
- .notifier_call = cfg80211_netdev_notifier_call,
-};
-
-static int cfg80211_init(void)
-{
- int err = wiphy_sysfs_init();
- if (err)
- goto out_fail_sysfs;
-
- err = register_netdevice_notifier(&cfg80211_netdev_notifier);
- if (err)
- goto out_fail_notifier;
-
- err = nl80211_init();
- if (err)
- goto out_fail_nl80211;
-
- ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);
-
- return 0;
-
-out_fail_nl80211:
- unregister_netdevice_notifier(&cfg80211_netdev_notifier);
-out_fail_notifier:
- wiphy_sysfs_exit();
-out_fail_sysfs:
- return err;
-}
-subsys_initcall(cfg80211_init);
-
-static void cfg80211_exit(void)
-{
- debugfs_remove(ieee80211_debugfs_dir);
- nl80211_exit();
- unregister_netdevice_notifier(&cfg80211_netdev_notifier);
- wiphy_sysfs_exit();
-}
-module_exit(cfg80211_exit);
diff --git a/package/mac80211/src/wireless/core.h b/package/mac80211/src/wireless/core.h
deleted file mode 100644
index eb0f846b4..000000000
--- a/package/mac80211/src/wireless/core.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Wireless configuration interface internals.
- *
- * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net>
- */
-#ifndef __NET_WIRELESS_CORE_H
-#define __NET_WIRELESS_CORE_H
-#include <linux/mutex.h>
-#include <linux/list.h>
-#include <linux/netdevice.h>
-#include <net/genetlink.h>
-#include <net/wireless.h>
-#include <net/cfg80211.h>
-
-struct cfg80211_registered_device {
- struct cfg80211_ops *ops;
- struct list_head list;
- /* we hold this mutex during any call so that
- * we cannot do multiple calls at once, and also
- * to avoid the deregister call to proceed while
- * any call is in progress */
- struct mutex mtx;
-
- /* wiphy index, internal only */
- int idx;
-
- /* associate netdev list */
- struct mutex devlist_mtx;
- struct list_head netdev_list;
-
- /* must be last because of the way we do wiphy_priv(),
- * and it should at least be aligned to NETDEV_ALIGN */
- struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN)));
-};
-
-static inline
-struct cfg80211_registered_device *wiphy_to_dev(struct wiphy *wiphy)
-{
- BUG_ON(!wiphy);
- return container_of(wiphy, struct cfg80211_registered_device, wiphy);
-}
-
-extern struct mutex cfg80211_drv_mutex;
-extern struct list_head cfg80211_drv_list;
-
-/*
- * This function returns a pointer to the driver
- * that the genl_info item that is passed refers to.
- * If successful, it returns non-NULL and also locks
- * the driver's mutex!
- *
- * This means that you need to call cfg80211_put_dev()
- * before being allowed to acquire &cfg80211_drv_mutex!
- *
- * This is necessary because we need to lock the global
- * mutex to get an item off the list safely, and then
- * we lock the drv mutex so it doesn't go away under us.
- *
- * We don't want to keep cfg80211_drv_mutex locked
- * for all the time in order to allow requests on
- * other interfaces to go through at the same time.
- *
- * The result of this can be a PTR_ERR and hence must
- * be checked with IS_ERR() for errors.
- */
-extern struct cfg80211_registered_device *
-cfg80211_get_dev_from_info(struct genl_info *info);
-
-/* identical to cfg80211_get_dev_from_info but only operate on ifindex */
-extern struct cfg80211_registered_device *
-cfg80211_get_dev_from_ifindex(int ifindex);
-
-extern void cfg80211_put_dev(struct cfg80211_registered_device *drv);
-
-/* free object */
-extern void cfg80211_dev_free(struct cfg80211_registered_device *drv);
-
-extern int cfg80211_dev_rename(struct cfg80211_registered_device *drv,
- char *newname);
-
-#endif /* __NET_WIRELESS_CORE_H */
diff --git a/package/mac80211/src/wireless/nl80211.c b/package/mac80211/src/wireless/nl80211.c
deleted file mode 100644
index 58717f303..000000000
--- a/package/mac80211/src/wireless/nl80211.c
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * This is the new netlink-based wireless configuration interface.
- *
- * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net>
- */
-
-#include <linux/if.h>
-#include <linux/module.h>
-#include <linux/err.h>
-#include <linux/mutex.h>
-#include <linux/list.h>
-#include <linux/if_ether.h>
-#include <linux/ieee80211.h>
-#include <linux/nl80211.h>
-#include <linux/rtnetlink.h>
-#include <linux/netlink.h>
-#include <net/genetlink.h>
-#include <net/cfg80211.h>
-#include "core.h"
-#include "nl80211.h"
-
-/* the netlink family */
-static struct genl_family nl80211_fam = {
- .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */
- .name = "nl80211", /* have users key off the name instead */
- .hdrsize = 0, /* no private header */
- .version = 1, /* no particular meaning now */
- .maxattr = NL80211_ATTR_MAX,
-};
-
-/* internal helper: get drv and dev */
-static int get_drv_dev_by_info_ifindex(struct genl_info *info,
- struct cfg80211_registered_device **drv,
- struct net_device **dev)
-{
- int ifindex;
-
- if (!info->attrs[NL80211_ATTR_IFINDEX])
- return -EINVAL;
-
- ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
- *dev = dev_get_by_index(ifindex);
- if (!*dev)
- return -ENODEV;
-
- *drv = cfg80211_get_dev_from_ifindex(ifindex);
- if (IS_ERR(*drv)) {
- dev_put(*dev);
- return PTR_ERR(*drv);
- }
-
- return 0;
-}
-
-/* policy for the attributes */
-static struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] __read_mostly = {
- [NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
- [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING,
- .len = BUS_ID_SIZE-1 },
-
- [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 },
- [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
- [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
-};
-
-/* message building helper */
-static inline void *nl80211hdr_put(struct sk_buff *skb, u32 pid, u32 seq,
- int flags, u8 cmd)
-{
- /* since there is no private header just add the generic one */
- return genlmsg_put(skb, pid, seq, &nl80211_fam, flags, cmd);
-}
-
-/* netlink command implementations */
-
-static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
- struct cfg80211_registered_device *dev)
-{
- void *hdr;
-
- hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_WIPHY);
- if (!hdr)
- return -1;
-
- NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, dev->idx);
- NLA_PUT_STRING(msg, NL80211_ATTR_WIPHY_NAME, wiphy_name(&dev->wiphy));
- return genlmsg_end(msg, hdr);
-
- nla_put_failure:
- return genlmsg_cancel(msg, hdr);
-}
-
-static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb)
-{
- int idx = 0;
- int start = cb->args[0];
- struct cfg80211_registered_device *dev;
-
- mutex_lock(&cfg80211_drv_mutex);
- list_for_each_entry(dev, &cfg80211_drv_list, list) {
- if (++idx < start)
- continue;
- if (nl80211_send_wiphy(skb, NETLINK_CB(cb->skb).pid,
- cb->nlh->nlmsg_seq, NLM_F_MULTI,
- dev) < 0)
- break;
- }
- mutex_unlock(&cfg80211_drv_mutex);
-
- cb->args[0] = idx;
-
- return skb->len;
-}
-
-static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
-{
- struct sk_buff *msg;
- struct cfg80211_registered_device *dev;
-
- dev = cfg80211_get_dev_from_info(info);
- if (IS_ERR(dev))
- return PTR_ERR(dev);
-
- msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
- if (!msg)
- goto out_err;
-
- if (nl80211_send_wiphy(msg, info->snd_pid, info->snd_seq, 0, dev) < 0)
- goto out_free;
-
- cfg80211_put_dev(dev);
-
- return genlmsg_unicast(msg, info->snd_pid);
-
- out_free:
- nlmsg_free(msg);
- out_err:
- cfg80211_put_dev(dev);
- return -ENOBUFS;
-}
-
-static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
-{
- struct cfg80211_registered_device *rdev;
- int result;
-
- if (!info->attrs[NL80211_ATTR_WIPHY_NAME])
- return -EINVAL;
-
- rdev = cfg80211_get_dev_from_info(info);
- if (IS_ERR(rdev))
- return PTR_ERR(rdev);
-
- result = cfg80211_dev_rename(rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
-
- cfg80211_put_dev(rdev);
- return result;
-}
-
-
-static int nl80211_send_iface(struct sk_buff *msg, u32 pid, u32 seq, int flags,
- struct net_device *dev)
-{
- void *hdr;
-
- hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_INTERFACE);
- if (!hdr)
- return -1;
-
- NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex);
- NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, dev->name);
- /* TODO: interface type */
- return genlmsg_end(msg, hdr);
-
- nla_put_failure:
- return genlmsg_cancel(msg, hdr);
-}
-
-static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb)
-{
- int wp_idx = 0;
- int if_idx = 0;
- int wp_start = cb->args[0];
- int if_start = cb->args[1];
- struct cfg80211_registered_device *dev;
- struct wireless_dev *wdev;
-
- mutex_lock(&cfg80211_drv_mutex);
- list_for_each_entry(dev, &cfg80211_drv_list, list) {
- if (++wp_idx < wp_start)
- continue;
- if_idx = 0;
-
- mutex_lock(&dev->devlist_mtx);
- list_for_each_entry(wdev, &dev->netdev_list, list) {
- if (++if_idx < if_start)
- continue;
- if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).pid,
- cb->nlh->nlmsg_seq, NLM_F_MULTI,
- wdev->netdev) < 0)
- break;
- }
- mutex_unlock(&dev->devlist_mtx);
- }
- mutex_unlock(&cfg80211_drv_mutex);
-
- cb->args[0] = wp_idx;
- cb->args[1] = if_idx;
-
- return skb->len;
-}
-
-static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
-{
- struct sk_buff *msg;
- struct cfg80211_registered_device *dev;
- struct net_device *netdev;
- int err;
-
- err = get_drv_dev_by_info_ifindex(info, &dev, &netdev);
- if (err)
- return err;
-
- msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
- if (!msg)
- goto out_err;
-
- if (nl80211_send_iface(msg, info->snd_pid, info->snd_seq, 0, netdev) < 0)
- goto out_free;
-
- dev_put(netdev);
- cfg80211_put_dev(dev);
-
- return genlmsg_unicast(msg, info->snd_pid);
-
- out_free:
- nlmsg_free(msg);
- out_err:
- dev_put(netdev);
- cfg80211_put_dev(dev);
- return -ENOBUFS;
-}
-
-static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
-{
- struct cfg80211_registered_device *drv;
- int err, ifindex;
- enum nl80211_iftype type;
- struct net_device *dev;
-
- if (info->attrs[NL80211_ATTR_IFTYPE]) {
- type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
- if (type > NL80211_IFTYPE_MAX)
- return -EINVAL;
- } else
- return -EINVAL;
-
- err = get_drv_dev_by_info_ifindex(info, &drv, &dev);
- if (err)
- return err;
- ifindex = dev->ifindex;
- dev_put(dev);
-
- if (!drv->ops->change_virtual_intf) {
- err = -EOPNOTSUPP;
- goto unlock;
- }
-
- rtnl_lock();
- err = drv->ops->change_virtual_intf(&drv->wiphy, ifindex, type);
- rtnl_unlock();
-
- unlock:
- cfg80211_put_dev(drv);
- return err;
-}
-
-static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
-{
- struct cfg80211_registered_device *drv;
- int err;
- enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
-
- if (!info->attrs[NL80211_ATTR_IFNAME])
- return -EINVAL;
-
- if (info->attrs[NL80211_ATTR_IFTYPE]) {
- type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
- if (type > NL80211_IFTYPE_MAX)
- return -EINVAL;
- }
-
- drv = cfg80211_get_dev_from_info(info);
- if (IS_ERR(drv))
- return PTR_ERR(drv);
-
- if (!drv->ops->add_virtual_intf) {
- err = -EOPNOTSUPP;
- goto unlock;
- }
-
- rtnl_lock();
- err = drv->ops->add_virtual_intf(&drv->wiphy,
- nla_data(info->attrs[NL80211_ATTR_IFNAME]), type);
- rtnl_unlock();
-
- unlock:
- cfg80211_put_dev(drv);
- return err;
-}
-
-static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
-{
- struct cfg80211_registered_device *drv;
- int ifindex, err;
- struct net_device *dev;
-
- err = get_drv_dev_by_info_ifindex(info, &drv, &dev);
- if (err)
- return err;
- ifindex = dev->ifindex;
- dev_put(dev);
-
- if (!drv->ops->del_virtual_intf) {
- err = -EOPNOTSUPP;
- goto out;
- }
-
- rtnl_lock();
- err = drv->ops->del_virtual_intf(&drv->wiphy, ifindex);
- rtnl_unlock();
-
- out:
- cfg80211_put_dev(drv);
- return err;
-}
-
-static struct genl_ops nl80211_ops[] = {
- {
- .cmd = NL80211_CMD_GET_WIPHY,
- .doit = nl80211_get_wiphy,
- .dumpit = nl80211_dump_wiphy,
- .policy = nl80211_policy,
- /* can be retrieved by unprivileged users */
- },
- {
- .cmd = NL80211_CMD_SET_WIPHY,
- .doit = nl80211_set_wiphy,
- .policy = nl80211_policy,
- .flags = GENL_ADMIN_PERM,
- },
- {
- .cmd = NL80211_CMD_GET_INTERFACE,
- .doit = nl80211_get_interface,
- .dumpit = nl80211_dump_interface,
- .policy = nl80211_policy,
- /* can be retrieved by unprivileged users */
- },
- {
- .cmd = NL80211_CMD_SET_INTERFACE,
- .doit = nl80211_set_interface,
- .policy = nl80211_policy,
- .flags = GENL_ADMIN_PERM,
- },
- {
- .cmd = NL80211_CMD_NEW_INTERFACE,
- .doit = nl80211_new_interface,
- .policy = nl80211_policy,
- .flags = GENL_ADMIN_PERM,
- },
- {
- .cmd = NL80211_CMD_DEL_INTERFACE,
- .doit = nl80211_del_interface,
- .policy = nl80211_policy,
- .flags = GENL_ADMIN_PERM,
- },
-};
-
-/* multicast groups */
-static struct genl_multicast_group nl80211_config_mcgrp = {
- .name = "config",
-};
-
-/* notification functions */
-
-void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev)
-{
- struct sk_buff *msg;
-
- msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
- if (!msg)
- return;
-
- if (nl80211_send_wiphy(msg, 0, 0, 0, rdev) < 0) {
- nlmsg_free(msg);
- return;
- }
-
- genlmsg_multicast(msg, 0, nl80211_config_mcgrp.id, GFP_KERNEL);
-}
-
-/* initialisation/exit functions */
-
-int nl80211_init(void)
-{
- int err, i;
-
- err = genl_register_family(&nl80211_fam);
- if (err)
- return err;
-
- for (i = 0; i < ARRAY_SIZE(nl80211_ops); i++) {
- err = genl_register_ops(&nl80211_fam, &nl80211_ops[i]);
- if (err)
- goto err_out;
- }
-
- err = genl_register_mc_group(&nl80211_fam, &nl80211_config_mcgrp);
- if (err)
- goto err_out;
-
- return 0;
- err_out:
- genl_unregister_family(&nl80211_fam);
- return err;
-}
-
-void nl80211_exit(void)
-{
- genl_unregister_family(&nl80211_fam);
-}
diff --git a/package/mac80211/src/wireless/nl80211.h b/package/mac80211/src/wireless/nl80211.h
deleted file mode 100644
index f3ea5c029..000000000
--- a/package/mac80211/src/wireless/nl80211.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __NET_WIRELESS_NL80211_H
-#define __NET_WIRELESS_NL80211_H
-
-#include "core.h"
-
-#ifdef CONFIG_NL80211
-extern int nl80211_init(void);
-extern void nl80211_exit(void);
-extern void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev);
-#else
-static inline int nl80211_init(void)
-{
- return 0;
-}
-static inline void nl80211_exit(void)
-{
-}
-static inline void nl80211_notify_dev_rename(
- struct cfg80211_registered_device *rdev)
-{
-}
-#endif /* CONFIG_NL80211 */
-
-#endif /* __NET_WIRELESS_NL80211_H */
diff --git a/package/mac80211/src/wireless/radiotap.c b/package/mac80211/src/wireless/radiotap.c
deleted file mode 100644
index 28fbd0b0b..000000000
--- a/package/mac80211/src/wireless/radiotap.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Radiotap parser
- *
- * Copyright 2007 Andy Green <andy@warmcat.com>
- */
-
-#include <net/cfg80211.h>
-#include <net/ieee80211_radiotap.h>
-#include <asm/unaligned.h>
-
-/* function prototypes and related defs are in include/net/cfg80211.h */
-
-/**
- * ieee80211_radiotap_iterator_init - radiotap parser iterator initialization
- * @iterator: radiotap_iterator to initialize
- * @radiotap_header: radiotap header to parse
- * @max_length: total length we can parse into (eg, whole packet length)
- *
- * Returns: 0 or a negative error code if there is a problem.
- *
- * This function initializes an opaque iterator struct which can then
- * be passed to ieee80211_radiotap_iterator_next() to visit every radiotap
- * argument which is present in the header. It knows about extended
- * present headers and handles them.
- *
- * How to use:
- * call __ieee80211_radiotap_iterator_init() to init a semi-opaque iterator
- * struct ieee80211_radiotap_iterator (no need to init the struct beforehand)
- * checking for a good 0 return code. Then loop calling
- * __ieee80211_radiotap_iterator_next()... it returns either 0,
- * -ENOENT if there are no more args to parse, or -EINVAL if there is a problem.
- * The iterator's @this_arg member points to the start of the argument
- * associated with the current argument index that is present, which can be
- * found in the iterator's @this_arg_index member. This arg index corresponds
- * to the IEEE80211_RADIOTAP_... defines.
- *
- * Radiotap header length:
- * You can find the CPU-endian total radiotap header length in
- * iterator->max_length after executing ieee80211_radiotap_iterator_init()
- * successfully.
- *
- * Alignment Gotcha:
- * You must take care when dereferencing iterator.this_arg
- * for multibyte types... the pointer is not aligned. Use
- * get_unaligned((type *)iterator.this_arg) to dereference
- * iterator.this_arg for type "type" safely on all arches.
- *
- * Example code:
- * See Documentation/networking/radiotap-headers.txt
- */
-
-int ieee80211_radiotap_iterator_init(
- struct ieee80211_radiotap_iterator *iterator,
- struct ieee80211_radiotap_header *radiotap_header,
- int max_length)
-{
- /* Linux only supports version 0 radiotap format */
- if (radiotap_header->it_version)
- return -EINVAL;
-
- /* sanity check for allowed length and radiotap length field */
- if (max_length < le16_to_cpu(get_unaligned(&radiotap_header->it_len)))
- return -EINVAL;
-
- iterator->rtheader = radiotap_header;
- iterator->max_length = le16_to_cpu(get_unaligned(
- &radiotap_header->it_len));
- iterator->arg_index = 0;
- iterator->bitmap_shifter = le32_to_cpu(get_unaligned(
- &radiotap_header->it_present));
- iterator->arg = (u8 *)radiotap_header + sizeof(*radiotap_header);
- iterator->this_arg = NULL;
-
- /* find payload start allowing for extended bitmap(s) */
-
- if (unlikely(iterator->bitmap_shifter & (1<<IEEE80211_RADIOTAP_EXT))) {
- while (le32_to_cpu(get_unaligned((__le32 *)iterator->arg)) &
- (1<<IEEE80211_RADIOTAP_EXT)) {
- iterator->arg += sizeof(u32);
-
- /*
- * check for insanity where the present bitmaps
- * keep claiming to extend up to or even beyond the
- * stated radiotap header length
- */
-
- if (((ulong)iterator->arg -
- (ulong)iterator->rtheader) > iterator->max_length)
- return -EINVAL;
- }
-
- iterator->arg += sizeof(u32);
-
- /*
- * no need to check again for blowing past stated radiotap
- * header length, because ieee80211_radiotap_iterator_next
- * checks it before it is dereferenced
- */
- }
-
- /* we are all initialized happily */
-
- return 0;
-}
-EXPORT_SYMBOL(ieee80211_radiotap_iterator_init);
-
-
-/**
- * ieee80211_radiotap_iterator_next - return next radiotap parser iterator arg
- * @iterator: radiotap_iterator to move to next arg (if any)
- *
- * Returns: 0 if there is an argument to handle,
- * -ENOENT if there are no more args or -EINVAL
- * if there is something else wrong.
- *
- * This function provides the next radiotap arg index (IEEE80211_RADIOTAP_*)
- * in @this_arg_index and sets @this_arg to point to the
- * payload for the field. It takes care of alignment handling and extended
- * present fields. @this_arg can be changed by the caller (eg,
- * incremented to move inside a compound argument like
- * IEEE80211_RADIOTAP_CHANNEL). The args pointed to are in
- * little-endian format whatever the endianess of your CPU.
- *
- * Alignment Gotcha:
- * You must take care when dereferencing iterator.this_arg
- * for multibyte types... the pointer is not aligned. Use
- * get_unaligned((type *)iterator.this_arg) to dereference
- * iterator.this_arg for type "type" safely on all arches.
- */
-
-int ieee80211_radiotap_iterator_next(
- struct ieee80211_radiotap_iterator *iterator)
-{
-
- /*
- * small length lookup table for all radiotap types we heard of
- * starting from b0 in the bitmap, so we can walk the payload
- * area of the radiotap header
- *
- * There is a requirement to pad args, so that args
- * of a given length must begin at a boundary of that length
- * -- but note that compound args are allowed (eg, 2 x u16
- * for IEEE80211_RADIOTAP_CHANNEL) so total arg length is not
- * a reliable indicator of alignment requirement.
- *
- * upper nybble: content alignment for arg
- * lower nybble: content length for arg
- */
-
- static const u8 rt_sizes[] = {
- [IEEE80211_RADIOTAP_TSFT] = 0x88,
- [IEEE80211_RADIOTAP_FLAGS] = 0x11,
- [IEEE80211_RADIOTAP_RATE] = 0x11,
- [IEEE80211_RADIOTAP_CHANNEL] = 0x24,
- [IEEE80211_RADIOTAP_FHSS] = 0x22,
- [IEEE80211_RADIOTAP_DBM_ANTSIGNAL] = 0x11,
- [IEEE80211_RADIOTAP_DBM_ANTNOISE] = 0x11,
- [IEEE80211_RADIOTAP_LOCK_QUALITY] = 0x22,
- [IEEE80211_RADIOTAP_TX_ATTENUATION] = 0x22,
- [IEEE80211_RADIOTAP_DB_TX_ATTENUATION] = 0x22,
- [IEEE80211_RADIOTAP_DBM_TX_POWER] = 0x11,
- [IEEE80211_RADIOTAP_ANTENNA] = 0x11,
- [IEEE80211_RADIOTAP_DB_ANTSIGNAL] = 0x11,
- [IEEE80211_RADIOTAP_DB_ANTNOISE] = 0x11,
- [IEEE80211_RADIOTAP_RX_FLAGS] = 0x22,
- [IEEE80211_RADIOTAP_TX_FLAGS] = 0x22,
- [IEEE80211_RADIOTAP_RTS_RETRIES] = 0x11,
- [IEEE80211_RADIOTAP_DATA_RETRIES] = 0x11,
- /*
- * add more here as they are defined in
- * include/net/ieee80211_radiotap.h
- */
- };
-
- /*
- * for every radiotap entry we can at
- * least skip (by knowing the length)...
- */
-
- while (iterator->arg_index < sizeof(rt_sizes)) {
- int hit = 0;
- int pad;
-
- if (!(iterator->bitmap_shifter & 1))
- goto next_entry; /* arg not present */
-
- /*
- * arg is present, account for alignment padding
- * 8-bit args can be at any alignment
- * 16-bit args must start on 16-bit boundary
- * 32-bit args must start on 32-bit boundary
- * 64-bit args must start on 64-bit boundary
- *
- * note that total arg size can differ from alignment of
- * elements inside arg, so we use upper nybble of length
- * table to base alignment on
- *
- * also note: these alignments are ** relative to the
- * start of the radiotap header **. There is no guarantee
- * that the radiotap header itself is aligned on any
- * kind of boundary.
- *
- * the above is why get_unaligned() is used to dereference
- * multibyte elements from the radiotap area
- */
-
- pad = (((ulong)iterator->arg) -
- ((ulong)iterator->rtheader)) &
- ((rt_sizes[iterator->arg_index] >> 4) - 1);
-
- if (pad)
- iterator->arg +=
- (rt_sizes[iterator->arg_index] >> 4) - pad;
-
- /*
- * this is what we will return to user, but we need to
- * move on first so next call has something fresh to test
- */
- iterator->this_arg_index = iterator->arg_index;
- iterator->this_arg = iterator->arg;
- hit = 1;
-
- /* internally move on the size of this arg */
- iterator->arg += rt_sizes[iterator->arg_index] & 0x0f;
-
- /*
- * check for insanity where we are given a bitmap that
- * claims to have more arg content than the length of the
- * radiotap section. We will normally end up equalling this
- * max_length on the last arg, never exceeding it.
- */
-
- if (((ulong)iterator->arg - (ulong)iterator->rtheader) >
- iterator->max_length)
- return -EINVAL;
-
- next_entry:
- iterator->arg_index++;
- if (unlikely((iterator->arg_index & 31) == 0)) {
- /* completed current u32 bitmap */
- if (iterator->bitmap_shifter & 1) {
- /* b31 was set, there is more */
- /* move to next u32 bitmap */
- iterator->bitmap_shifter = le32_to_cpu(
- get_unaligned(iterator->next_bitmap));
- iterator->next_bitmap++;
- } else
- /* no more bitmaps: end */
- iterator->arg_index = sizeof(rt_sizes);
- } else /* just try the next bit */
- iterator->bitmap_shifter >>= 1;
-
- /* if we found a valid arg earlier, return it now */
- if (hit)
- return 0;
- }
-
- /* we don't know how to handle any more args, we're done */
- return -ENOENT;
-}
-EXPORT_SYMBOL(ieee80211_radiotap_iterator_next);
diff --git a/package/mac80211/src/wireless/sysfs.c b/package/mac80211/src/wireless/sysfs.c
deleted file mode 100644
index 2d5d2255a..000000000
--- a/package/mac80211/src/wireless/sysfs.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * This file provides /sys/class/ieee80211/<wiphy name>/
- * and some default attributes.
- *
- * Copyright 2005-2006 Jiri Benc <jbenc@suse.cz>
- * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
- *
- * This file is GPLv2 as found in COPYING.
- */
-
-#include <linux/device.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/nl80211.h>
-#include <linux/rtnetlink.h>
-#include <net/cfg80211.h>
-#include "sysfs.h"
-#include "core.h"
-
-static inline struct cfg80211_registered_device *dev_to_rdev(
- struct device *dev)
-{
- return container_of(dev, struct cfg80211_registered_device, wiphy.dev);
-}
-
-static ssize_t _show_index(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- return sprintf(buf, "%d\n", dev_to_rdev(dev)->idx);
-}
-
-static ssize_t _show_permaddr(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- unsigned char *addr = dev_to_rdev(dev)->wiphy.perm_addr;
-
- return sprintf(buf, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
- addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
-}
-
-static struct device_attribute ieee80211_dev_attrs[] = {
- __ATTR(index, S_IRUGO, _show_index, NULL),
- __ATTR(macaddress, S_IRUGO, _show_permaddr, NULL),
- {}
-};
-
-static void wiphy_dev_release(struct device *dev)
-{
- struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
-
- cfg80211_dev_free(rdev);
-}
-
-#ifdef CONFIG_HOTPLUG
-static int wiphy_uevent(struct device *dev, char **envp,
- int num_envp, char *buf, int size)
-{
- /* TODO, we probably need stuff here */
- return 0;
-}
-#endif
-
-struct class ieee80211_class = {
- .name = "ieee80211",
- .owner = THIS_MODULE,
- .dev_release = wiphy_dev_release,
- .dev_attrs = ieee80211_dev_attrs,
-#ifdef CONFIG_HOTPLUG
- .dev_uevent = wiphy_uevent,
-#endif
-};
-
-int wiphy_sysfs_init(void)
-{
- return class_register(&ieee80211_class);
-}
-
-void wiphy_sysfs_exit(void)
-{
- class_unregister(&ieee80211_class);
-}
diff --git a/package/mac80211/src/wireless/sysfs.h b/package/mac80211/src/wireless/sysfs.h
deleted file mode 100644
index 65acbebd3..000000000
--- a/package/mac80211/src/wireless/sysfs.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __WIRELESS_SYSFS_H
-#define __WIRELESS_SYSFS_H
-
-extern int wiphy_sysfs_init(void);
-extern void wiphy_sysfs_exit(void);
-
-extern struct class ieee80211_class;
-
-#endif /* __WIRELESS_SYSFS_H */