diff options
author | sam <sam@FreeBSD.org> | 2006-11-26 19:55:26 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2006-11-26 19:55:26 +0000 |
commit | c3214b94926d043aa52912394efb1ae0022d20c0 (patch) | |
tree | 75f2d6af95da1b6a0bdb772d5c28e7061d99a878 /sys/net80211 | |
parent | 7a0f94ae15ccd01f41f23e78ac95424efd1e5104 (diff) | |
download | FreeBSD-src-c3214b94926d043aa52912394efb1ae0022d20c0.zip FreeBSD-src-c3214b94926d043aa52912394efb1ae0022d20c0.tar.gz |
device-independent implementation of AMRR tx rate control algorithm
Obtained from: openbsd (w/ mods)
MFC after: 1 month
Diffstat (limited to 'sys/net80211')
-rw-r--r-- | sys/net80211/ieee80211_amrr.c | 164 | ||||
-rw-r--r-- | sys/net80211/ieee80211_amrr.h | 64 |
2 files changed, 228 insertions, 0 deletions
diff --git a/sys/net80211/ieee80211_amrr.c b/sys/net80211/ieee80211_amrr.c new file mode 100644 index 0000000..60f6b93 --- /dev/null +++ b/sys/net80211/ieee80211_amrr.c @@ -0,0 +1,164 @@ +/* $OpenBSD: ieee80211_amrr.c,v 1.1 2006/06/17 19:07:19 damien Exp $ */ + +/*- + * 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/cdefs.h> +__FBSDID("$FreeBSD$"); + +/*- + * 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 + */ +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/socket.h> +#include <sys/sysctl.h> + +#include <net/if.h> +#include <net/if_media.h> + +#ifdef INET +#include <netinet/in.h> +#include <netinet/if_ether.h> +#endif + +#include <net80211/ieee80211.h> +#include <net80211/ieee80211_var.h> +#include <net80211/ieee80211_amrr.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)->ni_txrate == 0) +#define is_max_rate(ni) \ + ((ni)->ni_txrate == (ni)->ni_rates.rs_nrates - 1) +#define increase_rate(ni) \ + ((ni)->ni_txrate++) +#define decrease_rate(ni) \ + ((ni)->ni_txrate--) +#define reset_cnt(amn) \ + do { (amn)->amn_txcnt = (amn)->amn_retrycnt = 0; } while (0) + +void +ieee80211_amrr_init(struct ieee80211_amrr *amrr, + struct ieee80211com *ic, int min, int max) +{ + /* XXX bounds check? */ + amrr->amrr_min_success_threshold = min; + amrr->amrr_max_success_threshold = max; + amrr->amrr_ic = ic; +} + +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->ni_txrate. + */ +void +ieee80211_amrr_choose(struct ieee80211_amrr *amrr, struct ieee80211_node *ni, + struct ieee80211_amrr_node *amn) +{ + int need_change = 0; + + 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); + IEEE80211_DPRINTF(amrr->amrr_ic, IEEE80211_MSG_RATECTL, + "AMRR increasing rate %d (txcnt=%d " + "retrycnt=%d)\n", + ni->ni_rates.rs_rates[ni->ni_txrate] & + IEEE80211_RATE_VAL, + amn->amn_txcnt, 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); + IEEE80211_DPRINTF(amrr->amrr_ic, IEEE80211_MSG_RATECTL, + "AMRR decreasing rate %d (txcnt=%d " + "retrycnt=%d)\n", + ni->ni_rates.rs_rates[ni->ni_txrate] & + IEEE80211_RATE_VAL, + amn->amn_txcnt, amn->amn_retrycnt); + need_change = 1; + } + amn->amn_recovery = 0; + } + + if (is_enough(amn) || need_change) + reset_cnt(amn); +} + +/* + * Module glue. + */ +static int +amrr_modevent(module_t mod, int type, void *unused) +{ + switch (type) { + case MOD_LOAD: + if (bootverbose) + printf("wlan_amrr: <AMRR Transmit Rate Control Algorithm>\n"); + return 0; + case MOD_UNLOAD: + return 0; + } + return EINVAL; +} + +static moduledata_t amrr_mod = { + "wlan_amrr", + amrr_modevent, + 0 +}; +DECLARE_MODULE(wlan_amrr, amrr_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); +MODULE_VERSION(wlan_amrr, 1); diff --git a/sys/net80211/ieee80211_amrr.h b/sys/net80211/ieee80211_amrr.h new file mode 100644 index 0000000..947d617 --- /dev/null +++ b/sys/net80211/ieee80211_amrr.h @@ -0,0 +1,64 @@ +/* $FreeBSD$ */ +/* $OpenBSD: ieee80211_amrr.h,v 1.3 2006/06/17 19:34:31 damien Exp $ */ + +/*- + * 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_IEEE80211_AMRR_H_ +#define _NET80211_IEEE80211_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 + */ + +/* + * Rate control settings. + */ +struct ieee80211com; + +struct ieee80211_amrr { + u_int amrr_min_success_threshold; + u_int amrr_max_success_threshold; + struct ieee80211com *amrr_ic; +}; + +#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 { + u_int amn_success; + u_int amn_recovery; + u_int amn_success_threshold; + u_int amn_txcnt; + u_int amn_retrycnt; +}; + +void ieee80211_amrr_init(struct ieee80211_amrr *, + struct ieee80211com *ic, int, int); +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 *); + +#endif /* _NET80211_IEEE80211_AMRR_H_ */ |