aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/nl80211.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r--net/wireless/nl80211.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index ae8ea3827acd..9755b3f04dd7 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -882,7 +882,8 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
882 CMD(set_pmksa, SET_PMKSA); 882 CMD(set_pmksa, SET_PMKSA);
883 CMD(del_pmksa, DEL_PMKSA); 883 CMD(del_pmksa, DEL_PMKSA);
884 CMD(flush_pmksa, FLUSH_PMKSA); 884 CMD(flush_pmksa, FLUSH_PMKSA);
885 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 885 if (dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
886 CMD(remain_on_channel, REMAIN_ON_CHANNEL);
886 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 887 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK);
887 CMD(mgmt_tx, FRAME); 888 CMD(mgmt_tx, FRAME);
888 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 889 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL);
@@ -922,11 +923,12 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
922 923
923 nla_nest_end(msg, nl_cmds); 924 nla_nest_end(msg, nl_cmds);
924 925
925 if (dev->ops->remain_on_channel) 926 if (dev->ops->remain_on_channel &&
927 dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)
926 NLA_PUT_U32(msg, NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 928 NLA_PUT_U32(msg, NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
927 dev->wiphy.max_remain_on_channel_duration); 929 dev->wiphy.max_remain_on_channel_duration);
928 930
929 if (dev->ops->mgmt_tx_cancel_wait) 931 if (dev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)
930 NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK); 932 NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK);
931 933
932 if (mgmt_stypes) { 934 if (mgmt_stypes) {
@@ -5127,7 +5129,8 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
5127 duration > rdev->wiphy.max_remain_on_channel_duration) 5129 duration > rdev->wiphy.max_remain_on_channel_duration)
5128 return -EINVAL; 5130 return -EINVAL;
5129 5131
5130 if (!rdev->ops->remain_on_channel) 5132 if (!rdev->ops->remain_on_channel ||
5133 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL))
5131 return -EOPNOTSUPP; 5134 return -EOPNOTSUPP;
5132 5135
5133 if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 5136 if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
@@ -5340,7 +5343,7 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
5340 return -EOPNOTSUPP; 5343 return -EOPNOTSUPP;
5341 5344
5342 if (info->attrs[NL80211_ATTR_DURATION]) { 5345 if (info->attrs[NL80211_ATTR_DURATION]) {
5343 if (!rdev->ops->mgmt_tx_cancel_wait) 5346 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
5344 return -EINVAL; 5347 return -EINVAL;
5345 wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 5348 wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
5346 } 5349 }
@@ -5358,6 +5361,9 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
5358 5361
5359 offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 5362 offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
5360 5363
5364 if (offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX))
5365 return -EINVAL;
5366
5361 no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 5367 no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
5362 5368
5363 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); 5369 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);