summaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-04-17 14:26:25 -0400
committerDavid S. Miller <davem@davemloft.net>2019-04-17 14:26:25 -0400
commit6b0a7f84ea1fe248df96ccc4dd86e817e32ef65b (patch)
tree0a7976054052e793da782c2b7ec34eccfbf66449 /net/wireless
parentcea0aa9cbd5ad4efe267e9487ed5d48d16756253 (diff)
parentfe5cdef29e41c8bda8cd1a11545e7c6bfe25570e (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflict resolution of af_smc.c from Stephen Rothwell. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/nl80211.c18
-rw-r--r--net/wireless/reg.c39
-rw-r--r--net/wireless/scan.c3
-rw-r--r--net/wireless/util.c6
4 files changed, 56 insertions, 10 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 33408ba1d7ee..e7ee18ab6cb7 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -13614,7 +13614,8 @@ static const struct genl_ops nl80211_ops[] = {
13614 .doit = nl80211_associate, 13614 .doit = nl80211_associate,
13615 .flags = GENL_UNS_ADMIN_PERM, 13615 .flags = GENL_UNS_ADMIN_PERM,
13616 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13616 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13617 NL80211_FLAG_NEED_RTNL, 13617 NL80211_FLAG_NEED_RTNL |
13618 NL80211_FLAG_CLEAR_SKB,
13618 }, 13619 },
13619 { 13620 {
13620 .cmd = NL80211_CMD_DEAUTHENTICATE, 13621 .cmd = NL80211_CMD_DEAUTHENTICATE,
@@ -13659,14 +13660,16 @@ static const struct genl_ops nl80211_ops[] = {
13659 .doit = nl80211_connect, 13660 .doit = nl80211_connect,
13660 .flags = GENL_UNS_ADMIN_PERM, 13661 .flags = GENL_UNS_ADMIN_PERM,
13661 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13662 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13662 NL80211_FLAG_NEED_RTNL, 13663 NL80211_FLAG_NEED_RTNL |
13664 NL80211_FLAG_CLEAR_SKB,
13663 }, 13665 },
13664 { 13666 {
13665 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 13667 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
13666 .doit = nl80211_update_connect_params, 13668 .doit = nl80211_update_connect_params,
13667 .flags = GENL_ADMIN_PERM, 13669 .flags = GENL_ADMIN_PERM,
13668 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13670 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13669 NL80211_FLAG_NEED_RTNL, 13671 NL80211_FLAG_NEED_RTNL |
13672 NL80211_FLAG_CLEAR_SKB,
13670 }, 13673 },
13671 { 13674 {
13672 .cmd = NL80211_CMD_DISCONNECT, 13675 .cmd = NL80211_CMD_DISCONNECT,
@@ -13691,7 +13694,8 @@ static const struct genl_ops nl80211_ops[] = {
13691 .doit = nl80211_setdel_pmksa, 13694 .doit = nl80211_setdel_pmksa,
13692 .flags = GENL_UNS_ADMIN_PERM, 13695 .flags = GENL_UNS_ADMIN_PERM,
13693 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13696 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
13694 NL80211_FLAG_NEED_RTNL, 13697 NL80211_FLAG_NEED_RTNL |
13698 NL80211_FLAG_CLEAR_SKB,
13695 }, 13699 },
13696 { 13700 {
13697 .cmd = NL80211_CMD_DEL_PMKSA, 13701 .cmd = NL80211_CMD_DEL_PMKSA,
@@ -13999,7 +14003,8 @@ static const struct genl_ops nl80211_ops[] = {
13999 .dumpit = nl80211_vendor_cmd_dump, 14003 .dumpit = nl80211_vendor_cmd_dump,
14000 .flags = GENL_UNS_ADMIN_PERM, 14004 .flags = GENL_UNS_ADMIN_PERM,
14001 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14005 .internal_flags = NL80211_FLAG_NEED_WIPHY |
14002 NL80211_FLAG_NEED_RTNL, 14006 NL80211_FLAG_NEED_RTNL |
14007 NL80211_FLAG_CLEAR_SKB,
14003 }, 14008 },
14004 { 14009 {
14005 .cmd = NL80211_CMD_SET_QOS_MAP, 14010 .cmd = NL80211_CMD_SET_QOS_MAP,
@@ -14047,7 +14052,8 @@ static const struct genl_ops nl80211_ops[] = {
14047 .cmd = NL80211_CMD_SET_PMK, 14052 .cmd = NL80211_CMD_SET_PMK,
14048 .doit = nl80211_set_pmk, 14053 .doit = nl80211_set_pmk,
14049 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14054 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
14050 NL80211_FLAG_NEED_RTNL, 14055 NL80211_FLAG_NEED_RTNL |
14056 NL80211_FLAG_CLEAR_SKB,
14051 }, 14057 },
14052 { 14058 {
14053 .cmd = NL80211_CMD_DEL_PMK, 14059 .cmd = NL80211_CMD_DEL_PMK,
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 2f1bf91eb226..0ba778f371cb 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -1309,6 +1309,16 @@ reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1,
1309 return dfs_region1; 1309 return dfs_region1;
1310} 1310}
1311 1311
1312static void reg_wmm_rules_intersect(const struct ieee80211_wmm_ac *wmm_ac1,
1313 const struct ieee80211_wmm_ac *wmm_ac2,
1314 struct ieee80211_wmm_ac *intersect)
1315{
1316 intersect->cw_min = max_t(u16, wmm_ac1->cw_min, wmm_ac2->cw_min);
1317 intersect->cw_max = max_t(u16, wmm_ac1->cw_max, wmm_ac2->cw_max);
1318 intersect->cot = min_t(u16, wmm_ac1->cot, wmm_ac2->cot);
1319 intersect->aifsn = max_t(u8, wmm_ac1->aifsn, wmm_ac2->aifsn);
1320}
1321
1312/* 1322/*
1313 * Helper for regdom_intersect(), this does the real 1323 * Helper for regdom_intersect(), this does the real
1314 * mathematical intersection fun 1324 * mathematical intersection fun
@@ -1323,6 +1333,8 @@ static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
1323 struct ieee80211_freq_range *freq_range; 1333 struct ieee80211_freq_range *freq_range;
1324 const struct ieee80211_power_rule *power_rule1, *power_rule2; 1334 const struct ieee80211_power_rule *power_rule1, *power_rule2;
1325 struct ieee80211_power_rule *power_rule; 1335 struct ieee80211_power_rule *power_rule;
1336 const struct ieee80211_wmm_rule *wmm_rule1, *wmm_rule2;
1337 struct ieee80211_wmm_rule *wmm_rule;
1326 u32 freq_diff, max_bandwidth1, max_bandwidth2; 1338 u32 freq_diff, max_bandwidth1, max_bandwidth2;
1327 1339
1328 freq_range1 = &rule1->freq_range; 1340 freq_range1 = &rule1->freq_range;
@@ -1333,6 +1345,10 @@ static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
1333 power_rule2 = &rule2->power_rule; 1345 power_rule2 = &rule2->power_rule;
1334 power_rule = &intersected_rule->power_rule; 1346 power_rule = &intersected_rule->power_rule;
1335 1347
1348 wmm_rule1 = &rule1->wmm_rule;
1349 wmm_rule2 = &rule2->wmm_rule;
1350 wmm_rule = &intersected_rule->wmm_rule;
1351
1336 freq_range->start_freq_khz = max(freq_range1->start_freq_khz, 1352 freq_range->start_freq_khz = max(freq_range1->start_freq_khz,
1337 freq_range2->start_freq_khz); 1353 freq_range2->start_freq_khz);
1338 freq_range->end_freq_khz = min(freq_range1->end_freq_khz, 1354 freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
@@ -1376,6 +1392,29 @@ static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
1376 intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms, 1392 intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms,
1377 rule2->dfs_cac_ms); 1393 rule2->dfs_cac_ms);
1378 1394
1395 if (rule1->has_wmm && rule2->has_wmm) {
1396 u8 ac;
1397
1398 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1399 reg_wmm_rules_intersect(&wmm_rule1->client[ac],
1400 &wmm_rule2->client[ac],
1401 &wmm_rule->client[ac]);
1402 reg_wmm_rules_intersect(&wmm_rule1->ap[ac],
1403 &wmm_rule2->ap[ac],
1404 &wmm_rule->ap[ac]);
1405 }
1406
1407 intersected_rule->has_wmm = true;
1408 } else if (rule1->has_wmm) {
1409 *wmm_rule = *wmm_rule1;
1410 intersected_rule->has_wmm = true;
1411 } else if (rule2->has_wmm) {
1412 *wmm_rule = *wmm_rule2;
1413 intersected_rule->has_wmm = true;
1414 } else {
1415 intersected_rule->has_wmm = false;
1416 }
1417
1379 if (!is_valid_reg_rule(intersected_rule)) 1418 if (!is_valid_reg_rule(intersected_rule))
1380 return -EINVAL; 1419 return -EINVAL;
1381 1420
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 287518c6caa4..04d888628f29 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -190,10 +190,9 @@ static size_t cfg80211_gen_new_ie(const u8 *ie, size_t ielen,
190 /* copy subelement as we need to change its content to 190 /* copy subelement as we need to change its content to
191 * mark an ie after it is processed. 191 * mark an ie after it is processed.
192 */ 192 */
193 sub_copy = kmalloc(subie_len, gfp); 193 sub_copy = kmemdup(subelement, subie_len, gfp);
194 if (!sub_copy) 194 if (!sub_copy)
195 return 0; 195 return 0;
196 memcpy(sub_copy, subelement, subie_len);
197 196
198 pos = &new_ie[0]; 197 pos = &new_ie[0];
199 198
diff --git a/net/wireless/util.c b/net/wireless/util.c
index e4b8db5e81ec..75899b62bdc9 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -1220,9 +1220,11 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate)
1220 else if (rate->bw == RATE_INFO_BW_HE_RU && 1220 else if (rate->bw == RATE_INFO_BW_HE_RU &&
1221 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_26) 1221 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_26)
1222 result = rates_26[rate->he_gi]; 1222 result = rates_26[rate->he_gi];
1223 else if (WARN(1, "invalid HE MCS: bw:%d, ru:%d\n", 1223 else {
1224 rate->bw, rate->he_ru_alloc)) 1224 WARN(1, "invalid HE MCS: bw:%d, ru:%d\n",
1225 rate->bw, rate->he_ru_alloc);
1225 return 0; 1226 return 0;
1227 }
1226 1228
1227 /* now scale to the appropriate MCS */ 1229 /* now scale to the appropriate MCS */
1228 tmp = result; 1230 tmp = result;