|
|
@@ -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 <[email protected]>
|
|
|
+---
|
|
|
+ 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,
|