diff options
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r-- | net/wireless/nl80211.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 46417f9cce68..f02653a08993 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -5380,6 +5380,7 @@ static int nl80211_parse_mesh_config(struct genl_info *info, | |||
5380 | { | 5380 | { |
5381 | struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; | 5381 | struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; |
5382 | u32 mask = 0; | 5382 | u32 mask = 0; |
5383 | u16 ht_opmode; | ||
5383 | 5384 | ||
5384 | #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \ | 5385 | #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \ |
5385 | do { \ | 5386 | do { \ |
@@ -5471,9 +5472,36 @@ do { \ | |||
5471 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0, | 5472 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0, |
5472 | mask, NL80211_MESHCONF_RSSI_THRESHOLD, | 5473 | mask, NL80211_MESHCONF_RSSI_THRESHOLD, |
5473 | nl80211_check_s32); | 5474 | nl80211_check_s32); |
5474 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, ht_opmode, 0, 16, | 5475 | /* |
5475 | mask, NL80211_MESHCONF_HT_OPMODE, | 5476 | * Check HT operation mode based on |
5476 | nl80211_check_u16); | 5477 | * IEEE 802.11 2012 8.4.2.59 HT Operation element. |
5478 | */ | ||
5479 | if (tb[NL80211_MESHCONF_HT_OPMODE]) { | ||
5480 | ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); | ||
5481 | |||
5482 | if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | | ||
5483 | IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | | ||
5484 | IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) | ||
5485 | return -EINVAL; | ||
5486 | |||
5487 | if ((ht_opmode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) && | ||
5488 | (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) | ||
5489 | return -EINVAL; | ||
5490 | |||
5491 | switch (ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION) { | ||
5492 | case IEEE80211_HT_OP_MODE_PROTECTION_NONE: | ||
5493 | case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ: | ||
5494 | if (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT) | ||
5495 | return -EINVAL; | ||
5496 | break; | ||
5497 | case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER: | ||
5498 | case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED: | ||
5499 | if (!(ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) | ||
5500 | return -EINVAL; | ||
5501 | break; | ||
5502 | } | ||
5503 | cfg->ht_opmode = ht_opmode; | ||
5504 | } | ||
5477 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout, | 5505 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout, |
5478 | 1, 65535, mask, | 5506 | 1, 65535, mask, |
5479 | NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, | 5507 | NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, |