This patch moves everything except the "sta" directory from the phy
sysfs to phy debugfs.
Signed-off-by: Johannes Berg <[email protected]>
---
This one doesn't conflict with Michael Wu's patch series as he only
touched sysfs_sta.c and this doesn't change those entries yet.
net/mac80211/Makefile | 1
net/mac80211/debugfs.c | 411 +++++++++++++++++++++++++++++++++++++++++
net/mac80211/debugfs.h | 15 +
net/mac80211/ieee80211.c | 20 -
net/mac80211/ieee80211_i.h | 62 ++++++
net/mac80211/ieee80211_rate.h | 15 -
net/mac80211/ieee80211_sysfs.c | 375 -------------------------------------
net/mac80211/ieee80211_sysfs.h | 2
8 files changed, 493 insertions(+), 408 deletions(-)
--- wireless-dev.orig/net/mac80211/Makefile 2007-03-01 17:21:51.384246483 +0100
+++ wireless-dev/net/mac80211/Makefile 2007-03-01 17:57:40.930933419 +0100
@@ -1,6 +1,7 @@
obj-$(CONFIG_MAC80211) += mac80211.o rc80211_simple.o
mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o
+mac80211-objs-$(CONFIG_DEBUG_FS) += debugfs.o
mac80211-objs := \
ieee80211.o \
--- wireless-dev.orig/net/mac80211/ieee80211.c 2007-03-01 17:23:02.304246483 +0100
+++ wireless-dev/net/mac80211/ieee80211.c 2007-03-01 18:05:56.370933419 +0100
@@ -34,6 +34,7 @@
#include "ieee80211_led.h"
#include "ieee80211_cfg.h"
#include "ieee80211_sysfs.h"
+#include "debugfs.h"
/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
@@ -4444,7 +4445,6 @@ int ieee80211_init_rate_ctrl_alg(struct
const char *name)
{
struct rate_control_ref *ref, *old;
- int res;
ASSERT_RTNL();
if (local->open_count || netif_running(local->mdev) ||
@@ -4457,18 +4457,10 @@ int ieee80211_init_rate_ctrl_alg(struct
"algorithm\n", local->mdev->name);
return -ENOENT;
}
- res = rate_control_add_attrs(ref, &local->hw.wiphy->dev.kobj);
- if (res < 0) {
- printk(KERN_DEBUG "%s: Failed to register sysfs attributes "
- "for rate control\n", local->mdev->name);
- rate_control_put(ref);
- return res;
- }
old = local->rate_ctrl;
local->rate_ctrl = ref;
if (old) {
- rate_control_remove_attrs(ref, &local->hw.wiphy->dev.kobj);
rate_control_put(old);
sta_info_flush(local, NULL);
}
@@ -4487,7 +4479,6 @@ static void rate_control_deinitialize(st
ref = local->rate_ctrl;
local->rate_ctrl = NULL;
- rate_control_remove_attrs(ref, &local->hw.wiphy->dev.kobj);
rate_control_put(ref);
}
@@ -4622,9 +4613,7 @@ int ieee80211_register_hw(struct ieee802
if (result < 0)
return result;
- result = ieee80211_dev_sysfs_add(local);
- if (result < 0)
- goto fail_sysfs;
+ debugfs_hw_add(local);
local->hw.conf.beacon_int = 1000;
@@ -4703,8 +4692,7 @@ fail_if_sysfs:
fail_dev:
sta_info_stop(local);
fail_sta_info:
- ieee80211_dev_sysfs_del(local);
-fail_sysfs:
+ debugfs_hw_del(local);
wiphy_unregister(local->hw.wiphy);
return result;
}
@@ -4777,7 +4765,7 @@ void ieee80211_unregister_hw(struct ieee
ieee80211_clear_tx_pending(local);
sta_info_stop(local);
rate_control_deinitialize(local);
- ieee80211_dev_sysfs_del(local);
+ debugfs_hw_del(local);
for (i = 0; i < NUM_IEEE80211_MODES; i++) {
kfree(local->supp_rates[i]);
--- wireless-dev.orig/net/mac80211/ieee80211_rate.h 2007-03-01 17:25:54.984246483 +0100
+++ wireless-dev/net/mac80211/ieee80211_rate.h 2007-03-01 17:26:02.444246483 +0100
@@ -123,21 +123,6 @@ static inline void rate_control_free_sta
ref->ops->free_sta(ref->priv, priv);
}
-static inline int rate_control_add_attrs(struct rate_control_ref *ref,
- struct kobject *kobj)
-{
- if (ref->ops->add_attrs)
- return ref->ops->add_attrs(ref->priv, kobj);
- return 0;
-}
-
-static inline void rate_control_remove_attrs(struct rate_control_ref *ref,
- struct kobject *kobj)
-{
- if (ref->ops->remove_attrs)
- ref->ops->remove_attrs(ref->priv, kobj);
-}
-
static inline int rate_control_add_sta_attrs(struct sta_info *sta,
struct kobject *kobj)
{
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ wireless-dev/net/mac80211/debugfs.h 2007-03-01 18:06:14.350933419 +0100
@@ -0,0 +1,15 @@
+#ifndef __MAC80211_DEBUGFS_H
+#define __MAC80211_DEBUGFS_H
+
+#ifdef CONFIG_DEBUG_FS
+extern void debugfs_hw_add(struct ieee80211_local *local);
+extern void debugfs_hw_del(struct ieee80211_local *local);
+#else
+static inline void debugfs_hw_add(struct ieee80211_local *local)
+{
+ return 0;
+}
+static inline void debugfs_hw_del(struct ieee80211_local *local) {}
+#endif
+
+#endif /* __MAC80211_DEBUGFS_H */
--- wireless-dev.orig/net/mac80211/ieee80211_sysfs.c 2007-03-01 17:27:25.674246483 +0100
+++ wireless-dev/net/mac80211/ieee80211_sysfs.c 2007-03-01 19:18:29.310933419 +0100
@@ -34,334 +34,6 @@ static inline int rtnl_lock_local(struct
return 0;
}
-static const char *ieee80211_mode_str_short(int mode)
-{
- switch (mode) {
- case MODE_IEEE80211A:
- return "802.11a";
- case MODE_IEEE80211B:
- return "802.11b";
- case MODE_IEEE80211G:
- return "802.11g";
- case MODE_ATHEROS_TURBO:
- return "AtherosTurbo";
- default:
- return "UNKNOWN";
- }
-}
-
-static const char *ieee80211_mode_str(int mode)
-{
- switch (mode) {
- case MODE_IEEE80211A:
- return "IEEE 802.11a";
- case MODE_IEEE80211B:
- return "IEEE 802.11b";
- case MODE_IEEE80211G:
- return "IEEE 802.11g";
- case MODE_ATHEROS_TURBO:
- return "Atheros Turbo (5 GHz)";
- default:
- return "UNKNOWN";
- }
-}
-
-/* attributes in /sys/class/ieee80211/phyX/ */
-
-static ssize_t store_rate_ctrl_alg(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t len)
-{
- struct ieee80211_local *local = to_ieee80211_local(dev);
- int res;
-
- if (!capable(CAP_NET_ADMIN))
- return -EPERM;
- res = rtnl_lock_local(local);
- if (res)
- return res;
- res = ieee80211_init_rate_ctrl_alg(local, buf);
- rtnl_unlock();
- return res < 0 ? res : len;
-}
-
-static ssize_t ieee80211_local_show(
- struct device *dev,
- struct device_attribute *attr,
- char *buf,
- ssize_t (*format)(struct ieee80211_local *, char *))
-{
- struct ieee80211_local *local = to_ieee80211_local(dev);
- ssize_t ret = -EINVAL;
-
- if (local->reg_state == IEEE80211_DEV_REGISTERED)
- ret = (*format)(local, buf);
- return ret;
-}
-
-#define IEEE80211_LOCAL_FMT(name, field, format_string) \
-static ssize_t ieee80211_local_fmt_##name(struct ieee80211_local *local,\
- char *buf) \
-{ \
- return sprintf(buf, format_string, local->field); \
-}
-
-#define __IEEE80211_LOCAL_SHOW(name) \
-static ssize_t ieee80211_local_show_##name(struct device *dev, \
- struct device_attribute *attr,\
- char *buf) \
-{ \
- return ieee80211_local_show(dev, attr, buf, \
- ieee80211_local_fmt_##name); \
-}
-
-#define IEEE80211_LOCAL_SHOW(name, field, format) \
- IEEE80211_LOCAL_FMT(name, field, format "\n") \
- __IEEE80211_LOCAL_SHOW(name)
-
-IEEE80211_LOCAL_SHOW(channel, hw.conf.channel, "%d");
-IEEE80211_LOCAL_SHOW(frequency, hw.conf.freq, "%d");
-IEEE80211_LOCAL_SHOW(radar_detect, hw.conf.radar_detect, "%d");
-IEEE80211_LOCAL_SHOW(antenna_sel_tx, hw.conf.antenna_sel_tx, "%d");
-IEEE80211_LOCAL_SHOW(antenna_sel_rx, hw.conf.antenna_sel_rx, "%d");
-IEEE80211_LOCAL_SHOW(bridge_packets, bridge_packets, "%d");
-IEEE80211_LOCAL_SHOW(key_tx_rx_threshold, key_tx_rx_threshold, "%d");
-IEEE80211_LOCAL_SHOW(rts_threshold, rts_threshold, "%d");
-IEEE80211_LOCAL_SHOW(fragmentation_threshold, fragmentation_threshold, "%d");
-IEEE80211_LOCAL_SHOW(short_retry_limit, short_retry_limit, "%d");
-IEEE80211_LOCAL_SHOW(long_retry_limit, long_retry_limit, "%d");
-IEEE80211_LOCAL_SHOW(total_ps_buffered, total_ps_buffered, "%d");
-
-static ssize_t ieee80211_local_fmt_mode(struct ieee80211_local *local,
- char *buf)
-{
- return sprintf(buf, "%s\n", ieee80211_mode_str(local->hw.conf.phymode));
-}
-__IEEE80211_LOCAL_SHOW(mode);
-
-static ssize_t ieee80211_local_fmt_wep_iv(struct ieee80211_local *local,
- char *buf)
-{
- return sprintf(buf, "%#06x\n", local->wep_iv & 0xffffff);
-}
-__IEEE80211_LOCAL_SHOW(wep_iv);
-
-static ssize_t ieee80211_local_fmt_tx_power_reduction(struct ieee80211_local
- *local, char *buf)
-{
- short tx_power_reduction = local->hw.conf.tx_power_reduction;
-
- return sprintf(buf, "%d.%d dBm\n", tx_power_reduction / 10,
- tx_power_reduction % 10);
-}
-__IEEE80211_LOCAL_SHOW(tx_power_reduction);
-
-static ssize_t ieee80211_local_fmt_modes(struct ieee80211_local *local,
- char *buf)
-{
- struct ieee80211_hw_mode *mode;
- char *p = buf;
-
- /* FIXME: Locking? Could register a mode in the meantime. */
- list_for_each_entry(mode, &local->modes_list, list)
- p += sprintf(p, "%s\n", ieee80211_mode_str_short(mode->mode));
-
- return (p - buf);
-}
-__IEEE80211_LOCAL_SHOW(modes);
-
-static ssize_t ieee80211_local_fmt_rate_ctrl_alg(struct ieee80211_local *local,
- char *buf)
-{
- struct rate_control_ref *ref = local->rate_ctrl;
- if (ref)
- return sprintf(buf, "%s\n", ref->ops->name);
- return 0;
-}
-__IEEE80211_LOCAL_SHOW(rate_ctrl_alg);
-
-static struct device_attribute ieee80211_dev_attrs[] = {
- __ATTR(channel, S_IRUGO, ieee80211_local_show_channel, NULL),
- __ATTR(frequency, S_IRUGO, ieee80211_local_show_frequency, NULL),
- __ATTR(radar_detect, S_IRUGO, ieee80211_local_show_radar_detect, NULL),
- __ATTR(antenna_sel_tx, S_IRUGO, ieee80211_local_show_antenna_sel_tx, NULL),
- __ATTR(antenna_sel_rx, S_IRUGO, ieee80211_local_show_antenna_sel_rx, NULL),
- __ATTR(bridge_packets, S_IRUGO, ieee80211_local_show_bridge_packets, NULL),
- __ATTR(key_tx_rx_threshold, S_IRUGO, ieee80211_local_show_key_tx_rx_threshold, NULL),
- __ATTR(rts_threshold, S_IRUGO, ieee80211_local_show_rts_threshold, NULL),
- __ATTR(fragmentation_threshold, S_IRUGO, ieee80211_local_show_fragmentation_threshold, NULL),
- __ATTR(short_retry_limit, S_IRUGO, ieee80211_local_show_short_retry_limit, NULL),
- __ATTR(long_retry_limit, S_IRUGO, ieee80211_local_show_long_retry_limit, NULL),
- __ATTR(total_ps_buffered, S_IRUGO, ieee80211_local_show_total_ps_buffered, NULL),
- __ATTR(mode, S_IRUGO, ieee80211_local_show_mode, NULL),
- __ATTR(wep_iv, S_IRUGO, ieee80211_local_show_wep_iv, NULL),
- __ATTR(tx_power_reduction, S_IRUGO, ieee80211_local_show_tx_power_reduction, NULL),
- __ATTR(modes, S_IRUGO, ieee80211_local_show_modes, NULL),
- __ATTR(rate_ctrl_alg, S_IRUGO | S_IWUGO, ieee80211_local_show_rate_ctrl_alg, store_rate_ctrl_alg),
-};
-
-/* attributes in /sys/class/ieee80211/phyX/statistics/ */
-
-#define IEEE80211_LOCAL_ATTR(name, field, format) \
-IEEE80211_LOCAL_SHOW(name, field, format) \
-static DEVICE_ATTR(name, S_IRUGO, ieee80211_local_show_##name, NULL);
-
-IEEE80211_LOCAL_ATTR(transmitted_fragment_count, dot11TransmittedFragmentCount, "%u");
-IEEE80211_LOCAL_ATTR(multicast_transmitted_frame_count, dot11MulticastTransmittedFrameCount, "%u");
-IEEE80211_LOCAL_ATTR(failed_count, dot11FailedCount, "%u");
-IEEE80211_LOCAL_ATTR(retry_count, dot11RetryCount, "%u");
-IEEE80211_LOCAL_ATTR(multiple_retry_count, dot11MultipleRetryCount, "%u");
-IEEE80211_LOCAL_ATTR(frame_duplicate_count, dot11FrameDuplicateCount, "%u");
-IEEE80211_LOCAL_ATTR(received_fragment_count, dot11ReceivedFragmentCount, "%u");
-IEEE80211_LOCAL_ATTR(multicast_received_frame_count, dot11MulticastReceivedFrameCount, "%u");
-IEEE80211_LOCAL_ATTR(transmitted_frame_count, dot11TransmittedFrameCount, "%u");
-IEEE80211_LOCAL_ATTR(wep_undecryptable_count, dot11WEPUndecryptableCount, "%u");
-IEEE80211_LOCAL_ATTR(num_scans, scan.num_scans, "%u");
-
-#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
-IEEE80211_LOCAL_ATTR(tx_handlers_drop, tx_handlers_drop, "%u");
-IEEE80211_LOCAL_ATTR(tx_handlers_queued, tx_handlers_queued, "%u");
-IEEE80211_LOCAL_ATTR(tx_handlers_drop_unencrypted, tx_handlers_drop_unencrypted, "%u");
-IEEE80211_LOCAL_ATTR(tx_handlers_drop_fragment, tx_handlers_drop_fragment, "%u");
-IEEE80211_LOCAL_ATTR(tx_handlers_drop_wep, tx_handlers_drop_wep, "%u");
-IEEE80211_LOCAL_ATTR(tx_handlers_drop_not_assoc, tx_handlers_drop_not_assoc, "%u");
-IEEE80211_LOCAL_ATTR(tx_handlers_drop_unauth_port, tx_handlers_drop_unauth_port, "%u");
-IEEE80211_LOCAL_ATTR(rx_handlers_drop, rx_handlers_drop, "%u");
-IEEE80211_LOCAL_ATTR(rx_handlers_queued, rx_handlers_queued, "%u");
-IEEE80211_LOCAL_ATTR(rx_handlers_drop_nullfunc, rx_handlers_drop_nullfunc, "%u");
-IEEE80211_LOCAL_ATTR(rx_handlers_drop_defrag, rx_handlers_drop_defrag, "%u");
-IEEE80211_LOCAL_ATTR(rx_handlers_drop_short, rx_handlers_drop_short, "%u");
-IEEE80211_LOCAL_ATTR(rx_handlers_drop_passive_scan, rx_handlers_drop_passive_scan, "%u");
-IEEE80211_LOCAL_ATTR(tx_expand_skb_head, tx_expand_skb_head, "%u");
-IEEE80211_LOCAL_ATTR(tx_expand_skb_head_cloned, tx_expand_skb_head_cloned, "%u");
-IEEE80211_LOCAL_ATTR(rx_expand_skb_head, rx_expand_skb_head, "%u");
-IEEE80211_LOCAL_ATTR(rx_expand_skb_head2, rx_expand_skb_head2, "%u");
-IEEE80211_LOCAL_ATTR(rx_handlers_fragments, rx_handlers_fragments, "%u");
-IEEE80211_LOCAL_ATTR(tx_status_drop, tx_status_drop, "%u");
-
-static ssize_t ieee80211_local_fmt_wme_rx_queue(struct ieee80211_local *local,
- char *buf)
-{
- int i;
- char *p = buf;
-
- for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
- p += sprintf(p, "%u\n", local->wme_rx_queue[i]);
- return (p - buf);
-}
-__IEEE80211_LOCAL_SHOW(wme_rx_queue);
-static DEVICE_ATTR(wme_rx_queue, S_IRUGO,
- ieee80211_local_show_wme_rx_queue, NULL);
-
-static ssize_t ieee80211_local_fmt_wme_tx_queue(struct ieee80211_local *local,
- char *buf)
-{
- int i;
- char *p = buf;
-
- for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
- p += sprintf(p, "%u\n", local->wme_tx_queue[i]);
- return (p - buf);
-}
-__IEEE80211_LOCAL_SHOW(wme_tx_queue);
-static DEVICE_ATTR(wme_tx_queue, S_IRUGO,
- ieee80211_local_show_wme_tx_queue, NULL);
-#endif
-
-static ssize_t ieee80211_stats_show(struct device *dev,
- struct device_attribute *attr,
- char *buf,
- ssize_t (*format)(struct ieee80211_low_level_stats *, char *))
-{
- struct ieee80211_local *local = to_ieee80211_local(dev);
- struct ieee80211_low_level_stats stats;
- ssize_t ret = -EINVAL;
-
- if (!local->ops->get_stats)
- return -EOPNOTSUPP;
- ret = rtnl_lock_local(local);
- if (ret)
- return ret;
- ret = local->ops->get_stats(local_to_hw(local), &stats);
- rtnl_unlock();
- if (!ret)
- ret = (*format)(&stats, buf);
- return ret;
-}
-
-#define IEEE80211_STATS_FMT(name, field, format_string) \
-static ssize_t ieee80211_stats_fmt_##name(struct ieee80211_low_level_stats \
- *stats, char *buf) \
-{ \
- return sprintf(buf, format_string, stats->field); \
-}
-
-#define __IEEE80211_STATS_SHOW(name) \
-static ssize_t ieee80211_stats_show_##name(struct device *dev, \
- struct device_attribute *attr,\
- char *buf) \
-{ \
- return ieee80211_stats_show(dev, attr, buf, \
- ieee80211_stats_fmt_##name); \
-}
-
-#define IEEE80211_STATS_ATTR(name, field, format) \
-IEEE80211_STATS_FMT(name, field, format "\n") \
-__IEEE80211_STATS_SHOW(name) \
-static DEVICE_ATTR(name, S_IRUGO, ieee80211_stats_show_##name, NULL);
-
-IEEE80211_STATS_ATTR(ack_failure_count, dot11ACKFailureCount, "%u");
-IEEE80211_STATS_ATTR(rts_failure_count, dot11RTSFailureCount, "%u");
-IEEE80211_STATS_ATTR(fcs_error_count, dot11FCSErrorCount, "%u");
-IEEE80211_STATS_ATTR(rts_success_count, dot11RTSSuccessCount, "%u");
-
-static struct attribute *ieee80211_stats_attrs[] = {
- &dev_attr_transmitted_fragment_count.attr,
- &dev_attr_multicast_transmitted_frame_count.attr,
- &dev_attr_failed_count.attr,
- &dev_attr_retry_count.attr,
- &dev_attr_multiple_retry_count.attr,
- &dev_attr_frame_duplicate_count.attr,
- &dev_attr_received_fragment_count.attr,
- &dev_attr_multicast_received_frame_count.attr,
- &dev_attr_transmitted_frame_count.attr,
- &dev_attr_wep_undecryptable_count.attr,
- &dev_attr_ack_failure_count.attr,
- &dev_attr_rts_failure_count.attr,
- &dev_attr_fcs_error_count.attr,
- &dev_attr_rts_success_count.attr,
- &dev_attr_num_scans.attr,
-#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
- &dev_attr_tx_handlers_drop.attr,
- &dev_attr_tx_handlers_queued.attr,
- &dev_attr_tx_handlers_drop_unencrypted.attr,
- &dev_attr_tx_handlers_drop_fragment.attr,
- &dev_attr_tx_handlers_drop_wep.attr,
- &dev_attr_tx_handlers_drop_not_assoc.attr,
- &dev_attr_tx_handlers_drop_unauth_port.attr,
- &dev_attr_rx_handlers_drop.attr,
- &dev_attr_rx_handlers_queued.attr,
- &dev_attr_rx_handlers_drop_nullfunc.attr,
- &dev_attr_rx_handlers_drop_defrag.attr,
- &dev_attr_rx_handlers_drop_short.attr,
- &dev_attr_rx_handlers_drop_passive_scan.attr,
- &dev_attr_tx_expand_skb_head.attr,
- &dev_attr_tx_expand_skb_head_cloned.attr,
- &dev_attr_rx_expand_skb_head.attr,
- &dev_attr_rx_expand_skb_head2.attr,
- &dev_attr_rx_handlers_fragments.attr,
- &dev_attr_tx_status_drop.attr,
- &dev_attr_wme_rx_queue.attr,
- &dev_attr_wme_tx_queue.attr,
-#endif
- NULL,
-};
-
-static struct attribute_group ieee80211_stats_group = {
- .name = "statistics",
- .attrs = ieee80211_stats_attrs,
-};
-
/* attributes in /sys/class/net/X/ */
static ssize_t ieee80211_if_show(struct device *d,
@@ -595,53 +267,6 @@ static struct attribute_group ieee80211_
.attrs = ieee80211_monitor_attrs,
};
-int ieee80211_dev_sysfs_add(struct ieee80211_local *local)
-{
- const struct device_attribute *attr;
- int i, err;
-
- for (i = 0; i < ARRAY_SIZE(ieee80211_dev_attrs); i++) {
- attr = &ieee80211_dev_attrs[i];
- err = sysfs_create_file(&local->hw.wiphy->dev.kobj,
- &attr->attr);
- if (err)
- goto unwind;
- }
-
- err = sysfs_create_group(&local->hw.wiphy->dev.kobj,
- &ieee80211_stats_group);
-
- if (err == 0)
- return err;
-
- unwind:
- /* one after the failed/last one */
- i--;
- while (i >= 0) {
- attr = &ieee80211_dev_attrs[i];
- sysfs_remove_file(&local->hw.wiphy->dev.kobj,
- &attr->attr);
- i--;
- }
- return err;
-}
-
-void ieee80211_dev_sysfs_del(struct ieee80211_local *local)
-{
- const struct device_attribute *attr;
- int i;
-
- sysfs_remove_group(&local->hw.wiphy->dev.kobj,
- &ieee80211_stats_group);
-
- for (i = 0; i < ARRAY_SIZE(ieee80211_dev_attrs); i++) {
- attr = &ieee80211_dev_attrs[i];
- sysfs_remove_file(&local->hw.wiphy->dev.kobj,
- &attr->attr);
- }
-}
-
-
/* /sys/class/net/X functions */
static void __ieee80211_remove_if_group(struct kobject *kobj,
--- wireless-dev.orig/net/mac80211/ieee80211_sysfs.h 2007-03-01 17:27:25.784246483 +0100
+++ wireless-dev/net/mac80211/ieee80211_sysfs.h 2007-03-01 17:27:35.014246483 +0100
@@ -6,7 +6,5 @@
int ieee80211_sysfs_add_netdevice(struct net_device *dev);
void ieee80211_sysfs_remove_netdevice(struct net_device *dev);
int ieee80211_sysfs_change_if_type(struct net_device *dev);
-int ieee80211_dev_sysfs_add(struct ieee80211_local *local);
-void ieee80211_dev_sysfs_del(struct ieee80211_local *local);
#endif /* __IEEE80211_SYSFS_H */
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ wireless-dev/net/mac80211/debugfs.c 2007-03-01 19:29:33.930933419 +0100
@@ -0,0 +1,411 @@
+/*
+ * mac80211 debugfs for wireless PHYs
+ *
+ * Copyright 2007 Johannes Berg <[email protected]>
+ *
+ * GPLv2
+ *
+ */
+
+#include <linux/debugfs.h>
+#include <linux/rtnetlink.h>
+#include "ieee80211_i.h"
+#include "ieee80211_rate.h"
+#include "debugfs.h"
+
+static int open_file_generic(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+ return 0;
+}
+
+static const char *ieee80211_mode_str(int mode)
+{
+ switch (mode) {
+ case MODE_IEEE80211A:
+ return "IEEE 802.11a";
+ case MODE_IEEE80211B:
+ return "IEEE 802.11b";
+ case MODE_IEEE80211G:
+ return "IEEE 802.11g";
+ case MODE_ATHEROS_TURBO:
+ return "Atheros Turbo (5 GHz)";
+ default:
+ return "UNKNOWN";
+ }
+}
+
+static ssize_t modes_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
+{
+ struct ieee80211_local *local = file->private_data;
+ struct ieee80211_hw_mode *mode;
+ char buf[150], *p = buf;
+
+ /* FIXME: locking! */
+ list_for_each_entry(mode, &local->modes_list, list) {
+ p += snprintf(p, sizeof(buf)+buf-p,
+ "%s\n", ieee80211_mode_str(mode->mode));
+ }
+
+ return simple_read_from_buffer(userbuf, count, ppos, buf, p-buf);
+}
+
+static const struct file_operations modes_ops = {
+ .read = modes_read,
+ .open = open_file_generic,
+};
+
+#define DEBUGFS_READONLY_FILE(name, buflen, fmt, value...) \
+static ssize_t name## _read(struct file *file, char __user *userbuf, \
+ size_t count, loff_t *ppos) \
+{ \
+ struct ieee80211_local *local = file->private_data; \
+ char buf[buflen]; \
+ int res; \
+ \
+ res = snprintf(buf, buflen, fmt "\n", ##value); \
+ return simple_read_from_buffer(userbuf, count, ppos, buf, res); \
+} \
+ \
+static const struct file_operations name## _ops = { \
+ .read = name## _read, \
+ .open = open_file_generic, \
+};
+
+#define DEBUGFS_ADD(name) \
+ local->debugfs.name = debugfs_create_file(#name, 0222, phyd, \
+ local, &name## _ops);
+
+#define DEBUGFS_DEL(name) \
+ debugfs_remove(local->debugfs.name);
+
+
+DEBUGFS_READONLY_FILE(channel, 20, "%d",
+ local->hw.conf.channel);
+DEBUGFS_READONLY_FILE(frequency, 20, "%d",
+ local->hw.conf.freq);
+DEBUGFS_READONLY_FILE(radar_detect, 20, "%d",
+ local->hw.conf.radar_detect);
+DEBUGFS_READONLY_FILE(antenna_sel_tx, 20, "%d",
+ local->hw.conf.antenna_sel_tx);
+DEBUGFS_READONLY_FILE(antenna_sel_rx, 20, "%d",
+ local->hw.conf.antenna_sel_rx);
+DEBUGFS_READONLY_FILE(bridge_packets, 20, "%d",
+ local->bridge_packets);
+DEBUGFS_READONLY_FILE(key_tx_rx_threshold, 20, "%d",
+ local->key_tx_rx_threshold);
+DEBUGFS_READONLY_FILE(rts_threshold, 20, "%d",
+ local->rts_threshold);
+DEBUGFS_READONLY_FILE(fragmentation_threshold, 20, "%d",
+ local->fragmentation_threshold);
+DEBUGFS_READONLY_FILE(short_retry_limit, 20, "%d",
+ local->short_retry_limit);
+DEBUGFS_READONLY_FILE(long_retry_limit, 20, "%d",
+ local->long_retry_limit);
+DEBUGFS_READONLY_FILE(total_ps_buffered, 20, "%d",
+ local->total_ps_buffered);
+DEBUGFS_READONLY_FILE(mode, 20, "%s",
+ ieee80211_mode_str(local->hw.conf.phymode));
+DEBUGFS_READONLY_FILE(wep_iv, 20, "%#06x",
+ local->wep_iv & 0xffffff);
+DEBUGFS_READONLY_FILE(tx_power_reduction, 20, "%d.%d dBm",
+ local->hw.conf.tx_power_reduction / 10,
+ local->hw.conf.tx_power_reduction & 10);
+DEBUGFS_READONLY_FILE(rate_ctrl_alg, 100, "%s",
+ local->rate_ctrl ? local->rate_ctrl->ops->name : "<unset>");
+
+/* statistics stuff */
+
+static inline int rtnl_lock_local(struct ieee80211_local *local)
+{
+ rtnl_lock();
+ if (unlikely(local->reg_state != IEEE80211_DEV_REGISTERED)) {
+ rtnl_unlock();
+ return -ENODEV;
+ }
+ return 0;
+}
+
+#define DEBUGFS_STATS_FILE(name, buflen, fmt, value...) \
+ DEBUGFS_READONLY_FILE(stats_ ##name, buflen, fmt, ##value)
+
+#define DEBUGFS_DEVSTATS_FILE(name, buflen, fmt, value...) \
+static ssize_t stats_ ##name## _read(struct file *file, \
+ char __user *userbuf, \
+ size_t count, loff_t *ppos) \
+{ \
+ struct ieee80211_local *local = file->private_data; \
+ struct ieee80211_low_level_stats stats; \
+ char buf[buflen]; \
+ int res; \
+ \
+ if (!local->ops->get_stats) \
+ return -EOPNOTSUPP; \
+ \
+ res = rtnl_lock_local(local); \
+ if (res) \
+ return res; \
+ \
+ res = local->ops->get_stats(local_to_hw(local), &stats); \
+ rtnl_unlock(); \
+ if (!res) \
+ res = snprintf(buf, buflen, fmt "\n", ##value); \
+ return simple_read_from_buffer(userbuf, count, ppos, buf, res); \
+} \
+ \
+static const struct file_operations stats_ ##name## _ops = { \
+ .read = stats_ ##name## _read, \
+ .open = open_file_generic, \
+};
+
+#define DEBUGFS_STATS_ADD(name) \
+ local->debugfs.stats.name = debugfs_create_file(#name, 0222, statsd,\
+ local, &stats_ ##name## _ops);
+
+#define DEBUGFS_STATS_DEL(name) \
+ debugfs_remove(local->debugfs.stats.name);
+
+DEBUGFS_STATS_FILE(transmitted_fragment_count, 20, "%u",
+ local->dot11TransmittedFragmentCount);
+DEBUGFS_STATS_FILE(multicast_transmitted_frame_count, 20, "%u",
+ local->dot11MulticastTransmittedFrameCount);
+DEBUGFS_STATS_FILE(failed_count, 20, "%u",
+ local->dot11FailedCount);
+DEBUGFS_STATS_FILE(retry_count, 20, "%u",
+ local->dot11RetryCount);
+DEBUGFS_STATS_FILE(multiple_retry_count, 20, "%u",
+ local->dot11MultipleRetryCount);
+DEBUGFS_STATS_FILE(frame_duplicate_count, 20, "%u",
+ local->dot11FrameDuplicateCount);
+DEBUGFS_STATS_FILE(received_fragment_count, 20, "%u",
+ local->dot11ReceivedFragmentCount);
+DEBUGFS_STATS_FILE(multicast_received_frame_count, 20, "%u",
+ local->dot11MulticastReceivedFrameCount);
+DEBUGFS_STATS_FILE(transmitted_frame_count, 20, "%u",
+ local->dot11TransmittedFrameCount);
+DEBUGFS_STATS_FILE(wep_undecryptable_count, 20, "%u",
+ local->dot11WEPUndecryptableCount);
+DEBUGFS_STATS_FILE(num_scans, 20, "%u",
+ local->scan.num_scans);
+#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
+DEBUGFS_STATS_FILE(tx_handlers_drop, 20, "%u",
+ local->tx_handlers_drop);
+DEBUGFS_STATS_FILE(tx_handlers_queued, 20, "%u",
+ local->tx_handlers_queued);
+DEBUGFS_STATS_FILE(tx_handlers_drop_unencrypted, 20, "%u",
+ local->tx_handlers_drop_unencrypted);
+DEBUGFS_STATS_FILE(tx_handlers_drop_fragment, 20, "%u",
+ local->tx_handlers_drop_fragment);
+DEBUGFS_STATS_FILE(tx_handlers_drop_wep, 20, "%u",
+ local->tx_handlers_drop_wep);
+DEBUGFS_STATS_FILE(tx_handlers_drop_not_assoc, 20, "%u",
+ local->tx_handlers_drop_not_assoc);
+DEBUGFS_STATS_FILE(tx_handlers_drop_unauth_port, 20, "%u",
+ local->tx_handlers_drop_unauth_port);
+DEBUGFS_STATS_FILE(rx_handlers_drop, 20, "%u",
+ local->rx_handlers_drop);
+DEBUGFS_STATS_FILE(rx_handlers_queued, 20, "%u",
+ local->rx_handlers_queued);
+DEBUGFS_STATS_FILE(rx_handlers_drop_nullfunc, 20, "%u",
+ local->rx_handlers_drop_nullfunc);
+DEBUGFS_STATS_FILE(rx_handlers_drop_defrag, 20, "%u",
+ local->rx_handlers_drop_defrag);
+DEBUGFS_STATS_FILE(rx_handlers_drop_short, 20, "%u",
+ local->rx_handlers_drop_short);
+DEBUGFS_STATS_FILE(rx_handlers_drop_passive_scan, 20, "%u",
+ local->rx_handlers_drop_passive_scan);
+DEBUGFS_STATS_FILE(tx_expand_skb_head, 20, "%u",
+ local->tx_expand_skb_head);
+DEBUGFS_STATS_FILE(tx_expand_skb_head_cloned, 20, "%u",
+ local->tx_expand_skb_head_cloned);
+DEBUGFS_STATS_FILE(rx_expand_skb_head, 20, "%u",
+ local->rx_expand_skb_head);
+DEBUGFS_STATS_FILE(rx_expand_skb_head2, 20, "%u",
+ local->rx_expand_skb_head2);
+DEBUGFS_STATS_FILE(rx_handlers_fragments, 20, "%u",
+ local->rx_handlers_fragments);
+DEBUGFS_STATS_FILE(tx_status_drop, 20, "%u",
+ local->tx_status_drop);
+#endif
+
+DEBUGFS_DEVSTATS_FILE(dot11ACKFailureCount, 20, "%u",
+ stats.dot11ACKFailureCount);
+DEBUGFS_DEVSTATS_FILE(dot11RTSFailureCount, 20, "%u",
+ stats.dot11RTSFailureCount);
+DEBUGFS_DEVSTATS_FILE(dot11FCSErrorCount, 20, "%u",
+ stats.dot11FCSErrorCount);
+DEBUGFS_DEVSTATS_FILE(dot11RTSSuccessCount, 20, "%u",
+ stats.dot11RTSSuccessCount);
+
+static ssize_t stats_wme_rx_queue_read(struct file *file,
+ char __user *userbuf,
+ size_t count, loff_t *ppos)
+{
+ struct ieee80211_local *local = file->private_data;
+ char buf[NUM_RX_DATA_QUEUES*15], *p = buf;
+ int i;
+
+ for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
+ p += snprintf(p, sizeof(buf)+buf-p,
+ "%u\n", local->wme_rx_queue[i]);
+
+ return simple_read_from_buffer(userbuf, count, ppos, buf, p-buf);
+}
+
+static const struct file_operations stats_wme_rx_queue_ops = {
+ .read = stats_wme_rx_queue_read,
+ .open = open_file_generic,
+};
+
+static ssize_t stats_wme_tx_queue_read(struct file *file,
+ char __user *userbuf,
+ size_t count, loff_t *ppos)
+{
+ struct ieee80211_local *local = file->private_data;
+ char buf[NUM_TX_DATA_QUEUES*15], *p = buf;
+ int i;
+
+ for (i = 0; i < NUM_TX_DATA_QUEUES; i++)
+ p += snprintf(p, sizeof(buf)+buf-p,
+ "%u\n", local->wme_tx_queue[i]);
+
+ return simple_read_from_buffer(userbuf, count, ppos, buf, p-buf);
+}
+
+static const struct file_operations stats_wme_tx_queue_ops = {
+ .read = stats_wme_tx_queue_read,
+ .open = open_file_generic,
+};
+
+
+void debugfs_hw_add(struct ieee80211_local *local)
+{
+ struct dentry *phyd = local->hw.wiphy->debugfsdir;
+ struct dentry *statsd;
+
+ if (!phyd)
+ return;
+
+ DEBUGFS_ADD(channel);
+ DEBUGFS_ADD(frequency);
+ DEBUGFS_ADD(radar_detect);
+ DEBUGFS_ADD(antenna_sel_tx);
+ DEBUGFS_ADD(antenna_sel_rx);
+ DEBUGFS_ADD(bridge_packets);
+ DEBUGFS_ADD(key_tx_rx_threshold);
+ DEBUGFS_ADD(rts_threshold);
+ DEBUGFS_ADD(fragmentation_threshold);
+ DEBUGFS_ADD(short_retry_limit);
+ DEBUGFS_ADD(long_retry_limit);
+ DEBUGFS_ADD(total_ps_buffered);
+ DEBUGFS_ADD(mode);
+ DEBUGFS_ADD(wep_iv);
+ DEBUGFS_ADD(tx_power_reduction);
+ DEBUGFS_ADD(modes);
+
+ statsd = debugfs_create_dir("statistics", phyd);
+ local->debugfs.statistics = statsd;
+
+ /* if the dir failed, don't put all the other things into the root! */
+ if (!statsd)
+ return;
+
+ DEBUGFS_STATS_ADD(transmitted_fragment_count);
+ DEBUGFS_STATS_ADD(multicast_transmitted_frame_count);
+ DEBUGFS_STATS_ADD(failed_count);
+ DEBUGFS_STATS_ADD(retry_count);
+ DEBUGFS_STATS_ADD(multiple_retry_count);
+ DEBUGFS_STATS_ADD(frame_duplicate_count);
+ DEBUGFS_STATS_ADD(received_fragment_count);
+ DEBUGFS_STATS_ADD(multicast_received_frame_count);
+ DEBUGFS_STATS_ADD(transmitted_frame_count);
+ DEBUGFS_STATS_ADD(wep_undecryptable_count);
+ DEBUGFS_STATS_ADD(num_scans);
+#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
+ DEBUGFS_STATS_ADD(tx_handlers_drop);
+ DEBUGFS_STATS_ADD(tx_handlers_queued);
+ DEBUGFS_STATS_ADD(tx_handlers_drop_unencrypted);
+ DEBUGFS_STATS_ADD(tx_handlers_drop_fragment);
+ DEBUGFS_STATS_ADD(tx_handlers_drop_wep);
+ DEBUGFS_STATS_ADD(tx_handlers_drop_not_assoc);
+ DEBUGFS_STATS_ADD(tx_handlers_drop_unauth_port);
+ DEBUGFS_STATS_ADD(rx_handlers_drop);
+ DEBUGFS_STATS_ADD(rx_handlers_queued);
+ DEBUGFS_STATS_ADD(rx_handlers_drop_nullfunc);
+ DEBUGFS_STATS_ADD(rx_handlers_drop_defrag);
+ DEBUGFS_STATS_ADD(rx_handlers_drop_short);
+ DEBUGFS_STATS_ADD(rx_handlers_drop_passive_scan);
+ DEBUGFS_STATS_ADD(tx_expand_skb_head);
+ DEBUGFS_STATS_ADD(tx_expand_skb_head_cloned);
+ DEBUGFS_STATS_ADD(rx_expand_skb_head);
+ DEBUGFS_STATS_ADD(rx_expand_skb_head2);
+ DEBUGFS_STATS_ADD(rx_handlers_fragments);
+ DEBUGFS_STATS_ADD(tx_status_drop);
+#endif
+ DEBUGFS_STATS_ADD(dot11ACKFailureCount);
+ DEBUGFS_STATS_ADD(dot11RTSFailureCount);
+ DEBUGFS_STATS_ADD(dot11FCSErrorCount);
+ DEBUGFS_STATS_ADD(dot11RTSSuccessCount);
+ DEBUGFS_STATS_ADD(wme_tx_queue);
+ DEBUGFS_STATS_ADD(wme_rx_queue);
+}
+
+void debugfs_hw_del(struct ieee80211_local *local)
+{
+ DEBUGFS_DEL(channel);
+ DEBUGFS_DEL(frequency);
+ DEBUGFS_DEL(radar_detect);
+ DEBUGFS_DEL(antenna_sel_tx);
+ DEBUGFS_DEL(antenna_sel_rx);
+ DEBUGFS_DEL(bridge_packets);
+ DEBUGFS_DEL(key_tx_rx_threshold);
+ DEBUGFS_DEL(rts_threshold);
+ DEBUGFS_DEL(fragmentation_threshold);
+ DEBUGFS_DEL(short_retry_limit);
+ DEBUGFS_DEL(long_retry_limit);
+ DEBUGFS_DEL(total_ps_buffered);
+ DEBUGFS_DEL(mode);
+ DEBUGFS_DEL(wep_iv);
+ DEBUGFS_DEL(tx_power_reduction);
+ DEBUGFS_DEL(modes);
+
+ DEBUGFS_STATS_DEL(transmitted_fragment_count);
+ DEBUGFS_STATS_DEL(multicast_transmitted_frame_count);
+ DEBUGFS_STATS_DEL(failed_count);
+ DEBUGFS_STATS_DEL(retry_count);
+ DEBUGFS_STATS_DEL(multiple_retry_count);
+ DEBUGFS_STATS_DEL(frame_duplicate_count);
+ DEBUGFS_STATS_DEL(received_fragment_count);
+ DEBUGFS_STATS_DEL(multicast_received_frame_count);
+ DEBUGFS_STATS_DEL(transmitted_frame_count);
+ DEBUGFS_STATS_DEL(wep_undecryptable_count);
+ DEBUGFS_STATS_DEL(num_scans);
+#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
+ DEBUGFS_STATS_DEL(tx_handlers_drop);
+ DEBUGFS_STATS_DEL(tx_handlers_queued);
+ DEBUGFS_STATS_DEL(tx_handlers_drop_unencrypted);
+ DEBUGFS_STATS_DEL(tx_handlers_drop_fragment);
+ DEBUGFS_STATS_DEL(tx_handlers_drop_wep);
+ DEBUGFS_STATS_DEL(tx_handlers_drop_not_assoc);
+ DEBUGFS_STATS_DEL(tx_handlers_drop_unauth_port);
+ DEBUGFS_STATS_DEL(rx_handlers_drop);
+ DEBUGFS_STATS_DEL(rx_handlers_queued);
+ DEBUGFS_STATS_DEL(rx_handlers_drop_nullfunc);
+ DEBUGFS_STATS_DEL(rx_handlers_drop_defrag);
+ DEBUGFS_STATS_DEL(rx_handlers_drop_short);
+ DEBUGFS_STATS_DEL(rx_handlers_drop_passive_scan);
+ DEBUGFS_STATS_DEL(tx_expand_skb_head);
+ DEBUGFS_STATS_DEL(tx_expand_skb_head_cloned);
+ DEBUGFS_STATS_DEL(rx_expand_skb_head);
+ DEBUGFS_STATS_DEL(rx_expand_skb_head2);
+ DEBUGFS_STATS_DEL(rx_handlers_fragments);
+ DEBUGFS_STATS_DEL(tx_status_drop);
+#endif
+ DEBUGFS_STATS_DEL(dot11ACKFailureCount);
+ DEBUGFS_STATS_DEL(dot11RTSFailureCount);
+ DEBUGFS_STATS_DEL(dot11FCSErrorCount);
+ DEBUGFS_STATS_DEL(dot11RTSSuccessCount);
+ DEBUGFS_STATS_DEL(wme_tx_queue);
+ DEBUGFS_STATS_DEL(wme_rx_queue);
+}
--- wireless-dev.orig/net/mac80211/ieee80211_i.h 2007-03-01 18:02:16.860933419 +0100
+++ wireless-dev/net/mac80211/ieee80211_i.h 2007-03-01 19:18:21.190933419 +0100
@@ -539,6 +539,68 @@ struct ieee80211_local {
* (1 << MODE_*) */
int user_space_mlme;
+
+#ifdef CONFIG_DEBUG_FS
+ struct debugfsdentries {
+ struct dentry *channel;
+ struct dentry *frequency;
+ struct dentry *radar_detect;
+ struct dentry *antenna_sel_tx;
+ struct dentry *antenna_sel_rx;
+ struct dentry *bridge_packets;
+ struct dentry *key_tx_rx_threshold;
+ struct dentry *rts_threshold;
+ struct dentry *fragmentation_threshold;
+ struct dentry *short_retry_limit;
+ struct dentry *long_retry_limit;
+ struct dentry *total_ps_buffered;
+ struct dentry *mode;
+ struct dentry *wep_iv;
+ struct dentry *tx_power_reduction;
+ struct dentry *modes;
+ struct dentry *statistics;
+ struct statsdentries {
+ struct dentry *transmitted_fragment_count;
+ struct dentry *multicast_transmitted_frame_count;
+ struct dentry *failed_count;
+ struct dentry *retry_count;
+ struct dentry *multiple_retry_count;
+ struct dentry *frame_duplicate_count;
+ struct dentry *received_fragment_count;
+ struct dentry *multicast_received_frame_count;
+ struct dentry *transmitted_frame_count;
+ struct dentry *wep_undecryptable_count;
+ struct dentry *num_scans;
+#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
+ struct dentry *tx_handlers_drop;
+ struct dentry *tx_handlers_queued;
+ struct dentry *tx_handlers_drop_unencrypted;
+ struct dentry *tx_handlers_drop_fragment;
+ struct dentry *tx_handlers_drop_wep;
+ struct dentry *tx_handlers_drop_not_assoc;
+ struct dentry *tx_handlers_drop_unauth_port;
+ struct dentry *rx_handlers_drop;
+ struct dentry *rx_handlers_queued;
+ struct dentry *rx_handlers_drop_nullfunc;
+ struct dentry *rx_handlers_drop_defrag;
+ struct dentry *rx_handlers_drop_short;
+ struct dentry *rx_handlers_drop_passive_scan;
+ struct dentry *tx_expand_skb_head;
+ struct dentry *tx_expand_skb_head_cloned;
+ struct dentry *rx_expand_skb_head;
+ struct dentry *rx_expand_skb_head2;
+ struct dentry *rx_handlers_fragments;
+ struct dentry *tx_status_drop;
+#endif
+ struct dentry *dot11ACKFailureCount;
+ struct dentry *dot11RTSFailureCount;
+ struct dentry *dot11FCSErrorCount;
+ struct dentry *dot11RTSSuccessCount;
+ struct dentry *wme_tx_queue;
+ struct dentry *wme_rx_queue;
+ } stats;
+ } debugfs;
+#endif
};
static inline struct ieee80211_local *hw_to_local(
Johannes Berg wrote:
Hi Johannes -
>> I guess I'll stick with sysfs for now since the code is written already:
>> if I will find add_iface and so on down there then I guess it will all
>> work out with minor edits.
>
> Just make sure you're running the very latest kernel with
> CONFIG_SYSFS_DEPRECATED disabled (I think that's necessary, not entirely
> sure). You'll notice when anything but the current CVS version of HAL no
> longer displays network devices :/
I am currently using stock Fedora kernels, they have
CONFIG_SYSFS_DEPRECATED disabled already. In current FC7 development
kernels they have mac80211 in there too now. So I will mod this when it
breaks on the latest Fedora kernels.
>> Can I ask how stable this byzantine path I am currently following to get
>> a "Management interface" for tx injection is going to be? Not even
>> standard wireless ioctl but Private IOCTL SIOCIWFIRSTPRIV+0 opens out
>> into a secret garden of "PRISM2" special features... is this already in
>> a little black refactoring book somewhere?
>
> Yup, it is. But there's still debate on whether it should be done
> through netlink (nl80211) or some new special injection format for the
> monitor interfaces like the management interface currently has.
>
> [you can rip code from wpa_supplicant to inject frames]
Yeah that is good advice, I will look to the wpa_supplicant code,
especially since my code doesn't work yet.
> Btw, here's another argument against the monitor interfaces: having them
> up takes the card out of powersave mode which they should only be while
> not associated, even with a userspace MLME.
It's better said "hardware promisc" than "Monitor Mode" if I understood
you. The previous patches forced hardware promisc and then filtered
for the magic packets without using Monitor mode, but that has the same
power objection.
It's mitigated a bit by only bringing the monitor interface up
automatically when the daemon starts and down when it stops, but of
course normally the daemon runs all the time. The daemon can even be
configured by the user to act differently if he wants if it sees he is
on battery. Also mitigating it is that for the largest intended usage
case, people at home communicating with neighbours, the stations are
plugged in the wall.
But if there is a better way for the stack to get unencrypted broadcasts
(that is all I really want, addr1->FF:FF:FF:FF:FF:FF packets) through to
usermode, which you would think might not actually require hardware
promisc on the hardware, then I am quite motivated to work on that.
-Andy
On Thu, 2007-03-01 at 20:04 +0100, Johannes Berg wrote:
> When Greg fixes sysfs, the real way would be to follow the symlink
Oh and of course if you don't want to use sysfs then you can always use
nl80211.
johannes
On Thu, 2007-03-01 at 18:54 +0000, Andy Green wrote:
> Gah I was using /sys/class/ieee80211/phy<n>/device/net:<ifname> to
> discover which physical device owns which interfaces... if there isn't a
> better/official way from userspace can this maybe stay in /sys?
That's already gone anyway in recent kernels anyway and the net: stuff
is broken currently.
When Greg fixes sysfs, the real way would be to follow the symlink
in /sys/class/net/ieee80211/ which links to (for
example) /sys/devices/pci0001:10/0001:10:12.0/ssb06:01/phy6, then go
back up one level and enumerate all net: objects in it.
Or, if you start from a netdev, you can see the phy80211 symlink.
johannes
Johannes Berg wrote:
> On Thu, 2007-03-01 at 20:04 +0100, Johannes Berg wrote:
>
>> When Greg fixes sysfs, the real way would be to follow the symlink
>
> Oh and of course if you don't want to use sysfs then you can always use
> nl80211.
Hi Johannes -
I guess I'll stick with sysfs for now since the code is written already:
if I will find add_iface and so on down there then I guess it will all
work out with minor edits.
Can I ask how stable this byzantine path I am currently following to get
a "Management interface" for tx injection is going to be? Not even
standard wireless ioctl but Private IOCTL SIOCIWFIRSTPRIV+0 opens out
into a secret garden of "PRISM2" special features... is this already in
a little black refactoring book somewhere? Just glumly curious what
the lifetime of any usermode code based around any of this stuff is...
-Andy
Johannes Berg wrote:
> This patch moves everything except the "sta" directory from the phy
> sysfs to phy debugfs.
Gah I was using /sys/class/ieee80211/phy<n>/device/net:<ifname> to
discover which physical device owns which interfaces... if there isn't a
better/official way from userspace can this maybe stay in /sys?
-Andy
On Fri, 2007-03-02 at 10:45 +0000, Andy Green wrote:
> But if there is a better way for the stack to get unencrypted broadcasts
> (that is all I really want, addr1->FF:FF:FF:FF:FF:FF packets) through to
> usermode, which you would think might not actually require hardware
> promisc on the hardware, then I am quite motivated to work on that.
Well, no, there isn't. When a station is in powersave mode it relies on
the access point to buffer packets for it, which it obviously won't do
with such packets as you're sending.
johannes
On Fri, 2007-03-02 at 08:24 +0000, Andy Green wrote:
> I guess I'll stick with sysfs for now since the code is written already:
> if I will find add_iface and so on down there then I guess it will all
> work out with minor edits.
Just make sure you're running the very latest kernel with
CONFIG_SYSFS_DEPRECATED disabled (I think that's necessary, not entirely
sure). You'll notice when anything but the current CVS version of HAL no
longer displays network devices :/
> Can I ask how stable this byzantine path I am currently following to get
> a "Management interface" for tx injection is going to be? Not even
> standard wireless ioctl but Private IOCTL SIOCIWFIRSTPRIV+0 opens out
> into a secret garden of "PRISM2" special features... is this already in
> a little black refactoring book somewhere?
Yup, it is. But there's still debate on whether it should be done
through netlink (nl80211) or some new special injection format for the
monitor interfaces like the management interface currently has.
[you can rip code from wpa_supplicant to inject frames]
Btw, here's another argument against the monitor interfaces: having them
up takes the card out of powersave mode which they should only be while
not associated, even with a userspace MLME.
johannes
On Thu, 2007-03-01 at 19:34 +0100, Johannes Berg wrote:
> This patch moves everything except the "sta" directory from the phy
> sysfs to phy debugfs.
>
ignore this one, it was buggy.
johannes