Lines Matching +full:rates +full:- +full:ru
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-2023, 2025 Intel Corporation
24 #include "rdev-ops.h"
31 struct ieee80211_rate *result = &sband->bitrates[0];
34 for (i = 0; i < sband->n_bitrates; i++) {
37 if (sband->bitrates[i].bitrate > bitrate)
39 result = &sband->bitrates[i];
56 if (sband->band == NL80211_BAND_2GHZ)
61 bitrates = sband->bitrates;
62 for (i = 0; i < sband->n_bitrates; i++)
118 return (freq - 2407) / 5;
120 return (freq - 4000) / 5;
122 return (freq - 5000) / 5;
127 return (freq - 5950) / 5;
129 return (freq - 56160) / 2160;
143 sband = wiphy->bands[band];
148 for (i = 0; i < sband->n_channels; i++) {
149 struct ieee80211_channel *chan = &sband->channels[i];
164 switch (sband->band) {
168 for (i = 0; i < sband->n_bitrates; i++) {
169 if (sband->bitrates[i].bitrate == 60 ||
170 sband->bitrates[i].bitrate == 120 ||
171 sband->bitrates[i].bitrate == 240) {
172 sband->bitrates[i].flags |=
174 want--;
182 for (i = 0; i < sband->n_bitrates; i++) {
183 switch (sband->bitrates[i].bitrate) {
188 sband->bitrates[i].flags |=
191 want--;
196 sband->bitrates[i].flags |=
198 want--;
201 sband->bitrates[i].flags |=
210 WARN_ON(!sband->ht_cap.ht_supported);
211 WARN_ON((sband->ht_cap.mcs.rx_mask[0] & 0x1e) != 0x1e);
214 /* Figure 9-589bd: 3 means unsupported, so != 3 means at least
217 WARN_ON((sband->s1g_cap.nss_mcs[0] & 0x3) == 0x3);
231 if (wiphy->bands[band])
232 set_mandatory_flags_band(wiphy->bands[band]);
238 for (i = 0; i < wiphy->n_cipher_suites; i++)
239 if (cipher == wiphy->cipher_suites[i])
247 struct wiphy *wiphy = &rdev->wiphy;
250 for (i = 0; i < wiphy->n_cipher_suites; i++) {
251 switch (wiphy->cipher_suites[i]) {
270 else if (wiphy_ext_feature_isset(&rdev->wiphy,
272 wiphy_ext_feature_isset(&rdev->wiphy,
291 return -EINVAL;
293 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
294 return -EINVAL;
297 return -EINVAL;
299 switch (params->cipher) {
303 params->mode != NL80211_KEY_RX_TX)
304 return -EINVAL;
310 /* IEEE802.11-2016 allows only 0 and - when supporting
311 * Extended Key ID - 1 as index for pairwise keys.
317 if ((params->mode == NL80211_KEY_NO_TX && !pairwise) ||
318 params->mode == NL80211_KEY_SET_TX)
319 return -EINVAL;
320 if (wiphy_ext_feature_isset(&rdev->wiphy,
323 return -EINVAL;
325 return -EINVAL;
332 /* Disallow BIP (group-only) cipher as pairwise cipher */
334 return -EINVAL;
336 return -EINVAL;
341 return -EINVAL;
347 switch (params->cipher) {
349 if (params->key_len != WLAN_KEY_LEN_WEP40)
350 return -EINVAL;
353 if (params->key_len != WLAN_KEY_LEN_TKIP)
354 return -EINVAL;
357 if (params->key_len != WLAN_KEY_LEN_CCMP)
358 return -EINVAL;
361 if (params->key_len != WLAN_KEY_LEN_CCMP_256)
362 return -EINVAL;
365 if (params->key_len != WLAN_KEY_LEN_GCMP)
366 return -EINVAL;
369 if (params->key_len != WLAN_KEY_LEN_GCMP_256)
370 return -EINVAL;
373 if (params->key_len != WLAN_KEY_LEN_WEP104)
374 return -EINVAL;
377 if (params->key_len != WLAN_KEY_LEN_AES_CMAC)
378 return -EINVAL;
381 if (params->key_len != WLAN_KEY_LEN_BIP_CMAC_256)
382 return -EINVAL;
385 if (params->key_len != WLAN_KEY_LEN_BIP_GMAC_128)
386 return -EINVAL;
389 if (params->key_len != WLAN_KEY_LEN_BIP_GMAC_256)
390 return -EINVAL;
395 * allow using it -- but the driver must check
403 if (params->seq) {
404 switch (params->cipher) {
408 return -EINVAL;
418 if (params->seq_len != 6)
419 return -EINVAL;
424 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, params->cipher))
425 return -EINVAL;
479 (const struct ieee80211_hdr *)skb->data;
482 if (unlikely(skb->len < 10))
484 hdrlen = ieee80211_hdrlen(hdr->frame_control);
485 if (unlikely(hdrlen > skb->len))
494 /* 802.11-2012, 8.2.4.7.3 */
508 return __ieee80211_get_mesh_hdrlen(meshhdr->flags);
545 ieee80211_get_8023_tunnel_proto(skb->data + hdrlen,
549 return -EINVAL;
551 payload.eth.h_proto = htons(skb->len - hdrlen);
553 mesh_addr = skb->data + sizeof(payload.eth) + ETH_ALEN;
565 pskb_pull(skb, hdrlen - sizeof(payload.eth));
566 memcpy(skb->data, &payload.eth, sizeof(payload.eth));
576 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
584 if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
585 return -1;
587 hdrlen = ieee80211_hdrlen(hdr->frame_control) + data_offset;
588 if (skb->len < hdrlen)
589 return -1;
603 switch (hdr->frame_control &
609 return -1;
615 return -1;
623 return -1;
629 return -1;
636 /* remove RFC1042 or Bridge-Tunnel encapsulation */
640 tmp.h_proto = htons(skb->len - hdrlen);
661 page_offset = ptr - page_address(page);
662 skb_add_rx_frag(skb, sh->nr_frags, page, page_offset, len, size);
670 const skb_frag_t *frag = &sh->frags[0];
674 int head_size = skb->len - skb->data_len;
677 frag_page = virt_to_head_page(skb->head);
678 frag_ptr = skb->data;
682 offset -= frag_size;
690 frag_len = frag_size - offset;
695 len -= cur_len;
702 len -= cur_len;
715 if (skb->len - offset < len)
734 frame->priority = skb->priority;
738 len -= cur_len;
769 for (offset = 0; offset < skb->len; offset += subframe_len + padding) {
770 int remaining = skb->len - offset;
786 padding = (4 - subframe_len) & 0x3;
798 * Detects if an MSDU frame was maliciously converted into an A-MSDU
800 * as if it were a regular MSDU, even though the A-MSDU flag is set.
802 * For non-mesh interfaces, detection involves checking whether the
804 * header. This is done by comparing the A-MSDU subheader's destination
807 * For mesh interfaces, the MSDU includes a 6-byte Mesh Control field
808 * and an optional variable-length Mesh Address Extension field before
812 * Since this function intentionally parses an A-MSDU frame as an MSDU,
813 * it only assumes that the A-MSDU subframe header is present, and
815 * that the frame is instead parsed as a non-aggregated MSDU.
823 /* Non-mesh case can be directly compared */
825 return ether_addr_equal(eth->h_dest, rfc1042_header);
827 offset = __ieee80211_get_mesh_hdrlen(eth->h_dest[0]);
830 return ether_addr_equal(eth->h_source, rfc1042_header);
831 } else if (offset + ETH_ALEN <= skb->len) {
832 /* Mesh case with non-empty address extension field */
855 bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb);
864 int remaining = skb->len - offset;
878 padding = (4 - subframe_len) & 0x3;
883 /* mitigate A-MSDU aggregation injection attacks, to be
915 frame->dev = skb->dev;
916 frame->priority = skb->priority;
919 ieee80211_get_8023_tunnel_proto(frame->data, &hdr.eth.h_proto)))
945 /* skb->priority values from 256->263 are magic values to
950 if (skb->priority >= 256 && skb->priority <= 263) {
951 ret = skb->priority - 256;
964 switch (skb->protocol) {
980 ret = (ntohl(mpls->entry) & MPLS_LS_TC_MASK)
994 for (i = 0; i < qos_map->num_des; i++) {
995 if (tmp_dscp == qos_map->dscp_exception[i].dscp) {
996 ret = qos_map->dscp_exception[i].up;
1002 if (tmp_dscp >= qos_map->up[i].low &&
1003 tmp_dscp <= qos_map->up[i].high) {
1020 * - Standard: DF
1021 * - Low Priority Data: CS1
1022 * - Multimedia Conferencing: AF41, AF42, AF43
1023 * - Network Control Traffic: CS7
1024 * - Real-Time Interactive: CS4
1025 * - Signaling: CS5
1078 ies = rcu_dereference(bss->ies);
1082 return cfg80211_find_elem(id, ies->data, ies->len);
1088 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1089 struct net_device *dev = wdev->netdev;
1092 if (!wdev->connect_keys)
1096 if (!wdev->connect_keys->params[i].cipher)
1098 if (rdev_add_key(rdev, dev, -1, i, false, NULL,
1099 &wdev->connect_keys->params[i])) {
1103 if (wdev->connect_keys->def == i &&
1104 rdev_set_default_key(rdev, dev, -1, i, true, true)) {
1110 kfree_sensitive(wdev->connect_keys);
1111 wdev->connect_keys = NULL;
1119 spin_lock_irqsave(&wdev->event_lock, flags);
1120 while (!list_empty(&wdev->event_list)) {
1121 ev = list_first_entry(&wdev->event_list,
1123 list_del(&ev->list);
1124 spin_unlock_irqrestore(&wdev->event_lock, flags);
1126 switch (ev->type) {
1129 wdev->netdev,
1130 &ev->cr,
1131 ev->cr.status == WLAN_STATUS_SUCCESS);
1134 __cfg80211_roamed(wdev, &ev->rm);
1137 __cfg80211_disconnected(wdev->netdev,
1138 ev->dc.ie, ev->dc.ie_len,
1139 ev->dc.reason,
1140 !ev->dc.locally_generated);
1143 __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid,
1144 ev->ij.channel);
1147 cfg80211_leave(wiphy_to_rdev(wdev->wiphy), wdev);
1150 __cfg80211_port_authorized(wdev, ev->pa.peer_addr,
1151 ev->pa.td_bitmap,
1152 ev->pa.td_bitmap_len);
1158 spin_lock_irqsave(&wdev->event_lock, flags);
1160 spin_unlock_irqrestore(&wdev->event_lock, flags);
1167 lockdep_assert_held(&rdev->wiphy.mtx);
1169 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
1178 enum nl80211_iftype otype = dev->ieee80211_ptr->iftype;
1180 lockdep_assert_held(&rdev->wiphy.mtx);
1182 /* don't support changing VLANs, you just re-create them */
1184 return -EOPNOTSUPP;
1189 return -EOPNOTSUPP;
1191 if (!rdev->ops->change_virtual_intf ||
1192 !(rdev->wiphy.interface_modes & (1 << ntype)))
1193 return -EOPNOTSUPP;
1201 return -EBUSY;
1203 dev->ieee80211_ptr->use_4addr = false;
1209 cfg80211_stop_ap(rdev, dev, -1, true);
1230 cfg80211_mlme_purge_registrations(dev->ieee80211_ptr);
1232 memset(&dev->ieee80211_ptr->u, 0,
1233 sizeof(dev->ieee80211_ptr->u));
1234 memset(&dev->ieee80211_ptr->links, 0,
1235 sizeof(dev->ieee80211_ptr->links));
1240 WARN_ON(!err && dev->ieee80211_ptr->iftype != ntype);
1242 if (!err && params && params->use_4addr != -1)
1243 dev->ieee80211_ptr->use_4addr = params->use_4addr;
1246 dev->priv_flags &= ~IFF_DONT_BRIDGE;
1249 if (dev->ieee80211_ptr->use_4addr)
1255 dev->priv_flags |= IFF_DONT_BRIDGE;
1280 cfg80211_update_iface_num(rdev, otype, -1);
1291 if (WARN_ON_ONCE(rate->mcs >= 32))
1294 modulation = rate->mcs & 7;
1295 streams = (rate->mcs >> 3) + 1;
1297 bitrate = (rate->bw == RATE_INFO_BW_40) ? 13500000 : 6500000;
1308 if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
1346 /* LP-SC PHY */
1356 if (WARN_ON_ONCE(rate->mcs >= ARRAY_SIZE(__mcs2bitrate)))
1359 return __mcs2bitrate[rate->mcs];
1365 [6 - 6] = 26950, /* MCS 9.1 : 2695.0 mbps */
1366 [7 - 6] = 50050, /* MCS 12.1 */
1367 [8 - 6] = 53900,
1368 [9 - 6] = 57750,
1369 [10 - 6] = 63900,
1370 [11 - 6] = 75075,
1371 [12 - 6] = 80850,
1375 if (WARN_ON_ONCE(rate->mcs < 6 || rate->mcs > 12))
1378 return __mcs2bitrate[rate->mcs - 6];
1409 if (WARN_ON_ONCE(rate->mcs >= ARRAY_SIZE(__mcs2bitrate)))
1412 return __mcs2bitrate[rate->mcs] * rate->n_bonded_ch;
1475 if (rate->mcs > 11)
1478 switch (rate->bw) {
1496 bitrate = base[idx][rate->mcs];
1497 bitrate *= rate->nss;
1499 if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
1506 rate->bw, rate->mcs, rate->nss);
1539 if (WARN_ON_ONCE(rate->mcs > 13))
1542 if (WARN_ON_ONCE(rate->he_gi > NL80211_RATE_INFO_HE_GI_3_2))
1544 if (WARN_ON_ONCE(rate->he_ru_alloc >
1547 if (WARN_ON_ONCE(rate->nss < 1 || rate->nss > 8))
1550 if (rate->bw == RATE_INFO_BW_160 ||
1551 (rate->bw == RATE_INFO_BW_HE_RU &&
1552 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_2x996))
1553 result = rates_160M[rate->he_gi];
1554 else if (rate->bw == RATE_INFO_BW_80 ||
1555 (rate->bw == RATE_INFO_BW_HE_RU &&
1556 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_996))
1557 result = rates_996[rate->he_gi];
1558 else if (rate->bw == RATE_INFO_BW_40 ||
1559 (rate->bw == RATE_INFO_BW_HE_RU &&
1560 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_484))
1561 result = rates_484[rate->he_gi];
1562 else if (rate->bw == RATE_INFO_BW_20 ||
1563 (rate->bw == RATE_INFO_BW_HE_RU &&
1564 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_242))
1565 result = rates_242[rate->he_gi];
1566 else if (rate->bw == RATE_INFO_BW_HE_RU &&
1567 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_106)
1568 result = rates_106[rate->he_gi];
1569 else if (rate->bw == RATE_INFO_BW_HE_RU &&
1570 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_52)
1571 result = rates_52[rate->he_gi];
1572 else if (rate->bw == RATE_INFO_BW_HE_RU &&
1573 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_26)
1574 result = rates_26[rate->he_gi];
1576 WARN(1, "invalid HE MCS: bw:%d, ru:%d\n",
1577 rate->bw, rate->he_ru_alloc);
1584 do_div(tmp, mcs_divisors[rate->mcs]);
1588 result = (result * rate->nss) / 8;
1589 if (rate->he_dcm)
1625 if (WARN_ON_ONCE(rate->mcs > 15))
1627 if (WARN_ON_ONCE(rate->eht_gi > NL80211_RATE_INFO_EHT_GI_3_2))
1629 if (WARN_ON_ONCE(rate->eht_ru_alloc >
1632 if (WARN_ON_ONCE(rate->nss < 1 || rate->nss > 8))
1636 if (rate->mcs == 14) {
1637 if ((rate->bw != RATE_INFO_BW_EHT_RU &&
1638 rate->bw != RATE_INFO_BW_80 &&
1639 rate->bw != RATE_INFO_BW_160 &&
1640 rate->bw != RATE_INFO_BW_320) ||
1641 (rate->bw == RATE_INFO_BW_EHT_RU &&
1642 rate->eht_ru_alloc != NL80211_RATE_INFO_EHT_RU_ALLOC_996 &&
1643 rate->eht_ru_alloc != NL80211_RATE_INFO_EHT_RU_ALLOC_2x996 &&
1644 rate->eht_ru_alloc != NL80211_RATE_INFO_EHT_RU_ALLOC_4x996)) {
1645 WARN(1, "invalid EHT BW for MCS 14: bw:%d, ru:%d\n",
1646 rate->bw, rate->eht_ru_alloc);
1651 if (rate->bw == RATE_INFO_BW_320 ||
1652 (rate->bw == RATE_INFO_BW_EHT_RU &&
1653 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_4x996))
1654 result = 4 * rates_996[rate->eht_gi];
1655 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1656 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484)
1657 result = 3 * rates_996[rate->eht_gi] + rates_484[rate->eht_gi];
1658 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1659 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_3x996)
1660 result = 3 * rates_996[rate->eht_gi];
1661 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1662 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484)
1663 result = 2 * rates_996[rate->eht_gi] + rates_484[rate->eht_gi];
1664 else if (rate->bw == RATE_INFO_BW_160 ||
1665 (rate->bw == RATE_INFO_BW_EHT_RU &&
1666 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_2x996))
1667 result = 2 * rates_996[rate->eht_gi];
1668 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1669 rate->eht_ru_alloc ==
1671 result = rates_996[rate->eht_gi] + rates_484[rate->eht_gi]
1672 + rates_242[rate->eht_gi];
1673 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1674 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_996P484)
1675 result = rates_996[rate->eht_gi] + rates_484[rate->eht_gi];
1676 else if (rate->bw == RATE_INFO_BW_80 ||
1677 (rate->bw == RATE_INFO_BW_EHT_RU &&
1678 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_996))
1679 result = rates_996[rate->eht_gi];
1680 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1681 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_484P242)
1682 result = rates_484[rate->eht_gi] + rates_242[rate->eht_gi];
1683 else if (rate->bw == RATE_INFO_BW_40 ||
1684 (rate->bw == RATE_INFO_BW_EHT_RU &&
1685 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_484))
1686 result = rates_484[rate->eht_gi];
1687 else if (rate->bw == RATE_INFO_BW_20 ||
1688 (rate->bw == RATE_INFO_BW_EHT_RU &&
1689 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_242))
1690 result = rates_242[rate->eht_gi];
1691 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1692 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_106P26)
1693 result = rates_106[rate->eht_gi] + rates_26[rate->eht_gi];
1694 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1695 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_106)
1696 result = rates_106[rate->eht_gi];
1697 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1698 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_52P26)
1699 result = rates_52[rate->eht_gi] + rates_26[rate->eht_gi];
1700 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1701 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_52)
1702 result = rates_52[rate->eht_gi];
1703 else if (rate->bw == RATE_INFO_BW_EHT_RU &&
1704 rate->eht_ru_alloc == NL80211_RATE_INFO_EHT_RU_ALLOC_26)
1705 result = rates_26[rate->eht_gi];
1707 WARN(1, "invalid EHT MCS: bw:%d, ru:%d\n",
1708 rate->bw, rate->eht_ru_alloc);
1715 do_div(tmp, mcs_divisors[rate->mcs]);
1718 tmp *= rate->nss;
1792 if (rate->mcs >= 11)
1795 switch (rate->bw) {
1821 bitrate = base[idx][rate->mcs];
1822 bitrate *= rate->nss;
1824 if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
1830 rate->bw, rate->mcs, rate->nss);
1836 if (rate->flags & RATE_INFO_FLAGS_MCS)
1838 if (rate->flags & RATE_INFO_FLAGS_DMG)
1840 if (rate->flags & RATE_INFO_FLAGS_EXTENDED_SC_DMG)
1842 if (rate->flags & RATE_INFO_FLAGS_EDMG)
1844 if (rate->flags & RATE_INFO_FLAGS_VHT_MCS)
1846 if (rate->flags & RATE_INFO_FLAGS_HE_MCS)
1848 if (rate->flags & RATE_INFO_FLAGS_EHT_MCS)
1850 if (rate->flags & RATE_INFO_FLAGS_S1G_MCS)
1853 return rate->legacy;
1872 return -EILSEQ;
1875 return -EILSEQ;
1890 iedatalen -= 4;
1900 bufsize -= min(bufsize, copy);
1908 attr_remaining -= copy;
1912 iedatalen -= copy;
1920 return -EILSEQ;
1923 iedatalen -= 3;
1933 bufsize -= min(bufsize, copy);
1941 iedatalen -= copy;
1942 attr_remaining = attr_len - copy;
1946 len -= ies[1] + 2;
1951 return -EILSEQ;
1953 return -ENOENT;
1962 if (WARN_ON(ids[n_ids - 1] == WLAN_EID_EXTENSION))
2057 elem_len = skb->data + skb->len - len_pos - 1;
2063 elem_len -= 255;
2115 !chan || band != chan->band)
2118 control_freq = chan->center_freq;
2119 chandef->chan = chan;
2122 offset = control_freq - 5955;
2124 offset = control_freq - 5745;
2126 offset = control_freq - 5180;
2139 chandef->center_freq1 = control_freq;
2140 chandef->width = NL80211_CHAN_WIDTH_20;
2147 chandef->center_freq1 = control_freq + 10;
2148 chandef->width = NL80211_CHAN_WIDTH_40;
2155 chandef->center_freq1 = control_freq - 10;
2156 chandef->width = NL80211_CHAN_WIDTH_40;
2159 chandef->center_freq1 = control_freq + 10 - (offset & 1) * 20;
2160 chandef->width = NL80211_CHAN_WIDTH_40;
2164 chandef->center_freq1 = control_freq + 30 - (offset & 3) * 20;
2165 chandef->width = NL80211_CHAN_WIDTH_80;
2169 chandef->center_freq1 = control_freq + 70 - (offset & 7) * 20;
2170 chandef->width = NL80211_CHAN_WIDTH_160;
2176 /* 320-1 or 320-2 channelization is unknown */
2187 u32 freq = chandef->center_freq1;
2190 if (chandef->width > NL80211_CHAN_WIDTH_40)
2194 if (chandef->width == NL80211_CHAN_WIDTH_40) {
2195 if (freq > chandef->chan->center_freq)
2198 *op_class = 84; /* HT40- */
2208 if (chandef->width != NL80211_CHAN_WIDTH_20_NOHT)
2215 switch (chandef->width) {
2237 } else if (chandef->width == NL80211_CHAN_WIDTH_40) {
2238 if (freq > chandef->chan->center_freq)
2253 } else if (chandef->width == NL80211_CHAN_WIDTH_40) {
2254 if (freq > chandef->chan->center_freq)
2269 } else if (chandef->width == NL80211_CHAN_WIDTH_40) {
2270 if (freq > chandef->chan->center_freq)
2285 } else if (chandef->width == NL80211_CHAN_WIDTH_40) {
2286 if (freq > chandef->chan->center_freq)
2301 if (chandef->width >= NL80211_CHAN_WIDTH_40)
2315 switch (wdev->iftype) {
2318 WARN_ON(wdev->valid_links);
2319 return wdev->links[0].ap.beacon_interval;
2321 return wdev->u.mesh.beacon_interval;
2323 return wdev->u.ibss.beacon_interval;
2343 list_for_each_entry(wdev, &wiphy->wdev_list, list) {
2347 if (wdev->valid_links)
2352 !(rdev_get_radio_mask(rdev, wdev->netdev) & BIT(radio_idx)))
2383 * This is just a basic pre-condition check; if interface combinations
2391 return -EINVAL;
2412 if (params->radio_idx >= 0)
2413 radio = &wiphy->radio[params->radio_idx];
2422 * cfg80211 already - the only thing not would appear to be any new
2425 cfg80211_calculate_bi_data(wiphy, params->new_beacon_int,
2427 params->radio_idx);
2429 if (params->radar_detect) {
2433 region = regdom->dfs_region;
2438 num_interfaces += params->iftype_num[iftype];
2439 if (params->iftype_num[iftype] > 0 &&
2445 cs = radio->iface_combinations;
2446 n = radio->n_iface_combinations;
2448 cs = wiphy->iface_combinations;
2449 n = wiphy->n_iface_combinations;
2456 if (num_interfaces > c->max_interfaces)
2458 if (params->num_different_channels > c->num_different_channels)
2461 limits = kmemdup_array(c->limits, c->n_limits, sizeof(*limits),
2464 return -ENOMEM;
2469 for (j = 0; j < c->n_limits; j++) {
2473 if (limits[j].max < params->iftype_num[iftype])
2475 limits[j].max -= params->iftype_num[iftype];
2479 if (params->radar_detect !=
2480 (c->radar_detect_widths & params->radar_detect))
2483 if (params->radar_detect && c->radar_detect_regions &&
2484 !(c->radar_detect_regions & BIT(region)))
2496 if (c->beacon_int_min_gcd &&
2497 beacon_int_gcd < c->beacon_int_min_gcd)
2499 if (!c->beacon_int_min_gcd && beacon_int_different)
2534 return -EBUSY;
2548 return -EINVAL;
2551 for (i = 0; i < wiphy->n_radio; i++) {
2552 radio = &wiphy->radio[i];
2553 for (j = 0; j < radio->n_freq_range; j++) {
2554 if (freq >= radio->freq_range[j].start_freq &&
2555 freq < radio->freq_range[j].end_freq)
2560 return -EINVAL;
2565 const u8 *rates, unsigned int n_rates,
2571 return -EINVAL;
2574 return -EINVAL;
2579 int rate = (rates[i] & 0x7f) * 5;
2582 for (j = 0; j < sband->n_bitrates; j++) {
2583 if (sband->bitrates[j].bitrate == rate) {
2590 return -EINVAL;
2595 * didn't accept a 0-length rates array nor allowed
2608 if (wiphy->bands[band])
2609 n_channels += wiphy->bands[band]->n_channels;
2621 wdev = dev->ieee80211_ptr;
2623 return -EOPNOTSUPP;
2625 rdev = wiphy_to_rdev(wdev->wiphy);
2626 if (!rdev->ops->get_station)
2627 return -EOPNOTSUPP;
2631 guard(wiphy)(&rdev->wiphy);
2644 kfree(f->serv_spec_info);
2645 kfree(f->srf_bf);
2646 kfree(f->srf_macs);
2647 for (i = 0; i < f->num_rx_filters; i++)
2648 kfree(f->rx_filters[i].filter);
2650 for (i = 0; i < f->num_tx_filters; i++)
2651 kfree(f->tx_filters[i].filter);
2653 kfree(f->rx_filters);
2654 kfree(f->tx_filters);
2664 start_freq_khz = center_freq_khz - (bw_khz / 2);
2667 if (start_freq_khz >= freq_range->start_freq_khz &&
2668 end_freq_khz <= freq_range->end_freq_khz)
2677 link_sinfo->pertid = kcalloc(IEEE80211_NUM_TIDS + 1,
2678 sizeof(*link_sinfo->pertid), gfp);
2679 if (!link_sinfo->pertid)
2680 return -ENOMEM;
2688 sinfo->pertid = kcalloc(IEEE80211_NUM_TIDS + 1,
2689 sizeof(*(sinfo->pertid)),
2691 if (!sinfo->pertid)
2692 return -ENOMEM;
2699 /* Ethernet-II snap header (RFC1042 for most EtherTypes) */
2704 /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
2734 * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
2736 eth_broadcast_addr(msg->da);
2737 ether_addr_copy(msg->sa, addr);
2738 msg->len = htons(6);
2739 msg->dsap = 0;
2740 msg->ssap = 0x01; /* NULL LSAP, CR Bit: Response */
2741 msg->control = 0xaf; /* XID response lsb.1111F101.
2743 msg->xid_info[0] = 0x81; /* XID format identifier */
2744 msg->xid_info[1] = 1; /* LLC types/classes: Type 1 LLC */
2745 msg->xid_info[2] = 0; /* XID sender's receive window size (RW) */
2747 skb->dev = dev;
2748 skb->protocol = eth_type_trans(skb, dev);
2749 memset(skb->cb, 0, sizeof(skb->cb));
2759 u16 map = le16_to_cpu(cap->supp_mcs.rx_mcs_map);
2778 for (i = 7; i >= 0; i--) {
2791 if (!(cap->supp_mcs.tx_mcs_map &
2795 ext_nss_bw = le32_get_bits(cap->vht_cap_info,
2797 supp_width = le32_get_bits(cap->vht_cap_info,
2813 * Cover all the special cases according to IEEE 802.11-2016
2814 * Table 9-250. All other cases are either factor of 1 or not
2870 return wiphy->flags & WIPHY_FLAG_4ADDR_AP;
2871 return wiphy->interface_modes & BIT(iftype);
2873 if (!(wiphy->software_iftypes & BIT(iftype)) && is_vlan)
2874 return wiphy->flags & WIPHY_FLAG_4ADDR_AP;
2875 return wiphy->software_iftypes & BIT(iftype);
2886 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
2888 lockdep_assert_wiphy(wdev->wiphy);
2890 switch (wdev->iftype) {
2893 cfg80211_stop_ap(rdev, wdev->netdev, link_id, true);
2896 /* per-link not relevant */
2902 wdev->valid_links &= ~BIT(link_id);
2903 eth_zero_addr(wdev->links[link_id].addr);
2914 if (wdev->iftype != NL80211_IFTYPE_AP)
2917 if (wdev->valid_links) {
2936 for (i = 0; i < wiphy->num_iftype_ext_capab; i++) {
2937 if (wiphy->iftype_ext_capab[i].iftype == type)
2938 return &wiphy->iftype_ext_capab[i];
2952 for (i = 0; i < radio->n_freq_range; i++) {
2953 r = &radio->freq_range[i];
2954 if (freq - width / 2 >= r->start_freq &&
2955 freq + width / 2 <= r->end_freq)
2972 freq = MHZ_TO_KHZ(chandef->center_freq2);
2983 struct wiphy *wiphy = wdev->wiphy;
2989 radio_mask = wdev->radio_mask;
2990 if (!wiphy->n_radio || radio_mask == BIT(wiphy->n_radio) - 1)
2994 for (i = 0; i < wiphy->n_radio; i++) {
2998 radio = &wiphy->radio[i];