mac80211: enable starting BA session with custom timeout
authorSara Sharon <sara.sharon@intel.com>
Wed, 9 Mar 2016 11:27:09 +0000 (13:27 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 5 Apr 2016 09:46:05 +0000 (11:46 +0200)
Currently the debugfs entry for starting aggregation session
starts it with timeout of 5 seconds. Allow opening a session
with a custom timeout (according to spec 0 is no timeout).
while at it, refactor the function and remove the magic numbers.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/debugfs_sta.c

index a39512f09f9eb2992f825d479a609474414d9af5..fbbd66c9ca51c9068d3b8a60c3c79ca8fd6eacdb 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2006  Jiri Benc <jbenc@suse.cz>
  * Copyright 2007      Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
+ * Copyright(c) 2016 Intel Deutschland GmbH
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -151,11 +152,12 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
 static ssize_t sta_agg_status_write(struct file *file, const char __user *userbuf,
                                    size_t count, loff_t *ppos)
 {
-       char _buf[12] = {}, *buf = _buf;
+       char _buf[25] = {}, *buf = _buf;
        struct sta_info *sta = file->private_data;
        bool start, tx;
        unsigned long tid;
-       int ret;
+       char *pos;
+       int ret, timeout = 5000;
 
        if (count > sizeof(_buf))
                return -EINVAL;
@@ -164,37 +166,48 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
                return -EFAULT;
 
        buf[sizeof(_buf) - 1] = '\0';
+       pos = buf;
+       buf = strsep(&pos, " ");
+       if (!buf)
+               return -EINVAL;
 
-       if (strncmp(buf, "tx ", 3) == 0) {
-               buf += 3;
+       if (!strcmp(buf, "tx"))
                tx = true;
-       } else if (strncmp(buf, "rx ", 3) == 0) {
-               buf += 3;
+       else if (!strcmp(buf, "rx"))
                tx = false;
-       else
+       else
                return -EINVAL;
 
-       if (strncmp(buf, "start ", 6) == 0) {
-               buf += 6;
+       buf = strsep(&pos, " ");
+       if (!buf)
+               return -EINVAL;
+       if (!strcmp(buf, "start")) {
                start = true;
                if (!tx)
                        return -EINVAL;
-       } else if (strncmp(buf, "stop ", 5) == 0) {
-               buf += 5;
+       } else if (!strcmp(buf, "stop")) {
                start = false;
-       } else
+       } else {
+               return -EINVAL;
+       }
+
+       buf = strsep(&pos, " ");
+       if (!buf)
                return -EINVAL;
+       if (sscanf(buf, "timeout=%d", &timeout) == 1) {
+               buf = strsep(&pos, " ");
+               if (!buf || !tx || !start)
+                       return -EINVAL;
+       }
 
        ret = kstrtoul(buf, 0, &tid);
-       if (ret)
-               return ret;
-
-       if (tid >= IEEE80211_NUM_TIDS)
+       if (ret || tid >= IEEE80211_NUM_TIDS)
                return -EINVAL;
 
        if (tx) {
                if (start)
-                       ret = ieee80211_start_tx_ba_session(&sta->sta, tid, 5000);
+                       ret = ieee80211_start_tx_ba_session(&sta->sta, tid,
+                                                           timeout);
                else
                        ret = ieee80211_stop_tx_ba_session(&sta->sta, tid);
        } else {