1190214Srpaulo/*- 2190214Srpaulo * Copyright (c) 2010 Rui Paulo <rpaulo@FreeBSD.org> 3190214Srpaulo * All rights reserved. 4190214Srpaulo * 5190214Srpaulo * Redistribution and use in source and binary forms, with or without 6190214Srpaulo * modification, are permitted provided that the following conditions 7190214Srpaulo * are met: 8190214Srpaulo * 1. Redistributions of source code must retain the above copyright 9190214Srpaulo * notice, this list of conditions and the following disclaimer. 10190214Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 11190214Srpaulo * notice, this list of conditions and the following disclaimer in the 12190214Srpaulo * documentation and/or other materials provided with the distribution. 13190214Srpaulo * 14190214Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15190214Srpaulo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16190214Srpaulo * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17190214Srpaulo * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18190214Srpaulo * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19190214Srpaulo * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20190214Srpaulo * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21190214Srpaulo * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22190214Srpaulo * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23190214Srpaulo * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24190214Srpaulo * 25190214Srpaulo * $FreeBSD$ 26190214Srpaulo */ 27190214Srpaulo 28190214Srpauloenum ieee80211_ratealgs { 29190214Srpaulo IEEE80211_RATECTL_AMRR = 0, 30190214Srpaulo IEEE80211_RATECTL_RSSADAPT = 1, 31190214Srpaulo IEEE80211_RATECTL_ONOE = 2, 32190214Srpaulo IEEE80211_RATECTL_SAMPLE = 3, 33190214Srpaulo IEEE80211_RATECTL_NONE = 4, 34190214Srpaulo IEEE80211_RATECTL_MAX 35190214Srpaulo}; 36190214Srpaulo 37214518Srpaulo#define IEEE80211_RATECTL_TX_SUCCESS 1 38190214Srpaulo#define IEEE80211_RATECTL_TX_FAILURE 0 39190214Srpaulo 40190214Srpaulostruct ieee80211_ratectl { 41190214Srpaulo const char *ir_name; 42190214Srpaulo int (*ir_attach)(const struct ieee80211vap *); 43190214Srpaulo void (*ir_detach)(const struct ieee80211vap *); 44190214Srpaulo void (*ir_init)(struct ieee80211vap *); 45190214Srpaulo void (*ir_deinit)(struct ieee80211vap *); 46190214Srpaulo void (*ir_node_init)(struct ieee80211_node *); 47190214Srpaulo void (*ir_node_deinit)(struct ieee80211_node *); 48190214Srpaulo int (*ir_rate)(struct ieee80211_node *, void *, uint32_t); 49190214Srpaulo void (*ir_tx_complete)(const struct ieee80211vap *, 50190214Srpaulo const struct ieee80211_node *, int, 51190214Srpaulo void *, void *); 52190214Srpaulo void (*ir_tx_update)(const struct ieee80211vap *, 53190214Srpaulo const struct ieee80211_node *, 54190214Srpaulo void *, void *, void *); 55190214Srpaulo void (*ir_setinterval)(const struct ieee80211vap *, int); 56190214Srpaulo}; 57190214Srpaulo 58190214Srpaulovoid ieee80211_ratectl_register(int, const struct ieee80211_ratectl *); 59190214Srpaulovoid ieee80211_ratectl_unregister(int); 60190214Srpaulovoid ieee80211_ratectl_init(struct ieee80211vap *); 61190214Srpaulovoid ieee80211_ratectl_set(struct ieee80211vap *, int); 62190214Srpaulo 63214518Srpaulo#if defined (__HAIKU__) 64235426Sdelphijvoid ieee80211_ratectl_attach(struct ieee80211com *ic); 65235426Sdelphijvoid ieee80211_ratectl_detach(struct ieee80211com *ic); 66235426Sdelphijvoid ieee80211_ratectl_none_load(void); 67235426Sdelphijvoid ieee80211_ratectl_none_unload(void); 68235426Sdelphijvoid ieee80211_ratectl_amrr_load(void); 69235426Sdelphijvoid ieee80211_ratectl_amrr_unload(void); 70235426Sdelphijvoid ieee80211_ratectl_rssadapt_load(void); 71214518Srpaulovoid ieee80211_ratectl_rssadapt_unload(void); 72235426Sdelphij#endif 73190214Srpaulo 74214518SrpauloMALLOC_DECLARE(M_80211_RATECTL); 75214518Srpaulo 76214518Srpaulostatic void __inline 77214518Srpauloieee80211_ratectl_deinit(struct ieee80211vap *vap) 78214518Srpaulo{ 79190214Srpaulo vap->iv_rate->ir_deinit(vap); 80190214Srpaulo} 81190214Srpaulo 82190214Srpaulostatic void __inline 83190214Srpauloieee80211_ratectl_node_init(struct ieee80211_node *ni) 84190214Srpaulo{ 85190214Srpaulo const struct ieee80211vap *vap = ni->ni_vap; 86190214Srpaulo 87190214Srpaulo vap->iv_rate->ir_node_init(ni); 88190214Srpaulo} 89190214Srpaulo 90190214Srpaulostatic void __inline 91190214Srpauloieee80211_ratectl_node_deinit(struct ieee80211_node *ni) 92190214Srpaulo{ 93190214Srpaulo const struct ieee80211vap *vap = ni->ni_vap; 94190214Srpaulo 95190214Srpaulo vap->iv_rate->ir_node_deinit(ni); 96190214Srpaulo} 97190214Srpaulo 98190214Srpaulostatic int __inline 99190214Srpauloieee80211_ratectl_rate(struct ieee80211_node *ni, void *arg, uint32_t iarg) 100190214Srpaulo{ 101190214Srpaulo const struct ieee80211vap *vap = ni->ni_vap; 102190214Srpaulo 103190214Srpaulo return vap->iv_rate->ir_rate(ni, arg, iarg); 104190214Srpaulo} 105190214Srpaulo 106190214Srpaulostatic void __inline 107190214Srpauloieee80211_ratectl_tx_complete(const struct ieee80211vap *vap, 108190214Srpaulo const struct ieee80211_node *ni, int status, void *arg1, void *arg2) 109190214Srpaulo{ 110190214Srpaulo vap->iv_rate->ir_tx_complete(vap, ni, status, arg1, arg2); 111190214Srpaulo} 112190214Srpaulo 113190214Srpaulostatic void __inline 114190214Srpauloieee80211_ratectl_tx_update(const struct ieee80211vap *vap, 115190214Srpaulo const struct ieee80211_node *ni, void *arg1, void *arg2, void *arg3) 116190214Srpaulo{ 117190214Srpaulo if (vap->iv_rate->ir_tx_update == NULL) 118190214Srpaulo return; 119190214Srpaulo vap->iv_rate->ir_tx_update(vap, ni, arg1, arg2, arg3); 120190214Srpaulo} 121190214Srpaulo 122190214Srpaulostatic void __inline 123190214Srpauloieee80211_ratectl_setinterval(const struct ieee80211vap *vap, int msecs) 124190214Srpaulo{ 125190214Srpaulo if (vap->iv_rate->ir_setinterval == NULL) 126190214Srpaulo return; 127190214Srpaulo vap->iv_rate->ir_setinterval(vap, msecs); 128190214Srpaulo} 129190214Srpaulo