Lines Matching refs:vap

73 ieee80211_ioctl_getkey(struct ieee80211vap *vap, struct ieee80211req *ireq)
75 struct ieee80211com *ic = vap->iv_ic;
90 ni = ieee80211_find_vap_node(&ic->ic_sta, vap, ik.ik_macaddr);
97 wk = &vap->iv_nw_keys[kid];
98 IEEE80211_ADDR_COPY(&ik.ik_macaddr, vap->iv_bss->ni_macaddr);
105 if (wk->wk_keyix == vap->iv_def_txkey)
129 ieee80211_ioctl_getchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
131 struct ieee80211com *ic = vap->iv_ic;
139 ieee80211_ioctl_getchaninfo(struct ieee80211vap *vap, struct ieee80211req *ireq)
141 struct ieee80211com *ic = vap->iv_ic;
153 ieee80211_ioctl_getwpaie(struct ieee80211vap *vap,
169 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, wpaie->wpa_macaddr);
209 ieee80211_ioctl_getstastats(struct ieee80211vap *vap, struct ieee80211req *ireq)
221 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, macaddr);
314 ieee80211_ioctl_getscanresults(struct ieee80211vap *vap,
325 ieee80211_scan_iterate(vap, get_scan_space, &req);
339 ieee80211_scan_iterate(vap, get_scan_result, &req);
350 struct ieee80211vap *vap;
369 if (req->vap != ni->ni_vap)
381 struct ieee80211vap *vap = ni->ni_vap;
386 if (req->vap != ni->ni_vap)
388 if (vap->iv_opmode == IEEE80211_M_HOSTAP &&
404 vap->iv_ic->ic_node_getsignal(ni, &si->isi_rssi, &si->isi_noise);
405 vap->iv_ic->ic_node_getmimoinfo(ni, &si->isi_mimo);
442 si->isi_inact = vap->iv_inact_run;
444 (vap->iv_opmode == IEEE80211_M_WDS &&
445 (vap->iv_flags_ext & IEEE80211_FEXT_WDSLEGACY)))
446 si->isi_inact = vap->iv_inact_auth;
448 si->isi_inact = vap->iv_inact_init;
464 getstainfo_common(struct ieee80211vap *vap, struct ieee80211req *ireq,
467 struct ieee80211com *ic = vap->iv_ic;
475 req.vap = vap;
508 ieee80211_ioctl_getstainfo(struct ieee80211vap *vap, struct ieee80211req *ireq)
520 if (IEEE80211_ADDR_EQ(macaddr, vap->iv_ifp->if_broadcastaddr)) {
523 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, macaddr);
527 return getstainfo_common(vap, ireq, ni, off);
531 ieee80211_ioctl_getstatxpow(struct ieee80211vap *vap, struct ieee80211req *ireq)
542 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, txpow.it_macaddr);
552 ieee80211_ioctl_getwmeparam(struct ieee80211vap *vap, struct ieee80211req *ireq)
554 struct ieee80211com *ic = vap->iv_ic;
595 ieee80211_ioctl_getmaccmd(struct ieee80211vap *vap, struct ieee80211req *ireq)
597 const struct ieee80211_aclator *acl = vap->iv_acl;
599 return (acl == NULL ? EINVAL : acl->iac_getioctl(vap, ireq));
603 ieee80211_ioctl_getcurchan(struct ieee80211vap *vap, struct ieee80211req *ireq)
605 struct ieee80211com *ic = vap->iv_ic;
611 * vap's may have different operating channels when HT is
612 * in use. When in RUN state report the vap-specific channel.
615 if (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP)
616 c = vap->iv_bss->ni_chan;
634 ieee80211_ioctl_getappie(struct ieee80211vap *vap, struct ieee80211req *ireq)
644 return getappie(vap->iv_appie_beacon, ireq);
646 return getappie(vap->iv_appie_proberesp, ireq);
648 return getappie(vap->iv_appie_assocresp, ireq);
650 return getappie(vap->iv_appie_probereq, ireq);
652 return getappie(vap->iv_appie_assocreq, ireq);
654 return getappie(vap->iv_appie_wpa, ireq);
660 ieee80211_ioctl_getregdomain(struct ieee80211vap *vap,
663 struct ieee80211com *ic = vap->iv_ic;
672 ieee80211_ioctl_getroam(struct ieee80211vap *vap,
677 if (len > sizeof(vap->iv_roamparms))
678 len = sizeof(vap->iv_roamparms);
679 return copyout(vap->iv_roamparms, ireq->i_data, len);
683 ieee80211_ioctl_gettxparams(struct ieee80211vap *vap,
688 if (len > sizeof(vap->iv_txparms))
689 len = sizeof(vap->iv_txparms);
690 return copyout(vap->iv_txparms, ireq->i_data, len);
728 ieee80211_ioctl_getstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
740 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
745 ni = ieee80211_ref_node(vap->iv_bss);
756 dummy_ioctl_get(struct ieee80211vap *vap, struct ieee80211req *ireq)
763 ieee80211_ioctl_getdefault(struct ieee80211vap *vap, struct ieee80211req *ireq)
769 error = (*get)(vap, ireq);
777 ieee80211_ioctl_get80211(struct ieee80211vap *vap, u_long cmd,
781 struct ieee80211com *ic = vap->iv_ic;
789 switch (vap->iv_state) {
792 ireq->i_len = vap->iv_des_ssid[0].len;
793 memcpy(tmpssid, vap->iv_des_ssid[0].ssid, ireq->i_len);
796 ireq->i_len = vap->iv_bss->ni_esslen;
797 memcpy(tmpssid, vap->iv_bss->ni_essid, ireq->i_len);
806 if ((vap->iv_flags & IEEE80211_F_PRIVACY) == 0)
808 else if (vap->iv_flags & IEEE80211_F_DROPUNENC)
817 len = (u_int) vap->iv_nw_keys[kid].wk_keylen;
820 bcopy(vap->iv_nw_keys[kid].wk_key, tmpkey, len);
831 ireq->i_val = vap->iv_def_txkey;
834 if (vap->iv_flags & IEEE80211_F_WPA)
837 ireq->i_val = vap->iv_bss->ni_authmode;
843 if (vap->iv_flags & IEEE80211_F_PMGTON)
852 ireq->i_val = vap->iv_rtsthreshold;
870 switch (vap->iv_flags & IEEE80211_F_WPA) {
886 error = ieee80211_ioctl_getchanlist(vap, ireq);
889 ireq->i_val = vap->iv_roaming;
892 ireq->i_val = (vap->iv_flags & IEEE80211_F_PRIVACY) != 0;
895 ireq->i_val = (vap->iv_flags & IEEE80211_F_DROPUNENC) != 0;
898 ireq->i_val = (vap->iv_flags & IEEE80211_F_COUNTERM) != 0;
901 ireq->i_val = (vap->iv_flags & IEEE80211_F_WME) != 0;
904 ireq->i_val = (vap->iv_flags & IEEE80211_F_HIDESSID) != 0;
907 ireq->i_val = (vap->iv_flags & IEEE80211_F_NOBRIDGE) == 0;
910 error = ieee80211_ioctl_getkey(vap, ireq);
913 error = ieee80211_ioctl_getchaninfo(vap, ireq);
918 if (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP) {
919 error = copyout(vap->iv_opmode == IEEE80211_M_WDS ?
920 vap->iv_bss->ni_macaddr : vap->iv_bss->ni_bssid,
923 error = copyout(vap->iv_des_bssid, ireq->i_data,
928 error = ieee80211_ioctl_getwpaie(vap, ireq, ireq->i_type);
931 error = ieee80211_ioctl_getscanresults(vap, ireq);
934 error = ieee80211_ioctl_getstastats(vap, ireq);
937 ireq->i_val = vap->iv_bss->ni_txpower;
940 error = ieee80211_ioctl_getstatxpow(vap, ireq);
943 error = ieee80211_ioctl_getstainfo(vap, ireq);
951 error = ieee80211_ioctl_getwmeparam(vap, ireq);
954 ireq->i_val = vap->iv_dtim_period;
958 ireq->i_val = vap->iv_bss->ni_intval;
961 ireq->i_val = (vap->iv_flags & IEEE80211_F_PUREG) != 0;
964 ireq->i_val = vap->iv_quiet;
967 ireq->i_val = vap->iv_quiet_count;
970 ireq->i_val = vap->iv_quiet_period;
973 ireq->i_val = vap->iv_quiet_duration;
976 ireq->i_val = vap->iv_quiet_offset;
979 ireq->i_val = (vap->iv_flags & IEEE80211_F_BGSCAN) != 0;
982 ireq->i_val = vap->iv_bgscanidle*hz/1000; /* ms */
985 ireq->i_val = vap->iv_bgscanintvl/hz; /* seconds */
988 ireq->i_val = vap->iv_scanvalid/hz; /* seconds */
991 ireq->i_val = vap->iv_fragthreshold;
994 error = ieee80211_ioctl_getmaccmd(vap, ireq);
997 ireq->i_val = (vap->iv_flags & IEEE80211_F_BURST) != 0;
1000 ireq->i_val = vap->iv_bmissthreshold;
1003 error = ieee80211_ioctl_getcurchan(vap, ireq);
1007 if (vap->iv_flags_ht & IEEE80211_FHT_SHORTGI20)
1009 if (vap->iv_flags_ht & IEEE80211_FHT_SHORTGI40)
1014 if (vap->iv_flags_ht & IEEE80211_FHT_AMPDU_TX)
1016 if (vap->iv_flags_ht & IEEE80211_FHT_AMPDU_RX)
1020 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
1021 ireq->i_val = vap->iv_ampdu_rxmax;
1022 else if (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP)
1027 ireq->i_val = MS(vap->iv_bss->ni_htparam,
1030 ireq->i_val = vap->iv_ampdu_limit;
1033 if (vap->iv_opmode == IEEE80211_M_STA &&
1034 (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP))
1039 ireq->i_val = MS(vap->iv_bss->ni_htparam,
1042 ireq->i_val = vap->iv_ampdu_density;
1046 if (vap->iv_flags_ht & IEEE80211_FHT_AMSDU_TX)
1048 if (vap->iv_flags_ht & IEEE80211_FHT_AMSDU_RX)
1052 ireq->i_val = vap->iv_amsdu_limit; /* XXX truncation? */
1055 ireq->i_val = (vap->iv_flags_ht & IEEE80211_FHT_PUREN) != 0;
1058 ireq->i_val = (vap->iv_flags & IEEE80211_F_DOTH) != 0;
1061 error = ieee80211_ioctl_getregdomain(vap, ireq);
1064 error = ieee80211_ioctl_getroam(vap, ireq);
1067 error = ieee80211_ioctl_gettxparams(vap, ireq);
1070 ireq->i_val = (vap->iv_flags_ht & IEEE80211_FHT_HTCOMPAT) != 0;
1073 ireq->i_val = (vap->iv_flags & IEEE80211_F_DWDS) != 0;
1076 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_INACT) != 0;
1079 error = ieee80211_ioctl_getappie(vap, ireq);
1082 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_WPS) != 0;
1085 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_TSN) != 0;
1088 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_DFS) != 0;
1091 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_DOTD) != 0;
1100 if (vap->iv_flags_ht & IEEE80211_FHT_HT) {
1102 if (vap->iv_flags_ht & IEEE80211_FHT_USEHT40)
1108 error = ieee80211_ioctl_getstavlan(vap, ireq);
1111 if (vap->iv_opmode == IEEE80211_M_STA &&
1112 (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP)) {
1113 if (vap->iv_bss->ni_flags & IEEE80211_NODE_MIMO_RTS)
1115 else if (vap->iv_bss->ni_flags & IEEE80211_NODE_MIMO_PS)
1120 ireq->i_val = vap->iv_htcaps & IEEE80211_HTCAP_SMPS;
1123 if (vap->iv_opmode == IEEE80211_M_STA &&
1124 (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP))
1126 (vap->iv_bss->ni_flags & IEEE80211_NODE_RIFS) != 0;
1129 (vap->iv_flags_ht & IEEE80211_FHT_RIFS) != 0;
1133 if (vap->iv_flags_ht & IEEE80211_FHT_STBC_TX)
1135 if (vap->iv_flags_ht & IEEE80211_FHT_STBC_RX)
1139 error = ieee80211_ioctl_getdefault(vap, ireq);
1147 ieee80211_ioctl_setkey(struct ieee80211vap *vap, struct ieee80211req *ireq)
1169 if (vap->iv_opmode == IEEE80211_M_STA) {
1170 ni = ieee80211_ref_node(vap->iv_bss);
1176 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
1185 wk = &vap->iv_nw_keys[kid];
1195 ieee80211_key_update_begin(vap);
1196 if (ieee80211_crypto_newkey(vap, ik.ik_type, ik.ik_flags, wk)) {
1208 if (!ieee80211_crypto_setkey(vap, wk))
1211 vap->iv_def_txkey = kid;
1214 ieee80211_key_update_end(vap);
1221 ieee80211_ioctl_delkey(struct ieee80211vap *vap, struct ieee80211req *ireq)
1236 if (vap->iv_opmode == IEEE80211_M_STA) {
1237 ni = ieee80211_ref_node(vap->iv_bss);
1243 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
1255 ieee80211_crypto_delkey(vap, &vap->iv_nw_keys[kid]);
1261 struct ieee80211vap *vap;
1267 mlmedebug(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN],
1289 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_IOCTL |
1295 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_ANY, mac,
1299 IEEE80211_NOTE_MAC(vap, ops[op].mask, mac,
1302 IEEE80211_NOTE_MAC(vap, ops[op].mask, mac,
1313 struct ieee80211vap *vap = ni->ni_vap;
1315 if (vap != mop->vap)
1324 mlmedebug(vap, ni->ni_macaddr, mop->op, mop->reason);
1336 setmlme_dropsta(struct ieee80211vap *vap,
1339 struct ieee80211_node_table *nt = &vap->iv_ic->ic_sta;
1344 if (!IEEE80211_ADDR_EQ(mac, vap->iv_ifp->if_broadcastaddr)) {
1365 setmlme_common(struct ieee80211vap *vap, int op,
1368 struct ieee80211com *ic = vap->iv_ic;
1378 switch (vap->iv_opmode) {
1380 mlmedebug(vap, vap->iv_bss->ni_macaddr, op, reason);
1382 ieee80211_new_state(vap, IEEE80211_S_INIT, reason);
1385 mlmeop.vap = vap;
1388 error = setmlme_dropsta(vap, mac, &mlmeop);
1398 if (!IEEE80211_ADDR_EQ(mac, vap->iv_bss->ni_macaddr)) {
1403 mlmedebug(vap, vap->iv_bss->ni_macaddr, op, reason);
1404 ni = ieee80211_ref_node(vap->iv_bss);
1432 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
1433 vap->iv_opmode != IEEE80211_M_WDS) {
1438 ni = ieee80211_find_vap_node_locked(nt, vap, mac);
1446 mlmedebug(vap, mac, op, reason);
1456 if (vap->iv_opmode != IEEE80211_M_HOSTAP) {
1461 ni = ieee80211_find_vap_node_locked(nt, vap, mac);
1469 mlmedebug(vap, mac, op, reason);
1483 vap->iv_stats.is_rx_acl++;
1526 setmlme_assoc_sta(struct ieee80211vap *vap,
1532 KASSERT(vap->iv_opmode == IEEE80211_M_STA,
1534 ieee80211_opmode_name[vap->iv_opmode]));
1541 ieee80211_scan_iterate(vap, mlmelookup, &lookup);
1544 mlmedebug(vap, mac, IEEE80211_MLME_ASSOC, 0);
1545 if (!ieee80211_sta_join(vap, lookup.se->se_chan, lookup.se))
1551 setmlme_assoc_adhoc(struct ieee80211vap *vap,
1558 KASSERT(vap->iv_opmode == IEEE80211_M_IBSS ||
1559 vap->iv_opmode == IEEE80211_M_AHDEMO,
1561 ieee80211_opmode_name[vap->iv_opmode]));
1572 memset(vap->iv_des_ssid[0].ssid, 0, IEEE80211_NWID_LEN);
1573 vap->iv_des_ssid[0].len = ssid_len;
1574 memcpy(vap->iv_des_ssid[0].ssid, ssid, ssid_len);
1575 vap->iv_des_nssid = 1;
1583 error = ieee80211_scanreq(vap, sr);
1590 ieee80211_ioctl_setmlme(struct ieee80211vap *vap, struct ieee80211req *ireq)
1600 if (vap->iv_opmode == IEEE80211_M_STA &&
1602 return setmlme_assoc_sta(vap, mlme.im_macaddr,
1603 vap->iv_des_ssid[0].len, vap->iv_des_ssid[0].ssid);
1604 else if ((vap->iv_opmode == IEEE80211_M_IBSS ||
1605 vap->iv_opmode == IEEE80211_M_AHDEMO) &&
1607 return setmlme_assoc_adhoc(vap, mlme.im_macaddr,
1610 return setmlme_common(vap, mlme.im_op,
1615 ieee80211_ioctl_macmac(struct ieee80211vap *vap, struct ieee80211req *ireq)
1618 const struct ieee80211_aclator *acl = vap->iv_acl;
1628 if (acl == NULL || !acl->iac_attach(vap))
1630 vap->iv_acl = acl;
1633 acl->iac_add(vap, mac);
1635 acl->iac_remove(vap, mac);
1640 ieee80211_ioctl_setmaccmd(struct ieee80211vap *vap, struct ieee80211req *ireq)
1642 const struct ieee80211_aclator *acl = vap->iv_acl;
1651 if (acl == NULL || !acl->iac_attach(vap))
1653 vap->iv_acl = acl;
1655 acl->iac_setpolicy(vap, ireq->i_val);
1659 acl->iac_flush(vap);
1664 vap->iv_acl = NULL;
1665 acl->iac_detach(vap);
1672 return acl->iac_setioctl(vap, ireq);
1678 ieee80211_ioctl_setchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
1680 struct ieee80211com *ic = vap->iv_ic;
1718 ieee80211_scan_flush(vap);
1724 ieee80211_ioctl_setstastats(struct ieee80211vap *vap, struct ieee80211req *ireq)
1740 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, macaddr);
1743 /* XXX require ni_vap == vap? */
1750 ieee80211_ioctl_setstatxpow(struct ieee80211vap *vap, struct ieee80211req *ireq)
1761 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, txpow.it_macaddr);
1770 ieee80211_ioctl_setwmeparam(struct ieee80211vap *vap, struct ieee80211req *ireq)
1772 struct ieee80211com *ic = vap->iv_ic;
1823 ieee80211_wme_updateparams(vap);
1934 setcurchan(struct ieee80211vap *vap, struct ieee80211_channel *c)
1936 struct ieee80211com *ic = vap->iv_ic;
1942 if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
1945 if (!check_mode_consistency(c, vap->iv_des_mode))
1947 } else if (vap->iv_opmode == IEEE80211_M_IBSS) {
1951 if ((vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP) &&
1952 vap->iv_bss->ni_chan == c)
1955 vap->iv_des_chan = c;
1958 if (vap->iv_opmode == IEEE80211_M_MONITOR &&
1959 vap->iv_des_chan != IEEE80211_CHAN_ANYC) {
1963 if (IFNET_IS_UP_RUNNING(vap->iv_ifp)) {
1964 /* XXX need state machine for other vap's to follow */
1965 ieee80211_setcurchan(ic, vap->iv_des_chan);
1966 vap->iv_bss->ni_chan = ic->ic_curchan;
1968 ic->ic_curchan = vap->iv_des_chan;
1977 if (IS_UP_AUTO(vap))
1978 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
1979 else if (vap->iv_des_chan != IEEE80211_CHAN_ANYC) {
1985 ic->ic_curchan = vap->iv_des_chan;
1997 ieee80211_ioctl_setchannel(struct ieee80211vap *vap,
2000 struct ieee80211com *ic = vap->iv_ic;
2010 c = findchannel(ic, ireq->i_val, vap->iv_des_mode);
2029 switch (vap->iv_des_mode) {
2067 return setcurchan(vap, c);
2076 ieee80211_ioctl_setcurchan(struct ieee80211vap *vap,
2079 struct ieee80211com *ic = vap->iv_ic;
2096 return setcurchan(vap, c);
2100 ieee80211_ioctl_setregdomain(struct ieee80211vap *vap,
2109 IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
2118 IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
2126 IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
2131 error = ieee80211_setregdomain(vap, reg);
2162 ieee80211_ioctl_setroam(struct ieee80211vap *vap,
2165 struct ieee80211com *ic = vap->iv_ic;
2171 if (ireq->i_len != sizeof(vap->iv_roamparms))
2191 dst = &vap->iv_roamparms[mode];
2214 vap->iv_roamparms[mode] = parms->params[mode];
2217 if (vap->iv_roaming == IEEE80211_ROAMING_DEVICE)
2226 ieee80211_ioctl_settxparams(struct ieee80211vap *vap,
2229 struct ieee80211com *ic = vap->iv_ic;
2248 dst = &vap->iv_txparms[mode];
2280 vap->iv_txparms[mode] = parms.params[mode];
2335 setwparsnie(struct ieee80211vap *vap, uint8_t *ie, int space)
2341 vap->iv_wpa_ie = ie;
2343 vap->iv_rsn_ie = ie;
2347 ieee80211_ioctl_setappie_locked(struct ieee80211vap *vap,
2352 IEEE80211_LOCK_ASSERT(vap->iv_ic);
2356 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
2357 vap->iv_opmode != IEEE80211_M_IBSS) {
2361 error = setappie(&vap->iv_appie_beacon, ireq);
2363 ieee80211_beacon_notify(vap, IEEE80211_BEACON_APPIE);
2366 error = setappie(&vap->iv_appie_proberesp, ireq);
2369 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
2370 error = setappie(&vap->iv_appie_assocresp, ireq);
2375 error = setappie(&vap->iv_appie_probereq, ireq);
2378 if (vap->iv_opmode == IEEE80211_M_STA)
2379 error = setappie(&vap->iv_appie_assocreq, ireq);
2384 error = setappie(&vap->iv_appie_wpa, ireq);
2392 vap->iv_wpa_ie = NULL;
2393 vap->iv_rsn_ie = NULL;
2394 if (vap->iv_appie_wpa != NULL) {
2396 vap->iv_appie_wpa;
2400 setwparsnie(vap, data, appie->ie_len);
2401 setwparsnie(vap, data + 2 + data[1],
2404 if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
2405 vap->iv_opmode == IEEE80211_M_IBSS) {
2425 ieee80211_ioctl_setappie(struct ieee80211vap *vap,
2428 struct ieee80211com *ic = vap->iv_ic;
2437 error = ieee80211_ioctl_setappie_locked(vap, ireq, fc0);
2443 ieee80211_ioctl_chanswitch(struct ieee80211vap *vap, struct ieee80211req *ireq)
2445 struct ieee80211com *ic = vap->iv_ic;
2456 if (vap->iv_opmode != IEEE80211_M_HOSTAP ||
2457 (vap->iv_flags & IEEE80211_F_DOTH) == 0)
2475 ieee80211_scanreq(struct ieee80211vap *vap, struct ieee80211_scan_req *sr)
2483 struct ieee80211com *ic = vap->iv_ic;
2517 * Add an implicit NOPICK if the vap is not marked UP. This
2522 if ((vap->iv_ifp->if_flags & IFF_UP) == 0)
2525 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
2528 (vap->iv_ifp->if_flags & IFF_UP) == 0 ? " (!IFF_UP)" : "",
2535 * parameters in the vap and mark IEEE80211_FEXT_SCANREQ; the
2547 if (vap->iv_state == IEEE80211_S_INIT) {
2549 vap->iv_scanreq_flags = sr->sr_flags;
2550 vap->iv_scanreq_duration = sr->sr_duration;
2551 vap->iv_scanreq_nssid = sr->sr_nssid;
2553 vap->iv_scanreq_ssid[i].len = sr->sr_ssid[i].len;
2554 memcpy(vap->iv_scanreq_ssid[i].ssid,
2557 vap->iv_flags_ext |= IEEE80211_FEXT_SCANREQ;
2559 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
2561 vap->iv_flags_ext &= ~IEEE80211_FEXT_SCANREQ;
2564 error = ieee80211_check_scan(vap, sr->sr_flags,
2570 error = ieee80211_start_scan(vap, sr->sr_flags,
2584 ieee80211_ioctl_scanreq(struct ieee80211vap *vap, struct ieee80211req *ireq)
2598 error = ieee80211_scanreq(vap, sr);
2605 ieee80211_ioctl_setstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
2617 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
2622 ni = ieee80211_ref_node(vap->iv_bss);
2629 isvap11g(const struct ieee80211vap *vap)
2631 const struct ieee80211_node *bss = vap->iv_bss;
2637 isvapht(const struct ieee80211vap *vap)
2639 const struct ieee80211_node *bss = vap->iv_bss;
2648 dummy_ioctl_set(struct ieee80211vap *vap, struct ieee80211req *ireq)
2655 ieee80211_ioctl_setdefault(struct ieee80211vap *vap, struct ieee80211req *ireq)
2661 error = (*set)(vap, ireq);
2669 ieee80211_ioctl_set80211(struct ieee80211vap *vap, u_long cmd, struct ieee80211req *ireq)
2671 struct ieee80211com *ic = vap->iv_ic;
2690 memset(vap->iv_des_ssid[0].ssid, 0, IEEE80211_NWID_LEN);
2691 vap->iv_des_ssid[0].len = ireq->i_len;
2692 memcpy(vap->iv_des_ssid[0].ssid, tmpssid, ireq->i_len);
2693 vap->iv_des_nssid = (ireq->i_len > 0);
2699 vap->iv_flags &= ~IEEE80211_F_PRIVACY;
2700 vap->iv_flags &= ~IEEE80211_F_DROPUNENC;
2703 vap->iv_flags |= IEEE80211_F_PRIVACY;
2704 vap->iv_flags |= IEEE80211_F_DROPUNENC;
2707 vap->iv_flags |= IEEE80211_F_PRIVACY;
2708 vap->iv_flags &= ~IEEE80211_F_DROPUNENC;
2717 k = &vap->iv_nw_keys[kid];
2720 (void) ieee80211_crypto_delkey(vap, k);
2729 ieee80211_key_update_begin(vap);
2731 if (ieee80211_crypto_newkey(vap, IEEE80211_CIPHER_WEP,
2735 IEEE80211_ADDR_COPY(k->wk_macaddr, vap->iv_myaddr);
2736 if (!ieee80211_crypto_setkey(vap, k))
2740 ieee80211_key_update_end(vap);
2747 vap->iv_def_txkey = kid;
2765 vap->iv_flags |= IEEE80211_F_PRIVACY;
2769 vap->iv_flags &= ~(IEEE80211_F_WPA|IEEE80211_F_PRIVACY);
2773 vap->iv_flags &= ~IEEE80211_F_WPA;
2775 vap->iv_flags |= IEEE80211_F_PRIVACY;
2778 vap->iv_flags &= ~IEEE80211_F_WPA;
2784 vap->iv_bss->ni_authmode = ireq->i_val;
2786 vap->iv_auth = auth;
2790 error = ieee80211_ioctl_setchannel(vap, ireq);
2795 if (vap->iv_flags & IEEE80211_F_PMGTON) {
2796 ieee80211_syncflag(vap, -IEEE80211_F_PMGTON);
2801 if ((vap->iv_caps & IEEE80211_C_PMGT) == 0)
2803 else if ((vap->iv_flags & IEEE80211_F_PMGTON) == 0) {
2804 ieee80211_syncflag(vap, IEEE80211_F_PMGTON);
2823 vap->iv_rtsthreshold = ireq->i_val;
2848 vap->iv_roaming = (enum ieee80211_roamingmode)ireq->i_val;
2854 vap->iv_flags |= IEEE80211_F_PRIVACY;
2856 vap->iv_flags &= ~IEEE80211_F_PRIVACY;
2861 vap->iv_flags |= IEEE80211_F_DROPUNENC;
2863 vap->iv_flags &= ~IEEE80211_F_DROPUNENC;
2867 error = ieee80211_ioctl_setkey(vap, ireq);
2870 error = ieee80211_ioctl_delkey(vap, ireq);
2873 error = ieee80211_ioctl_setmlme(vap, ireq);
2877 if ((vap->iv_flags & IEEE80211_F_WPA) == 0)
2879 vap->iv_flags |= IEEE80211_F_COUNTERM;
2881 vap->iv_flags &= ~IEEE80211_F_COUNTERM;
2888 flags = vap->iv_flags & ~IEEE80211_F_WPA;
2894 if (!(vap->iv_caps & IEEE80211_C_WPA1))
2899 if (!(vap->iv_caps & IEEE80211_C_WPA2))
2904 if ((vap->iv_caps & IEEE80211_C_WPA) != IEEE80211_C_WPA)
2911 vap->iv_flags = flags;
2916 if ((vap->iv_caps & IEEE80211_C_WME) == 0)
2918 ieee80211_syncflag(vap, IEEE80211_F_WME);
2920 ieee80211_syncflag(vap, -IEEE80211_F_WME);
2925 vap->iv_flags |= IEEE80211_F_HIDESSID;
2927 vap->iv_flags &= ~IEEE80211_F_HIDESSID;
2932 vap->iv_flags |= IEEE80211_F_NOBRIDGE;
2934 vap->iv_flags &= ~IEEE80211_F_NOBRIDGE;
2942 IEEE80211_ADDR_COPY(vap->iv_des_bssid, tmpbssid);
2943 if (IEEE80211_ADDR_EQ(vap->iv_des_bssid, zerobssid))
2944 vap->iv_flags &= ~IEEE80211_F_DESBSSID;
2946 vap->iv_flags |= IEEE80211_F_DESBSSID;
2950 error = ieee80211_ioctl_setchanlist(vap, ireq);
2955 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
2964 if (vap->iv_state == IEEE80211_S_INIT)
2965 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
2967 (void) ieee80211_start_scan(vap,
2973 vap->iv_des_nssid, vap->iv_des_ssid);
2977 error = ieee80211_ioctl_scanreq(vap, ireq);
2980 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
2982 ieee80211_cancel_scan(vap);
2986 ieee80211_syncflag_ht(vap, IEEE80211_FHT_HT);
2988 ieee80211_syncflag_ht(vap, -IEEE80211_FHT_HT);
2990 ieee80211_syncflag_ht(vap, IEEE80211_FHT_USEHT40);
2992 ieee80211_syncflag_ht(vap, -IEEE80211_FHT_USEHT40);
2997 error = ieee80211_ioctl_macmac(vap, ireq);
3000 error = ieee80211_ioctl_setmaccmd(vap, ireq);
3003 error = ieee80211_ioctl_setstastats(vap, ireq);
3006 error = ieee80211_ioctl_setstatxpow(vap, ireq);
3014 error = ieee80211_ioctl_setwmeparam(vap, ireq);
3017 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
3018 vap->iv_opmode != IEEE80211_M_MBSS &&
3019 vap->iv_opmode != IEEE80211_M_IBSS)
3023 vap->iv_dtim_period = ireq->i_val;
3029 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
3030 vap->iv_opmode != IEEE80211_M_MBSS &&
3031 vap->iv_opmode != IEEE80211_M_IBSS)
3042 vap->iv_flags |= IEEE80211_F_PUREG;
3044 vap->iv_flags &= ~IEEE80211_F_PUREG;
3046 if (isvap11g(vap))
3050 vap->iv_quiet= ireq->i_val;
3053 vap->iv_quiet_count=ireq->i_val;
3056 vap->iv_quiet_period=ireq->i_val;
3059 vap->iv_quiet_offset=ireq->i_val;
3062 if(ireq->i_val < vap->iv_bss->ni_intval)
3063 vap->iv_quiet_duration = ireq->i_val;
3069 if ((vap->iv_caps & IEEE80211_C_BGSCAN) == 0)
3071 vap->iv_flags |= IEEE80211_F_BGSCAN;
3073 vap->iv_flags &= ~IEEE80211_F_BGSCAN;
3077 vap->iv_bgscanidle = ireq->i_val*hz/1000;
3083 vap->iv_bgscanintvl = ireq->i_val*hz;
3089 vap->iv_scanvalid = ireq->i_val*hz;
3094 if ((vap->iv_caps & IEEE80211_C_TXFRAG) == 0 &&
3100 vap->iv_fragthreshold = ireq->i_val;
3105 if ((vap->iv_caps & IEEE80211_C_BURST) == 0)
3107 ieee80211_syncflag(vap, IEEE80211_F_BURST);
3109 ieee80211_syncflag(vap, -IEEE80211_F_BURST);
3116 vap->iv_bmissthreshold = ireq->i_val;
3120 error = ieee80211_ioctl_setcurchan(vap, ireq);
3126 if (((ireq->i_val ^ vap->iv_htcaps) & IEEE80211_HTCAP_SHORTGI) != 0)
3129 vap->iv_flags_ht |= IEEE80211_FHT_SHORTGI20;
3131 vap->iv_flags_ht |= IEEE80211_FHT_SHORTGI40;
3134 vap->iv_flags_ht &=
3139 if (ireq->i_val && (vap->iv_htcaps & IEEE80211_HTC_AMPDU) == 0)
3142 vap->iv_flags_ht |= IEEE80211_FHT_AMPDU_TX;
3144 vap->iv_flags_ht &= ~IEEE80211_FHT_AMPDU_TX;
3146 vap->iv_flags_ht |= IEEE80211_FHT_AMPDU_RX;
3148 vap->iv_flags_ht &= ~IEEE80211_FHT_AMPDU_RX;
3150 if (isvapht(vap))
3157 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
3158 vap->iv_ampdu_rxmax = ireq->i_val;
3160 vap->iv_ampdu_limit = ireq->i_val;
3167 vap->iv_ampdu_density = ireq->i_val;
3171 if (ireq->i_val && (vap->iv_htcaps & IEEE80211_HTC_AMSDU) == 0)
3174 vap->iv_flags_ht |= IEEE80211_FHT_AMSDU_TX;
3176 vap->iv_flags_ht &= ~IEEE80211_FHT_AMSDU_TX;
3178 vap->iv_flags_ht |= IEEE80211_FHT_AMSDU_RX;
3180 vap->iv_flags_ht &= ~IEEE80211_FHT_AMSDU_RX;
3182 if (isvapht(vap))
3187 vap->iv_amsdu_limit = ireq->i_val; /* XXX truncation? */
3191 if ((vap->iv_flags_ht & IEEE80211_FHT_HT) == 0)
3193 vap->iv_flags_ht |= IEEE80211_FHT_PUREN;
3195 vap->iv_flags_ht &= ~IEEE80211_FHT_PUREN;
3197 if (isvapht(vap))
3204 if ((vap->iv_caps & IEEE80211_C_DOTH) == 0)
3207 vap->iv_flags |= IEEE80211_F_DOTH;
3209 vap->iv_flags &= ~IEEE80211_F_DOTH;
3213 error = ieee80211_ioctl_setregdomain(vap, ireq);
3216 error = ieee80211_ioctl_setroam(vap, ireq);
3219 error = ieee80211_ioctl_settxparams(vap, ireq);
3223 if ((vap->iv_flags_ht & IEEE80211_FHT_HT) == 0)
3225 vap->iv_flags_ht |= IEEE80211_FHT_HTCOMPAT;
3227 vap->iv_flags_ht &= ~IEEE80211_FHT_HTCOMPAT;
3229 if (isvapht(vap))
3238 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
3239 vap->iv_opmode != IEEE80211_M_STA)
3241 vap->iv_flags |= IEEE80211_F_DWDS;
3242 if (vap->iv_opmode == IEEE80211_M_STA)
3243 vap->iv_flags_ext |= IEEE80211_FEXT_4ADDR;
3245 vap->iv_flags &= ~IEEE80211_F_DWDS;
3246 if (vap->iv_opmode == IEEE80211_M_STA)
3247 vap->iv_flags_ext &= ~IEEE80211_FEXT_4ADDR;
3252 vap->iv_flags_ext |= IEEE80211_FEXT_INACT;
3254 vap->iv_flags_ext &= ~IEEE80211_FEXT_INACT;
3257 error = ieee80211_ioctl_setappie(vap, ireq);
3261 if ((vap->iv_caps & IEEE80211_C_WPA) == 0)
3263 vap->iv_flags_ext |= IEEE80211_FEXT_WPS;
3265 vap->iv_flags_ext &= ~IEEE80211_FEXT_WPS;
3269 if ((vap->iv_caps & IEEE80211_C_WPA) == 0)
3271 vap->iv_flags_ext |= IEEE80211_FEXT_TSN;
3273 vap->iv_flags_ext &= ~IEEE80211_FEXT_TSN;
3276 error = ieee80211_ioctl_chanswitch(vap, ireq);
3280 if ((vap->iv_caps & IEEE80211_C_DFS) == 0)
3283 if ((vap->iv_flags & IEEE80211_F_DOTH) == 0)
3285 vap->iv_flags_ext |= IEEE80211_FEXT_DFS;
3287 vap->iv_flags_ext &= ~IEEE80211_FEXT_DFS;
3291 vap->iv_flags_ext |= IEEE80211_FEXT_DOTD;
3293 vap->iv_flags_ext &= ~IEEE80211_FEXT_DOTD;
3294 if (vap->iv_opmode == IEEE80211_M_STA)
3303 if (isvapht(vap))
3307 error = ieee80211_ioctl_setstavlan(vap, ireq);
3314 (vap->iv_htcaps & IEEE80211_HTC_SMPS) == 0)
3316 vap->iv_htcaps = (vap->iv_htcaps &~ IEEE80211_HTCAP_SMPS) |
3319 if (isvapht(vap))
3324 if ((vap->iv_htcaps & IEEE80211_HTC_RIFS) == 0)
3326 vap->iv_flags_ht |= IEEE80211_FHT_RIFS;
3328 vap->iv_flags_ht &= ~IEEE80211_FHT_RIFS;
3330 if (isvapht(vap))
3336 ((vap->iv_htcaps & IEEE80211_HTCAP_TXSTBC) == 0))
3339 ((vap->iv_htcaps & IEEE80211_HTCAP_RXSTBC) == 0))
3344 vap->iv_flags_ht |= IEEE80211_FHT_STBC_TX;
3346 vap->iv_flags_ht &= ~IEEE80211_FHT_STBC_TX;
3350 vap->iv_flags_ht |= IEEE80211_FHT_STBC_RX;
3352 vap->iv_flags_ht &= ~IEEE80211_FHT_STBC_RX;
3355 if (isvapht(vap))
3359 error = ieee80211_ioctl_setdefault(vap, ireq);
3376 error = IFNET_IS_UP_RUNNING(vap->iv_ifp) ?
3377 vap->iv_reset(vap, ireq->i_type) : 0;
3380 if (IS_UP_AUTO(vap))
3381 ieee80211_init(vap);
3390 struct ieee80211vap *vap = ifp->if_softc;
3391 struct ieee80211com *ic = vap->iv_ic;
3397 if (ic_used && (error = ieee80211_com_vincref(vap)) != 0)
3403 if ((ifp->if_flags ^ vap->iv_ifflags) & IFF_PROMISC) {
3412 vap->iv_opmode == IEEE80211_M_MONITOR ||
3413 (vap->iv_opmode == IEEE80211_M_AHDEMO &&
3414 (vap->iv_caps & IEEE80211_C_TDMA) == 0)) {
3415 ieee80211_promisc(vap,
3417 vap->iv_ifflags ^= IFF_PROMISC;
3420 if ((ifp->if_flags ^ vap->iv_ifflags) & IFF_ALLMULTI) {
3421 ieee80211_allmulti(vap, ifp->if_flags & IFF_ALLMULTI);
3422 vap->iv_ifflags ^= IFF_ALLMULTI;
3427 * If we're the first vap and the parent is not up
3431 if (vap->iv_state == IEEE80211_S_INIT) {
3434 ieee80211_start_locked(vap);
3438 * Stop ourself. If we are the last vap to be
3443 ieee80211_stop_locked(vap);
3460 !IEEE80211_ADDR_EQ(vap->iv_myaddr, IF_LLADDR(ifp)))
3461 IEEE80211_ADDR_COPY(vap->iv_myaddr,
3473 error = ifmedia_ioctl(ifp, ifr, &vap->iv_media, cmd);
3476 error = ieee80211_ioctl_get80211(vap, cmd,
3482 error = ieee80211_ioctl_set80211(vap, cmd,
3487 copyout(&vap->iv_stats, ifr_data_get_ptr(ifr),
3488 sizeof (vap->iv_stats));
3538 ieee80211_com_vdecref(vap);