iw: add support for dynamic distance selection (supported by ath9k now)
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 42689
This commit is contained in:
parent
d27893122d
commit
ca25f76e82
3 changed files with 100 additions and 6 deletions
94
package/network/utils/iw/patches/010-dynack.patch
Normal file
94
package/network/utils/iw/patches/010-dynack.patch
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
|
||||||
|
|
||||||
|
Add auto parameter to set distance command in order to enable ACK timeout
|
||||||
|
estimation algorithm (dynack). Dynack is automatically disabled setting valid
|
||||||
|
value for coverage class. Currently dynack is supported just by ath9k
|
||||||
|
|
||||||
|
This patch is based on "configure dynack through mac80211/cfg80211 stack"
|
||||||
|
patchset sent on linux-wireless
|
||||||
|
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
|
||||||
|
---
|
||||||
|
info.c | 2 ++
|
||||||
|
nl80211.h | 12 ++++++++++++
|
||||||
|
phy.c | 43 +++++++++++++++++++++++++------------------
|
||||||
|
3 files changed, 39 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
--- a/info.c
|
||||||
|
+++ b/info.c
|
||||||
|
@@ -551,6 +551,8 @@ broken_combination:
|
||||||
|
printf("\tDevice supports scan flush.\n");
|
||||||
|
if (features & NL80211_FEATURE_AP_SCAN)
|
||||||
|
printf("\tDevice supports AP scan.\n");
|
||||||
|
+ if (features & NL80211_FEATURE_ACKTO_ESTIMATION)
|
||||||
|
+ printf("\tDevice supports ACK timeout estimation.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tb_msg[NL80211_ATTR_TDLS_SUPPORT])
|
||||||
|
--- a/phy.c
|
||||||
|
+++ b/phy.c
|
||||||
|
@@ -362,39 +362,46 @@ static int handle_distance(struct nl8021
|
||||||
|
int argc, char **argv,
|
||||||
|
enum id_input id)
|
||||||
|
{
|
||||||
|
- char *end;
|
||||||
|
- unsigned int distance, coverage;
|
||||||
|
-
|
||||||
|
if (argc != 1)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (!*argv[0])
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- distance = strtoul(argv[0], &end, 10);
|
||||||
|
+ if (strcmp("auto", argv[0]) == 0) {
|
||||||
|
+ NLA_PUT_FLAG(msg, NL80211_ATTR_WIPHY_DYN_ACK);
|
||||||
|
+ } else {
|
||||||
|
+ char *end;
|
||||||
|
+ unsigned int distance, coverage;
|
||||||
|
|
||||||
|
- if (*end)
|
||||||
|
- return 1;
|
||||||
|
+ distance = strtoul(argv[0], &end, 10);
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * Divide double the distance by the speed of light in m/usec (300) to
|
||||||
|
- * get round-trip time in microseconds and then divide the result by
|
||||||
|
- * three to get coverage class as specified in IEEE 802.11-2007 table
|
||||||
|
- * 7-27. Values are rounded upwards.
|
||||||
|
- */
|
||||||
|
- coverage = (distance + 449) / 450;
|
||||||
|
- if (coverage > 255)
|
||||||
|
- return 1;
|
||||||
|
+ if (*end)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Divide double the distance by the speed of light
|
||||||
|
+ * in m/usec (300) to get round-trip time in microseconds
|
||||||
|
+ * and then divide the result by three to get coverage class
|
||||||
|
+ * as specified in IEEE 802.11-2007 table 7-27.
|
||||||
|
+ * Values are rounded upwards.
|
||||||
|
+ */
|
||||||
|
+ coverage = (distance + 449) / 450;
|
||||||
|
+ if (coverage > 255)
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
- NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, coverage);
|
||||||
|
+ NLA_PUT_U8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, coverage);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
nla_put_failure:
|
||||||
|
return -ENOBUFS;
|
||||||
|
}
|
||||||
|
-COMMAND(set, distance, "<distance>",
|
||||||
|
+COMMAND(set, distance, "<auto|distance>",
|
||||||
|
NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_distance,
|
||||||
|
- "Set appropriate coverage class for given link distance in meters.\n"
|
||||||
|
+ "Enable ACK timeout estimation algorithm (dynack) or set appropriate\n"
|
||||||
|
+ "coverage class for given link distance in meters.\n"
|
||||||
|
+ "To disable dynack set valid value for coverage class.\n"
|
||||||
|
"Valid values: 0 - 114750");
|
||||||
|
|
||||||
|
static int handle_txpower(struct nl80211_state *state,
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/phy.c
|
--- a/phy.c
|
||||||
+++ b/phy.c
|
+++ b/phy.c
|
||||||
@@ -488,3 +488,31 @@ COMMAND(set, antenna, "<bitmap> | all |
|
@@ -495,3 +495,31 @@ COMMAND(set, antenna, "<bitmap> | all |
|
||||||
NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_antenna,
|
NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_antenna,
|
||||||
"Set a bitmap of allowed antennas to use for TX and RX.\n"
|
"Set a bitmap of allowed antennas to use for TX and RX.\n"
|
||||||
"The driver may reject antenna configurations it cannot support.");
|
"The driver may reject antenna configurations it cannot support.");
|
||||||
|
|
|
@ -83,15 +83,15 @@
|
||||||
if (tb_msg[NL80211_ATTR_FEATURE_FLAGS]) {
|
if (tb_msg[NL80211_ATTR_FEATURE_FLAGS]) {
|
||||||
unsigned int features = nla_get_u32(tb_msg[NL80211_ATTR_FEATURE_FLAGS]);
|
unsigned int features = nla_get_u32(tb_msg[NL80211_ATTR_FEATURE_FLAGS]);
|
||||||
|
|
||||||
@@ -552,6 +561,7 @@ broken_combination:
|
@@ -554,6 +563,7 @@ broken_combination:
|
||||||
if (features & NL80211_FEATURE_AP_SCAN)
|
if (features & NL80211_FEATURE_ACKTO_ESTIMATION)
|
||||||
printf("\tDevice supports AP scan.\n");
|
printf("\tDevice supports ACK timeout estimation.\n");
|
||||||
}
|
}
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
if (tb_msg[NL80211_ATTR_TDLS_SUPPORT])
|
if (tb_msg[NL80211_ATTR_TDLS_SUPPORT])
|
||||||
printf("\tDevice supports T-DLS.\n");
|
printf("\tDevice supports T-DLS.\n");
|
||||||
@@ -601,6 +611,7 @@ TOPLEVEL(list, NULL, NL80211_CMD_GET_WIP
|
@@ -603,6 +613,7 @@ TOPLEVEL(list, NULL, NL80211_CMD_GET_WIP
|
||||||
"List all wireless devices and their capabilities.");
|
"List all wireless devices and their capabilities.");
|
||||||
TOPLEVEL(phy, NULL, NL80211_CMD_GET_WIPHY, NLM_F_DUMP, CIB_NONE, handle_info, NULL);
|
TOPLEVEL(phy, NULL, NL80211_CMD_GET_WIPHY, NLM_F_DUMP, CIB_NONE, handle_info, NULL);
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
static int handle_commands(struct nl80211_state *state,
|
static int handle_commands(struct nl80211_state *state,
|
||||||
struct nl_cb *cb, struct nl_msg *msg,
|
struct nl_cb *cb, struct nl_msg *msg,
|
||||||
int argc, char **argv, enum id_input id)
|
int argc, char **argv, enum id_input id)
|
||||||
@@ -613,6 +624,7 @@ static int handle_commands(struct nl8021
|
@@ -615,6 +626,7 @@ static int handle_commands(struct nl8021
|
||||||
}
|
}
|
||||||
TOPLEVEL(commands, NULL, NL80211_CMD_GET_WIPHY, 0, CIB_NONE, handle_commands,
|
TOPLEVEL(commands, NULL, NL80211_CMD_GET_WIPHY, 0, CIB_NONE, handle_commands,
|
||||||
"list all known commands and their decimal & hex value");
|
"list all known commands and their decimal & hex value");
|
||||||
|
|
Loading…
Reference in a new issue