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:
		
							
								
								
									
										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
 | 
			
		||||
+++ 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,
 | 
			
		||||
 	"Set a bitmap of allowed antennas to use for TX and RX.\n"
 | 
			
		||||
 	"The driver may reject antenna configurations it cannot support.");
 | 
			
		||||
 
 | 
			
		||||
@@ -83,15 +83,15 @@
 | 
			
		||||
 	if (tb_msg[NL80211_ATTR_FEATURE_FLAGS]) {
 | 
			
		||||
 		unsigned int features = nla_get_u32(tb_msg[NL80211_ATTR_FEATURE_FLAGS]);
 | 
			
		||||
 
 | 
			
		||||
@@ -552,6 +561,7 @@ broken_combination:
 | 
			
		||||
 		if (features & NL80211_FEATURE_AP_SCAN)
 | 
			
		||||
 			printf("\tDevice supports AP scan.\n");
 | 
			
		||||
@@ -554,6 +563,7 @@ broken_combination:
 | 
			
		||||
 		if (features & NL80211_FEATURE_ACKTO_ESTIMATION)
 | 
			
		||||
 			printf("\tDevice supports ACK timeout estimation.\n");
 | 
			
		||||
 	}
 | 
			
		||||
+#endif
 | 
			
		||||
 
 | 
			
		||||
 	if (tb_msg[NL80211_ATTR_TDLS_SUPPORT])
 | 
			
		||||
 		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.");
 | 
			
		||||
 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,
 | 
			
		||||
 			   struct nl_cb *cb, struct nl_msg *msg,
 | 
			
		||||
 			   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,
 | 
			
		||||
 	 "list all known commands and their decimal & hex value");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user