Lines Matching +full:max +full:- +full:bitrate
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright 2007-2009 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
8 * Copyright (C) 2018-2020 Intel Corporation
24 #include "rdev-ops.h"
29 u32 basic_rates, int bitrate) in ieee80211_get_response_rate() argument
31 struct ieee80211_rate *result = &sband->bitrates[0]; in ieee80211_get_response_rate()
34 for (i = 0; i < sband->n_bitrates; i++) { in ieee80211_get_response_rate()
37 if (sband->bitrates[i].bitrate > bitrate) in ieee80211_get_response_rate()
39 result = &sband->bitrates[i]; in ieee80211_get_response_rate()
57 if (sband->band == NL80211_BAND_2GHZ) { in ieee80211_mandatory_rates()
67 bitrates = sband->bitrates; in ieee80211_mandatory_rates()
68 for (i = 0; i < sband->n_bitrates; i++) in ieee80211_mandatory_rates()
117 if (WARN_ON(!chan || chan->band != NL80211_BAND_S1GHZ)) in ieee80211_s1g_channel_width()
123 if (chan->flags & IEEE80211_CHAN_1MHZ) in ieee80211_s1g_channel_width()
125 else if (chan->flags & IEEE80211_CHAN_2MHZ) in ieee80211_s1g_channel_width()
127 else if (chan->flags & IEEE80211_CHAN_4MHZ) in ieee80211_s1g_channel_width()
129 else if (chan->flags & IEEE80211_CHAN_8MHZ) in ieee80211_s1g_channel_width()
131 else if (chan->flags & IEEE80211_CHAN_16MHZ) in ieee80211_s1g_channel_width()
150 return (freq - 2407) / 5; in ieee80211_freq_khz_to_channel()
152 return (freq - 4000) / 5; in ieee80211_freq_khz_to_channel()
154 return (freq - 5000) / 5; in ieee80211_freq_khz_to_channel()
159 return (freq - 5950) / 5; in ieee80211_freq_khz_to_channel()
161 return (freq - 56160) / 2160; in ieee80211_freq_khz_to_channel()
175 sband = wiphy->bands[band]; in ieee80211_get_channel_khz()
180 for (i = 0; i < sband->n_channels; i++) { in ieee80211_get_channel_khz()
181 struct ieee80211_channel *chan = &sband->channels[i]; in ieee80211_get_channel_khz()
196 switch (sband->band) { in set_mandatory_flags_band()
200 for (i = 0; i < sband->n_bitrates; i++) { in set_mandatory_flags_band()
201 if (sband->bitrates[i].bitrate == 60 || in set_mandatory_flags_band()
202 sband->bitrates[i].bitrate == 120 || in set_mandatory_flags_band()
203 sband->bitrates[i].bitrate == 240) { in set_mandatory_flags_band()
204 sband->bitrates[i].flags |= in set_mandatory_flags_band()
206 want--; in set_mandatory_flags_band()
213 for (i = 0; i < sband->n_bitrates; i++) { in set_mandatory_flags_band()
214 switch (sband->bitrates[i].bitrate) { in set_mandatory_flags_band()
219 sband->bitrates[i].flags |= in set_mandatory_flags_band()
222 want--; in set_mandatory_flags_band()
227 sband->bitrates[i].flags |= in set_mandatory_flags_band()
229 want--; in set_mandatory_flags_band()
232 sband->bitrates[i].flags |= in set_mandatory_flags_band()
241 WARN_ON(!sband->ht_cap.ht_supported); in set_mandatory_flags_band()
242 WARN_ON((sband->ht_cap.mcs.rx_mask[0] & 0x1e) != 0x1e); in set_mandatory_flags_band()
245 /* Figure 9-589bd: 3 means unsupported, so != 3 means at least in set_mandatory_flags_band()
248 WARN_ON((sband->s1g_cap.nss_mcs[0] & 0x3) == 0x3); in set_mandatory_flags_band()
262 if (wiphy->bands[band]) in ieee80211_set_bitrate_flags()
263 set_mandatory_flags_band(wiphy->bands[band]); in ieee80211_set_bitrate_flags()
269 for (i = 0; i < wiphy->n_cipher_suites; i++) in cfg80211_supported_cipher_suite()
270 if (cipher == wiphy->cipher_suites[i]) in cfg80211_supported_cipher_suite()
278 struct wiphy *wiphy = &rdev->wiphy; in cfg80211_igtk_cipher_supported()
281 for (i = 0; i < wiphy->n_cipher_suites; i++) { in cfg80211_igtk_cipher_supported()
282 switch (wiphy->cipher_suites[i]) { in cfg80211_igtk_cipher_supported()
301 else if (wiphy_ext_feature_isset(&rdev->wiphy, in cfg80211_valid_key_idx()
303 wiphy_ext_feature_isset(&rdev->wiphy, in cfg80211_valid_key_idx()
322 return -EINVAL; in cfg80211_validate_key_settings()
324 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in cfg80211_validate_key_settings()
325 return -EINVAL; in cfg80211_validate_key_settings()
328 return -EINVAL; in cfg80211_validate_key_settings()
330 switch (params->cipher) { in cfg80211_validate_key_settings()
334 params->mode != NL80211_KEY_RX_TX) in cfg80211_validate_key_settings()
335 return -EINVAL; in cfg80211_validate_key_settings()
341 /* IEEE802.11-2016 allows only 0 and - when supporting in cfg80211_validate_key_settings()
342 * Extended Key ID - 1 as index for pairwise keys. in cfg80211_validate_key_settings()
348 if ((params->mode == NL80211_KEY_NO_TX && !pairwise) || in cfg80211_validate_key_settings()
349 params->mode == NL80211_KEY_SET_TX) in cfg80211_validate_key_settings()
350 return -EINVAL; in cfg80211_validate_key_settings()
351 if (wiphy_ext_feature_isset(&rdev->wiphy, in cfg80211_validate_key_settings()
354 return -EINVAL; in cfg80211_validate_key_settings()
356 return -EINVAL; in cfg80211_validate_key_settings()
363 /* Disallow BIP (group-only) cipher as pairwise cipher */ in cfg80211_validate_key_settings()
365 return -EINVAL; in cfg80211_validate_key_settings()
367 return -EINVAL; in cfg80211_validate_key_settings()
372 return -EINVAL; in cfg80211_validate_key_settings()
377 switch (params->cipher) { in cfg80211_validate_key_settings()
379 if (params->key_len != WLAN_KEY_LEN_WEP40) in cfg80211_validate_key_settings()
380 return -EINVAL; in cfg80211_validate_key_settings()
383 if (params->key_len != WLAN_KEY_LEN_TKIP) in cfg80211_validate_key_settings()
384 return -EINVAL; in cfg80211_validate_key_settings()
387 if (params->key_len != WLAN_KEY_LEN_CCMP) in cfg80211_validate_key_settings()
388 return -EINVAL; in cfg80211_validate_key_settings()
391 if (params->key_len != WLAN_KEY_LEN_CCMP_256) in cfg80211_validate_key_settings()
392 return -EINVAL; in cfg80211_validate_key_settings()
395 if (params->key_len != WLAN_KEY_LEN_GCMP) in cfg80211_validate_key_settings()
396 return -EINVAL; in cfg80211_validate_key_settings()
399 if (params->key_len != WLAN_KEY_LEN_GCMP_256) in cfg80211_validate_key_settings()
400 return -EINVAL; in cfg80211_validate_key_settings()
403 if (params->key_len != WLAN_KEY_LEN_WEP104) in cfg80211_validate_key_settings()
404 return -EINVAL; in cfg80211_validate_key_settings()
407 if (params->key_len != WLAN_KEY_LEN_AES_CMAC) in cfg80211_validate_key_settings()
408 return -EINVAL; in cfg80211_validate_key_settings()
411 if (params->key_len != WLAN_KEY_LEN_BIP_CMAC_256) in cfg80211_validate_key_settings()
412 return -EINVAL; in cfg80211_validate_key_settings()
415 if (params->key_len != WLAN_KEY_LEN_BIP_GMAC_128) in cfg80211_validate_key_settings()
416 return -EINVAL; in cfg80211_validate_key_settings()
419 if (params->key_len != WLAN_KEY_LEN_BIP_GMAC_256) in cfg80211_validate_key_settings()
420 return -EINVAL; in cfg80211_validate_key_settings()
425 * allow using it -- but the driver must check in cfg80211_validate_key_settings()
433 if (params->seq) { in cfg80211_validate_key_settings()
434 switch (params->cipher) { in cfg80211_validate_key_settings()
438 return -EINVAL; in cfg80211_validate_key_settings()
448 if (params->seq_len != 6) in cfg80211_validate_key_settings()
449 return -EINVAL; in cfg80211_validate_key_settings()
454 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, params->cipher)) in cfg80211_validate_key_settings()
455 return -EINVAL; in cfg80211_validate_key_settings()
509 (const struct ieee80211_hdr *)skb->data; in ieee80211_get_hdrlen_from_skb()
512 if (unlikely(skb->len < 10)) in ieee80211_get_hdrlen_from_skb()
514 hdrlen = ieee80211_hdrlen(hdr->frame_control); in ieee80211_get_hdrlen_from_skb()
515 if (unlikely(hdrlen > skb->len)) in ieee80211_get_hdrlen_from_skb()
524 /* 802.11-2012, 8.2.4.7.3 */ in __ieee80211_get_mesh_hdrlen()
538 return __ieee80211_get_mesh_hdrlen(meshhdr->flags); in ieee80211_get_mesh_hdrlen()
546 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in ieee80211_data_to_8023_exthdr()
555 if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) in ieee80211_data_to_8023_exthdr()
556 return -1; in ieee80211_data_to_8023_exthdr()
558 hdrlen = ieee80211_hdrlen(hdr->frame_control) + data_offset; in ieee80211_data_to_8023_exthdr()
559 if (skb->len < hdrlen + 8) in ieee80211_data_to_8023_exthdr()
560 return -1; in ieee80211_data_to_8023_exthdr()
579 switch (hdr->frame_control & in ieee80211_data_to_8023_exthdr()
585 return -1; in ieee80211_data_to_8023_exthdr()
592 return -1; in ieee80211_data_to_8023_exthdr()
595 return -1; in ieee80211_data_to_8023_exthdr()
610 return -1; in ieee80211_data_to_8023_exthdr()
613 return -1; in ieee80211_data_to_8023_exthdr()
625 return -1; in ieee80211_data_to_8023_exthdr()
636 /* remove RFC1042 or Bridge-Tunnel encapsulation and in ieee80211_data_to_8023_exthdr()
640 tmp.h_proto = htons(skb->len - hdrlen); in ieee80211_data_to_8023_exthdr()
660 page_offset = ptr - page_address(page); in __frame_add_frag()
661 skb_add_rx_frag(skb, sh->nr_frags, page, page_offset, len, size); in __frame_add_frag()
669 const skb_frag_t *frag = &sh->frags[0]; in __ieee80211_amsdu_copy_frag()
673 int head_size = skb->len - skb->data_len; in __ieee80211_amsdu_copy_frag()
676 frag_page = virt_to_head_page(skb->head); in __ieee80211_amsdu_copy_frag()
677 frag_ptr = skb->data; in __ieee80211_amsdu_copy_frag()
681 offset -= frag_size; in __ieee80211_amsdu_copy_frag()
689 frag_len = frag_size - offset; in __ieee80211_amsdu_copy_frag()
694 len -= cur_len; in __ieee80211_amsdu_copy_frag()
701 len -= cur_len; in __ieee80211_amsdu_copy_frag()
713 if (skb->len - offset < len) in __ieee80211_amsdu_copy()
735 len -= cur_len; in __ieee80211_amsdu_copy()
756 bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb); in ieee80211_amsdu_to_8023s()
768 padding = (4 - subframe_len) & 0x3; in ieee80211_amsdu_to_8023s()
771 remaining = skb->len - offset; in ieee80211_amsdu_to_8023s()
774 /* mitigate A-MSDU aggregation injection attacks */ in ieee80211_amsdu_to_8023s()
804 frame->dev = skb->dev; in ieee80211_amsdu_to_8023s()
805 frame->priority = skb->priority; in ieee80211_amsdu_to_8023s()
807 payload = frame->data; in ieee80211_amsdu_to_8023s()
839 /* skb->priority values from 256->263 are magic values to in cfg80211_classify8021d()
844 if (skb->priority >= 256 && skb->priority <= 263) { in cfg80211_classify8021d()
845 ret = skb->priority - 256; in cfg80211_classify8021d()
858 switch (skb->protocol) { in cfg80211_classify8021d()
874 ret = (ntohl(mpls->entry) & MPLS_LS_TC_MASK) in cfg80211_classify8021d()
888 for (i = 0; i < qos_map->num_des; i++) { in cfg80211_classify8021d()
889 if (tmp_dscp == qos_map->dscp_exception[i].dscp) { in cfg80211_classify8021d()
890 ret = qos_map->dscp_exception[i].up; in cfg80211_classify8021d()
896 if (tmp_dscp >= qos_map->up[i].low && in cfg80211_classify8021d()
897 tmp_dscp <= qos_map->up[i].high) { in cfg80211_classify8021d()
914 ies = rcu_dereference(bss->ies); in ieee80211_bss_get_elem()
918 return cfg80211_find_elem(id, ies->data, ies->len); in ieee80211_bss_get_elem()
924 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_upload_connect_keys()
925 struct net_device *dev = wdev->netdev; in cfg80211_upload_connect_keys()
928 if (!wdev->connect_keys) in cfg80211_upload_connect_keys()
932 if (!wdev->connect_keys->params[i].cipher) in cfg80211_upload_connect_keys()
935 &wdev->connect_keys->params[i])) { in cfg80211_upload_connect_keys()
939 if (wdev->connect_keys->def == i && in cfg80211_upload_connect_keys()
946 kfree_sensitive(wdev->connect_keys); in cfg80211_upload_connect_keys()
947 wdev->connect_keys = NULL; in cfg80211_upload_connect_keys()
955 spin_lock_irqsave(&wdev->event_lock, flags); in cfg80211_process_wdev_events()
956 while (!list_empty(&wdev->event_list)) { in cfg80211_process_wdev_events()
957 ev = list_first_entry(&wdev->event_list, in cfg80211_process_wdev_events()
959 list_del(&ev->list); in cfg80211_process_wdev_events()
960 spin_unlock_irqrestore(&wdev->event_lock, flags); in cfg80211_process_wdev_events()
963 switch (ev->type) { in cfg80211_process_wdev_events()
966 wdev->netdev, in cfg80211_process_wdev_events()
967 &ev->cr, in cfg80211_process_wdev_events()
968 ev->cr.status == WLAN_STATUS_SUCCESS); in cfg80211_process_wdev_events()
971 __cfg80211_roamed(wdev, &ev->rm); in cfg80211_process_wdev_events()
974 __cfg80211_disconnected(wdev->netdev, in cfg80211_process_wdev_events()
975 ev->dc.ie, ev->dc.ie_len, in cfg80211_process_wdev_events()
976 ev->dc.reason, in cfg80211_process_wdev_events()
977 !ev->dc.locally_generated); in cfg80211_process_wdev_events()
980 __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid, in cfg80211_process_wdev_events()
981 ev->ij.channel); in cfg80211_process_wdev_events()
984 __cfg80211_leave(wiphy_to_rdev(wdev->wiphy), wdev); in cfg80211_process_wdev_events()
987 __cfg80211_port_authorized(wdev, ev->pa.bssid); in cfg80211_process_wdev_events()
994 spin_lock_irqsave(&wdev->event_lock, flags); in cfg80211_process_wdev_events()
996 spin_unlock_irqrestore(&wdev->event_lock, flags); in cfg80211_process_wdev_events()
1005 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) in cfg80211_process_rdev_events()
1014 enum nl80211_iftype otype = dev->ieee80211_ptr->iftype; in cfg80211_change_iface()
1018 /* don't support changing VLANs, you just re-create them */ in cfg80211_change_iface()
1020 return -EOPNOTSUPP; in cfg80211_change_iface()
1025 return -EOPNOTSUPP; in cfg80211_change_iface()
1027 if (!rdev->ops->change_virtual_intf || in cfg80211_change_iface()
1028 !(rdev->wiphy.interface_modes & (1 << ntype))) in cfg80211_change_iface()
1029 return -EOPNOTSUPP; in cfg80211_change_iface()
1037 return -EBUSY; in cfg80211_change_iface()
1039 dev->ieee80211_ptr->use_4addr = false; in cfg80211_change_iface()
1040 dev->ieee80211_ptr->mesh_id_up_len = 0; in cfg80211_change_iface()
1041 wdev_lock(dev->ieee80211_ptr); in cfg80211_change_iface()
1043 wdev_unlock(dev->ieee80211_ptr); in cfg80211_change_iface()
1055 wdev_lock(dev->ieee80211_ptr); in cfg80211_change_iface()
1058 wdev_unlock(dev->ieee80211_ptr); in cfg80211_change_iface()
1071 cfg80211_mlme_purge_registrations(dev->ieee80211_ptr); in cfg80211_change_iface()
1076 WARN_ON(!err && dev->ieee80211_ptr->iftype != ntype); in cfg80211_change_iface()
1078 if (!err && params && params->use_4addr != -1) in cfg80211_change_iface()
1079 dev->ieee80211_ptr->use_4addr = params->use_4addr; in cfg80211_change_iface()
1082 dev->priv_flags &= ~IFF_DONT_BRIDGE; in cfg80211_change_iface()
1085 if (dev->ieee80211_ptr->use_4addr) in cfg80211_change_iface()
1091 dev->priv_flags |= IFF_DONT_BRIDGE; in cfg80211_change_iface()
1116 cfg80211_update_iface_num(rdev, otype, -1); in cfg80211_change_iface()
1124 int modulation, streams, bitrate; in cfg80211_calculate_bitrate_ht() local
1127 if (WARN_ON_ONCE(rate->mcs >= 32)) in cfg80211_calculate_bitrate_ht()
1130 modulation = rate->mcs & 7; in cfg80211_calculate_bitrate_ht()
1131 streams = (rate->mcs >> 3) + 1; in cfg80211_calculate_bitrate_ht()
1133 bitrate = (rate->bw == RATE_INFO_BW_40) ? 13500000 : 6500000; in cfg80211_calculate_bitrate_ht()
1136 bitrate *= (modulation + 1); in cfg80211_calculate_bitrate_ht()
1138 bitrate *= (modulation + 2); in cfg80211_calculate_bitrate_ht()
1140 bitrate *= (modulation + 3); in cfg80211_calculate_bitrate_ht()
1142 bitrate *= streams; in cfg80211_calculate_bitrate_ht()
1144 if (rate->flags & RATE_INFO_FLAGS_SHORT_GI) in cfg80211_calculate_bitrate_ht()
1145 bitrate = (bitrate / 9) * 10; in cfg80211_calculate_bitrate_ht()
1148 return (bitrate + 50000) / 100000; in cfg80211_calculate_bitrate_ht()
1182 /* LP-SC PHY */ in cfg80211_calculate_bitrate_dmg()
1192 if (WARN_ON_ONCE(rate->mcs >= ARRAY_SIZE(__mcs2bitrate))) in cfg80211_calculate_bitrate_dmg()
1195 return __mcs2bitrate[rate->mcs]; in cfg80211_calculate_bitrate_dmg()
1226 if (WARN_ON_ONCE(rate->mcs >= ARRAY_SIZE(__mcs2bitrate))) in cfg80211_calculate_bitrate_edmg()
1229 return __mcs2bitrate[rate->mcs] * rate->n_bonded_ch; in cfg80211_calculate_bitrate_edmg()
1281 u32 bitrate; in cfg80211_calculate_bitrate_vht() local
1284 if (rate->mcs > 9) in cfg80211_calculate_bitrate_vht()
1287 switch (rate->bw) { in cfg80211_calculate_bitrate_vht()
1305 bitrate = base[idx][rate->mcs]; in cfg80211_calculate_bitrate_vht()
1306 bitrate *= rate->nss; in cfg80211_calculate_bitrate_vht()
1308 if (rate->flags & RATE_INFO_FLAGS_SHORT_GI) in cfg80211_calculate_bitrate_vht()
1309 bitrate = (bitrate / 9) * 10; in cfg80211_calculate_bitrate_vht()
1312 return (bitrate + 50000) / 100000; in cfg80211_calculate_bitrate_vht()
1315 rate->bw, rate->mcs, rate->nss); in cfg80211_calculate_bitrate_vht()
1346 if (WARN_ON_ONCE(rate->mcs > 11)) in cfg80211_calculate_bitrate_he()
1349 if (WARN_ON_ONCE(rate->he_gi > NL80211_RATE_INFO_HE_GI_3_2)) in cfg80211_calculate_bitrate_he()
1351 if (WARN_ON_ONCE(rate->he_ru_alloc > in cfg80211_calculate_bitrate_he()
1354 if (WARN_ON_ONCE(rate->nss < 1 || rate->nss > 8)) in cfg80211_calculate_bitrate_he()
1357 if (rate->bw == RATE_INFO_BW_160) in cfg80211_calculate_bitrate_he()
1358 result = rates_160M[rate->he_gi]; in cfg80211_calculate_bitrate_he()
1359 else if (rate->bw == RATE_INFO_BW_80 || in cfg80211_calculate_bitrate_he()
1360 (rate->bw == RATE_INFO_BW_HE_RU && in cfg80211_calculate_bitrate_he()
1361 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_996)) in cfg80211_calculate_bitrate_he()
1362 result = rates_969[rate->he_gi]; in cfg80211_calculate_bitrate_he()
1363 else if (rate->bw == RATE_INFO_BW_40 || in cfg80211_calculate_bitrate_he()
1364 (rate->bw == RATE_INFO_BW_HE_RU && in cfg80211_calculate_bitrate_he()
1365 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_484)) in cfg80211_calculate_bitrate_he()
1366 result = rates_484[rate->he_gi]; in cfg80211_calculate_bitrate_he()
1367 else if (rate->bw == RATE_INFO_BW_20 || in cfg80211_calculate_bitrate_he()
1368 (rate->bw == RATE_INFO_BW_HE_RU && in cfg80211_calculate_bitrate_he()
1369 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_242)) in cfg80211_calculate_bitrate_he()
1370 result = rates_242[rate->he_gi]; in cfg80211_calculate_bitrate_he()
1371 else if (rate->bw == RATE_INFO_BW_HE_RU && in cfg80211_calculate_bitrate_he()
1372 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_106) in cfg80211_calculate_bitrate_he()
1373 result = rates_106[rate->he_gi]; in cfg80211_calculate_bitrate_he()
1374 else if (rate->bw == RATE_INFO_BW_HE_RU && in cfg80211_calculate_bitrate_he()
1375 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_52) in cfg80211_calculate_bitrate_he()
1376 result = rates_52[rate->he_gi]; in cfg80211_calculate_bitrate_he()
1377 else if (rate->bw == RATE_INFO_BW_HE_RU && in cfg80211_calculate_bitrate_he()
1378 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_26) in cfg80211_calculate_bitrate_he()
1379 result = rates_26[rate->he_gi]; in cfg80211_calculate_bitrate_he()
1382 rate->bw, rate->he_ru_alloc); in cfg80211_calculate_bitrate_he()
1389 do_div(tmp, mcs_divisors[rate->mcs]); in cfg80211_calculate_bitrate_he()
1393 result = (result * rate->nss) / 8; in cfg80211_calculate_bitrate_he()
1394 if (rate->he_dcm) in cfg80211_calculate_bitrate_he()
1402 if (rate->flags & RATE_INFO_FLAGS_MCS) in cfg80211_calculate_bitrate()
1404 if (rate->flags & RATE_INFO_FLAGS_DMG) in cfg80211_calculate_bitrate()
1406 if (rate->flags & RATE_INFO_FLAGS_EDMG) in cfg80211_calculate_bitrate()
1408 if (rate->flags & RATE_INFO_FLAGS_VHT_MCS) in cfg80211_calculate_bitrate()
1410 if (rate->flags & RATE_INFO_FLAGS_HE_MCS) in cfg80211_calculate_bitrate()
1413 return rate->legacy; in cfg80211_calculate_bitrate()
1432 return -EILSEQ; in cfg80211_get_p2p_attr()
1435 return -EILSEQ; in cfg80211_get_p2p_attr()
1450 iedatalen -= 4; in cfg80211_get_p2p_attr()
1460 bufsize -= min(bufsize, copy); in cfg80211_get_p2p_attr()
1468 attr_remaining -= copy; in cfg80211_get_p2p_attr()
1472 iedatalen -= copy; in cfg80211_get_p2p_attr()
1480 return -EILSEQ; in cfg80211_get_p2p_attr()
1483 iedatalen -= 3; in cfg80211_get_p2p_attr()
1493 bufsize -= min(bufsize, copy); in cfg80211_get_p2p_attr()
1501 iedatalen -= copy; in cfg80211_get_p2p_attr()
1502 attr_remaining = attr_len - copy; in cfg80211_get_p2p_attr()
1506 len -= ies[1] + 2; in cfg80211_get_p2p_attr()
1511 return -EILSEQ; in cfg80211_get_p2p_attr()
1513 return -ENOENT; in cfg80211_get_p2p_attr()
1522 if (WARN_ON(ids[n_ids - 1] == WLAN_EID_EXTENSION)) in ieee80211_id_in_list()
1641 u32 freq = chandef->center_freq1; in ieee80211_chandef_to_operating_class()
1644 if (chandef->width > NL80211_CHAN_WIDTH_40) in ieee80211_chandef_to_operating_class()
1648 if (chandef->width == NL80211_CHAN_WIDTH_40) { in ieee80211_chandef_to_operating_class()
1649 if (freq > chandef->chan->center_freq) in ieee80211_chandef_to_operating_class()
1652 *op_class = 84; /* HT40- */ in ieee80211_chandef_to_operating_class()
1662 if (chandef->width != NL80211_CHAN_WIDTH_20_NOHT) in ieee80211_chandef_to_operating_class()
1669 switch (chandef->width) { in ieee80211_chandef_to_operating_class()
1691 } else if (chandef->width == NL80211_CHAN_WIDTH_40) { in ieee80211_chandef_to_operating_class()
1692 if (freq > chandef->chan->center_freq) in ieee80211_chandef_to_operating_class()
1707 } else if (chandef->width == NL80211_CHAN_WIDTH_40) { in ieee80211_chandef_to_operating_class()
1708 if (freq > chandef->chan->center_freq) in ieee80211_chandef_to_operating_class()
1723 } else if (chandef->width == NL80211_CHAN_WIDTH_40) { in ieee80211_chandef_to_operating_class()
1724 if (freq > chandef->chan->center_freq) in ieee80211_chandef_to_operating_class()
1739 } else if (chandef->width == NL80211_CHAN_WIDTH_40) { in ieee80211_chandef_to_operating_class()
1740 if (freq > chandef->chan->center_freq) in ieee80211_chandef_to_operating_class()
1755 if (chandef->width >= NL80211_CHAN_WIDTH_40) in ieee80211_chandef_to_operating_class()
1776 list_for_each_entry(wdev, &wiphy->wdev_list, list) { in cfg80211_calculate_bi_data()
1777 if (!wdev->beacon_interval) in cfg80211_calculate_bi_data()
1781 *beacon_int_gcd = wdev->beacon_interval; in cfg80211_calculate_bi_data()
1785 if (wdev->beacon_interval == *beacon_int_gcd) in cfg80211_calculate_bi_data()
1789 *beacon_int_gcd = gcd(*beacon_int_gcd, wdev->beacon_interval); in cfg80211_calculate_bi_data()
1803 * This is just a basic pre-condition check; if interface combinations in cfg80211_validate_beacon_int()
1811 return -EINVAL; in cfg80211_validate_beacon_int()
1837 * cfg80211 already - the only thing not would appear to be any new in cfg80211_iter_combinations()
1840 cfg80211_calculate_bi_data(wiphy, params->new_beacon_int, in cfg80211_iter_combinations()
1843 if (params->radar_detect) { in cfg80211_iter_combinations()
1847 region = regdom->dfs_region; in cfg80211_iter_combinations()
1852 num_interfaces += params->iftype_num[iftype]; in cfg80211_iter_combinations()
1853 if (params->iftype_num[iftype] > 0 && in cfg80211_iter_combinations()
1858 for (i = 0; i < wiphy->n_iface_combinations; i++) { in cfg80211_iter_combinations()
1863 c = &wiphy->iface_combinations[i]; in cfg80211_iter_combinations()
1865 if (num_interfaces > c->max_interfaces) in cfg80211_iter_combinations()
1867 if (params->num_different_channels > c->num_different_channels) in cfg80211_iter_combinations()
1870 limits = kmemdup(c->limits, sizeof(limits[0]) * c->n_limits, in cfg80211_iter_combinations()
1873 return -ENOMEM; in cfg80211_iter_combinations()
1878 for (j = 0; j < c->n_limits; j++) { in cfg80211_iter_combinations()
1882 if (limits[j].max < params->iftype_num[iftype]) in cfg80211_iter_combinations()
1884 limits[j].max -= params->iftype_num[iftype]; in cfg80211_iter_combinations()
1888 if (params->radar_detect != in cfg80211_iter_combinations()
1889 (c->radar_detect_widths & params->radar_detect)) in cfg80211_iter_combinations()
1892 if (params->radar_detect && c->radar_detect_regions && in cfg80211_iter_combinations()
1893 !(c->radar_detect_regions & BIT(region))) in cfg80211_iter_combinations()
1905 if (c->beacon_int_min_gcd && in cfg80211_iter_combinations()
1906 beacon_int_gcd < c->beacon_int_min_gcd) in cfg80211_iter_combinations()
1908 if (!c->beacon_int_min_gcd && beacon_int_different) in cfg80211_iter_combinations()
1943 return -EBUSY; in cfg80211_check_combinations()
1956 return -EINVAL; in ieee80211_get_ratemask()
1959 return -EINVAL; in ieee80211_get_ratemask()
1967 for (j = 0; j < sband->n_bitrates; j++) { in ieee80211_get_ratemask()
1968 if (sband->bitrates[j].bitrate == rate) { in ieee80211_get_ratemask()
1975 return -EINVAL; in ieee80211_get_ratemask()
1980 * didn't accept a 0-length rates array nor allowed in ieee80211_get_ratemask()
1993 if (wiphy->bands[band]) in ieee80211_get_num_supported_channels()
1994 n_channels += wiphy->bands[band]->n_channels; in ieee80211_get_num_supported_channels()
2006 wdev = dev->ieee80211_ptr; in cfg80211_get_station()
2008 return -EOPNOTSUPP; in cfg80211_get_station()
2010 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_get_station()
2011 if (!rdev->ops->get_station) in cfg80211_get_station()
2012 return -EOPNOTSUPP; in cfg80211_get_station()
2027 kfree(f->serv_spec_info); in cfg80211_free_nan_func()
2028 kfree(f->srf_bf); in cfg80211_free_nan_func()
2029 kfree(f->srf_macs); in cfg80211_free_nan_func()
2030 for (i = 0; i < f->num_rx_filters; i++) in cfg80211_free_nan_func()
2031 kfree(f->rx_filters[i].filter); in cfg80211_free_nan_func()
2033 for (i = 0; i < f->num_tx_filters; i++) in cfg80211_free_nan_func()
2034 kfree(f->tx_filters[i].filter); in cfg80211_free_nan_func()
2036 kfree(f->rx_filters); in cfg80211_free_nan_func()
2037 kfree(f->tx_filters); in cfg80211_free_nan_func()
2047 start_freq_khz = center_freq_khz - (bw_khz / 2); in cfg80211_does_bw_fit_range()
2050 if (start_freq_khz >= freq_range->start_freq_khz && in cfg80211_does_bw_fit_range()
2051 end_freq_khz <= freq_range->end_freq_khz) in cfg80211_does_bw_fit_range()
2059 sinfo->pertid = kcalloc(IEEE80211_NUM_TIDS + 1, in cfg80211_sinfo_alloc_tid_stats()
2060 sizeof(*(sinfo->pertid)), in cfg80211_sinfo_alloc_tid_stats()
2062 if (!sinfo->pertid) in cfg80211_sinfo_alloc_tid_stats()
2063 return -ENOMEM; in cfg80211_sinfo_alloc_tid_stats()
2070 /* Ethernet-II snap header (RFC1042 for most EtherTypes) */
2075 /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
2105 * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */ in cfg80211_send_layer2_update()
2107 eth_broadcast_addr(msg->da); in cfg80211_send_layer2_update()
2108 ether_addr_copy(msg->sa, addr); in cfg80211_send_layer2_update()
2109 msg->len = htons(6); in cfg80211_send_layer2_update()
2110 msg->dsap = 0; in cfg80211_send_layer2_update()
2111 msg->ssap = 0x01; /* NULL LSAP, CR Bit: Response */ in cfg80211_send_layer2_update()
2112 msg->control = 0xaf; /* XID response lsb.1111F101. in cfg80211_send_layer2_update()
2114 msg->xid_info[0] = 0x81; /* XID format identifier */ in cfg80211_send_layer2_update()
2115 msg->xid_info[1] = 1; /* LLC types/classes: Type 1 LLC */ in cfg80211_send_layer2_update()
2116 msg->xid_info[2] = 0; /* XID sender's receive window size (RW) */ in cfg80211_send_layer2_update()
2118 skb->dev = dev; in cfg80211_send_layer2_update()
2119 skb->protocol = eth_type_trans(skb, dev); in cfg80211_send_layer2_update()
2120 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_send_layer2_update()
2130 u16 map = le16_to_cpu(cap->supp_mcs.rx_mcs_map); in ieee80211_get_vht_max_nss()
2149 for (i = 7; i >= 0; i--) { in ieee80211_get_vht_max_nss()
2162 if (!(cap->supp_mcs.tx_mcs_map & in ieee80211_get_vht_max_nss()
2166 ext_nss_bw = le32_get_bits(cap->vht_cap_info, in ieee80211_get_vht_max_nss()
2168 supp_width = le32_get_bits(cap->vht_cap_info, in ieee80211_get_vht_max_nss()
2184 * Cover all the special cases according to IEEE 802.11-2016 in ieee80211_get_vht_max_nss()
2185 * Table 9-250. All other cases are either factor of 1 or not in ieee80211_get_vht_max_nss()
2241 return wiphy->flags & WIPHY_FLAG_4ADDR_AP; in cfg80211_iftype_allowed()
2242 return wiphy->interface_modes & BIT(iftype); in cfg80211_iftype_allowed()
2244 if (!(wiphy->software_iftypes & BIT(iftype)) && is_vlan) in cfg80211_iftype_allowed()
2245 return wiphy->flags & WIPHY_FLAG_4ADDR_AP; in cfg80211_iftype_allowed()
2246 return wiphy->software_iftypes & BIT(iftype); in cfg80211_iftype_allowed()