diff options
| author | David S. Miller <davem@davemloft.net> | 2011-07-22 17:01:44 -0700 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-07-22 17:01:44 -0700 |
| commit | f9035cd498486d5a82ad8ae9bcfdb91b3e57ec9d (patch) | |
| tree | f90d0fc8abc1edf7fd161252704bb5675f3460d0 /net/wireless/util.c | |
| parent | 1821f7cd65ad9ea56580b830ac79bf4c4fef59cb (diff) | |
| parent | 41bf37117b47fc5ce2aae91f6a108e7e42e0b046 (diff) | |
Merge branch 'for-davem' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Diffstat (limited to 'net/wireless/util.c')
| -rw-r--r-- | net/wireless/util.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/net/wireless/util.c b/net/wireless/util.c index 4d7b83fbc32f..be75a3a0424e 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -1006,3 +1006,41 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev, return -EBUSY; } + +int ieee80211_get_ratemask(struct ieee80211_supported_band *sband, + const u8 *rates, unsigned int n_rates, + u32 *mask) +{ + int i, j; + + if (!sband) + return -EINVAL; + + if (n_rates == 0 || n_rates > NL80211_MAX_SUPP_RATES) + return -EINVAL; + + *mask = 0; + + for (i = 0; i < n_rates; i++) { + int rate = (rates[i] & 0x7f) * 5; + bool found = false; + + for (j = 0; j < sband->n_bitrates; j++) { + if (sband->bitrates[j].bitrate == rate) { + found = true; + *mask |= BIT(j); + break; + } + } + if (!found) + return -EINVAL; + } + + /* + * mask must have at least one bit set here since we + * didn't accept a 0-length rates array nor allowed + * entries in the array that didn't exist + */ + + return 0; +} |
