ieee80211_ratectl.h revision 206358
1198090Srdivacky/*- 2193323Sed * Copyright (c) 2010 Rui Paulo <rpaulo@FreeBSD.org> 3193323Sed * All rights reserved. 4193323Sed * 5193323Sed * Redistribution and use in source and binary forms, with or without 6193323Sed * modification, are permitted provided that the following conditions 7193323Sed * are met: 8193323Sed * 1. Redistributions of source code must retain the above copyright 9193323Sed * notice, this list of conditions and the following disclaimer. 10198090Srdivacky * 2. Redistributions in binary form must reproduce the above copyright 11193323Sed * notice, this list of conditions and the following disclaimer in the 12249423Sdim * documentation and/or other materials provided with the distribution. 13198090Srdivacky * 14249423Sdim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15198090Srdivacky * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16198090Srdivacky * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17193323Sed * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18193323Sed * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19193323Sed * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20251662Sdim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21193323Sed * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22193323Sed * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23249423Sdim * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24249423Sdim * 25249423Sdim * $FreeBSD: head/sys/net80211/ieee80211_ratectl.h 206358 2010-04-07 15:29:13Z rpaulo $ 26249423Sdim */ 27249423Sdim 28249423Sdimenum ieee80211_ratealgs { 29249423Sdim IEEE80211_RATECTL_AMRR = 0, 30249423Sdim IEEE80211_RATECTL_RSSADAPT = 1, 31249423Sdim IEEE80211_RATECTL_ONOE = 2, 32198090Srdivacky IEEE80211_RATECTL_SAMPLE = 3, 33249423Sdim IEEE80211_RATECTL_MAX 34193323Sed}; 35193323Sed 36249423Sdim#define IEEE80211_RATECTL_TX_SUCCESS 0 37193323Sed#define IEEE80211_RATECTL_TX_FAILURE 1 38193323Sed 39193323Sedstruct ieee80211_ratectl { 40193323Sed const char *ir_name; 41193323Sed int (*ir_attach)(const struct ieee80211vap *); 42193323Sed void (*ir_detach)(const struct ieee80211vap *); 43193323Sed void (*ir_init)(struct ieee80211vap *); 44193323Sed void (*ir_deinit)(struct ieee80211vap *); 45243830Sdim void (*ir_node_init)(struct ieee80211_node *); 46243830Sdim void (*ir_node_deinit)(struct ieee80211_node *); 47198892Srdivacky int (*ir_rate)(struct ieee80211_node *, void *, uint32_t); 48226633Sdim void (*ir_tx_complete)(const struct ieee80211vap *, 49243830Sdim const struct ieee80211_node *, int, 50226633Sdim void *, void *); 51226633Sdim void (*ir_tx_update)(const struct ieee80211vap *, 52226633Sdim const struct ieee80211_node *, 53226633Sdim void *, void *, void *); 54226633Sdim void (*ir_setinterval)(const struct ieee80211vap *, int); 55226633Sdim}; 56234353Sdim 57234353Sdimvoid ieee80211_ratectl_register(int, const struct ieee80211_ratectl *); 58249423Sdimvoid ieee80211_ratectl_unregister(int); 59249423Sdimvoid ieee80211_ratectl_set(struct ieee80211vap *, int); 60234353Sdim 61234353SdimMALLOC_DECLARE(M_80211_RATECTL); 62249423Sdim 63249423Sdimstatic void __inline 64243830Sdimieee80211_ratectl_init(struct ieee80211vap *vap) 65234353Sdim{ 66234353Sdim vap->iv_rate->ir_init(vap); 67234353Sdim} 68234353Sdim 69234353Sdimstatic void __inline 70234353Sdimieee80211_ratectl_deinit(struct ieee80211vap *vap) 71249423Sdim{ 72234353Sdim vap->iv_rate->ir_deinit(vap); 73234353Sdim} 74243830Sdim 75249423Sdimstatic void __inline 76249423Sdimieee80211_ratectl_node_init(struct ieee80211_node *ni) 77249423Sdim{ 78249423Sdim const struct ieee80211vap *vap = ni->ni_vap; 79234353Sdim 80234353Sdim vap->iv_rate->ir_node_init(ni); 81234353Sdim} 82234353Sdim 83234353Sdimstatic void __inline 84234353Sdimieee80211_ratectl_node_deinit(struct ieee80211_node *ni) 85234353Sdim{ 86234353Sdim const struct ieee80211vap *vap = ni->ni_vap; 87234353Sdim 88234353Sdim vap->iv_rate->ir_node_deinit(ni); 89234353Sdim} 90243830Sdim 91234353Sdimstatic int __inline 92234353Sdimieee80211_ratectl_rate(struct ieee80211_node *ni, void *arg, uint32_t iarg) 93243830Sdim{ 94226633Sdim const struct ieee80211vap *vap = ni->ni_vap; 95226633Sdim 96198892Srdivacky if (ni->ni_rctls == NULL) /* ratectl not setup */ 97198892Srdivacky return; 98243830Sdim return vap->iv_rate->ir_rate(ni, arg, iarg); 99198892Srdivacky} 100198892Srdivacky 101198892Srdivackystatic void __inline 102198892Srdivackyieee80211_ratectl_tx_complete(const struct ieee80211vap *vap, 103218893Sdim const struct ieee80211_node *ni, int status, void *arg1, void *arg2) 104198892Srdivacky{ 105243830Sdim if (ni->ni_rctls == NULL) /* ratectl not setup */ 106198892Srdivacky return; 107234353Sdim vap->iv_rate->ir_tx_complete(vap, ni, status, arg1, arg2); 108198892Srdivacky} 109243830Sdim 110249423Sdimstatic void __inline 111198892Srdivackyieee80211_ratectl_tx_update(const struct ieee80211vap *vap, 112234353Sdim const struct ieee80211_node *ni, void *arg1, void *arg2, void *arg3) 113198892Srdivacky{ 114198892Srdivacky if (vap->iv_rate->ir_tx_update == NULL) 115243830Sdim return; 116234353Sdim if (ni->ni_rctls == NULL) /* ratectl not setup */ 117226633Sdim return; 118243830Sdim vap->iv_rate->ir_tx_update(vap, ni, arg1, arg2, arg3); 119243830Sdim} 120198892Srdivacky 121198892Srdivackystatic void __inline 122198892Srdivackyieee80211_ratectl_setinterval(const struct ieee80211vap *vap, int msecs) 123198892Srdivacky{ 124198892Srdivacky if (vap->iv_rate->ir_setinterval == NULL) 125198892Srdivacky return; 126243830Sdim vap->iv_rate->ir_setinterval(vap, msecs); 127198892Srdivacky} 128198892Srdivacky