> > 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