diff options
| -rw-r--r-- | exception_lists/packaging | 2 | ||||
| -rw-r--r-- | usr/src/uts/common/Makefile.files | 2 | ||||
| -rw-r--r-- | usr/src/uts/common/io/net80211/net80211_amrr.c | 125 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/Makefile | 1 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/net80211.h | 5 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/net80211_amrr.h | 73 |
6 files changed, 207 insertions, 1 deletions
diff --git a/exception_lists/packaging b/exception_lists/packaging index 88c7318180..5fba2183a2 100644 --- a/exception_lists/packaging +++ b/exception_lists/packaging @@ -25,6 +25,7 @@ # Copyright 2014 Garrett D'Amore <garrett@damore.org> # Copyright 2014 Nexenta Systems, Inc. All rights reserved. # Copyright 2016 Toomas Soome <tsoome@me.com> +# Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> # # @@ -353,6 +354,7 @@ usr/platform/sun4u/include/sys/fcode.h sparc # # Private net80211 headers # +usr/include/sys/net80211_amrr.h usr/include/sys/net80211_crypto.h usr/include/sys/net80211_ht.h usr/include/sys/net80211_proto.h diff --git a/usr/src/uts/common/Makefile.files b/usr/src/uts/common/Makefile.files index 3f8730b3dd..0ba302bd66 100644 --- a/usr/src/uts/common/Makefile.files +++ b/usr/src/uts/common/Makefile.files @@ -680,7 +680,7 @@ NET80211_OBJS += net80211.o net80211_proto.o net80211_input.o \ net80211_output.o net80211_node.o net80211_crypto.o \ net80211_crypto_none.o net80211_crypto_wep.o net80211_ioctl.o \ net80211_crypto_tkip.o net80211_crypto_ccmp.o \ - net80211_ht.o + net80211_ht.o net80211_amrr.o VNIC_OBJS += vnic_ctl.o vnic_dev.o diff --git a/usr/src/uts/common/io/net80211/net80211_amrr.c b/usr/src/uts/common/io/net80211/net80211_amrr.c new file mode 100644 index 0000000000..61d917bfbe --- /dev/null +++ b/usr/src/uts/common/io/net80211/net80211_amrr.c @@ -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); +} diff --git a/usr/src/uts/common/sys/Makefile b/usr/src/uts/common/sys/Makefile index e24638958c..4c308a7fe1 100644 --- a/usr/src/uts/common/sys/Makefile +++ b/usr/src/uts/common/sys/Makefile @@ -411,6 +411,7 @@ CHKHDRS= \ ndifm.h \ ndi_impldefs.h \ net80211.h \ + net80211_amrr.h \ net80211_crypto.h \ net80211_ht.h \ net80211_proto.h \ diff --git a/usr/src/uts/common/sys/net80211.h b/usr/src/uts/common/sys/net80211.h index 313b335afa..1946e0b284 100644 --- a/usr/src/uts/common/sys/net80211.h +++ b/usr/src/uts/common/sys/net80211.h @@ -4,6 +4,10 @@ */ /* + * Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> + */ + +/* * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting * All rights reserved. @@ -44,6 +48,7 @@ #include <sys/net80211_proto.h> #include <sys/net80211_crypto.h> #include <sys/net80211_ht.h> +#include <sys/net80211_amrr.h> #include <net/wpa.h> /* diff --git a/usr/src/uts/common/sys/net80211_amrr.h b/usr/src/uts/common/sys/net80211_amrr.h new file mode 100644 index 0000000000..36bd2fcd0e --- /dev/null +++ b/usr/src/uts/common/sys/net80211_amrr.h @@ -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_ */ |
