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

3  * Copyright (c) 2002-2015, Jouni Malinen <j@w1.fi>
4 * Copyright (c) 2003-2004, Instant802 Networks, Inc.
5 * Copyright (c) 2005-2006, Devicescape Software, Inc.
7 * Copyright (c) 2009-2010, Atheros Communications
27 #include "common/qca-vendor.h"
28 #include "common/qca-vendor-attr.h"
57 NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1
176 #define IFIDX_ANY -1
254 for (bss = drv->first_bss; bss; bss = bss->next) { in get_bss_ifindex()
255 if (bss->ifindex == ifindex) in get_bss_ifindex()
271 if (drv->associated) in nl80211_mark_disconnected()
272 os_memcpy(drv->prev_bssid, drv->bssid, ETH_ALEN); in nl80211_mark_disconnected()
273 drv->associated = 0; in nl80211_mark_disconnected()
274 os_memset(&drv->sta_mlo_info, 0, sizeof(drv->sta_mlo_info)); in nl80211_mark_disconnected()
275 os_memset(drv->bssid, 0, ETH_ALEN); in nl80211_mark_disconnected()
276 drv->first_bss->flink->freq = 0; in nl80211_mark_disconnected()
278 os_free(drv->pending_roam_data); in nl80211_mark_disconnected()
279 drv->pending_roam_data = NULL; in nl80211_mark_disconnected()
280 os_free(drv->pending_t2lm_data); in nl80211_mark_disconnected()
281 drv->pending_t2lm_data = NULL; in nl80211_mark_disconnected()
282 os_free(drv->pending_link_reconfig_data); in nl80211_mark_disconnected()
283 drv->pending_link_reconfig_data = NULL; in nl80211_mark_disconnected()
286 drv->auth_mld = false; in nl80211_mark_disconnected()
287 drv->auth_mld_link_id = -1; in nl80211_mark_disconnected()
288 os_memset(drv->auth_ap_mld_addr, 0, ETH_ALEN); in nl80211_mark_disconnected()
311 u64 *cookie = ext_arg->ext_data; in ack_handler_cookie()
315 *ext_arg->err = 0; in ack_handler_cookie()
321 if (nlmsg_hdr(msg)->nlmsg_len <= ack_len) in ack_handler_cookie()
324 attr_len = nlmsg_hdr(msg)->nlmsg_len - ack_len; in ack_handler_cookie()
326 if(!(nlmsg_hdr(msg)->nlmsg_flags & NLM_F_ACK_TLVS)) in ack_handler_cookie()
354 struct nlmsghdr *nlh = (struct nlmsghdr *) err - 1; in error_handler()
355 struct nlmsghdr *orig_nlh = nlmsg_hdr(err_args->orig_msg); in error_handler()
356 int len = nlh->nlmsg_len; in error_handler()
364 err_args->err = err->error; in error_handler()
365 if (err_args->err_info) in error_handler()
366 err_args->err_info->link_id = -1; in error_handler()
368 if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS)) in error_handler()
371 if (!(nlh->nlmsg_flags & NLM_F_CAPPED)) in error_handler()
372 ack_len += err->msg.nlmsg_len - sizeof(*nlh); in error_handler()
378 len -= ack_len; in error_handler()
388 if (!err_args->err_info) in error_handler()
391 /* Check if it was a per-link error report */ in error_handler()
394 os_memcmp(orig_nlh, &err->msg, sizeof(err->msg)) != 0) in error_handler()
406 size_t link_offset = (u8 *) link_attr - (u8 *) orig_nlh; in error_handler()
409 offset >= link_offset + link_attr->nla_len) in error_handler()
415 err_args->err_info->link_id = nla_get_u8(link_id); in error_handler()
418 err_args->err_info->link_id); in error_handler()
448 int len = hdr->nlmsg_len - NLMSG_HDRLEN; in nl80211_nlmsg_clear()
461 int err = -NLE_NOMEM; in send_event_marker()
471 handle = (void *) (((intptr_t) drv->global->nl_event) ^ in send_event_marker()
479 res = hdr->nlmsg_seq; in send_event_marker()
503 return -ENOMEM; in send_and_recv()
505 err.err = -ENOMEM; in send_and_recv()
531 err.err = -EBADF; in send_and_recv()
544 ext_arg->err = &err.err; in send_and_recv()
558 if (res == -NLE_DUMP_INTR) { in send_and_recv()
568 wpa_printf(MSG_DEBUG, "nl80211: %s; convert to -EAGAIN", in send_and_recv()
570 err.err = -EAGAIN; in send_and_recv()
573 "nl80211: %s->nl_recvmsgs failed: %d (%s)", in send_and_recv()
591 ((drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) && in nl80211_put_control_port()
594 return -1; in nl80211_put_control_port()
625 res->group, in family_handler()
628 res->id = nla_get_u32(tb2[CTRL_ATTR_MCAST_GRP_ID]); in family_handler()
641 struct family_data res = { group, -ENOENT }; in nl_get_multicast_id()
645 return -ENOMEM; in nl_get_multicast_id()
646 if (!genlmsg_put(msg, 0, 0, global->nlctrl_id, in nl_get_multicast_id()
650 return -1; in nl_get_multicast_id()
653 ret = send_and_recv(global, global->nl, msg, family_handler, &res, in nl_get_multicast_id()
666 return genlmsg_put(msg, 0, 0, drv->global->nl80211_id, in nl80211_cmd()
673 if (bss->wdev_id_set) in nl80211_set_iface_id()
674 return nla_put_u64(msg, NL80211_ATTR_WDEV, bss->wdev_id); in nl80211_set_iface_id()
675 return nla_put_u32(msg, NL80211_ATTR_IFINDEX, bss->ifindex); in nl80211_set_iface_id()
687 if (!nl80211_cmd(bss->drv, msg, flags, cmd) || in nl80211_cmd_msg()
727 return nl80211_ifindex_msg(drv, drv->ifindex, flags, cmd); in nl80211_drv_msg()
733 return nl80211_ifindex_msg(bss->drv, bss->ifindex, flags, cmd); in nl80211_bss_msg()
755 info->wiphy_idx = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in netdev_info_handler()
758 info->nlmode = nla_get_u32(tb[NL80211_ATTR_IFTYPE]); in netdev_info_handler()
760 if (tb[NL80211_ATTR_MAC] && info->macaddr) in netdev_info_handler()
761 os_memcpy(info->macaddr, nla_data(tb[NL80211_ATTR_MAC]), in netdev_info_handler()
765 info->use_4addr = nla_get_u8(tb[NL80211_ATTR_4ADDR]); in netdev_info_handler()
775 .wiphy_idx = -1, in nl80211_get_wiphy_index()
780 return -1; in nl80211_get_wiphy_index()
782 if (send_and_recv_resp(bss->drv, msg, netdev_info_handler, &data) == 0) in nl80211_get_wiphy_index()
784 return -1; in nl80211_get_wiphy_index()
799 if (send_and_recv_resp(bss->drv, msg, netdev_info_handler, &data) == 0) in nl80211_get_ifmode()
809 .macaddr = bss->addr, in nl80211_get_macaddr()
813 return -1; in nl80211_get_macaddr()
815 return send_and_recv_resp(bss->drv, msg, netdev_info_handler, &data); in nl80211_get_macaddr()
827 send_and_recv_resp(bss->drv, msg, netdev_info_handler, &data)) in nl80211_get_4addr()
828 return -1; in nl80211_get_4addr()
841 return -1; in nl80211_register_beacons()
844 nla_put_u32(msg, NL80211_ATTR_WIPHY, w->wiphy_idx)) { in nl80211_register_beacons()
846 return -1; in nl80211_register_beacons()
849 ret = send_and_recv(drv->global, w->nl_beacons, msg, NULL, NULL, in nl80211_register_beacons()
854 ret, strerror(-ret)); in nl80211_register_beacons()
867 res = nl_recvmsgs(handle, w->nl_cb); in nl80211_recv_beacons()
869 wpa_printf(MSG_INFO, "nl80211: %s->nl_recvmsgs failed: %d", in nl80211_recv_beacons()
886 if (gnlh->cmd != NL80211_CMD_FRAME) { in process_beacon_event()
888 gnlh->cmd); in process_beacon_event()
895 dl_list_for_each(drv, &w->drvs, struct wpa_driver_nl80211_data, in process_beacon_event()
900 wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event); in process_beacon_event()
916 if (bss->wiphy_data != NULL) in nl80211_get_wiphy_data_ap()
917 return bss->wiphy_data; in nl80211_get_wiphy_data_ap()
922 if (w->wiphy_idx == wiphy_idx) in nl80211_get_wiphy_data_ap()
930 w->wiphy_idx = wiphy_idx; in nl80211_get_wiphy_data_ap()
931 dl_list_init(&w->bsss); in nl80211_get_wiphy_data_ap()
932 dl_list_init(&w->drvs); in nl80211_get_wiphy_data_ap()
935 if (ieee80211_freq_to_chan(bss->flink->freq, &channel) != in nl80211_get_wiphy_data_ap()
937 w->nl_cb = nl_cb_alloc(NL_CB_DEFAULT); in nl80211_get_wiphy_data_ap()
938 if (!w->nl_cb) { in nl80211_get_wiphy_data_ap()
942 nl_cb_set(w->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, in nl80211_get_wiphy_data_ap()
944 nl_cb_set(w->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, in nl80211_get_wiphy_data_ap()
947 w->nl_beacons = nl_create_handle(bss->drv->global->nl_cb, in nl80211_get_wiphy_data_ap()
949 if (w->nl_beacons == NULL) { in nl80211_get_wiphy_data_ap()
954 if (nl80211_register_beacons(bss->drv, w)) { in nl80211_get_wiphy_data_ap()
955 nl_destroy_handles(&w->nl_beacons); in nl80211_get_wiphy_data_ap()
960 nl80211_register_eloop_read(&w->nl_beacons, in nl80211_get_wiphy_data_ap()
964 dl_list_add(&nl80211_wiphys, &w->list); in nl80211_get_wiphy_data_ap()
968 dl_list_for_each(tmp_bss, &w->bsss, struct i802_bss, wiphy_list) { in nl80211_get_wiphy_data_ap()
969 if (tmp_bss->drv == bss->drv) { in nl80211_get_wiphy_data_ap()
976 dl_list_add(&w->drvs, &bss->drv->wiphy_list); in nl80211_get_wiphy_data_ap()
978 dl_list_add(&w->bsss, &bss->wiphy_list); in nl80211_get_wiphy_data_ap()
979 bss->wiphy_data = w; in nl80211_get_wiphy_data_ap()
986 struct nl80211_wiphy_data *w = bss->wiphy_data; in nl80211_put_wiphy_data_ap()
992 bss->wiphy_data = NULL; in nl80211_put_wiphy_data_ap()
993 dl_list_del(&bss->wiphy_list); in nl80211_put_wiphy_data_ap()
996 dl_list_for_each(tmp_bss, &w->bsss, struct i802_bss, wiphy_list) { in nl80211_put_wiphy_data_ap()
997 if (tmp_bss->drv == bss->drv) { in nl80211_put_wiphy_data_ap()
1004 dl_list_del(&bss->drv->wiphy_list); in nl80211_put_wiphy_data_ap()
1006 if (!dl_list_empty(&w->bsss)) in nl80211_put_wiphy_data_ap()
1009 if (w->nl_beacons) in nl80211_put_wiphy_data_ap()
1010 nl80211_destroy_eloop_handle(&w->nl_beacons, 0); in nl80211_put_wiphy_data_ap()
1012 nl_cb_put(w->nl_cb); in nl80211_put_wiphy_data_ap()
1013 dl_list_del(&w->list); in nl80211_put_wiphy_data_ap()
1021 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_ifindex()
1023 return drv->ifindex; in nl80211_get_ifindex()
1030 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_get_bssid()
1031 if (!drv->associated) in wpa_driver_nl80211_get_bssid()
1032 return -1; in wpa_driver_nl80211_get_bssid()
1033 os_memcpy(bssid, drv->bssid, ETH_ALEN); in wpa_driver_nl80211_get_bssid()
1041 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_get_ssid()
1042 if (!drv->associated) in wpa_driver_nl80211_get_ssid()
1043 return -1; in wpa_driver_nl80211_get_ssid()
1044 os_memcpy(ssid, drv->ssid, drv->ssid_len); in wpa_driver_nl80211_get_ssid()
1045 return drv->ssid_len; in wpa_driver_nl80211_get_ssid()
1067 info->valid_links = 0; in get_mlo_info()
1082 info->valid_links |= BIT(link_id); in get_mlo_info()
1083 os_memcpy(info->links[link_id].addr, in get_mlo_info()
1086 info->links[link_id].freq = in get_mlo_info()
1098 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_sta_mlo_info()
1100 if (!drv->associated) in nl80211_get_sta_mlo_info()
1101 return -1; in nl80211_get_sta_mlo_info()
1103 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) { in nl80211_get_sta_mlo_info()
1108 &drv->sta_mlo_info)) in nl80211_get_sta_mlo_info()
1109 return -1; in nl80211_get_sta_mlo_info()
1112 os_memcpy(mlo_info, &drv->sta_mlo_info, sizeof(*mlo_info)); in nl80211_get_sta_mlo_info()
1123 if (drv && os_strcmp(drv->first_bss->ifname, ifname) == 0) { in wpa_driver_nl80211_event_newlink()
1124 if (if_nametoindex(drv->first_bss->ifname) == 0) { in wpa_driver_nl80211_event_newlink()
1125 wpa_printf(MSG_DEBUG, "nl80211: Interface %s does not exist - ignore RTM_NEWLINK", in wpa_driver_nl80211_event_newlink()
1126 drv->first_bss->ifname); in wpa_driver_nl80211_event_newlink()
1129 if (!drv->if_removed) in wpa_driver_nl80211_event_newlink()
1132 drv->first_bss->ifname); in wpa_driver_nl80211_event_newlink()
1133 drv->if_removed = 0; in wpa_driver_nl80211_event_newlink()
1142 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event); in wpa_driver_nl80211_event_newlink()
1144 wpa_supplicant_event_global(global->ctx, EVENT_INTERFACE_STATUS, in wpa_driver_nl80211_event_newlink()
1155 if (drv && os_strcmp(drv->first_bss->ifname, ifname) == 0) { in wpa_driver_nl80211_event_dellink()
1156 if (drv->if_removed) { in wpa_driver_nl80211_event_dellink()
1157 wpa_printf(MSG_DEBUG, "nl80211: if_removed already set - ignore RTM_DELLINK event for %s", in wpa_driver_nl80211_event_dellink()
1161 wpa_printf(MSG_DEBUG, "RTM_DELLINK: Interface '%s' removed - mark if_removed=1", in wpa_driver_nl80211_event_dellink()
1163 drv->if_removed = 1; in wpa_driver_nl80211_event_dellink()
1175 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event); in wpa_driver_nl80211_event_dellink()
1177 wpa_supplicant_event_global(global->ctx, EVENT_INTERFACE_STATUS, in wpa_driver_nl80211_event_dellink()
1193 if (attr->rta_type == IFLA_IFNAME) { in wpa_driver_nl80211_own_ifname()
1195 drv->first_bss->ifname) == 0) in wpa_driver_nl80211_own_ifname()
1210 if (drv->ifindex == ifindex) in wpa_driver_nl80211_own_ifindex()
1213 if (drv->if_removed && wpa_driver_nl80211_own_ifname(drv, buf, len)) { in wpa_driver_nl80211_own_ifindex()
1214 nl80211_check_global(drv->global); in wpa_driver_nl80211_own_ifindex()
1218 return -1; in wpa_driver_nl80211_own_ifindex()
1235 dl_list_for_each(drv, &global->interfaces, in nl80211_find_drv()
1260 linux_get_ifhwaddr(drv->global->ioctl_sock, in nl80211_refresh_mac()
1261 bss->ifname, addr) < 0) { in nl80211_refresh_mac()
1263 "nl80211: %s: failed to re-read MAC address", in nl80211_refresh_mac()
1264 bss->ifname); in nl80211_refresh_mac()
1265 } else if (bss && !ether_addr_equal(addr, bss->addr)) { in nl80211_refresh_mac()
1269 ifindex, bss->ifname, in nl80211_refresh_mac()
1270 MAC2STR(bss->addr), MAC2STR(addr)); in nl80211_refresh_mac()
1271 os_memcpy(bss->prev_addr, bss->addr, ETH_ALEN); in nl80211_refresh_mac()
1272 os_memcpy(bss->addr, addr, ETH_ALEN); in nl80211_refresh_mac()
1274 wpa_supplicant_event(drv->ctx, in nl80211_refresh_mac()
1302 switch (attr->rta_type) { in wpa_driver_nl80211_event_rtm_newlink()
1311 pos += os_snprintf(pos, end - pos, " master=%u", brid); in wpa_driver_nl80211_event_rtm_newlink()
1314 pos += os_snprintf(pos, end - pos, " wext"); in wpa_driver_nl80211_event_rtm_newlink()
1317 pos += os_snprintf(pos, end - pos, " operstate=%u", in wpa_driver_nl80211_event_rtm_newlink()
1321 pos += os_snprintf(pos, end - pos, " linkmode=%u", in wpa_driver_nl80211_event_rtm_newlink()
1327 extra[sizeof(extra) - 1] = '\0'; in wpa_driver_nl80211_event_rtm_newlink()
1330 ifi->ifi_index, ifname, extra, ifi->ifi_family, in wpa_driver_nl80211_event_rtm_newlink()
1331 ifi->ifi_flags, in wpa_driver_nl80211_event_rtm_newlink()
1332 (ifi->ifi_flags & IFF_UP) ? "[UP]" : "", in wpa_driver_nl80211_event_rtm_newlink()
1333 (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "", in wpa_driver_nl80211_event_rtm_newlink()
1334 (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "", in wpa_driver_nl80211_event_rtm_newlink()
1335 (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : ""); in wpa_driver_nl80211_event_rtm_newlink()
1337 drv = nl80211_find_drv(global, ifi->ifi_index, buf, len, &init_failed); in wpa_driver_nl80211_event_rtm_newlink()
1343 if (!drv->if_disabled && !(ifi->ifi_flags & IFF_UP)) { in wpa_driver_nl80211_event_rtm_newlink()
1345 if (if_indextoname(ifi->ifi_index, namebuf) && in wpa_driver_nl80211_event_rtm_newlink()
1346 linux_iface_up(drv->global->ioctl_sock, namebuf) > 0) { in wpa_driver_nl80211_event_rtm_newlink()
1349 drv->ignore_if_down_event = 0; in wpa_driver_nl80211_event_rtm_newlink()
1350 /* Re-read MAC address as it may have changed */ in wpa_driver_nl80211_event_rtm_newlink()
1351 nl80211_refresh_mac(drv, ifi->ifi_index, 1); in wpa_driver_nl80211_event_rtm_newlink()
1356 if (os_strcmp(drv->first_bss->ifname, ifname) != 0) { in wpa_driver_nl80211_event_rtm_newlink()
1358 "nl80211: Not the main interface (%s) - do not indicate interface down", in wpa_driver_nl80211_event_rtm_newlink()
1359 drv->first_bss->ifname); in wpa_driver_nl80211_event_rtm_newlink()
1360 } else if (drv->ignore_if_down_event) { in wpa_driver_nl80211_event_rtm_newlink()
1363 drv->ignore_if_down_event = 0; in wpa_driver_nl80211_event_rtm_newlink()
1365 drv->if_disabled = 1; in wpa_driver_nl80211_event_rtm_newlink()
1366 wpa_supplicant_event(drv->ctx, in wpa_driver_nl80211_event_rtm_newlink()
1374 drv = nl80211_find_drv(global, ifi->ifi_index, in wpa_driver_nl80211_event_rtm_newlink()
1381 if (drv->if_disabled && (ifi->ifi_flags & IFF_UP)) { in wpa_driver_nl80211_event_rtm_newlink()
1383 if (if_indextoname(ifi->ifi_index, namebuf) && in wpa_driver_nl80211_event_rtm_newlink()
1384 linux_iface_up(drv->global->ioctl_sock, namebuf) == 0) { in wpa_driver_nl80211_event_rtm_newlink()
1392 if (os_strcmp(drv->first_bss->ifname, ifname) != 0) { in wpa_driver_nl80211_event_rtm_newlink()
1394 "nl80211: Not the main interface (%s) - do not indicate interface up", in wpa_driver_nl80211_event_rtm_newlink()
1395 drv->first_bss->ifname); in wpa_driver_nl80211_event_rtm_newlink()
1396 } else if (if_nametoindex(drv->first_bss->ifname) == 0) { in wpa_driver_nl80211_event_rtm_newlink()
1399 drv->first_bss->ifname); in wpa_driver_nl80211_event_rtm_newlink()
1400 } else if (drv->if_removed) { in wpa_driver_nl80211_event_rtm_newlink()
1403 "removed", drv->first_bss->ifname); in wpa_driver_nl80211_event_rtm_newlink()
1405 /* Re-read MAC address as it may have changed */ in wpa_driver_nl80211_event_rtm_newlink()
1406 nl80211_refresh_mac(drv, ifi->ifi_index, 0); in wpa_driver_nl80211_event_rtm_newlink()
1408 drv->if_disabled = 0; in wpa_driver_nl80211_event_rtm_newlink()
1409 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, in wpa_driver_nl80211_event_rtm_newlink()
1415 * Some drivers send the association event before the operup event--in in wpa_driver_nl80211_event_rtm_newlink()
1420 if (drv->operstate == 1 && in wpa_driver_nl80211_event_rtm_newlink()
1421 (ifi->ifi_flags & (IFF_LOWER_UP | IFF_DORMANT)) == IFF_LOWER_UP && in wpa_driver_nl80211_event_rtm_newlink()
1422 !(ifi->ifi_flags & IFF_RUNNING)) { in wpa_driver_nl80211_event_rtm_newlink()
1424 netlink_send_oper_ifla(drv->global->netlink, drv->ifindex, in wpa_driver_nl80211_event_rtm_newlink()
1425 -1, IF_OPER_UP); in wpa_driver_nl80211_event_rtm_newlink()
1430 wpa_driver_nl80211_event_newlink(global, drv, ifi->ifi_index, in wpa_driver_nl80211_event_rtm_newlink()
1433 if (ifi->ifi_family == AF_BRIDGE && brid && drv) { in wpa_driver_nl80211_event_rtm_newlink()
1445 add_ifidx(drv, brid, ifi->ifi_index); in wpa_driver_nl80211_event_rtm_newlink()
1447 for (bss = drv->first_bss; bss; bss = bss->next) { in wpa_driver_nl80211_event_rtm_newlink()
1448 if (os_strcmp(ifname, bss->ifname) == 0) { in wpa_driver_nl80211_event_rtm_newlink()
1449 os_strlcpy(bss->brname, namebuf, IFNAMSIZ); in wpa_driver_nl80211_event_rtm_newlink()
1477 switch (attr->rta_type) { in wpa_driver_nl80211_event_rtm_dellink()
1486 pos += os_snprintf(pos, end - pos, " master=%u", brid); in wpa_driver_nl80211_event_rtm_dellink()
1489 pos += os_snprintf(pos, end - pos, " operstate=%u", in wpa_driver_nl80211_event_rtm_dellink()
1493 pos += os_snprintf(pos, end - pos, " linkmode=%u", in wpa_driver_nl80211_event_rtm_dellink()
1499 extra[sizeof(extra) - 1] = '\0'; in wpa_driver_nl80211_event_rtm_dellink()
1502 ifi->ifi_index, ifname, extra, ifi->ifi_family, in wpa_driver_nl80211_event_rtm_dellink()
1503 ifi->ifi_flags, in wpa_driver_nl80211_event_rtm_dellink()
1504 (ifi->ifi_flags & IFF_UP) ? "[UP]" : "", in wpa_driver_nl80211_event_rtm_dellink()
1505 (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "", in wpa_driver_nl80211_event_rtm_dellink()
1506 (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "", in wpa_driver_nl80211_event_rtm_dellink()
1507 (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : ""); in wpa_driver_nl80211_event_rtm_dellink()
1509 drv = nl80211_find_drv(global, ifi->ifi_index, buf, len, NULL); in wpa_driver_nl80211_event_rtm_dellink()
1511 if (ifi->ifi_family == AF_BRIDGE && brid && drv) { in wpa_driver_nl80211_event_rtm_dellink()
1524 del_ifidx(drv, brid, ifi->ifi_index); in wpa_driver_nl80211_event_rtm_dellink()
1527 if (ifi->ifi_family != AF_BRIDGE || !brid) in wpa_driver_nl80211_event_rtm_dellink()
1528 wpa_driver_nl80211_event_dellink(global, drv, ifi->ifi_index, in wpa_driver_nl80211_event_rtm_dellink()
1558 struct wpa_driver_nl80211_data *drv = ctx->drv; in nl80211_get_assoc_freq_handler()
1571 int link_id = -1; in nl80211_get_assoc_freq_handler()
1578 ctx->freq[link_id] = freq; in nl80211_get_assoc_freq_handler()
1581 link_id, ctx->freq[link_id]); in nl80211_get_assoc_freq_handler()
1584 if (!drv->sta_mlo_info.valid_links || in nl80211_get_assoc_freq_handler()
1585 drv->sta_mlo_info.assoc_link_id == link_id) { in nl80211_get_assoc_freq_handler()
1586 ctx->assoc_freq = freq; in nl80211_get_assoc_freq_handler()
1588 ctx->assoc_freq); in nl80211_get_assoc_freq_handler()
1593 ctx->ibss_freq = nla_get_u32(bss[NL80211_BSS_FREQUENCY]); in nl80211_get_assoc_freq_handler()
1594 wpa_printf(MSG_DEBUG, "nl80211: IBSS-joined on %u MHz", in nl80211_get_assoc_freq_handler()
1595 ctx->ibss_freq); in nl80211_get_assoc_freq_handler()
1599 int link_id = -1; in nl80211_get_assoc_freq_handler()
1606 os_memcpy(ctx->bssid[link_id], bssid, ETH_ALEN); in nl80211_get_assoc_freq_handler()
1612 if (!drv->sta_mlo_info.valid_links || in nl80211_get_assoc_freq_handler()
1613 drv->sta_mlo_info.assoc_link_id == link_id) { in nl80211_get_assoc_freq_handler()
1614 os_memcpy(ctx->assoc_bssid, bssid, ETH_ALEN); in nl80211_get_assoc_freq_handler()
1630 ctx->assoc_ssid_len = ssid[1]; in nl80211_get_assoc_freq_handler()
1631 os_memcpy(ctx->assoc_ssid, ssid + 2, ssid[1]); in nl80211_get_assoc_freq_handler()
1652 if (ret == -EAGAIN) { in nl80211_get_assoc_ssid()
1659 "nl80211: Failed to receive consistent scan result dump for get_assoc_ssid - try again"); in nl80211_get_assoc_ssid()
1668 ret, strerror(-ret)); in nl80211_get_assoc_ssid()
1686 if (ret == -EAGAIN) { in nl80211_get_assoc_freq()
1693 "nl80211: Failed to receive consistent scan result dump for get_assoc_freq - try again"); in nl80211_get_assoc_freq()
1698 unsigned int freq = drv->nlmode == NL80211_IFTYPE_ADHOC ? in nl80211_get_assoc_freq()
1703 drv->assoc_freq = freq; in nl80211_get_assoc_freq()
1705 if (drv->sta_mlo_info.valid_links) { in nl80211_get_assoc_freq()
1709 drv->sta_mlo_info.links[i].freq = arg.freq[i]; in nl80211_get_assoc_freq()
1712 return drv->assoc_freq; in nl80211_get_assoc_freq()
1715 "(%s)", ret, strerror(-ret)); in nl80211_get_assoc_freq()
1716 return drv->assoc_freq; in nl80211_get_assoc_freq()
1751 sig_change->frequency) in get_link_noise()
1757 sig_change->current_noise = in get_link_noise()
1769 sig_change->current_noise = WPA_INVALID_NOISE; in nl80211_get_link_noise()
1770 sig_change->frequency = drv->assoc_freq; in nl80211_get_link_noise()
1787 chan_info->chanwidth = CHAN_WIDTH_UNKNOWN; in get_channel_info()
1790 chan_info->frequency = in get_channel_info()
1793 chan_info->chanwidth = convert2width( in get_channel_info()
1801 chan_info->sec_channel = -1; in get_channel_info()
1804 chan_info->sec_channel = 1; in get_channel_info()
1807 chan_info->sec_channel = 0; in get_channel_info()
1812 chan_info->center_frq1 = in get_channel_info()
1815 chan_info->center_frq2 = in get_channel_info()
1818 if (chan_info->center_frq2) { in get_channel_info()
1821 if (ieee80211_freq_to_chan(chan_info->center_frq2, &seg1_idx) != in get_channel_info()
1823 chan_info->seg1_idx = seg1_idx; in get_channel_info()
1833 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_channel_info()
1851 wpa_printf(MSG_INFO, "nl80211: %s->nl_recvmsgs failed: %d", in wpa_driver_nl80211_event_receive()
1858 * wpa_driver_nl80211_set_country - ask nl80211 to set the regulatory domain
1861 * Returns: 0 on success, -1 on failure
1869 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_set_country()
1875 return -ENOMEM; in wpa_driver_nl80211_set_country()
1884 return -EINVAL; in wpa_driver_nl80211_set_country()
1887 return -EINVAL; in wpa_driver_nl80211_set_country()
1912 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_get_country()
1918 return -ENOMEM; in wpa_driver_nl80211_get_country()
1922 if (drv->capa.flags & WPA_DRIVER_FLAGS_SELF_MANAGED_REGULATORY) { in wpa_driver_nl80211_get_country()
1925 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, drv->wiphy_idx)) { in wpa_driver_nl80211_get_country()
1927 return -1; in wpa_driver_nl80211_get_country()
1934 ret = -1; in wpa_driver_nl80211_get_country()
1946 global->nl_cb = nl_cb_alloc(NL_CB_DEFAULT); in wpa_driver_nl80211_init_nl_global()
1947 if (global->nl_cb == NULL) { in wpa_driver_nl80211_init_nl_global()
1950 return -1; in wpa_driver_nl80211_init_nl_global()
1953 global->nl = nl_create_handle(global->nl_cb, "nl"); in wpa_driver_nl80211_init_nl_global()
1954 if (global->nl == NULL) in wpa_driver_nl80211_init_nl_global()
1957 global->nl80211_id = genl_ctrl_resolve(global->nl, "nl80211"); in wpa_driver_nl80211_init_nl_global()
1958 if (global->nl80211_id < 0) { in wpa_driver_nl80211_init_nl_global()
1964 global->nlctrl_id = genl_ctrl_resolve(global->nl, "nlctrl"); in wpa_driver_nl80211_init_nl_global()
1965 if (global->nlctrl_id < 0) { in wpa_driver_nl80211_init_nl_global()
1971 global->nl_event = nl_create_handle(global->nl_cb, "event"); in wpa_driver_nl80211_init_nl_global()
1972 if (global->nl_event == NULL) in wpa_driver_nl80211_init_nl_global()
1977 ret = nl_socket_add_membership(global->nl_event, ret); in wpa_driver_nl80211_init_nl_global()
1987 ret = nl_socket_add_membership(global->nl_event, ret); in wpa_driver_nl80211_init_nl_global()
1997 ret = nl_socket_add_membership(global->nl_event, ret); in wpa_driver_nl80211_init_nl_global()
2007 ret = nl_socket_add_membership(global->nl_event, ret); in wpa_driver_nl80211_init_nl_global()
2016 ret = genl_ctrl_alloc_cache(global->nl, &cache); in wpa_driver_nl80211_init_nl_global()
2024 family = genl_ctrl_search(cache, global->nl80211_id); in wpa_driver_nl80211_init_nl_global()
2032 global->nl80211_maxattr = genl_family_get_maxattr(family); in wpa_driver_nl80211_init_nl_global()
2034 global->nl80211_maxattr); in wpa_driver_nl80211_init_nl_global()
2038 nl_cb_set(global->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, in wpa_driver_nl80211_init_nl_global()
2040 nl_cb_set(global->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, in wpa_driver_nl80211_init_nl_global()
2043 nl80211_register_eloop_read(&global->nl_event, in wpa_driver_nl80211_init_nl_global()
2045 global->nl_cb, 0); in wpa_driver_nl80211_init_nl_global()
2052 nl_destroy_handles(&global->nl_event); in wpa_driver_nl80211_init_nl_global()
2053 nl_destroy_handles(&global->nl); in wpa_driver_nl80211_init_nl_global()
2054 nl_cb_put(global->nl_cb); in wpa_driver_nl80211_init_nl_global()
2055 global->nl_cb = NULL; in wpa_driver_nl80211_init_nl_global()
2056 return -1; in wpa_driver_nl80211_init_nl_global()
2068 * Try to re-add memberships to handle case of cfg80211 getting reloaded in nl80211_check_global()
2071 handle = (void *) (((intptr_t) global->nl_event) ^ in nl80211_check_global()
2080 "nl80211: Could not re-add multicast membership for %s events: %d (%s)", in nl80211_check_global()
2097 if (drv->nlmode == NL80211_IFTYPE_P2P_DEVICE) in wpa_driver_nl80211_rfkill_blocked()
2098 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED, NULL); in wpa_driver_nl80211_rfkill_blocked()
2106 if (i802_set_iface_flags(drv->first_bss, 1)) { in wpa_driver_nl80211_rfkill_unblocked()
2112 if (is_p2p_net_interface(drv->nlmode)) in wpa_driver_nl80211_rfkill_unblocked()
2113 nl80211_disable_11b_rates(drv, drv->ifindex, 1); in wpa_driver_nl80211_rfkill_unblocked()
2119 if (drv->nlmode == NL80211_IFTYPE_P2P_DEVICE) in wpa_driver_nl80211_rfkill_unblocked()
2120 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, NULL); in wpa_driver_nl80211_rfkill_unblocked()
2152 if (cmsg->cmsg_level == SOL_SOCKET && in wpa_driver_nl80211_handle_eapol_tx_status()
2153 cmsg->cmsg_type == SCM_WIFI_STATUS) { in wpa_driver_nl80211_handle_eapol_tx_status()
2161 if (cmsg->cmsg_level == SOL_PACKET && in wpa_driver_nl80211_handle_eapol_tx_status()
2162 cmsg->cmsg_type == PACKET_TX_TIMESTAMP) { in wpa_driver_nl80211_handle_eapol_tx_status()
2166 if (err->ee_origin == SO_EE_ORIGIN_TXSTATUS) in wpa_driver_nl80211_handle_eapol_tx_status()
2177 event.eapol_tx_status.data_len = res - 14; in wpa_driver_nl80211_handle_eapol_tx_status()
2179 wpa_supplicant_event(drv->ctx, EVENT_EAPOL_TX_STATUS, &event); in wpa_driver_nl80211_handle_eapol_tx_status()
2185 if (bss->nl_connect) { in nl80211_init_connect_handle()
2188 bss->nl_connect); in nl80211_init_connect_handle()
2189 return -1; in nl80211_init_connect_handle()
2192 bss->nl_connect = nl_create_handle(bss->nl_cb, "connect"); in nl80211_init_connect_handle()
2193 if (!bss->nl_connect) in nl80211_init_connect_handle()
2194 return -1; in nl80211_init_connect_handle()
2195 nl80211_register_eloop_read(&bss->nl_connect, in nl80211_init_connect_handle()
2197 bss->nl_cb, 1); in nl80211_init_connect_handle()
2204 bss->nl_cb = nl_cb_alloc(NL_CB_DEFAULT); in nl80211_init_bss()
2205 if (!bss->nl_cb) in nl80211_init_bss()
2206 return -1; in nl80211_init_bss()
2208 nl_cb_set(bss->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, in nl80211_init_bss()
2210 nl_cb_set(bss->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, in nl80211_init_bss()
2221 nl_cb_put(bss->nl_cb); in nl80211_destroy_bss()
2222 bss->nl_cb = NULL; in nl80211_destroy_bss()
2224 if (bss->nl_connect) in nl80211_destroy_bss()
2225 nl80211_destroy_eloop_handle(&bss->nl_connect, 1); in nl80211_destroy_bss()
2234 if (drv->rfkill) in wpa_driver_nl80211_drv_init_rfkill()
2241 rcfg->ctx = drv; in wpa_driver_nl80211_drv_init_rfkill()
2250 if (drv->nlmode == NL80211_IFTYPE_P2P_DEVICE) { in wpa_driver_nl80211_drv_init_rfkill()
2251 struct nl80211_global *global = drv->global; in wpa_driver_nl80211_drv_init_rfkill()
2254 dl_list_for_each(tmp1, &global->interfaces, in wpa_driver_nl80211_drv_init_rfkill()
2256 if (drv == tmp1 || drv->wiphy_idx != tmp1->wiphy_idx || in wpa_driver_nl80211_drv_init_rfkill()
2257 !tmp1->rfkill) in wpa_driver_nl80211_drv_init_rfkill()
2262 tmp1->first_bss->ifname); in wpa_driver_nl80211_drv_init_rfkill()
2263 os_strlcpy(rcfg->ifname, tmp1->first_bss->ifname, in wpa_driver_nl80211_drv_init_rfkill()
2264 sizeof(rcfg->ifname)); in wpa_driver_nl80211_drv_init_rfkill()
2268 os_strlcpy(rcfg->ifname, drv->first_bss->ifname, in wpa_driver_nl80211_drv_init_rfkill()
2269 sizeof(rcfg->ifname)); in wpa_driver_nl80211_drv_init_rfkill()
2272 rcfg->blocked_cb = wpa_driver_nl80211_rfkill_blocked; in wpa_driver_nl80211_drv_init_rfkill()
2273 rcfg->unblocked_cb = wpa_driver_nl80211_rfkill_unblocked; in wpa_driver_nl80211_drv_init_rfkill()
2274 drv->rfkill = rfkill_init(rcfg); in wpa_driver_nl80211_drv_init_rfkill()
2275 if (!drv->rfkill) { in wpa_driver_nl80211_drv_init_rfkill()
2315 drv->global = global_priv; in wpa_driver_nl80211_drv_init()
2316 drv->ctx = ctx; in wpa_driver_nl80211_drv_init()
2317 drv->hostapd = !!hostapd; in wpa_driver_nl80211_drv_init()
2318 drv->eapol_sock = -1; in wpa_driver_nl80211_drv_init()
2325 drv->set_rekey_offload = 1; in wpa_driver_nl80211_drv_init()
2327 drv->num_if_indices = ARRAY_SIZE(drv->default_if_indices); in wpa_driver_nl80211_drv_init()
2328 drv->if_indices = drv->default_if_indices; in wpa_driver_nl80211_drv_init()
2330 drv->first_bss = os_zalloc(sizeof(*drv->first_bss)); in wpa_driver_nl80211_drv_init()
2331 if (!drv->first_bss) { in wpa_driver_nl80211_drv_init()
2335 bss = drv->first_bss; in wpa_driver_nl80211_drv_init()
2336 bss->drv = drv; in wpa_driver_nl80211_drv_init()
2337 bss->ctx = ctx; in wpa_driver_nl80211_drv_init()
2339 os_strlcpy(bss->ifname, ifname, sizeof(bss->ifname)); in wpa_driver_nl80211_drv_init()
2340 drv->monitor_ifidx = -1; in wpa_driver_nl80211_drv_init()
2341 drv->monitor_sock = -1; in wpa_driver_nl80211_drv_init()
2342 drv->eapol_tx_sock = -1; in wpa_driver_nl80211_drv_init()
2343 drv->ap_scan_as_station = NL80211_IFTYPE_UNSPECIFIED; in wpa_driver_nl80211_drv_init()
2351 if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS) { in wpa_driver_nl80211_drv_init()
2352 drv->control_port_ap = 1; in wpa_driver_nl80211_drv_init()
2356 drv->eapol_tx_sock = socket(PF_PACKET, SOCK_DGRAM, 0); in wpa_driver_nl80211_drv_init()
2357 if (drv->eapol_tx_sock < 0) in wpa_driver_nl80211_drv_init()
2360 if (drv->data_tx_status) { in wpa_driver_nl80211_drv_init()
2363 if (setsockopt(drv->eapol_tx_sock, SOL_SOCKET, SO_WIFI_STATUS, in wpa_driver_nl80211_drv_init()
2368 drv->data_tx_status = 0; in wpa_driver_nl80211_drv_init()
2369 if (!drv->use_monitor) in wpa_driver_nl80211_drv_init()
2370 drv->capa.flags &= in wpa_driver_nl80211_drv_init()
2374 drv->eapol_tx_sock, in wpa_driver_nl80211_drv_init()
2381 if (drv->global) { in wpa_driver_nl80211_drv_init()
2382 nl80211_check_global(drv->global); in wpa_driver_nl80211_drv_init()
2383 dl_list_add(&drv->global->interfaces, &drv->list); in wpa_driver_nl80211_drv_init()
2384 drv->in_interface_list = 1; in wpa_driver_nl80211_drv_init()
2388 * Use link ID 0 for the single "link" of a non-MLD. in wpa_driver_nl80211_drv_init()
2390 bss->valid_links = 0; in wpa_driver_nl80211_drv_init()
2391 bss->flink = &bss->links[0]; in wpa_driver_nl80211_drv_init()
2392 os_memcpy(bss->flink->addr, bss->addr, ETH_ALEN); in wpa_driver_nl80211_drv_init()
2403 * wpa_driver_nl80211_init - Initialize nl80211 driver interface
2423 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_register_frame()
2439 return -1; in nl80211_register_frame()
2442 ret = send_and_recv(drv->global, nl_handle, msg, NULL, NULL, in nl80211_register_frame()
2447 type, ret, strerror(-ret)); in nl80211_register_frame()
2457 if (bss->nl_mgmt) { in nl80211_alloc_mgmt_handle()
2459 "already on! (nl_mgmt=%p)", bss->nl_mgmt); in nl80211_alloc_mgmt_handle()
2460 return -1; in nl80211_alloc_mgmt_handle()
2463 bss->nl_mgmt = nl_create_handle(bss->nl_cb, "mgmt"); in nl80211_alloc_mgmt_handle()
2464 if (bss->nl_mgmt == NULL) in nl80211_alloc_mgmt_handle()
2465 return -1; in nl80211_alloc_mgmt_handle()
2473 nl80211_register_eloop_read(&bss->nl_mgmt, in nl80211_mgmt_handle_register_eloop()
2475 bss->nl_cb, 0); in nl80211_mgmt_handle_register_eloop()
2484 return nl80211_register_frame(bss, bss->nl_mgmt, in nl80211_register_action_frame2()
2498 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_mgmt_subscribe_non_ap()
2503 return -1; in nl80211_mgmt_subscribe_non_ap()
2504 wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with non-AP " in nl80211_mgmt_subscribe_non_ap()
2505 "handle %p", bss->nl_mgmt); in nl80211_mgmt_subscribe_non_ap()
2507 if (drv->nlmode == NL80211_IFTYPE_ADHOC) { in nl80211_mgmt_subscribe_non_ap()
2509 nl80211_register_frame(bss, bss->nl_mgmt, type, NULL, 0, false); in nl80211_mgmt_subscribe_non_ap()
2510 } else if ((drv->capa.flags & WPA_DRIVER_FLAGS_SAE) && in nl80211_mgmt_subscribe_non_ap()
2511 !(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) { in nl80211_mgmt_subscribe_non_ap()
2513 nl80211_register_frame(bss, bss->nl_mgmt, type, in nl80211_mgmt_subscribe_non_ap()
2519 if (nl80211_register_frame(bss, bss->nl_mgmt, type, in nl80211_mgmt_subscribe_non_ap()
2521 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2527 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2532 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2535 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2538 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2541 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2544 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2547 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2550 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2553 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2560 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2565 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2571 /* fallback to non-multicast */ in nl80211_mgmt_subscribe_non_ap()
2574 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2583 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2588 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2592 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2594 if ((drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_SUPPORT)) { in nl80211_mgmt_subscribe_non_ap()
2598 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2604 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2609 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2610 else if (!drv->has_driver_key_mgmt) { in nl80211_mgmt_subscribe_non_ap()
2615 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_FT | in nl80211_mgmt_subscribe_non_ap()
2620 drv->capa.key_mgmt_iftype[i] = drv->capa.key_mgmt; in nl80211_mgmt_subscribe_non_ap()
2623 /* WNM - BSS Transition Management Request */ in nl80211_mgmt_subscribe_non_ap()
2625 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2626 /* WNM-Sleep Mode Response */ in nl80211_mgmt_subscribe_non_ap()
2628 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2630 /* WNM - Collocated Interference Request */ in nl80211_mgmt_subscribe_non_ap()
2632 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2636 /* WNM-Notification */ in nl80211_mgmt_subscribe_non_ap()
2638 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2641 /* WMM-AC ADDTS Response */ in nl80211_mgmt_subscribe_non_ap()
2643 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2645 /* WMM-AC DELTS */ in nl80211_mgmt_subscribe_non_ap()
2647 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2649 /* Radio Measurement - Neighbor Report Response */ in nl80211_mgmt_subscribe_non_ap()
2651 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2653 /* Radio Measurement - Radio Measurement Request */ in nl80211_mgmt_subscribe_non_ap()
2654 if (!drv->no_rrm && in nl80211_mgmt_subscribe_non_ap()
2656 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2658 /* Radio Measurement - Link Measurement Request */ in nl80211_mgmt_subscribe_non_ap()
2659 if ((drv->capa.rrm_flags & WPA_DRIVER_FLAGS_TX_POWER_INSERTION) && in nl80211_mgmt_subscribe_non_ap()
2661 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2665 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2669 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2674 ret = -1; in nl80211_mgmt_subscribe_non_ap()
2687 return -1; in nl80211_mgmt_subscribe_mesh()
2691 bss->nl_mgmt); in nl80211_mgmt_subscribe_mesh()
2694 if (nl80211_register_frame(bss, bss->nl_mgmt, in nl80211_mgmt_subscribe_mesh()
2698 ret = -1; in nl80211_mgmt_subscribe_mesh()
2702 ret = -1; in nl80211_mgmt_subscribe_mesh()
2705 ret = -1; in nl80211_mgmt_subscribe_mesh()
2708 ret = -1; in nl80211_mgmt_subscribe_mesh()
2722 ret = send_and_recv(bss->drv->global, bss->nl_mgmt, msg, NULL, NULL, in nl80211_register_spurious_class3()
2727 ret, strerror(-ret)); in nl80211_register_spurious_class3()
2739 ret = -1; in nl80211_action_subscribe_ap()
2742 ret = -1; in nl80211_action_subscribe_ap()
2745 ret = -1; in nl80211_action_subscribe_ap()
2748 ret = -1; in nl80211_action_subscribe_ap()
2751 ret = -1; in nl80211_action_subscribe_ap()
2754 ret = -1; in nl80211_action_subscribe_ap()
2757 ret = -1; in nl80211_action_subscribe_ap()
2760 ret = -1; in nl80211_action_subscribe_ap()
2763 ret = -1; in nl80211_action_subscribe_ap()
2767 ret = -1; in nl80211_action_subscribe_ap()
2769 /* Vendor-specific */ in nl80211_action_subscribe_ap()
2771 ret = -1; in nl80211_action_subscribe_ap()
2796 return -1; in nl80211_mgmt_subscribe_ap()
2798 "handle %p", bss->nl_mgmt); in nl80211_mgmt_subscribe_ap()
2801 if (nl80211_register_frame(bss, bss->nl_mgmt, in nl80211_mgmt_subscribe_ap()
2819 nl_destroy_handles(&bss->nl_mgmt); in nl80211_mgmt_subscribe_ap()
2820 return -1; in nl80211_mgmt_subscribe_ap()
2827 return -1; in nl80211_mgmt_subscribe_ap_dev_sme()
2829 "handle %p (device SME)", bss->nl_mgmt); in nl80211_mgmt_subscribe_ap_dev_sme()
2834 if (bss->drv->device_ap_sme) { in nl80211_mgmt_subscribe_ap_dev_sme()
2838 if (nl80211_register_frame(bss, bss->nl_mgmt, type, NULL, 0, in nl80211_mgmt_subscribe_ap_dev_sme()
2841 "nl80211: Failed to subscribe to handle Authentication frames - SAE offload may not work"); in nl80211_mgmt_subscribe_ap_dev_sme()
2848 nl_destroy_handles(&bss->nl_mgmt); in nl80211_mgmt_subscribe_ap_dev_sme()
2849 return -1; in nl80211_mgmt_subscribe_ap_dev_sme()
2855 if (bss->nl_mgmt == NULL) in nl80211_mgmt_unsubscribe()
2858 "(%s)", bss->nl_mgmt, reason); in nl80211_mgmt_unsubscribe()
2859 nl80211_destroy_eloop_handle(&bss->nl_mgmt, 0); in nl80211_mgmt_unsubscribe()
2877 ret = send_and_recv_cmd(bss->drv, msg); in nl80211_del_p2pdev()
2880 bss->ifname, (long long unsigned int) bss->wdev_id, in nl80211_del_p2pdev()
2881 strerror(-ret)); in nl80211_del_p2pdev()
2892 ret = send_and_recv_cmd(bss->drv, msg); in nl80211_set_p2pdev()
2896 bss->ifname, (long long unsigned int) bss->wdev_id, in nl80211_set_p2pdev()
2897 strerror(-ret)); in nl80211_set_p2pdev()
2908 return linux_set_iface_flags(bss->drv->global->ioctl_sock, in i802_set_iface_flags()
2909 bss->ifname, up); in i802_set_iface_flags()
2966 ret, strerror(-ret)); in qca_vendor_test()
2976 struct i802_bss *bss = drv->first_bss; in wpa_driver_nl80211_finish_drv_init()
2980 drv->ifindex = if_nametoindex(bss->ifname); in wpa_driver_nl80211_finish_drv_init()
2981 bss->ifindex = drv->ifindex; in wpa_driver_nl80211_finish_drv_init()
2982 bss->wdev_id = drv->global->if_add_wdevid; in wpa_driver_nl80211_finish_drv_init()
2983 bss->wdev_id_set = drv->global->if_add_wdevid_set; in wpa_driver_nl80211_finish_drv_init()
2985 bss->if_dynamic = drv->ifindex == drv->global->if_add_ifindex; in wpa_driver_nl80211_finish_drv_init()
2986 bss->if_dynamic = bss->if_dynamic || drv->global->if_add_wdevid_set; in wpa_driver_nl80211_finish_drv_init()
2987 drv->global->if_add_wdevid_set = 0; in wpa_driver_nl80211_finish_drv_init()
2989 if (!bss->if_dynamic && nl80211_get_ifmode(bss) == NL80211_IFTYPE_AP) in wpa_driver_nl80211_finish_drv_init()
2990 bss->static_ap = 1; in wpa_driver_nl80211_finish_drv_init()
2994 linux_iface_up(drv->global->ioctl_sock, bss->ifname) > 0) in wpa_driver_nl80211_finish_drv_init()
2995 drv->start_iface_up = 1; in wpa_driver_nl80211_finish_drv_init()
2998 return -1; in wpa_driver_nl80211_finish_drv_init()
3001 return -1; in wpa_driver_nl80211_finish_drv_init()
3004 bss->ifname, drv->phyname); in wpa_driver_nl80211_finish_drv_init()
3007 (linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 0) || in wpa_driver_nl80211_finish_drv_init()
3008 linux_set_ifhwaddr(drv->global->ioctl_sock, bss->ifname, in wpa_driver_nl80211_finish_drv_init()
3010 return -1; in wpa_driver_nl80211_finish_drv_init()
3013 drv->start_mode_sta = 1; in wpa_driver_nl80211_finish_drv_init()
3015 if (drv->hostapd || bss->static_ap) in wpa_driver_nl80211_finish_drv_init()
3017 else if (bss->if_dynamic || in wpa_driver_nl80211_finish_drv_init()
3025 return -1; in wpa_driver_nl80211_finish_drv_init()
3033 if (!rfkill_is_blocked(drv->rfkill)) { in wpa_driver_nl80211_finish_drv_init()
3037 "interface '%s' UP", bss->ifname); in wpa_driver_nl80211_finish_drv_init()
3042 nl80211_disable_11b_rates(bss->drv, in wpa_driver_nl80211_finish_drv_init()
3043 bss->drv->ifindex, 1); in wpa_driver_nl80211_finish_drv_init()
3049 "interface '%s' due to rfkill", bss->ifname); in wpa_driver_nl80211_finish_drv_init()
3051 drv->if_disabled = 1; in wpa_driver_nl80211_finish_drv_init()
3056 if (!drv->hostapd && nlmode != NL80211_IFTYPE_P2P_DEVICE) in wpa_driver_nl80211_finish_drv_init()
3057 netlink_send_oper_ifla(drv->global->netlink, drv->ifindex, in wpa_driver_nl80211_finish_drv_init()
3061 if (linux_get_ifhwaddr(drv->global->ioctl_sock, bss->ifname, in wpa_driver_nl80211_finish_drv_init()
3062 bss->addr)) in wpa_driver_nl80211_finish_drv_init()
3063 return -1; in wpa_driver_nl80211_finish_drv_init()
3064 os_memcpy(drv->perm_addr, bss->addr, ETH_ALEN); in wpa_driver_nl80211_finish_drv_init()
3069 drv, drv->ctx); in wpa_driver_nl80211_finish_drv_init()
3072 if (drv->vendor_cmd_test_avail) in wpa_driver_nl80211_finish_drv_init()
3083 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_del_beacon()
3086 if (!link->beacon_set) in wpa_driver_nl80211_del_beacon()
3090 bss->ifindex); in wpa_driver_nl80211_del_beacon()
3091 link->beacon_set = 0; in wpa_driver_nl80211_del_beacon()
3092 link->freq = 0; in wpa_driver_nl80211_del_beacon()
3097 return -ENOBUFS; in wpa_driver_nl80211_del_beacon()
3106 return -ENOBUFS; in wpa_driver_nl80211_del_beacon()
3118 for_each_link_default(bss->valid_links, link_id, NL80211_DRV_LINK_ID_NA) in wpa_driver_nl80211_del_beacon_all()
3124 * wpa_driver_nl80211_deinit - Deinitialize nl80211 driver interface
3132 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_deinit()
3136 bss->ifname, drv->disabled_11b_rates); in wpa_driver_nl80211_deinit()
3138 bss->in_deinit = 1; in wpa_driver_nl80211_deinit()
3139 if (drv->data_tx_status) in wpa_driver_nl80211_deinit()
3140 eloop_unregister_read_sock(drv->eapol_tx_sock); in wpa_driver_nl80211_deinit()
3141 if (drv->eapol_tx_sock >= 0) in wpa_driver_nl80211_deinit()
3142 close(drv->eapol_tx_sock); in wpa_driver_nl80211_deinit()
3144 if (bss->nl_preq) in wpa_driver_nl80211_deinit()
3146 if (bss->added_if_into_bridge) { in wpa_driver_nl80211_deinit()
3147 if (linux_br_del_if(drv->global->ioctl_sock, bss->brname, in wpa_driver_nl80211_deinit()
3148 bss->ifname) < 0) in wpa_driver_nl80211_deinit()
3151 bss->ifname, bss->brname, strerror(errno)); in wpa_driver_nl80211_deinit()
3154 if (drv->rtnl_sk) in wpa_driver_nl80211_deinit()
3155 nl_socket_free(drv->rtnl_sk); in wpa_driver_nl80211_deinit()
3157 if (bss->added_bridge) { in wpa_driver_nl80211_deinit()
3158 if (linux_set_iface_flags(drv->global->ioctl_sock, bss->brname, in wpa_driver_nl80211_deinit()
3162 bss->brname); in wpa_driver_nl80211_deinit()
3163 if (linux_br_del(drv->global->ioctl_sock, bss->brname) < 0) in wpa_driver_nl80211_deinit()
3166 bss->brname, strerror(errno)); in wpa_driver_nl80211_deinit()
3171 if (is_ap_interface(drv->nlmode)) { in wpa_driver_nl80211_deinit()
3176 if (drv->eapol_sock >= 0) { in wpa_driver_nl80211_deinit()
3177 eloop_unregister_read_sock(drv->eapol_sock); in wpa_driver_nl80211_deinit()
3178 close(drv->eapol_sock); in wpa_driver_nl80211_deinit()
3181 if (drv->if_indices != drv->default_if_indices) in wpa_driver_nl80211_deinit()
3182 os_free(drv->if_indices); in wpa_driver_nl80211_deinit()
3184 if (drv->disabled_11b_rates) in wpa_driver_nl80211_deinit()
3185 nl80211_disable_11b_rates(drv, drv->ifindex, 0); in wpa_driver_nl80211_deinit()
3187 netlink_send_oper_ifla(drv->global->netlink, drv->ifindex, 0, in wpa_driver_nl80211_deinit()
3189 eloop_cancel_timeout(wpa_driver_nl80211_send_rfkill, drv, drv->ctx); in wpa_driver_nl80211_deinit()
3190 rfkill_deinit(drv->rfkill); in wpa_driver_nl80211_deinit()
3192 eloop_cancel_timeout(wpa_driver_nl80211_scan_timeout, drv, drv->ctx); in wpa_driver_nl80211_deinit()
3194 if (!drv->start_iface_up) in wpa_driver_nl80211_deinit()
3197 if (drv->addr_changed) { in wpa_driver_nl80211_deinit()
3198 if (linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, in wpa_driver_nl80211_deinit()
3203 if (linux_set_ifhwaddr(drv->global->ioctl_sock, bss->ifname, in wpa_driver_nl80211_deinit()
3204 drv->perm_addr) < 0) { in wpa_driver_nl80211_deinit()
3210 if (drv->nlmode != NL80211_IFTYPE_P2P_DEVICE) { in wpa_driver_nl80211_deinit()
3211 if (drv->start_mode_sta) in wpa_driver_nl80211_deinit()
3220 nl80211_destroy_bss(drv->first_bss); in wpa_driver_nl80211_deinit()
3222 os_free(drv->filter_ssids); in wpa_driver_nl80211_deinit()
3224 os_free(drv->auth_ie); in wpa_driver_nl80211_deinit()
3225 os_free(drv->auth_data); in wpa_driver_nl80211_deinit()
3227 if (drv->in_interface_list) in wpa_driver_nl80211_deinit()
3228 dl_list_del(&drv->list); in wpa_driver_nl80211_deinit()
3230 os_free(drv->extended_capa); in wpa_driver_nl80211_deinit()
3231 os_free(drv->extended_capa_mask); in wpa_driver_nl80211_deinit()
3232 for (i = 0; i < drv->num_iface_capa; i++) { in wpa_driver_nl80211_deinit()
3233 os_free(drv->iface_capa[i].ext_capa); in wpa_driver_nl80211_deinit()
3234 os_free(drv->iface_capa[i].ext_capa_mask); in wpa_driver_nl80211_deinit()
3236 os_free(drv->first_bss); in wpa_driver_nl80211_deinit()
3238 os_free(drv->pending_roam_data); in wpa_driver_nl80211_deinit()
3378 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD)) in issue_key_mgmt_set_key()
3388 return -1; in issue_key_mgmt_set_key()
3394 ret, strerror(-ret)); in issue_key_mgmt_set_key()
3413 if (!addr && drv->associated) in nl80211_set_pmk()
3414 addr = drv->bssid; in nl80211_set_pmk()
3416 return -1; in nl80211_set_pmk()
3427 return -ENOBUFS; in nl80211_set_pmk()
3433 ret, strerror(-ret)); in nl80211_set_pmk()
3443 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_set_key()
3449 const char *ifname = params->ifname; in wpa_driver_nl80211_set_key()
3450 enum wpa_alg alg = params->alg; in wpa_driver_nl80211_set_key()
3451 const u8 *addr = params->addr; in wpa_driver_nl80211_set_key()
3452 int key_idx = params->key_idx; in wpa_driver_nl80211_set_key()
3453 int set_tx = params->set_tx; in wpa_driver_nl80211_set_key()
3454 const u8 *seq = params->seq; in wpa_driver_nl80211_set_key()
3455 size_t seq_len = params->seq_len; in wpa_driver_nl80211_set_key()
3456 const u8 *key = params->key; in wpa_driver_nl80211_set_key()
3457 size_t key_len = params->key_len; in wpa_driver_nl80211_set_key()
3458 int vlan_id = params->vlan_id; in wpa_driver_nl80211_set_key()
3459 enum key_flag key_flag = params->key_flag; in wpa_driver_nl80211_set_key()
3460 int link_id = params->link_id; in wpa_driver_nl80211_set_key()
3463 if (drv->nlmode == NL80211_IFTYPE_P2P_DEVICE) in wpa_driver_nl80211_set_key()
3475 return -EINVAL; in wpa_driver_nl80211_set_key()
3480 (drv->capa.flags & WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD)) { in wpa_driver_nl80211_set_key()
3489 if (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X) in wpa_driver_nl80211_set_key()
3496 ret = -ENOBUFS; in wpa_driver_nl80211_set_key()
3511 ret = -EINVAL; in wpa_driver_nl80211_set_key()
3523 ret = -EINVAL; in wpa_driver_nl80211_set_key()
3565 ret = -EINVAL; in wpa_driver_nl80211_set_key()
3578 ret = -EINVAL; in wpa_driver_nl80211_set_key()
3592 if (vlan_id && (drv->capa.flags & WPA_DRIVER_FLAGS_VLAN_OFFLOAD)) { in wpa_driver_nl80211_set_key()
3598 if (link_id != -1) { in wpa_driver_nl80211_set_key()
3605 if ((ret == -ENOENT || ret == -ENOLINK) && alg == WPA_ALG_NONE) in wpa_driver_nl80211_set_key()
3609 ret, strerror(-ret)); in wpa_driver_nl80211_set_key()
3617 wpa_printf(MSG_DEBUG, "nl80211: NL80211_CMD_SET_KEY - default key"); in wpa_driver_nl80211_set_key()
3619 ret = -ENOBUFS; in wpa_driver_nl80211_set_key()
3659 if (vlan_id && (drv->capa.flags & WPA_DRIVER_FLAGS_VLAN_OFFLOAD)) { in wpa_driver_nl80211_set_key()
3660 wpa_printf(MSG_DEBUG, "nl80211: set_key default - VLAN ID %d", in wpa_driver_nl80211_set_key()
3666 if (link_id != -1) { in wpa_driver_nl80211_set_key()
3667 wpa_printf(MSG_DEBUG, "nl80211: set_key default - Link ID %d", in wpa_driver_nl80211_set_key()
3677 ret, strerror(-ret)); in wpa_driver_nl80211_set_key()
3699 return -1; in nl_add_key()
3703 return -1; in nl_add_key()
3707 return -1; in nl_add_key()
3710 return -1; in nl_add_key()
3718 return -1; in nl_add_key()
3733 if (!params->wep_key[i]) in nl80211_set_conn_keys()
3738 if (params->wps == WPS_MODE_PRIVACY) in nl80211_set_conn_keys()
3740 if (params->pairwise_suite && in nl80211_set_conn_keys()
3741 params->pairwise_suite != WPA_CIPHER_NONE) in nl80211_set_conn_keys()
3748 return -ENOBUFS; in nl80211_set_conn_keys()
3752 return -ENOBUFS; in nl80211_set_conn_keys()
3755 if (!params->wep_key[i]) in nl80211_set_conn_keys()
3760 nla_put(msg, NL80211_KEY_DATA, params->wep_key_len[i], in nl80211_set_conn_keys()
3761 params->wep_key[i]) || in nl80211_set_conn_keys()
3763 params->wep_key_len[i] == 5 ? in nl80211_set_conn_keys()
3767 (i == params->wep_tx_keyidx && in nl80211_set_conn_keys()
3769 return -ENOBUFS; in nl80211_set_conn_keys()
3793 return -1; in wpa_driver_nl80211_mlme()
3796 ret = send_and_recv(drv->global, bss->nl_connect, msg, in wpa_driver_nl80211_mlme()
3799 wpa_dbg(drv->ctx, MSG_DEBUG, in wpa_driver_nl80211_mlme()
3801 reason_code, ret, strerror(-ret)); in wpa_driver_nl80211_mlme()
3815 /* Disconnect command doesn't need BSSID - it uses cached value */ in wpa_driver_nl80211_disconnect()
3823 drv->ignore_next_local_disconnect = send_event_marker(drv); in wpa_driver_nl80211_disconnect()
3832 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_deauthenticate()
3835 if (drv->nlmode == NL80211_IFTYPE_ADHOC) { in wpa_driver_nl80211_deauthenticate()
3839 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) { in wpa_driver_nl80211_deauthenticate()
3852 drv->ignore_next_local_deauth = send_event_marker(drv); in wpa_driver_nl80211_deauthenticate()
3863 drv->auth_freq = params->freq; in nl80211_copy_auth_params()
3864 drv->auth_alg = params->auth_alg; in nl80211_copy_auth_params()
3865 drv->auth_wep_tx_keyidx = params->wep_tx_keyidx; in nl80211_copy_auth_params()
3866 drv->auth_local_state_change = params->local_state_change; in nl80211_copy_auth_params()
3867 drv->auth_p2p = params->p2p; in nl80211_copy_auth_params()
3869 if (params->bssid) in nl80211_copy_auth_params()
3870 os_memcpy(drv->auth_bssid_, params->bssid, ETH_ALEN); in nl80211_copy_auth_params()
3872 os_memset(drv->auth_bssid_, 0, ETH_ALEN); in nl80211_copy_auth_params()
3874 if (params->ssid) { in nl80211_copy_auth_params()
3875 os_memcpy(drv->auth_ssid, params->ssid, params->ssid_len); in nl80211_copy_auth_params()
3876 drv->auth_ssid_len = params->ssid_len; in nl80211_copy_auth_params()
3878 drv->auth_ssid_len = 0; in nl80211_copy_auth_params()
3881 os_free(drv->auth_ie); in nl80211_copy_auth_params()
3882 drv->auth_ie = NULL; in nl80211_copy_auth_params()
3883 drv->auth_ie_len = 0; in nl80211_copy_auth_params()
3884 if (params->ie) { in nl80211_copy_auth_params()
3885 drv->auth_ie = os_malloc(params->ie_len); in nl80211_copy_auth_params()
3886 if (drv->auth_ie) { in nl80211_copy_auth_params()
3887 os_memcpy(drv->auth_ie, params->ie, params->ie_len); in nl80211_copy_auth_params()
3888 drv->auth_ie_len = params->ie_len; in nl80211_copy_auth_params()
3892 if (params->mld && params->ap_mld_addr) { in nl80211_copy_auth_params()
3893 drv->auth_mld = params->mld; in nl80211_copy_auth_params()
3894 drv->auth_mld_link_id = params->mld_link_id; in nl80211_copy_auth_params()
3895 os_memcpy(drv->auth_ap_mld_addr, params->ap_mld_addr, ETH_ALEN); in nl80211_copy_auth_params()
3897 drv->auth_mld = false; in nl80211_copy_auth_params()
3898 drv->auth_mld_link_id = -1; in nl80211_copy_auth_params()
3901 os_free(drv->auth_data); in nl80211_copy_auth_params()
3902 drv->auth_data = NULL; in nl80211_copy_auth_params()
3903 drv->auth_data_len = 0; in nl80211_copy_auth_params()
3904 if (params->auth_data) { in nl80211_copy_auth_params()
3905 drv->auth_data = os_memdup(params->auth_data, in nl80211_copy_auth_params()
3906 params->auth_data_len); in nl80211_copy_auth_params()
3907 if (drv->auth_data) in nl80211_copy_auth_params()
3908 drv->auth_data_len = params->auth_data_len; in nl80211_copy_auth_params()
3912 if (params->wep_key[i] && params->wep_key_len[i] && in nl80211_copy_auth_params()
3913 params->wep_key_len[i] <= 16) { in nl80211_copy_auth_params()
3914 os_memcpy(drv->auth_wep_key[i], params->wep_key[i], in nl80211_copy_auth_params()
3915 params->wep_key_len[i]); in nl80211_copy_auth_params()
3916 drv->auth_wep_key_len[i] = params->wep_key_len[i]; in nl80211_copy_auth_params()
3918 drv->auth_wep_key_len[i] = 0; in nl80211_copy_auth_params()
3925 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_unmask_11b_rates()
3927 if (is_p2p_net_interface(drv->nlmode) || !drv->disabled_11b_rates) in nl80211_unmask_11b_rates()
3936 "nl80211: Interface %s mode is for non-P2P, but 11b rates were disabled - re-enable them", in nl80211_unmask_11b_rates()
3937 bss->ifname); in nl80211_unmask_11b_rates()
3938 nl80211_disable_11b_rates(drv, drv->ifindex, 0); in nl80211_unmask_11b_rates()
3966 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_authenticate()
3967 int ret = -1, i; in wpa_driver_nl80211_authenticate()
3977 is_retry = drv->retry_auth; in wpa_driver_nl80211_authenticate()
3978 drv->retry_auth = 0; in wpa_driver_nl80211_authenticate()
3979 drv->ignore_deauth_event = 0; in wpa_driver_nl80211_authenticate()
3982 os_memset(drv->auth_bssid, 0, ETH_ALEN); in wpa_driver_nl80211_authenticate()
3983 if (params->bssid) in wpa_driver_nl80211_authenticate()
3984 os_memcpy(drv->auth_attempt_bssid, params->bssid, ETH_ALEN); in wpa_driver_nl80211_authenticate()
3986 os_memset(drv->auth_attempt_bssid, 0, ETH_ALEN); in wpa_driver_nl80211_authenticate()
3988 nlmode = params->p2p ? in wpa_driver_nl80211_authenticate()
3990 if (drv->nlmode != nlmode && in wpa_driver_nl80211_authenticate()
3992 return -1; in wpa_driver_nl80211_authenticate()
3996 drv->ifindex); in wpa_driver_nl80211_authenticate()
4003 p.ifname = bss->ifname; in wpa_driver_nl80211_authenticate()
4005 p.link_id = -1; in wpa_driver_nl80211_authenticate()
4007 if (!params->wep_key[i]) in wpa_driver_nl80211_authenticate()
4010 p.set_tx = i == params->wep_tx_keyidx; in wpa_driver_nl80211_authenticate()
4011 p.key = params->wep_key[i]; in wpa_driver_nl80211_authenticate()
4012 p.key_len = params->wep_key_len[i]; in wpa_driver_nl80211_authenticate()
4013 p.key_flag = i == params->wep_tx_keyidx ? in wpa_driver_nl80211_authenticate()
4017 if (params->wep_tx_keyidx != i) in wpa_driver_nl80211_authenticate()
4020 params->wep_key[i], params->wep_key_len[i])) in wpa_driver_nl80211_authenticate()
4024 if (params->bssid) { in wpa_driver_nl80211_authenticate()
4026 MAC2STR(params->bssid)); in wpa_driver_nl80211_authenticate()
4027 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid)) in wpa_driver_nl80211_authenticate()
4030 if (params->freq) { in wpa_driver_nl80211_authenticate()
4031 wpa_printf(MSG_DEBUG, " * freq=%d", params->freq); in wpa_driver_nl80211_authenticate()
4032 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq)) in wpa_driver_nl80211_authenticate()
4035 if (params->ssid) { in wpa_driver_nl80211_authenticate()
4037 wpa_ssid_txt(params->ssid, params->ssid_len)); in wpa_driver_nl80211_authenticate()
4038 if (nla_put(msg, NL80211_ATTR_SSID, params->ssid_len, in wpa_driver_nl80211_authenticate()
4039 params->ssid)) in wpa_driver_nl80211_authenticate()
4042 wpa_hexdump(MSG_DEBUG, " * IEs", params->ie, params->ie_len); in wpa_driver_nl80211_authenticate()
4043 if (params->ie && in wpa_driver_nl80211_authenticate()
4044 nla_put(msg, NL80211_ATTR_IE, params->ie_len, params->ie)) in wpa_driver_nl80211_authenticate()
4046 if (params->auth_data) { in wpa_driver_nl80211_authenticate()
4047 wpa_hexdump(MSG_DEBUG, " * auth_data", params->auth_data, in wpa_driver_nl80211_authenticate()
4048 params->auth_data_len); in wpa_driver_nl80211_authenticate()
4049 if (nla_put(msg, NL80211_ATTR_SAE_DATA, params->auth_data_len, in wpa_driver_nl80211_authenticate()
4050 params->auth_data)) in wpa_driver_nl80211_authenticate()
4053 type = get_nl_auth_type(params->auth_alg); in wpa_driver_nl80211_authenticate()
4058 if (params->local_state_change) { in wpa_driver_nl80211_authenticate()
4064 if (params->mld && params->ap_mld_addr) { in wpa_driver_nl80211_authenticate()
4066 params->mld_link_id, MAC2STR(params->ap_mld_addr)); in wpa_driver_nl80211_authenticate()
4069 params->mld_link_id) || in wpa_driver_nl80211_authenticate()
4071 params->ap_mld_addr)) in wpa_driver_nl80211_authenticate()
4078 wpa_dbg(drv->ctx, MSG_DEBUG, in wpa_driver_nl80211_authenticate()
4080 count, ret, strerror(-ret)); in wpa_driver_nl80211_authenticate()
4082 if ((ret == -EALREADY || ret == -EEXIST) && count == 1 && in wpa_driver_nl80211_authenticate()
4083 params->bssid && !params->local_state_change) { in wpa_driver_nl80211_authenticate()
4091 drv->ignore_deauth_event = 1; in wpa_driver_nl80211_authenticate()
4093 bss, params->bssid, in wpa_driver_nl80211_authenticate()
4099 if (ret == -ENOENT && params->freq && !is_retry) { in wpa_driver_nl80211_authenticate()
4111 if (params->ssid) { in wpa_driver_nl80211_authenticate()
4112 scan.ssids[0].ssid = params->ssid; in wpa_driver_nl80211_authenticate()
4113 scan.ssids[0].ssid_len = params->ssid_len; in wpa_driver_nl80211_authenticate()
4115 freqs[0] = params->freq; in wpa_driver_nl80211_authenticate()
4124 drv->scan_for_auth = 1; in wpa_driver_nl80211_authenticate()
4135 os_memcpy(event.timeout_event.addr, drv->auth_bssid_, in wpa_driver_nl80211_authenticate()
4137 wpa_supplicant_event(drv->ctx, EVENT_AUTH_TIMED_OUT, in wpa_driver_nl80211_authenticate()
4154 struct i802_bss *bss = drv->first_bss; in wpa_driver_nl80211_authenticate_retry()
4161 params.freq = drv->auth_freq; in wpa_driver_nl80211_authenticate_retry()
4162 params.auth_alg = drv->auth_alg; in wpa_driver_nl80211_authenticate_retry()
4163 params.wep_tx_keyidx = drv->auth_wep_tx_keyidx; in wpa_driver_nl80211_authenticate_retry()
4164 params.local_state_change = drv->auth_local_state_change; in wpa_driver_nl80211_authenticate_retry()
4165 params.p2p = drv->auth_p2p; in wpa_driver_nl80211_authenticate_retry()
4167 if (!is_zero_ether_addr(drv->auth_bssid_)) in wpa_driver_nl80211_authenticate_retry()
4168 params.bssid = drv->auth_bssid_; in wpa_driver_nl80211_authenticate_retry()
4170 if (drv->auth_ssid_len) { in wpa_driver_nl80211_authenticate_retry()
4171 params.ssid = drv->auth_ssid; in wpa_driver_nl80211_authenticate_retry()
4172 params.ssid_len = drv->auth_ssid_len; in wpa_driver_nl80211_authenticate_retry()
4175 params.ie = drv->auth_ie; in wpa_driver_nl80211_authenticate_retry()
4176 params.ie_len = drv->auth_ie_len; in wpa_driver_nl80211_authenticate_retry()
4177 params.auth_data = drv->auth_data; in wpa_driver_nl80211_authenticate_retry()
4178 params.auth_data_len = drv->auth_data_len; in wpa_driver_nl80211_authenticate_retry()
4179 params.mld = drv->auth_mld; in wpa_driver_nl80211_authenticate_retry()
4180 params.mld_link_id = drv->auth_mld_link_id; in wpa_driver_nl80211_authenticate_retry()
4181 if (drv->auth_mld) { in wpa_driver_nl80211_authenticate_retry()
4182 os_memcpy(ap_mld_addr, drv->auth_ap_mld_addr, ETH_ALEN); in wpa_driver_nl80211_authenticate_retry()
4187 if (drv->auth_wep_key_len[i]) { in wpa_driver_nl80211_authenticate_retry()
4188 params.wep_key[i] = drv->auth_wep_key[i]; in wpa_driver_nl80211_authenticate_retry()
4189 params.wep_key_len[i] = drv->auth_wep_key_len[i]; in wpa_driver_nl80211_authenticate_retry()
4193 drv->retry_auth = 1; in wpa_driver_nl80211_authenticate_retry()
4201 return bss->flink; in nl80211_get_link()
4203 if (BIT(link_id) & bss->valid_links) in nl80211_get_link()
4204 return &bss->links[link_id]; in nl80211_get_link()
4206 return bss->flink; in nl80211_get_link()
4214 link->freq = freq; in nl80211_link_set_freq()
4223 for_each_link(bss->valid_links, i) { in nl80211_get_link_freq()
4224 if (ether_addr_equal(bss->links[i].addr, addr)) { in nl80211_get_link_freq()
4228 bss->links[i].freq, MAC2STR(addr)); in nl80211_get_link_freq()
4229 return bss->links[i].freq; in nl80211_get_link_freq()
4234 wpa_printf(MSG_DEBUG, "nl80211: Use bss->freq=%d", in nl80211_get_link_freq()
4235 bss->flink->freq); in nl80211_get_link_freq()
4237 return bss->flink->freq; in nl80211_get_link_freq()
4250 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_send_mlme()
4259 fc = le_to_host16(mgmt->frame_control); in wpa_driver_nl80211_send_mlme()
4260 wpa_printf(MSG_DEBUG, "nl80211: send_mlme - da=" MACSTR " sa=" MACSTR in wpa_driver_nl80211_send_mlme()
4263 MAC2STR(mgmt->da), MAC2STR(mgmt->sa), MAC2STR(mgmt->bssid), in wpa_driver_nl80211_send_mlme()
4265 no_encrypt, fc, fc2str(fc), drv->nlmode); in wpa_driver_nl80211_send_mlme()
4267 if ((is_sta_interface(drv->nlmode) || in wpa_driver_nl80211_send_mlme()
4268 drv->nlmode == NL80211_IFTYPE_P2P_DEVICE) && in wpa_driver_nl80211_send_mlme()
4273 * but it works due to the single-threaded nature in wpa_driver_nl80211_send_mlme()
4278 drv->last_mgmt_freq); in wpa_driver_nl80211_send_mlme()
4279 freq = drv->last_mgmt_freq; in wpa_driver_nl80211_send_mlme()
4288 if (drv->device_ap_sme && is_ap_interface(drv->nlmode)) { in wpa_driver_nl80211_send_mlme()
4289 unsigned int link_freq = nl80211_get_link_freq(bss, mgmt->sa, in wpa_driver_nl80211_send_mlme()
4309 u16 auth_alg = le_to_host16(mgmt->u.auth.auth_alg); in wpa_driver_nl80211_send_mlme()
4310 u16 auth_trans = le_to_host16(mgmt->u.auth.auth_transaction); in wpa_driver_nl80211_send_mlme()
4315 if (is_sta_interface(drv->nlmode) && in wpa_driver_nl80211_send_mlme()
4319 (drv->capa.flags & WPA_DRIVER_FLAGS_SAE) && in wpa_driver_nl80211_send_mlme()
4320 !(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) { in wpa_driver_nl80211_send_mlme()
4323 "nl80211: send_mlme - Use assoc_freq=%u for external auth", in wpa_driver_nl80211_send_mlme()
4338 if (is_sta_interface(drv->nlmode) && in wpa_driver_nl80211_send_mlme()
4350 if (freq == 0 && drv->nlmode == NL80211_IFTYPE_ADHOC) { in wpa_driver_nl80211_send_mlme()
4353 "nl80211: send_mlme - Use assoc_freq=%u for IBSS", in wpa_driver_nl80211_send_mlme()
4357 wpa_printf(MSG_DEBUG, "nl80211: send_mlme - Use bss->freq=%u", in wpa_driver_nl80211_send_mlme()
4358 link->freq); in wpa_driver_nl80211_send_mlme()
4359 freq = link->freq; in wpa_driver_nl80211_send_mlme()
4362 if (drv->use_monitor && is_ap_interface(drv->nlmode)) { in wpa_driver_nl80211_send_mlme()
4364 "nl80211: send_frame(freq=%u bss->freq=%u) -> send_monitor", in wpa_driver_nl80211_send_mlme()
4365 freq, link->freq); in wpa_driver_nl80211_send_mlme()
4376 if (no_encrypt && !encrypt && !drv->use_monitor) { in wpa_driver_nl80211_send_mlme()
4378 "nl80211: Request to send an unencrypted frame - use a monitor interface for this"); in wpa_driver_nl80211_send_mlme()
4380 return -1; in wpa_driver_nl80211_send_mlme()
4388 wpa_printf(MSG_DEBUG, "nl80211: send_mlme -> send_frame_cmd"); in wpa_driver_nl80211_send_mlme()
4393 drv->send_frame_link_id = link_id; in wpa_driver_nl80211_send_mlme()
4419 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_bss()
4437 return -ENOBUFS; in nl80211_set_bss()
4448 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_set_acl()
4455 if (!(drv->capa.max_acl_mac_addrs)) in wpa_driver_nl80211_set_acl()
4456 return -ENOTSUP; in wpa_driver_nl80211_set_acl()
4458 if (params->num_mac_acl > drv->capa.max_acl_mac_addrs) in wpa_driver_nl80211_set_acl()
4459 return -ENOTSUP; in wpa_driver_nl80211_set_acl()
4462 params->acl_policy ? "Accept" : "Deny", params->num_mac_acl); in wpa_driver_nl80211_set_acl()
4464 acl_nla_sz = nla_total_size(ETH_ALEN) * params->num_mac_acl; in wpa_driver_nl80211_set_acl()
4468 return -ENOMEM; in wpa_driver_nl80211_set_acl()
4469 for (i = 0; i < params->num_mac_acl; i++) { in wpa_driver_nl80211_set_acl()
4470 if (nla_put(acl, i + 1, ETH_ALEN, params->mac_acl[i].addr)) { in wpa_driver_nl80211_set_acl()
4472 return -ENOMEM; in wpa_driver_nl80211_set_acl()
4487 drv->ifindex, 0, in wpa_driver_nl80211_set_acl()
4489 nla_put_u32(msg, NL80211_ATTR_ACL_POLICY, params->acl_policy ? in wpa_driver_nl80211_set_acl()
4495 return -ENOMEM; in wpa_driver_nl80211_set_acl()
4502 ret, strerror(-ret)); in wpa_driver_nl80211_set_acl()
4537 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_mesh_config()
4543 return -1; in nl80211_set_mesh_config()
4555 ret, strerror(-ret)); in nl80211_set_mesh_config()
4570 if (!params->freq || in nl80211_put_beacon_rate()
4571 (params->beacon_rate == 0 && in nl80211_put_beacon_rate()
4572 params->rate_type == BEACON_RATE_LEGACY)) in nl80211_put_beacon_rate()
4577 return -1; in nl80211_put_beacon_rate()
4579 switch (params->freq->mode) { in nl80211_put_beacon_rate()
4585 if (is_6ghz_freq(params->freq->freq)) in nl80211_put_beacon_rate()
4598 return -1; in nl80211_put_beacon_rate()
4603 switch (params->rate_type) { in nl80211_put_beacon_rate()
4608 return -1; in nl80211_put_beacon_rate()
4612 (u8) (params->beacon_rate / 5)) || in nl80211_put_beacon_rate()
4614 (params->freq->vht_enabled && in nl80211_put_beacon_rate()
4617 return -1; in nl80211_put_beacon_rate()
4620 params->beacon_rate); in nl80211_put_beacon_rate()
4626 return -1; in nl80211_put_beacon_rate()
4629 nla_put_u8(msg, NL80211_TXRATE_HT, params->beacon_rate) || in nl80211_put_beacon_rate()
4630 (params->freq->vht_enabled && in nl80211_put_beacon_rate()
4633 return -1; in nl80211_put_beacon_rate()
4634 wpa_printf(MSG_DEBUG, " * beacon_rate = HT-MCS %u", in nl80211_put_beacon_rate()
4635 params->beacon_rate); in nl80211_put_beacon_rate()
4641 return -1; in nl80211_put_beacon_rate()
4643 vht_rate.mcs[0] = BIT(params->beacon_rate); in nl80211_put_beacon_rate()
4645 return -1; in nl80211_put_beacon_rate()
4647 return -1; in nl80211_put_beacon_rate()
4650 return -1; in nl80211_put_beacon_rate()
4651 wpa_printf(MSG_DEBUG, " * beacon_rate = VHT-MCS %u", in nl80211_put_beacon_rate()
4652 params->beacon_rate); in nl80211_put_beacon_rate()
4658 return -1; in nl80211_put_beacon_rate()
4660 he_rate.mcs[0] = BIT(params->beacon_rate); in nl80211_put_beacon_rate()
4666 return -1; in nl80211_put_beacon_rate()
4667 wpa_printf(MSG_DEBUG, " * beacon_rate = HE-MCS %u", in nl80211_put_beacon_rate()
4668 params->beacon_rate); in nl80211_put_beacon_rate()
4682 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_multicast_to_unicast()
4692 bss->ifname); in nl80211_set_multicast_to_unicast()
4694 return -ENOBUFS; in nl80211_set_multicast_to_unicast()
4704 bss->ifname); in nl80211_set_multicast_to_unicast()
4706 case -EOPNOTSUPP: in nl80211_set_multicast_to_unicast()
4711 bss->ifname); in nl80211_set_multicast_to_unicast()
4717 ret, strerror(-ret), bss->ifname); in nl80211_set_multicast_to_unicast()
4740 return -1; in nl80211_put_sae_pwe()
4742 return -1; in nl80211_put_sae_pwe()
4755 if (!bss->drv->fils_discovery) { in nl80211_fils_discovery()
4758 bss->ifname); in nl80211_fils_discovery()
4759 return -1; in nl80211_fils_discovery()
4765 params->fd_min_int) || in nl80211_fils_discovery()
4767 params->fd_max_int) || in nl80211_fils_discovery()
4768 (params->fd_frame_tmpl && in nl80211_fils_discovery()
4770 params->fd_frame_tmpl_len, params->fd_frame_tmpl))) in nl80211_fils_discovery()
4771 return -1; in nl80211_fils_discovery()
4787 if (!bss->drv->unsol_bcast_probe_resp) { in nl80211_unsol_bcast_probe_resp()
4790 bss->ifname); in nl80211_unsol_bcast_probe_resp()
4791 return -1; in nl80211_unsol_bcast_probe_resp()
4796 ubpr->unsol_bcast_probe_resp_interval); in nl80211_unsol_bcast_probe_resp()
4800 ubpr->unsol_bcast_probe_resp_interval) || in nl80211_unsol_bcast_probe_resp()
4801 (ubpr->unsol_bcast_probe_resp_tmpl && in nl80211_unsol_bcast_probe_resp()
4803 ubpr->unsol_bcast_probe_resp_tmpl_len, in nl80211_unsol_bcast_probe_resp()
4804 ubpr->unsol_bcast_probe_resp_tmpl))) in nl80211_unsol_bcast_probe_resp()
4805 return -1; in nl80211_unsol_bcast_probe_resp()
4818 if (!params->mbssid_tx_iface) in nl80211_mbssid()
4824 params->mbssid_index)) in nl80211_mbssid()
4825 return -1; in nl80211_mbssid()
4827 if (params->mbssid_tx_iface) { in nl80211_mbssid()
4828 ifidx = if_nametoindex(params->mbssid_tx_iface); in nl80211_mbssid()
4832 return -1; in nl80211_mbssid()
4835 if (params->ema && nla_put_flag(msg, NL80211_MBSSID_CONFIG_ATTR_EMA)) in nl80211_mbssid()
4836 return -1; in nl80211_mbssid()
4840 if (params->mbssid_elem_count && params->mbssid_elem_len && in nl80211_mbssid()
4841 params->mbssid_elem_offset && *params->mbssid_elem_offset) { in nl80211_mbssid()
4842 u8 i, **offs = params->mbssid_elem_offset; in nl80211_mbssid()
4846 return -1; in nl80211_mbssid()
4848 for (i = 0; i < params->mbssid_elem_count - 1; i++) { in nl80211_mbssid()
4849 if (nla_put(msg, i + 1, offs[i + 1] - offs[i], offs[i])) in nl80211_mbssid()
4850 return -1; in nl80211_mbssid()
4854 *offs + params->mbssid_elem_len - offs[i], in nl80211_mbssid()
4856 return -1; in nl80211_mbssid()
4861 if (!params->ema) in nl80211_mbssid()
4864 if (params->rnr_elem_count && params->rnr_elem_len && in nl80211_mbssid()
4865 params->rnr_elem_offset && *params->rnr_elem_offset) { in nl80211_mbssid()
4866 u8 i, **offs = params->rnr_elem_offset; in nl80211_mbssid()
4870 return -1; in nl80211_mbssid()
4872 for (i = 0; i < params->rnr_elem_count - 1; i++) { in nl80211_mbssid()
4873 if (nla_put(msg, i + 1, offs[i + 1] - offs[i], offs[i])) in nl80211_mbssid()
4874 return -1; in nl80211_mbssid()
4877 if (nla_put(msg, i + 1, *offs + params->rnr_elem_len - offs[i], in nl80211_mbssid()
4879 return -1; in nl80211_mbssid()
4898 if (!drv->set_wifi_conf_vendor_cmd_avail || !drv->qca_ap_allowed_freqs) in qca_set_allowed_ap_freqs()
4931 ret, strerror(-ret)); in qca_set_allowed_ap_freqs()
4947 wpa_printf(MSG_DEBUG, " * freq=%d", freq->freq); in nl80211_put_freq_params()
4948 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq->freq)) in nl80211_put_freq_params()
4949 return -ENOBUFS; in nl80211_put_freq_params()
4951 wpa_printf(MSG_DEBUG, " * eht_enabled=%d", freq->eht_enabled); in nl80211_put_freq_params()
4952 wpa_printf(MSG_DEBUG, " * he_enabled=%d", freq->he_enabled); in nl80211_put_freq_params()
4953 wpa_printf(MSG_DEBUG, " * vht_enabled=%d", freq->vht_enabled); in nl80211_put_freq_params()
4954 wpa_printf(MSG_DEBUG, " * ht_enabled=%d", freq->ht_enabled); in nl80211_put_freq_params()
4956 freq->radar_background); in nl80211_put_freq_params()
4958 hw_mode = ieee80211_freq_to_chan(freq->freq, &channel); in nl80211_put_freq_params()
4962 if (freq->vht_enabled || in nl80211_put_freq_params()
4963 ((freq->he_enabled || freq->eht_enabled) && !is_24ghz)) { in nl80211_put_freq_params()
4966 wpa_printf(MSG_DEBUG, " * bandwidth=%d", freq->bandwidth); in nl80211_put_freq_params()
4967 switch (freq->bandwidth) { in nl80211_put_freq_params()
4975 if (freq->center_freq2) in nl80211_put_freq_params()
4987 return -EINVAL; in nl80211_put_freq_params()
4992 freq->center_freq1); in nl80211_put_freq_params()
4994 freq->center_freq2); in nl80211_put_freq_params()
4997 freq->center_freq1) || in nl80211_put_freq_params()
4998 (freq->center_freq2 && in nl80211_put_freq_params()
5000 freq->center_freq2))) in nl80211_put_freq_params()
5001 return -ENOBUFS; in nl80211_put_freq_params()
5002 } else if (freq->ht_enabled) { in nl80211_put_freq_params()
5006 freq->sec_channel_offset); in nl80211_put_freq_params()
5007 switch (freq->sec_channel_offset) { in nl80211_put_freq_params()
5008 case -1: in nl80211_put_freq_params()
5021 return -ENOBUFS; in nl80211_put_freq_params()
5022 } else if (freq->edmg.channels && freq->edmg.bw_config) { in nl80211_put_freq_params()
5025 freq->edmg.channels, freq->edmg.bw_config); in nl80211_put_freq_params()
5027 freq->edmg.channels) || in nl80211_put_freq_params()
5029 freq->edmg.bw_config)) in nl80211_put_freq_params()
5030 return -1; in nl80211_put_freq_params()
5036 return -ENOBUFS; in nl80211_put_freq_params()
5038 if (freq->radar_background && in nl80211_put_freq_params()
5040 return -ENOBUFS; in nl80211_put_freq_params()
5050 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_set_ap()
5051 struct i802_link *link = bss->flink; in wpa_driver_nl80211_set_ap()
5054 int ret = -ENOBUFS; in wpa_driver_nl80211_set_ap()
5063 if (params->mld_ap) { in wpa_driver_nl80211_set_ap()
5064 if (!nl80211_link_valid(bss->valid_links, in wpa_driver_nl80211_set_ap()
5065 params->mld_link_id)) { in wpa_driver_nl80211_set_ap()
5068 params->mld_link_id, bss->valid_links); in wpa_driver_nl80211_set_ap()
5069 return -EINVAL; in wpa_driver_nl80211_set_ap()
5072 link = nl80211_get_link(bss, params->mld_link_id); in wpa_driver_nl80211_set_ap()
5073 } else if (bss->valid_links) { in wpa_driver_nl80211_set_ap()
5075 return -EINVAL; in wpa_driver_nl80211_set_ap()
5078 beacon_set = params->reenable ? 0 : link->beacon_set; in wpa_driver_nl80211_set_ap()
5084 else if (!drv->device_ap_sme && !drv->use_monitor && in wpa_driver_nl80211_set_ap()
5086 return -ENOBUFS; in wpa_driver_nl80211_set_ap()
5089 params->head, params->head_len); in wpa_driver_nl80211_set_ap()
5091 params->tail, params->tail_len); in wpa_driver_nl80211_set_ap()
5092 wpa_printf(MSG_DEBUG, "nl80211: ifindex=%d", bss->ifindex); in wpa_driver_nl80211_set_ap()
5093 wpa_printf(MSG_DEBUG, "nl80211: beacon_int=%d", params->beacon_int); in wpa_driver_nl80211_set_ap()
5094 wpa_printf(MSG_DEBUG, "nl80211: beacon_rate=%u", params->beacon_rate); in wpa_driver_nl80211_set_ap()
5095 wpa_printf(MSG_DEBUG, "nl80211: rate_type=%d", params->rate_type); in wpa_driver_nl80211_set_ap()
5096 wpa_printf(MSG_DEBUG, "nl80211: dtim_period=%d", params->dtim_period); in wpa_driver_nl80211_set_ap()
5098 wpa_ssid_txt(params->ssid, params->ssid_len)); in wpa_driver_nl80211_set_ap()
5100 nla_put(msg, NL80211_ATTR_BEACON_HEAD, params->head_len, in wpa_driver_nl80211_set_ap()
5101 params->head) || in wpa_driver_nl80211_set_ap()
5102 nla_put(msg, NL80211_ATTR_BEACON_TAIL, params->tail_len, in wpa_driver_nl80211_set_ap()
5103 params->tail) || in wpa_driver_nl80211_set_ap()
5104 nl80211_put_beacon_int(msg, params->beacon_int) || in wpa_driver_nl80211_set_ap()
5105 nl80211_put_beacon_rate(msg, drv->capa.flags, drv->capa.flags2, in wpa_driver_nl80211_set_ap()
5107 nl80211_put_dtim_period(msg, params->dtim_period) || in wpa_driver_nl80211_set_ap()
5108 nla_put(msg, NL80211_ATTR_SSID, params->ssid_len, params->ssid)) in wpa_driver_nl80211_set_ap()
5111 if (params->mld_ap) { in wpa_driver_nl80211_set_ap()
5113 params->mld_link_id); in wpa_driver_nl80211_set_ap()
5116 params->mld_link_id)) in wpa_driver_nl80211_set_ap()
5119 if (params->freq) in wpa_driver_nl80211_set_ap()
5120 nl80211_link_set_freq(bss, params->mld_link_id, in wpa_driver_nl80211_set_ap()
5121 params->freq->freq); in wpa_driver_nl80211_set_ap()
5124 if (params->proberesp && params->proberesp_len) { in wpa_driver_nl80211_set_ap()
5126 params->proberesp, params->proberesp_len); in wpa_driver_nl80211_set_ap()
5127 if (nla_put(msg, NL80211_ATTR_PROBE_RESP, params->proberesp_len, in wpa_driver_nl80211_set_ap()
5128 params->proberesp)) in wpa_driver_nl80211_set_ap()
5131 switch (params->hide_ssid) { in wpa_driver_nl80211_set_ap()
5151 wpa_printf(MSG_DEBUG, "nl80211: privacy=%d", params->privacy); in wpa_driver_nl80211_set_ap()
5152 if (params->privacy && in wpa_driver_nl80211_set_ap()
5155 wpa_printf(MSG_DEBUG, "nl80211: auth_algs=0x%x", params->auth_algs); in wpa_driver_nl80211_set_ap()
5156 if ((params->auth_algs & (WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED)) == in wpa_driver_nl80211_set_ap()
5159 } else if (params->auth_algs & WPA_AUTH_ALG_SHARED) { in wpa_driver_nl80211_set_ap()
5169 wpa_printf(MSG_DEBUG, "nl80211: wpa_version=0x%x", params->wpa_version); in wpa_driver_nl80211_set_ap()
5171 if (params->wpa_version & WPA_PROTO_WPA) in wpa_driver_nl80211_set_ap()
5173 if (params->wpa_version & WPA_PROTO_RSN) in wpa_driver_nl80211_set_ap()
5180 params->key_mgmt_suites); in wpa_driver_nl80211_set_ap()
5181 num_suites = wpa_key_mgmt_to_suites(params->key_mgmt_suites, in wpa_driver_nl80211_set_ap()
5183 if ((unsigned int) num_suites > drv->capa.max_num_akms) in wpa_driver_nl80211_set_ap()
5186 num_suites, drv->capa.max_num_akms); in wpa_driver_nl80211_set_ap()
5192 if (wpa_key_mgmt_wpa_psk_no_sae(params->key_mgmt_suites) && in wpa_driver_nl80211_set_ap()
5193 (drv->capa.flags2 & WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK) && in wpa_driver_nl80211_set_ap()
5194 params->psk_len && in wpa_driver_nl80211_set_ap()
5195 nla_put(msg, NL80211_ATTR_PMK, params->psk_len, params->psk)) in wpa_driver_nl80211_set_ap()
5198 if (wpa_key_mgmt_sae(params->key_mgmt_suites) && in wpa_driver_nl80211_set_ap()
5199 (drv->capa.flags2 & WPA_DRIVER_FLAGS2_SAE_OFFLOAD_AP) && in wpa_driver_nl80211_set_ap()
5200 params->sae_password && in wpa_driver_nl80211_set_ap()
5202 os_strlen(params->sae_password), params->sae_password)) in wpa_driver_nl80211_set_ap()
5208 if (params->key_mgmt_suites & WPA_KEY_MGMT_IEEE8021X_NO_WPA && in wpa_driver_nl80211_set_ap()
5209 (!params->pairwise_ciphers || in wpa_driver_nl80211_set_ap()
5210 params->pairwise_ciphers & (WPA_CIPHER_WEP104 | WPA_CIPHER_WEP40)) && in wpa_driver_nl80211_set_ap()
5214 if (drv->device_ap_sme) { in wpa_driver_nl80211_set_ap()
5217 if (params->key_mgmt_suites & (WPA_KEY_MGMT_SAE | in wpa_driver_nl80211_set_ap()
5237 params->pairwise_ciphers); in wpa_driver_nl80211_set_ap()
5238 num_suites = wpa_cipher_to_cipher_suites(params->pairwise_ciphers, in wpa_driver_nl80211_set_ap()
5246 params->group_cipher); in wpa_driver_nl80211_set_ap()
5247 suite = wpa_cipher_to_cipher_suite(params->group_cipher); in wpa_driver_nl80211_set_ap()
5252 if (params->beacon_ies) { in wpa_driver_nl80211_set_ap()
5254 params->beacon_ies); in wpa_driver_nl80211_set_ap()
5256 wpabuf_len(params->beacon_ies), in wpa_driver_nl80211_set_ap()
5257 wpabuf_head(params->beacon_ies))) in wpa_driver_nl80211_set_ap()
5260 if (params->proberesp_ies) { in wpa_driver_nl80211_set_ap()
5262 params->proberesp_ies); in wpa_driver_nl80211_set_ap()
5264 wpabuf_len(params->proberesp_ies), in wpa_driver_nl80211_set_ap()
5265 wpabuf_head(params->proberesp_ies))) in wpa_driver_nl80211_set_ap()
5268 if (params->assocresp_ies) { in wpa_driver_nl80211_set_ap()
5270 params->assocresp_ies); in wpa_driver_nl80211_set_ap()
5272 wpabuf_len(params->assocresp_ies), in wpa_driver_nl80211_set_ap()
5273 wpabuf_head(params->assocresp_ies))) in wpa_driver_nl80211_set_ap()
5277 if (drv->capa.flags & WPA_DRIVER_FLAGS_INACTIVITY_TIMER) { in wpa_driver_nl80211_set_ap()
5279 params->ap_max_inactivity); in wpa_driver_nl80211_set_ap()
5281 params->ap_max_inactivity)) in wpa_driver_nl80211_set_ap()
5286 if (params->p2p_go_ctwindow > 0) { in wpa_driver_nl80211_set_ap()
5287 if (drv->p2p_go_ctwindow_supported) { in wpa_driver_nl80211_set_ap()
5289 params->p2p_go_ctwindow); in wpa_driver_nl80211_set_ap()
5291 params->p2p_go_ctwindow)) in wpa_driver_nl80211_set_ap()
5295 "nl80211: Driver does not support CTWindow configuration - ignore this parameter"); in wpa_driver_nl80211_set_ap()
5300 if (params->pbss) { in wpa_driver_nl80211_set_ap()
5306 if (params->ftm_responder) { in wpa_driver_nl80211_set_ap()
5307 struct nlattr *ftm; in wpa_driver_nl80211_set_ap() local
5309 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_FTM_RESPONDER)) { in wpa_driver_nl80211_set_ap()
5310 ret = -ENOTSUP; in wpa_driver_nl80211_set_ap()
5314 ftm = nla_nest_start(msg, NL80211_ATTR_FTM_RESPONDER); in wpa_driver_nl80211_set_ap()
5315 if (!ftm || in wpa_driver_nl80211_set_ap()
5317 (params->lci && in wpa_driver_nl80211_set_ap()
5319 wpabuf_len(params->lci), in wpa_driver_nl80211_set_ap()
5320 wpabuf_head(params->lci))) || in wpa_driver_nl80211_set_ap()
5321 (params->civic && in wpa_driver_nl80211_set_ap()
5323 wpabuf_len(params->civic), in wpa_driver_nl80211_set_ap()
5324 wpabuf_head(params->civic)))) in wpa_driver_nl80211_set_ap()
5326 nla_nest_end(msg, ftm); in wpa_driver_nl80211_set_ap()
5329 if (params->freq && nl80211_put_freq_params(msg, params->freq) < 0) in wpa_driver_nl80211_set_ap()
5333 if (params->he_spr_ctrl) { in wpa_driver_nl80211_set_ap()
5338 params->he_spr_ctrl); in wpa_driver_nl80211_set_ap()
5342 params->he_spr_ctrl) || in wpa_driver_nl80211_set_ap()
5343 ((params->he_spr_ctrl & in wpa_driver_nl80211_set_ap()
5346 params->he_spr_non_srg_obss_pd_max_offset))) in wpa_driver_nl80211_set_ap()
5349 if ((params->he_spr_ctrl & in wpa_driver_nl80211_set_ap()
5352 params->he_spr_srg_obss_pd_min_offset) || in wpa_driver_nl80211_set_ap()
5354 params->he_spr_srg_obss_pd_max_offset) || in wpa_driver_nl80211_set_ap()
5356 sizeof(params->he_spr_bss_color_bitmap), in wpa_driver_nl80211_set_ap()
5357 params->he_spr_bss_color_bitmap) || in wpa_driver_nl80211_set_ap()
5359 sizeof(params->he_spr_partial_bssid_bitmap), in wpa_driver_nl80211_set_ap()
5360 params->he_spr_partial_bssid_bitmap))) in wpa_driver_nl80211_set_ap()
5366 if (params->freq && params->freq->he_enabled && in wpa_driver_nl80211_set_ap()
5372 (params->he_bss_color_disabled && in wpa_driver_nl80211_set_ap()
5374 (params->he_bss_color_partial && in wpa_driver_nl80211_set_ap()
5377 params->he_bss_color)) in wpa_driver_nl80211_set_ap()
5382 if (params->twt_responder) { in wpa_driver_nl80211_set_ap()
5384 params->twt_responder); in wpa_driver_nl80211_set_ap()
5389 if (params->ubpr.unsol_bcast_probe_resp_interval && in wpa_driver_nl80211_set_ap()
5390 nl80211_unsol_bcast_probe_resp(bss, msg, &params->ubpr) < 0) in wpa_driver_nl80211_set_ap()
5398 if (wpa_key_mgmt_sae(params->key_mgmt_suites) && in wpa_driver_nl80211_set_ap()
5399 nl80211_put_sae_pwe(msg, params->sae_pwe) < 0) in wpa_driver_nl80211_set_ap()
5404 if (params->fd_max_int && nl80211_fils_discovery(bss, msg, params) < 0) in wpa_driver_nl80211_set_ap()
5408 if (params->punct_bitmap) { in wpa_driver_nl80211_set_ap()
5410 params->punct_bitmap); in wpa_driver_nl80211_set_ap()
5412 params->punct_bitmap)) in wpa_driver_nl80211_set_ap()
5417 if (cmd == NL80211_CMD_NEW_BEACON && params->allowed_freqs) in wpa_driver_nl80211_set_ap()
5418 qca_set_allowed_ap_freqs(drv, params->allowed_freqs, in wpa_driver_nl80211_set_ap()
5419 int_array_len(params->allowed_freqs), in wpa_driver_nl80211_set_ap()
5420 params->mld_ap ? params->mld_link_id : in wpa_driver_nl80211_set_ap()
5426 ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, in wpa_driver_nl80211_set_ap()
5430 ret, strerror(-ret)); in wpa_driver_nl80211_set_ap()
5432 link->beacon_set = 1; in wpa_driver_nl80211_set_ap()
5433 nl80211_set_bss(bss, params->cts_protect, params->preamble, in wpa_driver_nl80211_set_ap()
5434 params->short_slot_time, params->ht_opmode, in wpa_driver_nl80211_set_ap()
5435 params->isolate, params->basic_rates, in wpa_driver_nl80211_set_ap()
5436 params->mld_ap ? params->mld_link_id : in wpa_driver_nl80211_set_ap()
5439 params->multicast_to_unicast); in wpa_driver_nl80211_set_ap()
5440 if (beacon_set && params->freq && in wpa_driver_nl80211_set_ap()
5441 params->freq->bandwidth != link->bandwidth) { in wpa_driver_nl80211_set_ap()
5443 "nl80211: Update BSS %s bandwidth: %d -> %d", in wpa_driver_nl80211_set_ap()
5444 bss->ifname, link->bandwidth, in wpa_driver_nl80211_set_ap()
5445 params->freq->bandwidth); in wpa_driver_nl80211_set_ap()
5446 ret = nl80211_set_channel(bss, params->freq, 1); in wpa_driver_nl80211_set_ap()
5450 ret, strerror(-ret)); in wpa_driver_nl80211_set_ap()
5454 link->bandwidth = params->freq->bandwidth; in wpa_driver_nl80211_set_ap()
5456 } else if (!beacon_set && params->freq) { in wpa_driver_nl80211_set_ap()
5462 link->bandwidth = params->freq->bandwidth; in wpa_driver_nl80211_set_ap()
5467 if (is_mesh_interface(drv->nlmode) && params->ht_opmode != -1) { in wpa_driver_nl80211_set_ap()
5470 mesh_params.ht_opmode = params->ht_opmode; in wpa_driver_nl80211_set_ap()
5487 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_channel()
5493 freq->freq, freq->ht_enabled, freq->vht_enabled, in nl80211_set_channel()
5494 freq->he_enabled, freq->eht_enabled, freq->bandwidth, in nl80211_set_channel()
5495 freq->center_freq1, freq->center_freq2); in nl80211_set_channel()
5501 return -1; in nl80211_set_channel()
5504 if (nl80211_link_valid(bss->valid_links, freq->link_id)) { in nl80211_set_channel()
5506 freq->link_id); in nl80211_set_channel()
5508 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, freq->link_id)) { in nl80211_set_channel()
5510 return -ENOBUFS; in nl80211_set_channel()
5516 nl80211_link_set_freq(bss, freq->link_id, freq->freq); in nl80211_set_channel()
5520 "%d (%s)", freq->freq, ret, strerror(-ret)); in nl80211_set_channel()
5521 return -1; in nl80211_set_channel()
5570 return -1; in sta_plink_state_nl80211()
5579 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_sta_add()
5582 int ret = -ENOBUFS; in wpa_driver_nl80211_sta_add()
5586 if ((params->flags & WPA_STA_TDLS_PEER) && in wpa_driver_nl80211_sta_add()
5587 !(drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_SUPPORT)) in wpa_driver_nl80211_sta_add()
5588 return -EOPNOTSUPP; in wpa_driver_nl80211_sta_add()
5590 if (params->mld_link_sta) { in wpa_driver_nl80211_sta_add()
5591 cmd = params->set ? NL80211_CMD_MODIFY_LINK_STA : in wpa_driver_nl80211_sta_add()
5593 cmd_string = params->set ? "NL80211_CMD_MODIFY_LINK_STA" : in wpa_driver_nl80211_sta_add()
5596 cmd = params->set ? NL80211_CMD_SET_STATION : in wpa_driver_nl80211_sta_add()
5598 cmd_string = params->set ? "NL80211_CMD_SET_STATION" : in wpa_driver_nl80211_sta_add()
5603 cmd_string, MAC2STR(params->addr)); in wpa_driver_nl80211_sta_add()
5616 if (!params->set || (params->flags & WPA_STA_TDLS_PEER) || in wpa_driver_nl80211_sta_add()
5617 (params->set && FULL_AP_CLIENT_STATE_SUPP(drv->capa.flags) && in wpa_driver_nl80211_sta_add()
5618 (params->flags & WPA_STA_ASSOCIATED))) { in wpa_driver_nl80211_sta_add()
5620 params->supp_rates, params->supp_rates_len); in wpa_driver_nl80211_sta_add()
5622 params->capability); in wpa_driver_nl80211_sta_add()
5624 params->supp_rates_len, params->supp_rates) || in wpa_driver_nl80211_sta_add()
5626 params->capability)) in wpa_driver_nl80211_sta_add()
5629 if (params->ht_capabilities) { in wpa_driver_nl80211_sta_add()
5631 (u8 *) params->ht_capabilities, in wpa_driver_nl80211_sta_add()
5632 sizeof(*params->ht_capabilities)); in wpa_driver_nl80211_sta_add()
5634 sizeof(*params->ht_capabilities), in wpa_driver_nl80211_sta_add()
5635 params->ht_capabilities)) in wpa_driver_nl80211_sta_add()
5639 if (params->vht_capabilities) { in wpa_driver_nl80211_sta_add()
5641 (u8 *) params->vht_capabilities, in wpa_driver_nl80211_sta_add()
5642 sizeof(*params->vht_capabilities)); in wpa_driver_nl80211_sta_add()
5644 sizeof(*params->vht_capabilities), in wpa_driver_nl80211_sta_add()
5645 params->vht_capabilities)) in wpa_driver_nl80211_sta_add()
5649 if (params->he_capab) { in wpa_driver_nl80211_sta_add()
5651 params->he_capab, params->he_capab_len); in wpa_driver_nl80211_sta_add()
5653 params->he_capab_len, params->he_capab)) in wpa_driver_nl80211_sta_add()
5657 if (params->he_6ghz_capab) { in wpa_driver_nl80211_sta_add()
5659 params->he_6ghz_capab, in wpa_driver_nl80211_sta_add()
5660 sizeof(*params->he_6ghz_capab)); in wpa_driver_nl80211_sta_add()
5662 sizeof(*params->he_6ghz_capab), in wpa_driver_nl80211_sta_add()
5663 params->he_6ghz_capab)) in wpa_driver_nl80211_sta_add()
5667 if (params->eht_capab) { in wpa_driver_nl80211_sta_add()
5669 params->eht_capab, params->eht_capab_len); in wpa_driver_nl80211_sta_add()
5671 params->eht_capab_len, params->eht_capab)) in wpa_driver_nl80211_sta_add()
5675 if (params->ext_capab) { in wpa_driver_nl80211_sta_add()
5677 params->ext_capab, params->ext_capab_len); in wpa_driver_nl80211_sta_add()
5679 params->ext_capab_len, params->ext_capab)) in wpa_driver_nl80211_sta_add()
5683 if (is_ap_interface(drv->nlmode) && in wpa_driver_nl80211_sta_add()
5685 params->support_p2p_ps ? in wpa_driver_nl80211_sta_add()
5690 if (!params->set) { in wpa_driver_nl80211_sta_add()
5691 if (params->aid) { in wpa_driver_nl80211_sta_add()
5692 wpa_printf(MSG_DEBUG, " * aid=%u", params->aid); in wpa_driver_nl80211_sta_add()
5693 if (nla_put_u16(msg, NL80211_ATTR_STA_AID, params->aid)) in wpa_driver_nl80211_sta_add()
5697 * cfg80211 validates that AID is non-zero, so we have in wpa_driver_nl80211_sta_add()
5698 * to make this a non-zero value for the TDLS case where in wpa_driver_nl80211_sta_add()
5703 (params->flags & WPA_STA_TDLS_PEER) ? in wpa_driver_nl80211_sta_add()
5709 params->listen_interval); in wpa_driver_nl80211_sta_add()
5711 params->listen_interval)) in wpa_driver_nl80211_sta_add()
5713 } else if (params->aid && (params->flags & WPA_STA_TDLS_PEER)) { in wpa_driver_nl80211_sta_add()
5714 wpa_printf(MSG_DEBUG, " * peer_aid=%u", params->aid); in wpa_driver_nl80211_sta_add()
5715 if (nla_put_u16(msg, NL80211_ATTR_PEER_AID, params->aid)) in wpa_driver_nl80211_sta_add()
5717 } else if (FULL_AP_CLIENT_STATE_SUPP(drv->capa.flags) && in wpa_driver_nl80211_sta_add()
5718 (params->flags & WPA_STA_ASSOCIATED)) { in wpa_driver_nl80211_sta_add()
5719 wpa_printf(MSG_DEBUG, " * aid=%u", params->aid); in wpa_driver_nl80211_sta_add()
5721 params->listen_interval); in wpa_driver_nl80211_sta_add()
5722 if (nla_put_u16(msg, NL80211_ATTR_STA_AID, params->aid) || in wpa_driver_nl80211_sta_add()
5724 params->listen_interval)) in wpa_driver_nl80211_sta_add()
5728 if (params->vht_opmode_enabled) { in wpa_driver_nl80211_sta_add()
5729 wpa_printf(MSG_DEBUG, " * opmode=%u", params->vht_opmode); in wpa_driver_nl80211_sta_add()
5731 params->vht_opmode)) in wpa_driver_nl80211_sta_add()
5735 if (params->supp_channels) { in wpa_driver_nl80211_sta_add()
5737 params->supp_channels, params->supp_channels_len); in wpa_driver_nl80211_sta_add()
5739 params->supp_channels_len, params->supp_channels)) in wpa_driver_nl80211_sta_add()
5743 if (params->supp_oper_classes) { in wpa_driver_nl80211_sta_add()
5745 params->supp_oper_classes, in wpa_driver_nl80211_sta_add()
5746 params->supp_oper_classes_len); in wpa_driver_nl80211_sta_add()
5748 params->supp_oper_classes_len, in wpa_driver_nl80211_sta_add()
5749 params->supp_oper_classes)) in wpa_driver_nl80211_sta_add()
5754 upd.set = sta_flags_nl80211(params->flags); in wpa_driver_nl80211_sta_add()
5755 upd.mask = upd.set | sta_flags_nl80211(params->flags_mask); in wpa_driver_nl80211_sta_add()
5771 if (!is_mesh_interface(drv->nlmode)) { in wpa_driver_nl80211_sta_add()
5772 if (!FULL_AP_CLIENT_STATE_SUPP(drv->capa.flags)) { in wpa_driver_nl80211_sta_add()
5777 } else if (!params->set && in wpa_driver_nl80211_sta_add()
5778 !(params->flags & WPA_STA_TDLS_PEER)) { in wpa_driver_nl80211_sta_add()
5779 if (!(params->flags & WPA_STA_AUTHENTICATED)) in wpa_driver_nl80211_sta_add()
5781 if (!(params->flags & WPA_STA_ASSOCIATED)) in wpa_driver_nl80211_sta_add()
5786 if (params->plink_state == PLINK_ESTAB && params->peer_aid) { in wpa_driver_nl80211_sta_add()
5788 params->peer_aid); in wpa_driver_nl80211_sta_add()
5801 if (params->plink_state && in wpa_driver_nl80211_sta_add()
5803 sta_plink_state_nl80211(params->plink_state))) in wpa_driver_nl80211_sta_add()
5807 if ((!params->set || (params->flags & WPA_STA_TDLS_PEER) || in wpa_driver_nl80211_sta_add()
5808 FULL_AP_CLIENT_STATE_SUPP(drv->capa.flags)) && in wpa_driver_nl80211_sta_add()
5809 (params->flags & WPA_STA_WMM)) { in wpa_driver_nl80211_sta_add()
5812 wpa_printf(MSG_DEBUG, " * qosinfo=0x%x", params->qosinfo); in wpa_driver_nl80211_sta_add()
5815 params->qosinfo & WMM_QOSINFO_STA_AC_MASK) || in wpa_driver_nl80211_sta_add()
5817 (params->qosinfo >> WMM_QOSINFO_STA_SP_SHIFT) & in wpa_driver_nl80211_sta_add()
5824 if (params->mld_link_id >= 0) { in wpa_driver_nl80211_sta_add()
5826 params->mld_link_id); in wpa_driver_nl80211_sta_add()
5828 params->mld_link_id)) in wpa_driver_nl80211_sta_add()
5832 * If the link address is specified the station is a non-AP MLD in wpa_driver_nl80211_sta_add()
5834 * address, and the non-AP MLD link address as the link address. in wpa_driver_nl80211_sta_add()
5836 if (params->mld_link_addr) { in wpa_driver_nl80211_sta_add()
5838 MAC2STR(params->mld_link_addr)); in wpa_driver_nl80211_sta_add()
5841 ETH_ALEN, params->addr) || in wpa_driver_nl80211_sta_add()
5843 params->mld_link_addr)) in wpa_driver_nl80211_sta_add()
5847 params->addr)) in wpa_driver_nl80211_sta_add()
5851 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, params->addr)) in wpa_driver_nl80211_sta_add()
5859 cmd_string, ret, strerror(-ret)); in wpa_driver_nl80211_sta_add()
5860 if (ret == -EEXIST) in wpa_driver_nl80211_sta_add()
5870 struct wpa_driver_nl80211_data *drv = bss->drv; in rtnl_neigh_delete_fdb_entry()
5873 .ndm_ifindex = bss->ifindex, in rtnl_neigh_delete_fdb_entry()
5885 nl_send_auto_complete(drv->rtnl_sk, msg) < 0) in rtnl_neigh_delete_fdb_entry()
5888 err = nl_wait_for_ack(drv->rtnl_sk); in rtnl_neigh_delete_fdb_entry()
5892 bss->ifindex, nl_geterror(err)); in rtnl_neigh_delete_fdb_entry()
5906 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_sta_remove()
5921 return -ENOBUFS; in wpa_driver_nl80211_sta_remove()
5925 wpa_printf(MSG_DEBUG, "nl80211: sta_remove -> DEL_STATION %s " MACSTR in wpa_driver_nl80211_sta_remove()
5926 " --> %d (%s)", in wpa_driver_nl80211_sta_remove()
5927 bss->ifname, MAC2STR(addr), ret, strerror(-ret)); in wpa_driver_nl80211_sta_remove()
5929 if (drv->rtnl_sk) in wpa_driver_nl80211_sta_remove()
5932 if (ret == -ENOENT) in wpa_driver_nl80211_sta_remove()
5946 dl_list_for_each(drv2, &drv->global->interfaces, in nl80211_remove_iface()
6003 int ret = -ENOBUFS; in nl80211_create_iface_once()
6008 msg = nl80211_cmd_msg(drv->first_bss, 0, NL80211_CMD_NEW_INTERFACE); in nl80211_create_iface_once()
6045 ifname, ret, strerror(-ret)); in nl80211_create_iface_once()
6057 return -1; in nl80211_create_iface_once()
6063 if (drv->hostapd || in nl80211_create_iface_once()
6072 linux_set_ifhwaddr(drv->global->ioctl_sock, ifname, addr)) { in nl80211_create_iface_once()
6074 return -1; in nl80211_create_iface_once()
6093 if (ret == -ENFILE && if_nametoindex(ifname)) { in nl80211_create_iface()
6098 linux_set_ifhwaddr(drv->global->ioctl_sock, ifname, in nl80211_create_iface()
6100 (linux_set_iface_flags(drv->global->ioctl_sock, in nl80211_create_iface()
6102 linux_set_ifhwaddr(drv->global->ioctl_sock, ifname, in nl80211_create_iface()
6104 linux_set_iface_flags(drv->global->ioctl_sock, in nl80211_create_iface()
6106 return -1; in nl80211_create_iface()
6107 return -ENFILE; in nl80211_create_iface()
6109 wpa_printf(MSG_INFO, "Try to remove and re-create %s", ifname); in nl80211_create_iface()
6121 "nl80211: Interface %s created for P2P - disable 11b rates", in nl80211_create_iface()
6132 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_setup_ap()
6134 wpa_printf(MSG_DEBUG, "nl80211: Setup AP(%s) - device_ap_sme=%d use_monitor=%d", in nl80211_setup_ap()
6135 bss->ifname, drv->device_ap_sme, drv->use_monitor); in nl80211_setup_ap()
6142 if (!drv->device_ap_sme) in nl80211_setup_ap()
6145 if (!drv->device_ap_sme && !drv->use_monitor) in nl80211_setup_ap()
6147 return -1; in nl80211_setup_ap()
6149 if (drv->device_ap_sme && !drv->use_monitor) in nl80211_setup_ap()
6152 "nl80211: Failed to subscribe for mgmt frames from SME driver - trying to run without it"); in nl80211_setup_ap()
6154 if (!drv->device_ap_sme && drv->use_monitor && in nl80211_setup_ap()
6156 !drv->device_ap_sme) in nl80211_setup_ap()
6157 return -1; in nl80211_setup_ap()
6159 if (drv->device_ap_sme && in nl80211_setup_ap()
6172 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_teardown_ap()
6174 wpa_printf(MSG_DEBUG, "nl80211: Teardown AP(%s) - device_ap_sme=%d use_monitor=%d", in nl80211_teardown_ap()
6175 bss->ifname, drv->device_ap_sme, drv->use_monitor); in nl80211_teardown_ap()
6176 if (drv->device_ap_sme) { in nl80211_teardown_ap()
6178 if (!drv->use_monitor) in nl80211_teardown_ap()
6180 } else if (drv->use_monitor) in nl80211_teardown_ap()
6186 if (bss->flink) in nl80211_teardown_ap()
6187 bss->flink->beacon_set = 0; in nl80211_teardown_ap()
6216 return -ENOBUFS; in nl80211_tx_control_port()
6221 ret = send_and_recv(bss->drv->global, bss->drv->global->nl, msg, in nl80211_tx_control_port()
6226 ret, strerror(-ret)); in nl80211_tx_control_port()
6228 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_tx_control_port()
6233 drv->eapol_tx_cookie = cookie; in nl80211_tx_control_port()
6234 drv->eapol_tx_link_id = link_id; in nl80211_tx_control_port()
6248 if (bss->drv->eapol_tx_sock < 0) { in nl80211_send_eapol_data()
6250 return -1; in nl80211_send_eapol_data()
6255 ll.sll_ifindex = bss->ifindex; in nl80211_send_eapol_data()
6259 ret = sendto(bss->drv->eapol_tx_sock, data, data_len, 0, in nl80211_send_eapol_data()
6277 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_hapd_send_eapol()
6286 if (drv->control_port_ap && in wpa_driver_nl80211_hapd_send_eapol()
6287 (drv->capa.flags & WPA_DRIVER_FLAGS_CONTROL_PORT)) in wpa_driver_nl80211_hapd_send_eapol()
6292 if (drv->device_ap_sme || !drv->use_monitor) in wpa_driver_nl80211_hapd_send_eapol()
6301 return -1; in wpa_driver_nl80211_hapd_send_eapol()
6304 hdr->frame_control = in wpa_driver_nl80211_hapd_send_eapol()
6306 hdr->frame_control |= host_to_le16(WLAN_FC_FROMDS); in wpa_driver_nl80211_hapd_send_eapol()
6308 hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP); in wpa_driver_nl80211_hapd_send_eapol()
6310 hdr->frame_control |= in wpa_driver_nl80211_hapd_send_eapol()
6314 memcpy(hdr->IEEE80211_DA_FROMDS, addr, ETH_ALEN); in wpa_driver_nl80211_hapd_send_eapol()
6315 memcpy(hdr->IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN); in wpa_driver_nl80211_hapd_send_eapol()
6316 memcpy(hdr->IEEE80211_SA_FROMDS, own_addr, ETH_ALEN); in wpa_driver_nl80211_hapd_send_eapol()
6335 "hapd_send_eapol - packet len: %lu - failed", in wpa_driver_nl80211_hapd_send_eapol()
6354 wpa_printf(MSG_DEBUG, "nl80211: Set STA flags - ifname=%s addr=" MACSTR in wpa_driver_nl80211_sta_set_flags()
6356 bss->ifname, MAC2STR(addr), total_flags, flags_or, flags_and, in wpa_driver_nl80211_sta_set_flags()
6389 return send_and_recv_cmd(bss->drv, msg); in wpa_driver_nl80211_sta_set_flags()
6392 return -ENOBUFS; in wpa_driver_nl80211_sta_set_flags()
6404 "nl80211: Set STA airtime weight - ifname=%s addr=" MACSTR in driver_nl80211_sta_set_airtime_weight()
6405 " weight=%u", bss->ifname, MAC2STR(addr), weight); in driver_nl80211_sta_set_airtime_weight()
6412 ret = send_and_recv_cmd(bss->drv, msg); in driver_nl80211_sta_set_airtime_weight()
6416 ret, strerror(-ret)); in driver_nl80211_sta_set_airtime_weight()
6421 return -ENOBUFS; in driver_nl80211_sta_set_airtime_weight()
6430 if (params->p2p) { in wpa_driver_nl80211_ap()
6437 old_mode = drv->nlmode; in wpa_driver_nl80211_ap()
6438 if (wpa_driver_nl80211_set_mode(drv->first_bss, nlmode)) { in wpa_driver_nl80211_ap()
6440 return -1; in wpa_driver_nl80211_ap()
6443 if (params->freq.freq && in wpa_driver_nl80211_ap()
6444 nl80211_set_channel(drv->first_bss, &params->freq, 0)) { in wpa_driver_nl80211_ap()
6446 wpa_driver_nl80211_set_mode(drv->first_bss, old_mode); in wpa_driver_nl80211_ap()
6448 return -1; in wpa_driver_nl80211_ap()
6462 ret = send_and_recv(drv->global, drv->first_bss->nl_connect, msg, NULL, in nl80211_leave_ibss()
6466 "(%s)", ret, strerror(-ret)); in nl80211_leave_ibss()
6473 wpa_driver_nl80211_set_mode(drv->first_bss, in nl80211_leave_ibss()
6486 if (params->disable_ht && nla_put_flag(msg, NL80211_ATTR_DISABLE_HT)) in nl80211_ht_vht_overrides()
6487 return -1; in nl80211_ht_vht_overrides()
6489 if (params->htcaps && params->htcaps_mask) { in nl80211_ht_vht_overrides()
6491 wpa_hexdump(MSG_DEBUG, " * htcaps", params->htcaps, sz); in nl80211_ht_vht_overrides()
6493 params->htcaps_mask, sz); in nl80211_ht_vht_overrides()
6495 params->htcaps) || in nl80211_ht_vht_overrides()
6497 params->htcaps_mask)) in nl80211_ht_vht_overrides()
6498 return -1; in nl80211_ht_vht_overrides()
6502 if (params->disable_vht) { in nl80211_ht_vht_overrides()
6505 return -1; in nl80211_ht_vht_overrides()
6508 if (params->vhtcaps && params->vhtcaps_mask) { in nl80211_ht_vht_overrides()
6510 wpa_hexdump(MSG_DEBUG, " * vhtcaps", params->vhtcaps, sz); in nl80211_ht_vht_overrides()
6512 params->vhtcaps_mask, sz); in nl80211_ht_vht_overrides()
6514 params->vhtcaps) || in nl80211_ht_vht_overrides()
6516 params->vhtcaps_mask)) in nl80211_ht_vht_overrides()
6517 return -1; in nl80211_ht_vht_overrides()
6522 if (params->disable_he) { in nl80211_ht_vht_overrides()
6525 return -1; in nl80211_ht_vht_overrides()
6529 if (params->disable_eht) { in nl80211_ht_vht_overrides()
6532 return -1; in nl80211_ht_vht_overrides()
6543 int ret = -1; in wpa_driver_nl80211_ibss()
6546 wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex); in wpa_driver_nl80211_ibss()
6548 if (wpa_driver_nl80211_set_mode_ibss(drv->first_bss, &params->freq)) { in wpa_driver_nl80211_ibss()
6551 return -1; in wpa_driver_nl80211_ibss()
6556 params->ssid == NULL || params->ssid_len > sizeof(drv->ssid)) in wpa_driver_nl80211_ibss()
6560 wpa_ssid_txt(params->ssid, params->ssid_len)); in wpa_driver_nl80211_ibss()
6561 if (nla_put(msg, NL80211_ATTR_SSID, params->ssid_len, params->ssid)) in wpa_driver_nl80211_ibss()
6563 os_memcpy(drv->ssid, params->ssid, params->ssid_len); in wpa_driver_nl80211_ibss()
6564 drv->ssid_len = params->ssid_len; in wpa_driver_nl80211_ibss()
6566 if (nl80211_put_freq_params(msg, &params->freq) < 0 || in wpa_driver_nl80211_ibss()
6567 nl80211_put_beacon_int(msg, params->beacon_int)) in wpa_driver_nl80211_ibss()
6574 if (params->bssid && params->fixed_bssid) { in wpa_driver_nl80211_ibss()
6576 MAC2STR(params->bssid)); in wpa_driver_nl80211_ibss()
6577 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid)) in wpa_driver_nl80211_ibss()
6581 if (params->fixed_freq) { in wpa_driver_nl80211_ibss()
6587 if (params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X || in wpa_driver_nl80211_ibss()
6588 params->key_mgmt_suite == WPA_KEY_MGMT_PSK || in wpa_driver_nl80211_ibss()
6589 params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 || in wpa_driver_nl80211_ibss()
6590 params->key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 || in wpa_driver_nl80211_ibss()
6591 params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA384) { in wpa_driver_nl80211_ibss()
6597 if (params->wpa_ie) { in wpa_driver_nl80211_ibss()
6600 params->wpa_ie, params->wpa_ie_len); in wpa_driver_nl80211_ibss()
6601 if (nla_put(msg, NL80211_ATTR_IE, params->wpa_ie_len, in wpa_driver_nl80211_ibss()
6602 params->wpa_ie)) in wpa_driver_nl80211_ibss()
6612 ret = send_and_recv(drv->global, drv->first_bss->nl_connect, msg, NULL, in wpa_driver_nl80211_ibss()
6617 ret, strerror(-ret)); in wpa_driver_nl80211_ibss()
6619 if (ret == -EALREADY && count == 1) { in wpa_driver_nl80211_ibss()
6641 if (params->fils_erp_username_len) { in nl80211_put_fils_connect_params()
6643 params->fils_erp_username, in nl80211_put_fils_connect_params()
6644 params->fils_erp_username_len); in nl80211_put_fils_connect_params()
6646 params->fils_erp_username_len, in nl80211_put_fils_connect_params()
6647 params->fils_erp_username)) in nl80211_put_fils_connect_params()
6648 return -1; in nl80211_put_fils_connect_params()
6651 if (params->fils_erp_realm_len) { in nl80211_put_fils_connect_params()
6653 params->fils_erp_realm, in nl80211_put_fils_connect_params()
6654 params->fils_erp_realm_len); in nl80211_put_fils_connect_params()
6656 params->fils_erp_realm_len, params->fils_erp_realm)) in nl80211_put_fils_connect_params()
6657 return -1; in nl80211_put_fils_connect_params()
6660 if (params->fils_erp_rrk_len) { in nl80211_put_fils_connect_params()
6662 params->fils_erp_next_seq_num); in nl80211_put_fils_connect_params()
6664 params->fils_erp_next_seq_num)) in nl80211_put_fils_connect_params()
6665 return -1; in nl80211_put_fils_connect_params()
6668 (unsigned long) params->fils_erp_rrk_len); in nl80211_put_fils_connect_params()
6670 params->fils_erp_rrk_len, params->fils_erp_rrk)) in nl80211_put_fils_connect_params()
6671 return -1; in nl80211_put_fils_connect_params()
6683 val &= val - 1; in num_bits_set()
6693 if (params->mld_params.mld_addr && params->mld_params.valid_links > 0) { in nl80211_connect_common()
6694 struct wpa_driver_mld_params *mld_params = &params->mld_params; in nl80211_connect_common()
6699 MAC2STR(mld_params->mld_addr)); in nl80211_connect_common()
6702 mld_params->mld_addr) || in nl80211_connect_common()
6704 mld_params->assoc_link_id)) in nl80211_connect_common()
6705 return -1; in nl80211_connect_common()
6709 return -1; in nl80211_connect_common()
6711 for_each_link(mld_params->valid_links, link_id) { in nl80211_connect_common()
6714 return -1; in nl80211_connect_common()
6719 mld_params->mld_links[link_id].bssid) || in nl80211_connect_common()
6721 mld_params->mld_links[link_id].freq) || in nl80211_connect_common()
6722 (mld_params->mld_links[link_id].disabled && in nl80211_connect_common()
6725 (mld_params->mld_links[link_id].ies && in nl80211_connect_common()
6726 mld_params->mld_links[link_id].ies_len && in nl80211_connect_common()
6728 mld_params->mld_links[link_id].ies_len, in nl80211_connect_common()
6729 mld_params->mld_links[link_id].ies))) in nl80211_connect_common()
6730 return -1; in nl80211_connect_common()
6732 os_memcpy(drv->sta_mlo_info.links[link_id].bssid, in nl80211_connect_common()
6733 mld_params->mld_links[link_id].bssid, in nl80211_connect_common()
6740 os_memcpy(drv->sta_mlo_info.ap_mld_addr, in nl80211_connect_common()
6741 params->mld_params.mld_addr, ETH_ALEN); in nl80211_connect_common()
6742 drv->sta_mlo_info.assoc_link_id = mld_params->assoc_link_id; in nl80211_connect_common()
6743 drv->sta_mlo_info.req_links = mld_params->valid_links; in nl80211_connect_common()
6747 return -1; in nl80211_connect_common()
6749 if (params->bssid && !params->mld_params.mld_addr) { in nl80211_connect_common()
6751 MAC2STR(params->bssid)); in nl80211_connect_common()
6752 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid)) in nl80211_connect_common()
6753 return -1; in nl80211_connect_common()
6756 if (params->bssid_hint) { in nl80211_connect_common()
6758 MAC2STR(params->bssid_hint)); in nl80211_connect_common()
6760 params->bssid_hint)) in nl80211_connect_common()
6761 return -1; in nl80211_connect_common()
6764 if (params->freq.freq && !params->mld_params.mld_addr) { in nl80211_connect_common()
6765 wpa_printf(MSG_DEBUG, " * freq=%d", params->freq.freq); in nl80211_connect_common()
6767 params->freq.freq)) in nl80211_connect_common()
6768 return -1; in nl80211_connect_common()
6769 drv->assoc_freq = params->freq.freq; in nl80211_connect_common()
6771 drv->assoc_freq = 0; in nl80211_connect_common()
6773 if (params->freq_hint) { in nl80211_connect_common()
6774 wpa_printf(MSG_DEBUG, " * freq_hint=%d", params->freq_hint); in nl80211_connect_common()
6776 params->freq_hint)) in nl80211_connect_common()
6777 return -1; in nl80211_connect_common()
6780 if (params->freq.edmg.channels && params->freq.edmg.bw_config) { in nl80211_connect_common()
6783 params->freq.edmg.channels, in nl80211_connect_common()
6784 params->freq.edmg.bw_config); in nl80211_connect_common()
6786 params->freq.edmg.channels) || in nl80211_connect_common()
6788 params->freq.edmg.bw_config)) in nl80211_connect_common()
6789 return -1; in nl80211_connect_common()
6792 if (params->bg_scan_period >= 0) { in nl80211_connect_common()
6794 params->bg_scan_period); in nl80211_connect_common()
6796 params->bg_scan_period)) in nl80211_connect_common()
6797 return -1; in nl80211_connect_common()
6800 if (params->ssid) { in nl80211_connect_common()
6802 wpa_ssid_txt(params->ssid, params->ssid_len)); in nl80211_connect_common()
6803 if (nla_put(msg, NL80211_ATTR_SSID, params->ssid_len, in nl80211_connect_common()
6804 params->ssid)) in nl80211_connect_common()
6805 return -1; in nl80211_connect_common()
6806 if (params->ssid_len > sizeof(drv->ssid)) in nl80211_connect_common()
6807 return -1; in nl80211_connect_common()
6808 os_memcpy(drv->ssid, params->ssid, params->ssid_len); in nl80211_connect_common()
6809 drv->ssid_len = params->ssid_len; in nl80211_connect_common()
6812 wpa_hexdump(MSG_DEBUG, " * IEs", params->wpa_ie, params->wpa_ie_len); in nl80211_connect_common()
6813 if (params->wpa_ie && in nl80211_connect_common()
6814 nla_put(msg, NL80211_ATTR_IE, params->wpa_ie_len, params->wpa_ie)) in nl80211_connect_common()
6815 return -1; in nl80211_connect_common()
6817 if (params->wpa_proto) { in nl80211_connect_common()
6820 if (params->wpa_proto & WPA_PROTO_WPA) in nl80211_connect_common()
6822 if (params->wpa_proto & WPA_PROTO_RSN) { in nl80211_connect_common()
6829 wpa_key_mgmt_sae(params->key_mgmt_suite)) in nl80211_connect_common()
6837 return -1; in nl80211_connect_common()
6840 if (params->pairwise_suite != WPA_CIPHER_NONE) { in nl80211_connect_common()
6841 u32 cipher = wpa_cipher_to_cipher_suite(params->pairwise_suite); in nl80211_connect_common()
6845 return -1; in nl80211_connect_common()
6848 if (params->group_suite == WPA_CIPHER_GTK_NOT_USED && in nl80211_connect_common()
6849 !(drv->capa.enc & WPA_DRIVER_CAPA_ENC_GTK_NOT_USED)) { in nl80211_connect_common()
6855 } else if (params->group_suite != WPA_CIPHER_NONE) { in nl80211_connect_common()
6856 u32 cipher = wpa_cipher_to_cipher_suite(params->group_suite); in nl80211_connect_common()
6859 return -1; in nl80211_connect_common()
6862 if (params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X || in nl80211_connect_common()
6863 params->key_mgmt_suite == WPA_KEY_MGMT_PSK || in nl80211_connect_common()
6864 params->key_mgmt_suite == WPA_KEY_MGMT_FT_IEEE8021X || in nl80211_connect_common()
6865 params->key_mgmt_suite == WPA_KEY_MGMT_FT_PSK || in nl80211_connect_common()
6866 params->key_mgmt_suite == WPA_KEY_MGMT_CCKM || in nl80211_connect_common()
6867 params->key_mgmt_suite == WPA_KEY_MGMT_OSEN || in nl80211_connect_common()
6868 params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 || in nl80211_connect_common()
6869 params->key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 || in nl80211_connect_common()
6870 params->key_mgmt_suite == WPA_KEY_MGMT_SAE || in nl80211_connect_common()
6871 params->key_mgmt_suite == WPA_KEY_MGMT_SAE_EXT_KEY || in nl80211_connect_common()
6872 params->key_mgmt_suite == WPA_KEY_MGMT_FT_SAE || in nl80211_connect_common()
6873 params->key_mgmt_suite == WPA_KEY_MGMT_FT_SAE_EXT_KEY || in nl80211_connect_common()
6874 params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B || in nl80211_connect_common()
6875 params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192 || in nl80211_connect_common()
6876 params->key_mgmt_suite == WPA_KEY_MGMT_FT_IEEE8021X_SHA384 || in nl80211_connect_common()
6877 params->key_mgmt_suite == WPA_KEY_MGMT_FILS_SHA256 || in nl80211_connect_common()
6878 params->key_mgmt_suite == WPA_KEY_MGMT_FILS_SHA384 || in nl80211_connect_common()
6879 params->key_mgmt_suite == WPA_KEY_MGMT_FT_FILS_SHA256 || in nl80211_connect_common()
6880 params->key_mgmt_suite == WPA_KEY_MGMT_FT_FILS_SHA384 || in nl80211_connect_common()
6881 params->key_mgmt_suite == WPA_KEY_MGMT_OWE || in nl80211_connect_common()
6882 params->key_mgmt_suite == WPA_KEY_MGMT_DPP || in nl80211_connect_common()
6883 params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA384) { in nl80211_connect_common()
6891 if (drv->capa.max_num_akms <= in nl80211_connect_common()
6892 num_bits_set(params->allowed_key_mgmts)) { in nl80211_connect_common()
6895 drv->capa.max_num_akms, in nl80211_connect_common()
6896 num_bits_set(params->allowed_key_mgmts)); in nl80211_connect_common()
6897 return -1; in nl80211_connect_common()
6900 mgmt = os_malloc(sizeof(u32) * drv->capa.max_num_akms); in nl80211_connect_common()
6902 return -1; in nl80211_connect_common()
6906 switch (params->key_mgmt_suite) { in nl80211_connect_common()
6976 if (drv->capa.max_num_akms > 1) { in nl80211_connect_common()
6978 params->allowed_key_mgmts, &mgmt[1], in nl80211_connect_common()
6979 drv->capa.max_num_akms - 1); in nl80211_connect_common()
6988 return -1; in nl80211_connect_common()
6994 if (params->req_handshake_offload && in nl80211_connect_common()
6995 (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X)) { in nl80211_connect_common()
6998 return -1; in nl80211_connect_common()
7001 /* Add PSK in case of 4-way handshake offload */ in nl80211_connect_common()
7002 if (params->psk && in nl80211_connect_common()
7003 (drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK)) { in nl80211_connect_common()
7004 wpa_hexdump_key(MSG_DEBUG, " * PSK", params->psk, 32); in nl80211_connect_common()
7005 if (nla_put(msg, NL80211_ATTR_PMK, 32, params->psk)) in nl80211_connect_common()
7006 return -1; in nl80211_connect_common()
7010 return -1; in nl80211_connect_common()
7012 if (params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_NO_WPA && in nl80211_connect_common()
7013 (params->pairwise_suite == WPA_CIPHER_NONE || in nl80211_connect_common()
7014 params->pairwise_suite == WPA_CIPHER_WEP104 || in nl80211_connect_common()
7015 params->pairwise_suite == WPA_CIPHER_WEP40) && in nl80211_connect_common()
7017 return -1; in nl80211_connect_common()
7019 if (params->rrm_used) { in nl80211_connect_common()
7020 u32 drv_rrm_flags = drv->capa.rrm_flags; in nl80211_connect_common()
7026 return -1; in nl80211_connect_common()
7030 return -1; in nl80211_connect_common()
7032 if (params->p2p) in nl80211_connect_common()
7035 if (params->pbss) { in nl80211_connect_common()
7038 return -1; in nl80211_connect_common()
7041 drv->connect_reassoc = 0; in nl80211_connect_common()
7042 if (params->prev_bssid) { in nl80211_connect_common()
7044 MAC2STR(params->prev_bssid)); in nl80211_connect_common()
7046 params->prev_bssid)) in nl80211_connect_common()
7047 return -1; in nl80211_connect_common()
7048 drv->connect_reassoc = 1; in nl80211_connect_common()
7051 if ((params->auth_alg & WPA_AUTH_ALG_FILS) && in nl80211_connect_common()
7053 return -1; in nl80211_connect_common()
7055 if ((wpa_key_mgmt_sae(params->key_mgmt_suite) || in nl80211_connect_common()
7056 wpa_key_mgmt_sae(params->allowed_key_mgmts)) && in nl80211_connect_common()
7057 (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) && in nl80211_connect_common()
7059 return -1; in nl80211_connect_common()
7061 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME) && in nl80211_connect_common()
7063 return -1; in nl80211_connect_common()
7080 if (params->req_key_mgmt_offload && params->psk && in wpa_driver_nl80211_try_connect()
7081 (wpa_key_mgmt_wpa_psk_no_sae(params->key_mgmt_suite) || in wpa_driver_nl80211_try_connect()
7082 wpa_key_mgmt_wpa_psk_no_sae(params->allowed_key_mgmts))) { in wpa_driver_nl80211_try_connect()
7084 ret = issue_key_mgmt_set_key(drv, params->psk, 32); in wpa_driver_nl80211_try_connect()
7090 wpa_printf(MSG_DEBUG, "nl80211: Connect (ifindex=%d)", drv->ifindex); in wpa_driver_nl80211_try_connect()
7093 return -1; in wpa_driver_nl80211_try_connect()
7099 if (params->mgmt_frame_protection == MGMT_FRAME_PROTECTION_REQUIRED && in wpa_driver_nl80211_try_connect()
7103 if (params->mgmt_frame_protection == MGMT_FRAME_PROTECTION_OPTIONAL && in wpa_driver_nl80211_try_connect()
7104 (drv->capa.flags & WPA_DRIVER_FLAGS_MFP_OPTIONAL) && in wpa_driver_nl80211_try_connect()
7109 if ((wpa_key_mgmt_sae(params->key_mgmt_suite) || in wpa_driver_nl80211_try_connect()
7110 wpa_key_mgmt_sae(params->allowed_key_mgmts)) && in wpa_driver_nl80211_try_connect()
7111 nl80211_put_sae_pwe(msg, params->sae_pwe) < 0) in wpa_driver_nl80211_try_connect()
7115 if ((params->sae_password || params->passphrase) && in wpa_driver_nl80211_try_connect()
7116 (drv->capa.flags2 & WPA_DRIVER_FLAGS2_SAE_OFFLOAD_STA)) { in wpa_driver_nl80211_try_connect()
7120 if (params->sae_password && params->sae_password_id) { in wpa_driver_nl80211_try_connect()
7122 "nl80211: Use of SAE password identifiers not supported with driver-based SAE"); in wpa_driver_nl80211_try_connect()
7126 password = params->sae_password; in wpa_driver_nl80211_try_connect()
7128 password = params->passphrase; in wpa_driver_nl80211_try_connect()
7137 if (params->auth_alg & WPA_AUTH_ALG_OPEN) in wpa_driver_nl80211_try_connect()
7139 if (params->auth_alg & WPA_AUTH_ALG_SHARED) in wpa_driver_nl80211_try_connect()
7141 if (params->auth_alg & WPA_AUTH_ALG_LEAP) in wpa_driver_nl80211_try_connect()
7143 if (params->auth_alg & WPA_AUTH_ALG_FILS) in wpa_driver_nl80211_try_connect()
7145 if (params->auth_alg & WPA_AUTH_ALG_FT) in wpa_driver_nl80211_try_connect()
7147 if (params->auth_alg & WPA_AUTH_ALG_SAE) in wpa_driver_nl80211_try_connect()
7155 type = get_nl_auth_type(params->auth_alg); in wpa_driver_nl80211_try_connect()
7168 ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, in wpa_driver_nl80211_try_connect()
7173 "(%s)", ret, strerror(-ret)); in wpa_driver_nl80211_try_connect()
7176 drv->roam_indication_done = false; in wpa_driver_nl80211_try_connect()
7198 if (params->bssid) in wpa_driver_nl80211_connect()
7199 os_memcpy(drv->auth_attempt_bssid, params->bssid, ETH_ALEN); in wpa_driver_nl80211_connect()
7201 os_memset(drv->auth_attempt_bssid, 0, ETH_ALEN); in wpa_driver_nl80211_connect()
7204 if (ret == -EALREADY) { in wpa_driver_nl80211_connect()
7215 return -1; in wpa_driver_nl80211_connect()
7226 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_associate()
7228 int ret = -1; in wpa_driver_nl80211_associate()
7233 if (params->mode == IEEE80211_MODE_AP) in wpa_driver_nl80211_associate()
7236 if (params->mode == IEEE80211_MODE_IBSS) in wpa_driver_nl80211_associate()
7239 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) { in wpa_driver_nl80211_associate()
7240 enum nl80211_iftype nlmode = params->p2p ? in wpa_driver_nl80211_associate()
7244 return -1; in wpa_driver_nl80211_associate()
7252 drv->ifindex); in wpa_driver_nl80211_associate()
7255 return -1; in wpa_driver_nl80211_associate()
7261 if (params->mgmt_frame_protection == MGMT_FRAME_PROTECTION_REQUIRED && in wpa_driver_nl80211_associate()
7265 if (params->fils_kek) { in wpa_driver_nl80211_associate()
7267 (unsigned int) params->fils_kek_len); in wpa_driver_nl80211_associate()
7268 if (nla_put(msg, NL80211_ATTR_FILS_KEK, params->fils_kek_len, in wpa_driver_nl80211_associate()
7269 params->fils_kek)) in wpa_driver_nl80211_associate()
7272 if (params->fils_nonces) { in wpa_driver_nl80211_associate()
7274 params->fils_nonces, in wpa_driver_nl80211_associate()
7275 params->fils_nonces_len); in wpa_driver_nl80211_associate()
7277 params->fils_nonces_len, params->fils_nonces)) in wpa_driver_nl80211_associate()
7284 ret = send_and_recv(drv->global, drv->first_bss->nl_connect, in wpa_driver_nl80211_associate()
7291 ret = -EINVAL; in wpa_driver_nl80211_associate()
7292 for_each_link(params->mld_params.valid_links, i) { in wpa_driver_nl80211_associate()
7299 wpa_dbg(drv->ctx, MSG_DEBUG, in wpa_driver_nl80211_associate()
7301 ret, strerror(-ret)); in wpa_driver_nl80211_associate()
7307 !(params->mld_params.valid_links & in wpa_driver_nl80211_associate()
7314 params->mld_params.mld_links[err_info.link_id].error = in wpa_driver_nl80211_associate()
7332 int ret = -ENOBUFS; in nl80211_set_mode()
7337 msg = nl80211_cmd_msg(drv->first_bss, 0, NL80211_CMD_SET_INTERFACE); in nl80211_set_mode()
7348 " %d (%s)", ifindex, mode, ret, strerror(-ret)); in nl80211_set_mode()
7358 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_set_mode_impl()
7359 int ret = -1; in wpa_driver_nl80211_set_mode_impl()
7361 int was_ap = is_ap_interface(drv->nlmode); in wpa_driver_nl80211_set_mode_impl()
7366 return -1; in wpa_driver_nl80211_set_mode_impl()
7368 mode_switch_res = nl80211_set_mode(drv, drv->ifindex, nlmode); in wpa_driver_nl80211_set_mode_impl()
7373 drv->nlmode = nlmode; in wpa_driver_nl80211_set_mode_impl()
7378 if (mode_switch_res == -ENODEV) in wpa_driver_nl80211_set_mode_impl()
7379 return -1; in wpa_driver_nl80211_set_mode_impl()
7381 if (nlmode == drv->nlmode) { in wpa_driver_nl80211_set_mode_impl()
7383 "requested mode - ignore error"); in wpa_driver_nl80211_set_mode_impl()
7396 if (res == -EACCES || res == -ENODEV) in wpa_driver_nl80211_set_mode_impl()
7418 bss->brname[0] && in wpa_driver_nl80211_set_mode_impl()
7419 (bss->added_if_into_bridge || bss->already_in_bridge)) { in wpa_driver_nl80211_set_mode_impl()
7422 bss->ifname, bss->brname); in wpa_driver_nl80211_set_mode_impl()
7423 if (linux_br_del_if(drv->global->ioctl_sock, in wpa_driver_nl80211_set_mode_impl()
7424 bss->brname, bss->ifname) < 0) in wpa_driver_nl80211_set_mode_impl()
7427 bss->ifname, bss->brname, in wpa_driver_nl80211_set_mode_impl()
7432 mode_switch_res = nl80211_set_mode(drv, drv->ifindex, nlmode); in wpa_driver_nl80211_set_mode_impl()
7433 if (mode_switch_res == -EBUSY) { in wpa_driver_nl80211_set_mode_impl()
7446 drv->nlmode = nlmode; in wpa_driver_nl80211_set_mode_impl()
7447 drv->ignore_if_down_event = 1; in wpa_driver_nl80211_set_mode_impl()
7451 res = linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 1); in wpa_driver_nl80211_set_mode_impl()
7455 ret = -1; in wpa_driver_nl80211_set_mode_impl()
7461 "from %d failed", nlmode, drv->nlmode); in wpa_driver_nl80211_set_mode_impl()
7467 "nl80211: Interface %s mode change to P2P - disable 11b rates", in wpa_driver_nl80211_set_mode_impl()
7468 bss->ifname); in wpa_driver_nl80211_set_mode_impl()
7469 nl80211_disable_11b_rates(drv, drv->ifindex, 1); in wpa_driver_nl80211_set_mode_impl()
7470 } else if (drv->disabled_11b_rates) { in wpa_driver_nl80211_set_mode_impl()
7472 "nl80211: Interface %s mode changed to non-P2P - re-enable 11b rates", in wpa_driver_nl80211_set_mode_impl()
7473 bss->ifname); in wpa_driver_nl80211_set_mode_impl()
7474 nl80211_disable_11b_rates(drv, drv->ifindex, 0); in wpa_driver_nl80211_set_mode_impl()
7481 return -1; in wpa_driver_nl80211_set_mode_impl()
7491 return -1; in wpa_driver_nl80211_set_mode_impl()
7493 if (!bss->in_deinit && !is_ap_interface(nlmode) && in wpa_driver_nl80211_set_mode_impl()
7497 "frame processing - ignore for now"); in wpa_driver_nl80211_set_mode_impl()
7505 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_restore_ap_mode()
7506 int was_ap = is_ap_interface(drv->nlmode); in nl80211_restore_ap_mode()
7508 wpa_driver_nl80211_set_mode(bss, drv->ap_scan_as_station); in nl80211_restore_ap_mode()
7509 if (!was_ap && is_ap_interface(drv->ap_scan_as_station) && in nl80211_restore_ap_mode()
7510 bss->brname[0] && in nl80211_restore_ap_mode()
7511 (bss->added_if_into_bridge || bss->already_in_bridge)) { in nl80211_restore_ap_mode()
7514 bss->ifname, bss->brname); in nl80211_restore_ap_mode()
7515 if (linux_br_add_if(drv->global->ioctl_sock, bss->brname, in nl80211_restore_ap_mode()
7516 bss->ifname) < 0) { in nl80211_restore_ap_mode()
7519 bss->ifname, bss->brname, strerror(errno)); in nl80211_restore_ap_mode()
7522 drv->ap_scan_as_station = NL80211_IFTYPE_UNSPECIFIED; in nl80211_restore_ap_mode()
7545 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_get_capa()
7547 if (!drv->has_capability) in wpa_driver_nl80211_get_capa()
7548 return -1; in wpa_driver_nl80211_get_capa()
7549 os_memcpy(capa, &drv->capa, sizeof(*capa)); in wpa_driver_nl80211_get_capa()
7550 if (drv->extended_capa && drv->extended_capa_mask) { in wpa_driver_nl80211_get_capa()
7551 capa->extended_capa = drv->extended_capa; in wpa_driver_nl80211_get_capa()
7552 capa->extended_capa_mask = drv->extended_capa_mask; in wpa_driver_nl80211_get_capa()
7553 capa->extended_capa_len = drv->extended_capa_len; in wpa_driver_nl80211_get_capa()
7563 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_set_operstate()
7565 wpa_printf(MSG_DEBUG, "nl80211: Set %s operstate %d->%d (%s)", in wpa_driver_nl80211_set_operstate()
7566 bss->ifname, drv->operstate, state, in wpa_driver_nl80211_set_operstate()
7568 drv->operstate = state; in wpa_driver_nl80211_set_operstate()
7569 return netlink_send_oper_ifla(drv->global->netlink, drv->ifindex, -1, in wpa_driver_nl80211_set_operstate()
7577 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_set_supp_port()
7581 const u8 *connected_addr = drv->sta_mlo_info.valid_links ? in wpa_driver_nl80211_set_supp_port()
7582 drv->sta_mlo_info.ap_mld_addr : drv->bssid; in wpa_driver_nl80211_set_supp_port()
7584 if (!drv->associated && is_zero_ether_addr(connected_addr) && in wpa_driver_nl80211_set_supp_port()
7602 return -ENOBUFS; in wpa_driver_nl80211_set_supp_port()
7609 ret, strerror(-ret)); in wpa_driver_nl80211_set_supp_port()
7656 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_get_seqnum()
7668 return -ENOBUFS; in i802_get_seqnum()
7676 link_id, idx, res, strerror(-res)); in i802_get_seqnum()
7686 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_set_rts()
7691 if (rts >= 2347 || rts == -1) in i802_set_rts()
7692 val = (u32) -1; in i802_set_rts()
7699 return -ENOBUFS; in i802_set_rts()
7706 "%d (%s)", rts, ret, strerror(-ret)); in i802_set_rts()
7714 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_set_frag()
7719 if (frag >= 2346 || frag == -1) in i802_set_frag()
7720 val = (u32) -1; in i802_set_frag()
7727 return -ENOBUFS; in i802_set_frag()
7734 "%d: %d (%s)", frag, ret, strerror(-ret)); in i802_set_frag()
7746 wpa_printf(MSG_DEBUG, "nl80211: flush -> DEL_STATION %s (all)", in i802_flush()
7747 bss->ifname); in i802_flush()
7750 "nl80211: flush -> DEL_STATION %s (with link %d)", in i802_flush()
7751 bss->ifname, link_id); in i802_flush()
7757 if (link_id >= 0 && (bss->valid_links & BIT(link_id)) && in i802_flush()
7761 res = send_and_recv_cmd(bss->drv, msg); in i802_flush()
7764 "(%s)", res, strerror(-res)); in i802_flush()
7769 return -1; in i802_flush()
7794 data->backlog_bytes += nla_get_u32( in get_sta_tid_stats()
7797 data->backlog_bytes += nla_get_u32( in get_sta_tid_stats()
7869 data->inactive_msec = in get_sta_handler()
7871 /* For backwards compatibility, fetch the 32-bit counters first. */ in get_sta_handler()
7873 data->rx_bytes = nla_get_u32(stats[NL80211_STA_INFO_RX_BYTES]); in get_sta_handler()
7875 data->tx_bytes = nla_get_u32(stats[NL80211_STA_INFO_TX_BYTES]); in get_sta_handler()
7879 * The driver supports 64-bit counters, so use them to override in get_sta_handler()
7880 * the 32-bit values. in get_sta_handler()
7882 data->rx_bytes = in get_sta_handler()
7884 data->tx_bytes = in get_sta_handler()
7886 data->bytes_64bit = 1; in get_sta_handler()
7889 data->signal = (s8) nla_get_u8(stats[NL80211_STA_INFO_SIGNAL]); in get_sta_handler()
7891 data->rx_packets = in get_sta_handler()
7894 data->tx_packets = in get_sta_handler()
7897 data->tx_retry_count = in get_sta_handler()
7900 data->tx_retry_failed = in get_sta_handler()
7903 data->avg_signal = in get_sta_handler()
7906 data->connected_sec = in get_sta_handler()
7908 data->flags |= STA_DRV_DATA_CONN_TIME; in get_sta_handler()
7911 data->beacon_loss_count = in get_sta_handler()
7914 data->expected_throughput = in get_sta_handler()
7917 data->rx_drop_misc = in get_sta_handler()
7920 data->beacons_count = in get_sta_handler()
7923 data->avg_beacon_signal = in get_sta_handler()
7926 data->rx_airtime = in get_sta_handler()
7929 data->last_ack_rssi = in get_sta_handler()
7931 data->flags |= STA_DRV_DATA_LAST_ACK_RSSI; in get_sta_handler()
7934 data->avg_ack_signal = in get_sta_handler()
7937 data->rx_mpdus = nla_get_u32(stats[NL80211_STA_INFO_RX_MPDUS]); in get_sta_handler()
7939 data->fcs_error_count = in get_sta_handler()
7942 data->tx_airtime = in get_sta_handler()
7950 data->current_tx_rate = in get_sta_handler()
7953 data->current_tx_rate = in get_sta_handler()
7958 data->current_tx_rate = data->current_tx_rate * 100; in get_sta_handler()
7961 data->tx_mcs = nla_get_u8(rate[NL80211_RATE_INFO_MCS]); in get_sta_handler()
7962 data->flags |= STA_DRV_DATA_TX_MCS; in get_sta_handler()
7965 data->tx_vhtmcs = in get_sta_handler()
7967 data->flags |= STA_DRV_DATA_TX_VHT_MCS; in get_sta_handler()
7970 data->tx_guard_interval = GUARD_INTERVAL_0_4; in get_sta_handler()
7971 data->flags |= STA_DRV_DATA_TX_SHORT_GI; in get_sta_handler()
7974 data->tx_vht_nss = in get_sta_handler()
7976 data->flags |= STA_DRV_DATA_TX_VHT_NSS; in get_sta_handler()
7979 data->tx_hemcs = in get_sta_handler()
7981 data->flags |= STA_DRV_DATA_TX_HE_MCS; in get_sta_handler()
7984 data->tx_he_nss = in get_sta_handler()
7986 data->flags |= STA_DRV_DATA_TX_HE_NSS; in get_sta_handler()
7991 data->tx_guard_interval = GUARD_INTERVAL_0_8; in get_sta_handler()
7994 data->tx_guard_interval = GUARD_INTERVAL_1_6; in get_sta_handler()
7997 data->tx_guard_interval = GUARD_INTERVAL_3_2; in get_sta_handler()
8000 data->flags |= STA_DRV_DATA_TX_HE_GI; in get_sta_handler()
8003 data->tx_dcm = in get_sta_handler()
8005 data->flags |= STA_DRV_DATA_TX_HE_DCM; in get_sta_handler()
8014 data->current_rx_rate = in get_sta_handler()
8017 data->current_rx_rate = in get_sta_handler()
8022 data->current_rx_rate = data->current_rx_rate * 100; in get_sta_handler()
8025 data->rx_mcs = nla_get_u8(rate[NL80211_RATE_INFO_MCS]); in get_sta_handler()
8026 data->flags |= STA_DRV_DATA_RX_MCS; in get_sta_handler()
8029 data->rx_vhtmcs = in get_sta_handler()
8031 data->flags |= STA_DRV_DATA_RX_VHT_MCS; in get_sta_handler()
8034 data->rx_guard_interval = GUARD_INTERVAL_0_4; in get_sta_handler()
8035 data->flags |= STA_DRV_DATA_RX_SHORT_GI; in get_sta_handler()
8038 data->rx_vht_nss = in get_sta_handler()
8040 data->flags |= STA_DRV_DATA_RX_VHT_NSS; in get_sta_handler()
8043 data->rx_hemcs = in get_sta_handler()
8045 data->flags |= STA_DRV_DATA_RX_HE_MCS; in get_sta_handler()
8048 data->rx_he_nss = in get_sta_handler()
8050 data->flags |= STA_DRV_DATA_RX_HE_NSS; in get_sta_handler()
8055 data->rx_guard_interval = GUARD_INTERVAL_0_8; in get_sta_handler()
8058 data->rx_guard_interval = GUARD_INTERVAL_1_6; in get_sta_handler()
8061 data->rx_guard_interval = GUARD_INTERVAL_3_2; in get_sta_handler()
8064 data->flags |= STA_DRV_DATA_RX_HE_GI; in get_sta_handler()
8067 data->rx_dcm = in get_sta_handler()
8069 data->flags |= STA_DRV_DATA_RX_HE_DCM; in get_sta_handler()
8086 data->signal = -WPA_INVALID_NOISE; in nl80211_get_link_signal()
8087 data->current_tx_rate = 0; in nl80211_get_link_signal()
8092 return -ENOBUFS; in nl80211_get_link_signal()
8108 return -ENOBUFS; in i802_read_sta_data()
8111 return send_and_recv_resp(bss->drv, msg, get_sta_handler, data); in i802_read_sta_data()
8120 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_set_tx_queue_params()
8127 return -1; in i802_set_tx_queue_params()
8175 …"nl80211: link=%d: TX queue param set: queue=%d aifs=%d cw_min=%d cw_max=%d burst_time=%d --> res=… in i802_set_tx_queue_params()
8182 return -1; in i802_set_tx_queue_params()
8189 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_set_sta_vlan()
8195 bss->ifname, if_nametoindex(bss->ifname), in i802_set_sta_vlan()
8199 (vlan_id && (drv->capa.flags & WPA_DRIVER_FLAGS_VLAN_OFFLOAD) && in i802_set_sta_vlan()
8205 return -ENOBUFS; in i802_set_sta_vlan()
8213 strerror(-ret)); in i802_set_sta_vlan()
8225 data.inactive_msec = (unsigned long) -1; in i802_get_inact_sec()
8227 if (ret == -ENOENT) in i802_get_inact_sec()
8228 return -ENOENT; in i802_get_inact_sec()
8229 if (ret || data.inactive_msec == (unsigned long) -1) in i802_get_inact_sec()
8230 return -1; in i802_get_inact_sec()
8248 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_sta_deauth()
8253 if (ieee80211_freq_to_chan(link->freq, &channel) == in i802_sta_deauth()
8260 if (is_mesh_interface(drv->nlmode)) in i802_sta_deauth()
8261 return -1; in i802_sta_deauth()
8263 if (drv->device_ap_sme) in i802_sta_deauth()
8284 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_sta_disassoc()
8287 if (is_mesh_interface(drv->nlmode)) in i802_sta_disassoc()
8288 return -1; in i802_sta_disassoc()
8290 if (drv->device_ap_sme) in i802_sta_disassoc()
8303 0, NULL, 0, 0, -1); in i802_sta_disassoc()
8315 for (i = 0; i < drv->num_if_indices; i++) { in dump_ifidx()
8316 if (!drv->if_indices[i].ifindex) in dump_ifidx()
8318 res = os_snprintf(pos, end - pos, " %d(%d)", in dump_ifidx()
8319 drv->if_indices[i].ifindex, in dump_ifidx()
8320 drv->if_indices[i].reason); in dump_ifidx()
8321 if (os_snprintf_error(end - pos, res)) in dump_ifidx()
8328 drv->num_if_indices, buf); in dump_ifidx()
8346 for (i = 0; i < drv->num_if_indices; i++) { in add_ifidx()
8347 if (drv->if_indices[i].ifindex == 0) { in add_ifidx()
8348 drv->if_indices[i].ifindex = ifidx; in add_ifidx()
8349 drv->if_indices[i].reason = ifidx_reason; in add_ifidx()
8355 if (drv->if_indices != drv->default_if_indices) in add_ifidx()
8356 old = drv->if_indices; in add_ifidx()
8360 drv->if_indices = os_realloc_array(old, drv->num_if_indices + 1, in add_ifidx()
8362 if (!drv->if_indices) { in add_ifidx()
8364 drv->if_indices = drv->default_if_indices; in add_ifidx()
8366 drv->if_indices = old; in add_ifidx()
8373 os_memcpy(drv->if_indices, drv->default_if_indices, in add_ifidx()
8374 sizeof(drv->default_if_indices)); in add_ifidx()
8375 drv->if_indices[drv->num_if_indices].ifindex = ifidx; in add_ifidx()
8376 drv->if_indices[drv->num_if_indices].reason = ifidx_reason; in add_ifidx()
8377 drv->num_if_indices++; in add_ifidx()
8387 for (i = 0; i < drv->num_if_indices; i++) { in del_ifidx()
8388 if ((drv->if_indices[i].ifindex == ifidx || in del_ifidx()
8390 (drv->if_indices[i].reason == ifidx_reason || in del_ifidx()
8392 drv->if_indices[i].ifindex = 0; in del_ifidx()
8393 drv->if_indices[i].reason = 0; in del_ifidx()
8406 for (i = 0; i < drv->num_if_indices; i++) in have_ifidx()
8407 if (drv->if_indices[i].ifindex == ifidx && in have_ifidx()
8408 (drv->if_indices[i].reason == ifidx_reason || in have_ifidx()
8420 struct wpa_driver_nl80211_data *drv = bss->drv; in i802_set_wds_sta()
8425 ret = os_snprintf(name, sizeof(name), "%s.sta%d", bss->ifname, aid); in i802_set_wds_sta()
8441 bss->addr, 1, NULL, NULL, 0) < in i802_set_wds_sta()
8443 return -1; in i802_set_wds_sta()
8445 linux_br_add_if(drv->global->ioctl_sock, in i802_set_wds_sta()
8447 return -1; in i802_set_wds_sta()
8453 wpa_supplicant_event(bss->ctx, in i802_set_wds_sta()
8457 if (linux_set_iface_flags(drv->global->ioctl_sock, name, 1)) { in i802_set_wds_sta()
8465 linux_br_del_if(drv->global->ioctl_sock, bridge_ifname, in i802_set_wds_sta()
8471 i802_set_sta_vlan(priv, addr, bss->ifname, 0, in i802_set_wds_sta()
8478 wpa_supplicant_event(bss->ctx, EVENT_WDS_STA_INTERFACE_STATUS, in i802_set_wds_sta()
8502 drv_event_eapol_rx(drv->ctx, lladdr.sll_addr, buf, len); in handle_eapol()
8513 os_strlcpy(bss->brname, brname, IFNAMSIZ); in i802_check_bridge()
8520 if (linux_br_add(drv->global->ioctl_sock, brname) < 0) { in i802_check_bridge()
8524 return -1; in i802_check_bridge()
8526 bss->added_bridge = 1; in i802_check_bridge()
8528 add_ifidx(drv, br_ifindex, drv->ifindex); in i802_check_bridge()
8530 bss->br_ifindex = br_ifindex; in i802_check_bridge()
8534 bss->already_in_bridge = 1; in i802_check_bridge()
8540 if (linux_br_del_if(drv->global->ioctl_sock, in_br, ifname) < in i802_check_bridge()
8546 return -1; in i802_check_bridge()
8552 if (linux_br_add_if(drv->global->ioctl_sock, brname, ifname) < 0) { in i802_check_bridge()
8562 bss->added_if_into_bridge = 1; in i802_check_bridge()
8578 bss = wpa_driver_nl80211_drv_init(hapd, params->ifname, in i802_init()
8579 params->global_priv, 1, in i802_init()
8580 params->bssid, params->driver_params); in i802_init()
8584 drv = bss->drv; in i802_init()
8586 if (linux_br_get(master_ifname, params->ifname) == 0) { in i802_init()
8588 params->ifname, master_ifname); in i802_init()
8590 os_strlcpy(bss->brname, master_ifname, IFNAMSIZ); in i802_init()
8591 } else if ((params->num_bridge == 0 || !params->bridge[0]) && in i802_init()
8592 linux_master_get(master_ifname, params->ifname) == 0) { in i802_init()
8594 params->ifname, master_ifname); in i802_init()
8596 add_ifidx(drv, if_nametoindex(master_ifname), drv->ifindex); in i802_init()
8603 os_strlcpy(bss->brname, master_ifname, IFNAMSIZ); in i802_init()
8609 bss->br_ifindex = br_ifindex; in i802_init()
8611 for (i = 0; i < params->num_bridge; i++) { in i802_init()
8612 if (params->bridge[i]) { in i802_init()
8613 ifindex = if_nametoindex(params->bridge[i]); in i802_init()
8615 add_ifidx(drv, ifindex, drv->ifindex); in i802_init()
8622 add_ifidx(drv, drv->ifindex, IFIDX_ANY); in i802_init()
8624 if (params->num_bridge && params->bridge[0]) { in i802_init()
8625 if (i802_check_bridge(drv, bss, params->bridge[0], in i802_init()
8626 params->ifname) < 0) in i802_init()
8628 if (os_strcmp(params->bridge[0], master_ifname) != 0) in i802_init()
8633 (params->num_bridge == 0 || !params->bridge[0])) in i802_init()
8634 add_ifidx(drv, br_ifindex, drv->ifindex); in i802_init()
8636 if (bss->added_if_into_bridge || bss->already_in_bridge) { in i802_init()
8639 drv->rtnl_sk = nl_socket_alloc(); in i802_init()
8640 if (drv->rtnl_sk == NULL) { in i802_init()
8645 err = nl_connect(drv->rtnl_sk, NETLINK_ROUTE); in i802_init()
8653 if (drv->capa.flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX) { in i802_init()
8655 "nl80211: Do not open EAPOL RX socket - using control port for RX"); in i802_init()
8659 drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE)); in i802_init()
8660 if (drv->eapol_sock < 0) { in i802_init()
8666 if (eloop_register_read_sock(drv->eapol_sock, handle_eapol, drv, NULL)) in i802_init()
8673 if (linux_get_ifhwaddr(drv->global->ioctl_sock, bss->ifname, in i802_init()
8674 params->own_addr)) in i802_init()
8676 os_memcpy(drv->perm_addr, params->own_addr, ETH_ALEN); in i802_init()
8678 memcpy(bss->addr, params->own_addr, ETH_ALEN); in i802_init()
8715 return -1; in wpa_driver_nl80211_if_type()
8723 dl_list_for_each(drv, &global->interfaces, in nl80211_addr_in_use()
8725 if (ether_addr_equal(addr, drv->first_bss->addr)) in nl80211_addr_in_use()
8736 if (!drv->global) in nl80211_vif_addr()
8737 return -1; in nl80211_vif_addr()
8739 os_memcpy(new_addr, drv->first_bss->addr, ETH_ALEN); in nl80211_vif_addr()
8741 new_addr[0] = drv->first_bss->addr[0] | 0x02; in nl80211_vif_addr()
8743 if (!nl80211_addr_in_use(drv->global, new_addr)) in nl80211_vif_addr()
8747 return -1; in nl80211_vif_addr()
8771 wi->wdev_id = nla_get_u64(tb[NL80211_ATTR_WDEV]); in nl80211_wdev_handler()
8772 wi->wdev_id_set = 1; in nl80211_wdev_handler()
8776 os_memcpy(wi->macaddr, nla_data(tb[NL80211_ATTR_MAC]), in nl80211_wdev_handler()
8792 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_if_add()
8809 return -1; in wpa_driver_nl80211_if_add()
8812 drv->global->if_add_wdevid = p2pdev_info.wdev_id; in wpa_driver_nl80211_if_add()
8813 drv->global->if_add_wdevid_set = p2pdev_info.wdev_id_set; in wpa_driver_nl80211_if_add()
8822 if (use_existing && ifidx == -ENFILE) { in wpa_driver_nl80211_if_add()
8826 return -1; in wpa_driver_nl80211_if_add()
8832 os_memcpy(if_addr, bss->addr, ETH_ALEN); in wpa_driver_nl80211_if_add()
8833 else if (linux_get_ifhwaddr(drv->global->ioctl_sock, in wpa_driver_nl80211_if_add()
8837 return -1; in wpa_driver_nl80211_if_add()
8848 if (linux_get_ifhwaddr(drv->global->ioctl_sock, ifname, in wpa_driver_nl80211_if_add()
8852 return -1; in wpa_driver_nl80211_if_add()
8854 if (nl80211_addr_in_use(drv->global, new_addr)) { in wpa_driver_nl80211_if_add()
8860 return -1; in wpa_driver_nl80211_if_add()
8862 if (linux_set_ifhwaddr(drv->global->ioctl_sock, ifname, in wpa_driver_nl80211_if_add()
8866 return -1; in wpa_driver_nl80211_if_add()
8878 return -1; in wpa_driver_nl80211_if_add()
8889 return -1; in wpa_driver_nl80211_if_add()
8892 if (linux_set_iface_flags(drv->global->ioctl_sock, ifname, 1)) in wpa_driver_nl80211_if_add()
8897 return -1; in wpa_driver_nl80211_if_add()
8899 os_strlcpy(new_bss->ifname, ifname, IFNAMSIZ); in wpa_driver_nl80211_if_add()
8900 os_memcpy(new_bss->addr, if_addr, ETH_ALEN); in wpa_driver_nl80211_if_add()
8901 new_bss->ifindex = ifidx; in wpa_driver_nl80211_if_add()
8902 new_bss->drv = drv; in wpa_driver_nl80211_if_add()
8903 new_bss->next = drv->first_bss->next; in wpa_driver_nl80211_if_add()
8904 new_bss->flink = &new_bss->links[0]; in wpa_driver_nl80211_if_add()
8905 new_bss->valid_links = 0; in wpa_driver_nl80211_if_add()
8906 os_memcpy(new_bss->flink->addr, new_bss->addr, ETH_ALEN); in wpa_driver_nl80211_if_add()
8908 new_bss->flink->freq = drv->first_bss->flink->freq; in wpa_driver_nl80211_if_add()
8909 new_bss->ctx = bss_ctx; in wpa_driver_nl80211_if_add()
8910 new_bss->added_if = added; in wpa_driver_nl80211_if_add()
8911 drv->first_bss->next = new_bss; in wpa_driver_nl80211_if_add()
8918 return -1; in wpa_driver_nl80211_if_add()
8921 if (drv->global) in wpa_driver_nl80211_if_add()
8922 drv->global->if_add_ifindex = ifidx; in wpa_driver_nl80211_if_add()
8929 (drv->hostapd || in wpa_driver_nl80211_if_add()
8943 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_if_remove()
8947 __func__, type, ifname, ifindex, bss->added_if); in wpa_driver_nl80211_if_remove()
8948 if (ifindex > 0 && (bss->added_if || bss->ifindex != ifindex)) in wpa_driver_nl80211_if_remove()
8950 else if (ifindex > 0 && !bss->added_if) { in wpa_driver_nl80211_if_remove()
8952 dl_list_for_each(drv2, &drv->global->interfaces, in wpa_driver_nl80211_if_remove()
8962 if (bss->added_if_into_bridge) { in wpa_driver_nl80211_if_remove()
8963 if (linux_br_del_if(drv->global->ioctl_sock, bss->brname, in wpa_driver_nl80211_if_remove()
8964 bss->ifname) < 0) in wpa_driver_nl80211_if_remove()
8967 bss->ifname, bss->brname, strerror(errno)); in wpa_driver_nl80211_if_remove()
8969 if (bss->added_bridge) { in wpa_driver_nl80211_if_remove()
8970 if (linux_br_del(drv->global->ioctl_sock, bss->brname) < 0) in wpa_driver_nl80211_if_remove()
8973 bss->brname, strerror(errno)); in wpa_driver_nl80211_if_remove()
8976 if (bss != drv->first_bss) { in wpa_driver_nl80211_if_remove()
8979 wpa_printf(MSG_DEBUG, "nl80211: Not the first BSS - remove it"); in wpa_driver_nl80211_if_remove()
8980 for (tbss = drv->first_bss; tbss; tbss = tbss->next) { in wpa_driver_nl80211_if_remove()
8981 if (tbss->next == bss) { in wpa_driver_nl80211_if_remove()
8982 tbss->next = bss->next; in wpa_driver_nl80211_if_remove()
8987 if (!bss->added_if) in wpa_driver_nl80211_if_remove()
8995 wpa_printf(MSG_INFO, "nl80211: %s - could not find " in wpa_driver_nl80211_if_remove()
8998 wpa_printf(MSG_DEBUG, "nl80211: First BSS - reassign context"); in wpa_driver_nl80211_if_remove()
9001 if (!bss->added_if && !drv->first_bss->next) in wpa_driver_nl80211_if_remove()
9004 if (!bss->added_if) in wpa_driver_nl80211_if_remove()
9006 if (drv->first_bss->next) { in wpa_driver_nl80211_if_remove()
9007 drv->first_bss = drv->first_bss->next; in wpa_driver_nl80211_if_remove()
9008 drv->ctx = drv->first_bss->ctx; in wpa_driver_nl80211_if_remove()
9009 drv->ifindex = drv->first_bss->ifindex; in wpa_driver_nl80211_if_remove()
9040 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_send_frame_cmd()
9043 int ret = -1; in nl80211_send_frame_cmd()
9055 (offchanok && ((drv->capa.flags & WPA_DRIVER_FLAGS_OFFCHANNEL_TX) || in nl80211_send_frame_cmd()
9056 drv->test_use_roc_tx) && in nl80211_send_frame_cmd()
9070 "(%s) (freq=%u wait=%u)", ret, strerror(-ret), in nl80211_send_frame_cmd()
9078 drv->send_frame_cookie = no_ack ? (u64) -1 : cookie; in nl80211_send_frame_cmd()
9085 if (drv->num_send_frame_cookies == MAX_SEND_FRAME_COOKIES) { in nl80211_send_frame_cmd()
9089 drv->send_frame_cookies[0]); in nl80211_send_frame_cmd()
9090 os_memmove(&drv->send_frame_cookies[0], in nl80211_send_frame_cmd()
9091 &drv->send_frame_cookies[1], in nl80211_send_frame_cmd()
9092 (MAX_SEND_FRAME_COOKIES - 1) * in nl80211_send_frame_cmd()
9094 drv->num_send_frame_cookies--; in nl80211_send_frame_cmd()
9096 drv->send_frame_cookies[drv->num_send_frame_cookies] = cookie; in nl80211_send_frame_cmd()
9097 drv->num_send_frame_cookies++; in nl80211_send_frame_cmd()
9109 const u8 *dst, const u8 *src, in wpa_driver_nl80211_send_action() argument
9114 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_send_action()
9115 int ret = -1; in wpa_driver_nl80211_send_action()
9120 if (is_ap_interface(drv->nlmode) && (int) freq == bss->flink->freq && in wpa_driver_nl80211_send_action()
9121 bss->flink->beacon_set) in wpa_driver_nl80211_send_action()
9124 if (!freq && is_sta_interface(drv->nlmode)) in wpa_driver_nl80211_send_action()
9129 MACSTR " src=" MACSTR " bssid=" MACSTR ")", in wpa_driver_nl80211_send_action()
9130 drv->ifindex, freq, wait_time, no_cck, offchanok, in wpa_driver_nl80211_send_action()
9131 MAC2STR(dst), MAC2STR(src), MAC2STR(bssid)); in wpa_driver_nl80211_send_action()
9138 hdr->frame_control = in wpa_driver_nl80211_send_action()
9140 os_memcpy(hdr->addr1, dst, ETH_ALEN); in wpa_driver_nl80211_send_action()
9141 os_memcpy(hdr->addr2, src, ETH_ALEN); in wpa_driver_nl80211_send_action()
9142 os_memcpy(hdr->addr3, bssid, ETH_ALEN); in wpa_driver_nl80211_send_action()
9144 if (!ether_addr_equal(bss->addr, src)) { in wpa_driver_nl80211_send_action()
9146 MAC2STR(src)); in wpa_driver_nl80211_send_action()
9147 os_memcpy(bss->rand_addr, src, ETH_ALEN); in wpa_driver_nl80211_send_action()
9149 os_memset(bss->rand_addr, 0, ETH_ALEN); in wpa_driver_nl80211_send_action()
9153 if (is_mesh_interface(drv->nlmode)) { in wpa_driver_nl80211_send_action()
9162 ieee80211_is_dfs(bss->flink->freq, modes, num_modes)) in wpa_driver_nl80211_send_action()
9174 if (is_ap_interface(drv->nlmode) && in wpa_driver_nl80211_send_action()
9175 (!(drv->capa.flags & WPA_DRIVER_FLAGS_OFFCHANNEL_TX) || in wpa_driver_nl80211_send_action()
9176 (int) freq == bss->flink->freq || drv->device_ap_sme || in wpa_driver_nl80211_send_action()
9177 !drv->use_monitor)) in wpa_driver_nl80211_send_action()
9180 wait_time, NULL, 0, 0, -1); in wpa_driver_nl80211_send_action()
9194 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_frame_wait_cancel()
9209 "(%s)", ret, strerror(-ret)); in nl80211_frame_wait_cancel()
9216 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_send_action_cancel_wait()
9221 if (drv->send_frame_cookie != (u64) -1) in wpa_driver_nl80211_send_action_cancel_wait()
9222 nl80211_frame_wait_cancel(bss, drv->send_frame_cookie); in wpa_driver_nl80211_send_action_cancel_wait()
9229 for (i = drv->num_send_frame_cookies; i > 0; i--) { in wpa_driver_nl80211_send_action_cancel_wait()
9230 cookie = drv->send_frame_cookies[i - 1]; in wpa_driver_nl80211_send_action_cancel_wait()
9231 if (cookie != drv->send_frame_cookie) in wpa_driver_nl80211_send_action_cancel_wait()
9234 drv->num_send_frame_cookies = 0; in wpa_driver_nl80211_send_action_cancel_wait()
9243 int link_id = -1; in nl80211_put_any_link_id()
9244 int any_valid_link_id = -1; in nl80211_put_any_link_id()
9246 if (!mlo->valid_links) in nl80211_put_any_link_id()
9250 for_each_link(mlo->valid_links, i) { in nl80211_put_any_link_id()
9251 if (any_valid_link_id == -1) in nl80211_put_any_link_id()
9254 if (is_same_band(freq, mlo->links[i].freq)) { in nl80211_put_any_link_id()
9261 if (link_id == -1) in nl80211_put_any_link_id()
9264 if (link_id == -1) { in nl80211_put_any_link_id()
9279 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_remain_on_channel()
9287 nl80211_put_any_link_id(msg, &drv->sta_mlo_info, freq)) { in wpa_driver_nl80211_remain_on_channel()
9289 return -1; in wpa_driver_nl80211_remain_on_channel()
9295 wpa_printf(MSG_DEBUG, "nl80211: Remain-on-channel cookie " in wpa_driver_nl80211_remain_on_channel()
9298 drv->remain_on_chan_cookie = cookie; in wpa_driver_nl80211_remain_on_channel()
9299 drv->pending_remain_on_chan = 1; in wpa_driver_nl80211_remain_on_channel()
9302 wpa_printf(MSG_DEBUG, "nl80211: Failed to request remain-on-channel " in wpa_driver_nl80211_remain_on_channel()
9304 freq, duration, ret, strerror(-ret)); in wpa_driver_nl80211_remain_on_channel()
9305 return -1; in wpa_driver_nl80211_remain_on_channel()
9312 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_cancel_remain_on_channel()
9316 if (!drv->pending_remain_on_chan) { in wpa_driver_nl80211_cancel_remain_on_channel()
9317 wpa_printf(MSG_DEBUG, "nl80211: No pending remain-on-channel " in wpa_driver_nl80211_cancel_remain_on_channel()
9319 return -1; in wpa_driver_nl80211_cancel_remain_on_channel()
9322 wpa_printf(MSG_DEBUG, "nl80211: Cancel remain-on-channel with cookie " in wpa_driver_nl80211_cancel_remain_on_channel()
9324 (long long unsigned int) drv->remain_on_chan_cookie); in wpa_driver_nl80211_cancel_remain_on_channel()
9328 nla_put_u64(msg, NL80211_ATTR_COOKIE, drv->remain_on_chan_cookie)) { in wpa_driver_nl80211_cancel_remain_on_channel()
9330 return -1; in wpa_driver_nl80211_cancel_remain_on_channel()
9336 wpa_printf(MSG_DEBUG, "nl80211: Failed to cancel remain-on-channel: " in wpa_driver_nl80211_cancel_remain_on_channel()
9337 "%d (%s)", ret, strerror(-ret)); in wpa_driver_nl80211_cancel_remain_on_channel()
9338 return -1; in wpa_driver_nl80211_cancel_remain_on_channel()
9344 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_probe_req_report()
9347 if (bss->nl_preq && drv->device_ap_sme && in wpa_driver_nl80211_probe_req_report()
9348 is_ap_interface(drv->nlmode) && !bss->in_deinit && in wpa_driver_nl80211_probe_req_report()
9349 !bss->static_ap) { in wpa_driver_nl80211_probe_req_report()
9356 "in AP mode", bss->nl_preq); in wpa_driver_nl80211_probe_req_report()
9357 } else if (bss->nl_preq) { in wpa_driver_nl80211_probe_req_report()
9359 "reporting nl_preq=%p", bss->nl_preq); in wpa_driver_nl80211_probe_req_report()
9360 nl80211_destroy_eloop_handle(&bss->nl_preq, 0); in wpa_driver_nl80211_probe_req_report()
9365 if (bss->nl_preq) { in wpa_driver_nl80211_probe_req_report()
9367 "already on! nl_preq=%p", bss->nl_preq); in wpa_driver_nl80211_probe_req_report()
9371 bss->nl_preq = nl_create_handle(drv->global->nl_cb, "preq"); in wpa_driver_nl80211_probe_req_report()
9372 if (bss->nl_preq == NULL) in wpa_driver_nl80211_probe_req_report()
9373 return -1; in wpa_driver_nl80211_probe_req_report()
9375 "reporting nl_preq=%p", bss->nl_preq); in wpa_driver_nl80211_probe_req_report()
9377 if (nl80211_register_frame(bss, bss->nl_preq, in wpa_driver_nl80211_probe_req_report()
9383 nl80211_register_eloop_read(&bss->nl_preq, in wpa_driver_nl80211_probe_req_report()
9385 bss->nl_cb, 0); in wpa_driver_nl80211_probe_req_report()
9390 nl_destroy_handles(&bss->nl_preq); in wpa_driver_nl80211_probe_req_report()
9391 return -1; in wpa_driver_nl80211_probe_req_report()
9404 ifindex, disabled ? "NL80211_TXRATE_LEGACY=OFDM-only" : in nl80211_disable_11b_rates()
9410 return -1; in nl80211_disable_11b_rates()
9418 * else apart from 6, 9, 12, 18, 24, 36, 48, 54 Mbps from non-MCS in nl80211_disable_11b_rates()
9433 "(%s)", ret, strerror(-ret)); in nl80211_disable_11b_rates()
9435 drv->disabled_11b_rates = disabled; in nl80211_disable_11b_rates()
9441 return -1; in nl80211_disable_11b_rates()
9447 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_remove_link()
9454 bss->ifindex, link_id); in nl80211_remove_link()
9456 if (!(bss->valid_links & BIT(link_id))) { in nl80211_remove_link()
9459 return -1; in nl80211_remove_link()
9462 link = &bss->links[link_id]; in nl80211_remove_link()
9467 bss->valid_links &= ~BIT(link_id); in nl80211_remove_link()
9468 os_memset(link->addr, 0, ETH_ALEN); in nl80211_remove_link()
9471 if (bss->flink == link) { in nl80211_remove_link()
9472 for_each_link_default(bss->valid_links, i, 0) { in nl80211_remove_link()
9473 bss->flink = &bss->links[i]; in nl80211_remove_link()
9479 if (!bss->valid_links) { in nl80211_remove_link()
9481 if (bss->flink != link) in nl80211_remove_link()
9482 os_memcpy(bss->flink, link, sizeof(*link)); in nl80211_remove_link()
9484 os_memcpy(bss->flink->addr, bss->addr, ETH_ALEN); in nl80211_remove_link()
9494 return -1; in nl80211_remove_link()
9501 link_id, ret, strerror(-ret)); in nl80211_remove_link()
9512 for_each_link(bss->valid_links, link_id) { in nl80211_remove_links()
9518 if (bss->flink) in nl80211_remove_links()
9519 os_memcpy(bss->flink->addr, bss->addr, ETH_ALEN); in nl80211_remove_links()
9526 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_deinit_ap()
9528 if (!is_ap_interface(drv->nlmode)) in wpa_driver_nl80211_deinit_ap()
9529 return -1; in wpa_driver_nl80211_deinit_ap()
9540 if (drv->nlmode == NL80211_IFTYPE_P2P_GO && bss->if_dynamic) in wpa_driver_nl80211_deinit_ap()
9550 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_stop_ap()
9552 if (!is_ap_interface(drv->nlmode)) in wpa_driver_nl80211_stop_ap()
9553 return -1; in wpa_driver_nl80211_stop_ap()
9555 if (link_id == -1) { in wpa_driver_nl80211_stop_ap()
9560 if (nl80211_link_valid(bss->valid_links, link_id)) { in wpa_driver_nl80211_stop_ap()
9565 return -1; in wpa_driver_nl80211_stop_ap()
9572 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_deinit_p2p_cli()
9573 if (drv->nlmode != NL80211_IFTYPE_P2P_CLIENT) in wpa_driver_nl80211_deinit_p2p_cli()
9574 return -1; in wpa_driver_nl80211_deinit_p2p_cli()
9580 if (bss->if_dynamic) in wpa_driver_nl80211_deinit_p2p_cli()
9596 nl80211_disable_11b_rates(bss->drv, bss->drv->ifindex, 1); in wpa_driver_nl80211_resume()
9603 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_signal_monitor()
9615 return -1; in nl80211_signal_monitor()
9632 sig_change->center_frq1 = -1; in get_channel_width()
9633 sig_change->center_frq2 = -1; in get_channel_width()
9634 sig_change->chanwidth = CHAN_WIDTH_UNKNOWN; in get_channel_width()
9637 sig_change->chanwidth = convert2width( in get_channel_width()
9640 sig_change->center_frq1 = in get_channel_width()
9643 sig_change->center_frq2 = in get_channel_width()
9664 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_signal_poll()
9668 res = nl80211_get_link_signal(drv, drv->bssid, &si->data); in nl80211_signal_poll()
9670 if (drv->nlmode != NL80211_IFTYPE_ADHOC && in nl80211_signal_poll()
9671 drv->nlmode != NL80211_IFTYPE_MESH_POINT) in nl80211_signal_poll()
9673 si->data.signal = 0; in nl80211_signal_poll()
9718 for_each_link(mlo_sig->valid_links, i) { in get_links_noise()
9720 mlo_sig->links[i].frequency) in get_links_noise()
9723 mlo_sig->links[i].current_noise = in get_links_noise()
9772 mlo_sig->links[link_id].chanwidth = convert2width( in get_links_channel_width()
9775 mlo_sig->links[link_id].center_frq1 = in get_links_channel_width()
9778 mlo_sig->links[link_id].center_frq2 = in get_links_channel_width()
9800 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_mlo_signal_poll()
9804 if (drv->nlmode != NL80211_IFTYPE_STATION || in nl80211_mlo_signal_poll()
9805 !drv->sta_mlo_info.valid_links) in nl80211_mlo_signal_poll()
9806 return -1; in nl80211_mlo_signal_poll()
9809 mlo_si->valid_links = drv->sta_mlo_info.valid_links; in nl80211_mlo_signal_poll()
9811 for_each_link(mlo_si->valid_links, i) { in nl80211_mlo_signal_poll()
9813 drv->sta_mlo_info.links[i].bssid, in nl80211_mlo_signal_poll()
9814 &mlo_si->links[i].data); in nl80211_mlo_signal_poll()
9818 mlo_si->links[i].center_frq1 = -1; in nl80211_mlo_signal_poll()
9819 mlo_si->links[i].center_frq2 = -1; in nl80211_mlo_signal_poll()
9820 mlo_si->links[i].chanwidth = CHAN_WIDTH_UNKNOWN; in nl80211_mlo_signal_poll()
9821 mlo_si->links[i].current_noise = WPA_INVALID_NOISE; in nl80211_mlo_signal_poll()
9822 mlo_si->links[i].frequency = drv->sta_mlo_info.links[i].freq; in nl80211_mlo_signal_poll()
9836 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_param()
9846 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_CONCURRENT; in nl80211_set_param()
9847 drv->capa.flags |= WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P; in nl80211_set_param()
9852 drv->use_monitor = 1; in nl80211_set_param()
9855 drv->capa.flags &= ~WPA_DRIVER_FLAGS_SME; in nl80211_set_param()
9856 drv->force_connect_cmd = 1; in nl80211_set_param()
9860 drv->capa.flags |= WPA_DRIVER_FLAGS_BSS_SELECTION; in nl80211_set_param()
9863 drv->capa.flags &= ~WPA_DRIVER_FLAGS_OFFCHANNEL_TX; in nl80211_set_param()
9864 drv->test_use_roc_tx = 1; in nl80211_set_param()
9868 drv->capa.flags &= ~WPA_DRIVER_FLAGS_CONTROL_PORT; in nl80211_set_param()
9869 drv->capa.flags2 &= ~(WPA_DRIVER_FLAGS2_CONTROL_PORT_RX | in nl80211_set_param()
9871 drv->control_port_ap = 0; in nl80211_set_param()
9875 drv->control_port_ap = 1; in nl80211_set_param()
9878 drv->capa.flags2 &= ~WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS; in nl80211_set_param()
9879 drv->control_port_ap = 0; in nl80211_set_param()
9883 drv->capa.flags &= ~WPA_DRIVER_FLAGS_FULL_AP_CLIENT_STATE; in nl80211_set_param()
9886 drv->no_rrm = 1; in nl80211_set_param()
9888 if (!bss->in_deinit && !is_ap_interface(drv->nlmode) && in nl80211_set_param()
9889 !is_mesh_interface(drv->nlmode)) { in nl80211_set_param()
9893 "nl80211: Failed to re-register Action frame processing - ignore for now"); in nl80211_set_param()
9898 drv->capa.flags2 |= WPA_DRIVER_FLAGS2_SEC_LTF_STA | in nl80211_set_param()
9921 global->ctx = ctx; in nl80211_global_init()
9922 global->ioctl_sock = -1; in nl80211_global_init()
9923 dl_list_init(&global->interfaces); in nl80211_global_init()
9924 global->if_add_ifindex = -1; in nl80211_global_init()
9930 cfg->ctx = global; in nl80211_global_init()
9931 cfg->newlink_cb = wpa_driver_nl80211_event_rtm_newlink; in nl80211_global_init()
9932 cfg->dellink_cb = wpa_driver_nl80211_event_rtm_dellink; in nl80211_global_init()
9933 global->netlink = netlink_init(cfg); in nl80211_global_init()
9934 if (global->netlink == NULL) { in nl80211_global_init()
9942 global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0); in nl80211_global_init()
9943 if (global->ioctl_sock < 0) { in nl80211_global_init()
9962 if (!dl_list_empty(&global->interfaces)) { in nl80211_global_deinit()
9965 dl_list_len(&global->interfaces)); in nl80211_global_deinit()
9968 if (global->netlink) in nl80211_global_deinit()
9969 netlink_deinit(global->netlink); in nl80211_global_deinit()
9971 nl_destroy_handles(&global->nl); in nl80211_global_deinit()
9973 if (global->nl_event) in nl80211_global_deinit()
9974 nl80211_destroy_eloop_handle(&global->nl_event, 0); in nl80211_global_deinit()
9976 nl_cb_put(global->nl_cb); in nl80211_global_deinit()
9978 if (global->ioctl_sock >= 0) in nl80211_global_deinit()
9979 close(global->ioctl_sock); in nl80211_global_deinit()
9988 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_radio_name()
9989 return drv->phyname; in nl80211_get_radio_name()
10001 skip_pmk ? "true" : "false", params->pmk_len); in nl80211_pmkid()
10004 (params->pmkid && in nl80211_pmkid()
10005 nla_put(msg, NL80211_ATTR_PMKID, 16, params->pmkid)) || in nl80211_pmkid()
10006 (params->bssid && in nl80211_pmkid()
10007 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, params->bssid)) || in nl80211_pmkid()
10008 (params->ssid_len && in nl80211_pmkid()
10009 nla_put(msg, NL80211_ATTR_SSID, params->ssid_len, params->ssid)) || in nl80211_pmkid()
10010 (params->fils_cache_id && in nl80211_pmkid()
10012 params->fils_cache_id)) || in nl80211_pmkid()
10013 (params->pmk_lifetime && in nl80211_pmkid()
10015 params->pmk_lifetime)) || in nl80211_pmkid()
10016 (params->pmk_reauth_threshold && in nl80211_pmkid()
10018 params->pmk_reauth_threshold)) || in nl80211_pmkid()
10020 params->pmk_len && !skip_pmk && in nl80211_pmkid()
10021 nla_put(msg, NL80211_ATTR_PMK, params->pmk_len, params->pmk))) { in nl80211_pmkid()
10024 return -ENOBUFS; in nl80211_pmkid()
10027 return send_and_recv_cmd(bss->drv, msg); in nl80211_pmkid()
10036 bool skip_pmk = params->pmk_len > PMK_MAX_LEN; in nl80211_add_pmkid()
10039 if (params->bssid) in nl80211_add_pmkid()
10041 MAC2STR(params->bssid)); in nl80211_add_pmkid()
10042 else if (params->fils_cache_id && params->ssid_len) { in nl80211_add_pmkid()
10045 params->fils_cache_id[0], params->fils_cache_id[1], in nl80211_add_pmkid()
10046 wpa_ssid_txt(params->ssid, params->ssid_len)); in nl80211_add_pmkid()
10055 if (ret == -ERANGE && !skip_pmk && in nl80211_add_pmkid()
10056 params->pmk_len > LEGACY_PMK_MAX_LEN) in nl80211_add_pmkid()
10061 ret, strerror(-ret)); in nl80211_add_pmkid()
10073 if (params->bssid) in nl80211_remove_pmkid()
10075 MAC2STR(params->bssid)); in nl80211_remove_pmkid()
10076 else if (params->fils_cache_id && params->ssid_len) { in nl80211_remove_pmkid()
10079 params->fils_cache_id[0], params->fils_cache_id[1], in nl80211_remove_pmkid()
10080 wpa_ssid_txt(params->ssid, params->ssid_len)); in nl80211_remove_pmkid()
10087 ret, strerror(-ret)); in nl80211_remove_pmkid()
10102 return -ENOBUFS; in nl80211_flush_pmkid()
10103 return send_and_recv_cmd(bss->drv, msg); in nl80211_flush_pmkid()
10111 if (dl_list_empty(&survey_results->survey_list)) in clean_survey_results()
10114 dl_list_for_each_safe(survey, tmp, &survey_results->survey_list, in clean_survey_results()
10116 dl_list_del(&survey->list); in clean_survey_results()
10131 survey->ifidx = ifidx; in add_survey()
10132 survey->freq = nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]); in add_survey()
10133 survey->filled = 0; in add_survey()
10136 survey->nf = (int8_t) in add_survey()
10138 survey->filled |= SURVEY_HAS_NF; in add_survey()
10142 survey->channel_time = in add_survey()
10144 survey->filled |= SURVEY_HAS_CHAN_TIME; in add_survey()
10148 survey->channel_time_busy = in add_survey()
10150 survey->filled |= SURVEY_HAS_CHAN_TIME_BUSY; in add_survey()
10154 survey->channel_time_rx = in add_survey()
10156 survey->filled |= SURVEY_HAS_CHAN_TIME_RX; in add_survey()
10160 survey->channel_time_tx = in add_survey()
10162 survey->filled |= SURVEY_HAS_CHAN_TIME_TX; in add_survey()
10166 survey->freq, in add_survey()
10167 survey->nf, in add_survey()
10168 (unsigned long int) survey->channel_time, in add_survey()
10169 (unsigned long int) survey->channel_time_busy, in add_survey()
10170 (unsigned long int) survey->channel_time_tx, in add_survey()
10171 (unsigned long int) survey->channel_time_rx, in add_survey()
10172 survey->filled); in add_survey()
10174 dl_list_add_tail(survey_list, &survey->list); in add_survey()
10228 survey_results->freq_filter)) in survey_handler()
10231 if (survey_results->freq_filter && in survey_handler()
10232 survey_results->freq_filter != surveyed_freq) { in survey_handler()
10238 add_survey(sinfo, ifidx, &survey_results->survey_list); in survey_handler()
10247 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_get_survey()
10256 dl_list_init(&survey_results->survey_list); in wpa_driver_nl80211_get_survey()
10260 return -ENOBUFS; in wpa_driver_nl80211_get_survey()
10274 wpa_supplicant_event(drv->ctx, EVENT_SURVEY, &data); in wpa_driver_nl80211_get_survey()
10286 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_rekey_info()
10291 if (!drv->set_rekey_offload) in nl80211_set_rekey_info()
10309 if (ret == -EOPNOTSUPP) { in nl80211_set_rekey_info()
10312 drv->set_rekey_offload = 0; in nl80211_set_rekey_info()
10350 0, 0, NULL, 0, 0, -1) < 0) in nl80211_send_null_frame()
10359 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_poll_client()
10364 if (!drv->poll_command_supported) { in nl80211_poll_client()
10379 MAC2STR(addr), ret, strerror(-ret)); in nl80211_poll_client()
10398 return -ENOBUFS; in nl80211_set_power_save()
10401 ret = send_and_recv_cmd(bss->drv, msg); in nl80211_set_power_save()
10406 ret, strerror(-ret)); in nl80211_set_power_save()
10420 if (opp_ps != -1 || ctwindow != -1) { in nl80211_set_p2p_powersave()
10424 return -1; /* Not yet supported */ in nl80211_set_p2p_powersave()
10428 if (legacy_ps == -1) in nl80211_set_p2p_powersave()
10431 return -1; /* Not yet supported */ in nl80211_set_p2p_powersave()
10441 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_start_radar_detection()
10446 freq->freq, freq->ht_enabled, freq->vht_enabled, freq->he_enabled, in nl80211_start_radar_detection()
10447 freq->bandwidth, freq->center_freq1, freq->center_freq2); in nl80211_start_radar_detection()
10449 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_RADAR)) { in nl80211_start_radar_detection()
10452 return -1; in nl80211_start_radar_detection()
10458 return -1; in nl80211_start_radar_detection()
10465 "%d (%s)", ret, strerror(-ret)); in nl80211_start_radar_detection()
10466 return -1; in nl80211_start_radar_detection()
10505 nla_put_u32(msg, NL80211_ATTR_IFINDEX, drv->ifindex) || in nl80211_tdls_set_discovery_resp_link()
10516 return -1; in nl80211_tdls_set_discovery_resp_link()
10524 return -1; in nl80211_tdls_set_discovery_resp_link()
10535 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_send_tdls_mgmt()
10538 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_SUPPORT)) in nl80211_send_tdls_mgmt()
10539 return -EOPNOTSUPP; in nl80211_send_tdls_mgmt()
10542 return -EINVAL; in nl80211_send_tdls_mgmt()
10546 return -EOPNOTSUPP; in nl80211_send_tdls_mgmt()
10548 if (link_id < 0 && drv->sta_mlo_info.valid_links) in nl80211_send_tdls_mgmt()
10549 link_id = drv->sta_mlo_info.assoc_link_id; in nl80211_send_tdls_mgmt()
10567 return -ENOBUFS; in nl80211_send_tdls_mgmt()
10574 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_tdls_oper()
10579 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_SUPPORT)) in nl80211_tdls_oper()
10580 return -EOPNOTSUPP; in nl80211_tdls_oper()
10603 return -EINVAL; in nl80211_tdls_oper()
10610 return -ENOBUFS; in nl80211_tdls_oper()
10615 " --> res=%d (%s)", nl80211_oper, MAC2STR(peer), res, in nl80211_tdls_oper()
10616 strerror(-res)); in nl80211_tdls_oper()
10626 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_tdls_enable_channel_switch()
10628 int ret = -ENOBUFS; in nl80211_tdls_enable_channel_switch()
10630 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_SUPPORT) || in nl80211_tdls_enable_channel_switch()
10631 !(drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_enable_channel_switch()
10632 return -EOPNOTSUPP; in nl80211_tdls_enable_channel_switch()
10636 MAC2STR(addr), oper_class, params->freq); in nl80211_tdls_enable_channel_switch()
10655 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_tdls_disable_channel_switch()
10658 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_SUPPORT) || in nl80211_tdls_disable_channel_switch()
10659 !(drv->capa.flags & WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_disable_channel_switch()
10660 return -EOPNOTSUPP; in nl80211_tdls_disable_channel_switch()
10670 return -ENOBUFS; in nl80211_tdls_disable_channel_switch()
10693 struct wpa_driver_nl80211_data *drv = bss->drv; in driver_nl80211_scan2()
10702 if (drv->scan_vendor_cmd_avail && !params->only_new_results) in driver_nl80211_scan2()
10746 struct wpa_driver_nl80211_data *drv = bss->drv; in driver_nl80211_link_remove()
10749 !nl80211_link_valid(bss->valid_links, link_id)) in driver_nl80211_link_remove()
10750 return -1; in driver_nl80211_link_remove()
10754 bss->ifname, link_id, type, ifname, bss->valid_links); in driver_nl80211_link_remove()
10758 bss->ctx = bss->flink->ctx; in driver_nl80211_link_remove()
10760 if (drv->first_bss == bss && bss->valid_links) in driver_nl80211_link_remove()
10761 drv->ctx = bss->ctx; in driver_nl80211_link_remove()
10763 if (!bss->valid_links) { in driver_nl80211_link_remove()
10776 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_is_drv_shared()
10783 for (bss = drv->first_bss; bss; bss = bss->next) { in nl80211_is_drv_shared()
10793 if (bss->valid_links <= 1) in nl80211_is_drv_shared()
10798 if (!(bss->valid_links & (bss->valid_links - 1))) in nl80211_is_drv_shared()
10824 return wpa_driver_nl80211_sta_remove(bss, addr, -1, 0); in driver_nl80211_sta_remove()
10850 const u8 *dst, const u8 *src, in driver_nl80211_send_action() argument
10856 return wpa_driver_nl80211_send_action(bss, freq, wait_time, dst, src, in driver_nl80211_send_action()
10874 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_update_ft_ies()
10882 return -ENOBUFS; in wpa_driver_nl80211_update_ft_ies()
10888 "err=%d (%s)", ret, strerror(-ret)); in wpa_driver_nl80211_update_ft_ies()
10901 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_update_dh_ie()
10910 return -ENOBUFS; in nl80211_update_dh_ie()
10917 ret, strerror(-ret)); in nl80211_update_dh_ie()
10927 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_get_macaddr()
10929 if (drv->nlmode != NL80211_IFTYPE_P2P_DEVICE) in wpa_driver_nl80211_get_macaddr()
10932 return bss->addr; in wpa_driver_nl80211_get_macaddr()
10964 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_status()
10973 res = os_snprintf(pos, end - pos, in wpa_driver_nl80211_status()
10980 bss->ifindex, in wpa_driver_nl80211_status()
10981 bss->ifname, in wpa_driver_nl80211_status()
10982 bss->brname, in wpa_driver_nl80211_status()
10983 MAC2STR(bss->addr), in wpa_driver_nl80211_status()
10984 bss->flink->freq, in wpa_driver_nl80211_status()
10985 bss->flink->beacon_set ? "beacon_set=1\n" : "", in wpa_driver_nl80211_status()
10986 bss->added_if_into_bridge ? in wpa_driver_nl80211_status()
10988 bss->already_in_bridge ? "already_in_bridge=1\n" : "", in wpa_driver_nl80211_status()
10989 bss->added_bridge ? "added_bridge=1\n" : "", in wpa_driver_nl80211_status()
10990 bss->in_deinit ? "in_deinit=1\n" : "", in wpa_driver_nl80211_status()
10991 bss->if_dynamic ? "if_dynamic=1\n" : ""); in wpa_driver_nl80211_status()
10992 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
10993 return pos - buf; in wpa_driver_nl80211_status()
10996 if (bss->wdev_id_set) { in wpa_driver_nl80211_status()
10997 res = os_snprintf(pos, end - pos, "wdev_id=%llu\n", in wpa_driver_nl80211_status()
10998 (unsigned long long) bss->wdev_id); in wpa_driver_nl80211_status()
10999 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
11000 return pos - buf; in wpa_driver_nl80211_status()
11004 res = os_snprintf(pos, end - pos, in wpa_driver_nl80211_status()
11022 drv->phyname, in wpa_driver_nl80211_status()
11023 MAC2STR(drv->perm_addr), in wpa_driver_nl80211_status()
11024 drv->ifindex, in wpa_driver_nl80211_status()
11025 drv->operstate, in wpa_driver_nl80211_status()
11026 scan_state_str(drv->scan_state), in wpa_driver_nl80211_status()
11027 MAC2STR(drv->auth_bssid), in wpa_driver_nl80211_status()
11028 MAC2STR(drv->auth_attempt_bssid), in wpa_driver_nl80211_status()
11029 MAC2STR(drv->bssid), in wpa_driver_nl80211_status()
11030 MAC2STR(drv->prev_bssid), in wpa_driver_nl80211_status()
11031 drv->associated, in wpa_driver_nl80211_status()
11032 drv->assoc_freq, in wpa_driver_nl80211_status()
11033 drv->monitor_sock, in wpa_driver_nl80211_status()
11034 drv->monitor_ifidx, in wpa_driver_nl80211_status()
11035 drv->monitor_refcount, in wpa_driver_nl80211_status()
11036 drv->last_mgmt_freq, in wpa_driver_nl80211_status()
11037 drv->eapol_tx_sock, in wpa_driver_nl80211_status()
11038 drv->ignore_if_down_event ? in wpa_driver_nl80211_status()
11040 drv->scan_complete_events ? in wpa_driver_nl80211_status()
11042 drv->disabled_11b_rates ? in wpa_driver_nl80211_status()
11044 drv->pending_remain_on_chan ? in wpa_driver_nl80211_status()
11046 drv->in_interface_list ? "in_interface_list=1\n" : "", in wpa_driver_nl80211_status()
11047 drv->device_ap_sme ? "device_ap_sme=1\n" : "", in wpa_driver_nl80211_status()
11048 drv->poll_command_supported ? in wpa_driver_nl80211_status()
11050 drv->data_tx_status ? "data_tx_status=1\n" : "", in wpa_driver_nl80211_status()
11051 drv->scan_for_auth ? "scan_for_auth=1\n" : "", in wpa_driver_nl80211_status()
11052 drv->retry_auth ? "retry_auth=1\n" : "", in wpa_driver_nl80211_status()
11053 drv->use_monitor ? "use_monitor=1\n" : "", in wpa_driver_nl80211_status()
11054 drv->ignore_next_local_disconnect ? in wpa_driver_nl80211_status()
11056 drv->ignore_next_local_deauth ? in wpa_driver_nl80211_status()
11058 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
11059 return pos - buf; in wpa_driver_nl80211_status()
11062 if (drv->sta_mlo_info.valid_links) { in wpa_driver_nl80211_status()
11064 struct driver_sta_mlo_info *mlo = &drv->sta_mlo_info; in wpa_driver_nl80211_status()
11066 res = os_snprintf(pos, end - pos, in wpa_driver_nl80211_status()
11069 MAC2STR(mlo->ap_mld_addr), in wpa_driver_nl80211_status()
11070 mlo->default_map); in wpa_driver_nl80211_status()
11071 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
11072 return pos - buf; in wpa_driver_nl80211_status()
11075 for_each_link(mlo->valid_links, i) { in wpa_driver_nl80211_status()
11076 res = os_snprintf(pos, end - pos, in wpa_driver_nl80211_status()
11080 i, MAC2STR(mlo->links[i].addr), in wpa_driver_nl80211_status()
11081 i, MAC2STR(mlo->links[i].bssid), in wpa_driver_nl80211_status()
11082 i, mlo->links[i].freq); in wpa_driver_nl80211_status()
11083 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
11084 return pos - buf; in wpa_driver_nl80211_status()
11087 if (!mlo->default_map) { in wpa_driver_nl80211_status()
11089 pos, end - pos, in wpa_driver_nl80211_status()
11092 i, mlo->links[i].t2lmap.uplink, in wpa_driver_nl80211_status()
11093 i, mlo->links[i].t2lmap.downlink); in wpa_driver_nl80211_status()
11094 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
11095 return pos - buf; in wpa_driver_nl80211_status()
11101 if (drv->has_capability) { in wpa_driver_nl80211_status()
11102 res = os_snprintf(pos, end - pos, in wpa_driver_nl80211_status()
11128 drv->capa.key_mgmt, in wpa_driver_nl80211_status()
11129 drv->capa.enc, in wpa_driver_nl80211_status()
11130 drv->capa.auth, in wpa_driver_nl80211_status()
11131 (unsigned long long) drv->capa.flags, in wpa_driver_nl80211_status()
11132 (unsigned long long) drv->capa.flags2, in wpa_driver_nl80211_status()
11133 drv->capa.rrm_flags, in wpa_driver_nl80211_status()
11134 drv->capa.max_scan_ssids, in wpa_driver_nl80211_status()
11135 drv->capa.max_sched_scan_ssids, in wpa_driver_nl80211_status()
11136 drv->capa.sched_scan_supported, in wpa_driver_nl80211_status()
11137 drv->capa.max_match_sets, in wpa_driver_nl80211_status()
11138 drv->capa.max_remain_on_chan, in wpa_driver_nl80211_status()
11139 drv->capa.max_stations, in wpa_driver_nl80211_status()
11140 drv->capa.probe_resp_offloads, in wpa_driver_nl80211_status()
11141 drv->capa.max_acl_mac_addrs, in wpa_driver_nl80211_status()
11142 drv->capa.num_multichan_concurrent, in wpa_driver_nl80211_status()
11143 drv->capa.mac_addr_rand_sched_scan_supported, in wpa_driver_nl80211_status()
11144 drv->capa.mac_addr_rand_scan_supported, in wpa_driver_nl80211_status()
11145 drv->capa.conc_capab, in wpa_driver_nl80211_status()
11146 drv->capa.max_conc_chan_2_4, in wpa_driver_nl80211_status()
11147 drv->capa.max_conc_chan_5_0, in wpa_driver_nl80211_status()
11148 drv->capa.max_sched_scan_plans, in wpa_driver_nl80211_status()
11149 drv->capa.max_sched_scan_plan_interval, in wpa_driver_nl80211_status()
11150 drv->capa.max_sched_scan_plan_iterations, in wpa_driver_nl80211_status()
11151 drv->capa.mbssid_max_interfaces, in wpa_driver_nl80211_status()
11152 drv->capa.ema_max_periodicity); in wpa_driver_nl80211_status()
11153 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
11154 return pos - buf; in wpa_driver_nl80211_status()
11161 nla_put_u32(msg, NL80211_ATTR_WIPHY, drv->wiphy_idx) == 0) { in wpa_driver_nl80211_status()
11165 res = os_snprintf(pos, end - pos, "country=%s\n", in wpa_driver_nl80211_status()
11167 if (os_snprintf_error(end - pos, res)) in wpa_driver_nl80211_status()
11168 return pos - buf; in wpa_driver_nl80211_status()
11175 return pos - buf; in wpa_driver_nl80211_status()
11181 if ((settings->head && in set_beacon_data()
11183 settings->head_len, settings->head)) || in set_beacon_data()
11184 (settings->tail && in set_beacon_data()
11186 settings->tail_len, settings->tail)) || in set_beacon_data()
11187 (settings->beacon_ies && in set_beacon_data()
11189 settings->beacon_ies_len, settings->beacon_ies)) || in set_beacon_data()
11190 (settings->proberesp_ies && in set_beacon_data()
11192 settings->proberesp_ies_len, settings->proberesp_ies)) || in set_beacon_data()
11193 (settings->assocresp_ies && in set_beacon_data()
11195 settings->assocresp_ies_len, settings->assocresp_ies)) || in set_beacon_data()
11196 (settings->probe_resp && in set_beacon_data()
11198 settings->probe_resp_len, settings->probe_resp))) in set_beacon_data()
11199 return -ENOBUFS; in set_beacon_data()
11209 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_switch_channel()
11211 int ret = -ENOBUFS; in nl80211_switch_channel()
11217 settings->cs_count, settings->block_tx, in nl80211_switch_channel()
11218 settings->freq_params.freq, in nl80211_switch_channel()
11219 settings->freq_params.channel, in nl80211_switch_channel()
11220 settings->freq_params.sec_channel_offset, in nl80211_switch_channel()
11221 settings->freq_params.bandwidth, in nl80211_switch_channel()
11222 settings->freq_params.center_freq1, in nl80211_switch_channel()
11223 settings->freq_params.center_freq2, in nl80211_switch_channel()
11224 settings->punct_bitmap, in nl80211_switch_channel()
11225 settings->link_id, in nl80211_switch_channel()
11226 settings->freq_params.ht_enabled ? " ht" : "", in nl80211_switch_channel()
11227 settings->freq_params.vht_enabled ? " vht" : "", in nl80211_switch_channel()
11228 settings->freq_params.he_enabled ? " he" : ""); in nl80211_switch_channel()
11230 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_AP_CSA)) { in nl80211_switch_channel()
11232 return -EOPNOTSUPP; in nl80211_switch_channel()
11235 if (drv->nlmode != NL80211_IFTYPE_AP && in nl80211_switch_channel()
11236 drv->nlmode != NL80211_IFTYPE_P2P_GO && in nl80211_switch_channel()
11237 drv->nlmode != NL80211_IFTYPE_MESH_POINT) in nl80211_switch_channel()
11238 return -EOPNOTSUPP; in nl80211_switch_channel()
11245 if (settings->counter_offset_beacon[0] && in nl80211_switch_channel()
11246 !settings->counter_offset_beacon[1]) { in nl80211_switch_channel()
11248 } else if (settings->counter_offset_beacon[1] && in nl80211_switch_channel()
11249 !settings->counter_offset_beacon[0]) { in nl80211_switch_channel()
11251 settings->counter_offset_beacon[0] = in nl80211_switch_channel()
11252 settings->counter_offset_beacon[1]; in nl80211_switch_channel()
11253 settings->counter_offset_presp[0] = in nl80211_switch_channel()
11254 settings->counter_offset_presp[1]; in nl80211_switch_channel()
11255 } else if (settings->counter_offset_beacon[1] && in nl80211_switch_channel()
11256 settings->counter_offset_beacon[0]) { in nl80211_switch_channel()
11260 return -EINVAL; in nl80211_switch_channel()
11264 if (drv->capa.max_csa_counters && in nl80211_switch_channel()
11265 csa_off_len > drv->capa.max_csa_counters) { in nl80211_switch_channel()
11268 return -EINVAL; in nl80211_switch_channel()
11271 if (!settings->beacon_csa.tail) in nl80211_switch_channel()
11272 return -EINVAL; in nl80211_switch_channel()
11275 u16 csa_c_off_bcn = settings->counter_offset_beacon[i]; in nl80211_switch_channel()
11276 u16 csa_c_off_presp = settings->counter_offset_presp[i]; in nl80211_switch_channel()
11278 if ((settings->beacon_csa.tail_len <= csa_c_off_bcn) || in nl80211_switch_channel()
11279 (settings->beacon_csa.tail[csa_c_off_bcn] != in nl80211_switch_channel()
11280 settings->cs_count)) in nl80211_switch_channel()
11281 return -EINVAL; in nl80211_switch_channel()
11283 if (settings->beacon_csa.probe_resp && in nl80211_switch_channel()
11284 ((settings->beacon_csa.probe_resp_len <= in nl80211_switch_channel()
11286 (settings->beacon_csa.probe_resp[csa_c_off_presp] != in nl80211_switch_channel()
11287 settings->cs_count))) in nl80211_switch_channel()
11288 return -EINVAL; in nl80211_switch_channel()
11293 settings->cs_count) || in nl80211_switch_channel()
11294 (ret = nl80211_put_freq_params(msg, &settings->freq_params)) || in nl80211_switch_channel()
11295 (settings->block_tx && in nl80211_switch_channel()
11297 (settings->punct_bitmap && in nl80211_switch_channel()
11299 settings->punct_bitmap)) || in nl80211_switch_channel()
11300 (settings->link_id != NL80211_DRV_LINK_ID_NA && in nl80211_switch_channel()
11301 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, settings->link_id))) in nl80211_switch_channel()
11305 ret = set_beacon_data(msg, &settings->beacon_after); in nl80211_switch_channel()
11314 ret = set_beacon_data(msg, &settings->beacon_csa); in nl80211_switch_channel()
11320 settings->counter_offset_beacon) || in nl80211_switch_channel()
11321 (settings->beacon_csa.probe_resp && in nl80211_switch_channel()
11324 settings->counter_offset_presp))) in nl80211_switch_channel()
11330 if (settings->ubpr.unsol_bcast_probe_resp_interval && in nl80211_switch_channel()
11331 nl80211_unsol_bcast_probe_resp(bss, msg, &settings->ubpr) < 0) in nl80211_switch_channel()
11338 ret, strerror(-ret)); in nl80211_switch_channel()
11343 ret = -ENOBUFS; in nl80211_switch_channel()
11355 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_switch_color()
11358 int ret = -ENOBUFS; in nl80211_switch_color()
11362 settings->cca_count, settings->cca_color); in nl80211_switch_color()
11364 if (drv->nlmode != NL80211_IFTYPE_AP) in nl80211_switch_color()
11365 return -EOPNOTSUPP; in nl80211_switch_color()
11367 if (!settings->beacon_cca.tail) in nl80211_switch_color()
11368 return -EINVAL; in nl80211_switch_color()
11370 if (settings->beacon_cca.tail_len <= settings->counter_offset_beacon || in nl80211_switch_color()
11371 settings->beacon_cca.tail[settings->counter_offset_beacon] != in nl80211_switch_color()
11372 settings->cca_count) in nl80211_switch_color()
11373 return -EINVAL; in nl80211_switch_color()
11375 if (settings->beacon_cca.probe_resp && in nl80211_switch_color()
11376 (settings->beacon_cca.probe_resp_len <= in nl80211_switch_color()
11377 settings->counter_offset_presp || in nl80211_switch_color()
11378 settings->beacon_cca.probe_resp[settings->counter_offset_presp] != in nl80211_switch_color()
11379 settings->cca_count)) in nl80211_switch_color()
11380 return -EINVAL; in nl80211_switch_color()
11385 settings->cca_count) || in nl80211_switch_color()
11387 settings->cca_color)) in nl80211_switch_color()
11391 ret = set_beacon_data(msg, &settings->beacon_after); in nl80211_switch_color()
11398 ret = -ENOBUFS; in nl80211_switch_color()
11402 ret = set_beacon_data(msg, &settings->beacon_cca); in nl80211_switch_color()
11407 settings->counter_offset_beacon) || in nl80211_switch_color()
11408 (settings->beacon_cca.probe_resp && in nl80211_switch_color()
11410 settings->counter_offset_presp))) { in nl80211_switch_color()
11411 ret = -ENOBUFS; in nl80211_switch_color()
11417 if (settings->ubpr.unsol_bcast_probe_resp_interval && in nl80211_switch_color()
11418 nl80211_unsol_bcast_probe_resp(bss, msg, &settings->ubpr) < 0) { in nl80211_switch_color()
11419 ret = -ENOBUFS; in nl80211_switch_color()
11424 if (nl80211_link_valid(bss->valid_links, settings->link_id)) { in nl80211_switch_color()
11427 settings->link_id); in nl80211_switch_color()
11430 settings->link_id)) { in nl80211_switch_color()
11432 return -1; in nl80211_switch_color()
11441 ret, strerror(-ret)); in nl80211_switch_color()
11457 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_add_ts()
11465 if (!is_sta_interface(drv->nlmode)) in nl80211_add_ts()
11466 return -ENOTSUP; in nl80211_add_ts()
11475 return -ENOBUFS; in nl80211_add_ts()
11481 ret, strerror(-ret)); in nl80211_add_ts()
11489 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_del_ts()
11495 if (!is_sta_interface(drv->nlmode)) in nl80211_del_ts()
11496 return -ENOTSUP; in nl80211_del_ts()
11502 return -ENOBUFS; in nl80211_del_ts()
11508 ret, strerror(-ret)); in nl80211_del_ts()
11592 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_vendor_cmd()
11600 return -ENOMEM; in nl80211_vendor_cmd()
11608 * bss->nl_connect as the handle. */ in nl80211_vendor_cmd()
11609 ret = send_and_recv(drv->global, bss->nl_connect, msg, in nl80211_vendor_cmd()
11642 return -ENOBUFS; in nl80211_vendor_cmd()
11650 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_qos_map()
11660 return -ENOBUFS; in nl80211_set_qos_map()
11689 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_wowlan()
11715 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_wowlan()
11725 (triggers->any && in nl80211_set_wowlan()
11727 (triggers->disconnect && in nl80211_set_wowlan()
11729 (triggers->magic_pkt && in nl80211_set_wowlan()
11731 (triggers->gtk_rekey_failure && in nl80211_set_wowlan()
11733 (triggers->eap_identity_req && in nl80211_set_wowlan()
11735 (triggers->four_way_handshake && in nl80211_set_wowlan()
11737 (triggers->rfkill_release && in nl80211_set_wowlan()
11740 return -ENOBUFS; in nl80211_set_wowlan()
11757 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_roaming()
11763 if (!drv->roaming_vendor_cmd_avail) { in nl80211_roaming()
11766 return -1; in nl80211_roaming()
11780 return -1; in nl80211_roaming()
11791 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_disable_fils()
11797 if (!drv->set_wifi_conf_vendor_cmd_avail) in nl80211_disable_fils()
11798 return -1; in nl80211_disable_fils()
11808 return -1; in nl80211_disable_fils()
11823 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_bssid_tmp_disallow()
11832 if (!drv->roam_vendor_cmd_avail) in nl80211_set_bssid_tmp_disallow()
11833 return -1; in nl80211_set_bssid_tmp_disallow()
11873 return -1; in nl80211_set_bssid_tmp_disallow()
11880 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_add_sta_node()
11884 if (!drv->add_sta_node_vendor_cmd_avail) in nl80211_add_sta_node()
11885 return -EOPNOTSUPP; in nl80211_add_sta_node()
11903 return -1; in nl80211_add_sta_node()
11916 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_mac_addr()
11920 return -1; in nl80211_set_mac_addr()
11923 addr = drv->perm_addr; in nl80211_set_mac_addr()
11925 if (linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 0) < 0) in nl80211_set_mac_addr()
11926 return -1; in nl80211_set_mac_addr()
11928 if (linux_set_ifhwaddr(drv->global->ioctl_sock, bss->ifname, addr) < 0) in nl80211_set_mac_addr()
11932 bss->ifname, MAC2STR(addr)); in nl80211_set_mac_addr()
11933 if (linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, in nl80211_set_mac_addr()
11938 return -1; in nl80211_set_mac_addr()
11942 bss->ifname, MAC2STR(addr)); in nl80211_set_mac_addr()
11943 drv->addr_changed = new_addr; in nl80211_set_mac_addr()
11944 os_memcpy(bss->prev_addr, bss->addr, ETH_ALEN); in nl80211_set_mac_addr()
11945 os_memcpy(bss->addr, addr, ETH_ALEN); in nl80211_set_mac_addr()
11947 if (linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 1) < 0) in nl80211_set_mac_addr()
11964 return -1; in wpa_driver_nl80211_init_mesh()
11990 return -1; in nl80211_put_mesh_config()
11992 if (((params->flags & WPA_DRIVER_MESH_CONF_FLAG_AUTO_PLINKS) && in nl80211_put_mesh_config()
11994 params->auto_plinks)) || in nl80211_put_mesh_config()
11995 ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_FORWARDING) && in nl80211_put_mesh_config()
11997 params->forwarding)) || in nl80211_put_mesh_config()
11998 ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS) && in nl80211_put_mesh_config()
12000 params->max_peer_links)) || in nl80211_put_mesh_config()
12001 ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD) && in nl80211_put_mesh_config()
12003 params->rssi_threshold))) in nl80211_put_mesh_config()
12004 return -1; in nl80211_put_mesh_config()
12010 if ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_PEER_LINK_TIMEOUT) && in nl80211_put_mesh_config()
12012 params->peer_link_timeout)) { in nl80211_put_mesh_config()
12014 return -1; in nl80211_put_mesh_config()
12017 if ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_HT_OP_MODE) && in nl80211_put_mesh_config()
12018 nla_put_u16(msg, NL80211_MESHCONF_HT_OPMODE, params->ht_opmode)) { in nl80211_put_mesh_config()
12020 return -1; in nl80211_put_mesh_config()
12032 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_join_mesh()
12035 int ret = -1; in nl80211_join_mesh()
12037 wpa_printf(MSG_DEBUG, "nl80211: mesh join (ifindex=%d)", drv->ifindex); in nl80211_join_mesh()
12040 nl80211_put_freq_params(msg, &params->freq) || in nl80211_join_mesh()
12041 nl80211_put_basic_rates(msg, params->basic_rates) || in nl80211_join_mesh()
12042 nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) || in nl80211_join_mesh()
12043 nl80211_put_beacon_int(msg, params->beacon_int) || in nl80211_join_mesh()
12044 nl80211_put_dtim_period(msg, params->dtim_period)) in nl80211_join_mesh()
12047 wpa_printf(MSG_DEBUG, " * flags=%08X", params->flags); in nl80211_join_mesh()
12049 if (params->handle_dfs && nla_put_flag(msg, NL80211_ATTR_HANDLE_DFS)) in nl80211_join_mesh()
12056 if (params->ies) { in nl80211_join_mesh()
12057 wpa_hexdump(MSG_DEBUG, " * IEs", params->ies, params->ie_len); in nl80211_join_mesh()
12058 if (nla_put(msg, NL80211_MESH_SETUP_IE, params->ie_len, in nl80211_join_mesh()
12059 params->ies)) in nl80211_join_mesh()
12063 if (params->flags & WPA_DRIVER_MESH_FLAG_SAE_AUTH) { in nl80211_join_mesh()
12068 if ((params->flags & WPA_DRIVER_MESH_FLAG_AMPE) && in nl80211_join_mesh()
12071 if ((params->flags & WPA_DRIVER_MESH_FLAG_USER_MPM) && in nl80211_join_mesh()
12076 params->conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_AUTO_PLINKS; in nl80211_join_mesh()
12077 params->conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_PEER_LINK_TIMEOUT; in nl80211_join_mesh()
12078 params->conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS; in nl80211_join_mesh()
12079 if (nl80211_put_mesh_config(msg, &params->conf) < 0) in nl80211_join_mesh()
12083 return -1; in nl80211_join_mesh()
12084 ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, in nl80211_join_mesh()
12089 ret, strerror(-ret)); in nl80211_join_mesh()
12093 drv->assoc_freq = bss->flink->freq = params->freq.freq; in nl80211_join_mesh()
12109 timeout = params->conf.peer_link_timeout; in wpa_driver_nl80211_join_mesh()
12112 if (params->flags & WPA_DRIVER_MESH_FLAG_USER_MPM) in wpa_driver_nl80211_join_mesh()
12113 params->conf.peer_link_timeout = 0; in wpa_driver_nl80211_join_mesh()
12116 if (ret == -EINVAL && params->conf.peer_link_timeout == 0) { in wpa_driver_nl80211_join_mesh()
12124 params->conf.peer_link_timeout = timeout + 60; in wpa_driver_nl80211_join_mesh()
12128 params->conf.peer_link_timeout = timeout; in wpa_driver_nl80211_join_mesh()
12136 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_leave_mesh()
12140 wpa_printf(MSG_DEBUG, "nl80211: mesh leave (ifindex=%d)", drv->ifindex); in wpa_driver_nl80211_leave_mesh()
12142 ret = send_and_recv(drv->global, bss->nl_connect, msg, NULL, NULL, NULL, in wpa_driver_nl80211_leave_mesh()
12146 ret, strerror(-ret)); in wpa_driver_nl80211_leave_mesh()
12150 drv->first_bss->flink->freq = 0; in wpa_driver_nl80211_leave_mesh()
12153 if (drv->start_mode_sta && in wpa_driver_nl80211_leave_mesh()
12154 wpa_driver_nl80211_set_mode(drv->first_bss, in wpa_driver_nl80211_leave_mesh()
12167 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_probe_mesh_link()
12176 return -ENOBUFS; in nl80211_probe_mesh_link()
12183 MAC2STR(addr), ret, strerror(-ret)); in nl80211_probe_mesh_link()
12200 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_br_add_ip_neigh()
12203 .ndm_ifindex = bss->br_ifindex, in wpa_driver_br_add_ip_neigh()
12210 return -EINVAL; in wpa_driver_br_add_ip_neigh()
12212 if (bss->br_ifindex == 0) { in wpa_driver_br_add_ip_neigh()
12215 return -1; in wpa_driver_br_add_ip_neigh()
12218 if (!drv->rtnl_sk) { in wpa_driver_br_add_ip_neigh()
12221 return -1; in wpa_driver_br_add_ip_neigh()
12231 return -EINVAL; in wpa_driver_br_add_ip_neigh()
12236 return -ENOMEM; in wpa_driver_br_add_ip_neigh()
12238 res = -ENOMEM; in wpa_driver_br_add_ip_neigh()
12244 res = nl_send_auto_complete(drv->rtnl_sk, msg); in wpa_driver_br_add_ip_neigh()
12248 res = nl_wait_for_ack(drv->rtnl_sk); in wpa_driver_br_add_ip_neigh()
12264 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_br_delete_ip_neigh()
12267 .ndm_ifindex = bss->br_ifindex, in wpa_driver_br_delete_ip_neigh()
12274 return -EINVAL; in wpa_driver_br_delete_ip_neigh()
12283 return -EINVAL; in wpa_driver_br_delete_ip_neigh()
12286 if (bss->br_ifindex == 0) { in wpa_driver_br_delete_ip_neigh()
12289 return -1; in wpa_driver_br_delete_ip_neigh()
12292 if (!drv->rtnl_sk) { in wpa_driver_br_delete_ip_neigh()
12295 return -1; in wpa_driver_br_delete_ip_neigh()
12300 return -ENOMEM; in wpa_driver_br_delete_ip_neigh()
12302 res = -ENOMEM; in wpa_driver_br_delete_ip_neigh()
12307 res = nl_send_auto_complete(drv->rtnl_sk, msg); in wpa_driver_br_delete_ip_neigh()
12311 res = nl_wait_for_ack(drv->rtnl_sk); in wpa_driver_br_delete_ip_neigh()
12330 return -1; in linux_write_system_file()
12334 return -1; in linux_write_system_file()
12341 return -1; in linux_write_system_file()
12373 return -EINVAL; in wpa_driver_br_port_set_attr()
12376 bss->ifname, attr_txt); in wpa_driver_br_port_set_attr()
12379 return -1; in wpa_driver_br_port_set_attr()
12407 bss->brname); in wpa_driver_br_set_net_param()
12413 return -EINVAL; in wpa_driver_br_set_net_param()
12420 return -EINVAL; in wpa_driver_br_set_net_param()
12424 ip_version, bss->brname, param_txt); in wpa_driver_br_set_net_param()
12428 return -1; in wpa_driver_br_set_net_param()
12450 return -1; in hw_mode_to_qca_acs()
12469 return -1; in add_acs_ch_list()
12508 return -1; in add_acs_freq_list()
12526 mode = hw_mode_to_qca_acs(params->hw_mode); in nl80211_qca_do_acs()
12528 return -1; in nl80211_qca_do_acs()
12536 (params->ht_enabled && in nl80211_qca_do_acs()
12538 (params->ht40_enabled && in nl80211_qca_do_acs()
12540 (params->vht_enabled && in nl80211_qca_do_acs()
12542 (params->eht_enabled && in nl80211_qca_do_acs()
12545 params->ch_width) || in nl80211_qca_do_acs()
12546 add_acs_ch_list(msg, params->freq_list) || in nl80211_qca_do_acs()
12547 add_acs_freq_list(msg, params->freq_list) || in nl80211_qca_do_acs()
12548 (params->edmg_enabled && in nl80211_qca_do_acs()
12550 (params->link_id != NL80211_DRV_LINK_ID_NA && in nl80211_qca_do_acs()
12552 params->link_id))) { in nl80211_qca_do_acs()
12554 return -ENOBUFS; in nl80211_qca_do_acs()
12560 params->hw_mode, params->ht_enabled, params->ht40_enabled, in nl80211_qca_do_acs()
12561 params->vht_enabled, params->eht_enabled, params->ch_width, in nl80211_qca_do_acs()
12562 params->edmg_enabled, params->link_id); in nl80211_qca_do_acs()
12568 strerror(-ret)); in nl80211_qca_do_acs()
12577 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_band()
12584 if (!drv->setband_vendor_cmd_avail || in nl80211_set_band()
12586 return -1; in nl80211_set_band()
12618 return -ENOBUFS; in nl80211_set_band()
12626 strerror(-ret)); in nl80211_set_band()
12640 wpcl->freq = nla_get_u32(nl[QCA_WLAN_VENDOR_ATTR_PCL_FREQ]); in get_pcl_attr_values()
12642 wpcl->weight = nla_get_u8(nl[QCA_WLAN_VENDOR_ATTR_PCL_WEIGHT]); in get_pcl_attr_values()
12646 wpcl->flag = 0; in get_pcl_attr_values()
12648 wpcl->flag |= WEIGHTED_PCL_GO; in get_pcl_attr_values()
12650 wpcl->flag |= WEIGHTED_PCL_CLI; in get_pcl_attr_values()
12652 wpcl->flag |= WEIGHTED_PCL_MUST_CONSIDER; in get_pcl_attr_values()
12654 wpcl->flag |= WEIGHTED_PCL_EXCLUDE; in get_pcl_attr_values()
12656 wpcl->flag = WEIGHTED_PCL_GO | WEIGHTED_PCL_CLI; in get_pcl_attr_values()
12687 param->num = 0; in preferred_freq_info_handler()
12704 if (num == param->num) in preferred_freq_info_handler()
12710 param->num = 0; in preferred_freq_info_handler()
12713 get_pcl_attr_values(&param->freq_list[num], nl_pcl); in preferred_freq_info_handler()
12716 param->num = num; in preferred_freq_info_handler()
12723 if (param->freq_list[i].weight < in preferred_freq_info_handler()
12724 param->freq_list[j].weight) { in preferred_freq_info_handler()
12727 tmp = param->freq_list[i]; in preferred_freq_info_handler()
12728 param->freq_list[i] = in preferred_freq_info_handler()
12729 param->freq_list[j]; in preferred_freq_info_handler()
12730 param->freq_list[j] = tmp; in preferred_freq_info_handler()
12736 "nl80211: Driver does not provide weighted PCL; use the non-weighted variant"); in preferred_freq_info_handler()
12739 * param->num has the maximum number of entries for which there in preferred_freq_info_handler()
12744 if (max_num > param->num) in preferred_freq_info_handler()
12745 max_num = param->num; in preferred_freq_info_handler()
12747 param->freq_list[num].freq = freqs[num]; in preferred_freq_info_handler()
12748 param->freq_list[num].flag = in preferred_freq_info_handler()
12751 param->num = num; in preferred_freq_info_handler()
12755 param->num = 0; in preferred_freq_info_handler()
12768 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_pref_freq_list()
12776 if (!drv->get_pref_freq_list) in nl80211_get_pref_freq_list()
12777 return -1; in nl80211_get_pref_freq_list()
12799 return -1; in nl80211_get_pref_freq_list()
12806 nla_put_u32(msg, NL80211_ATTR_IFINDEX, drv->ifindex) || in nl80211_get_pref_freq_list()
12818 return -1; in nl80211_get_pref_freq_list()
12847 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_prob_oper_freq()
12852 if (!drv->set_prob_oper_freq) in nl80211_set_prob_oper_freq()
12853 return -1; in nl80211_set_prob_oper_freq()
12857 freq, bss->ifindex); in nl80211_set_prob_oper_freq()
12874 return -1; in nl80211_set_prob_oper_freq()
12897 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_p2p_lo_start()
12906 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_P2P_LISTEN_OFFLOAD)) in nl80211_p2p_lo_start()
12907 return -1; in nl80211_p2p_lo_start()
12946 return -1; in nl80211_p2p_lo_start()
12953 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_p2p_lo_stop()
12958 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_P2P_LISTEN_OFFLOAD)) in nl80211_p2p_lo_stop()
12959 return -1; in nl80211_p2p_lo_stop()
12966 return -1; in nl80211_p2p_lo_stop()
12976 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_tdls_mode()
13013 ret, strerror(-ret)); in nl80211_set_tdls_mode()
13019 return -1; in nl80211_set_tdls_mode()
13052 os_memcpy(candidate->bssid, in nl80211_parse_btm_candidate_info()
13058 candidate->is_accept = status == QCA_STATUS_ACCEPT; in nl80211_parse_btm_candidate_info()
13059 candidate->reject_reason = nl80211_mbo_reject_reason_mapping(status); in nl80211_parse_btm_candidate_info()
13061 if (candidate->is_accept) in nl80211_parse_btm_candidate_info()
13066 candidate->reject_reason); in nl80211_parse_btm_candidate_info()
13068 num, MAC2STR(candidate->bssid), buf); in nl80211_parse_btm_candidate_info()
13076 struct candidate_list *candidate = info->candidates; in nl80211_get_bss_transition_status_handler()
13094 num = info->num; /* number of candidates sent to driver */ in nl80211_get_bss_transition_status_handler()
13095 info->num = 0; in nl80211_get_bss_transition_status_handler()
13110 if (info->num >= num || in nl80211_get_bss_transition_status_handler()
13118 nl80211_parse_btm_candidate_info(candidate, tb, info->num); in nl80211_get_bss_transition_status_handler()
13121 info->num++; in nl80211_get_bss_transition_status_handler()
13132 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_bss_transition_status()
13140 if (!drv->fetch_bss_trans_status) in nl80211_get_bss_transition_status()
13147 info->candidates = os_calloc(params->n_candidates, in nl80211_get_bss_transition_status()
13148 sizeof(*info->candidates)); in nl80211_get_bss_transition_status()
13149 if (!info->candidates) { in nl80211_get_bss_transition_status()
13156 * candidates that can be populated in info->candidates and will be in nl80211_get_bss_transition_status()
13160 info->num = params->n_candidates; in nl80211_get_bss_transition_status()
13173 params->mbo_transition_reason)) in nl80211_get_bss_transition_status()
13182 params->mbo_transition_reason, params->n_candidates); in nl80211_get_bss_transition_status()
13183 pos = params->bssid; in nl80211_get_bss_transition_status()
13184 for (i = 0; i < params->n_candidates; i++) { in nl80211_get_bss_transition_status()
13206 ret, strerror(-ret)); in nl80211_get_bss_transition_status()
13213 os_free(info->candidates); in nl80211_get_bss_transition_status()
13220 * nl80211_ignore_assoc_disallow - Configure driver to ignore assoc_disallow
13223 * Returns: 0 on success, -1 on failure
13228 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_ignore_assoc_disallow()
13231 int ret = -1; in nl80211_ignore_assoc_disallow()
13233 if (!drv->set_wifi_conf_vendor_cmd_avail) in nl80211_ignore_assoc_disallow()
13234 return -1; in nl80211_ignore_assoc_disallow()
13259 ret, strerror(-ret)); in nl80211_ignore_assoc_disallow()
13279 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_send_pasn_resp()
13281 wpa_dbg(drv->ctx, MSG_DEBUG, in nl80211_send_pasn_resp()
13283 params->num_peers); in nl80211_send_pasn_resp()
13299 for (i = 0; i < params->num_peers; i++) { in nl80211_send_pasn_resp()
13303 ETH_ALEN, params->peer[i].own_addr) || in nl80211_send_pasn_resp()
13305 ETH_ALEN, params->peer[i].peer_addr)) in nl80211_send_pasn_resp()
13308 if (params->peer[i].status == 0 && in nl80211_send_pasn_resp()
13316 i, MAC2STR(params->peer[i].own_addr), i, in nl80211_send_pasn_resp()
13317 MAC2STR(params->peer[i].peer_addr), in nl80211_send_pasn_resp()
13318 params->peer[i].status ? "Fail" : "Success"); in nl80211_send_pasn_resp()
13329 return -1; in nl80211_send_pasn_resp()
13341 return (u32) -1; in wpa_ltf_keyseed_len_to_sha_type()
13353 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_secure_ranging_ctx()
13357 if (!drv->secure_ranging_ctx_vendor_cmd_avail) in nl80211_set_secure_ranging_ctx()
13360 if (!params->peer_addr || !params->own_addr) in nl80211_set_secure_ranging_ctx()
13361 return -1; in nl80211_set_secure_ranging_ctx()
13363 wpa_dbg(drv->ctx, MSG_DEBUG, in nl80211_set_secure_ranging_ctx()
13365 MAC2STR(params->peer_addr)); in nl80211_set_secure_ranging_ctx()
13379 ETH_ALEN, params->peer_addr) || in nl80211_set_secure_ranging_ctx()
13381 ETH_ALEN, params->own_addr) || in nl80211_set_secure_ranging_ctx()
13383 params->action)) in nl80211_set_secure_ranging_ctx()
13386 if (params->cipher) { in nl80211_set_secure_ranging_ctx()
13387 suite = wpa_cipher_to_cipher_suite(params->cipher); in nl80211_set_secure_ranging_ctx()
13395 if (params->tk_len && params->tk) { in nl80211_set_secure_ranging_ctx()
13397 params->tk_len, params->tk)) in nl80211_set_secure_ranging_ctx()
13400 params->tk, params->tk_len); in nl80211_set_secure_ranging_ctx()
13403 if (params->ltf_keyseed_len && params->ltf_keyseed) { in nl80211_set_secure_ranging_ctx()
13405 params->ltf_keyseed_len); in nl80211_set_secure_ranging_ctx()
13407 if (sha_type == (u32) -1 || in nl80211_set_secure_ranging_ctx()
13414 params->ltf_keyseed_len, params->ltf_keyseed)) in nl80211_set_secure_ranging_ctx()
13417 params->ltf_keyseed, params->ltf_keyseed_len); in nl80211_set_secure_ranging_ctx()
13425 ret, strerror(-ret)); in nl80211_set_secure_ranging_ctx()
13429 return -1; in nl80211_set_secure_ranging_ctx()
13444 int ret = -1; in wpa_driver_do_broadcom_acs()
13446 freq_list_len = int_array_len(params->freq_list); in wpa_driver_do_broadcom_acs()
13456 nla_put_u8(msg, BRCM_VENDOR_ATTR_ACS_HW_MODE, params->hw_mode) || in wpa_driver_do_broadcom_acs()
13458 params->ht_enabled) || in wpa_driver_do_broadcom_acs()
13460 params->ht40_enabled) || in wpa_driver_do_broadcom_acs()
13462 params->vht_enabled) || in wpa_driver_do_broadcom_acs()
13463 nla_put_u16(msg, BRCM_VENDOR_ATTR_ACS_CHWIDTH, params->ch_width) || in wpa_driver_do_broadcom_acs()
13466 sizeof(int) * freq_list_len, params->freq_list))) in wpa_driver_do_broadcom_acs()
13472 params->hw_mode, params->ht_enabled, params->ht40_enabled, in wpa_driver_do_broadcom_acs()
13473 params->vht_enabled, params->ch_width); in wpa_driver_do_broadcom_acs()
13494 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_do_acs()
13498 if (drv->qca_do_acs) in nl80211_do_acs()
13503 if (drv->brcm_do_acs) in nl80211_do_acs()
13507 return -1; in nl80211_do_acs()
13528 ret = -1; in nl80211_write_to_file()
13539 ret = -1; in nl80211_write_to_file()
13555 /* P2P-Device has no netdev that can (or should) be configured here */ in nl80211_configure_data_frame_filters()
13565 bss->ifname); in nl80211_configure_data_frame_filters()
13567 return -1; in nl80211_configure_data_frame_filters()
13580 bss->ifname); in nl80211_configure_data_frame_filters()
13594 bss->ifname); in nl80211_configure_data_frame_filters()
13607 bss->ifname); in nl80211_configure_data_frame_filters()
13626 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_ext_capab()
13631 return -1; in nl80211_get_ext_capab()
13635 /* By default, use the per-radio values */ in nl80211_get_ext_capab()
13636 *ext_capa = drv->extended_capa; in nl80211_get_ext_capab()
13637 *ext_capa_mask = drv->extended_capa_mask; in nl80211_get_ext_capab()
13638 *ext_capa_len = drv->extended_capa_len; in nl80211_get_ext_capab()
13640 /* Replace the default value if a per-interface type value exists */ in nl80211_get_ext_capab()
13641 for (i = 0; i < drv->num_iface_capa; i++) { in nl80211_get_ext_capab()
13642 if (nlmode == drv->iface_capa[i].iftype) { in nl80211_get_ext_capab()
13643 *ext_capa = drv->iface_capa[i].ext_capa; in nl80211_get_ext_capab()
13644 *ext_capa_mask = drv->iface_capa[i].ext_capa_mask; in nl80211_get_ext_capab()
13645 *ext_capa_len = drv->iface_capa[i].ext_capa_len; in nl80211_get_ext_capab()
13658 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_get_mld_capab()
13663 return -1; in nl80211_get_mld_capab()
13671 /* Replace the default value if a per-interface type value exists */ in nl80211_get_mld_capab()
13672 for (i = 0; i < drv->num_iface_capa; i++) { in nl80211_get_mld_capab()
13673 if (nlmode == drv->iface_capa[i].iftype) { in nl80211_get_mld_capab()
13674 *eml_capa = drv->iface_capa[i].eml_capa; in nl80211_get_mld_capab()
13676 drv->iface_capa[i].mld_capa_and_ops; in nl80211_get_mld_capab()
13690 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_update_connection_params()
13692 int ret = -1; in nl80211_update_connection_params()
13700 if (drv->capa.flags & WPA_DRIVER_FLAGS_SME) in nl80211_update_connection_params()
13708 drv->ifindex); in nl80211_update_connection_params()
13710 if ((mask & WPA_DRV_UPDATE_ASSOC_IES) && params->wpa_ie) { in nl80211_update_connection_params()
13711 if (nla_put(msg, NL80211_ATTR_IE, params->wpa_ie_len, in nl80211_update_connection_params()
13712 params->wpa_ie)) in nl80211_update_connection_params()
13714 wpa_hexdump(MSG_DEBUG, " * IEs", params->wpa_ie, in nl80211_update_connection_params()
13715 params->wpa_ie_len); in nl80211_update_connection_params()
13719 type = get_nl_auth_type(params->auth_alg); in nl80211_update_connection_params()
13733 wpa_dbg(drv->ctx, MSG_DEBUG, in nl80211_update_connection_params()
13735 ret, strerror(-ret)); in nl80211_update_connection_params()
13747 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_send_external_auth_status()
13749 int ret = -1; in nl80211_send_external_auth_status()
13756 if ((is_ap_interface(drv->nlmode) && !bss->drv->device_ap_sme) || in nl80211_send_external_auth_status()
13757 (drv->capa.flags & WPA_DRIVER_FLAGS_SME)) in nl80211_send_external_auth_status()
13758 return -1; in nl80211_send_external_auth_status()
13760 wpa_dbg(drv->ctx, MSG_DEBUG, in nl80211_send_external_auth_status()
13761 "nl80211: External auth status: %u", params->status); in nl80211_send_external_auth_status()
13765 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, params->status) || in nl80211_send_external_auth_status()
13766 (params->ssid && params->ssid_len && in nl80211_send_external_auth_status()
13767 nla_put(msg, NL80211_ATTR_SSID, params->ssid_len, params->ssid)) || in nl80211_send_external_auth_status()
13768 (params->pmkid && in nl80211_send_external_auth_status()
13769 nla_put(msg, NL80211_ATTR_PMKID, PMKID_LEN, params->pmkid)) || in nl80211_send_external_auth_status()
13770 (params->bssid && in nl80211_send_external_auth_status()
13771 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid))) in nl80211_send_external_auth_status()
13778 ret, strerror(-ret)); in nl80211_send_external_auth_status()
13791 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_set_4addr_mode()
13793 int ret = -ENOBUFS; in nl80211_set_4addr_mode()
13798 msg = nl80211_cmd_msg(drv->first_bss, 0, NL80211_CMD_SET_INTERFACE); in nl80211_set_4addr_mode()
13802 if (bridge_ifname[0] && bss->added_if_into_bridge && !val) { in nl80211_set_4addr_mode()
13803 if (linux_br_del_if(drv->global->ioctl_sock, in nl80211_set_4addr_mode()
13804 bridge_ifname, bss->ifname)) { in nl80211_set_4addr_mode()
13807 bss->ifname, bridge_ifname); in nl80211_set_4addr_mode()
13808 return -1; in nl80211_set_4addr_mode()
13810 bss->added_if_into_bridge = 0; in nl80211_set_4addr_mode()
13822 i802_check_bridge(drv, bss, bridge_ifname, bss->ifname) < 0) in nl80211_set_4addr_mode()
13823 return -1; in nl80211_set_4addr_mode()
13839 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_dpp_listen()
13843 if (!drv->multicast_registrations || !bss->nl_mgmt) in nl80211_dpp_listen()
13849 handle = (void *) (((intptr_t) bss->nl_mgmt) ^ ELOOP_SOCKET_INVALID); in nl80211_dpp_listen()
13861 struct wpa_driver_nl80211_data *drv = bss->drv; in nl80211_link_add()
13868 if (drv->nlmode != NL80211_IFTYPE_AP) { in nl80211_link_add()
13871 drv->nlmode); in nl80211_link_add()
13872 return -EINVAL; in nl80211_link_add()
13878 return -EINVAL; in nl80211_link_add()
13881 if (bss->valid_links & BIT(link_id)) { in nl80211_link_add()
13884 return -EINVAL; in nl80211_link_add()
13887 if (!bss->valid_links) { in nl80211_link_add()
13889 if (bss->flink->beacon_set) { in nl80211_link_add()
13891 return -EINVAL; in nl80211_link_add()
13900 return -ENOBUFS; in nl80211_link_add()
13906 ret, strerror(-ret)); in nl80211_link_add()
13910 os_memcpy(bss->links[link_id].addr, addr, ETH_ALEN); in nl80211_link_add()
13913 if (!bss->valid_links) in nl80211_link_add()
13914 bss->flink = &bss->links[link_id]; in nl80211_link_add()
13916 bss->valid_links |= BIT(link_id); in nl80211_link_add()
13917 bss->links[link_id].ctx = bss_ctx; in nl80211_link_add()
13920 bss->valid_links, bss->ifname); in nl80211_link_add()
13930 struct wpa_driver_nl80211_data *drv = bss->drv; in wpa_driver_nl80211_link_sta_remove()
13934 if (!(bss->valid_links & BIT(link_id))) in wpa_driver_nl80211_link_sta_remove()
13935 return -ENOLINK; in wpa_driver_nl80211_link_sta_remove()
13941 return -ENOBUFS; in wpa_driver_nl80211_link_sta_remove()
13946 "nl80211: link_sta_remove -> REMOVE_LINK_STA on link_id %u from MLD STA " in wpa_driver_nl80211_link_sta_remove()
13947 MACSTR ", from %s --> %d (%s)", in wpa_driver_nl80211_link_sta_remove()
13948 link_id, MAC2STR(addr), bss->ifname, ret, strerror(-ret)); in wpa_driver_nl80211_link_sta_remove()
13964 if (!bss->nl_mgmt) in testing_nl80211_register_frame()
13965 return -1; in testing_nl80211_register_frame()
13966 handle = (void *) (((intptr_t) bss->nl_mgmt) ^ ELOOP_SOCKET_INVALID); in testing_nl80211_register_frame()
13975 struct wpa_driver_nl80211_data *drv = bss->drv; in testing_nl80211_radio_disable()
13978 * SME-in-wpa_supplicant case where the NL80211_ATTR_LOCAL_STATE_CHANGE in testing_nl80211_radio_disable()
13985 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_SME)) in testing_nl80211_radio_disable()
13986 return -1; in testing_nl80211_radio_disable()
13988 if (!drv->associated) in testing_nl80211_radio_disable()
13991 return wpa_driver_nl80211_mlme(drv, drv->bssid, in testing_nl80211_radio_disable()
13994 drv->first_bss); in testing_nl80211_radio_disable()