diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-11-16 03:10:56 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-11-16 03:10:56 +0000 |
commit | 5fe95d1b660bed238f8f53d6c7360f44b5ce9824 (patch) | |
tree | f75dc7eaabf7bd7baacc8cc8440484d88d3666e2 /package/mac80211/src/wireless | |
parent | a4d094be2ac657698039b16163822b8ccd32f0d9 (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/Kconfig | 31 | ||||
-rw-r--r-- | package/mac80211/src/wireless/Makefile | 4 | ||||
-rw-r--r-- | package/mac80211/src/wireless/core.c | 372 | ||||
-rw-r--r-- | package/mac80211/src/wireless/core.h | 81 | ||||
-rw-r--r-- | package/mac80211/src/wireless/nl80211.c | 431 | ||||
-rw-r--r-- | package/mac80211/src/wireless/nl80211.h | 24 | ||||
-rw-r--r-- | package/mac80211/src/wireless/radiotap.c | 261 | ||||
-rw-r--r-- | package/mac80211/src/wireless/sysfs.c | 82 | ||||
-rw-r--r-- | package/mac80211/src/wireless/sysfs.h | 9 |
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 */ |