linux/net/mac80211/debugfs_sta.c
<<
>>
Prefs
   1/*
   2 * Copyright 2003-2005  Devicescape Software, Inc.
   3 * Copyright (c) 2006   Jiri Benc <jbenc@suse.cz>
   4 * Copyright 2007       Johannes Berg <johannes@sipsolutions.net>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#include <linux/debugfs.h>
  12#include <linux/ieee80211.h>
  13#include "ieee80211_i.h"
  14#include "debugfs.h"
  15#include "debugfs_sta.h"
  16#include "sta_info.h"
  17
  18/* sta attributtes */
  19
  20#define STA_READ(name, buflen, field, format_string)                    \
  21static ssize_t sta_ ##name## _read(struct file *file,                   \
  22                                   char __user *userbuf,                \
  23                                   size_t count, loff_t *ppos)          \
  24{                                                                       \
  25        int res;                                                        \
  26        struct sta_info *sta = file->private_data;                      \
  27        char buf[buflen];                                               \
  28        res = scnprintf(buf, buflen, format_string, sta->field);        \
  29        return simple_read_from_buffer(userbuf, count, ppos, buf, res); \
  30}
  31#define STA_READ_D(name, field) STA_READ(name, 20, field, "%d\n")
  32#define STA_READ_U(name, field) STA_READ(name, 20, field, "%u\n")
  33#define STA_READ_LU(name, field) STA_READ(name, 20, field, "%lu\n")
  34#define STA_READ_S(name, field) STA_READ(name, 20, field, "%s\n")
  35
  36#define STA_READ_RATE(name, field)                                      \
  37static ssize_t sta_##name##_read(struct file *file,                     \
  38                                 char __user *userbuf,                  \
  39                                 size_t count, loff_t *ppos)            \
  40{                                                                       \
  41        struct sta_info *sta = file->private_data;                      \
  42        struct ieee80211_local *local = wdev_priv(sta->dev->ieee80211_ptr);\
  43        struct ieee80211_hw_mode *mode = local->oper_hw_mode;           \
  44        char buf[20];                                                   \
  45        int res = scnprintf(buf, sizeof(buf), "%d\n",                   \
  46                            (sta->field >= 0 &&                         \
  47                            sta->field < mode->num_rates) ?             \
  48                            mode->rates[sta->field].rate : -1);         \
  49        return simple_read_from_buffer(userbuf, count, ppos, buf, res); \
  50}
  51
  52#define STA_OPS(name)                                                   \
  53static const struct file_operations sta_ ##name## _ops = {              \
  54        .read = sta_##name##_read,                                      \
  55        .open = mac80211_open_file_generic,                             \
  56}
  57
  58#define STA_FILE(name, field, format)                                   \
  59                STA_READ_##format(name, field)                          \
  60                STA_OPS(name)
  61
  62STA_FILE(aid, aid, D);
  63STA_FILE(key_idx_compression, key_idx_compression, D);
  64STA_FILE(dev, dev->name, S);
  65STA_FILE(vlan_id, vlan_id, D);
  66STA_FILE(rx_packets, rx_packets, LU);
  67STA_FILE(tx_packets, tx_packets, LU);
  68STA_FILE(rx_bytes, rx_bytes, LU);
  69STA_FILE(tx_bytes, tx_bytes, LU);
  70STA_FILE(rx_duplicates, num_duplicates, LU);
  71STA_FILE(rx_fragments, rx_fragments, LU);
  72STA_FILE(rx_dropped, rx_dropped, LU);
  73STA_FILE(tx_fragments, tx_fragments, LU);
  74STA_FILE(tx_filtered, tx_filtered_count, LU);
  75STA_FILE(txrate, txrate, RATE);
  76STA_FILE(last_txrate, last_txrate, RATE);
  77STA_FILE(tx_retry_failed, tx_retry_failed, LU);
  78STA_FILE(tx_retry_count, tx_retry_count, LU);
  79STA_FILE(last_rssi, last_rssi, D);
  80STA_FILE(last_signal, last_signal, D);
  81STA_FILE(last_noise, last_noise, D);
  82STA_FILE(channel_use, channel_use, D);
  83STA_FILE(wep_weak_iv_count, wep_weak_iv_count, D);
  84
  85static ssize_t sta_flags_read(struct file *file, char __user *userbuf,
  86                              size_t count, loff_t *ppos)
  87{
  88        char buf[100];
  89        struct sta_info *sta = file->private_data;
  90        int res = scnprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s",
  91                sta->flags & WLAN_STA_AUTH ? "AUTH\n" : "",
  92                sta->flags & WLAN_STA_ASSOC ? "ASSOC\n" : "",
  93                sta->flags & WLAN_STA_PS ? "PS\n" : "",
  94                sta->flags & WLAN_STA_TIM ? "TIM\n" : "",
  95                sta->flags & WLAN_STA_PERM ? "PERM\n" : "",
  96                sta->flags & WLAN_STA_AUTHORIZED ? "AUTHORIZED\n" : "",
  97                sta->flags & WLAN_STA_SHORT_PREAMBLE ? "SHORT PREAMBLE\n" : "",
  98                sta->flags & WLAN_STA_WME ? "WME\n" : "",
  99                sta->flags & WLAN_STA_WDS ? "WDS\n" : "");
 100        return simple_read_from_buffer(userbuf, count, ppos, buf, res);
 101}
 102STA_OPS(flags);
 103
 104static ssize_t sta_num_ps_buf_frames_read(struct file *file,
 105                                          char __user *userbuf,
 106                                          size_t count, loff_t *ppos)
 107{
 108        char buf[20];
 109        struct sta_info *sta = file->private_data;
 110        int res = scnprintf(buf, sizeof(buf), "%u\n",
 111                            skb_queue_len(&sta->ps_tx_buf));
 112        return simple_read_from_buffer(userbuf, count, ppos, buf, res);
 113}
 114STA_OPS(num_ps_buf_frames);
 115
 116static ssize_t sta_last_ack_rssi_read(struct file *file, char __user *userbuf,
 117                                      size_t count, loff_t *ppos)
 118{
 119        char buf[100];
 120        struct sta_info *sta = file->private_data;
 121        int res = scnprintf(buf, sizeof(buf), "%d %d %d\n",
 122                            sta->last_ack_rssi[0],
 123                            sta->last_ack_rssi[1],
 124                            sta->last_ack_rssi[2]);
 125        return simple_read_from_buffer(userbuf, count, ppos, buf, res);
 126}
 127STA_OPS(last_ack_rssi);
 128
 129static ssize_t sta_last_ack_ms_read(struct file *file, char __user *userbuf,
 130                                    size_t count, loff_t *ppos)
 131{
 132        char buf[20];
 133        struct sta_info *sta = file->private_data;
 134        int res = scnprintf(buf, sizeof(buf), "%d\n",
 135                            sta->last_ack ?
 136                            jiffies_to_msecs(jiffies - sta->last_ack) : -1);
 137        return simple_read_from_buffer(userbuf, count, ppos, buf, res);
 138}
 139STA_OPS(last_ack_ms);
 140
 141static ssize_t sta_inactive_ms_read(struct file *file, char __user *userbuf,
 142                                    size_t count, loff_t *ppos)
 143{
 144        char buf[20];
 145        struct sta_info *sta = file->private_data;
 146        int res = scnprintf(buf, sizeof(buf), "%d\n",
 147                            jiffies_to_msecs(jiffies - sta->last_rx));
 148        return simple_read_from_buffer(userbuf, count, ppos, buf, res);
 149}
 150STA_OPS(inactive_ms);
 151
 152static ssize_t sta_last_seq_ctrl_read(struct file *file, char __user *userbuf,
 153                                      size_t count, loff_t *ppos)
 154{
 155        char buf[15*NUM_RX_DATA_QUEUES], *p = buf;
 156        int i;
 157        struct sta_info *sta = file->private_data;
 158        for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
 159                p += scnprintf(p, sizeof(buf)+buf-p, "%x ",
 160                               sta->last_seq_ctrl[i]);
 161        p += scnprintf(p, sizeof(buf)+buf-p, "\n");
 162        return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
 163}
 164STA_OPS(last_seq_ctrl);
 165
 166#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
 167static ssize_t sta_wme_rx_queue_read(struct file *file, char __user *userbuf,
 168                                     size_t count, loff_t *ppos)
 169{
 170        char buf[15*NUM_RX_DATA_QUEUES], *p = buf;
 171        int i;
 172        struct sta_info *sta = file->private_data;
 173        for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
 174                p += scnprintf(p, sizeof(buf)+buf-p, "%u ",
 175                               sta->wme_rx_queue[i]);
 176        p += scnprintf(p, sizeof(buf)+buf-p, "\n");
 177        return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
 178}
 179STA_OPS(wme_rx_queue);
 180
 181static ssize_t sta_wme_tx_queue_read(struct file *file, char __user *userbuf,
 182                                     size_t count, loff_t *ppos)
 183{
 184        char buf[15*NUM_TX_DATA_QUEUES], *p = buf;
 185        int i;
 186        struct sta_info *sta = file->private_data;
 187        for (i = 0; i < NUM_TX_DATA_QUEUES; i++)
 188                p += scnprintf(p, sizeof(buf)+buf-p, "%u ",
 189                               sta->wme_tx_queue[i]);
 190        p += scnprintf(p, sizeof(buf)+buf-p, "\n");
 191        return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
 192}
 193STA_OPS(wme_tx_queue);
 194#endif
 195
 196#define DEBUGFS_ADD(name) \
 197        sta->debugfs.name = debugfs_create_file(#name, 0444, \
 198                sta->debugfs.dir, sta, &sta_ ##name## _ops);
 199
 200#define DEBUGFS_DEL(name) \
 201        debugfs_remove(sta->debugfs.name);\
 202        sta->debugfs.name = NULL;
 203
 204
 205void ieee80211_sta_debugfs_add(struct sta_info *sta)
 206{
 207        char buf[3*6];
 208        struct dentry *stations_dir = sta->local->debugfs.stations;
 209
 210        if (!stations_dir)
 211                return;
 212
 213        sprintf(buf, MAC_FMT, MAC_ARG(sta->addr));
 214
 215        sta->debugfs.dir = debugfs_create_dir(buf, stations_dir);
 216        if (!sta->debugfs.dir)
 217                return;
 218
 219        DEBUGFS_ADD(flags);
 220        DEBUGFS_ADD(num_ps_buf_frames);
 221        DEBUGFS_ADD(last_ack_rssi);
 222        DEBUGFS_ADD(last_ack_ms);
 223        DEBUGFS_ADD(inactive_ms);
 224        DEBUGFS_ADD(last_seq_ctrl);
 225#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
 226        DEBUGFS_ADD(wme_rx_queue);
 227        DEBUGFS_ADD(wme_tx_queue);
 228#endif
 229}
 230
 231void ieee80211_sta_debugfs_remove(struct sta_info *sta)
 232{
 233        DEBUGFS_DEL(flags);
 234        DEBUGFS_DEL(num_ps_buf_frames);
 235        DEBUGFS_DEL(last_ack_rssi);
 236        DEBUGFS_DEL(last_ack_ms);
 237        DEBUGFS_DEL(inactive_ms);
 238        DEBUGFS_DEL(last_seq_ctrl);
 239#ifdef CONFIG_MAC80211_DEBUG_COUNTERS
 240        DEBUGFS_DEL(wme_rx_queue);
 241        DEBUGFS_DEL(wme_tx_queue);
 242#endif
 243
 244        debugfs_remove(sta->debugfs.dir);
 245        sta->debugfs.dir = NULL;
 246}
 247
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.