diff options
author | Rajkumar Manoharan <rmanohar@qca.qualcomm.com> | 2011-09-25 05:23:30 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-09-27 14:34:10 -0400 |
commit | e9f935e3e8dc0bddd0df6d148165d95925422502 (patch) | |
tree | bbb5de5434d0dd0aa7a1b5894320b17ebee434b8 /net/wireless | |
parent | 8ebafde00ed0c682fed8c34ac5ba90160ea0bb30 (diff) |
nl80211/cfg80211: Add support to disable CCK rate for management frame
Add a new nl80211 attribute to specify whether to send the management
frames in CCK rate or not. As of now the wpa_supplicant is disabling
CCK rate at P2P init itself. So this patch helps to send P2P probe
request/probe response/action frames being sent at non CCK rate in 2GHz
without disabling 11b rates.
This attribute is used with NL80211_CMD_TRIGGER_SCAN and
NL80211_CMD_FRAME commands to disable CCK rate for management frame
transmission.
Cc: Jouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/core.h | 3 | ||||
-rw-r--r-- | net/wireless/mlme.c | 5 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 9 |
3 files changed, 13 insertions, 4 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h index cb87b8bbceb7..b9ec3061ed72 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -375,7 +375,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, | |||
375 | struct ieee80211_channel *chan, bool offchan, | 375 | struct ieee80211_channel *chan, bool offchan, |
376 | enum nl80211_channel_type channel_type, | 376 | enum nl80211_channel_type channel_type, |
377 | bool channel_type_valid, unsigned int wait, | 377 | bool channel_type_valid, unsigned int wait, |
378 | const u8 *buf, size_t len, u64 *cookie); | 378 | const u8 *buf, size_t len, bool no_cck, |
379 | u64 *cookie); | ||
379 | 380 | ||
380 | /* SME */ | 381 | /* SME */ |
381 | int __cfg80211_connect(struct cfg80211_registered_device *rdev, | 382 | int __cfg80211_connect(struct cfg80211_registered_device *rdev, |
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index 61adea540e02..21fc9702f81c 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -900,7 +900,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, | |||
900 | struct ieee80211_channel *chan, bool offchan, | 900 | struct ieee80211_channel *chan, bool offchan, |
901 | enum nl80211_channel_type channel_type, | 901 | enum nl80211_channel_type channel_type, |
902 | bool channel_type_valid, unsigned int wait, | 902 | bool channel_type_valid, unsigned int wait, |
903 | const u8 *buf, size_t len, u64 *cookie) | 903 | const u8 *buf, size_t len, bool no_cck, |
904 | u64 *cookie) | ||
904 | { | 905 | { |
905 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 906 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
906 | const struct ieee80211_mgmt *mgmt; | 907 | const struct ieee80211_mgmt *mgmt; |
@@ -991,7 +992,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, | |||
991 | /* Transmit the Action frame as requested by user space */ | 992 | /* Transmit the Action frame as requested by user space */ |
992 | return rdev->ops->mgmt_tx(&rdev->wiphy, dev, chan, offchan, | 993 | return rdev->ops->mgmt_tx(&rdev->wiphy, dev, chan, offchan, |
993 | channel_type, channel_type_valid, | 994 | channel_type, channel_type_valid, |
994 | wait, buf, len, cookie); | 995 | wait, buf, len, no_cck, cookie); |
995 | } | 996 | } |
996 | 997 | ||
997 | bool cfg80211_rx_mgmt(struct net_device *dev, int freq, const u8 *buf, | 998 | bool cfg80211_rx_mgmt(struct net_device *dev, int freq, const u8 *buf, |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index a3e26951fd8b..48c1bf1a142d 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -191,6 +191,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { | |||
191 | .len = IEEE80211_MAX_DATA_LEN }, | 191 | .len = IEEE80211_MAX_DATA_LEN }, |
192 | [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, | 192 | [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, |
193 | [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, | 193 | [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, |
194 | [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, | ||
194 | }; | 195 | }; |
195 | 196 | ||
196 | /* policy for the key attributes */ | 197 | /* policy for the key attributes */ |
@@ -3620,6 +3621,9 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) | |||
3620 | } | 3621 | } |
3621 | } | 3622 | } |
3622 | 3623 | ||
3624 | request->no_cck = | ||
3625 | nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); | ||
3626 | |||
3623 | request->dev = dev; | 3627 | request->dev = dev; |
3624 | request->wiphy = &rdev->wiphy; | 3628 | request->wiphy = &rdev->wiphy; |
3625 | 3629 | ||
@@ -5171,6 +5175,7 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) | |||
5171 | struct sk_buff *msg; | 5175 | struct sk_buff *msg; |
5172 | unsigned int wait = 0; | 5176 | unsigned int wait = 0; |
5173 | bool offchan; | 5177 | bool offchan; |
5178 | bool no_cck; | ||
5174 | 5179 | ||
5175 | if (!info->attrs[NL80211_ATTR_FRAME] || | 5180 | if (!info->attrs[NL80211_ATTR_FRAME] || |
5176 | !info->attrs[NL80211_ATTR_WIPHY_FREQ]) | 5181 | !info->attrs[NL80211_ATTR_WIPHY_FREQ]) |
@@ -5207,6 +5212,8 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) | |||
5207 | 5212 | ||
5208 | offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; | 5213 | offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; |
5209 | 5214 | ||
5215 | no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); | ||
5216 | |||
5210 | freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); | 5217 | freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); |
5211 | chan = rdev_freq_to_chan(rdev, freq, channel_type); | 5218 | chan = rdev_freq_to_chan(rdev, freq, channel_type); |
5212 | if (chan == NULL) | 5219 | if (chan == NULL) |
@@ -5227,7 +5234,7 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) | |||
5227 | channel_type_valid, wait, | 5234 | channel_type_valid, wait, |
5228 | nla_data(info->attrs[NL80211_ATTR_FRAME]), | 5235 | nla_data(info->attrs[NL80211_ATTR_FRAME]), |
5229 | nla_len(info->attrs[NL80211_ATTR_FRAME]), | 5236 | nla_len(info->attrs[NL80211_ATTR_FRAME]), |
5230 | &cookie); | 5237 | no_cck, &cookie); |
5231 | if (err) | 5238 | if (err) |
5232 | goto free_msg; | 5239 | goto free_msg; |
5233 | 5240 | ||