diff options
Diffstat (limited to 'net/mac80211/rate.h')
-rw-r--r-- | net/mac80211/rate.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/net/mac80211/rate.h b/net/mac80211/rate.h new file mode 100644 index 000000000000..5b45f33cb766 --- /dev/null +++ b/net/mac80211/rate.h | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | * Copyright 2002-2005, Instant802 Networks, Inc. | ||
3 | * Copyright 2005, Devicescape Software, Inc. | ||
4 | * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #ifndef IEEE80211_RATE_H | ||
12 | #define IEEE80211_RATE_H | ||
13 | |||
14 | #include <linux/netdevice.h> | ||
15 | #include <linux/skbuff.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/kref.h> | ||
18 | #include <net/mac80211.h> | ||
19 | #include "ieee80211_i.h" | ||
20 | #include "sta_info.h" | ||
21 | |||
22 | /* TODO: kdoc */ | ||
23 | struct rate_selection { | ||
24 | /* Selected transmission rate */ | ||
25 | struct ieee80211_rate *rate; | ||
26 | /* Non-ERP rate to use if mac80211 decides it cannot use an ERP rate */ | ||
27 | struct ieee80211_rate *nonerp; | ||
28 | /* probe with this rate, or NULL for no probing */ | ||
29 | struct ieee80211_rate *probe; | ||
30 | }; | ||
31 | |||
32 | struct rate_control_ops { | ||
33 | struct module *module; | ||
34 | const char *name; | ||
35 | void (*tx_status)(void *priv, struct net_device *dev, | ||
36 | struct sk_buff *skb, | ||
37 | struct ieee80211_tx_status *status); | ||
38 | void (*get_rate)(void *priv, struct net_device *dev, | ||
39 | struct ieee80211_supported_band *band, | ||
40 | struct sk_buff *skb, | ||
41 | struct rate_selection *sel); | ||
42 | void (*rate_init)(void *priv, void *priv_sta, | ||
43 | struct ieee80211_local *local, struct sta_info *sta); | ||
44 | void (*clear)(void *priv); | ||
45 | |||
46 | void *(*alloc)(struct ieee80211_local *local); | ||
47 | void (*free)(void *priv); | ||
48 | void *(*alloc_sta)(void *priv, gfp_t gfp); | ||
49 | void (*free_sta)(void *priv, void *priv_sta); | ||
50 | |||
51 | int (*add_attrs)(void *priv, struct kobject *kobj); | ||
52 | void (*remove_attrs)(void *priv, struct kobject *kobj); | ||
53 | void (*add_sta_debugfs)(void *priv, void *priv_sta, | ||
54 | struct dentry *dir); | ||
55 | void (*remove_sta_debugfs)(void *priv, void *priv_sta); | ||
56 | }; | ||
57 | |||
58 | struct rate_control_ref { | ||
59 | struct rate_control_ops *ops; | ||
60 | void *priv; | ||
61 | struct kref kref; | ||
62 | }; | ||
63 | |||
64 | int ieee80211_rate_control_register(struct rate_control_ops *ops); | ||
65 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); | ||
66 | |||
67 | /* Get a reference to the rate control algorithm. If `name' is NULL, get the | ||
68 | * first available algorithm. */ | ||
69 | struct rate_control_ref *rate_control_alloc(const char *name, | ||
70 | struct ieee80211_local *local); | ||
71 | void rate_control_get_rate(struct net_device *dev, | ||
72 | struct ieee80211_supported_band *sband, | ||
73 | struct sk_buff *skb, | ||
74 | struct rate_selection *sel); | ||
75 | struct rate_control_ref *rate_control_get(struct rate_control_ref *ref); | ||
76 | void rate_control_put(struct rate_control_ref *ref); | ||
77 | |||
78 | static inline void rate_control_tx_status(struct net_device *dev, | ||
79 | struct sk_buff *skb, | ||
80 | struct ieee80211_tx_status *status) | ||
81 | { | ||
82 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
83 | struct rate_control_ref *ref = local->rate_ctrl; | ||
84 | |||
85 | ref->ops->tx_status(ref->priv, dev, skb, status); | ||
86 | } | ||
87 | |||
88 | |||
89 | static inline void rate_control_rate_init(struct sta_info *sta, | ||
90 | struct ieee80211_local *local) | ||
91 | { | ||
92 | struct rate_control_ref *ref = sta->rate_ctrl; | ||
93 | ref->ops->rate_init(ref->priv, sta->rate_ctrl_priv, local, sta); | ||
94 | } | ||
95 | |||
96 | |||
97 | static inline void rate_control_clear(struct ieee80211_local *local) | ||
98 | { | ||
99 | struct rate_control_ref *ref = local->rate_ctrl; | ||
100 | ref->ops->clear(ref->priv); | ||
101 | } | ||
102 | |||
103 | static inline void *rate_control_alloc_sta(struct rate_control_ref *ref, | ||
104 | gfp_t gfp) | ||
105 | { | ||
106 | return ref->ops->alloc_sta(ref->priv, gfp); | ||
107 | } | ||
108 | |||
109 | static inline void rate_control_free_sta(struct rate_control_ref *ref, | ||
110 | void *priv) | ||
111 | { | ||
112 | ref->ops->free_sta(ref->priv, priv); | ||
113 | } | ||
114 | |||
115 | static inline void rate_control_add_sta_debugfs(struct sta_info *sta) | ||
116 | { | ||
117 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
118 | struct rate_control_ref *ref = sta->rate_ctrl; | ||
119 | if (sta->debugfs.dir && ref->ops->add_sta_debugfs) | ||
120 | ref->ops->add_sta_debugfs(ref->priv, sta->rate_ctrl_priv, | ||
121 | sta->debugfs.dir); | ||
122 | #endif | ||
123 | } | ||
124 | |||
125 | static inline void rate_control_remove_sta_debugfs(struct sta_info *sta) | ||
126 | { | ||
127 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
128 | struct rate_control_ref *ref = sta->rate_ctrl; | ||
129 | if (ref->ops->remove_sta_debugfs) | ||
130 | ref->ops->remove_sta_debugfs(ref->priv, sta->rate_ctrl_priv); | ||
131 | #endif | ||
132 | } | ||
133 | |||
134 | static inline int rate_supported(struct sta_info *sta, | ||
135 | enum ieee80211_band band, | ||
136 | int index) | ||
137 | { | ||
138 | return (sta == NULL || sta->supp_rates[band] & BIT(index)); | ||
139 | } | ||
140 | |||
141 | static inline int | ||
142 | rate_lowest_index(struct ieee80211_local *local, | ||
143 | struct ieee80211_supported_band *sband, | ||
144 | struct sta_info *sta) | ||
145 | { | ||
146 | int i; | ||
147 | |||
148 | for (i = 0; i < sband->n_bitrates; i++) | ||
149 | if (rate_supported(sta, sband->band, i)) | ||
150 | return i; | ||
151 | |||
152 | /* warn when we cannot find a rate. */ | ||
153 | WARN_ON(1); | ||
154 | |||
155 | return 0; | ||
156 | } | ||
157 | |||
158 | static inline struct ieee80211_rate * | ||
159 | rate_lowest(struct ieee80211_local *local, | ||
160 | struct ieee80211_supported_band *sband, | ||
161 | struct sta_info *sta) | ||
162 | { | ||
163 | return &sband->bitrates[rate_lowest_index(local, sband, sta)]; | ||
164 | } | ||
165 | |||
166 | |||
167 | /* functions for rate control related to a device */ | ||
168 | int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, | ||
169 | const char *name); | ||
170 | void rate_control_deinitialize(struct ieee80211_local *local); | ||
171 | |||
172 | |||
173 | /* Rate control algorithms */ | ||
174 | #if defined(RC80211_PID_COMPILE) || \ | ||
175 | (defined(CONFIG_MAC80211_RC_PID) && \ | ||
176 | !defined(CONFIG_MAC80211_RC_PID_MODULE)) | ||
177 | extern int rc80211_pid_init(void); | ||
178 | extern void rc80211_pid_exit(void); | ||
179 | #else | ||
180 | static inline int rc80211_pid_init(void) | ||
181 | { | ||
182 | return 0; | ||
183 | } | ||
184 | static inline void rc80211_pid_exit(void) | ||
185 | { | ||
186 | } | ||
187 | #endif | ||
188 | |||
189 | #endif /* IEEE80211_RATE_H */ | ||