Lines Matching +full:ftm +full:- +full:src

1 // SPDX-License-Identifier: GPL-2.0-only
3 * mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211
6 * Copyright (c) 2016 - 2017 Intel Deutschland GmbH
7 * Copyright (C) 2018 - 2025 Intel Corporation
12 * - Add TSF sync and fix IBSS beacon transmission by adding
14 * - RX filtering based on filter configuration (data->rx_filter)
66 MODULE_PARM_DESC(support_p2p_device, "Support P2P-Device interface type");
77 * enum hwsim_regtest - the type of regulatory tests we offer
92 * this by using a custom beacon-capable regulatory domain for the first
110 * non-strict settings using the second driver regulatory request. All
115 * 1 - driver custom world regulatory domain
116 * 2 - second custom world regulatory domain
117 * 3 - first driver regulatory domain request
118 * 4 - second driver regulatory domain request
119 * 5 - strict regulatory domain settings using the third driver regulatory
121 * 6 and on - should follow the intersection of the 3rd, 4rth and 5th radio
165 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
166 REG_RULE(2484-10, 2484+10, 40, 0, 20, 0),
167 REG_RULE(5150-10, 5240+10, 40, 0, 30, 0),
168 REG_RULE(5745-10, 5825+10, 40, 0, 30, 0),
169 REG_RULE(5855-10, 5925+10, 40, 0, 33, 0),
177 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
178 REG_RULE(5725-10, 5850+10, 40, 0, 30,
180 REG_RULE(5855-10, 5925+10, 40, 0, 33, 0),
188 REG_RULE(2412 - 10, 2462 + 10, 40, 0, 20, 0),
189 REG_RULE(2484 - 10, 2484 + 10, 40, 0, 20, 0),
190 REG_RULE(5150 - 10, 5240 + 10, 40, 0, 30, 0),
191 REG_RULE(5745 - 10, 5825 + 10, 40, 0, 30, 0),
192 REG_RULE(5855 - 10, 5925 + 10, 40, 0, 33, 0),
193 REG_RULE(5955 - 10, 7125 + 10, 320, 0, 33, 0),
201 REG_RULE(2412 - 10, 2462 + 10, 40, 0, 20, 0),
202 REG_RULE(2484 - 10, 2484 + 10, 40, 0, 20, 0),
203 REG_RULE(5150 - 10, 5240 + 10, 80, 0, 30, NL80211_RRF_AUTO_BW),
204 REG_RULE(5260 - 10, 5320 + 10, 80, 0, 30,
207 REG_RULE(5500 - 10, 5720 + 10, 160, 0, 30,
209 REG_RULE(5745 - 10, 5825 + 10, 80, 0, 30, 0),
210 REG_RULE(5855 - 10, 5925 + 10, 80, 0, 33, 0),
234 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in hwsim_check_magic()
235 WARN(vp->magic != HWSIM_VIF_MAGIC, in hwsim_check_magic()
237 vif, vp->magic, vif->addr, vif->type, vif->p2p); in hwsim_check_magic()
242 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in hwsim_set_magic()
243 vp->magic = HWSIM_VIF_MAGIC; in hwsim_set_magic()
248 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in hwsim_clear_magic()
249 vp->magic = 0; in hwsim_clear_magic()
262 struct hwsim_sta_priv *sp = (void *)sta->drv_priv; in hwsim_check_sta_magic()
263 WARN_ON(sp->magic != HWSIM_STA_MAGIC); in hwsim_check_sta_magic()
268 struct hwsim_sta_priv *sp = (void *)sta->drv_priv; in hwsim_set_sta_magic()
269 sp->magic = HWSIM_STA_MAGIC; in hwsim_set_sta_magic()
274 struct hwsim_sta_priv *sp = (void *)sta->drv_priv; in hwsim_clear_sta_magic()
275 sp->magic = 0; in hwsim_clear_sta_magic()
286 struct hwsim_chanctx_priv *cp = (void *)c->drv_priv; in hwsim_check_chanctx_magic()
287 WARN_ON(cp->magic != HWSIM_CHANCTX_MAGIC); in hwsim_check_chanctx_magic()
292 struct hwsim_chanctx_priv *cp = (void *)c->drv_priv; in hwsim_set_chanctx_magic()
293 cp->magic = HWSIM_CHANCTX_MAGIC; in hwsim_set_chanctx_magic()
298 struct hwsim_chanctx_priv *cp = (void *)c->drv_priv; in hwsim_clear_chanctx_magic()
299 cp->magic = 0; in hwsim_clear_chanctx_magic()
315 return hwsim_net->netgroup; in hwsim_net_get_netgroup()
322 hwsim_net->netgroup = ida_alloc(&hwsim_netgroup_ida, GFP_KERNEL); in hwsim_net_set_netgroup()
323 return hwsim_net->netgroup >= 0 ? 0 : -ENOMEM; in hwsim_net_set_netgroup()
330 return hwsim_net->wmediumd; in hwsim_net_get_wmediumd()
337 hwsim_net->wmediumd = portid; in hwsim_net_set_wmediumd()
515 /* Rx Single spatial stream and S1G-MCS Map for 1MHz */
516 /* Tx Single spatial stream and S1G-MCS Map for 1MHz */
548 #define DEFAULT_RX_RSSI -50
590 return -EINVAL; in mac80211_hwsim_vendor_cmd_test()
610 /* Send the event - this will call nla_nest_end() */ in mac80211_hwsim_vendor_cmd_test()
617 return -ENOMEM; in mac80211_hwsim_vendor_cmd_test()
960 err = -ENODEV; in hwsim_tx_virtio()
964 sg_init_one(sg, skb->head, skb_end_offset(skb)); in hwsim_tx_virtio()
1027 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in hwsim_send_ps_poll()
1031 if (!vp->assoc) in hwsim_send_ps_poll()
1034 wiphy_dbg(data->hw->wiphy, in hwsim_send_ps_poll()
1035 "%s: send PS-Poll to %pM for aid %d\n", in hwsim_send_ps_poll()
1036 __func__, vp->bssid, vp->aid); in hwsim_send_ps_poll()
1042 pspoll->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | in hwsim_send_ps_poll()
1045 pspoll->aid = cpu_to_le16(0xc000 | vp->aid); in hwsim_send_ps_poll()
1046 memcpy(pspoll->bssid, vp->bssid, ETH_ALEN); in hwsim_send_ps_poll()
1047 memcpy(pspoll->ta, mac, ETH_ALEN); in hwsim_send_ps_poll()
1050 mac80211_hwsim_tx_frame(data->hw, skb, in hwsim_send_ps_poll()
1051 rcu_dereference(vif->bss_conf.chanctx_conf)->def.chan); in hwsim_send_ps_poll()
1058 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in hwsim_send_nullfunc()
1063 if (!vp->assoc) in hwsim_send_nullfunc()
1066 wiphy_dbg(data->hw->wiphy, in hwsim_send_nullfunc()
1068 __func__, vp->bssid, ps); in hwsim_send_nullfunc()
1073 hdr = skb_put(skb, sizeof(*hdr) - ETH_ALEN); in hwsim_send_nullfunc()
1074 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA | in hwsim_send_nullfunc()
1078 hdr->duration_id = cpu_to_le16(0); in hwsim_send_nullfunc()
1079 memcpy(hdr->addr1, vp->bssid, ETH_ALEN); in hwsim_send_nullfunc()
1080 memcpy(hdr->addr2, mac, ETH_ALEN); in hwsim_send_nullfunc()
1081 memcpy(hdr->addr3, vp->bssid, ETH_ALEN); in hwsim_send_nullfunc()
1084 cb->control.rates[0].count = 1; in hwsim_send_nullfunc()
1085 cb->control.rates[1].idx = -1; in hwsim_send_nullfunc()
1088 mac80211_hwsim_tx_frame(data->hw, skb, in hwsim_send_nullfunc()
1089 rcu_dereference(vif->bss_conf.chanctx_conf)->def.chan); in hwsim_send_nullfunc()
1111 *val = data->ps; in hwsim_fops_ps_read()
1122 return -EINVAL; in hwsim_fops_ps_write()
1125 if (data->ps != PS_ENABLED) in hwsim_fops_ps_write()
1126 return -EINVAL; in hwsim_fops_ps_write()
1129 data->hw, IEEE80211_IFACE_ITER_NORMAL, in hwsim_fops_ps_write()
1134 old_ps = data->ps; in hwsim_fops_ps_write()
1135 data->ps = val; in hwsim_fops_ps_write()
1140 data->hw, IEEE80211_IFACE_ITER_NORMAL, in hwsim_fops_ps_write()
1144 data->hw, IEEE80211_IFACE_ITER_NORMAL, in hwsim_fops_ps_write()
1159 ieee80211_radar_detected(data->hw, NULL); in hwsim_write_simulate_radar()
1170 *val = data->group; in hwsim_fops_group_read()
1177 data->group = val; in hwsim_fops_group_write()
1188 *val = data->rx_rssi; in hwsim_fops_rx_rssi_read()
1197 if (rssi >= 0 || rssi < -100) in hwsim_fops_rx_rssi_write()
1198 return -EINVAL; in hwsim_fops_rx_rssi_write()
1200 data->rx_rssi = rssi; in hwsim_fops_rx_rssi_write()
1224 return cpu_to_le64(now + data->tsf_offset); in __mac80211_hwsim_get_tsf()
1230 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_get_tsf()
1237 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_set_tsf()
1240 u32 bcn_int = data->link_data[0].beacon_int; in mac80211_hwsim_set_tsf()
1241 u64 delta = abs(tsf - now); in mac80211_hwsim_set_tsf()
1244 conf = link_conf_dereference_protected(vif, data->link_data[0].link_id); in mac80211_hwsim_set_tsf()
1245 if (conf && !conf->enable_beacon) in mac80211_hwsim_set_tsf()
1250 data->tsf_offset += delta; in mac80211_hwsim_set_tsf()
1251 data->bcn_delta = do_div(delta, bcn_int); in mac80211_hwsim_set_tsf()
1253 data->tsf_offset -= delta; in mac80211_hwsim_set_tsf()
1254 data->bcn_delta = -(s64)do_div(delta, bcn_int); in mac80211_hwsim_set_tsf()
1262 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_monitor_rx()
1272 bitrate = txrate->bitrate; in mac80211_hwsim_monitor_rx()
1282 hdr->hdr.it_version = PKTHDR_RADIOTAP_VERSION; in mac80211_hwsim_monitor_rx()
1283 hdr->hdr.it_pad = 0; in mac80211_hwsim_monitor_rx()
1284 hdr->hdr.it_len = cpu_to_le16(sizeof(*hdr)); in mac80211_hwsim_monitor_rx()
1285 hdr->hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | in mac80211_hwsim_monitor_rx()
1289 hdr->rt_tsft = __mac80211_hwsim_get_tsf(data); in mac80211_hwsim_monitor_rx()
1290 hdr->rt_flags = 0; in mac80211_hwsim_monitor_rx()
1291 hdr->rt_rate = bitrate / 5; in mac80211_hwsim_monitor_rx()
1292 hdr->rt_channel = cpu_to_le16(chan->center_freq); in mac80211_hwsim_monitor_rx()
1294 if (txrate && txrate->flags & IEEE80211_RATE_ERP_G) in mac80211_hwsim_monitor_rx()
1298 hdr->rt_chbitmask = cpu_to_le16(flags); in mac80211_hwsim_monitor_rx()
1300 skb->dev = hwsim_mon; in mac80211_hwsim_monitor_rx()
1302 skb->ip_summed = CHECKSUM_UNNECESSARY; in mac80211_hwsim_monitor_rx()
1303 skb->pkt_type = PACKET_OTHERHOST; in mac80211_hwsim_monitor_rx()
1304 skb->protocol = htons(ETH_P_802_2); in mac80211_hwsim_monitor_rx()
1305 memset(skb->cb, 0, sizeof(skb->cb)); in mac80211_hwsim_monitor_rx()
1326 hdr->hdr.it_version = PKTHDR_RADIOTAP_VERSION; in mac80211_hwsim_monitor_ack()
1327 hdr->hdr.it_pad = 0; in mac80211_hwsim_monitor_ack()
1328 hdr->hdr.it_len = cpu_to_le16(sizeof(*hdr)); in mac80211_hwsim_monitor_ack()
1329 hdr->hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | in mac80211_hwsim_monitor_ack()
1331 hdr->rt_flags = 0; in mac80211_hwsim_monitor_ack()
1332 hdr->pad = 0; in mac80211_hwsim_monitor_ack()
1333 hdr->rt_channel = cpu_to_le16(chan->center_freq); in mac80211_hwsim_monitor_ack()
1335 hdr->rt_chbitmask = cpu_to_le16(flags); in mac80211_hwsim_monitor_ack()
1338 hdr11->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | in mac80211_hwsim_monitor_ack()
1340 hdr11->duration_id = cpu_to_le16(0); in mac80211_hwsim_monitor_ack()
1341 memcpy(hdr11->addr1, addr, ETH_ALEN); in mac80211_hwsim_monitor_ack()
1343 skb->dev = hwsim_mon; in mac80211_hwsim_monitor_ack()
1345 skb->ip_summed = CHECKSUM_UNNECESSARY; in mac80211_hwsim_monitor_ack()
1346 skb->pkt_type = PACKET_OTHERHOST; in mac80211_hwsim_monitor_ack()
1347 skb->protocol = htons(ETH_P_802_2); in mac80211_hwsim_monitor_ack()
1348 memset(skb->cb, 0, sizeof(skb->cb)); in mac80211_hwsim_monitor_ack()
1363 if (memcmp(mac, md->addr, ETH_ALEN) == 0) { in mac80211_hwsim_addr_iter()
1364 md->ret = true; in mac80211_hwsim_addr_iter()
1369 for (i = 0; i < ARRAY_SIZE(vif->link_conf); i++) { in mac80211_hwsim_addr_iter()
1372 conf = rcu_dereference(vif->link_conf[i]); in mac80211_hwsim_addr_iter()
1376 if (memcmp(conf->addr, md->addr, ETH_ALEN) == 0) { in mac80211_hwsim_addr_iter()
1377 md->ret = true; in mac80211_hwsim_addr_iter()
1390 if (data->scanning && memcmp(addr, data->scan_addr, ETH_ALEN) == 0) in mac80211_hwsim_addr_match()
1395 ieee80211_iterate_active_interfaces_atomic(data->hw, in mac80211_hwsim_addr_match()
1406 switch (data->ps) { in hwsim_ps_rx_ok()
1413 * if pending PS-Poll has been sent */ in hwsim_ps_rx_ok()
1417 * PS-Poll */ in hwsim_ps_rx_ok()
1418 if (data->ps_poll_pending && in hwsim_ps_rx_ok()
1419 mac80211_hwsim_addr_match(data, skb->data + 4)) { in hwsim_ps_rx_ok()
1420 data->ps_poll_pending = false; in hwsim_ps_rx_ok()
1434 int res = -ENOENT; in hwsim_unicast_netgroup()
1438 if (data->netgroup == hwsim_net_get_netgroup(net)) { in hwsim_unicast_netgroup()
1455 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_config_mac_nl()
1456 u32 _portid = READ_ONCE(data->wmediumd); in mac80211_hwsim_config_mac_nl()
1478 ETH_ALEN, data->addresses[1].addr)) in mac80211_hwsim_config_mac_nl()
1499 if (rate->flags & IEEE80211_TX_RC_USE_RTS_CTS) in trans_tx_rate_flags_ieee2hwsim()
1501 if (rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) in trans_tx_rate_flags_ieee2hwsim()
1503 if (rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) in trans_tx_rate_flags_ieee2hwsim()
1505 if (rate->flags & IEEE80211_TX_RC_MCS) in trans_tx_rate_flags_ieee2hwsim()
1507 if (rate->flags & IEEE80211_TX_RC_GREEN_FIELD) in trans_tx_rate_flags_ieee2hwsim()
1509 if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) in trans_tx_rate_flags_ieee2hwsim()
1511 if (rate->flags & IEEE80211_TX_RC_DUP_DATA) in trans_tx_rate_flags_ieee2hwsim()
1513 if (rate->flags & IEEE80211_TX_RC_SHORT_GI) in trans_tx_rate_flags_ieee2hwsim()
1515 if (rate->flags & IEEE80211_TX_RC_VHT_MCS) in trans_tx_rate_flags_ieee2hwsim()
1517 if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH) in trans_tx_rate_flags_ieee2hwsim()
1519 if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH) in trans_tx_rate_flags_ieee2hwsim()
1531 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_tx_frame_nl()
1532 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) my_skb->data; in mac80211_hwsim_tx_frame_nl()
1541 if (data->ps != PS_DISABLED) in mac80211_hwsim_tx_frame_nl()
1542 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM); in mac80211_hwsim_tx_frame_nl()
1544 if (skb_queue_len(&data->pending) >= MAX_QUEUE) { in mac80211_hwsim_tx_frame_nl()
1546 while (skb_queue_len(&data->pending) >= WARN_QUEUE) { in mac80211_hwsim_tx_frame_nl()
1547 ieee80211_free_txskb(hw, skb_dequeue(&data->pending)); in mac80211_hwsim_tx_frame_nl()
1548 data->tx_dropped++; in mac80211_hwsim_tx_frame_nl()
1564 ETH_ALEN, data->addresses[1].addr)) in mac80211_hwsim_tx_frame_nl()
1567 /* We get the skb->data */ in mac80211_hwsim_tx_frame_nl()
1568 if (nla_put(skb, HWSIM_ATTR_FRAME, my_skb->len, my_skb->data)) in mac80211_hwsim_tx_frame_nl()
1574 if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) in mac80211_hwsim_tx_frame_nl()
1577 if (info->flags & IEEE80211_TX_CTL_NO_ACK) in mac80211_hwsim_tx_frame_nl()
1583 if (nla_put_u32(skb, HWSIM_ATTR_FREQ, channel->center_freq)) in mac80211_hwsim_tx_frame_nl()
1589 tx_attempts[i].idx = info->status.rates[i].idx; in mac80211_hwsim_tx_frame_nl()
1590 tx_attempts_flags[i].idx = info->status.rates[i].idx; in mac80211_hwsim_tx_frame_nl()
1591 tx_attempts[i].count = info->status.rates[i].count; in mac80211_hwsim_tx_frame_nl()
1594 &info->status.rates[i]); in mac80211_hwsim_tx_frame_nl()
1608 cookie = atomic_inc_return(&data->pending_cookie); in mac80211_hwsim_tx_frame_nl()
1609 info->rate_driver_data[0] = (void *)cookie; in mac80211_hwsim_tx_frame_nl()
1624 skb_queue_tail(&data->pending, my_skb); in mac80211_hwsim_tx_frame_nl()
1625 data->tx_pkts++; in mac80211_hwsim_tx_frame_nl()
1626 data->tx_bytes += my_skb->len; in mac80211_hwsim_tx_frame_nl()
1634 data->tx_failed++; in mac80211_hwsim_tx_frame_nl()
1643 return c1->center_freq == c2->center_freq; in hwsim_chans_compat()
1660 if (vif->type == NL80211_IFTYPE_NAN) { in mac80211_hwsim_tx_iter()
1661 data->receive = (data->channel && in mac80211_hwsim_tx_iter()
1662 (data->channel->center_freq == 2437 || in mac80211_hwsim_tx_iter()
1663 data->channel->center_freq == 5745)); in mac80211_hwsim_tx_iter()
1667 for (i = 0; i < ARRAY_SIZE(vif->link_conf); i++) { in mac80211_hwsim_tx_iter()
1671 conf = rcu_dereference(vif->link_conf[i]); in mac80211_hwsim_tx_iter()
1675 chanctx = rcu_dereference(conf->chanctx_conf); in mac80211_hwsim_tx_iter()
1679 if (!hwsim_chans_compat(data->channel, chanctx->def.chan)) in mac80211_hwsim_tx_iter()
1682 data->receive = true; in mac80211_hwsim_tx_iter()
1717 rtap->len = cpu_to_le16(sizeof(*rtap) - in mac80211_hwsim_add_vendor_rtap()
1720 rtap->type = cpu_to_le16(IEEE80211_RADIOTAP_VENDOR_NAMESPACE); in mac80211_hwsim_add_vendor_rtap()
1722 rtap->content.oui[0] = HWSIM_RADIOTAP_OUI[0]; in mac80211_hwsim_add_vendor_rtap()
1723 rtap->content.oui[1] = HWSIM_RADIOTAP_OUI[1]; in mac80211_hwsim_add_vendor_rtap()
1724 rtap->content.oui[2] = HWSIM_RADIOTAP_OUI[2]; in mac80211_hwsim_add_vendor_rtap()
1725 rtap->content.oui_subtype = 127; in mac80211_hwsim_add_vendor_rtap()
1727 rtap->content.reserved = 0; in mac80211_hwsim_add_vendor_rtap()
1728 rtap->content.vendor_type = 0; in mac80211_hwsim_add_vendor_rtap()
1729 memcpy(rtap->content.data, vendor_data, sizeof(vendor_data)); in mac80211_hwsim_add_vendor_rtap()
1731 IEEE80211_SKB_RXCB(skb)->flag |= RX_FLAG_RADIOTAP_TLV_AT_END; in mac80211_hwsim_add_vendor_rtap()
1739 struct ieee80211_hdr *hdr = (void *)skb->data; in mac80211_hwsim_rx()
1741 if (!ieee80211_has_morefrags(hdr->frame_control) && in mac80211_hwsim_rx()
1742 !is_multicast_ether_addr(hdr->addr1) && in mac80211_hwsim_rx()
1743 (ieee80211_is_mgmt(hdr->frame_control) || in mac80211_hwsim_rx()
1744 ieee80211_is_data(hdr->frame_control))) { in mac80211_hwsim_rx()
1749 sta = ieee80211_find_sta_by_link_addrs(data->hw, hdr->addr2, in mac80211_hwsim_rx()
1750 hdr->addr1, &link_id); in mac80211_hwsim_rx()
1752 struct hwsim_sta_priv *sp = (void *)sta->drv_priv; in mac80211_hwsim_rx()
1754 if (ieee80211_has_pm(hdr->frame_control)) in mac80211_hwsim_rx()
1755 sp->active_links_rx &= ~BIT(link_id); in mac80211_hwsim_rx()
1757 sp->active_links_rx |= BIT(link_id); in mac80211_hwsim_rx()
1759 rx_status->link_valid = true; in mac80211_hwsim_rx()
1760 rx_status->link_id = link_id; in mac80211_hwsim_rx()
1769 data->rx_pkts++; in mac80211_hwsim_rx()
1770 data->rx_bytes += skb->len; in mac80211_hwsim_rx()
1771 ieee80211_rx_irqsafe(data->hw, skb); in mac80211_hwsim_rx()
1778 struct mac80211_hwsim_data *data = hw->priv, *data2; in mac80211_hwsim_tx_frame_no_nl()
1780 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; in mac80211_hwsim_tx_frame_no_nl()
1787 rx_status.freq = chan->center_freq; in mac80211_hwsim_tx_frame_no_nl()
1788 rx_status.freq_offset = chan->freq_offset ? 1 : 0; in mac80211_hwsim_tx_frame_no_nl()
1789 rx_status.band = chan->band; in mac80211_hwsim_tx_frame_no_nl()
1790 if (info->control.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) { in mac80211_hwsim_tx_frame_no_nl()
1792 ieee80211_rate_get_vht_mcs(&info->control.rates[0]); in mac80211_hwsim_tx_frame_no_nl()
1794 ieee80211_rate_get_vht_nss(&info->control.rates[0]); in mac80211_hwsim_tx_frame_no_nl()
1797 rx_status.rate_idx = info->control.rates[0].idx; in mac80211_hwsim_tx_frame_no_nl()
1798 if (info->control.rates[0].flags & IEEE80211_TX_RC_MCS) in mac80211_hwsim_tx_frame_no_nl()
1801 if (info->control.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) in mac80211_hwsim_tx_frame_no_nl()
1803 else if (info->control.rates[0].flags & IEEE80211_TX_RC_80_MHZ_WIDTH) in mac80211_hwsim_tx_frame_no_nl()
1805 else if (info->control.rates[0].flags & IEEE80211_TX_RC_160_MHZ_WIDTH) in mac80211_hwsim_tx_frame_no_nl()
1809 if (info->control.rates[0].flags & IEEE80211_TX_RC_SHORT_GI) in mac80211_hwsim_tx_frame_no_nl()
1812 rx_status.signal = data->rx_rssi; in mac80211_hwsim_tx_frame_no_nl()
1813 if (info->control.vif) in mac80211_hwsim_tx_frame_no_nl()
1814 rx_status.signal += info->control.vif->bss_conf.txpower; in mac80211_hwsim_tx_frame_no_nl()
1816 if (data->ps != PS_DISABLED) in mac80211_hwsim_tx_frame_no_nl()
1817 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM); in mac80211_hwsim_tx_frame_no_nl()
1822 skb->mark = 0; in mac80211_hwsim_tx_frame_no_nl()
1829 * Giving beacons a different mactime than non-beacons looks messy, but in mac80211_hwsim_tx_frame_no_nl()
1833 if (ieee80211_is_beacon(hdr->frame_control) || in mac80211_hwsim_tx_frame_no_nl()
1834 ieee80211_is_probe_resp(hdr->frame_control)) { in mac80211_hwsim_tx_frame_no_nl()
1836 now = data->abs_bcn_ts; in mac80211_hwsim_tx_frame_no_nl()
1853 if (!data2->started || (data2->idle && !data2->tmp_chan) || in mac80211_hwsim_tx_frame_no_nl()
1857 if (!(data->group & data2->group)) in mac80211_hwsim_tx_frame_no_nl()
1860 if (data->netgroup != data2->netgroup) in mac80211_hwsim_tx_frame_no_nl()
1863 if (!hwsim_chans_compat(chan, data2->tmp_chan) && in mac80211_hwsim_tx_frame_no_nl()
1864 !hwsim_chans_compat(chan, data2->channel)) { in mac80211_hwsim_tx_frame_no_nl()
1866 data2->hw, IEEE80211_IFACE_ITER_NORMAL, in mac80211_hwsim_tx_frame_no_nl()
1876 if (skb->len < PAGE_SIZE && paged_rx) { in mac80211_hwsim_tx_frame_no_nl()
1888 memcpy(page_address(page), skb->data, skb->len); in mac80211_hwsim_tx_frame_no_nl()
1889 skb_add_rx_frag(nskb, 0, page, 0, skb->len, skb->len); in mac80211_hwsim_tx_frame_no_nl()
1896 if (mac80211_hwsim_addr_match(data2, hdr->addr1)) in mac80211_hwsim_tx_frame_no_nl()
1899 rx_status.mactime = now + data2->tsf_offset; in mac80211_hwsim_tx_frame_no_nl()
1915 struct hwsim_sta_priv *sp = (void *)sta->drv_priv; in mac80211_hwsim_select_tx_link()
1919 return &vif->bss_conf; in mac80211_hwsim_select_tx_link()
1921 WARN_ON(is_multicast_ether_addr(hdr->addr1)); in mac80211_hwsim_select_tx_link()
1923 if (WARN_ON_ONCE(!sta || !sta->valid_links)) in mac80211_hwsim_select_tx_link()
1924 return &vif->bss_conf; in mac80211_hwsim_select_tx_link()
1926 for (i = 0; i < ARRAY_SIZE(vif->link_conf); i++) { in mac80211_hwsim_select_tx_link()
1930 /* round-robin the available link IDs */ in mac80211_hwsim_select_tx_link()
1931 link_id = (sp->last_link + i + 1) % ARRAY_SIZE(vif->link_conf); in mac80211_hwsim_select_tx_link()
1933 if (!(vif->active_links & BIT(link_id))) in mac80211_hwsim_select_tx_link()
1936 if (!(sp->active_links_rx & BIT(link_id))) in mac80211_hwsim_select_tx_link()
1939 *link_sta = rcu_dereference(sta->link[link_id]); in mac80211_hwsim_select_tx_link()
1943 bss_conf = rcu_dereference(vif->link_conf[link_id]); in mac80211_hwsim_select_tx_link()
1948 if (!rcu_access_pointer(bss_conf->chanctx_conf)) in mac80211_hwsim_select_tx_link()
1951 sp->last_link = link_id; in mac80211_hwsim_select_tx_link()
1962 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_tx()
1964 struct ieee80211_hdr *hdr = (void *)skb->data; in mac80211_hwsim_tx()
1967 struct ieee80211_vif *vif = txi->control.vif; in mac80211_hwsim_tx()
1972 if (WARN_ON(skb->len < 10)) { in mac80211_hwsim_tx()
1978 if (vif && vif->type == NL80211_IFTYPE_NAN && !data->tmp_chan) { in mac80211_hwsim_tx()
1983 if (data->nan_curr_dw_band == NL80211_BAND_2GHZ) in mac80211_hwsim_tx()
1984 channel = ieee80211_get_channel(hw->wiphy, 2437); in mac80211_hwsim_tx()
1985 else if (data->nan_curr_dw_band == NL80211_BAND_5GHZ) in mac80211_hwsim_tx()
1986 channel = ieee80211_get_channel(hw->wiphy, 5745); in mac80211_hwsim_tx()
1994 } else if (!data->use_chanctx) { in mac80211_hwsim_tx()
1995 channel = data->channel; in mac80211_hwsim_tx()
1996 confbw = data->bw; in mac80211_hwsim_tx()
1997 } else if (txi->hw_queue == 4) { in mac80211_hwsim_tx()
1998 channel = data->tmp_chan; in mac80211_hwsim_tx()
2000 u8 link = u32_get_bits(IEEE80211_SKB_CB(skb)->control.flags, in mac80211_hwsim_tx()
2003 struct ieee80211_sta *sta = control->sta; in mac80211_hwsim_tx()
2013 bss_conf = rcu_dereference(vif->link_conf[link]); in mac80211_hwsim_tx()
2015 link_sta = rcu_dereference(sta->link[link]); in mac80211_hwsim_tx()
2023 * links temporarily - but we don't handle real PS in in mac80211_hwsim_tx()
2026 WARN(link != IEEE80211_LINK_UNSPECIFIED || !sta || !sta->mlo, in mac80211_hwsim_tx()
2027 "link:%d, sta:%pM, sta->mlo:%d\n", in mac80211_hwsim_tx()
2028 link, sta ? sta->addr : NULL, sta ? sta->mlo : -1); in mac80211_hwsim_tx()
2034 * possible that while an non-AP MLD station and an AP MLD in mac80211_hwsim_tx()
2039 if (sta && sta->mlo && link_sta) { in mac80211_hwsim_tx()
2041 ether_addr_copy(hdr->addr1, link_sta->addr); in mac80211_hwsim_tx()
2042 ether_addr_copy(hdr->addr2, bss_conf->addr); in mac80211_hwsim_tx()
2044 if (!ieee80211_has_tods(hdr->frame_control) && in mac80211_hwsim_tx()
2045 !ieee80211_has_fromds(hdr->frame_control)) { in mac80211_hwsim_tx()
2046 if (ether_addr_equal(hdr->addr3, sta->addr)) in mac80211_hwsim_tx()
2047 ether_addr_copy(hdr->addr3, link_sta->addr); in mac80211_hwsim_tx()
2048 else if (ether_addr_equal(hdr->addr3, vif->addr)) in mac80211_hwsim_tx()
2049 ether_addr_copy(hdr->addr3, bss_conf->addr); in mac80211_hwsim_tx()
2054 chanctx_conf = rcu_dereference(bss_conf->chanctx_conf); in mac80211_hwsim_tx()
2056 channel = chanctx_conf->def.chan; in mac80211_hwsim_tx()
2057 confbw = chanctx_conf->def.width; in mac80211_hwsim_tx()
2063 if (WARN(!channel, "TX w/o channel - queue = %d\n", txi->hw_queue)) { in mac80211_hwsim_tx()
2068 if (data->idle && !data->tmp_chan) { in mac80211_hwsim_tx()
2069 wiphy_dbg(hw->wiphy, "Trying to TX when idle - reject\n"); in mac80211_hwsim_tx()
2076 if (control->sta) in mac80211_hwsim_tx()
2077 hwsim_check_sta_magic(control->sta); in mac80211_hwsim_tx()
2080 ieee80211_get_tx_rates(vif, control->sta, skb, in mac80211_hwsim_tx()
2081 txi->control.rates, in mac80211_hwsim_tx()
2082 ARRAY_SIZE(txi->control.rates)); in mac80211_hwsim_tx()
2084 for (i = 0; i < ARRAY_SIZE(txi->control.rates); i++) { in mac80211_hwsim_tx()
2085 u16 rflags = txi->control.rates[i].flags; in mac80211_hwsim_tx()
2086 /* initialize to data->bw for 5/10 MHz handling */ in mac80211_hwsim_tx()
2087 enum nl80211_chan_width bw = data->bw; in mac80211_hwsim_tx()
2089 if (txi->control.rates[i].idx == -1) in mac80211_hwsim_tx()
2103 if (skb->len >= 24 + 8 && in mac80211_hwsim_tx()
2104 ieee80211_is_probe_resp(hdr->frame_control)) { in mac80211_hwsim_tx()
2112 mgmt = (struct ieee80211_mgmt *)skb->data; in mac80211_hwsim_tx()
2115 bitrate = txrate->bitrate; in mac80211_hwsim_tx()
2117 mgmt->u.probe_resp.timestamp = in mac80211_hwsim_tx()
2118 cpu_to_le64(ts + data->tsf_offset + in mac80211_hwsim_tx()
2125 _portid = READ_ONCE(data->wmediumd); in mac80211_hwsim_tx()
2131 data->tx_pkts++; in mac80211_hwsim_tx()
2132 data->tx_bytes += skb->len; in mac80211_hwsim_tx()
2135 if (ack && skb->len >= 16) in mac80211_hwsim_tx()
2136 mac80211_hwsim_monitor_ack(channel, hdr->addr2); in mac80211_hwsim_tx()
2141 txi->control.rates[0].count = 1; in mac80211_hwsim_tx()
2142 txi->control.rates[1].idx = -1; in mac80211_hwsim_tx()
2144 if (!(txi->flags & IEEE80211_TX_CTL_NO_ACK) && ack) in mac80211_hwsim_tx()
2145 txi->flags |= IEEE80211_TX_STAT_ACK; in mac80211_hwsim_tx()
2152 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_start()
2153 wiphy_dbg(hw->wiphy, "%s\n", __func__); in mac80211_hwsim_start()
2154 data->started = true; in mac80211_hwsim_start()
2161 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_stop()
2164 data->started = false; in mac80211_hwsim_stop()
2166 for (i = 0; i < ARRAY_SIZE(data->link_data); i++) in mac80211_hwsim_stop()
2167 hrtimer_cancel(&data->link_data[i].beacon_timer); in mac80211_hwsim_stop()
2169 while (!skb_queue_empty(&data->pending)) in mac80211_hwsim_stop()
2170 ieee80211_free_txskb(hw, skb_dequeue(&data->pending)); in mac80211_hwsim_stop()
2172 wiphy_dbg(hw->wiphy, "%s\n", __func__); in mac80211_hwsim_stop()
2179 wiphy_dbg(hw->wiphy, "%s (type=%d mac_addr=%pM)\n", in mac80211_hwsim_add_interface()
2181 vif->addr); in mac80211_hwsim_add_interface()
2184 if (vif->type != NL80211_IFTYPE_MONITOR) in mac80211_hwsim_add_interface()
2185 mac80211_hwsim_config_mac_nl(hw, vif->addr, true); in mac80211_hwsim_add_interface()
2187 vif->cab_queue = 0; in mac80211_hwsim_add_interface()
2188 vif->hw_queue[IEEE80211_AC_VO] = 0; in mac80211_hwsim_add_interface()
2189 vif->hw_queue[IEEE80211_AC_VI] = 1; in mac80211_hwsim_add_interface()
2190 vif->hw_queue[IEEE80211_AC_BE] = 2; in mac80211_hwsim_add_interface()
2191 vif->hw_queue[IEEE80211_AC_BK] = 3; in mac80211_hwsim_add_interface()
2203 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in mac80211_hwsim_link_add_debugfs()
2206 &vp->skip_beacons[link_conf->link_id]); in mac80211_hwsim_link_add_debugfs()
2216 wiphy_dbg(hw->wiphy, in mac80211_hwsim_change_interface()
2219 newtype, vif->addr); in mac80211_hwsim_change_interface()
2223 * interface may change from non-AP to AP in in mac80211_hwsim_change_interface()
2226 vif->cab_queue = 0; in mac80211_hwsim_change_interface()
2234 wiphy_dbg(hw->wiphy, "%s (type=%d mac_addr=%pM)\n", in mac80211_hwsim_remove_interface()
2236 vif->addr); in mac80211_hwsim_remove_interface()
2239 if (vif->type != NL80211_IFTYPE_MONITOR) in mac80211_hwsim_remove_interface()
2240 mac80211_hwsim_config_mac_nl(hw, vif->addr, false); in mac80211_hwsim_remove_interface()
2247 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_tx_frame()
2248 u32 _portid = READ_ONCE(data->wmediumd); in mac80211_hwsim_tx_frame()
2252 ieee80211_get_tx_rates(txi->control.vif, NULL, skb, in mac80211_hwsim_tx_frame()
2253 txi->control.rates, in mac80211_hwsim_tx_frame()
2254 ARRAY_SIZE(txi->control.rates)); in mac80211_hwsim_tx_frame()
2262 data->tx_pkts++; in mac80211_hwsim_tx_frame()
2263 data->tx_bytes += skb->len; in mac80211_hwsim_tx_frame()
2274 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in __mac80211_hwsim_beacon_tx()
2281 if (vp->skip_beacons[link_conf->link_id]) { in __mac80211_hwsim_beacon_tx()
2282 vp->skip_beacons[link_conf->link_id]--; in __mac80211_hwsim_beacon_tx()
2290 info->control.rates, in __mac80211_hwsim_beacon_tx()
2291 ARRAY_SIZE(info->control.rates)); in __mac80211_hwsim_beacon_tx()
2295 bitrate = txrate->bitrate; in __mac80211_hwsim_beacon_tx()
2297 mgmt = (struct ieee80211_mgmt *) skb->data; in __mac80211_hwsim_beacon_tx()
2299 data->abs_bcn_ts = mac80211_hwsim_get_tsf_raw(); in __mac80211_hwsim_beacon_tx()
2300 if (ieee80211_is_s1g_beacon(mgmt->frame_control)) { in __mac80211_hwsim_beacon_tx()
2303 ext->u.s1g_beacon.timestamp = cpu_to_le32(data->abs_bcn_ts + in __mac80211_hwsim_beacon_tx()
2304 data->tsf_offset + in __mac80211_hwsim_beacon_tx()
2308 mgmt->u.beacon.timestamp = cpu_to_le64(data->abs_bcn_ts + in __mac80211_hwsim_beacon_tx()
2309 data->tsf_offset + in __mac80211_hwsim_beacon_tx()
2315 rcu_dereference(link_conf->chanctx_conf)->def.chan); in __mac80211_hwsim_beacon_tx()
2322 u32 link_id = link_data->link_id; in mac80211_hwsim_beacon_tx()
2327 struct ieee80211_hw *hw = data->hw; in mac80211_hwsim_beacon_tx()
2332 link_conf = rcu_dereference(vif->link_conf[link_id]); in mac80211_hwsim_beacon_tx()
2336 if (vif->type != NL80211_IFTYPE_AP && in mac80211_hwsim_beacon_tx()
2337 vif->type != NL80211_IFTYPE_MESH_POINT && in mac80211_hwsim_beacon_tx()
2338 vif->type != NL80211_IFTYPE_ADHOC && in mac80211_hwsim_beacon_tx()
2339 vif->type != NL80211_IFTYPE_OCB) in mac80211_hwsim_beacon_tx()
2342 tx_bss_conf = rcu_access_pointer(link_conf->tx_bss_conf); in mac80211_hwsim_beacon_tx()
2346 if (link_conf->ema_ap) { in mac80211_hwsim_beacon_tx()
2351 if (!ema || !ema->cnt) in mac80211_hwsim_beacon_tx()
2354 for (i = 0; i < ema->cnt; i++) { in mac80211_hwsim_beacon_tx()
2356 ema->bcn[i].skb); in mac80211_hwsim_beacon_tx()
2357 ema->bcn[i].skb = NULL; /* Already freed */ in mac80211_hwsim_beacon_tx()
2370 rcu_dereference(link_conf->chanctx_conf)->def.chan); in mac80211_hwsim_beacon_tx()
2373 if (link_conf->csa_active && ieee80211_beacon_cntdwn_is_complete(vif, link_id)) in mac80211_hwsim_beacon_tx()
2376 if (link_conf->color_change_active && in mac80211_hwsim_beacon_tx()
2388 link_data[link_data->link_id]); in mac80211_hwsim_beacon()
2389 struct ieee80211_hw *hw = data->hw; in mac80211_hwsim_beacon()
2390 u64 bcn_int = link_data->beacon_int; in mac80211_hwsim_beacon()
2392 if (!data->started) in mac80211_hwsim_beacon()
2400 if (data->bcn_delta) { in mac80211_hwsim_beacon()
2401 bcn_int -= data->bcn_delta; in mac80211_hwsim_beacon()
2402 data->bcn_delta = 0; in mac80211_hwsim_beacon()
2404 hrtimer_forward_now(&link_data->beacon_timer, in mac80211_hwsim_beacon()
2429 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_config()
2430 struct ieee80211_conf *conf = &hw->conf; in mac80211_hwsim_config()
2439 if (conf->chandef.chan) in mac80211_hwsim_config()
2440 wiphy_dbg(hw->wiphy, in mac80211_hwsim_config()
2441 "%s (freq=%d(%d - %d)/%s idle=%d ps=%d smps=%s)\n", in mac80211_hwsim_config()
2443 conf->chandef.chan->center_freq, in mac80211_hwsim_config()
2444 conf->chandef.center_freq1, in mac80211_hwsim_config()
2445 conf->chandef.center_freq2, in mac80211_hwsim_config()
2446 hwsim_chanwidths[conf->chandef.width], in mac80211_hwsim_config()
2447 !!(conf->flags & IEEE80211_CONF_IDLE), in mac80211_hwsim_config()
2448 !!(conf->flags & IEEE80211_CONF_PS), in mac80211_hwsim_config()
2449 smps_modes[conf->smps_mode]); in mac80211_hwsim_config()
2451 wiphy_dbg(hw->wiphy, in mac80211_hwsim_config()
2454 !!(conf->flags & IEEE80211_CONF_IDLE), in mac80211_hwsim_config()
2455 !!(conf->flags & IEEE80211_CONF_PS), in mac80211_hwsim_config()
2456 smps_modes[conf->smps_mode]); in mac80211_hwsim_config()
2458 data->idle = !!(conf->flags & IEEE80211_CONF_IDLE); in mac80211_hwsim_config()
2460 WARN_ON(conf->chandef.chan && data->use_chanctx); in mac80211_hwsim_config()
2462 mutex_lock(&data->mutex); in mac80211_hwsim_config()
2463 if (data->scanning && conf->chandef.chan) { in mac80211_hwsim_config()
2464 for (idx = 0; idx < ARRAY_SIZE(data->survey_data); idx++) { in mac80211_hwsim_config()
2465 if (data->survey_data[idx].channel == data->channel) { in mac80211_hwsim_config()
2466 data->survey_data[idx].start = in mac80211_hwsim_config()
2467 data->survey_data[idx].next_start; in mac80211_hwsim_config()
2468 data->survey_data[idx].end = jiffies; in mac80211_hwsim_config()
2473 data->channel = conf->chandef.chan; in mac80211_hwsim_config()
2474 data->bw = conf->chandef.width; in mac80211_hwsim_config()
2476 for (idx = 0; idx < ARRAY_SIZE(data->survey_data); idx++) { in mac80211_hwsim_config()
2477 if (data->survey_data[idx].channel && in mac80211_hwsim_config()
2478 data->survey_data[idx].channel != data->channel) in mac80211_hwsim_config()
2480 data->survey_data[idx].channel = data->channel; in mac80211_hwsim_config()
2481 data->survey_data[idx].next_start = jiffies; in mac80211_hwsim_config()
2485 data->channel = conf->chandef.chan; in mac80211_hwsim_config()
2486 data->bw = conf->chandef.width; in mac80211_hwsim_config()
2488 mutex_unlock(&data->mutex); in mac80211_hwsim_config()
2490 for (idx = 0; idx < ARRAY_SIZE(data->link_data); idx++) { in mac80211_hwsim_config()
2492 &data->link_data[idx]; in mac80211_hwsim_config()
2494 if (!data->started || !link_data->beacon_int) { in mac80211_hwsim_config()
2495 hrtimer_cancel(&link_data->beacon_timer); in mac80211_hwsim_config()
2496 } else if (!hrtimer_active(&link_data->beacon_timer)) { in mac80211_hwsim_config()
2498 u32 bcn_int = link_data->beacon_int; in mac80211_hwsim_config()
2499 u64 until_tbtt = bcn_int - do_div(tsf, bcn_int); in mac80211_hwsim_config()
2501 hrtimer_start(&link_data->beacon_timer, in mac80211_hwsim_config()
2515 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_configure_filter()
2517 wiphy_dbg(hw->wiphy, "%s\n", __func__); in mac80211_hwsim_configure_filter()
2519 data->rx_filter = 0; in mac80211_hwsim_configure_filter()
2521 data->rx_filter |= FIF_ALLMULTI; in mac80211_hwsim_configure_filter()
2523 data->rx_filter |= FIF_MCAST_ACTION; in mac80211_hwsim_configure_filter()
2525 *total_flags = data->rx_filter; in mac80211_hwsim_configure_filter()
2532 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in mac80211_hwsim_bcn_en_iter()
2534 if (vp->bcn_en) in mac80211_hwsim_bcn_en_iter()
2542 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in mac80211_hwsim_vif_info_changed()
2546 wiphy_dbg(hw->wiphy, "%s(changed=0x%llx vif->addr=%pM)\n", in mac80211_hwsim_vif_info_changed()
2547 __func__, changed, vif->addr); in mac80211_hwsim_vif_info_changed()
2550 wiphy_dbg(hw->wiphy, " ASSOC: assoc=%d aid=%d\n", in mac80211_hwsim_vif_info_changed()
2551 vif->cfg.assoc, vif->cfg.aid); in mac80211_hwsim_vif_info_changed()
2552 vp->assoc = vif->cfg.assoc; in mac80211_hwsim_vif_info_changed()
2553 vp->aid = vif->cfg.aid; in mac80211_hwsim_vif_info_changed()
2556 if (vif->type == NL80211_IFTYPE_STATION && in mac80211_hwsim_vif_info_changed()
2560 if (vif->active_links != usable_links) in mac80211_hwsim_vif_info_changed()
2570 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; in mac80211_hwsim_link_info_changed()
2571 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_link_info_changed()
2572 unsigned int link_id = info->link_id; in mac80211_hwsim_link_info_changed()
2573 struct mac80211_hwsim_link_data *link_data = &data->link_data[link_id]; in mac80211_hwsim_link_info_changed()
2577 wiphy_dbg(hw->wiphy, "%s(changed=0x%llx vif->addr=%pM, link id %u)\n", in mac80211_hwsim_link_info_changed()
2578 __func__, (unsigned long long)changed, vif->addr, link_id); in mac80211_hwsim_link_info_changed()
2581 wiphy_dbg(hw->wiphy, "%s: BSSID changed: %pM\n", in mac80211_hwsim_link_info_changed()
2582 __func__, info->bssid); in mac80211_hwsim_link_info_changed()
2583 memcpy(vp->bssid, info->bssid, ETH_ALEN); in mac80211_hwsim_link_info_changed()
2587 wiphy_dbg(hw->wiphy, " BCN EN: %d (BI=%u)\n", in mac80211_hwsim_link_info_changed()
2588 info->enable_beacon, info->beacon_int); in mac80211_hwsim_link_info_changed()
2589 vp->bcn_en = info->enable_beacon; in mac80211_hwsim_link_info_changed()
2590 if (data->started && in mac80211_hwsim_link_info_changed()
2591 !hrtimer_active(&link_data->beacon_timer) && in mac80211_hwsim_link_info_changed()
2592 info->enable_beacon) { in mac80211_hwsim_link_info_changed()
2595 link_data->beacon_int = info->beacon_int * 1024; in mac80211_hwsim_link_info_changed()
2597 bcn_int = link_data->beacon_int; in mac80211_hwsim_link_info_changed()
2598 until_tbtt = bcn_int - do_div(tsf, bcn_int); in mac80211_hwsim_link_info_changed()
2600 hrtimer_start(&link_data->beacon_timer, in mac80211_hwsim_link_info_changed()
2603 } else if (!info->enable_beacon) { in mac80211_hwsim_link_info_changed()
2606 data->hw, IEEE80211_IFACE_ITER_NORMAL, in mac80211_hwsim_link_info_changed()
2608 wiphy_dbg(hw->wiphy, " beaconing vifs remaining: %u", in mac80211_hwsim_link_info_changed()
2611 hrtimer_cancel(&link_data->beacon_timer); in mac80211_hwsim_link_info_changed()
2612 link_data->beacon_int = 0; in mac80211_hwsim_link_info_changed()
2618 wiphy_dbg(hw->wiphy, " ERP_CTS_PROT: %d\n", in mac80211_hwsim_link_info_changed()
2619 info->use_cts_prot); in mac80211_hwsim_link_info_changed()
2623 wiphy_dbg(hw->wiphy, " ERP_PREAMBLE: %d\n", in mac80211_hwsim_link_info_changed()
2624 info->use_short_preamble); in mac80211_hwsim_link_info_changed()
2628 wiphy_dbg(hw->wiphy, " ERP_SLOT: %d\n", info->use_short_slot); in mac80211_hwsim_link_info_changed()
2632 wiphy_dbg(hw->wiphy, " HT: op_mode=0x%x\n", in mac80211_hwsim_link_info_changed()
2633 info->ht_operation_mode); in mac80211_hwsim_link_info_changed()
2637 wiphy_dbg(hw->wiphy, " BASIC_RATES: 0x%llx\n", in mac80211_hwsim_link_info_changed()
2638 (unsigned long long) info->basic_rates); in mac80211_hwsim_link_info_changed()
2642 wiphy_dbg(hw->wiphy, " TX Power: %d dBm\n", info->txpower); in mac80211_hwsim_link_info_changed()
2651 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_sta_rc_update()
2652 struct ieee80211_sta *sta = link_sta->sta; in mac80211_hwsim_sta_rc_update()
2658 link_id < ARRAY_SIZE(vif->link_conf); in mac80211_hwsim_sta_rc_update()
2663 link_sta = rcu_dereference(sta->link[link_id]); in mac80211_hwsim_sta_rc_update()
2668 switch (link_sta->bandwidth) { in mac80211_hwsim_sta_rc_update()
2678 if (!data->use_chanctx) { in mac80211_hwsim_sta_rc_update()
2679 confbw = data->bw; in mac80211_hwsim_sta_rc_update()
2683 vif_conf = rcu_dereference(vif->link_conf[link_id]); in mac80211_hwsim_sta_rc_update()
2687 chanctx_conf = rcu_dereference(vif_conf->chanctx_conf); in mac80211_hwsim_sta_rc_update()
2690 confbw = chanctx_conf->def.width; in mac80211_hwsim_sta_rc_update()
2695 vif->addr, link_id, sta->addr, bw, sta->deflink.bandwidth, in mac80211_hwsim_sta_rc_update()
2696 hwsim_get_chanwidth(data->bw), data->bw); in mac80211_hwsim_sta_rc_update()
2709 struct hwsim_sta_priv *sp = (void *)sta->drv_priv; in mac80211_hwsim_sta_add()
2713 mac80211_hwsim_sta_rc_update(hw, vif, &sta->deflink, 0); in mac80211_hwsim_sta_add()
2715 if (sta->valid_links) { in mac80211_hwsim_sta_add()
2716 WARN(hweight16(sta->valid_links) > 1, in mac80211_hwsim_sta_add()
2718 sta->valid_links); in mac80211_hwsim_sta_add()
2719 sp->active_links_rx = sta->valid_links; in mac80211_hwsim_sta_add()
2752 vif->type == NL80211_IFTYPE_STATION && in mac80211_hwsim_sta_state()
2753 new_state == IEEE80211_STA_AUTHORIZED && !sta->tdls) in mac80211_hwsim_sta_state()
2791 wiphy_dbg(hw->wiphy, in mac80211_hwsim_conf_tx()
2794 params->txop, params->cw_min, in mac80211_hwsim_conf_tx()
2795 params->cw_max, params->aifs); in mac80211_hwsim_conf_tx()
2802 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_get_survey()
2804 if (idx < 0 || idx >= ARRAY_SIZE(hwsim->survey_data)) in mac80211_hwsim_get_survey()
2805 return -ENOENT; in mac80211_hwsim_get_survey()
2807 mutex_lock(&hwsim->mutex); in mac80211_hwsim_get_survey()
2808 survey->channel = hwsim->survey_data[idx].channel; in mac80211_hwsim_get_survey()
2809 if (!survey->channel) { in mac80211_hwsim_get_survey()
2810 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_get_survey()
2811 return -ENOENT; in mac80211_hwsim_get_survey()
2815 * Magically conjured dummy values --- this is only ok for simulated hardware. in mac80211_hwsim_get_survey()
2818 * report any, especially not a magically conjured ones :-) in mac80211_hwsim_get_survey()
2820 survey->filled = SURVEY_INFO_NOISE_DBM | in mac80211_hwsim_get_survey()
2823 survey->noise = -92; in mac80211_hwsim_get_survey()
2824 survey->time = in mac80211_hwsim_get_survey()
2825 jiffies_to_msecs(hwsim->survey_data[idx].end - in mac80211_hwsim_get_survey()
2826 hwsim->survey_data[idx].start); in mac80211_hwsim_get_survey()
2828 survey->time_busy = survey->time/8; in mac80211_hwsim_get_survey()
2829 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_get_survey()
2844 if (neg_ttlm->downlink[i] != neg_ttlm->uplink[i] || in mac80211_hwsim_can_neg_ttlm()
2845 neg_ttlm->downlink[i] != neg_ttlm->downlink[0]) in mac80211_hwsim_can_neg_ttlm()
2866 HWSIM_TM_ATTR_MAX = __HWSIM_TM_ATTR_AFTER_LAST - 1
2885 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_testmode_cmd()
2896 return -EINVAL; in mac80211_hwsim_testmode_cmd()
2901 return -EINVAL; in mac80211_hwsim_testmode_cmd()
2905 skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, in mac80211_hwsim_testmode_cmd()
2908 return -ENOMEM; in mac80211_hwsim_testmode_cmd()
2909 if (nla_put_u32(skb, HWSIM_TM_ATTR_PS, hwsim->ps)) in mac80211_hwsim_testmode_cmd()
2919 return -EOPNOTSUPP; in mac80211_hwsim_testmode_cmd()
2924 return -ENOBUFS; in mac80211_hwsim_testmode_cmd()
2932 struct ieee80211_sta *sta = params->sta; in mac80211_hwsim_ampdu_action()
2933 enum ieee80211_ampdu_mlme_action action = params->action; in mac80211_hwsim_ampdu_action()
2934 u16 tid = params->tid; in mac80211_hwsim_ampdu_action()
2942 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); in mac80211_hwsim_ampdu_action()
2950 return -EOPNOTSUPP; in mac80211_hwsim_ampdu_action()
2967 struct cfg80211_scan_request *req = hwsim->hw_scan_request; in hw_scan_work()
2970 mutex_lock(&hwsim->mutex); in hw_scan_work()
2971 if (hwsim->scan_chan_idx >= req->n_channels) { in hw_scan_work()
2976 wiphy_dbg(hwsim->hw->wiphy, "hw scan complete\n"); in hw_scan_work()
2977 ieee80211_scan_completed(hwsim->hw, &info); in hw_scan_work()
2978 hwsim->hw_scan_request = NULL; in hw_scan_work()
2979 hwsim->hw_scan_vif = NULL; in hw_scan_work()
2980 hwsim->tmp_chan = NULL; in hw_scan_work()
2981 mutex_unlock(&hwsim->mutex); in hw_scan_work()
2982 mac80211_hwsim_config_mac_nl(hwsim->hw, hwsim->scan_addr, in hw_scan_work()
2987 wiphy_dbg(hwsim->hw->wiphy, "hw scan %d MHz\n", in hw_scan_work()
2988 req->channels[hwsim->scan_chan_idx]->center_freq); in hw_scan_work()
2990 hwsim->tmp_chan = req->channels[hwsim->scan_chan_idx]; in hw_scan_work()
2991 if (hwsim->tmp_chan->flags & (IEEE80211_CHAN_NO_IR | in hw_scan_work()
2993 !req->n_ssids) { in hw_scan_work()
2998 for (i = 0; i < req->n_ssids; i++) { in hw_scan_work()
3002 probe = ieee80211_probereq_get(hwsim->hw, in hw_scan_work()
3003 hwsim->scan_addr, in hw_scan_work()
3004 req->ssids[i].ssid, in hw_scan_work()
3005 req->ssids[i].ssid_len, in hw_scan_work()
3006 req->ie_len); in hw_scan_work()
3010 mgmt = (struct ieee80211_mgmt *) probe->data; in hw_scan_work()
3011 memcpy(mgmt->da, req->bssid, ETH_ALEN); in hw_scan_work()
3012 memcpy(mgmt->bssid, req->bssid, ETH_ALEN); in hw_scan_work()
3014 if (req->ie_len) in hw_scan_work()
3015 skb_put_data(probe, req->ie, req->ie_len); in hw_scan_work()
3018 if (!ieee80211_tx_prepare_skb(hwsim->hw, in hw_scan_work()
3019 hwsim->hw_scan_vif, in hw_scan_work()
3021 hwsim->tmp_chan->band, in hw_scan_work()
3029 mac80211_hwsim_tx_frame(hwsim->hw, probe, in hw_scan_work()
3030 hwsim->tmp_chan); in hw_scan_work()
3035 ieee80211_queue_delayed_work(hwsim->hw, &hwsim->hw_scan, in hw_scan_work()
3037 hwsim->survey_data[hwsim->scan_chan_idx].channel = hwsim->tmp_chan; in hw_scan_work()
3038 hwsim->survey_data[hwsim->scan_chan_idx].start = jiffies; in hw_scan_work()
3039 hwsim->survey_data[hwsim->scan_chan_idx].end = in hw_scan_work()
3041 hwsim->scan_chan_idx++; in hw_scan_work()
3042 mutex_unlock(&hwsim->mutex); in hw_scan_work()
3049 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_hw_scan()
3050 struct cfg80211_scan_request *req = &hw_req->req; in mac80211_hwsim_hw_scan()
3052 mutex_lock(&hwsim->mutex); in mac80211_hwsim_hw_scan()
3053 if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) { in mac80211_hwsim_hw_scan()
3054 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_hw_scan()
3055 return -EBUSY; in mac80211_hwsim_hw_scan()
3057 hwsim->hw_scan_request = req; in mac80211_hwsim_hw_scan()
3058 hwsim->hw_scan_vif = vif; in mac80211_hwsim_hw_scan()
3059 hwsim->scan_chan_idx = 0; in mac80211_hwsim_hw_scan()
3060 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) in mac80211_hwsim_hw_scan()
3061 get_random_mask_addr(hwsim->scan_addr, in mac80211_hwsim_hw_scan()
3062 hw_req->req.mac_addr, in mac80211_hwsim_hw_scan()
3063 hw_req->req.mac_addr_mask); in mac80211_hwsim_hw_scan()
3065 memcpy(hwsim->scan_addr, vif->addr, ETH_ALEN); in mac80211_hwsim_hw_scan()
3066 memset(hwsim->survey_data, 0, sizeof(hwsim->survey_data)); in mac80211_hwsim_hw_scan()
3067 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_hw_scan()
3069 mac80211_hwsim_config_mac_nl(hw, hwsim->scan_addr, true); in mac80211_hwsim_hw_scan()
3070 wiphy_dbg(hw->wiphy, "hwsim hw_scan request\n"); in mac80211_hwsim_hw_scan()
3072 ieee80211_queue_delayed_work(hwsim->hw, &hwsim->hw_scan, 0); in mac80211_hwsim_hw_scan()
3080 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_cancel_hw_scan()
3085 wiphy_dbg(hw->wiphy, "hwsim cancel_hw_scan\n"); in mac80211_hwsim_cancel_hw_scan()
3087 cancel_delayed_work_sync(&hwsim->hw_scan); in mac80211_hwsim_cancel_hw_scan()
3089 mutex_lock(&hwsim->mutex); in mac80211_hwsim_cancel_hw_scan()
3090 ieee80211_scan_completed(hwsim->hw, &info); in mac80211_hwsim_cancel_hw_scan()
3091 hwsim->tmp_chan = NULL; in mac80211_hwsim_cancel_hw_scan()
3092 hwsim->hw_scan_request = NULL; in mac80211_hwsim_cancel_hw_scan()
3093 hwsim->hw_scan_vif = NULL; in mac80211_hwsim_cancel_hw_scan()
3094 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_cancel_hw_scan()
3101 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_sw_scan()
3103 mutex_lock(&hwsim->mutex); in mac80211_hwsim_sw_scan()
3105 if (hwsim->scanning) { in mac80211_hwsim_sw_scan()
3112 memcpy(hwsim->scan_addr, mac_addr, ETH_ALEN); in mac80211_hwsim_sw_scan()
3113 mac80211_hwsim_config_mac_nl(hw, hwsim->scan_addr, true); in mac80211_hwsim_sw_scan()
3114 hwsim->scanning = true; in mac80211_hwsim_sw_scan()
3115 memset(hwsim->survey_data, 0, sizeof(hwsim->survey_data)); in mac80211_hwsim_sw_scan()
3118 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_sw_scan()
3124 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_sw_scan_complete()
3126 mutex_lock(&hwsim->mutex); in mac80211_hwsim_sw_scan_complete()
3129 hwsim->scanning = false; in mac80211_hwsim_sw_scan_complete()
3130 mac80211_hwsim_config_mac_nl(hw, hwsim->scan_addr, false); in mac80211_hwsim_sw_scan_complete()
3131 eth_zero_addr(hwsim->scan_addr); in mac80211_hwsim_sw_scan_complete()
3133 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_sw_scan_complete()
3141 mutex_lock(&hwsim->mutex); in hw_roc_start()
3143 wiphy_dbg(hwsim->hw->wiphy, "hwsim ROC begins\n"); in hw_roc_start()
3144 hwsim->tmp_chan = hwsim->roc_chan; in hw_roc_start()
3145 ieee80211_ready_on_channel(hwsim->hw); in hw_roc_start()
3147 ieee80211_queue_delayed_work(hwsim->hw, &hwsim->roc_done, in hw_roc_start()
3148 msecs_to_jiffies(hwsim->roc_duration)); in hw_roc_start()
3150 mutex_unlock(&hwsim->mutex); in hw_roc_start()
3158 mutex_lock(&hwsim->mutex); in hw_roc_done()
3159 ieee80211_remain_on_channel_expired(hwsim->hw); in hw_roc_done()
3160 hwsim->tmp_chan = NULL; in hw_roc_done()
3161 mutex_unlock(&hwsim->mutex); in hw_roc_done()
3163 wiphy_dbg(hwsim->hw->wiphy, "hwsim ROC expired\n"); in hw_roc_done()
3172 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_roc()
3174 mutex_lock(&hwsim->mutex); in mac80211_hwsim_roc()
3175 if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) { in mac80211_hwsim_roc()
3176 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_roc()
3177 return -EBUSY; in mac80211_hwsim_roc()
3180 hwsim->roc_chan = chan; in mac80211_hwsim_roc()
3181 hwsim->roc_duration = duration; in mac80211_hwsim_roc()
3182 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_roc()
3184 wiphy_dbg(hw->wiphy, "hwsim ROC (%d MHz, %d ms)\n", in mac80211_hwsim_roc()
3185 chan->center_freq, duration); in mac80211_hwsim_roc()
3186 ieee80211_queue_delayed_work(hw, &hwsim->roc_start, HZ/50); in mac80211_hwsim_roc()
3194 struct mac80211_hwsim_data *hwsim = hw->priv; in mac80211_hwsim_croc()
3196 cancel_delayed_work_sync(&hwsim->roc_start); in mac80211_hwsim_croc()
3197 cancel_delayed_work_sync(&hwsim->roc_done); in mac80211_hwsim_croc()
3199 mutex_lock(&hwsim->mutex); in mac80211_hwsim_croc()
3200 hwsim->tmp_chan = NULL; in mac80211_hwsim_croc()
3201 mutex_unlock(&hwsim->mutex); in mac80211_hwsim_croc()
3203 wiphy_dbg(hw->wiphy, "hwsim ROC canceled\n"); in mac80211_hwsim_croc()
3212 wiphy_dbg(hw->wiphy, in mac80211_hwsim_add_chanctx()
3214 ctx->def.chan->center_freq, ctx->def.width, in mac80211_hwsim_add_chanctx()
3215 ctx->def.center_freq1, ctx->def.center_freq2); in mac80211_hwsim_add_chanctx()
3222 wiphy_dbg(hw->wiphy, in mac80211_hwsim_remove_chanctx()
3224 ctx->def.chan->center_freq, ctx->def.width, in mac80211_hwsim_remove_chanctx()
3225 ctx->def.center_freq1, ctx->def.center_freq2); in mac80211_hwsim_remove_chanctx()
3235 wiphy_dbg(hw->wiphy, in mac80211_hwsim_change_chanctx()
3237 ctx->def.chan->center_freq, ctx->def.width, in mac80211_hwsim_change_chanctx()
3238 ctx->def.center_freq1, ctx->def.center_freq2); in mac80211_hwsim_change_chanctx()
3250 if (vif->type == NL80211_IFTYPE_STATION && vif->cfg.assoc) { in mac80211_hwsim_assign_vif_chanctx()
3253 skb = ieee80211_nullfunc_get(hw, vif, link_conf->link_id, true); in mac80211_hwsim_assign_vif_chanctx()
3256 mac80211_hwsim_tx_frame(hw, skb, ctx->def.chan); in mac80211_hwsim_assign_vif_chanctx()
3273 if (vif->type == NL80211_IFTYPE_STATION && vif->cfg.assoc) { in mac80211_hwsim_unassign_vif_chanctx()
3276 skb = ieee80211_nullfunc_get(hw, vif, link_conf->link_id, true); in mac80211_hwsim_unassign_vif_chanctx()
3278 struct ieee80211_hdr *hdr = (void *)skb->data; in mac80211_hwsim_unassign_vif_chanctx()
3280 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM); in mac80211_hwsim_unassign_vif_chanctx()
3283 mac80211_hwsim_tx_frame(hw, skb, ctx->def.chan); in mac80211_hwsim_unassign_vif_chanctx()
3297 return -EINVAL; in mac80211_hwsim_switch_vif_chanctx()
3299 wiphy_dbg(hw->wiphy, in mac80211_hwsim_switch_vif_chanctx()
3304 wiphy_dbg(hw->wiphy, in mac80211_hwsim_switch_vif_chanctx()
3305 …"switch vif channel context: %d MHz/width: %d/cfreqs:%d/%d MHz -> %d MHz/width: %d/cfreqs:%d/%d MH… in mac80211_hwsim_switch_vif_chanctx()
3306 vifs[i].old_ctx->def.chan->center_freq, in mac80211_hwsim_switch_vif_chanctx()
3307 vifs[i].old_ctx->def.width, in mac80211_hwsim_switch_vif_chanctx()
3308 vifs[i].old_ctx->def.center_freq1, in mac80211_hwsim_switch_vif_chanctx()
3309 vifs[i].old_ctx->def.center_freq2, in mac80211_hwsim_switch_vif_chanctx()
3310 vifs[i].new_ctx->def.chan->center_freq, in mac80211_hwsim_switch_vif_chanctx()
3311 vifs[i].new_ctx->def.width, in mac80211_hwsim_switch_vif_chanctx()
3312 vifs[i].new_ctx->def.center_freq1, in mac80211_hwsim_switch_vif_chanctx()
3313 vifs[i].new_ctx->def.center_freq2); in mac80211_hwsim_switch_vif_chanctx()
3364 struct mac80211_hwsim_data *ar = hw->priv; in mac80211_hwsim_get_et_stats()
3367 data[i++] = ar->tx_pkts; in mac80211_hwsim_get_et_stats()
3368 data[i++] = ar->tx_bytes; in mac80211_hwsim_get_et_stats()
3369 data[i++] = ar->rx_pkts; in mac80211_hwsim_get_et_stats()
3370 data[i++] = ar->rx_bytes; in mac80211_hwsim_get_et_stats()
3371 data[i++] = ar->tx_dropped; in mac80211_hwsim_get_et_stats()
3372 data[i++] = ar->tx_failed; in mac80211_hwsim_get_et_stats()
3373 data[i++] = ar->ps; in mac80211_hwsim_get_et_stats()
3374 data[i++] = ar->group; in mac80211_hwsim_get_et_stats()
3387 return -EOPNOTSUPP; in mac80211_hwsim_set_rts_threshold()
3405 mac80211_hwsim_config_mac_nl(hw, old[i]->addr, false); in mac80211_hwsim_change_vif_links()
3414 mac80211_hwsim_config_mac_nl(hw, link_conf->addr, true); in mac80211_hwsim_change_vif_links()
3425 struct hwsim_sta_priv *sp = (void *)sta->drv_priv; in mac80211_hwsim_change_sta_links()
3429 if (vif->type == NL80211_IFTYPE_STATION) in mac80211_hwsim_change_sta_links()
3430 sp->active_links_rx = new_links; in mac80211_hwsim_change_sta_links()
3438 struct nlattr *ftm; in mac80211_hwsim_send_pmsr_ftm_request_peer() local
3440 if (!request->requested) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3441 return -EINVAL; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3443 ftm = nla_nest_start(msg, NL80211_PMSR_TYPE_FTM); in mac80211_hwsim_send_pmsr_ftm_request_peer()
3444 if (!ftm) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3445 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3447 if (nla_put_u32(msg, NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE, request->preamble)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3448 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3450 if (nla_put_u16(msg, NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD, request->burst_period)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3451 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3453 if (request->asap && nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_ASAP)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3454 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3456 if (request->request_lci && nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3457 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3459 if (request->request_civicloc && in mac80211_hwsim_send_pmsr_ftm_request_peer()
3461 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3463 if (request->trigger_based && nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3464 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3466 if (request->non_trigger_based && in mac80211_hwsim_send_pmsr_ftm_request_peer()
3468 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3470 if (request->lmr_feedback && nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3471 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3473 if (nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP, request->num_bursts_exp)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3474 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3476 if (nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION, request->burst_duration)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3477 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3479 if (nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST, request->ftms_per_burst)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3480 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3482 if (nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES, request->ftmr_retries)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3483 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3485 if (nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION, request->burst_duration)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3486 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3488 if (nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR, request->bss_color)) in mac80211_hwsim_send_pmsr_ftm_request_peer()
3489 return -ENOBUFS; in mac80211_hwsim_send_pmsr_ftm_request_peer()
3491 nla_nest_end(msg, ftm); in mac80211_hwsim_send_pmsr_ftm_request_peer()
3504 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request_peer()
3507 request->addr)) in mac80211_hwsim_send_pmsr_request_peer()
3508 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request_peer()
3512 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request_peer()
3514 err = nl80211_send_chandef(msg, &request->chandef); in mac80211_hwsim_send_pmsr_request_peer()
3522 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request_peer()
3524 if (request->report_ap_tsf && nla_put_flag(msg, NL80211_PMSR_REQ_ATTR_GET_AP_TSF)) in mac80211_hwsim_send_pmsr_request_peer()
3525 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request_peer()
3529 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request_peer()
3531 err = mac80211_hwsim_send_pmsr_ftm_request_peer(msg, &request->ftm); in mac80211_hwsim_send_pmsr_request_peer()
3550 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request()
3552 if (nla_put_u32(msg, NL80211_ATTR_TIMEOUT, request->timeout)) in mac80211_hwsim_send_pmsr_request()
3553 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request()
3555 if (!is_zero_ether_addr(request->mac_addr)) { in mac80211_hwsim_send_pmsr_request()
3556 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, request->mac_addr)) in mac80211_hwsim_send_pmsr_request()
3557 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request()
3558 if (nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN, request->mac_addr_mask)) in mac80211_hwsim_send_pmsr_request()
3559 return -ENOBUFS; in mac80211_hwsim_send_pmsr_request()
3562 for (int i = 0; i < request->n_peers; i++) { in mac80211_hwsim_send_pmsr_request()
3563 err = mac80211_hwsim_send_pmsr_request_peer(msg, &request->peers[i]); in mac80211_hwsim_send_pmsr_request()
3584 data = hw->priv; in mac80211_hwsim_start_pmsr()
3585 _portid = READ_ONCE(data->wmediumd); in mac80211_hwsim_start_pmsr()
3587 return -EOPNOTSUPP; in mac80211_hwsim_start_pmsr()
3589 mutex_lock(&data->mutex); in mac80211_hwsim_start_pmsr()
3591 if (data->pmsr_request) { in mac80211_hwsim_start_pmsr()
3592 err = -EBUSY; in mac80211_hwsim_start_pmsr()
3599 err = -ENOMEM; in mac80211_hwsim_start_pmsr()
3606 ETH_ALEN, data->addresses[1].addr)) { in mac80211_hwsim_start_pmsr()
3607 err = -ENOMEM; in mac80211_hwsim_start_pmsr()
3613 err = -ENOMEM; in mac80211_hwsim_start_pmsr()
3629 data->pmsr_request = request; in mac80211_hwsim_start_pmsr()
3630 data->pmsr_request_wdev = ieee80211_vif_to_wdev(vif); in mac80211_hwsim_start_pmsr()
3636 mutex_unlock(&data->mutex); in mac80211_hwsim_start_pmsr()
3651 data = hw->priv; in mac80211_hwsim_abort_pmsr()
3652 _portid = READ_ONCE(data->wmediumd); in mac80211_hwsim_abort_pmsr()
3656 mutex_lock(&data->mutex); in mac80211_hwsim_abort_pmsr()
3658 if (data->pmsr_request != request) { in mac80211_hwsim_abort_pmsr()
3659 err = -EINVAL; in mac80211_hwsim_abort_pmsr()
3665 err = -ENOMEM; in mac80211_hwsim_abort_pmsr()
3671 if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER, ETH_ALEN, data->addresses[1].addr)) in mac80211_hwsim_abort_pmsr()
3676 err = -ENOMEM; in mac80211_hwsim_abort_pmsr()
3698 mutex_unlock(&data->mutex); in mac80211_hwsim_abort_pmsr()
3709 rateattr, hwsim_rate_info_policy, info->extack); in mac80211_hwsim_parse_rate_info()
3714 rate_info->flags = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_FLAGS]); in mac80211_hwsim_parse_rate_info()
3717 rate_info->mcs = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_MCS]); in mac80211_hwsim_parse_rate_info()
3720 rate_info->legacy = nla_get_u16(tb[HWSIM_RATE_INFO_ATTR_LEGACY]); in mac80211_hwsim_parse_rate_info()
3723 rate_info->nss = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_NSS]); in mac80211_hwsim_parse_rate_info()
3726 rate_info->bw = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_BW]); in mac80211_hwsim_parse_rate_info()
3729 rate_info->he_gi = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_HE_GI]); in mac80211_hwsim_parse_rate_info()
3732 rate_info->he_dcm = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_HE_DCM]); in mac80211_hwsim_parse_rate_info()
3735 rate_info->he_ru_alloc = in mac80211_hwsim_parse_rate_info()
3739 rate_info->n_bonded_ch = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_N_BOUNDED_CH]); in mac80211_hwsim_parse_rate_info()
3742 rate_info->eht_gi = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_EHT_GI]); in mac80211_hwsim_parse_rate_info()
3745 rate_info->eht_ru_alloc = nla_get_u8(tb[HWSIM_RATE_INFO_ATTR_EHT_RU_ALLOC]); in mac80211_hwsim_parse_rate_info()
3750 static int mac80211_hwsim_parse_ftm_result(struct nlattr *ftm, in mac80211_hwsim_parse_ftm_result() argument
3758 ftm, hwsim_ftm_result_policy, info->extack); in mac80211_hwsim_parse_ftm_result()
3763 result->failure_reason = nla_get_u32(tb[NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON]); in mac80211_hwsim_parse_ftm_result()
3766 result->burst_index = nla_get_u16(tb[NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX]); in mac80211_hwsim_parse_ftm_result()
3769 result->num_ftmr_attempts_valid = 1; in mac80211_hwsim_parse_ftm_result()
3770 result->num_ftmr_attempts = in mac80211_hwsim_parse_ftm_result()
3775 result->num_ftmr_successes_valid = 1; in mac80211_hwsim_parse_ftm_result()
3776 result->num_ftmr_successes = in mac80211_hwsim_parse_ftm_result()
3781 result->busy_retry_time = in mac80211_hwsim_parse_ftm_result()
3785 result->num_bursts_exp = nla_get_u8(tb[NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP]); in mac80211_hwsim_parse_ftm_result()
3788 result->burst_duration = nla_get_u8(tb[NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION]); in mac80211_hwsim_parse_ftm_result()
3791 result->ftms_per_burst = nla_get_u8(tb[NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST]); in mac80211_hwsim_parse_ftm_result()
3794 result->rssi_avg_valid = 1; in mac80211_hwsim_parse_ftm_result()
3795 result->rssi_avg = nla_get_s32(tb[NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG]); in mac80211_hwsim_parse_ftm_result()
3798 result->rssi_spread_valid = 1; in mac80211_hwsim_parse_ftm_result()
3799 result->rssi_spread = in mac80211_hwsim_parse_ftm_result()
3804 result->tx_rate_valid = 1; in mac80211_hwsim_parse_ftm_result()
3806 &result->tx_rate, info); in mac80211_hwsim_parse_ftm_result()
3812 result->rx_rate_valid = 1; in mac80211_hwsim_parse_ftm_result()
3814 &result->rx_rate, info); in mac80211_hwsim_parse_ftm_result()
3820 result->rtt_avg_valid = 1; in mac80211_hwsim_parse_ftm_result()
3821 result->rtt_avg = in mac80211_hwsim_parse_ftm_result()
3825 result->rtt_variance_valid = 1; in mac80211_hwsim_parse_ftm_result()
3826 result->rtt_variance = in mac80211_hwsim_parse_ftm_result()
3830 result->rtt_spread_valid = 1; in mac80211_hwsim_parse_ftm_result()
3831 result->rtt_spread = in mac80211_hwsim_parse_ftm_result()
3835 result->dist_avg_valid = 1; in mac80211_hwsim_parse_ftm_result()
3836 result->dist_avg = in mac80211_hwsim_parse_ftm_result()
3840 result->dist_variance_valid = 1; in mac80211_hwsim_parse_ftm_result()
3841 result->dist_variance = in mac80211_hwsim_parse_ftm_result()
3845 result->dist_spread_valid = 1; in mac80211_hwsim_parse_ftm_result()
3846 result->dist_spread = in mac80211_hwsim_parse_ftm_result()
3851 result->lci = nla_data(tb[NL80211_PMSR_FTM_RESP_ATTR_LCI]); in mac80211_hwsim_parse_ftm_result()
3852 result->lci_len = nla_len(tb[NL80211_PMSR_FTM_RESP_ATTR_LCI]); in mac80211_hwsim_parse_ftm_result()
3856 result->civicloc = nla_data(tb[NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC]); in mac80211_hwsim_parse_ftm_result()
3857 result->civicloc_len = nla_len(tb[NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC]); in mac80211_hwsim_parse_ftm_result()
3873 info->extack); in mac80211_hwsim_parse_pmsr_resp()
3878 result->status = nla_get_u32(tb[NL80211_PMSR_RESP_ATTR_STATUS]); in mac80211_hwsim_parse_pmsr_resp()
3881 result->host_time = nla_get_u64(tb[NL80211_PMSR_RESP_ATTR_HOST_TIME]); in mac80211_hwsim_parse_pmsr_resp()
3884 result->ap_tsf_valid = 1; in mac80211_hwsim_parse_pmsr_resp()
3885 result->ap_tsf = nla_get_u64(tb[NL80211_PMSR_RESP_ATTR_AP_TSF]); in mac80211_hwsim_parse_pmsr_resp()
3888 result->final = !!tb[NL80211_PMSR_RESP_ATTR_FINAL]; in mac80211_hwsim_parse_pmsr_resp()
3896 result->type = NL80211_PMSR_TYPE_FTM; in mac80211_hwsim_parse_pmsr_resp()
3897 ret = mac80211_hwsim_parse_ftm_result(pmsr, &result->ftm, info); in mac80211_hwsim_parse_pmsr_resp()
3902 NL_SET_ERR_MSG_ATTR(info->extack, pmsr, "Unknown pmsr resp type"); in mac80211_hwsim_parse_pmsr_resp()
3903 return -EINVAL; in mac80211_hwsim_parse_pmsr_resp()
3918 return -EINVAL; in mac80211_hwsim_parse_pmsr_result()
3921 hwsim_pmsr_peer_result_policy, info->extack); in mac80211_hwsim_parse_pmsr_result()
3926 memcpy(result->addr, nla_data(tb[NL80211_PMSR_PEER_ATTR_ADDR]), in mac80211_hwsim_parse_pmsr_result()
3943 const u8 *src; in hwsim_pmsr_report_nl() local
3947 if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER]) in hwsim_pmsr_report_nl()
3948 return -EINVAL; in hwsim_pmsr_report_nl()
3950 src = nla_data(info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER]); in hwsim_pmsr_report_nl()
3951 data = get_hwsim_data_ref_from_addr(src); in hwsim_pmsr_report_nl()
3953 return -EINVAL; in hwsim_pmsr_report_nl()
3955 mutex_lock(&data->mutex); in hwsim_pmsr_report_nl()
3956 if (!data->pmsr_request) { in hwsim_pmsr_report_nl()
3957 err = -EINVAL; in hwsim_pmsr_report_nl()
3961 reqattr = info->attrs[HWSIM_ATTR_PMSR_RESULT]; in hwsim_pmsr_report_nl()
3963 err = -EINVAL; in hwsim_pmsr_report_nl()
3969 err = -EINVAL; in hwsim_pmsr_report_nl()
3980 cfg80211_pmsr_report(data->pmsr_request_wdev, in hwsim_pmsr_report_nl()
3981 data->pmsr_request, &result, GFP_KERNEL); in hwsim_pmsr_report_nl()
3984 cfg80211_pmsr_complete(data->pmsr_request_wdev, data->pmsr_request, GFP_KERNEL); in hwsim_pmsr_report_nl()
3988 data->pmsr_request = NULL; in hwsim_pmsr_report_nl()
3989 data->pmsr_request_wdev = NULL; in hwsim_pmsr_report_nl()
3991 mutex_unlock(&data->mutex); in hwsim_pmsr_report_nl()
4001 struct ieee80211_hw *hw = data->hw; in mac80211_hwsim_nan_dw_start()
4006 if (!data->nan_device_vif) in mac80211_hwsim_nan_dw_start()
4009 if (data->nan_bands & BIT(NL80211_BAND_5GHZ)) { in mac80211_hwsim_nan_dw_start()
4010 if (data->nan_curr_dw_band == NL80211_BAND_2GHZ) { in mac80211_hwsim_nan_dw_start()
4012 data->nan_curr_dw_band = NL80211_BAND_5GHZ; in mac80211_hwsim_nan_dw_start()
4013 } else if (data->nan_curr_dw_band == NL80211_BAND_5GHZ) { in mac80211_hwsim_nan_dw_start()
4014 data->nan_curr_dw_band = NL80211_BAND_2GHZ; in mac80211_hwsim_nan_dw_start()
4018 until_dw = dw_int - do_div(tsf, dw_int); in mac80211_hwsim_nan_dw_start()
4029 wiphy_debug(hw->wiphy, in mac80211_hwsim_nan_dw_start()
4031 __func__, orig_tsf, data->nan_curr_dw_band, in mac80211_hwsim_nan_dw_start()
4034 hrtimer_forward_now(&data->nan_timer, in mac80211_hwsim_nan_dw_start()
4037 if (data->notify_dw) { in mac80211_hwsim_nan_dw_start()
4040 ieee80211_vif_to_wdev(data->nan_device_vif); in mac80211_hwsim_nan_dw_start()
4042 if (data->nan_curr_dw_band == NL80211_BAND_5GHZ) in mac80211_hwsim_nan_dw_start()
4043 ch = ieee80211_get_channel(hw->wiphy, 5475); in mac80211_hwsim_nan_dw_start()
4045 ch = ieee80211_get_channel(hw->wiphy, 2437); in mac80211_hwsim_nan_dw_start()
4057 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_start_nan()
4060 u64 until_dw = dw_int - do_div(tsf, dw_int); in mac80211_hwsim_start_nan()
4063 if (vif->type != NL80211_IFTYPE_NAN) in mac80211_hwsim_start_nan()
4064 return -EINVAL; in mac80211_hwsim_start_nan()
4066 if (data->nan_device_vif) in mac80211_hwsim_start_nan()
4067 return -EALREADY; in mac80211_hwsim_start_nan()
4070 data->nan_device_vif = vif; in mac80211_hwsim_start_nan()
4071 data->nan_bands = conf->bands; in mac80211_hwsim_start_nan()
4072 data->nan_curr_dw_band = NL80211_BAND_2GHZ; in mac80211_hwsim_start_nan()
4074 wiphy_debug(hw->wiphy, "nan_started, next_dw=%llu\n", in mac80211_hwsim_start_nan()
4077 hrtimer_start(&data->nan_timer, in mac80211_hwsim_start_nan()
4081 if (conf->cluster_id && !is_zero_ether_addr(conf->cluster_id) && in mac80211_hwsim_start_nan()
4083 memcpy(hwsim_nan_cluster_id, conf->cluster_id, ETH_ALEN); in mac80211_hwsim_start_nan()
4093 data->notify_dw = conf->enable_dw_notification; in mac80211_hwsim_start_nan()
4104 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_stop_nan()
4108 if (vif->type != NL80211_IFTYPE_NAN || !data->nan_device_vif || in mac80211_hwsim_stop_nan()
4109 data->nan_device_vif != vif) in mac80211_hwsim_stop_nan()
4110 return -EINVAL; in mac80211_hwsim_stop_nan()
4112 hrtimer_cancel(&data->nan_timer); in mac80211_hwsim_stop_nan()
4113 data->nan_device_vif = NULL; in mac80211_hwsim_stop_nan()
4117 if (data2->nan_device_vif) { in mac80211_hwsim_stop_nan()
4135 struct mac80211_hwsim_data *data = hw->priv; in mac80211_hwsim_change_nan_config()
4137 if (vif->type != NL80211_IFTYPE_NAN) in mac80211_hwsim_change_nan_config()
4138 return -EINVAL; in mac80211_hwsim_change_nan_config()
4140 if (!data->nan_device_vif) in mac80211_hwsim_change_nan_config()
4141 return -EINVAL; in mac80211_hwsim_change_nan_config()
4143 wiphy_debug(hw->wiphy, "nan_config_changed: changes=0x%x\n", changes); in mac80211_hwsim_change_nan_config()
4147 data->nan_bands = conf->bands; in mac80211_hwsim_change_nan_config()
4148 data->nan_curr_dw_band = NL80211_BAND_2GHZ; in mac80211_hwsim_change_nan_config()
4152 data->notify_dw = conf->enable_dw_notification; in mac80211_hwsim_change_nan_config()
4280 if (param->channels) { in append_radio_msg()
4281 ret = nla_put_u32(skb, HWSIM_ATTR_CHANNELS, param->channels); in append_radio_msg()
4286 if (param->reg_alpha2) { in append_radio_msg()
4288 param->reg_alpha2); in append_radio_msg()
4293 if (param->regd) { in append_radio_msg()
4297 if (hwsim_world_regdom_custom[i] != param->regd) in append_radio_msg()
4307 if (param->reg_strict) { in append_radio_msg()
4313 if (param->p2p_device) { in append_radio_msg()
4319 if (param->use_chanctx) { in append_radio_msg()
4325 if (param->multi_radio) { in append_radio_msg()
4331 if (param->hwname) { in append_radio_msg()
4333 strlen(param->hwname), param->hwname); in append_radio_msg()
4338 if (param->nan_device) { in append_radio_msg()
5319 switch (sband->band) { in mac80211_hwsim_sband_capab()
5369 IEEE80211_MLD_MAX_NUM_LINKS - 1)
5397 if (WARN_ON(param->channels > 1 && !param->use_chanctx)) in mac80211_hwsim_new_radio()
5398 return -EINVAL; in mac80211_hwsim_new_radio()
5404 if (param->mlo) in mac80211_hwsim_new_radio()
5406 else if (param->use_chanctx) in mac80211_hwsim_new_radio()
5408 hw = ieee80211_alloc_hw_nm(sizeof(*data), ops, param->hwname); in mac80211_hwsim_new_radio()
5411 err = -ENOMEM; in mac80211_hwsim_new_radio()
5416 param->hwname = wiphy_name(hw->wiphy); in mac80211_hwsim_new_radio()
5422 wiphy_net_set(hw->wiphy, net); in mac80211_hwsim_new_radio()
5424 data = hw->priv; in mac80211_hwsim_new_radio()
5425 data->hw = hw; in mac80211_hwsim_new_radio()
5427 data->dev = device_create(hwsim_class, NULL, 0, hw, "hwsim%d", idx); in mac80211_hwsim_new_radio()
5428 if (IS_ERR(data->dev)) { in mac80211_hwsim_new_radio()
5431 PTR_ERR(data->dev)); in mac80211_hwsim_new_radio()
5432 err = -ENOMEM; in mac80211_hwsim_new_radio()
5435 data->dev->driver = &mac80211_hwsim_driver.driver; in mac80211_hwsim_new_radio()
5436 err = device_bind_driver(data->dev); in mac80211_hwsim_new_radio()
5443 skb_queue_head_init(&data->pending); in mac80211_hwsim_new_radio()
5445 SET_IEEE80211_DEV(hw, data->dev); in mac80211_hwsim_new_radio()
5446 if (!param->perm_addr) { in mac80211_hwsim_new_radio()
5451 memcpy(data->addresses[0].addr, addr, ETH_ALEN); in mac80211_hwsim_new_radio()
5453 memcpy(data->addresses[1].addr, addr, ETH_ALEN); in mac80211_hwsim_new_radio()
5454 data->addresses[1].addr[0] |= 0x40; in mac80211_hwsim_new_radio()
5455 memcpy(data->addresses[2].addr, addr, ETH_ALEN); in mac80211_hwsim_new_radio()
5456 data->addresses[2].addr[0] |= 0x50; in mac80211_hwsim_new_radio()
5458 hw->wiphy->n_addresses = 3; in mac80211_hwsim_new_radio()
5459 hw->wiphy->addresses = data->addresses; in mac80211_hwsim_new_radio()
5462 memcpy(data->addresses[0].addr, param->perm_addr, ETH_ALEN); in mac80211_hwsim_new_radio()
5464 memcpy(data->addresses[1].addr, param->perm_addr, ETH_ALEN); in mac80211_hwsim_new_radio()
5465 memcpy(data->addresses[2].addr, param->perm_addr, ETH_ALEN); in mac80211_hwsim_new_radio()
5466 hw->wiphy->n_addresses = 3; in mac80211_hwsim_new_radio()
5467 hw->wiphy->addresses = data->addresses; in mac80211_hwsim_new_radio()
5470 data->channels = param->channels; in mac80211_hwsim_new_radio()
5471 data->use_chanctx = param->use_chanctx; in mac80211_hwsim_new_radio()
5472 data->idx = idx; in mac80211_hwsim_new_radio()
5473 data->destroy_on_close = param->destroy_on_close; in mac80211_hwsim_new_radio()
5475 data->portid = info->snd_portid; in mac80211_hwsim_new_radio()
5478 if (param->iftypes & BIT(NL80211_IFTYPE_ADHOC)) { in mac80211_hwsim_new_radio()
5479 data->if_limits[n_limits].max = 1; in mac80211_hwsim_new_radio()
5480 data->if_limits[n_limits].types = BIT(NL80211_IFTYPE_ADHOC); in mac80211_hwsim_new_radio()
5484 if (param->iftypes & HWSIM_DEFAULT_IF_LIMIT) { in mac80211_hwsim_new_radio()
5485 data->if_limits[n_limits].max = 2048; in mac80211_hwsim_new_radio()
5489 * bits that both param->iftype & HWSIM_DEFAULT_IF_LIMIT have. in mac80211_hwsim_new_radio()
5491 data->if_limits[n_limits].types = in mac80211_hwsim_new_radio()
5492 HWSIM_DEFAULT_IF_LIMIT & param->iftypes; in mac80211_hwsim_new_radio()
5496 if (param->iftypes & BIT(NL80211_IFTYPE_P2P_DEVICE)) { in mac80211_hwsim_new_radio()
5497 data->if_limits[n_limits].max = 1; in mac80211_hwsim_new_radio()
5498 data->if_limits[n_limits].types = in mac80211_hwsim_new_radio()
5503 if (param->iftypes & BIT(NL80211_IFTYPE_NAN)) { in mac80211_hwsim_new_radio()
5504 data->if_limits[n_limits].max = 1; in mac80211_hwsim_new_radio()
5505 data->if_limits[n_limits].types = BIT(NL80211_IFTYPE_NAN); in mac80211_hwsim_new_radio()
5508 hw->wiphy->nan_supported_bands = BIT(NL80211_BAND_2GHZ) | in mac80211_hwsim_new_radio()
5511 hw->wiphy->nan_capa.flags = WIPHY_NAN_FLAGS_CONFIGURABLE_SYNC | in mac80211_hwsim_new_radio()
5513 hw->wiphy->nan_capa.op_mode = NAN_OP_MODE_PHY_MODE_MASK | in mac80211_hwsim_new_radio()
5517 hw->wiphy->nan_capa.n_antennas = 0x22; in mac80211_hwsim_new_radio()
5518 hw->wiphy->nan_capa.max_channel_switch_time = 0; in mac80211_hwsim_new_radio()
5519 hw->wiphy->nan_capa.dev_capabilities = in mac80211_hwsim_new_radio()
5523 hrtimer_setup(&data->nan_timer, mac80211_hwsim_nan_dw_start, in mac80211_hwsim_new_radio()
5527 data->if_combination.radar_detect_widths = in mac80211_hwsim_new_radio()
5536 if (data->use_chanctx) { in mac80211_hwsim_new_radio()
5537 hw->wiphy->max_scan_ssids = 255; in mac80211_hwsim_new_radio()
5538 hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; in mac80211_hwsim_new_radio()
5539 hw->wiphy->max_remain_on_channel_duration = 1000; in mac80211_hwsim_new_radio()
5540 data->if_combination.num_different_channels = data->channels; in mac80211_hwsim_new_radio()
5542 data->if_combination.num_different_channels = 1; in mac80211_hwsim_new_radio()
5546 err = -EINVAL; in mac80211_hwsim_new_radio()
5550 data->if_combination.max_interfaces = 0; in mac80211_hwsim_new_radio()
5552 data->if_combination.max_interfaces += in mac80211_hwsim_new_radio()
5553 data->if_limits[i].max; in mac80211_hwsim_new_radio()
5555 data->if_combination.n_limits = n_limits; in mac80211_hwsim_new_radio()
5556 data->if_combination.limits = data->if_limits; in mac80211_hwsim_new_radio()
5560 * advertise them - if there's only a single thing like in mac80211_hwsim_new_radio()
5563 if (data->if_combination.max_interfaces > 1) { in mac80211_hwsim_new_radio()
5564 hw->wiphy->iface_combinations = &data->if_combination; in mac80211_hwsim_new_radio()
5565 hw->wiphy->n_iface_combinations = 1; in mac80211_hwsim_new_radio()
5568 if (param->ciphers) { in mac80211_hwsim_new_radio()
5569 memcpy(data->ciphers, param->ciphers, in mac80211_hwsim_new_radio()
5570 param->n_ciphers * sizeof(u32)); in mac80211_hwsim_new_radio()
5571 hw->wiphy->cipher_suites = data->ciphers; in mac80211_hwsim_new_radio()
5572 hw->wiphy->n_cipher_suites = param->n_ciphers; in mac80211_hwsim_new_radio()
5575 hw->wiphy->mbssid_max_interfaces = 8; in mac80211_hwsim_new_radio()
5576 hw->wiphy->ema_max_profile_periodicity = 3; in mac80211_hwsim_new_radio()
5578 data->rx_rssi = DEFAULT_RX_RSSI; in mac80211_hwsim_new_radio()
5580 INIT_DELAYED_WORK(&data->roc_start, hw_roc_start); in mac80211_hwsim_new_radio()
5581 INIT_DELAYED_WORK(&data->roc_done, hw_roc_done); in mac80211_hwsim_new_radio()
5582 INIT_DELAYED_WORK(&data->hw_scan, hw_scan_work); in mac80211_hwsim_new_radio()
5584 hw->queues = 5; in mac80211_hwsim_new_radio()
5585 hw->offchannel_tx_hw_queue = 4; in mac80211_hwsim_new_radio()
5601 if (param->mlo) { in mac80211_hwsim_new_radio()
5602 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; in mac80211_hwsim_new_radio()
5608 hw->wiphy->iftype_ext_capab = mac80211_hwsim_iftypes_ext_capa; in mac80211_hwsim_new_radio()
5609 hw->wiphy->num_iftype_ext_capab = in mac80211_hwsim_new_radio()
5618 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; in mac80211_hwsim_new_radio()
5619 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | in mac80211_hwsim_new_radio()
5624 hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR | in mac80211_hwsim_new_radio()
5630 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); in mac80211_hwsim_new_radio()
5631 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION); in mac80211_hwsim_new_radio()
5632 wiphy_ext_feature_set(hw->wiphy, in mac80211_hwsim_new_radio()
5634 wiphy_ext_feature_set(hw->wiphy, in mac80211_hwsim_new_radio()
5636 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); in mac80211_hwsim_new_radio()
5638 wiphy_ext_feature_set(hw->wiphy, in mac80211_hwsim_new_radio()
5640 wiphy_ext_feature_set(hw->wiphy, in mac80211_hwsim_new_radio()
5643 hw->wiphy->interface_modes = param->iftypes; in mac80211_hwsim_new_radio()
5646 hw->vif_data_size = sizeof(struct hwsim_vif_priv); in mac80211_hwsim_new_radio()
5647 hw->sta_data_size = sizeof(struct hwsim_sta_priv); in mac80211_hwsim_new_radio()
5648 hw->chanctx_data_size = sizeof(struct hwsim_chanctx_priv); in mac80211_hwsim_new_radio()
5650 memcpy(data->channels_2ghz, hwsim_channels_2ghz, in mac80211_hwsim_new_radio()
5652 memcpy(data->channels_5ghz, hwsim_channels_5ghz, in mac80211_hwsim_new_radio()
5654 memcpy(data->channels_6ghz, hwsim_channels_6ghz, in mac80211_hwsim_new_radio()
5656 memcpy(data->channels_s1g, hwsim_channels_s1g, in mac80211_hwsim_new_radio()
5658 memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates)); in mac80211_hwsim_new_radio()
5661 struct ieee80211_supported_band *sband = &data->bands[band]; in mac80211_hwsim_new_radio()
5666 sband->band = band; in mac80211_hwsim_new_radio()
5670 sband->channels = data->channels_2ghz; in mac80211_hwsim_new_radio()
5671 sband->n_channels = ARRAY_SIZE(hwsim_channels_2ghz); in mac80211_hwsim_new_radio()
5672 sband->bitrates = data->rates; in mac80211_hwsim_new_radio()
5673 sband->n_bitrates = ARRAY_SIZE(hwsim_rates); in mac80211_hwsim_new_radio()
5676 sband->channels = data->channels_5ghz; in mac80211_hwsim_new_radio()
5677 sband->n_channels = ARRAY_SIZE(hwsim_channels_5ghz); in mac80211_hwsim_new_radio()
5678 sband->bitrates = data->rates + 4; in mac80211_hwsim_new_radio()
5679 sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4; in mac80211_hwsim_new_radio()
5681 sband->vht_cap.vht_supported = true; in mac80211_hwsim_new_radio()
5682 sband->vht_cap.cap = in mac80211_hwsim_new_radio()
5691 sband->vht_cap.vht_mcs.rx_mcs_map = in mac80211_hwsim_new_radio()
5700 sband->vht_cap.vht_mcs.tx_mcs_map = in mac80211_hwsim_new_radio()
5701 sband->vht_cap.vht_mcs.rx_mcs_map; in mac80211_hwsim_new_radio()
5704 sband->channels = data->channels_6ghz; in mac80211_hwsim_new_radio()
5705 sband->n_channels = ARRAY_SIZE(hwsim_channels_6ghz); in mac80211_hwsim_new_radio()
5706 sband->bitrates = data->rates + 4; in mac80211_hwsim_new_radio()
5707 sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4; in mac80211_hwsim_new_radio()
5710 memcpy(&sband->s1g_cap, &hwsim_s1g_cap, in mac80211_hwsim_new_radio()
5711 sizeof(sband->s1g_cap)); in mac80211_hwsim_new_radio()
5712 sband->channels = data->channels_s1g; in mac80211_hwsim_new_radio()
5713 sband->n_channels = ARRAY_SIZE(hwsim_channels_s1g); in mac80211_hwsim_new_radio()
5720 sband->ht_cap.ht_supported = true; in mac80211_hwsim_new_radio()
5721 sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | in mac80211_hwsim_new_radio()
5726 sband->ht_cap.ampdu_factor = 0x3; in mac80211_hwsim_new_radio()
5727 sband->ht_cap.ampdu_density = 0x6; in mac80211_hwsim_new_radio()
5728 memset(&sband->ht_cap.mcs, 0, in mac80211_hwsim_new_radio()
5729 sizeof(sband->ht_cap.mcs)); in mac80211_hwsim_new_radio()
5730 sband->ht_cap.mcs.rx_mask[0] = 0xff; in mac80211_hwsim_new_radio()
5731 sband->ht_cap.mcs.rx_mask[1] = 0xff; in mac80211_hwsim_new_radio()
5732 sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; in mac80211_hwsim_new_radio()
5737 hw->wiphy->bands[band] = sband; in mac80211_hwsim_new_radio()
5739 if (!param->multi_radio) in mac80211_hwsim_new_radio()
5742 c = sband->channels; in mac80211_hwsim_new_radio()
5743 radio_range = &data->radio_range[n_bands]; in mac80211_hwsim_new_radio()
5744 radio_range->start_freq = ieee80211_channel_to_khz(c) - 10000; in mac80211_hwsim_new_radio()
5746 c += sband->n_channels - 1; in mac80211_hwsim_new_radio()
5747 radio_range->end_freq = ieee80211_channel_to_khz(c) + 10000; in mac80211_hwsim_new_radio()
5749 radio = &data->radio[n_bands++]; in mac80211_hwsim_new_radio()
5750 radio->freq_range = radio_range; in mac80211_hwsim_new_radio()
5751 radio->n_freq_range = 1; in mac80211_hwsim_new_radio()
5752 radio->iface_combinations = &data->if_combination_radio; in mac80211_hwsim_new_radio()
5753 radio->n_iface_combinations = 1; in mac80211_hwsim_new_radio()
5756 if (param->multi_radio) { in mac80211_hwsim_new_radio()
5757 hw->wiphy->radio = data->radio; in mac80211_hwsim_new_radio()
5758 hw->wiphy->n_radio = n_bands; in mac80211_hwsim_new_radio()
5760 memcpy(&data->if_combination_radio, &data->if_combination, in mac80211_hwsim_new_radio()
5761 sizeof(data->if_combination)); in mac80211_hwsim_new_radio()
5762 data->if_combination.num_different_channels *= n_bands; in mac80211_hwsim_new_radio()
5765 if (data->use_chanctx) in mac80211_hwsim_new_radio()
5766 data->if_combination.radar_detect_widths = 0; in mac80211_hwsim_new_radio()
5769 data->group = 1; in mac80211_hwsim_new_radio()
5770 mutex_init(&data->mutex); in mac80211_hwsim_new_radio()
5772 data->netgroup = hwsim_net_get_netgroup(net); in mac80211_hwsim_new_radio()
5773 data->wmediumd = hwsim_net_get_wmediumd(net); in mac80211_hwsim_new_radio()
5776 hw->max_rates = 4; in mac80211_hwsim_new_radio()
5777 hw->max_rate_tries = 11; in mac80211_hwsim_new_radio()
5779 hw->wiphy->vendor_commands = mac80211_hwsim_vendor_commands; in mac80211_hwsim_new_radio()
5780 hw->wiphy->n_vendor_commands = in mac80211_hwsim_new_radio()
5782 hw->wiphy->vendor_events = mac80211_hwsim_vendor_events; in mac80211_hwsim_new_radio()
5783 hw->wiphy->n_vendor_events = ARRAY_SIZE(mac80211_hwsim_vendor_events); in mac80211_hwsim_new_radio()
5785 if (param->reg_strict) in mac80211_hwsim_new_radio()
5786 hw->wiphy->regulatory_flags |= REGULATORY_STRICT_REG; in mac80211_hwsim_new_radio()
5787 if (param->regd) { in mac80211_hwsim_new_radio()
5788 data->regd = param->regd; in mac80211_hwsim_new_radio()
5789 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; in mac80211_hwsim_new_radio()
5790 wiphy_apply_custom_regulatory(hw->wiphy, param->regd); in mac80211_hwsim_new_radio()
5795 wiphy_ext_feature_set(hw->wiphy, in mac80211_hwsim_new_radio()
5798 if (param->no_vif) in mac80211_hwsim_new_radio()
5801 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); in mac80211_hwsim_new_radio()
5803 for (i = 0; i < ARRAY_SIZE(data->link_data); i++) { in mac80211_hwsim_new_radio()
5804 hrtimer_setup(&data->link_data[i].beacon_timer, mac80211_hwsim_beacon, in mac80211_hwsim_new_radio()
5806 data->link_data[i].link_id = i; in mac80211_hwsim_new_radio()
5816 wiphy_dbg(hw->wiphy, "hwaddr %pM registered\n", hw->wiphy->perm_addr); in mac80211_hwsim_new_radio()
5818 if (param->reg_alpha2) { in mac80211_hwsim_new_radio()
5819 data->alpha2[0] = param->reg_alpha2[0]; in mac80211_hwsim_new_radio()
5820 data->alpha2[1] = param->reg_alpha2[1]; in mac80211_hwsim_new_radio()
5821 regulatory_hint(hw->wiphy, param->reg_alpha2); in mac80211_hwsim_new_radio()
5824 data->debugfs = debugfs_create_dir("hwsim", hw->wiphy->debugfsdir); in mac80211_hwsim_new_radio()
5825 debugfs_create_file("ps", 0666, data->debugfs, data, &hwsim_fops_ps); in mac80211_hwsim_new_radio()
5826 debugfs_create_file("group", 0666, data->debugfs, data, in mac80211_hwsim_new_radio()
5828 debugfs_create_file("rx_rssi", 0666, data->debugfs, data, in mac80211_hwsim_new_radio()
5830 if (!data->use_chanctx) in mac80211_hwsim_new_radio()
5832 data->debugfs, in mac80211_hwsim_new_radio()
5835 if (param->pmsr_capa) { in mac80211_hwsim_new_radio()
5836 data->pmsr_capa = *param->pmsr_capa; in mac80211_hwsim_new_radio()
5837 hw->wiphy->pmsr_capa = &data->pmsr_capa; in mac80211_hwsim_new_radio()
5841 err = rhashtable_insert_fast(&hwsim_radios_rht, &data->rht, in mac80211_hwsim_new_radio()
5846 NL_SET_BAD_ATTR(info->extack, in mac80211_hwsim_new_radio()
5847 info->attrs[HWSIM_ATTR_PERM_ADDR]); in mac80211_hwsim_new_radio()
5853 list_add_tail(&data->list, &hwsim_radios); in mac80211_hwsim_new_radio()
5862 debugfs_remove_recursive(data->debugfs); in mac80211_hwsim_new_radio()
5863 ieee80211_unregister_hw(data->hw); in mac80211_hwsim_new_radio()
5865 device_release_driver(data->dev); in mac80211_hwsim_new_radio()
5867 device_unregister(data->dev); in mac80211_hwsim_new_radio()
5913 hwsim_mcast_del_radio(data->idx, hwname, info); in mac80211_hwsim_del_radio()
5914 debugfs_remove_recursive(data->debugfs); in mac80211_hwsim_del_radio()
5915 ieee80211_unregister_hw(data->hw); in mac80211_hwsim_del_radio()
5916 device_release_driver(data->dev); in mac80211_hwsim_del_radio()
5917 device_unregister(data->dev); in mac80211_hwsim_del_radio()
5918 ieee80211_free_hw(data->hw); in mac80211_hwsim_del_radio()
5928 int res = -EMSGSIZE; in mac80211_hwsim_get_radio()
5933 return -EMSGSIZE; in mac80211_hwsim_get_radio()
5938 if (data->alpha2[0] && data->alpha2[1]) in mac80211_hwsim_get_radio()
5939 param.reg_alpha2 = data->alpha2; in mac80211_hwsim_get_radio()
5941 param.reg_strict = !!(data->hw->wiphy->regulatory_flags & in mac80211_hwsim_get_radio()
5943 param.p2p_device = !!(data->hw->wiphy->interface_modes & in mac80211_hwsim_get_radio()
5945 param.nan_device = !!(data->hw->wiphy->interface_modes & in mac80211_hwsim_get_radio()
5947 param.use_chanctx = data->use_chanctx; in mac80211_hwsim_get_radio()
5948 param.regd = data->regd; in mac80211_hwsim_get_radio()
5949 param.channels = data->channels; in mac80211_hwsim_get_radio()
5950 param.hwname = wiphy_name(data->hw->wiphy); in mac80211_hwsim_get_radio()
5951 param.pmsr_capa = &data->pmsr_capa; in mac80211_hwsim_get_radio()
5953 res = append_radio_msg(skb, data->idx, &param); in mac80211_hwsim_get_radio()
5973 list_del(&data->list); in mac80211_hwsim_free()
5975 mac80211_hwsim_del_radio(data, wiphy_name(data->hw->wiphy), in mac80211_hwsim_free()
5993 dev->netdev_ops = &hwsim_netdev_ops; in hwsim_mon_setup()
5994 dev->needs_free_netdev = true; in hwsim_mon_setup()
5996 dev->priv_flags |= IFF_NO_QUEUE; in hwsim_mon_setup()
5997 dev->type = ARPHRD_IEEE80211_RADIOTAP; in hwsim_mon_setup()
6011 if (data->netgroup == hwsim_net_get_netgroup(net)) in hwsim_register_wmediumd()
6012 data->wmediumd = portid; in hwsim_register_wmediumd()
6027 const u8 *src; in hwsim_tx_info_frame_received_nl() local
6033 if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER] || in hwsim_tx_info_frame_received_nl()
6034 !info->attrs[HWSIM_ATTR_FLAGS] || in hwsim_tx_info_frame_received_nl()
6035 !info->attrs[HWSIM_ATTR_COOKIE] || in hwsim_tx_info_frame_received_nl()
6036 !info->attrs[HWSIM_ATTR_SIGNAL] || in hwsim_tx_info_frame_received_nl()
6037 !info->attrs[HWSIM_ATTR_TX_INFO]) in hwsim_tx_info_frame_received_nl()
6040 src = (void *)nla_data(info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER]); in hwsim_tx_info_frame_received_nl()
6041 hwsim_flags = nla_get_u32(info->attrs[HWSIM_ATTR_FLAGS]); in hwsim_tx_info_frame_received_nl()
6042 ret_skb_cookie = nla_get_u64(info->attrs[HWSIM_ATTR_COOKIE]); in hwsim_tx_info_frame_received_nl()
6044 data2 = get_hwsim_data_ref_from_addr(src); in hwsim_tx_info_frame_received_nl()
6050 data2->netgroup) in hwsim_tx_info_frame_received_nl()
6053 if (info->snd_portid != data2->wmediumd) in hwsim_tx_info_frame_received_nl()
6058 spin_lock_irqsave(&data2->pending.lock, flags); in hwsim_tx_info_frame_received_nl()
6059 skb_queue_walk_safe(&data2->pending, skb, tmp) { in hwsim_tx_info_frame_received_nl()
6063 skb_cookie = (uintptr_t)txi->rate_driver_data[0]; in hwsim_tx_info_frame_received_nl()
6066 __skb_unlink(skb, &data2->pending); in hwsim_tx_info_frame_received_nl()
6071 spin_unlock_irqrestore(&data2->pending.lock, flags); in hwsim_tx_info_frame_received_nl()
6081 info->attrs[HWSIM_ATTR_TX_INFO]); in hwsim_tx_info_frame_received_nl()
6089 txi->status.rates[i].idx = tx_attempts[i].idx; in hwsim_tx_info_frame_received_nl()
6090 txi->status.rates[i].count = tx_attempts[i].count; in hwsim_tx_info_frame_received_nl()
6093 txi->status.ack_signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]); in hwsim_tx_info_frame_received_nl()
6097 if (skb->len >= 16) { in hwsim_tx_info_frame_received_nl()
6098 hdr = (struct ieee80211_hdr *) skb->data; in hwsim_tx_info_frame_received_nl()
6099 mac80211_hwsim_monitor_ack(data2->channel, in hwsim_tx_info_frame_received_nl()
6100 hdr->addr2); in hwsim_tx_info_frame_received_nl()
6102 txi->flags |= IEEE80211_TX_STAT_ACK; in hwsim_tx_info_frame_received_nl()
6106 txi->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED; in hwsim_tx_info_frame_received_nl()
6108 ieee80211_tx_status_irqsafe(data2->hw, skb); in hwsim_tx_info_frame_received_nl()
6111 return -EINVAL; in hwsim_tx_info_frame_received_nl()
6127 if (!info->attrs[HWSIM_ATTR_ADDR_RECEIVER] || in hwsim_cloned_frame_received_nl()
6128 !info->attrs[HWSIM_ATTR_FRAME] || in hwsim_cloned_frame_received_nl()
6129 !info->attrs[HWSIM_ATTR_RX_RATE] || in hwsim_cloned_frame_received_nl()
6130 !info->attrs[HWSIM_ATTR_SIGNAL]) in hwsim_cloned_frame_received_nl()
6133 dst = (void *)nla_data(info->attrs[HWSIM_ATTR_ADDR_RECEIVER]); in hwsim_cloned_frame_received_nl()
6134 frame_data_len = nla_len(info->attrs[HWSIM_ATTR_FRAME]); in hwsim_cloned_frame_received_nl()
6135 frame_data = (void *)nla_data(info->attrs[HWSIM_ATTR_FRAME]); in hwsim_cloned_frame_received_nl()
6153 if (data2->use_chanctx) { in hwsim_cloned_frame_received_nl()
6154 if (data2->tmp_chan) in hwsim_cloned_frame_received_nl()
6155 channel = data2->tmp_chan; in hwsim_cloned_frame_received_nl()
6157 channel = data2->channel; in hwsim_cloned_frame_received_nl()
6162 data2->netgroup) in hwsim_cloned_frame_received_nl()
6165 if (info->snd_portid != data2->wmediumd) in hwsim_cloned_frame_received_nl()
6171 if ((data2->idle && !data2->tmp_chan) || !data2->started) in hwsim_cloned_frame_received_nl()
6176 if (info->attrs[HWSIM_ATTR_FREQ]) { in hwsim_cloned_frame_received_nl()
6179 /* throw away off-channel packets, but allow both the temporary in hwsim_cloned_frame_received_nl()
6180 * ("hw" scan/remain-on-channel), regular channels and links, in hwsim_cloned_frame_received_nl()
6183 rx_status.freq = nla_get_u32(info->attrs[HWSIM_ATTR_FREQ]); in hwsim_cloned_frame_received_nl()
6185 iter_data.channel = ieee80211_get_channel(data2->hw->wiphy, in hwsim_cloned_frame_received_nl()
6189 rx_status.band = iter_data.channel->band; in hwsim_cloned_frame_received_nl()
6191 mutex_lock(&data2->mutex); in hwsim_cloned_frame_received_nl()
6194 data2->hw, IEEE80211_IFACE_ITER_NORMAL, in hwsim_cloned_frame_received_nl()
6197 mutex_unlock(&data2->mutex); in hwsim_cloned_frame_received_nl()
6201 mutex_unlock(&data2->mutex); in hwsim_cloned_frame_received_nl()
6205 rx_status.freq = channel->center_freq; in hwsim_cloned_frame_received_nl()
6206 rx_status.band = channel->band; in hwsim_cloned_frame_received_nl()
6209 rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]); in hwsim_cloned_frame_received_nl()
6210 if (rx_status.rate_idx >= data2->hw->wiphy->bands[rx_status.band]->n_bitrates) in hwsim_cloned_frame_received_nl()
6212 rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]); in hwsim_cloned_frame_received_nl()
6214 hdr = (void *)skb->data; in hwsim_cloned_frame_received_nl()
6216 if (ieee80211_is_beacon(hdr->frame_control) || in hwsim_cloned_frame_received_nl()
6217 ieee80211_is_probe_resp(hdr->frame_control)) in hwsim_cloned_frame_received_nl()
6227 return -EINVAL; in hwsim_cloned_frame_received_nl()
6239 chans = max(chans, data->channels); in hwsim_register_received_nl()
6243 * to set a flag that it does support multi-channel, then we can in hwsim_register_received_nl()
6248 return -EOPNOTSUPP; in hwsim_register_received_nl()
6251 return -EBUSY; in hwsim_register_received_nl()
6253 hwsim_register_wmediumd(net, info->snd_portid); in hwsim_register_received_nl()
6256 "switching to wmediumd mode with pid %d\n", info->snd_portid); in hwsim_register_received_nl()
6293 NL_SET_ERR_MSG_ATTR(info->extack, ftm_capa, "malformed FTM capability"); in parse_ftm_capa()
6294 return -EINVAL; in parse_ftm_capa()
6297 out->ftm.supported = 1; in parse_ftm_capa()
6299 out->ftm.preambles = nla_get_u32(tb[NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES]); in parse_ftm_capa()
6301 out->ftm.bandwidths = nla_get_u32(tb[NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS]); in parse_ftm_capa()
6303 out->ftm.max_bursts_exponent = in parse_ftm_capa()
6306 out->ftm.max_ftms_per_burst = in parse_ftm_capa()
6308 out->ftm.asap = !!tb[NL80211_PMSR_FTM_CAPA_ATTR_ASAP]; in parse_ftm_capa()
6309 out->ftm.non_asap = !!tb[NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP]; in parse_ftm_capa()
6310 out->ftm.request_lci = !!tb[NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI]; in parse_ftm_capa()
6311 out->ftm.request_civicloc = !!tb[NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC]; in parse_ftm_capa()
6312 out->ftm.trigger_based = !!tb[NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED]; in parse_ftm_capa()
6313 out->ftm.non_trigger_based = !!tb[NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED]; in parse_ftm_capa()
6328 NL_SET_ERR_MSG_ATTR(info->extack, pmsr_capa, "malformed PMSR capability"); in parse_pmsr_capa()
6329 return -EINVAL; in parse_pmsr_capa()
6333 out->max_peers = nla_get_u32(tb[NL80211_PMSR_ATTR_MAX_PEERS]); in parse_pmsr_capa()
6334 out->report_ap_tsf = !!tb[NL80211_PMSR_ATTR_REPORT_AP_TSF]; in parse_pmsr_capa()
6335 out->randomize_mac_addr = !!tb[NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR]; in parse_pmsr_capa()
6338 NL_SET_ERR_MSG_ATTR(info->extack, tb[NL80211_PMSR_ATTR_TYPE_CAPA], in parse_pmsr_capa()
6340 return -EINVAL; in parse_pmsr_capa()
6349 NL_SET_ERR_MSG_ATTR(info->extack, nla, "unsupported measurement type"); in parse_pmsr_capa()
6350 return -EINVAL; in parse_pmsr_capa()
6363 param.reg_strict = info->attrs[HWSIM_ATTR_REG_STRICT_REG]; in hwsim_new_radio_nl()
6364 param.p2p_device = info->attrs[HWSIM_ATTR_SUPPORT_P2P_DEVICE]; in hwsim_new_radio_nl()
6365 param.nan_device = info->attrs[HWSIM_ATTR_SUPPORT_NAN_DEVICE]; in hwsim_new_radio_nl()
6368 info->attrs[HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE]; in hwsim_new_radio_nl()
6370 if (info->attrs[HWSIM_ATTR_CHANNELS]) in hwsim_new_radio_nl()
6371 param.channels = nla_get_u32(info->attrs[HWSIM_ATTR_CHANNELS]); in hwsim_new_radio_nl()
6375 return -EINVAL; in hwsim_new_radio_nl()
6378 if (info->attrs[HWSIM_ATTR_NO_VIF]) in hwsim_new_radio_nl()
6381 if (info->attrs[HWSIM_ATTR_USE_CHANCTX]) in hwsim_new_radio_nl()
6386 if (info->attrs[HWSIM_ATTR_MULTI_RADIO]) in hwsim_new_radio_nl()
6389 if (info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2]) in hwsim_new_radio_nl()
6391 nla_data(info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2]); in hwsim_new_radio_nl()
6393 if (info->attrs[HWSIM_ATTR_REG_CUSTOM_REG]) { in hwsim_new_radio_nl()
6394 u32 idx = nla_get_u32(info->attrs[HWSIM_ATTR_REG_CUSTOM_REG]); in hwsim_new_radio_nl()
6397 return -EINVAL; in hwsim_new_radio_nl()
6404 if (info->attrs[HWSIM_ATTR_PERM_ADDR]) { in hwsim_new_radio_nl()
6406 nla_data(info->attrs[HWSIM_ATTR_PERM_ADDR]))) { in hwsim_new_radio_nl()
6408 NL_SET_BAD_ATTR(info->extack, in hwsim_new_radio_nl()
6409 info->attrs[HWSIM_ATTR_PERM_ADDR]); in hwsim_new_radio_nl()
6410 return -EINVAL; in hwsim_new_radio_nl()
6413 param.perm_addr = nla_data(info->attrs[HWSIM_ATTR_PERM_ADDR]); in hwsim_new_radio_nl()
6416 if (info->attrs[HWSIM_ATTR_IFTYPE_SUPPORT]) { in hwsim_new_radio_nl()
6418 nla_get_u32(info->attrs[HWSIM_ATTR_IFTYPE_SUPPORT]); in hwsim_new_radio_nl()
6421 NL_SET_ERR_MSG_ATTR(info->extack, in hwsim_new_radio_nl()
6422 info->attrs[HWSIM_ATTR_IFTYPE_SUPPORT], in hwsim_new_radio_nl()
6424 return -EINVAL; in hwsim_new_radio_nl()
6444 if (info->attrs[HWSIM_ATTR_CIPHER_SUPPORT]) { in hwsim_new_radio_nl()
6445 u32 len = nla_len(info->attrs[HWSIM_ATTR_CIPHER_SUPPORT]); in hwsim_new_radio_nl()
6448 nla_data(info->attrs[HWSIM_ATTR_CIPHER_SUPPORT]); in hwsim_new_radio_nl()
6451 NL_SET_ERR_MSG_ATTR(info->extack, in hwsim_new_radio_nl()
6452 info->attrs[HWSIM_ATTR_CIPHER_SUPPORT], in hwsim_new_radio_nl()
6454 return -EINVAL; in hwsim_new_radio_nl()
6460 NL_SET_ERR_MSG_ATTR(info->extack, in hwsim_new_radio_nl()
6461 info->attrs[HWSIM_ATTR_CIPHER_SUPPORT], in hwsim_new_radio_nl()
6463 return -EINVAL; in hwsim_new_radio_nl()
6467 NL_SET_ERR_MSG_ATTR(info->extack, in hwsim_new_radio_nl()
6468 info->attrs[HWSIM_ATTR_CIPHER_SUPPORT], in hwsim_new_radio_nl()
6470 return -EINVAL; in hwsim_new_radio_nl()
6474 param.mlo = info->attrs[HWSIM_ATTR_MLO_SUPPORT]; in hwsim_new_radio_nl()
6479 if (info->attrs[HWSIM_ATTR_RADIO_NAME]) { in hwsim_new_radio_nl()
6480 hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]), in hwsim_new_radio_nl()
6481 nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), in hwsim_new_radio_nl()
6484 return -ENOMEM; in hwsim_new_radio_nl()
6488 if (info->attrs[HWSIM_ATTR_PMSR_SUPPORT]) { in hwsim_new_radio_nl()
6493 ret = -ENOMEM; in hwsim_new_radio_nl()
6498 ret = parse_pmsr_capa(info->attrs[HWSIM_ATTR_PMSR_SUPPORT], pmsr_capa, info); in hwsim_new_radio_nl()
6514 s64 idx = -1; in hwsim_del_radio_nl()
6517 if (info->attrs[HWSIM_ATTR_RADIO_ID]) { in hwsim_del_radio_nl()
6518 idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]); in hwsim_del_radio_nl()
6519 } else if (info->attrs[HWSIM_ATTR_RADIO_NAME]) { in hwsim_del_radio_nl()
6520 hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]), in hwsim_del_radio_nl()
6521 nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), in hwsim_del_radio_nl()
6524 return -ENOMEM; in hwsim_del_radio_nl()
6526 return -EINVAL; in hwsim_del_radio_nl()
6531 if (data->idx != idx) in hwsim_del_radio_nl()
6535 strcmp(hwname, wiphy_name(data->hw->wiphy))) in hwsim_del_radio_nl()
6539 if (!net_eq(wiphy_net(data->hw->wiphy), genl_info_net(info))) in hwsim_del_radio_nl()
6542 list_del(&data->list); in hwsim_del_radio_nl()
6543 rhashtable_remove_fast(&hwsim_radios_rht, &data->rht, in hwsim_del_radio_nl()
6547 mac80211_hwsim_del_radio(data, wiphy_name(data->hw->wiphy), in hwsim_del_radio_nl()
6555 return -ENODEV; in hwsim_del_radio_nl()
6562 int idx, res = -ENODEV; in hwsim_get_radio_nl()
6564 if (!info->attrs[HWSIM_ATTR_RADIO_ID]) in hwsim_get_radio_nl()
6565 return -EINVAL; in hwsim_get_radio_nl()
6566 idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]); in hwsim_get_radio_nl()
6570 if (data->idx != idx) in hwsim_get_radio_nl()
6573 if (!net_eq(wiphy_net(data->hw->wiphy), genl_info_net(info))) in hwsim_get_radio_nl()
6578 res = -ENOMEM; in hwsim_get_radio_nl()
6582 res = mac80211_hwsim_get_radio(skb, data, info->snd_portid, in hwsim_get_radio_nl()
6583 info->snd_seq, NULL, 0); in hwsim_get_radio_nl()
6602 int last_idx = cb->args[0] - 1; in hwsim_dump_radio_nl()
6608 cb->seq = hwsim_radios_generation; in hwsim_dump_radio_nl()
6610 if (last_idx >= hwsim_radio_idx-1) in hwsim_dump_radio_nl()
6614 if (data->idx <= last_idx) in hwsim_dump_radio_nl()
6617 if (!net_eq(wiphy_net(data->hw->wiphy), sock_net(skb->sk))) in hwsim_dump_radio_nl()
6621 NETLINK_CB(cb->skb).portid, in hwsim_dump_radio_nl()
6622 cb->nlh->nlmsg_seq, cb, in hwsim_dump_radio_nl()
6627 last_idx = data->idx; in hwsim_dump_radio_nl()
6630 cb->args[0] = last_idx + 1; in hwsim_dump_radio_nl()
6633 if (skb->len == 0 && cb->prev_seq && cb->seq != cb->prev_seq) { in hwsim_dump_radio_nl()
6634 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, in hwsim_dump_radio_nl()
6635 cb->nlh->nlmsg_seq, &hwsim_genl_family, in hwsim_dump_radio_nl()
6641 res = -EMSGSIZE; in hwsim_dump_radio_nl()
6647 return res ?: skb->len; in hwsim_dump_radio_nl()
6714 if (entry->destroy_on_close && entry->portid == portid && in remove_user_radios()
6715 entry->netgroup == netgroup) { in remove_user_radios()
6716 list_move(&entry->list, &list); in remove_user_radios()
6717 rhashtable_remove_fast(&hwsim_radios_rht, &entry->rht, in remove_user_radios()
6725 list_del(&entry->list); in remove_user_radios()
6726 mac80211_hwsim_del_radio(entry, wiphy_name(entry->hw->wiphy), in remove_user_radios()
6740 remove_user_radios(notify->portid, hwsim_net_get_netgroup(notify->net)); in mac80211_hwsim_netlink_notify()
6742 if (notify->portid == hwsim_net_get_wmediumd(notify->net)) { in mac80211_hwsim_netlink_notify()
6745 hwsim_register_wmediumd(notify->net, 0); in mac80211_hwsim_netlink_notify()
6775 return -EINVAL; in hwsim_init_netlink()
6790 if (!net_eq(wiphy_net(data->hw->wiphy), net)) in hwsim_exit_net()
6794 if (data->netgroup == hwsim_net_get_netgroup(&init_net)) in hwsim_exit_net()
6797 list_move(&data->list, &list); in hwsim_exit_net()
6798 rhashtable_remove_fast(&hwsim_radios_rht, &data->rht, in hwsim_exit_net()
6805 list_del(&data->list); in hwsim_exit_net()
6807 wiphy_name(data->hw->wiphy), in hwsim_exit_net()
6853 if (skb->len < nlh->nlmsg_len) in hwsim_virtio_handle_cmd()
6854 return -EINVAL; in hwsim_virtio_handle_cmd()
6865 switch (gnlh->cmd) { in hwsim_virtio_handle_cmd()
6876 pr_err_ratelimited("hwsim: invalid cmd: %d\n", gnlh->cmd); in hwsim_virtio_handle_cmd()
6877 return -EPROTO; in hwsim_virtio_handle_cmd()
6900 skb->data = skb->head; in hwsim_virtio_rx_work()
6911 sg_init_one(sg, skb->head, skb_end_offset(skb)); in hwsim_virtio_rx_work()
6948 return -ENOMEM; in fill_vq()
6950 sg_init_one(sg, skb->head, skb_end_offset(skb)); in fill_vq()
6975 vdev->config->del_vqs(vdev); in remove_vqs()
6986 return -EEXIST; in hwsim_virtio_probe()
7060 return -EINVAL; in init_mac80211_hwsim()
7063 return -EINVAL; in init_mac80211_hwsim()
7182 err = -ENOMEM; in init_mac80211_hwsim()
7187 err = dev_alloc_name(hwsim_mon, hwsim_mon->name); in init_mac80211_hwsim()