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