Lines Matching +full:mic +full:- +full:pos
3 * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
9 * When used with WE-18 or newer, this interface can be used as-is with number
49 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
53 if (ioctl(drv->ioctl_sock, SIOCSIWAUTH, &iwr) < 0) {
59 ret = errno == EOPNOTSUPP ? -2 : -1;
67 * wpa_driver_wext_get_bssid - Get BSSID, SIOCGIWAP
70 * Returns: 0 on success, -1 on failure
79 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
81 if (ioctl(drv->ioctl_sock, SIOCGIWAP, &iwr) < 0) {
83 ret = -1;
92 * wpa_driver_wext_set_bssid - Set BSSID, SIOCSIWAP
95 * Returns: 0 on success, -1 on failure
104 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
111 if (ioctl(drv->ioctl_sock, SIOCSIWAP, &iwr) < 0) {
113 ret = -1;
121 * wpa_driver_wext_get_ssid - Get SSID, SIOCGIWESSID
124 * Returns: SSID length on success, -1 on failure
133 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
137 if (ioctl(drv->ioctl_sock, SIOCGIWESSID, &iwr) < 0) {
140 ret = -1;
146 * remove it here before further processing. WE-21 changes this
149 if (ret > 0 && ssid[ret - 1] == '\0' &&
150 drv->we_version_compiled < 21)
151 ret--;
159 * wpa_driver_wext_set_ssid - Set SSID, SIOCSIWESSID
163 * Returns: 0 on success, -1 on failure
173 return -1;
176 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
182 if (drv->we_version_compiled < 21) {
188 * length is not incremented here. WE-21 changes this to
196 if (ioctl(drv->ioctl_sock, SIOCSIWESSID, &iwr) < 0) {
199 ret = -1;
207 * wpa_driver_wext_set_freq - Set frequency/channel, SIOCSIWFREQ
210 * Returns: 0 on success, -1 on failure
219 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
223 if (ioctl(drv->ioctl_sock, SIOCSIWFREQ, &iwr) < 0) {
226 ret = -1;
243 if (os_strncmp(custom, "MLME-MICHAELMICFAILURE.indication", 33) == 0) {
300 const struct iw_michaelmicfailure *mic;
303 if (len < sizeof(*mic))
304 return -1;
306 mic = (const struct iw_michaelmicfailure *) ev;
308 wpa_printf(MSG_DEBUG, "Michael MIC failure wireless event: "
309 "flags=0x%x src_addr=" MACSTR, mic->flags,
310 MAC2STR(mic->src_addr.sa_data));
313 data.michael_mic_failure.unicast = !(mic->flags & IW_MICFAILURE_GROUP);
328 return -1;
331 addr = (const u8 *) cand->bssid.sa_data;
334 "flags=0x%x index=%d bssid=" MACSTR, cand->flags,
335 cand->index, MAC2STR(addr));
339 data.pmkid_candidate.index = cand->index;
340 data.pmkid_candidate.preauth = cand->flags & IW_PMKID_CAND_PREAUTH;
341 wpa_supplicant_event(drv->ctx, EVENT_PMKID_CANDIDATE, &data);
351 return -1;
355 os_free(drv->assoc_req_ies);
356 drv->assoc_req_ies = os_memdup(ev, len);
357 if (drv->assoc_req_ies == NULL) {
358 drv->assoc_req_ies_len = 0;
359 return -1;
361 drv->assoc_req_ies_len = len;
371 return -1;
375 os_free(drv->assoc_resp_ies);
376 drv->assoc_resp_ies = os_memdup(ev, len);
377 if (drv->assoc_resp_ies == NULL) {
378 drv->assoc_resp_ies_len = 0;
379 return -1;
381 drv->assoc_resp_ies_len = len;
391 if (drv->assoc_req_ies == NULL && drv->assoc_resp_ies == NULL)
395 if (drv->assoc_req_ies) {
396 data.assoc_info.req_ies = drv->assoc_req_ies;
397 data.assoc_info.req_ies_len = drv->assoc_req_ies_len;
399 if (drv->assoc_resp_ies) {
400 data.assoc_info.resp_ies = drv->assoc_resp_ies;
401 data.assoc_info.resp_ies_len = drv->assoc_resp_ies_len;
404 wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &data);
406 os_free(drv->assoc_req_ies);
407 drv->assoc_req_ies = NULL;
408 os_free(drv->assoc_resp_ies);
409 drv->assoc_resp_ies = NULL;
417 char *pos, *end, *custom, *buf;
419 pos = data;
422 while ((size_t) (end - pos) >= IW_EV_LCP_LEN) {
425 os_memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
427 iwe->cmd, iwe->len);
428 if (iwe->len <= IW_EV_LCP_LEN || iwe->len > end - pos)
431 custom = pos + IW_EV_POINT_LEN;
432 if (drv->we_version_compiled > 18 &&
433 (iwe->cmd == IWEVMICHAELMICFAILURE ||
434 iwe->cmd == IWEVCUSTOM ||
435 iwe->cmd == IWEVASSOCREQIE ||
436 iwe->cmd == IWEVASSOCRESPIE ||
437 iwe->cmd == IWEVPMKIDCAND)) {
438 /* WE-19 removed the pointer from struct iw_point */
440 int dlen = dpos - (char *) &iwe_buf;
441 os_memcpy(dpos, pos + IW_EV_LCP_LEN,
442 sizeof(struct iw_event) - dlen);
444 os_memcpy(&iwe_buf, pos, sizeof(struct iw_event));
448 switch (iwe->cmd) {
452 MAC2STR((u8 *) iwe->u.ap_addr.sa_data));
454 (const u8 *) iwe->u.ap_addr.sa_data) ||
456 iwe->u.ap_addr.sa_data,
459 os_free(drv->assoc_req_ies);
460 drv->assoc_req_ies = NULL;
461 os_free(drv->assoc_resp_ies);
462 drv->assoc_resp_ies = NULL;
463 wpa_supplicant_event(drv->ctx, EVENT_DISASSOC,
468 wpa_supplicant_event(drv->ctx, EVENT_ASSOC,
473 if (iwe->u.data.length > end - custom) {
479 drv->ctx, custom, iwe->u.data.length);
482 if (iwe->u.data.length > end - custom) {
487 buf = dup_binstr(custom, iwe->u.data.length);
490 wpa_driver_wext_event_wireless_custom(drv->ctx, buf);
494 drv->scan_complete_events = 1;
496 drv, drv->ctx);
497 wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS,
501 if (iwe->u.data.length > end - custom) {
507 drv, custom, iwe->u.data.length);
510 if (iwe->u.data.length > end - custom) {
516 drv, custom, iwe->u.data.length);
519 if (iwe->u.data.length > end - custom) {
525 drv, custom, iwe->u.data.length);
529 pos += iwe->len;
541 len = sizeof(event.interface_status.ifname) - 1;
551 if (os_strcmp(drv->ifname, event.interface_status.ifname) == 0) {
553 if (drv->if_removed) {
555 "already set - ignore event");
558 drv->if_removed = 1;
560 if (if_nametoindex(drv->ifname) == 0) {
562 "does not exist - ignore "
564 drv->ifname);
567 if (!drv->if_removed) {
569 "already cleared - ignore event");
572 drv->if_removed = 0;
576 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_STATUS, &event);
591 if (attr->rta_type == IFLA_IFNAME) {
592 if (os_strcmp(((char *) attr) + rta_len, drv->ifname)
608 if (drv->ifindex == ifindex || drv->ifindex2 == ifindex)
611 if (drv->if_removed && wpa_driver_wext_own_ifname(drv, buf, len)) {
612 drv->ifindex = if_nametoindex(drv->ifname);
631 if (!wpa_driver_wext_own_ifindex(drv, ifi->ifi_index, buf, len)) {
633 ifi->ifi_index);
639 drv->operstate, ifi->ifi_flags,
640 (ifi->ifi_flags & IFF_UP) ? "[UP]" : "",
641 (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "",
642 (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",
643 (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : "");
645 if (!drv->if_disabled && !(ifi->ifi_flags & IFF_UP)) {
647 drv->if_disabled = 1;
648 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED, NULL);
651 if (drv->if_disabled && (ifi->ifi_flags & IFF_UP)) {
652 if (if_indextoname(ifi->ifi_index, namebuf) &&
653 linux_iface_up(drv->ioctl_sock, drv->ifname) == 0) {
657 } else if (if_nametoindex(drv->ifname) == 0) {
660 drv->ifname);
661 } else if (drv->if_removed) {
664 "removed", drv->ifname);
667 drv->if_disabled = 0;
668 wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED,
674 * Some drivers send the association event before the operup event--in
679 if (drv->operstate == 1 &&
680 (ifi->ifi_flags & (IFF_LOWER_UP | IFF_DORMANT)) == IFF_LOWER_UP &&
681 !(ifi->ifi_flags & IFF_RUNNING))
682 netlink_send_oper_ifla(drv->netlink, drv->ifindex,
683 -1, IF_OPER_UP);
690 if (attr->rta_type == IFLA_WIRELESS) {
693 attr->rta_len - rta_len);
694 } else if (attr->rta_type == IFLA_IFNAME) {
697 attr->rta_len - rta_len, 0);
716 if (attr->rta_type == IFLA_IFNAME) {
719 attr->rta_len - rta_len, 1);
740 if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1)) {
752 char buf[90], *pos;
755 drv->phyname[0] = '\0';
756 snprintf(buf, sizeof(buf) - 1, "/sys/class/net/%s/phy80211/name",
757 drv->ifname);
765 rv = read(f, drv->phyname, sizeof(drv->phyname) - 1);
773 drv->phyname[rv] = '\0';
774 pos = os_strchr(drv->phyname, '\n');
775 if (pos)
776 *pos = '\0';
778 drv->ifname, drv->phyname);
783 * wpa_driver_wext_init - Initialize WE driver interface
800 drv->ctx = ctx;
801 os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
805 wpa_printf(MSG_DEBUG, "WEXT: cfg80211-based driver detected");
806 drv->cfg80211 = 1;
810 drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
811 if (drv->ioctl_sock < 0) {
820 cfg->ctx = drv;
821 cfg->newlink_cb = wpa_driver_wext_event_rtm_newlink;
822 cfg->dellink_cb = wpa_driver_wext_event_rtm_dellink;
823 drv->netlink = netlink_init(cfg);
824 if (drv->netlink == NULL) {
832 rcfg->ctx = drv;
833 os_strlcpy(rcfg->ifname, ifname, sizeof(rcfg->ifname));
834 rcfg->blocked_cb = wpa_driver_wext_rfkill_blocked;
835 rcfg->unblocked_cb = wpa_driver_wext_rfkill_unblocked;
836 drv->rfkill = rfkill_init(rcfg);
837 if (drv->rfkill == NULL) {
842 drv->mlme_sock = -1;
852 rfkill_deinit(drv->rfkill);
853 netlink_deinit(drv->netlink);
855 close(drv->ioctl_sock);
876 return -1;
879 drv->ifname, ifname);
881 return -1;
885 return -1;
889 type = res ? atoi(res) : -1;
899 return -1;
908 int ret = -1;
910 snprintf(buf, sizeof(buf), "/sys/class/net/%s/device/net", drv->ifname);
913 return -1;
915 while (n--) {
916 if (ret < 0 && wext_hostap_ifname(drv, names[n]->d_name) == 0)
928 char path[200], buf[200], *pos;
933 * events. Since some of the versions included WE-18 support, let's add
944 drv->ifname);
945 res = readlink(path, buf, sizeof(buf) - 1);
948 pos = strrchr(buf, '/');
949 if (pos)
950 pos++;
952 pos = buf;
953 wpa_printf(MSG_DEBUG, "WEXT: Driver: %s", pos);
954 if (os_strncmp(pos, "hostap", 6) == 0 &&
960 if (os_strncmp(drv->ifname, "wlan", 4) == 0) {
962 os_strlcpy(ifname2, drv->ifname, sizeof(ifname2));
974 if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1) < 0) {
975 if (rfkill_is_blocked(drv->rfkill)) {
978 drv->ifname);
979 drv->if_disabled = 1;
983 "interface '%s' UP", drv->ifname);
984 return -1;
1003 drv->capa.key_mgmt_iftype[i] = drv->capa.key_mgmt;
1012 drv->ifindex = if_nametoindex(drv->ifname);
1016 netlink_send_oper_ifla(drv->netlink, drv->ifindex,
1021 drv, drv->ctx);
1029 * wpa_driver_wext_deinit - Deinitialize WE driver interface
1041 eloop_cancel_timeout(wpa_driver_wext_scan_timeout, drv, drv->ctx);
1042 eloop_cancel_timeout(wpa_driver_wext_send_rfkill, drv, drv->ctx);
1050 netlink_send_oper_ifla(drv->netlink, drv->ifindex, 0, IF_OPER_UP);
1051 netlink_deinit(drv->netlink);
1052 rfkill_deinit(drv->rfkill);
1054 if (drv->mlme_sock >= 0)
1055 eloop_unregister_read_sock(drv->mlme_sock);
1057 (void) linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 0);
1059 close(drv->ioctl_sock);
1060 if (drv->mlme_sock >= 0)
1061 close(drv->mlme_sock);
1062 os_free(drv->assoc_req_ies);
1063 os_free(drv->assoc_resp_ies);
1069 * wpa_driver_wext_scan_timeout - Scan timeout to report scan completion
1078 wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
1084 * wpa_driver_wext_scan - Request the driver to initiate scan
1087 * Returns: 0 on success, -1 on failure
1095 const u8 *ssid = params->ssids[0].ssid;
1096 size_t ssid_len = params->ssids[0].ssid_len;
1101 return -1;
1105 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1118 if (ioctl(drv->ioctl_sock, SIOCSIWSCAN, &iwr) < 0) {
1121 ret = -1;
1127 if (drv->scan_complete_events) {
1135 wpa_printf(MSG_DEBUG, "Scan requested (ret=%d) - scan timeout %d "
1137 eloop_cancel_timeout(wpa_driver_wext_scan_timeout, drv, drv->ctx);
1139 drv->ctx);
1158 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1162 if (ioctl(drv->ioctl_sock, SIOCGIWSCAN, &iwr) == 0)
1170 res_buf_len = 65535; /* 16-bit length field */
1171 wpa_printf(MSG_DEBUG, "Scan results did not fit - "
1209 if (iwe->u.mode == IW_MODE_ADHOC)
1210 res->res.caps |= IEEE80211_CAP_IBSS;
1211 else if (iwe->u.mode == IW_MODE_MASTER || iwe->u.mode == IW_MODE_INFRA)
1212 res->res.caps |= IEEE80211_CAP_ESS;
1220 int ssid_len = iwe->u.essid.length;
1221 if (ssid_len > end - custom)
1223 if (iwe->u.essid.flags &&
1226 os_memcpy(res->ssid, custom, ssid_len);
1227 res->ssid_len = ssid_len;
1237 if (iwe->u.freq.e == 0) {
1243 * since the driver may be sending an A-band channel that we
1247 if (res->res.freq)
1250 if (iwe->u.freq.m >= 1 && iwe->u.freq.m <= 13) {
1251 res->res.freq = 2407 + 5 * iwe->u.freq.m;
1253 } else if (iwe->u.freq.m == 14) {
1254 res->res.freq = 2484;
1259 if (iwe->u.freq.e > 6) {
1262 MAC2STR(res->res.bssid), iwe->u.freq.m,
1263 iwe->u.freq.e);
1267 for (i = 0; i < iwe->u.freq.e; i++)
1269 res->res.freq = iwe->u.freq.m / divi;
1277 res->res.qual = iwe->u.qual.qual;
1278 res->res.noise = iwe->u.qual.noise;
1279 res->res.level = iwe->u.qual.level;
1280 if (iwe->u.qual.updated & IW_QUAL_QUAL_INVALID)
1281 res->res.flags |= WPA_SCAN_QUAL_INVALID;
1282 if (iwe->u.qual.updated & IW_QUAL_LEVEL_INVALID)
1283 res->res.flags |= WPA_SCAN_LEVEL_INVALID;
1284 if (iwe->u.qual.updated & IW_QUAL_NOISE_INVALID)
1285 res->res.flags |= WPA_SCAN_NOISE_INVALID;
1286 if (iwe->u.qual.updated & IW_QUAL_DBM)
1287 res->res.flags |= WPA_SCAN_LEVEL_DBM;
1288 if ((iwe->u.qual.updated & IW_QUAL_DBM) ||
1289 ((iwe->u.qual.level != 0) &&
1290 (iwe->u.qual.level > drv->max_level))) {
1291 if (iwe->u.qual.level >= 64)
1292 res->res.level -= 0x100;
1293 if (iwe->u.qual.noise >= 64)
1294 res->res.noise -= 0x100;
1302 if (!(iwe->u.data.flags & IW_ENCODE_DISABLED))
1303 res->res.caps |= IEEE80211_CAP_PRIVACY;
1308 struct wext_scan_data *res, char *pos,
1312 char *custom = pos + IW_EV_LCP_LEN;
1316 clen = iwe->len;
1317 if (clen > (size_t) (end - custom))
1325 clen -= sizeof(struct iw_param);
1329 /* Convert the maxrate from WE-style (b/s units) to
1332 res->maxrate = maxrate / 500000;
1343 if (iwe->u.data.length == 0)
1347 gend = genie + iwe->u.data.length;
1353 tmp = os_realloc(res->ie, res->ie_len + gend - gpos);
1356 os_memcpy(tmp + res->ie_len, gpos, gend - gpos);
1357 res->ie = tmp;
1358 res->ie_len += gend - gpos;
1369 clen = iwe->u.data.length;
1370 if (clen > (size_t) (end - custom))
1377 bytes = custom + clen - spos;
1381 tmp = os_realloc(res->ie, res->ie_len + bytes);
1384 res->ie = tmp;
1385 if (hexstr2bin(spos, tmp + res->ie_len, bytes) < 0)
1387 res->ie_len += bytes;
1392 bytes = custom + clen - spos;
1396 tmp = os_realloc(res->ie, res->ie_len + bytes);
1399 res->ie = tmp;
1400 if (hexstr2bin(spos, tmp + res->ie_len, bytes) < 0)
1402 res->ie_len += bytes;
1408 bytes = custom + clen - spos;
1418 res->res.tsf += WPA_GET_BE64(bin);
1425 return drv->we_version_compiled > 18 &&
1437 u8 *pos, *end, *ssid_ie = NULL, *rate_ie = NULL;
1440 pos = data->ie;
1441 end = pos + data->ie_len;
1442 while (pos && end - pos > 1) {
1443 if (2 + pos[1] > end - pos)
1445 if (pos[0] == WLAN_EID_SSID)
1446 ssid_ie = pos;
1447 else if (pos[0] == WLAN_EID_SUPP_RATES)
1448 rate_ie = pos;
1449 else if (pos[0] == WLAN_EID_EXT_SUPP_RATES)
1450 rate_ie = pos;
1451 pos += 2 + pos[1];
1456 extra_len += 2 + data->ssid_len;
1457 if (rate_ie == NULL && data->maxrate)
1460 r = os_zalloc(sizeof(*r) + extra_len + data->ie_len);
1463 os_memcpy(r, &data->res, sizeof(*r));
1464 r->ie_len = extra_len + data->ie_len;
1465 pos = (u8 *) (r + 1);
1471 *pos++ = WLAN_EID_SSID;
1472 *pos++ = data->ssid_len;
1473 os_memcpy(pos, data->ssid, data->ssid_len);
1474 pos += data->ssid_len;
1476 if (rate_ie == NULL && data->maxrate) {
1481 *pos++ = WLAN_EID_SUPP_RATES;
1482 *pos++ = 1;
1483 *pos++ = data->maxrate;
1485 if (data->ie)
1486 os_memcpy(pos, data->ie, data->ie_len);
1488 tmp = os_realloc_array(res->res, res->num + 1,
1494 tmp[res->num++] = r;
1495 res->res = tmp;
1500 * wpa_driver_wext_get_scan_results - Fetch the latest scan results
1502 * Returns: Scan results on success, -1 on failure
1511 char *pos, *end, *custom;
1527 pos = (char *) res_buf;
1531 while ((size_t) (end - pos) >= IW_EV_LCP_LEN) {
1534 os_memcpy(&iwe_buf, pos, IW_EV_LCP_LEN);
1535 if (iwe->len <= IW_EV_LCP_LEN || iwe->len > end - pos)
1538 custom = pos + IW_EV_POINT_LEN;
1539 if (wext_19_iw_point(drv, iwe->cmd)) {
1540 /* WE-19 removed the pointer from struct iw_point */
1542 int dlen = dpos - (char *) &iwe_buf;
1543 os_memcpy(dpos, pos + IW_EV_LCP_LEN,
1544 sizeof(struct iw_event) - dlen);
1546 os_memcpy(&iwe_buf, pos, sizeof(struct iw_event));
1550 switch (iwe->cmd) {
1558 iwe->u.ap_addr.sa_data, ETH_ALEN);
1576 wext_get_scan_rate(iwe, &data, pos, end);
1586 pos += iwe->len;
1595 (unsigned long) len, (unsigned long) res->num);
1616 return -1;
1619 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1623 minlen = ((char *) &range->enc_capa) - (char *) range +
1624 sizeof(range->enc_capa);
1626 if (ioctl(drv->ioctl_sock, SIOCGIWRANGE, &iwr) < 0) {
1630 return -1;
1632 range->we_version_compiled >= 18) {
1635 range->we_version_compiled,
1636 range->we_version_source,
1637 range->enc_capa);
1638 drv->has_capability = 1;
1639 drv->we_version_compiled = range->we_version_compiled;
1640 if (range->enc_capa & IW_ENC_CAPA_WPA) {
1641 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA |
1644 if (range->enc_capa & IW_ENC_CAPA_WPA2) {
1645 drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
1648 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 |
1650 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP128;
1651 if (range->enc_capa & IW_ENC_CAPA_CIPHER_TKIP)
1652 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP;
1653 if (range->enc_capa & IW_ENC_CAPA_CIPHER_CCMP)
1654 drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP;
1655 if (range->enc_capa & IW_ENC_CAPA_4WAY_HANDSHAKE)
1656 drv->capa.flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK |
1658 drv->capa.auth = WPA_DRIVER_AUTH_OPEN |
1661 drv->capa.max_scan_ssids = 1;
1665 drv->capa.key_mgmt, drv->capa.enc,
1666 (unsigned long long) drv->capa.flags);
1668 wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: too old (short) data - "
1672 drv->max_level = range->max_qual.level;
1688 if (!(drv->capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X))
1695 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1699 return -1;
1703 ext->key_len = PMK_LEN;
1704 os_memcpy(&ext->key, psk, ext->key_len);
1705 ext->alg = IW_ENCODE_ALG_PMK;
1707 ret = ioctl(drv->ioctl_sock, SIOCSIWENCODEEXT, &iwr);
1732 return -1;
1737 return -1;
1739 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1748 ext->ext_flags |= IW_ENCODE_EXT_GROUP_KEY;
1750 ext->ext_flags |= IW_ENCODE_EXT_SET_TX_KEY;
1752 ext->addr.sa_family = ARPHRD_ETHER;
1754 os_memcpy(ext->addr.sa_data, addr, ETH_ALEN);
1756 os_memset(ext->addr.sa_data, 0xff, ETH_ALEN);
1759 ext->key_len = key_len;
1762 ext->alg = IW_ENCODE_ALG_PMK;
1766 ext->alg = IW_ENCODE_ALG_NONE;
1769 ext->alg = IW_ENCODE_ALG_WEP;
1772 ext->alg = IW_ENCODE_ALG_TKIP;
1775 ext->alg = IW_ENCODE_ALG_CCMP;
1778 ext->alg = IW_ENCODE_ALG_AES_CMAC;
1784 return -1;
1789 ext->ext_flags |= IW_ENCODE_EXT_RX_SEQ_VALID;
1790 os_memcpy(ext->rx_seq, seq, seq_len);
1793 if (ioctl(drv->ioctl_sock, SIOCSIWENCODEEXT, &iwr) < 0) {
1794 ret = errno == EOPNOTSUPP ? -2 : -1;
1799 ret = -2;
1812 * wpa_driver_wext_set_key - Configure encryption key
1815 * Returns: 0 on success, -1 on failure
1826 enum wpa_alg alg = params->alg;
1827 enum key_flag key_flag = params->key_flag;
1828 const u8 *addr = params->addr;
1829 int key_idx = params->key_idx;
1830 int set_tx = params->set_tx;
1831 const u8 *seq = params->seq;
1832 size_t seq_len = params->seq_len;
1833 const u8 *key = params->key;
1834 size_t key_len = params->key_len;
1846 if (ret == -2 &&
1858 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1866 if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {
1869 ret = -1;
1874 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1879 if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {
1883 ret = -1;
1907 drv->use_crypt = enabled;
1921 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1930 if (ioctl(drv->ioctl_sock, SIOCSIWMLME, &iwr) < 0) {
1933 ret = -1;
1948 * Only force-disconnect when the card is in infrastructure mode,
1950 * SSID as an attempt to create a new ad-hoc network.
1953 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
1954 if (ioctl(drv->ioctl_sock, SIOCGIWMODE, &iwr) < 0) {
1967 if (drv->cfg80211) {
2016 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
2020 if (ioctl(drv->ioctl_sock, SIOCSIWGENIE, &iwr) < 0) {
2023 ret = -1;
2074 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
2089 if (!drv->use_crypt) {
2092 if (params->auth_alg & WPA_AUTH_ALG_OPEN)
2094 if (params->auth_alg & WPA_AUTH_ALG_SHARED)
2098 if (ioctl(drv->ioctl_sock, SIOCSIWENCODE, &iwr) < 0) {
2101 ret = -1;
2118 if (drv->cfg80211) {
2130 if (wpa_driver_wext_set_drop_unencrypted(drv, params->drop_unencrypted)
2132 ret = -1;
2133 if (wpa_driver_wext_set_auth_alg(drv, params->auth_alg) < 0)
2134 ret = -1;
2135 if (wpa_driver_wext_set_mode(drv, params->mode) < 0)
2136 ret = -1;
2142 if (drv->auth_alg_fallback &&
2144 ret = -1;
2146 if (!params->bssid &&
2148 ret = -1;
2153 if (wpa_driver_wext_set_gen_ie(drv, params->wpa_ie, params->wpa_ie_len)
2155 ret = -1;
2156 if (params->wpa_proto & WPA_PROTO_RSN)
2158 else if (params->wpa_proto & WPA_PROTO_WPA)
2164 ret = -1;
2165 value = wpa_driver_wext_cipher2wext(params->pairwise_suite);
2168 ret = -1;
2169 value = wpa_driver_wext_cipher2wext(params->group_suite);
2172 ret = -1;
2173 value = wpa_driver_wext_keymgmt2wext(params->key_mgmt_suite);
2176 ret = -1;
2177 value = params->key_mgmt_suite != WPA_KEY_MGMT_NONE ||
2178 params->pairwise_suite != WPA_CIPHER_NONE ||
2179 params->group_suite != WPA_CIPHER_NONE ||
2180 (params->wpa_proto & (WPA_PROTO_RSN | WPA_PROTO_WPA));
2183 ret = -1;
2188 if (params->key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
2189 params->key_mgmt_suite == WPA_KEY_MGMT_PSK)
2194 if (wpa_driver_wext_set_psk(drv, params->psk) < 0)
2195 ret = -1;
2199 ret = -1;
2200 switch (params->mgmt_frame_protection) {
2212 ret = -1;
2213 if (params->freq.freq &&
2214 wpa_driver_wext_set_freq(drv, params->freq.freq) < 0)
2215 ret = -1;
2216 if (!drv->cfg80211 &&
2217 wpa_driver_wext_set_ssid(drv, params->ssid, params->ssid_len) < 0)
2218 ret = -1;
2219 if (params->bssid &&
2220 wpa_driver_wext_set_bssid(drv, params->bssid) < 0)
2221 ret = -1;
2222 if (drv->cfg80211 &&
2223 wpa_driver_wext_set_ssid(drv, params->ssid, params->ssid_len) < 0)
2224 ret = -1;
2248 drv->auth_alg_fallback = res == -2;
2254 * wpa_driver_wext_set_mode - Set wireless mode (infra/adhoc), SIOCSIWMODE
2257 * Returns: 0 on success, -1 on failure
2263 int ret = -1;
2267 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
2269 if (ioctl(drv->ioctl_sock, SIOCSIWMODE, &iwr) == 0) {
2284 if (ioctl(drv->ioctl_sock, SIOCGIWMODE, &iwr) < 0) {
2295 if (linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 0) == 0) {
2298 if (ioctl(drv->ioctl_sock, SIOCSIWMODE, &iwr) < 0)
2304 (void) linux_set_iface_flags(drv->ioctl_sock, drv->ifname, 1);
2320 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
2331 if (ioctl(drv->ioctl_sock, SIOCSIWPMKSA, &iwr) < 0) {
2335 ret = -1;
2346 return wpa_driver_wext_pmksa(drv, IW_PMKSA_ADD, params->bssid,
2347 params->pmkid);
2355 return wpa_driver_wext_pmksa(drv, IW_PMKSA_REMOVE, params->bssid,
2356 params->pmkid);
2370 if (!drv->has_capability)
2371 return -1;
2372 os_memcpy(capa, &drv->capa, sizeof(*capa));
2381 drv->ifindex2 = -1;
2385 drv->ifindex2 = if_nametoindex(ifname);
2386 if (drv->ifindex2 <= 0)
2387 return -1;
2390 "wireless events", drv->ifindex2, ifname);
2400 wpa_printf(MSG_DEBUG, "%s: operstate %d->%d (%s)",
2401 __func__, drv->operstate, state, state ? "UP" : "DORMANT");
2402 drv->operstate = state;
2403 return netlink_send_oper_ifla(drv->netlink, drv->ifindex, -1,
2410 return drv->we_version_compiled;
2417 return drv->phyname;
2428 si->data.signal = -WPA_INVALID_NOISE;
2429 si->current_noise = WPA_INVALID_NOISE;
2430 si->chanwidth = CHAN_WIDTH_UNKNOWN;
2433 os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
2438 if (ioctl(drv->ioctl_sock, SIOCGIWSTATS, &iwr) < 0) {
2441 return -1;
2444 si->data.signal = stats.qual.level -
2446 si->current_noise = stats.qual.noise -
2456 char *pos, *end;
2459 pos = buf;
2462 if (linux_get_ifhwaddr(drv->ioctl_sock, drv->ifname, addr))
2463 return -1;
2465 res = os_snprintf(pos, end - pos,
2469 drv->ifindex,
2470 drv->ifname,
2472 if (os_snprintf_error(end - pos, res))
2473 return pos - buf;
2474 pos += res;
2476 return pos - buf;