2021-07-12 19:54:25

by Johannes Berg

[permalink] [raw]
Subject: [PATCH] nl80211: limit band information in non-split data

From: Johannes Berg <[email protected]>

In non-split data, we shouldn't be adding S1G and 6 GHz
data (or future bands) since we're really close to the
4k message size limit. Remove those bands, any modern
userspace that can use S1G or 6 GHz should already be
using split dumps, and if not then it needs to update.

Signed-off-by: Johannes Berg <[email protected]>
---
net/wireless/nl80211.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 50eb405b0690..395a233eb612 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2351,7 +2351,10 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
goto nla_put_failure;

for (band = state->band_start;
- band < NUM_NL80211_BANDS; band++) {
+ band < state->split ?
+ NUM_NL80211_BANDS :
+ NL80211_BAND_60GHZ + 1;
+ band++) {
struct ieee80211_supported_band *sband;

/* omit higher bands for ancient software */
--
2.31.1


2021-07-12 22:57:00

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] nl80211: limit band information in non-split data

Hi Johannes,

I love your patch! Perhaps something to improve:

[auto build test WARNING on mac80211-next/master]
[also build test WARNING on mac80211/master v5.14-rc1 next-20210712]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Johannes-Berg/nl80211-limit-band-information-in-non-split-data/20210713-035535
base: https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master
config: i386-randconfig-a015-20210712 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/8b9f518558f83c5997dd9d6789623641ee5854b5
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Johannes-Berg/nl80211-limit-band-information-in-non-split-data/20210713-035535
git checkout 8b9f518558f83c5997dd9d6789623641ee5854b5
# save the attached .config to linux build tree
make W=1 ARCH=i386

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

net/wireless/nl80211.c: In function 'nl80211_send_wiphy':
>> net/wireless/nl80211.c:2355:23: warning: ?: using integer constants in boolean context, the expression will always evaluate to 'true' [-Wint-in-bool-context]
2354 | band < state->split ?
| ~~~~~~~~~~~~~~~~~~~~~
2355 | NUM_NL80211_BANDS :
| ~~~~~~~~~~~~~~~~~~^
2356 | NL80211_BAND_60GHZ + 1;
| ~~~~~~~~~~~~~~~~~~~~~~


vim +/true +2355 net/wireless/nl80211.c

2212
2213 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
2214 enum nl80211_commands cmd,
2215 struct sk_buff *msg, u32 portid, u32 seq,
2216 int flags, struct nl80211_dump_wiphy_state *state)
2217 {
2218 void *hdr;
2219 struct nlattr *nl_bands, *nl_band;
2220 struct nlattr *nl_freqs, *nl_freq;
2221 struct nlattr *nl_cmds;
2222 enum nl80211_band band;
2223 struct ieee80211_channel *chan;
2224 int i;
2225 const struct ieee80211_txrx_stypes *mgmt_stypes =
2226 rdev->wiphy.mgmt_stypes;
2227 u32 features;
2228
2229 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
2230 if (!hdr)
2231 return -ENOBUFS;
2232
2233 if (WARN_ON(!state))
2234 return -EINVAL;
2235
2236 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
2237 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME,
2238 wiphy_name(&rdev->wiphy)) ||
2239 nla_put_u32(msg, NL80211_ATTR_GENERATION,
2240 cfg80211_rdev_list_generation))
2241 goto nla_put_failure;
2242
2243 if (cmd != NL80211_CMD_NEW_WIPHY)
2244 goto finish;
2245
2246 switch (state->split_start) {
2247 case 0:
2248 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT,
2249 rdev->wiphy.retry_short) ||
2250 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG,
2251 rdev->wiphy.retry_long) ||
2252 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
2253 rdev->wiphy.frag_threshold) ||
2254 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD,
2255 rdev->wiphy.rts_threshold) ||
2256 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS,
2257 rdev->wiphy.coverage_class) ||
2258 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
2259 rdev->wiphy.max_scan_ssids) ||
2260 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
2261 rdev->wiphy.max_sched_scan_ssids) ||
2262 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN,
2263 rdev->wiphy.max_scan_ie_len) ||
2264 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
2265 rdev->wiphy.max_sched_scan_ie_len) ||
2266 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS,
2267 rdev->wiphy.max_match_sets))
2268 goto nla_put_failure;
2269
2270 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) &&
2271 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN))
2272 goto nla_put_failure;
2273 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
2274 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH))
2275 goto nla_put_failure;
2276 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) &&
2277 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD))
2278 goto nla_put_failure;
2279 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) &&
2280 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT))
2281 goto nla_put_failure;
2282 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
2283 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT))
2284 goto nla_put_failure;
2285 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) &&
2286 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
2287 goto nla_put_failure;
2288 state->split_start++;
2289 if (state->split)
2290 break;
2291 fallthrough;
2292 case 1:
2293 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES,
2294 sizeof(u32) * rdev->wiphy.n_cipher_suites,
2295 rdev->wiphy.cipher_suites))
2296 goto nla_put_failure;
2297
2298 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS,
2299 rdev->wiphy.max_num_pmkids))
2300 goto nla_put_failure;
2301
2302 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) &&
2303 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE))
2304 goto nla_put_failure;
2305
2306 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
2307 rdev->wiphy.available_antennas_tx) ||
2308 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
2309 rdev->wiphy.available_antennas_rx))
2310 goto nla_put_failure;
2311
2312 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) &&
2313 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD,
2314 rdev->wiphy.probe_resp_offload))
2315 goto nla_put_failure;
2316
2317 if ((rdev->wiphy.available_antennas_tx ||
2318 rdev->wiphy.available_antennas_rx) &&
2319 rdev->ops->get_antenna) {
2320 u32 tx_ant = 0, rx_ant = 0;
2321 int res;
2322
2323 res = rdev_get_antenna(rdev, &tx_ant, &rx_ant);
2324 if (!res) {
2325 if (nla_put_u32(msg,
2326 NL80211_ATTR_WIPHY_ANTENNA_TX,
2327 tx_ant) ||
2328 nla_put_u32(msg,
2329 NL80211_ATTR_WIPHY_ANTENNA_RX,
2330 rx_ant))
2331 goto nla_put_failure;
2332 }
2333 }
2334
2335 state->split_start++;
2336 if (state->split)
2337 break;
2338 fallthrough;
2339 case 2:
2340 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES,
2341 rdev->wiphy.interface_modes))
2342 goto nla_put_failure;
2343 state->split_start++;
2344 if (state->split)
2345 break;
2346 fallthrough;
2347 case 3:
2348 nl_bands = nla_nest_start_noflag(msg,
2349 NL80211_ATTR_WIPHY_BANDS);
2350 if (!nl_bands)
2351 goto nla_put_failure;
2352
2353 for (band = state->band_start;
2354 band < state->split ?
> 2355 NUM_NL80211_BANDS :
2356 NL80211_BAND_60GHZ + 1;
2357 band++) {
2358 struct ieee80211_supported_band *sband;
2359
2360 /* omit higher bands for ancient software */
2361 if (band > NL80211_BAND_5GHZ && !state->split)
2362 break;
2363
2364 sband = rdev->wiphy.bands[band];
2365
2366 if (!sband)
2367 continue;
2368
2369 nl_band = nla_nest_start_noflag(msg, band);
2370 if (!nl_band)
2371 goto nla_put_failure;
2372
2373 switch (state->chan_start) {
2374 case 0:
2375 if (nl80211_send_band_rateinfo(msg, sband,
2376 state->split))
2377 goto nla_put_failure;
2378 state->chan_start++;
2379 if (state->split)
2380 break;
2381 fallthrough;
2382 default:
2383 /* add frequencies */
2384 nl_freqs = nla_nest_start_noflag(msg,
2385 NL80211_BAND_ATTR_FREQS);
2386 if (!nl_freqs)
2387 goto nla_put_failure;
2388
2389 for (i = state->chan_start - 1;
2390 i < sband->n_channels;
2391 i++) {
2392 nl_freq = nla_nest_start_noflag(msg,
2393 i);
2394 if (!nl_freq)
2395 goto nla_put_failure;
2396
2397 chan = &sband->channels[i];
2398
2399 if (nl80211_msg_put_channel(
2400 msg, &rdev->wiphy, chan,
2401 state->split))
2402 goto nla_put_failure;
2403
2404 nla_nest_end(msg, nl_freq);
2405 if (state->split)
2406 break;
2407 }
2408 if (i < sband->n_channels)
2409 state->chan_start = i + 2;
2410 else
2411 state->chan_start = 0;
2412 nla_nest_end(msg, nl_freqs);
2413 }
2414
2415 nla_nest_end(msg, nl_band);
2416
2417 if (state->split) {
2418 /* start again here */
2419 if (state->chan_start)
2420 band--;
2421 break;
2422 }
2423 }
2424 nla_nest_end(msg, nl_bands);
2425
2426 if (band < NUM_NL80211_BANDS)
2427 state->band_start = band + 1;
2428 else
2429 state->band_start = 0;
2430
2431 /* if bands & channels are done, continue outside */
2432 if (state->band_start == 0 && state->chan_start == 0)
2433 state->split_start++;
2434 if (state->split)
2435 break;
2436 fallthrough;
2437 case 4:
2438 nl_cmds = nla_nest_start_noflag(msg,
2439 NL80211_ATTR_SUPPORTED_COMMANDS);
2440 if (!nl_cmds)
2441 goto nla_put_failure;
2442
2443 i = nl80211_add_commands_unsplit(rdev, msg);
2444 if (i < 0)
2445 goto nla_put_failure;
2446 if (state->split) {
2447 CMD(crit_proto_start, CRIT_PROTOCOL_START);
2448 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP);
2449 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)
2450 CMD(channel_switch, CHANNEL_SWITCH);
2451 CMD(set_qos_map, SET_QOS_MAP);
2452 if (rdev->wiphy.features &
2453 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
2454 CMD(add_tx_ts, ADD_TX_TS);
2455 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
2456 CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
2457 CMD(update_ft_ies, UPDATE_FT_IES);
2458 if (rdev->wiphy.sar_capa)
2459 CMD(set_sar_specs, SET_SAR_SPECS);
2460 }
2461 #undef CMD
2462
2463 nla_nest_end(msg, nl_cmds);
2464 state->split_start++;
2465 if (state->split)
2466 break;
2467 fallthrough;
2468 case 5:
2469 if (rdev->ops->remain_on_channel &&
2470 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) &&
2471 nla_put_u32(msg,
2472 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
2473 rdev->wiphy.max_remain_on_channel_duration))
2474 goto nla_put_failure;
2475
2476 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) &&
2477 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK))
2478 goto nla_put_failure;
2479
2480 state->split_start++;
2481 if (state->split)
2482 break;
2483 fallthrough;
2484 case 6:
2485 #ifdef CONFIG_PM
2486 if (nl80211_send_wowlan(msg, rdev, state->split))
2487 goto nla_put_failure;
2488 state->split_start++;
2489 if (state->split)
2490 break;
2491 #else
2492 state->split_start++;
2493 #endif
2494 fallthrough;
2495 case 7:
2496 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES,
2497 rdev->wiphy.software_iftypes))
2498 goto nla_put_failure;
2499
2500 if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
2501 state->split))
2502 goto nla_put_failure;
2503
2504 state->split_start++;
2505 if (state->split)
2506 break;
2507 fallthrough;
2508 case 8:
2509 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) &&
2510 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME,
2511 rdev->wiphy.ap_sme_capa))
2512 goto nla_put_failure;
2513
2514 features = rdev->wiphy.features;
2515 /*
2516 * We can only add the per-channel limit information if the
2517 * dump is split, otherwise it makes it too big. Therefore
2518 * only advertise it in that case.
2519 */
2520 if (state->split)
2521 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;
2522 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features))
2523 goto nla_put_failure;
2524
2525 if (rdev->wiphy.ht_capa_mod_mask &&
2526 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK,
2527 sizeof(*rdev->wiphy.ht_capa_mod_mask),
2528 rdev->wiphy.ht_capa_mod_mask))
2529 goto nla_put_failure;
2530
2531 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME &&
2532 rdev->wiphy.max_acl_mac_addrs &&
2533 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX,
2534 rdev->wiphy.max_acl_mac_addrs))
2535 goto nla_put_failure;
2536
2537 /*
2538 * Any information below this point is only available to
2539 * applications that can deal with it being split. This
2540 * helps ensure that newly added capabilities don't break
2541 * older tools by overrunning their buffers.
2542 *
2543 * We still increment split_start so that in the split
2544 * case we'll continue with more data in the next round,
2545 * but break unconditionally so unsplit data stops here.
2546 */
2547 if (state->split)
2548 state->split_start++;
2549 else
2550 state->split_start = 0;
2551 break;
2552 case 9:
2553 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes))
2554 goto nla_put_failure;
2555
2556 if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
2557 rdev->wiphy.max_sched_scan_plans) ||
2558 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
2559 rdev->wiphy.max_sched_scan_plan_interval) ||
2560 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
2561 rdev->wiphy.max_sched_scan_plan_iterations))
2562 goto nla_put_failure;
2563
2564 if (rdev->wiphy.extended_capabilities &&
2565 (nla_put(msg, NL80211_ATTR_EXT_CAPA,
2566 rdev->wiphy.extended_capabilities_len,
2567 rdev->wiphy.extended_capabilities) ||
2568 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
2569 rdev->wiphy.extended_capabilities_len,
2570 rdev->wiphy.extended_capabilities_mask)))
2571 goto nla_put_failure;
2572
2573 if (rdev->wiphy.vht_capa_mod_mask &&
2574 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK,
2575 sizeof(*rdev->wiphy.vht_capa_mod_mask),
2576 rdev->wiphy.vht_capa_mod_mask))
2577 goto nla_put_failure;
2578
2579 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
2580 rdev->wiphy.perm_addr))
2581 goto nla_put_failure;
2582
2583 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) &&
2584 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN,
2585 rdev->wiphy.addr_mask))
2586 goto nla_put_failure;
2587
2588 if (rdev->wiphy.n_addresses > 1) {
2589 void *attr;
2590
2591 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS);
2592 if (!attr)
2593 goto nla_put_failure;
2594
2595 for (i = 0; i < rdev->wiphy.n_addresses; i++)
2596 if (nla_put(msg, i + 1, ETH_ALEN,
2597 rdev->wiphy.addresses[i].addr))
2598 goto nla_put_failure;
2599
2600 nla_nest_end(msg, attr);
2601 }
2602
2603 state->split_start++;
2604 break;
2605 case 10:
2606 if (nl80211_send_coalesce(msg, rdev))
2607 goto nla_put_failure;
2608
2609 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
2610 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
2611 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
2612 goto nla_put_failure;
2613
2614 if (rdev->wiphy.max_ap_assoc_sta &&
2615 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA,
2616 rdev->wiphy.max_ap_assoc_sta))
2617 goto nla_put_failure;
2618
2619 state->split_start++;
2620 break;
2621 case 11:
2622 if (rdev->wiphy.n_vendor_commands) {
2623 const struct nl80211_vendor_cmd_info *info;
2624 struct nlattr *nested;
2625
2626 nested = nla_nest_start_noflag(msg,
2627 NL80211_ATTR_VENDOR_DATA);
2628 if (!nested)
2629 goto nla_put_failure;
2630
2631 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) {
2632 info = &rdev->wiphy.vendor_commands[i].info;
2633 if (nla_put(msg, i + 1, sizeof(*info), info))
2634 goto nla_put_failure;
2635 }
2636 nla_nest_end(msg, nested);
2637 }
2638
2639 if (rdev->wiphy.n_vendor_events) {
2640 const struct nl80211_vendor_cmd_info *info;
2641 struct nlattr *nested;
2642
2643 nested = nla_nest_start_noflag(msg,
2644 NL80211_ATTR_VENDOR_EVENTS);
2645 if (!nested)
2646 goto nla_put_failure;
2647
2648 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) {
2649 info = &rdev->wiphy.vendor_events[i];
2650 if (nla_put(msg, i + 1, sizeof(*info), info))
2651 goto nla_put_failure;
2652 }
2653 nla_nest_end(msg, nested);
2654 }
2655 state->split_start++;
2656 break;
2657 case 12:
2658 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH &&
2659 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS,
2660 rdev->wiphy.max_num_csa_counters))
2661 goto nla_put_failure;
2662
2663 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
2664 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG))
2665 goto nla_put_failure;
2666
2667 if (rdev->wiphy.max_sched_scan_reqs &&
2668 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS,
2669 rdev->wiphy.max_sched_scan_reqs))
2670 goto nla_put_failure;
2671
2672 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES,
2673 sizeof(rdev->wiphy.ext_features),
2674 rdev->wiphy.ext_features))
2675 goto nla_put_failure;
2676
2677 if (rdev->wiphy.bss_select_support) {
2678 struct nlattr *nested;
2679 u32 bss_select_support = rdev->wiphy.bss_select_support;
2680
2681 nested = nla_nest_start_noflag(msg,
2682 NL80211_ATTR_BSS_SELECT);
2683 if (!nested)
2684 goto nla_put_failure;
2685
2686 i = 0;
2687 while (bss_select_support) {
2688 if ((bss_select_support & 1) &&
2689 nla_put_flag(msg, i))
2690 goto nla_put_failure;
2691 i++;
2692 bss_select_support >>= 1;
2693 }
2694 nla_nest_end(msg, nested);
2695 }
2696
2697 state->split_start++;
2698 break;
2699 case 13:
2700 if (rdev->wiphy.num_iftype_ext_capab &&
2701 rdev->wiphy.iftype_ext_capab) {
2702 struct nlattr *nested_ext_capab, *nested;
2703
2704 nested = nla_nest_start_noflag(msg,
2705 NL80211_ATTR_IFTYPE_EXT_CAPA);
2706 if (!nested)
2707 goto nla_put_failure;
2708
2709 for (i = state->capa_start;
2710 i < rdev->wiphy.num_iftype_ext_capab; i++) {
2711 const struct wiphy_iftype_ext_capab *capab;
2712
2713 capab = &rdev->wiphy.iftype_ext_capab[i];
2714
2715 nested_ext_capab = nla_nest_start_noflag(msg,
2716 i);
2717 if (!nested_ext_capab ||
2718 nla_put_u32(msg, NL80211_ATTR_IFTYPE,
2719 capab->iftype) ||
2720 nla_put(msg, NL80211_ATTR_EXT_CAPA,
2721 capab->extended_capabilities_len,
2722 capab->extended_capabilities) ||
2723 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK,
2724 capab->extended_capabilities_len,
2725 capab->extended_capabilities_mask))
2726 goto nla_put_failure;
2727
2728 nla_nest_end(msg, nested_ext_capab);
2729 if (state->split)
2730 break;
2731 }
2732 nla_nest_end(msg, nested);
2733 if (i < rdev->wiphy.num_iftype_ext_capab) {
2734 state->capa_start = i + 1;
2735 break;
2736 }
2737 }
2738
2739 if (nla_put_u32(msg, NL80211_ATTR_BANDS,
2740 rdev->wiphy.nan_supported_bands))
2741 goto nla_put_failure;
2742
2743 if (wiphy_ext_feature_isset(&rdev->wiphy,
2744 NL80211_EXT_FEATURE_TXQS)) {
2745 struct cfg80211_txq_stats txqstats = {};
2746 int res;
2747
2748 res = rdev_get_txq_stats(rdev, NULL, &txqstats);
2749 if (!res &&
2750 !nl80211_put_txq_stats(msg, &txqstats,
2751 NL80211_ATTR_TXQ_STATS))
2752 goto nla_put_failure;
2753
2754 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT,
2755 rdev->wiphy.txq_limit))
2756 goto nla_put_failure;
2757 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT,
2758 rdev->wiphy.txq_memory_limit))
2759 goto nla_put_failure;
2760 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM,
2761 rdev->wiphy.txq_quantum))
2762 goto nla_put_failure;
2763 }
2764
2765 state->split_start++;
2766 break;
2767 case 14:
2768 if (nl80211_send_pmsr_capa(rdev, msg))
2769 goto nla_put_failure;
2770
2771 state->split_start++;
2772 break;
2773 case 15:
2774 if (rdev->wiphy.akm_suites &&
2775 nla_put(msg, NL80211_ATTR_AKM_SUITES,
2776 sizeof(u32) * rdev->wiphy.n_akm_suites,
2777 rdev->wiphy.akm_suites))
2778 goto nla_put_failure;
2779
2780 if (nl80211_put_iftype_akm_suites(rdev, msg))
2781 goto nla_put_failure;
2782
2783 if (nl80211_put_tid_config_support(rdev, msg))
2784 goto nla_put_failure;
2785 state->split_start++;
2786 break;
2787 case 16:
2788 if (nl80211_put_sar_specs(rdev, msg))
2789 goto nla_put_failure;
2790
2791 /* done */
2792 state->split_start = 0;
2793 break;
2794 }
2795 finish:
2796 genlmsg_end(msg, hdr);
2797 return 0;
2798
2799 nla_put_failure:
2800 genlmsg_cancel(msg, hdr);
2801 return -EMSGSIZE;
2802 }
2803

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (22.58 kB)
.config.gz (48.39 kB)
Download all attachments