rate.c revision 37eb0b164cf9fa9f70c8500926f5cde7c652f48e
1/* 2 * Copyright 2002-2005, Instant802 Networks, Inc. 3 * Copyright 2005-2006, 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#include <linux/kernel.h> 12#include <linux/rtnetlink.h> 13#include "rate.h" 14#include "ieee80211_i.h" 15#include "debugfs.h" 16 17struct rate_control_alg { 18 struct list_head list; 19 struct rate_control_ops *ops; 20}; 21 22static LIST_HEAD(rate_ctrl_algs); 23static DEFINE_MUTEX(rate_ctrl_mutex); 24 25static char *ieee80211_default_rc_algo = CONFIG_MAC80211_RC_DEFAULT; 26module_param(ieee80211_default_rc_algo, charp, 0644); 27MODULE_PARM_DESC(ieee80211_default_rc_algo, 28 "Default rate control algorithm for mac80211 to use"); 29 30int ieee80211_rate_control_register(struct rate_control_ops *ops) 31{ 32 struct rate_control_alg *alg; 33 34 if (!ops->name) 35 return -EINVAL; 36 37 mutex_lock(&rate_ctrl_mutex); 38 list_for_each_entry(alg, &rate_ctrl_algs, list) { 39 if (!strcmp(alg->ops->name, ops->name)) { 40 /* don't register an algorithm twice */ 41 WARN_ON(1); 42 mutex_unlock(&rate_ctrl_mutex); 43 return -EALREADY; 44 } 45 } 46 47 alg = kzalloc(sizeof(*alg), GFP_KERNEL); 48 if (alg == NULL) { 49 mutex_unlock(&rate_ctrl_mutex); 50 return -ENOMEM; 51 } 52 alg->ops = ops; 53 54 list_add_tail(&alg->list, &rate_ctrl_algs); 55 mutex_unlock(&rate_ctrl_mutex); 56 57 return 0; 58} 59EXPORT_SYMBOL(ieee80211_rate_control_register); 60 61void ieee80211_rate_control_unregister(struct rate_control_ops *ops) 62{ 63 struct rate_control_alg *alg; 64 65 mutex_lock(&rate_ctrl_mutex); 66 list_for_each_entry(alg, &rate_ctrl_algs, list) { 67 if (alg->ops == ops) { 68 list_del(&alg->list); 69 kfree(alg); 70 break; 71 } 72 } 73 mutex_unlock(&rate_ctrl_mutex); 74} 75EXPORT_SYMBOL(ieee80211_rate_control_unregister); 76 77static struct rate_control_ops * 78ieee80211_try_rate_control_ops_get(const char *name) 79{ 80 struct rate_control_alg *alg; 81 struct rate_control_ops *ops = NULL; 82 83 if (!name) 84 return NULL; 85 86 mutex_lock(&rate_ctrl_mutex); 87 list_for_each_entry(alg, &rate_ctrl_algs, list) { 88 if (!strcmp(alg->ops->name, name)) 89 if (try_module_get(alg->ops->module)) { 90 ops = alg->ops; 91 break; 92 } 93 } 94 mutex_unlock(&rate_ctrl_mutex); 95 return ops; 96} 97 98/* Get the rate control algorithm. */ 99static struct rate_control_ops * 100ieee80211_rate_control_ops_get(const char *name) 101{ 102 struct rate_control_ops *ops; 103 const char *alg_name; 104 105 if (!name) 106 alg_name = ieee80211_default_rc_algo; 107 else 108 alg_name = name; 109 110 ops = ieee80211_try_rate_control_ops_get(alg_name); 111 if (!ops) { 112 request_module("rc80211_%s", alg_name); 113 ops = ieee80211_try_rate_control_ops_get(alg_name); 114 } 115 if (!ops && name) 116 /* try default if specific alg requested but not found */ 117 ops = ieee80211_try_rate_control_ops_get(ieee80211_default_rc_algo); 118 119 /* try built-in one if specific alg requested but not found */ 120 if (!ops && strlen(CONFIG_MAC80211_RC_DEFAULT)) 121 ops = ieee80211_try_rate_control_ops_get(CONFIG_MAC80211_RC_DEFAULT); 122 123 return ops; 124} 125 126static void ieee80211_rate_control_ops_put(struct rate_control_ops *ops) 127{ 128 module_put(ops->module); 129} 130 131#ifdef CONFIG_MAC80211_DEBUGFS 132static ssize_t rcname_read(struct file *file, char __user *userbuf, 133 size_t count, loff_t *ppos) 134{ 135 struct rate_control_ref *ref = file->private_data; 136 int len = strlen(ref->ops->name); 137 138 return simple_read_from_buffer(userbuf, count, ppos, 139 ref->ops->name, len); 140} 141 142static const struct file_operations rcname_ops = { 143 .read = rcname_read, 144 .open = mac80211_open_file_generic, 145}; 146#endif 147 148struct rate_control_ref *rate_control_alloc(const char *name, 149 struct ieee80211_local *local) 150{ 151 struct dentry *debugfsdir = NULL; 152 struct rate_control_ref *ref; 153 154 ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL); 155 if (!ref) 156 goto fail_ref; 157 kref_init(&ref->kref); 158 ref->local = local; 159 ref->ops = ieee80211_rate_control_ops_get(name); 160 if (!ref->ops) 161 goto fail_ops; 162 163#ifdef CONFIG_MAC80211_DEBUGFS 164 debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir); 165 local->debugfs.rcdir = debugfsdir; 166 debugfs_create_file("name", 0400, debugfsdir, ref, &rcname_ops); 167#endif 168 169 ref->priv = ref->ops->alloc(&local->hw, debugfsdir); 170 if (!ref->priv) 171 goto fail_priv; 172 return ref; 173 174fail_priv: 175 ieee80211_rate_control_ops_put(ref->ops); 176fail_ops: 177 kfree(ref); 178fail_ref: 179 return NULL; 180} 181 182static void rate_control_release(struct kref *kref) 183{ 184 struct rate_control_ref *ctrl_ref; 185 186 ctrl_ref = container_of(kref, struct rate_control_ref, kref); 187 ctrl_ref->ops->free(ctrl_ref->priv); 188 189#ifdef CONFIG_MAC80211_DEBUGFS 190 debugfs_remove_recursive(ctrl_ref->local->debugfs.rcdir); 191 ctrl_ref->local->debugfs.rcdir = NULL; 192#endif 193 194 ieee80211_rate_control_ops_put(ctrl_ref->ops); 195 kfree(ctrl_ref); 196} 197 198static bool rc_no_data_or_no_ack(struct ieee80211_tx_rate_control *txrc) 199{ 200 struct sk_buff *skb = txrc->skb; 201 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; 202 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 203 __le16 fc; 204 205 fc = hdr->frame_control; 206 207 return ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc)); 208} 209 210static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u8 max_rate_idx) 211{ 212 u8 i; 213 214 if (basic_rates == 0) 215 return; /* assume basic rates unknown and accept rate */ 216 if (*idx < 0) 217 return; 218 if (basic_rates & (1 << *idx)) 219 return; /* selected rate is a basic rate */ 220 221 for (i = *idx + 1; i <= max_rate_idx; i++) { 222 if (basic_rates & (1 << i)) { 223 *idx = i; 224 return; 225 } 226 } 227 228 /* could not find a basic rate; use original selection */ 229} 230 231bool rate_control_send_low(struct ieee80211_sta *sta, 232 void *priv_sta, 233 struct ieee80211_tx_rate_control *txrc) 234{ 235 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc->skb); 236 237 if (!sta || !priv_sta || rc_no_data_or_no_ack(txrc)) { 238 info->control.rates[0].idx = rate_lowest_index(txrc->sband, sta); 239 info->control.rates[0].count = 240 (info->flags & IEEE80211_TX_CTL_NO_ACK) ? 241 1 : txrc->hw->max_rate_tries; 242 if (!sta && txrc->ap) 243 rc_send_low_broadcast(&info->control.rates[0].idx, 244 txrc->bss_conf->basic_rates, 245 txrc->sband->n_bitrates); 246 return true; 247 } 248 return false; 249} 250EXPORT_SYMBOL(rate_control_send_low); 251 252static void rate_idx_match_mask(struct ieee80211_tx_rate *rate, 253 int n_bitrates, u32 mask) 254{ 255 int j; 256 257 /* See whether the selected rate or anything below it is allowed. */ 258 for (j = rate->idx; j >= 0; j--) { 259 if (mask & (1 << j)) { 260 /* Okay, found a suitable rate. Use it. */ 261 rate->idx = j; 262 return; 263 } 264 } 265 266 /* Try to find a higher rate that would be allowed */ 267 for (j = rate->idx + 1; j < n_bitrates; j++) { 268 if (mask & (1 << j)) { 269 /* Okay, found a suitable rate. Use it. */ 270 rate->idx = j; 271 return; 272 } 273 } 274 275 /* 276 * Uh.. No suitable rate exists. This should not really happen with 277 * sane TX rate mask configurations. However, should someone manage to 278 * configure supported rates and TX rate mask in incompatible way, 279 * allow the frame to be transmitted with whatever the rate control 280 * selected. 281 */ 282} 283 284void rate_control_get_rate(struct ieee80211_sub_if_data *sdata, 285 struct sta_info *sta, 286 struct ieee80211_tx_rate_control *txrc) 287{ 288 struct rate_control_ref *ref = sdata->local->rate_ctrl; 289 void *priv_sta = NULL; 290 struct ieee80211_sta *ista = NULL; 291 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc->skb); 292 int i; 293 u32 mask; 294 295 if (sta) { 296 ista = &sta->sta; 297 priv_sta = sta->rate_ctrl_priv; 298 } 299 300 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { 301 info->control.rates[i].idx = -1; 302 info->control.rates[i].flags = 0; 303 info->control.rates[i].count = 1; 304 } 305 306 ref->ops->get_rate(ref->priv, ista, priv_sta, txrc); 307 308 /* 309 * Try to enforce the rateidx mask the user wanted. skip this if the 310 * default mask (allow all rates) is used to save some processing for 311 * the common case. 312 */ 313 mask = sdata->rc_rateidx_mask[info->band]; 314 if (mask != (1 << txrc->sband->n_bitrates) - 1) { 315 if (sta) { 316 /* Filter out rates that the STA does not support */ 317 mask &= sta->sta.supp_rates[info->band]; 318 } 319 /* 320 * Make sure the rate index selected for each TX rate is 321 * included in the configured mask and change the rate indexes 322 * if needed. 323 */ 324 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { 325 /* Rate masking supports only legacy rates for now */ 326 if (info->control.rates[i].flags & IEEE80211_TX_RC_MCS) 327 continue; 328 rate_idx_match_mask(&info->control.rates[i], 329 txrc->sband->n_bitrates, mask); 330 } 331 } 332 333 BUG_ON(info->control.rates[0].idx < 0); 334} 335 336struct rate_control_ref *rate_control_get(struct rate_control_ref *ref) 337{ 338 kref_get(&ref->kref); 339 return ref; 340} 341 342void rate_control_put(struct rate_control_ref *ref) 343{ 344 kref_put(&ref->kref, rate_control_release); 345} 346 347int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, 348 const char *name) 349{ 350 struct rate_control_ref *ref, *old; 351 352 ASSERT_RTNL(); 353 354 if (local->open_count) 355 return -EBUSY; 356 357 if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) { 358 if (WARN_ON(!local->ops->set_rts_threshold)) 359 return -EINVAL; 360 return 0; 361 } 362 363 ref = rate_control_alloc(name, local); 364 if (!ref) { 365 printk(KERN_WARNING "%s: Failed to select rate control " 366 "algorithm\n", wiphy_name(local->hw.wiphy)); 367 return -ENOENT; 368 } 369 370 old = local->rate_ctrl; 371 local->rate_ctrl = ref; 372 if (old) { 373 rate_control_put(old); 374 sta_info_flush(local, NULL); 375 } 376 377 printk(KERN_DEBUG "%s: Selected rate control " 378 "algorithm '%s'\n", wiphy_name(local->hw.wiphy), 379 ref->ops->name); 380 381 return 0; 382} 383 384void rate_control_deinitialize(struct ieee80211_local *local) 385{ 386 struct rate_control_ref *ref; 387 388 ref = local->rate_ctrl; 389 390 if (!ref) 391 return; 392 393 local->rate_ctrl = NULL; 394 rate_control_put(ref); 395} 396 397