>
> bump.

Hi Joe,

sorry for the delay

>
> On Mon, Mar 18, 2019 at 10:59 PM Joe Ayers <j...@ayerscasa.com> wrote:
>>
>> Lorenzo,  I have tested dynack on a (real distance apart) ~60km link
>> with some success.   This is the code change made:
>>
>> --- a/drivers/net/wireless/ath/ath9k/dynack.c
>> +++ b/drivers/net/wireless/ath/ath9k/dynack.c
>> @@ -20,8 +20,9 @@
>>
>>  #define COMPUTE_TO (5 * HZ)
>>  #define LATEACK_DELAY (10 * HZ)
>> -#define LATEACK_TO 256
>> -#define MAX_DELAY 300
>> +#define LATEACK_TO 1054
>> +/* AREDN max distance set to 150km */
>> +#define MAX_DELAY 1054
>>  #define EWMA_LEVEL 96
>>  #define EWMA_DIV 128
>>
>> @@ -293,7 +294,8 @@
>>  void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an)
>>  {
>>   /* ackto = slottime + sifs + air delay */
>> - u32 ackto = 9 + 16 + 64;
>> + /* AREDN starting point is 20km */
>> + u32 ackto = 9 + 16 + 171;
>>   struct ath_dynack *da = &ah->dynack;
>>
>>   an->ackto = ackto;
>> @@ -328,7 +330,8 @@
>>  void ath_dynack_reset(struct ath_hw *ah)
>>  {
>>   /* ackto = slottime + sifs + air delay */
>> - u32 ackto = 9 + 16 + 64;
>> + /* AREDN starting point is 20km */
>> + u32 ackto = 9 + 16 + 171;
>>   struct ath_dynack *da = &ah->dynack;
>>
>>   da->lto = jiffies;
>>
>> Notes:
>>
>> 1) The stations are showing ack_to between 525 up to 575 A.  When
>> static set at 60k distance, the timeout is set to 460 S.
>> 2) significant performance improvement between these settings with
>> iperf3 and back to back runs with reboot in the middle:
>>

could you please try to attached patch? The max distance the hw can
support depends of channel width:
e.g @20MHz (HT20, 5GHz)

max distance is ~ 61Km

@Koen: do you have any chance to test the attached patch in your
environment? Thx

>> run 1 @ static 60km:
>> [  5]   0.00-10.00  sec  7.31 MBytes  6.13 Mbits/sec    0             sender
>> [  5]   0.00-10.08  sec  7.16 MBytes  5.95 Mbits/sec                  
>> receiver
>>
>> run 2 @ static 60km:
>> [  5]   0.00-10.00  sec  5.88 MBytes  4.93 Mbits/sec    0             sender
>> [  5]   0.00-10.04  sec  5.77 MBytes  4.81 Mbits/sec                  
>> receiver
>>
>> run 1 and 2 @ auto distance -- goes up to ~575us with data flow,
>> floats back to ~525 otherwise:
>> [  5]   0.00-10.00  sec  20.0 MBytes  16.8 Mbits/sec    0             sender
>> [  5]   0.00-10.07  sec  19.8 MBytes  16.5 Mbits/sec                  
>> receiver
>>
>> [  5]   0.00-10.00  sec  21.4 MBytes  18.0 Mbits/sec    0             sender
>> [  5]   0.00-10.04  sec  21.2 MBytes  17.7 Mbits/sec                  
>> receiver
>>
>> 3) running wpa_supplicant and psk2
>> 4) running ibss on ch 176 with AREDN channels on top of 18.06.2
>> 5) on one reboot, one of the stations stayed down at initial 196, then
>> bumped up to ~250 range and stayed there, link not functional.  Not
>> sure how to explain this value...
>>
>> Question,  can this condition be true periodically while the link is
>> live or only at initial 802.11 adhoc link setup?:
>>
>>                 if (ieee80211_is_assoc_req(hdr->frame_control) ||
>>                     ieee80211_is_assoc_resp(hdr->frame_control) ||
>>                     ieee80211_is_auth(hdr->frame_control)) {
>>

I do not think so since AFAIK auth frames are sent just during ibss join

>> 6)  Auto distance stayed at initial 196 when turning off encryption.
>>
>> Any ideas of alternative options of packets to key off in late ack
>> situation?   running wpad-mini is ~500k file size and RAM consumer.
>> It would be beneficial to take wpa_supplicant out of the equation if
>> at all possible.
>>

What is mandatory are unicast frames during joining phase, maybe you can
develop an userspace daemon for this purpose

>> Joe

Regards,
Lorenzo
From 72f4ba6f6b6021fcc48d07d03407c2fdb16a46c5 Mon Sep 17 00:00:00 2001
Message-Id: <72f4ba6f6b6021fcc48d07d03407c2fdb16a46c5.1554035972.git.lore...@kernel.org>
In-Reply-To: <cover.1554035972.git.lore...@kernel.org>
References: <cover.1554035972.git.lore...@kernel.org>
From: Lorenzo Bianconi <lore...@kernel.org>
Date: Sun, 31 Mar 2019 14:38:49 +0200
Subject: [PATCH] ath: dynack: set max timeout according to clockrate

Signed-off-by: Lorenzo Bianconi <lore...@kernel.org>
---
 drivers/net/wireless/ath/ath9k/dynack.c | 36 ++++++++++++++++++-------
 1 file changed, 26 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/dynack.c b/drivers/net/wireless/ath/ath9k/dynack.c
index f112fa5b2eac..0627111249dd 100644
--- a/drivers/net/wireless/ath/ath9k/dynack.c
+++ b/drivers/net/wireless/ath/ath9k/dynack.c
@@ -20,11 +20,24 @@
 
 #define COMPUTE_TO		(5 * HZ)
 #define LATEACK_DELAY		(10 * HZ)
-#define LATEACK_TO		256
-#define MAX_DELAY		300
 #define EWMA_LEVEL		96
 #define EWMA_DIV		128
 
+/**
+ * ath_dynack_get_max_to - set max timeout according to clockrate
+ * @ah: ath hw
+ *
+ */
+static u32 ath_dynack_get_max_to(struct ath_hw *ah)
+{
+	struct ath_common *common = ath9k_hw_common(ah);
+
+	if (common->clockrate)
+		return AR_TIME_OUT_ACK / common->clockrate;
+
+	return 300;
+}
+
 /**
  * ath_dynack_ewma - EWMA (Exponentially Weighted Moving Average) calculation
  *
@@ -116,15 +129,16 @@ static void ath_dynack_compute_ackto(struct ath_hw *ah)
  */
 static void ath_dynack_compute_to(struct ath_hw *ah)
 {
-	u32 ackto, ack_ts;
-	u8 *dst, *src;
+	struct ath_dynack *da = &ah->dynack;
+	u32 ackto, ack_ts, max_to;
 	struct ieee80211_sta *sta;
-	struct ath_node *an;
 	struct ts_info *st_ts;
-	struct ath_dynack *da = &ah->dynack;
+	struct ath_node *an;
+	u8 *dst, *src;
 
 	rcu_read_lock();
 
+	max_to = ath_dynack_get_max_to(ah);
 	while (da->st_rbf.h_rb != da->st_rbf.t_rb &&
 	       da->ack_rbf.h_rb != da->ack_rbf.t_rb) {
 		ack_ts = da->ack_rbf.tstamp[da->ack_rbf.h_rb];
@@ -140,7 +154,7 @@ static void ath_dynack_compute_to(struct ath_hw *ah)
 		if (ack_ts > st_ts->tstamp + st_ts->dur) {
 			ackto = ack_ts - st_ts->tstamp - st_ts->dur;
 
-			if (ackto < MAX_DELAY) {
+			if (ackto < max_to) {
 				sta = ieee80211_find_sta_by_ifaddr(ah->hw, dst,
 								   src);
 				if (sta) {
@@ -197,11 +211,13 @@ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
 		if (ieee80211_is_assoc_req(hdr->frame_control) ||
 		    ieee80211_is_assoc_resp(hdr->frame_control) ||
 		    ieee80211_is_auth(hdr->frame_control)) {
+			u32 max_to = ath_dynack_get_max_to(ah);
+
 			ath_dbg(common, DYNACK, "late ack\n");
 
-			ath9k_hw_setslottime(ah, (LATEACK_TO - 3) / 2);
-			ath9k_hw_set_ack_timeout(ah, LATEACK_TO);
-			ath9k_hw_set_cts_timeout(ah, LATEACK_TO);
+			ath9k_hw_setslottime(ah, (max_to - 3) / 2);
+			ath9k_hw_set_ack_timeout(ah, max_to);
+			ath9k_hw_set_cts_timeout(ah, max_to);
 			if (sta) {
 				struct ath_node *an;
 
-- 
2.20.1

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to