Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net> Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Dan McDonald <danmcd@omniti.com>
- Loading branch information
1 parent
f73e030
commit 976d66a
Showing
6 changed files
with
207 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
/* $NetBSD: ieee80211_amrr.c,v 1.2 2007/12/11 12:40:10 lukem Exp $ */ | ||
/* $OpenBSD: ieee80211_amrr.c,v 1.1 2006/06/17 19:07:19 damien Exp $ */ | ||
|
||
/* | ||
* Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> | ||
*/ | ||
|
||
/* | ||
* Copyright (c) 2006 | ||
* Damien Bergamini <damien.bergamini@free.fr> | ||
* | ||
* Permission to use, copy, modify, and distribute this software for any | ||
* purpose with or without fee is hereby granted, provided that the above | ||
* copyright notice and this permission notice appear in all copies. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
*/ | ||
|
||
#include <sys/param.h> | ||
#include <sys/socket.h> | ||
#include <sys/sdt.h> | ||
|
||
#include <net/if.h> | ||
|
||
#include <sys/net80211.h> | ||
#include <sys/net80211_amrr.h> | ||
#include "net80211_impl.h" | ||
|
||
#define is_success(amn) \ | ||
((amn)->amn_retrycnt < (amn)->amn_txcnt / 10) | ||
#define is_failure(amn) \ | ||
((amn)->amn_retrycnt > (amn)->amn_txcnt / 3) | ||
#define is_enough(amn) \ | ||
((amn)->amn_txcnt > 10) | ||
#define is_min_rate(ni) \ | ||
((ni)->in_txrate == 0) | ||
#define is_max_rate(ni) \ | ||
((ni)->in_txrate == (ni)->in_rates.ir_nrates - 1) | ||
#define increase_rate(ni) \ | ||
((ni)->in_txrate++) | ||
#define decrease_rate(ni) \ | ||
((ni)->in_txrate--) | ||
#define reset_cnt(amn) \ | ||
do { (amn)->amn_txcnt = (amn)->amn_retrycnt = 0; \ | ||
_NOTE(CONSTCOND) } while (0) | ||
|
||
void | ||
ieee80211_amrr_node_init(struct ieee80211_amrr *amrr, | ||
struct ieee80211_amrr_node *amn) | ||
{ | ||
amn->amn_success = 0; | ||
amn->amn_recovery = 0; | ||
amn->amn_txcnt = amn->amn_retrycnt = 0; | ||
amn->amn_success_threshold = amrr->amrr_min_success_threshold; | ||
} | ||
|
||
/* | ||
* Update ni->in_txrate. | ||
*/ | ||
void | ||
ieee80211_amrr_choose(struct ieee80211_amrr *amrr, struct ieee80211_node *ni, | ||
struct ieee80211_amrr_node *amn) | ||
{ | ||
int need_change = 0; | ||
uint8_t rate; | ||
|
||
if (is_success(amn) && is_enough(amn)) { | ||
amn->amn_success++; | ||
if (amn->amn_success >= amn->amn_success_threshold && | ||
!is_max_rate(ni)) { | ||
amn->amn_recovery = 1; | ||
amn->amn_success = 0; | ||
increase_rate(ni); | ||
rate = ni->in_rates.ir_rates[ni->in_txrate] & | ||
IEEE80211_RATE_VAL; | ||
ieee80211_dbg(IEEE80211_MSG_XRATE, | ||
"AMRR increasing rate %d (txcnt=%d retrycnt=%d)", | ||
rate, amn->amn_txcnt, amn->amn_retrycnt); | ||
DTRACE_PROBE4(amrr__increase__rate, | ||
struct ieee80211_node *, ni, | ||
uint8_t, rate, | ||
uint_t, amn->amn_txcnt, | ||
uint_t, amn->amn_retrycnt); | ||
need_change = 1; | ||
} else { | ||
amn->amn_recovery = 0; | ||
} | ||
} else if (is_failure(amn)) { | ||
amn->amn_success = 0; | ||
if (!is_min_rate(ni)) { | ||
if (amn->amn_recovery) { | ||
amn->amn_success_threshold *= 2; | ||
if (amn->amn_success_threshold > | ||
amrr->amrr_max_success_threshold) | ||
amn->amn_success_threshold = | ||
amrr->amrr_max_success_threshold; | ||
} else { | ||
amn->amn_success_threshold = | ||
amrr->amrr_min_success_threshold; | ||
} | ||
decrease_rate(ni); | ||
rate = ni->in_rates.ir_rates[ni->in_txrate] & | ||
IEEE80211_RATE_VAL; | ||
ieee80211_dbg(IEEE80211_MSG_XRATE, | ||
"AMRR decreasing rate %d (txcnt=%d retrycnt=%d)", | ||
rate, amn->amn_txcnt, amn->amn_retrycnt); | ||
DTRACE_PROBE4(amrr__decrease__rate, | ||
struct ieee80211_node *, ni, | ||
uint8_t, rate, | ||
uint_t, amn->amn_txcnt, | ||
uint_t, amn->amn_retrycnt); | ||
need_change = 1; | ||
} | ||
amn->amn_recovery = 0; | ||
} | ||
|
||
if (is_enough(amn) || need_change) | ||
reset_cnt(amn); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* $OpenBSD: ieee80211_amrr.h,v 1.3 2006/06/17 19:34:31 damien Exp $ */ | ||
/* $NetBSD: ieee80211_amrr.h,v 1.1 2006/10/31 21:53:41 joerg Exp $ */ | ||
|
||
/* | ||
* Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> | ||
*/ | ||
|
||
/* | ||
* Copyright (c) 2006 | ||
* Damien Bergamini <damien.bergamini@free.fr> | ||
* | ||
* Permission to use, copy, modify, and distribute this software for any | ||
* purpose with or without fee is hereby granted, provided that the above | ||
* copyright notice and this permission notice appear in all copies. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
*/ | ||
#ifndef _NET80211_AMRR_H_ | ||
#define _NET80211_AMRR_H_ | ||
|
||
/* | ||
* Naive implementation of the Adaptive Multi Rate Retry algorithm: | ||
* | ||
* "IEEE 802.11 Rate Adaptation: A Practical Approach" | ||
* Mathieu Lacage, Hossein Manshaei, Thierry Turletti | ||
* INRIA Sophia - Projet Planete | ||
* http://www-sop.inria.fr/rapports/sophia/RR-5208.html | ||
*/ | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
struct ieee80211_node; | ||
|
||
/* | ||
* Rate control settings. | ||
*/ | ||
struct ieee80211_amrr { | ||
uint_t amrr_min_success_threshold; | ||
uint_t amrr_max_success_threshold; | ||
}; | ||
|
||
#define IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD 1 | ||
#define IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD 15 | ||
|
||
/* | ||
* Rate control state for a given node. | ||
*/ | ||
struct ieee80211_amrr_node { | ||
uint_t amn_success; | ||
uint_t amn_recovery; | ||
uint_t amn_success_threshold; | ||
uint_t amn_txcnt; | ||
uint_t amn_retrycnt; | ||
}; | ||
|
||
void ieee80211_amrr_node_init(struct ieee80211_amrr *, | ||
struct ieee80211_amrr_node *); | ||
void ieee80211_amrr_choose(struct ieee80211_amrr *, struct ieee80211_node *, | ||
struct ieee80211_amrr_node *); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* _NET80211_AMRR_H_ */ |