Merge from vendor branch CVS:
[dragonfly.git] / sys / netproto / 802_11 / ieee80211_ratectl.h
1 /*
2  * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Sepherosa Ziehau <sepherosa@gmail.com>
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  * 
34  * $DragonFly: src/sys/netproto/802_11/ieee80211_ratectl.h,v 1.1 2006/09/01 15:12:11 sephe Exp $
35  */
36
37 #ifndef _NET80211_IEEE80211_RATECTL_H
38 #define _NET80211_IEEE80211_RATECTL_H
39
40 struct ieee80211_ratectl_state {
41         void            *rc_st_ctx;
42         u_int           rc_st_ratectl;          /* see IEEE80211_RATECTL_ */
43         uint32_t        rc_st_ratectl_cap;      /* see IEEE80211_RATECTL_CAP_ */
44         void            (*rc_st_change)(struct ieee80211com *, u_int, u_int);
45 };
46
47 struct ieee80211_ratectl_res {
48         int             rc_res_rateidx;
49         int             rc_res_tries;
50 };
51
52 struct ieee80211_ratectl {
53         const char      *rc_name;
54         u_int           rc_ratectl;     /* see IEEE80211_RATECTL_ */
55
56         void            *(*rc_attach)(struct ieee80211com *);
57         void            (*rc_detach)(void *);
58
59         void            (*rc_data_alloc)(struct ieee80211_node *);
60         void            (*rc_data_free)(struct ieee80211_node *);
61         void            (*rc_data_dup)(const struct ieee80211_node *,
62                                        struct ieee80211_node *);
63
64         void            (*rc_newstate)(void *, enum ieee80211_state);
65         void            (*rc_tx_complete)(void *, struct ieee80211_node *, int,
66                                           const struct ieee80211_ratectl_res[],
67                                           int, int, int, int);
68         void            (*rc_newassoc)(void *, struct ieee80211_node *, int);
69         int             (*rc_findrate)(void *, struct ieee80211_node *, int,
70                                        int[], int);
71 };
72
73 #define IEEE80211_RATECTL_NONE          0
74 #define IEEE80211_RATECTL_ONOE          1
75 #define IEEE80211_RATECTL_AMRR          2
76 #define IEEE80211_RATECTL_MAX           3
77
78 #define IEEE80211_AMRR_RATEIDX_MAX      4
79 #define IEEE80211_RATEIDX_MAX           5
80
81 #define IEEE80211_RATECTL_CAP(v)        (1 << (v))
82
83 #define _IEEE80211_RATECTL_CAP(n)       \
84         IEEE80211_RATECTL_CAP(IEEE80211_RATECTL_##n)
85
86 #define IEEE80211_RATECTL_CAP_NONE      _IEEE80211_RATECTL_CAP(NONE)
87 #define IEEE80211_RATECTL_CAP_ONOE      _IEEE80211_RATECTL_CAP(ONOE)
88 #define IEEE80211_RATECTL_CAP_AMRR      _IEEE80211_RATECTL_CAP(AMRR)
89
90 extern const struct ieee80211_ratectl   ieee80211_ratectl_none;
91
92 void    ieee80211_ratectl_attach(struct ieee80211com *);
93 void    ieee80211_ratectl_detach(struct ieee80211com *);
94
95 void    ieee80211_ratectl_register(const struct ieee80211_ratectl *);
96 void    ieee80211_ratectl_unregister(const struct ieee80211_ratectl *);
97
98 int     ieee80211_ratectl_change(struct ieee80211com *, u_int);
99
100 void    ieee80211_ratectl_data_alloc(struct ieee80211_node *);
101 void    ieee80211_ratectl_data_dup(const struct ieee80211_node *,
102                                    struct ieee80211_node *);
103 void    ieee80211_ratectl_data_free(struct ieee80211_node *);
104
105 void    ieee80211_ratectl_newstate(struct ieee80211com *,
106                                    enum ieee80211_state);
107 void    ieee80211_ratectl_tx_complete(struct ieee80211_node *, int,
108                                       const struct ieee80211_ratectl_res[],
109                                       int, int, int, int);
110 void    ieee80211_ratectl_newassoc(struct ieee80211_node *, int);
111 int     ieee80211_ratectl_findrate(struct ieee80211_node *, int, int[], int);
112
113 #endif  /* !_NET80211_IEEE80211_RATECTL_H */