Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux...
[pandora-kernel.git] / net / mac80211 / debugfs_key.c
index 7d56dc9..c881524 100644 (file)
 #include "debugfs.h"
 #include "debugfs_key.h"
 
-#define KEY_READ(name, buflen, format_string)                          \
+#define KEY_READ(name, prop, buflen, format_string)                    \
 static ssize_t key_##name##_read(struct file *file,                    \
                                 char __user *userbuf,                  \
                                 size_t count, loff_t *ppos)            \
 {                                                                      \
        char buf[buflen];                                               \
        struct ieee80211_key *key = file->private_data;                 \
-       int res = scnprintf(buf, buflen, format_string, key->name);     \
+       int res = scnprintf(buf, buflen, format_string, key->prop);     \
        return simple_read_from_buffer(userbuf, count, ppos, buf, res); \
 }
-#define KEY_READ_D(name) KEY_READ(name, 20, "%d\n")
+#define KEY_READ_D(name) KEY_READ(name, name, 20, "%d\n")
+#define KEY_READ_X(name) KEY_READ(name, name, 20, "0x%x\n")
 
 #define KEY_OPS(name)                                                  \
 static const struct file_operations key_ ##name## _ops = {             \
@@ -36,11 +37,27 @@ static const struct file_operations key_ ##name## _ops = {          \
                 KEY_READ_##format(name)                                \
                 KEY_OPS(name)
 
-KEY_FILE(keylen, D);
-KEY_FILE(force_sw_encrypt, D);
-KEY_FILE(keyidx, D);
-KEY_FILE(hw_key_idx, D);
+#define KEY_CONF_READ(name, buflen, format_string)                     \
+       KEY_READ(conf_##name, conf.name, buflen, format_string)
+#define KEY_CONF_READ_D(name) KEY_CONF_READ(name, 20, "%d\n")
+
+#define KEY_CONF_OPS(name)                                             \
+static const struct file_operations key_ ##name## _ops = {             \
+       .read = key_conf_##name##_read,                                 \
+       .open = mac80211_open_file_generic,                             \
+}
+
+#define KEY_CONF_FILE(name, format)                                    \
+                KEY_CONF_READ_##format(name)                           \
+                KEY_CONF_OPS(name)
+
+KEY_CONF_FILE(keylen, D);
+KEY_CONF_FILE(keyidx, D);
+KEY_CONF_FILE(hw_key_idx, D);
+KEY_FILE(flags, X);
 KEY_FILE(tx_rx_count, D);
+KEY_READ(ifindex, sdata->dev->ifindex, 20, "%d\n");
+KEY_OPS(ifindex);
 
 static ssize_t key_algorithm_read(struct file *file,
                                  char __user *userbuf,
@@ -49,7 +66,7 @@ static ssize_t key_algorithm_read(struct file *file,
        char *alg;
        struct ieee80211_key *key = file->private_data;
 
-       switch (key->alg) {
+       switch (key->conf.alg) {
        case ALG_WEP:
                alg = "WEP\n";
                break;
@@ -74,17 +91,20 @@ static ssize_t key_tx_spec_read(struct file *file, char __user *userbuf,
        int len;
        struct ieee80211_key *key = file->private_data;
 
-       switch (key->alg) {
+       switch (key->conf.alg) {
        case ALG_WEP:
                len = scnprintf(buf, sizeof(buf), "\n");
+               break;
        case ALG_TKIP:
                len = scnprintf(buf, sizeof(buf), "%08x %04x\n",
                                key->u.tkip.iv32,
                                key->u.tkip.iv16);
+               break;
        case ALG_CCMP:
                tpn = key->u.ccmp.tx_pn;
                len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
                                tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], tpn[5]);
+               break;
        default:
                return 0;
        }
@@ -100,9 +120,10 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
        int i, len;
        const u8 *rpn;
 
-       switch (key->alg) {
+       switch (key->conf.alg) {
        case ALG_WEP:
                len = scnprintf(buf, sizeof(buf), "\n");
+               break;
        case ALG_TKIP:
                for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
                        p += scnprintf(p, sizeof(buf)+buf-p,
@@ -110,6 +131,7 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
                                       key->u.tkip.iv32_rx[i],
                                       key->u.tkip.iv16_rx[i]);
                len = p - buf;
+               break;
        case ALG_CCMP:
                for (i = 0; i < NUM_RX_DATA_QUEUES; i++) {
                        rpn = key->u.ccmp.rx_pn[i];
@@ -119,6 +141,7 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
                                       rpn[3], rpn[4], rpn[5]);
                }
                len = p - buf;
+               break;
        default:
                return 0;
        }
@@ -133,7 +156,7 @@ static ssize_t key_replays_read(struct file *file, char __user *userbuf,
        char buf[20];
        int len;
 
-       if (key->alg != ALG_CCMP)
+       if (key->conf.alg != ALG_CCMP)
                return 0;
        len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays);
        return simple_read_from_buffer(userbuf, count, ppos, buf, len);
@@ -144,12 +167,12 @@ static ssize_t key_key_read(struct file *file, char __user *userbuf,
                            size_t count, loff_t *ppos)
 {
        struct ieee80211_key *key = file->private_data;
-       int i, res, bufsize = 2*key->keylen+2;
+       int i, res, bufsize = 2 * key->conf.keylen + 2;
        char *buf = kmalloc(bufsize, GFP_KERNEL);
        char *p = buf;
 
-       for (i = 0; i < key->keylen; i++)
-               p += scnprintf(p, bufsize+buf-p, "%02x", key->key[i]);
+       for (i = 0; i < key->conf.keylen; i++)
+               p += scnprintf(p, bufsize + buf - p, "%02x", key->conf.key[i]);
        p += scnprintf(p, bufsize+buf-p, "\n");
        res = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
        kfree(buf);
@@ -164,12 +187,14 @@ KEY_OPS(key);
 void ieee80211_debugfs_key_add(struct ieee80211_local *local,
                               struct ieee80211_key *key)
 {
+       static int keycount;
        char buf[20];
 
        if (!local->debugfs.keys)
                return;
 
-       sprintf(buf, "%d", key->keyidx);
+       sprintf(buf, "%d", keycount);
+       keycount++;
        key->debugfs.dir = debugfs_create_dir(buf,
                                        local->debugfs.keys);
 
@@ -177,7 +202,7 @@ void ieee80211_debugfs_key_add(struct ieee80211_local *local,
                return;
 
        DEBUGFS_ADD(keylen);
-       DEBUGFS_ADD(force_sw_encrypt);
+       DEBUGFS_ADD(flags);
        DEBUGFS_ADD(keyidx);
        DEBUGFS_ADD(hw_key_idx);
        DEBUGFS_ADD(tx_rx_count);
@@ -186,6 +211,7 @@ void ieee80211_debugfs_key_add(struct ieee80211_local *local,
        DEBUGFS_ADD(rx_spec);
        DEBUGFS_ADD(replays);
        DEBUGFS_ADD(key);
+       DEBUGFS_ADD(ifindex);
 };
 
 #define DEBUGFS_DEL(name) \
@@ -197,7 +223,7 @@ void ieee80211_debugfs_key_remove(struct ieee80211_key *key)
                return;
 
        DEBUGFS_DEL(keylen);
-       DEBUGFS_DEL(force_sw_encrypt);
+       DEBUGFS_DEL(flags);
        DEBUGFS_DEL(keyidx);
        DEBUGFS_DEL(hw_key_idx);
        DEBUGFS_DEL(tx_rx_count);
@@ -206,6 +232,7 @@ void ieee80211_debugfs_key_remove(struct ieee80211_key *key)
        DEBUGFS_DEL(rx_spec);
        DEBUGFS_DEL(replays);
        DEBUGFS_DEL(key);
+       DEBUGFS_DEL(ifindex);
 
        debugfs_remove(key->debugfs.stalink);
        key->debugfs.stalink = NULL;
@@ -219,7 +246,7 @@ void ieee80211_debugfs_key_add_default(struct ieee80211_sub_if_data *sdata)
        if (!sdata->debugfsdir)
                return;
 
-       sprintf(buf, "../keys/%d", sdata->default_key->keyidx);
+       sprintf(buf, "../keys/%d", sdata->default_key->conf.keyidx);
        sdata->debugfs.default_key =
                debugfs_create_symlink("default_key", sdata->debugfsdir, buf);
 }
@@ -235,11 +262,12 @@ void ieee80211_debugfs_key_sta_link(struct ieee80211_key *key,
                                    struct sta_info *sta)
 {
        char buf[50];
+       DECLARE_MAC_BUF(mac);
 
        if (!key->debugfs.dir)
                return;
 
-       sprintf(buf, "../sta/" MAC_FMT, MAC_ARG(sta->addr));
+       sprintf(buf, "../../stations/%s", print_mac(mac, sta->addr));
        key->debugfs.stalink =
                debugfs_create_symlink("station", key->debugfs.dir, buf);
 }