[PATCH] convert setuserscan to debugfs
Marcelo Tosatti
marcelo at kvack.org
Sun Nov 19 00:29:36 EST 2006
Guys,
I've converted setuserscan to debugfs interface.
Would appreciate if you could test it and confirm that its working appropriately, all you have
to do is:
# mount -t debugfs none /mnt
# echo "setuserscan parm" > /mnt/libertas_wireless/eth0/setuserscan
"setuserscan parm" accepts the exact same syntax as the "wlanconfig" setuserscan parameter.
c43fdd2363870e5ab09d92920708668435e4a607
diff --git a/drivers/net/wireless/libertas/wlan_debugfs.c b/drivers/net/wireless/libertas/wlan_debugfs.c
index 020e70a..17128d0 100644
--- a/drivers/net/wireless/libertas/wlan_debugfs.c
+++ b/drivers/net/wireless/libertas/wlan_debugfs.c
@@ -218,6 +218,195 @@ out_unlock:
return count;
}
+int libertas_parse_chan(char *buf, size_t count,
+ struct wlan_ioctl_user_scan_cfg *scan_cfg, int dur)
+{
+ char *start, *end, *hold, *str;
+ int i = 0;
+
+ start = strstr(buf, "chan=");
+ if (!start)
+ return -EINVAL;
+ start += 5;
+ end = strstr(start, " ");
+ if (!end)
+ end = buf + count;
+ hold = kzalloc((end - start)+1, GFP_KERNEL);
+ if (!hold)
+ return -ENOMEM;
+ strncpy(hold, start, end - start);
+ hold[(end-start)+1] = '\0';
+ while(hold && (str = strsep(&hold, ","))) {
+ int chan;
+ char band, passive = 0;
+ sscanf(str, "%d%c%c", &chan, &band, &passive);
+ scan_cfg->chanList[i].chanNumber = chan;
+ scan_cfg->chanList[i].scanType = passive ? 1 : 0;
+ if (band == 'b' || band == 'g')
+ scan_cfg->chanList[i].radioType = 0;
+ else if (band == 'a')
+ scan_cfg->chanList[i].radioType = 1;
+
+ scan_cfg->chanList[i].scanTime = dur;
+ i++;
+ }
+
+ kfree(hold);
+ return i;
+}
+
+static void libertas_parse_bssid(char *buf, size_t count,
+ struct wlan_ioctl_user_scan_cfg *scan_cfg)
+{
+ char *hold;
+ unsigned int mac[ETH_ALEN];
+ int i;
+
+ hold = strstr(buf, "bssid=");
+ if (!hold)
+ return;
+ hold += 6;
+ sscanf(hold, "%2x:%2x:%2x:%2x:%2x:%2x", mac, mac+1, mac+2, mac+3,
+ mac+4, mac+5);
+ for(i=0;i<ETH_ALEN;i++)
+ scan_cfg->specificBSSID[i] = mac[i];
+}
+
+static void libertas_parse_ssid(char *buf, size_t count,
+ struct wlan_ioctl_user_scan_cfg *scan_cfg)
+{
+ char *hold, *end;
+ ssize_t size;
+
+ hold = strstr(buf, "ssid=");
+ if (!hold)
+ return;
+ hold += 5;
+ end = strstr(hold, " ");
+ if (!end)
+ end = buf + count - 1;
+
+ size = min(IW_ESSID_MAX_SIZE, end - hold);
+ strncpy(scan_cfg->specificSSID, hold, size);
+
+ return;
+}
+
+static void libertas_parse_keep(char *buf, size_t count,
+ struct wlan_ioctl_user_scan_cfg *scan_cfg)
+{
+ char *hold;
+ int val;
+
+ hold = strstr(buf, "keep=");
+ if (!hold)
+ return;
+ hold += 5;
+ sscanf(hold, "%d", &val);
+
+ if (val != 0)
+ val = 1;
+
+ scan_cfg->keepPreviousScan = val;
+ return;
+}
+
+static int libertas_parse_dur(char *buf, size_t count,
+ struct wlan_ioctl_user_scan_cfg *scan_cfg)
+{
+ char *hold;
+ int val;
+
+ hold = strstr(buf, "dur=");
+ if (!hold)
+ return 0;
+ hold += 4;
+ sscanf(hold, "%d", &val);
+
+ return val;
+}
+
+static void libertas_parse_probes(char *buf, size_t count,
+ struct wlan_ioctl_user_scan_cfg *scan_cfg)
+{
+ char *hold;
+ int val;
+
+ hold = strstr(buf, "probes=");
+ if (!hold)
+ return;
+ hold += 7;
+ sscanf(hold, "%d", &val);
+
+ scan_cfg->numProbes = val;
+
+ return;
+}
+
+static void libertas_parse_type(char *buf, size_t count,
+ struct wlan_ioctl_user_scan_cfg *scan_cfg)
+{
+ char *hold;
+ int val;
+
+ hold = strstr(buf, "type=");
+ if (!hold)
+ return;
+ hold += 5;
+ sscanf(hold, "%d", &val);
+
+ /* type=1,2 or 3 */
+ if (val < 1 || val > 3)
+ return;
+
+ scan_cfg->bssType = val;
+
+ return;
+}
+
+static ssize_t libertas_setuserscan(struct file *file,
+ const char __user *userbuf,
+ size_t count, loff_t *ppos)
+{
+ wlan_private *priv = file->private_data;
+ char *buf = big_buffer;
+ ssize_t res, buf_size;
+ struct wlan_ioctl_user_scan_cfg *scan_cfg;
+ union iwreq_data wrqu;
+ int dur;
+
+ scan_cfg = kzalloc(sizeof(struct wlan_ioctl_user_scan_cfg), GFP_KERNEL);
+ if (!scan_cfg)
+ return -ENOMEM;
+
+ down(&big_buffer_sem);
+ buf_size = min(count, sizeof(big_buffer) - 1);
+ if (copy_from_user(buf, userbuf, buf_size)) {
+ res = -EFAULT;
+ goto out_unlock;
+ }
+
+ scan_cfg->bssType = WLAN_SCAN_BSS_TYPE_ANY;
+
+ dur = libertas_parse_dur(buf, count, scan_cfg);
+ libertas_parse_chan(buf, count, scan_cfg, dur);
+ libertas_parse_bssid(buf, count, scan_cfg);
+ libertas_parse_ssid(buf, count, scan_cfg);
+ libertas_parse_keep(buf, count, scan_cfg);
+ libertas_parse_probes(buf, count, scan_cfg);
+ libertas_parse_type(buf, count, scan_cfg);
+
+ wlan_scan_networks(priv, scan_cfg);
+
+ memset(&wrqu, 0x00, sizeof(union iwreq_data));
+ wireless_send_event(priv->wlan_dev.netdev, SIOCGIWSCAN, &wrqu, NULL);
+
+out_unlock:
+ up(&big_buffer_sem);
+ kfree(scan_cfg);
+ return count;
+}
+
static struct file_operations libertas_devinfo_fops = {
.owner = THIS_MODULE,
@@ -246,6 +435,12 @@ static struct file_operations libertas_e
.write = libertas_extscan,
};
+static struct file_operations libertas_setuserscan_fops = {
+ .owner = THIS_MODULE,
+ .open = open_file_generic,
+ .write = libertas_setuserscan,
+};
+
void libertas_debugfs_init(void)
{
if (!libertas_dir)
@@ -293,11 +488,15 @@ void libertas_debugfs_init_one(wlan_priv
priv,
&libertas_extscan_fops);
+ priv->debugfs_setuserscan = debugfs_create_file("setuserscan", 0600,
+ priv->debugfs_dir,
+ priv,
+ &libertas_setuserscan_fops);
+
#ifdef PROC_DEBUG
libertas_debug_init(priv, dev);
#endif
-
exit:
return;
}
@@ -308,6 +507,10 @@ #ifdef PROC_DEBUG
debugfs_remove(priv->debugfs_debug);
#endif
debugfs_remove(priv->debugfs_devinfo);
+ debugfs_remove(priv->debugfs_getscantable);
+ debugfs_remove(priv->debugfs_sleepparams);
+ debugfs_remove(priv->debugfs_extscan);
+ debugfs_remove(priv->debugfs_setuserscan);
debugfs_remove(priv->debugfs_dir);
}
diff --git a/drivers/net/wireless/libertas/wlan_dev.h b/drivers/net/wireless/libertas/wlan_dev.h
index 1d75139..102e30d 100644
--- a/drivers/net/wireless/libertas/wlan_dev.h
+++ b/drivers/net/wireless/libertas/wlan_dev.h
@@ -175,6 +175,7 @@ struct _wlan_private {
struct dentry *debugfs_getscantable;
struct dentry *debugfs_sleepparams;
struct dentry *debugfs_extscan;
+ struct dentry *debugfs_setuserscan;
const struct firmware *firmware;
struct device *hotplug_device;
diff --git a/drivers/net/wireless/libertas/wlan_ioctl.c b/drivers/net/wireless/libertas/wlan_ioctl.c
index 17ff747..4c84863 100644
--- a/drivers/net/wireless/libertas/wlan_ioctl.c
+++ b/drivers/net/wireless/libertas/wlan_ioctl.c
@@ -2660,15 +2660,6 @@ #define MAX_U16_VAL 65535
}
break;
- case WLAN_SET_GET_2K:
- switch ((int)wrq->u.data.flags) {
- case WLAN_SET_USER_SCAN:
- ret = libertas_set_user_scan_ioctl(priv, wrq);
- break;
- default:
- ret = -EOPNOTSUPP;
- }
- break;
default:
ret = -EINVAL;
break;
diff --git a/drivers/net/wireless/libertas/wlan_scan.c b/drivers/net/wireless/libertas/wlan_scan.c
index 59d6dfd..d820651 100644
--- a/drivers/net/wireless/libertas/wlan_scan.c
+++ b/drivers/net/wireless/libertas/wlan_scan.c
@@ -790,7 +790,7 @@ static int wlan_scan_channel_list(wlan_p
*
* @return WLAN_STATUS_SUCCESS or < 0 if error
*/
-static int wlan_scan_networks(wlan_private * priv,
+int wlan_scan_networks(wlan_private * priv,
const struct wlan_ioctl_user_scan_cfg * pUserScanIn)
{
wlan_adapter *Adapter = priv->adapter;
diff --git a/drivers/net/wireless/libertas/wlan_scan.h b/drivers/net/wireless/libertas/wlan_scan.h
index da5fd91..ee85385 100644
--- a/drivers/net/wireless/libertas/wlan_scan.h
+++ b/drivers/net/wireless/libertas/wlan_scan.h
@@ -229,6 +229,9 @@ extern int libertas_cmd_80211_scan(wlan_
extern int libertas_ret_80211_scan(wlan_private * priv,
struct HostCmd_DS_COMMAND *resp);
+int wlan_scan_networks(wlan_private * priv,
+ const struct wlan_ioctl_user_scan_cfg * pUserScanIn);
+
struct ifreq;
#ifdef __KERNEL__
diff --git a/drivers/net/wireless/libertas/wlan_wext.c b/drivers/net/wireless/libertas/wlan_wext.c
index 6688731..ff8c3b8 100644
--- a/drivers/net/wireless/libertas/wlan_wext.c
+++ b/drivers/net/wireless/libertas/wlan_wext.c
@@ -1675,18 +1675,6 @@ #endif /* REASSOCIATION */
IW_PRIV_TYPE_INT | 16,
IW_PRIV_TYPE_INT | 16,
"getrxinfo"},
-
- {
- WLAN_SET_GET_2K, /* IOCTL : 14 */
- IW_PRIV_TYPE_BYTE | 2000,
- IW_PRIV_TYPE_BYTE | 2000,
- ""},
-
- {
- WLAN_SET_USER_SCAN,
- IW_PRIV_TYPE_BYTE | 2000,
- IW_PRIV_TYPE_BYTE | 2000,
- "setuserscan"},
};
/**
diff --git a/drivers/net/wireless/libertas/wlan_wext.h b/drivers/net/wireless/libertas/wlan_wext.h
index 355a67d..f3054a3 100644
--- a/drivers/net/wireless/libertas/wlan_wext.h
+++ b/drivers/net/wireless/libertas/wlan_wext.h
@@ -74,9 +74,6 @@ #define GETLOG_BUFSIZE 300
#define WLANSCAN_TYPE (WLANIOCTL + 11)
-#define WLAN_SET_GET_2K (WLANIOCTL + 13)
-#define WLAN_SET_USER_SCAN 1
-
#define WLAN_SETNONE_GETONEINT (WLANIOCTL + 15)
#define WLANGETREGION 1
#define WLAN_GET_LISTEN_INTERVAL 2
More information about the libertas-dev
mailing list