Lines Matching defs:vap
73 ieee80211_ioctl_getkey(u_long cmd, struct ieee80211vap *vap,
76 struct ieee80211com *ic = vap->iv_ic;
91 ni = ieee80211_find_vap_node(&ic->ic_sta, vap, ik.ik_macaddr);
98 wk = &vap->iv_nw_keys[kid];
99 IEEE80211_ADDR_COPY(&ik.ik_macaddr, vap->iv_bss->ni_macaddr);
106 if (wk->wk_keyix == vap->iv_def_txkey)
108 if (ieee80211_priv_check_vap_getkey(cmd, vap, NULL) == 0) {
130 ieee80211_ioctl_getchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
132 struct ieee80211com *ic = vap->iv_ic;
140 ieee80211_ioctl_getchaninfo(struct ieee80211vap *vap, struct ieee80211req *ireq)
142 struct ieee80211com *ic = vap->iv_ic;
154 ieee80211_ioctl_getwpaie(struct ieee80211vap *vap,
170 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, wpaie->wpa_macaddr);
210 ieee80211_ioctl_getstastats(struct ieee80211vap *vap, struct ieee80211req *ireq)
222 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, macaddr);
315 ieee80211_ioctl_getscanresults(struct ieee80211vap *vap,
326 ieee80211_scan_iterate(vap, get_scan_space, &req);
340 ieee80211_scan_iterate(vap, get_scan_result, &req);
379 struct ieee80211vap *vap = ni->ni_vap;
384 if (vap->iv_opmode == IEEE80211_M_HOSTAP &&
400 vap->iv_ic->ic_node_getsignal(ni, &si->isi_rssi, &si->isi_noise);
401 vap->iv_ic->ic_node_getmimoinfo(ni, &si->isi_mimo);
438 si->isi_inact = vap->iv_inact_run;
440 (vap->iv_opmode == IEEE80211_M_WDS &&
441 (vap->iv_flags_ext & IEEE80211_FEXT_WDSLEGACY)))
442 si->isi_inact = vap->iv_inact_auth;
444 si->isi_inact = vap->iv_inact_init;
460 getstainfo_common(struct ieee80211vap *vap, struct ieee80211req *ireq,
463 struct ieee80211com *ic = vap->iv_ic;
472 ieee80211_iterate_nodes_vap(&ic->ic_sta, vap, get_sta_space,
489 ieee80211_iterate_nodes_vap(&ic->ic_sta, vap,
505 ieee80211_ioctl_getstainfo(struct ieee80211vap *vap, struct ieee80211req *ireq)
517 if (IEEE80211_ADDR_EQ(macaddr, vap->iv_ifp->if_broadcastaddr)) {
520 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, macaddr);
524 return getstainfo_common(vap, ireq, ni, off);
528 ieee80211_ioctl_getstatxpow(struct ieee80211vap *vap, struct ieee80211req *ireq)
539 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, txpow.it_macaddr);
549 ieee80211_ioctl_getwmeparam(struct ieee80211vap *vap, struct ieee80211req *ireq)
551 struct ieee80211com *ic = vap->iv_ic;
592 ieee80211_ioctl_getmaccmd(struct ieee80211vap *vap, struct ieee80211req *ireq)
594 const struct ieee80211_aclator *acl = vap->iv_acl;
596 return (acl == NULL ? EINVAL : acl->iac_getioctl(vap, ireq));
600 ieee80211_ioctl_getcurchan(struct ieee80211vap *vap, struct ieee80211req *ireq)
602 struct ieee80211com *ic = vap->iv_ic;
608 * vap's may have different operating channels when HT is
609 * in use. When in RUN state report the vap-specific channel.
612 if (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP)
613 c = vap->iv_bss->ni_chan;
631 ieee80211_ioctl_getappie(struct ieee80211vap *vap, struct ieee80211req *ireq)
641 return getappie(vap->iv_appie_beacon, ireq);
643 return getappie(vap->iv_appie_proberesp, ireq);
645 return getappie(vap->iv_appie_assocresp, ireq);
647 return getappie(vap->iv_appie_probereq, ireq);
649 return getappie(vap->iv_appie_assocreq, ireq);
651 return getappie(vap->iv_appie_wpa, ireq);
657 ieee80211_ioctl_getregdomain(struct ieee80211vap *vap,
660 struct ieee80211com *ic = vap->iv_ic;
669 ieee80211_ioctl_getroam(struct ieee80211vap *vap,
674 if (len > sizeof(vap->iv_roamparms))
675 len = sizeof(vap->iv_roamparms);
676 return copyout(vap->iv_roamparms, ireq->i_data, len);
680 ieee80211_ioctl_gettxparams(struct ieee80211vap *vap,
685 if (len > sizeof(vap->iv_txparms))
686 len = sizeof(vap->iv_txparms);
687 return copyout(vap->iv_txparms, ireq->i_data, len);
730 ieee80211_ioctl_getstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
742 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
747 ni = ieee80211_ref_node(vap->iv_bss);
758 dummy_ioctl_get(struct ieee80211vap *vap, struct ieee80211req *ireq)
765 ieee80211_ioctl_getdefault(struct ieee80211vap *vap, struct ieee80211req *ireq)
771 error = (*get)(vap, ireq);
779 ieee80211_ioctl_get80211(struct ieee80211vap *vap, u_long cmd,
782 struct ieee80211com *ic = vap->iv_ic;
797 switch (vap->iv_state) {
800 ireq->i_len = vap->iv_des_ssid[0].len;
801 memcpy(tmpssid, vap->iv_des_ssid[0].ssid, ireq->i_len);
804 ireq->i_len = vap->iv_bss->ni_esslen;
805 memcpy(tmpssid, vap->iv_bss->ni_essid, ireq->i_len);
814 if ((vap->iv_flags & IEEE80211_F_PRIVACY) == 0)
816 else if (vap->iv_flags & IEEE80211_F_DROPUNENC)
825 len = (u_int) vap->iv_nw_keys[kid].wk_keylen;
827 if (ieee80211_priv_check_vap_getkey(cmd, vap, NULL) == 0) {
828 bcopy(vap->iv_nw_keys[kid].wk_key, tmpkey, len);
839 ireq->i_val = vap->iv_def_txkey;
842 if (vap->iv_flags & IEEE80211_F_WPA)
845 ireq->i_val = vap->iv_bss->ni_authmode;
851 if (vap->iv_flags & IEEE80211_F_PMGTON)
860 ireq->i_val = vap->iv_rtsthreshold;
863 ireq->i_val = vap->iv_protmode;
880 switch (vap->iv_flags & IEEE80211_F_WPA) {
896 error = ieee80211_ioctl_getchanlist(vap, ireq);
899 ireq->i_val = vap->iv_roaming;
902 ireq->i_val = (vap->iv_flags & IEEE80211_F_PRIVACY) != 0;
905 ireq->i_val = (vap->iv_flags & IEEE80211_F_DROPUNENC) != 0;
908 ireq->i_val = (vap->iv_flags & IEEE80211_F_COUNTERM) != 0;
911 ireq->i_val = (vap->iv_flags & IEEE80211_F_WME) != 0;
914 ireq->i_val = (vap->iv_flags & IEEE80211_F_HIDESSID) != 0;
917 ireq->i_val = (vap->iv_flags & IEEE80211_F_NOBRIDGE) == 0;
920 error = ieee80211_ioctl_getkey(cmd, vap, ireq);
923 error = ieee80211_ioctl_getchaninfo(vap, ireq);
928 if (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP) {
929 error = copyout(vap->iv_opmode == IEEE80211_M_WDS ?
930 vap->iv_bss->ni_macaddr : vap->iv_bss->ni_bssid,
933 error = copyout(vap->iv_des_bssid, ireq->i_data,
938 error = ieee80211_ioctl_getwpaie(vap, ireq, ireq->i_type);
941 error = ieee80211_ioctl_getscanresults(vap, ireq);
944 error = ieee80211_ioctl_getstastats(vap, ireq);
947 ireq->i_val = vap->iv_bss->ni_txpower;
950 error = ieee80211_ioctl_getstatxpow(vap, ireq);
953 error = ieee80211_ioctl_getstainfo(vap, ireq);
961 error = ieee80211_ioctl_getwmeparam(vap, ireq);
964 ireq->i_val = vap->iv_dtim_period;
968 ireq->i_val = vap->iv_bss->ni_intval;
971 ireq->i_val = (vap->iv_flags & IEEE80211_F_PUREG) != 0;
974 ireq->i_val = vap->iv_quiet;
977 ireq->i_val = vap->iv_quiet_count;
980 ireq->i_val = vap->iv_quiet_period;
983 ireq->i_val = vap->iv_quiet_duration;
986 ireq->i_val = vap->iv_quiet_offset;
989 ireq->i_val = (vap->iv_flags & IEEE80211_F_BGSCAN) != 0;
992 ireq->i_val = vap->iv_bgscanidle*hz/1000; /* ms */
995 ireq->i_val = vap->iv_bgscanintvl/hz; /* seconds */
998 ireq->i_val = vap->iv_scanvalid/hz; /* seconds */
1001 ireq->i_val = vap->iv_fragthreshold;
1004 error = ieee80211_ioctl_getmaccmd(vap, ireq);
1007 ireq->i_val = (vap->iv_flags & IEEE80211_F_BURST) != 0;
1010 ireq->i_val = vap->iv_bmissthreshold;
1013 error = ieee80211_ioctl_getcurchan(vap, ireq);
1017 if (vap->iv_flags_ht & IEEE80211_FHT_SHORTGI20)
1019 if (vap->iv_flags_ht & IEEE80211_FHT_SHORTGI40)
1024 if (vap->iv_flags_ht & IEEE80211_FHT_AMPDU_TX)
1026 if (vap->iv_flags_ht & IEEE80211_FHT_AMPDU_RX)
1031 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
1032 ireq->i_val = vap->iv_ampdu_rxmax;
1033 else if (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP)
1038 ireq->i_val = _IEEE80211_MASKSHIFT( vap->iv_bss->ni_htparam,
1041 ireq->i_val = vap->iv_ampdu_limit;
1045 if (vap->iv_opmode == IEEE80211_M_STA &&
1046 (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP))
1051 ireq->i_val = _IEEE80211_MASKSHIFT(vap->iv_bss->ni_htparam,
1054 ireq->i_val = vap->iv_ampdu_density;
1058 if (vap->iv_flags_ht & IEEE80211_FHT_AMSDU_TX)
1060 if (vap->iv_flags_ht & IEEE80211_FHT_AMSDU_RX)
1064 ireq->i_val = vap->iv_amsdu_limit; /* XXX truncation? */
1067 ireq->i_val = (vap->iv_flags_ht & IEEE80211_FHT_PUREN) != 0;
1070 ireq->i_val = (vap->iv_flags & IEEE80211_F_DOTH) != 0;
1073 error = ieee80211_ioctl_getregdomain(vap, ireq);
1076 error = ieee80211_ioctl_getroam(vap, ireq);
1079 error = ieee80211_ioctl_gettxparams(vap, ireq);
1082 ireq->i_val = (vap->iv_flags_ht & IEEE80211_FHT_HTCOMPAT) != 0;
1085 ireq->i_val = (vap->iv_flags & IEEE80211_F_DWDS) != 0;
1088 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_INACT) != 0;
1091 error = ieee80211_ioctl_getappie(vap, ireq);
1094 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_WPS) != 0;
1097 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_TSN) != 0;
1100 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_DFS) != 0;
1103 ireq->i_val = (vap->iv_flags_ext & IEEE80211_FEXT_DOTD) != 0;
1109 ireq->i_val = vap->iv_htprotmode;
1112 if (vap->iv_flags_ht & IEEE80211_FHT_HT) {
1114 if (vap->iv_flags_ht & IEEE80211_FHT_USEHT40)
1120 error = ieee80211_ioctl_getstavlan(vap, ireq);
1123 if (vap->iv_opmode == IEEE80211_M_STA &&
1124 (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP)) {
1125 if (vap->iv_bss->ni_flags & IEEE80211_NODE_MIMO_RTS)
1127 else if (vap->iv_bss->ni_flags & IEEE80211_NODE_MIMO_PS)
1132 ireq->i_val = vap->iv_htcaps & IEEE80211_HTCAP_SMPS;
1135 if (vap->iv_opmode == IEEE80211_M_STA &&
1136 (vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP))
1138 (vap->iv_bss->ni_flags & IEEE80211_NODE_RIFS) != 0;
1141 (vap->iv_flags_ht & IEEE80211_FHT_RIFS) != 0;
1145 if (vap->iv_flags_ht & IEEE80211_FHT_STBC_TX)
1147 if (vap->iv_flags_ht & IEEE80211_FHT_STBC_RX)
1152 if (vap->iv_flags_ht & IEEE80211_FHT_LDPC_TX)
1154 if (vap->iv_flags_ht & IEEE80211_FHT_LDPC_RX)
1159 if (vap->iv_flags_ext & IEEE80211_FEXT_UAPSD)
1163 ireq->i_val = vap->iv_vht_flags & IEEE80211_FVHT_MASK;
1166 error = ieee80211_ioctl_getdefault(vap, ireq);
1173 ieee80211_ioctl_setkey(struct ieee80211vap *vap, struct ieee80211req *ireq)
1195 if (vap->iv_opmode == IEEE80211_M_STA) {
1196 ni = ieee80211_ref_node(vap->iv_bss);
1202 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
1211 wk = &vap->iv_nw_keys[kid];
1221 ieee80211_key_update_begin(vap);
1222 if (ieee80211_crypto_newkey(vap, ik.ik_type, ik.ik_flags, wk)) {
1234 if (!ieee80211_crypto_setkey(vap, wk))
1245 ieee80211_crypto_set_deftxkey(vap, kid);
1248 ieee80211_key_update_end(vap);
1255 ieee80211_ioctl_delkey(struct ieee80211vap *vap, struct ieee80211req *ireq)
1270 if (vap->iv_opmode == IEEE80211_M_STA) {
1271 ni = ieee80211_ref_node(vap->iv_bss);
1277 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
1289 ieee80211_crypto_delkey(vap, &vap->iv_nw_keys[kid]);
1295 struct ieee80211vap *vap;
1301 mlmedebug(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN],
1323 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_IOCTL |
1329 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_ANY, mac,
1333 IEEE80211_NOTE_MAC(vap, ops[op].mask, mac,
1336 IEEE80211_NOTE_MAC(vap, ops[op].mask, mac,
1347 struct ieee80211vap *vap = ni->ni_vap;
1349 if (vap != mop->vap)
1358 mlmedebug(vap, ni->ni_macaddr, mop->op, mop->reason);
1370 setmlme_dropsta(struct ieee80211vap *vap,
1373 struct ieee80211_node_table *nt = &vap->iv_ic->ic_sta;
1378 if (!IEEE80211_ADDR_EQ(mac, vap->iv_ifp->if_broadcastaddr)) {
1399 setmlme_common(struct ieee80211vap *vap, int op,
1402 struct ieee80211com *ic = vap->iv_ic;
1412 switch (vap->iv_opmode) {
1414 mlmedebug(vap, vap->iv_bss->ni_macaddr, op, reason);
1416 ieee80211_new_state(vap, IEEE80211_S_INIT, reason);
1419 mlmeop.vap = vap;
1422 error = setmlme_dropsta(vap, mac, &mlmeop);
1432 if (!IEEE80211_ADDR_EQ(mac, vap->iv_bss->ni_macaddr)) {
1437 mlmedebug(vap, vap->iv_bss->ni_macaddr, op, reason);
1438 ni = ieee80211_ref_node(vap->iv_bss);
1466 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
1467 vap->iv_opmode != IEEE80211_M_WDS) {
1472 ni = ieee80211_find_vap_node_locked(nt, vap, mac);
1480 mlmedebug(vap, mac, op, reason);
1490 if (vap->iv_opmode != IEEE80211_M_HOSTAP) {
1495 ni = ieee80211_find_vap_node_locked(nt, vap, mac);
1503 mlmedebug(vap, mac, op, reason);
1517 vap->iv_stats.is_rx_acl++;
1560 setmlme_assoc_sta(struct ieee80211vap *vap,
1566 KASSERT(vap->iv_opmode == IEEE80211_M_STA,
1568 ieee80211_opmode_name[vap->iv_opmode]));
1575 ieee80211_scan_iterate(vap, mlmelookup, &lookup);
1578 mlmedebug(vap, mac, IEEE80211_MLME_ASSOC, 0);
1579 if (!ieee80211_sta_join(vap, lookup.se->se_chan, lookup.se))
1585 setmlme_assoc_adhoc(struct ieee80211vap *vap,
1592 KASSERT(vap->iv_opmode == IEEE80211_M_IBSS ||
1593 vap->iv_opmode == IEEE80211_M_AHDEMO,
1595 ieee80211_opmode_name[vap->iv_opmode]));
1606 memset(vap->iv_des_ssid[0].ssid, 0, IEEE80211_NWID_LEN);
1607 vap->iv_des_ssid[0].len = ssid_len;
1608 memcpy(vap->iv_des_ssid[0].ssid, ssid, ssid_len);
1609 vap->iv_des_nssid = 1;
1617 error = ieee80211_scanreq(vap, sr);
1624 ieee80211_ioctl_setmlme(struct ieee80211vap *vap, struct ieee80211req *ireq)
1634 if (vap->iv_opmode == IEEE80211_M_STA &&
1636 return setmlme_assoc_sta(vap, mlme.im_macaddr,
1637 vap->iv_des_ssid[0].len, vap->iv_des_ssid[0].ssid);
1638 else if ((vap->iv_opmode == IEEE80211_M_IBSS ||
1639 vap->iv_opmode == IEEE80211_M_AHDEMO) &&
1641 return setmlme_assoc_adhoc(vap, mlme.im_macaddr,
1644 return setmlme_common(vap, mlme.im_op,
1649 ieee80211_ioctl_macmac(struct ieee80211vap *vap, struct ieee80211req *ireq)
1652 const struct ieee80211_aclator *acl = vap->iv_acl;
1662 if (acl == NULL || !acl->iac_attach(vap))
1664 vap->iv_acl = acl;
1667 acl->iac_add(vap, mac);
1669 acl->iac_remove(vap, mac);
1674 ieee80211_ioctl_setmaccmd(struct ieee80211vap *vap, struct ieee80211req *ireq)
1676 const struct ieee80211_aclator *acl = vap->iv_acl;
1685 if (acl == NULL || !acl->iac_attach(vap))
1687 vap->iv_acl = acl;
1689 acl->iac_setpolicy(vap, ireq->i_val);
1693 acl->iac_flush(vap);
1698 vap->iv_acl = NULL;
1699 acl->iac_detach(vap);
1706 return acl->iac_setioctl(vap, ireq);
1712 ieee80211_ioctl_setchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
1714 struct ieee80211com *ic = vap->iv_ic;
1752 ieee80211_scan_flush(vap);
1758 ieee80211_ioctl_setstastats(struct ieee80211vap *vap, struct ieee80211req *ireq)
1774 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, macaddr);
1777 /* XXX require ni_vap == vap? */
1784 ieee80211_ioctl_setstatxpow(struct ieee80211vap *vap, struct ieee80211req *ireq)
1795 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap, txpow.it_macaddr);
1804 ieee80211_ioctl_setwmeparam(struct ieee80211vap *vap, struct ieee80211req *ireq)
1806 struct ieee80211com *ic = vap->iv_ic;
1857 ieee80211_wme_updateparams(vap);
1986 setcurchan(struct ieee80211vap *vap, struct ieee80211_channel *c)
1988 struct ieee80211com *ic = vap->iv_ic;
1994 if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
1997 if (!check_mode_consistency(c, vap->iv_des_mode))
1999 } else if (vap->iv_opmode == IEEE80211_M_IBSS) {
2003 if ((vap->iv_state == IEEE80211_S_RUN || vap->iv_state == IEEE80211_S_SLEEP) &&
2004 vap->iv_bss->ni_chan == c)
2007 vap->iv_des_chan = c;
2010 if (vap->iv_opmode == IEEE80211_M_MONITOR &&
2011 vap->iv_des_chan != IEEE80211_CHAN_ANYC) {
2015 if (IFNET_IS_UP_RUNNING(vap->iv_ifp)) {
2016 /* XXX need state machine for other vap's to follow */
2017 ieee80211_setcurchan(ic, vap->iv_des_chan);
2018 vap->iv_bss->ni_chan = ic->ic_curchan;
2020 ic->ic_curchan = vap->iv_des_chan;
2029 if (IS_UP_AUTO(vap))
2030 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
2031 else if (vap->iv_des_chan != IEEE80211_CHAN_ANYC) {
2037 ic->ic_curchan = vap->iv_des_chan;
2049 ieee80211_ioctl_setchannel(struct ieee80211vap *vap,
2052 struct ieee80211com *ic = vap->iv_ic;
2062 c = findchannel(ic, ireq->i_val, vap->iv_des_mode);
2085 switch (vap->iv_des_mode) {
2134 return setcurchan(vap, c);
2143 ieee80211_ioctl_setcurchan(struct ieee80211vap *vap,
2146 struct ieee80211com *ic = vap->iv_ic;
2164 return setcurchan(vap, c);
2168 ieee80211_ioctl_setregdomain(struct ieee80211vap *vap,
2177 IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
2186 IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
2194 IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
2199 error = ieee80211_setregdomain(vap, reg);
2236 ieee80211_ioctl_setroam(struct ieee80211vap *vap,
2239 struct ieee80211com *ic = vap->iv_ic;
2246 if (ireq->i_len != sizeof(vap->iv_roamparms))
2266 dst = &vap->iv_roamparms[mode];
2291 vap->iv_roamparms[mode] = parms->params[mode];
2294 if (vap->iv_roaming == IEEE80211_ROAMING_DEVICE)
2303 ieee80211_ioctl_settxparams(struct ieee80211vap *vap,
2306 struct ieee80211com *ic = vap->iv_ic;
2326 dst = &vap->iv_txparms[mode];
2359 vap->iv_txparms[mode] = parms.params[mode];
2414 setwparsnie(struct ieee80211vap *vap, uint8_t *ie, int space)
2420 vap->iv_wpa_ie = ie;
2422 vap->iv_rsn_ie = ie;
2426 ieee80211_ioctl_setappie_locked(struct ieee80211vap *vap,
2431 IEEE80211_LOCK_ASSERT(vap->iv_ic);
2435 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
2436 vap->iv_opmode != IEEE80211_M_IBSS) {
2440 error = setappie(&vap->iv_appie_beacon, ireq);
2442 ieee80211_beacon_notify(vap, IEEE80211_BEACON_APPIE);
2445 error = setappie(&vap->iv_appie_proberesp, ireq);
2448 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
2449 error = setappie(&vap->iv_appie_assocresp, ireq);
2454 error = setappie(&vap->iv_appie_probereq, ireq);
2457 if (vap->iv_opmode == IEEE80211_M_STA)
2458 error = setappie(&vap->iv_appie_assocreq, ireq);
2463 error = setappie(&vap->iv_appie_wpa, ireq);
2471 vap->iv_wpa_ie = NULL;
2472 vap->iv_rsn_ie = NULL;
2473 if (vap->iv_appie_wpa != NULL) {
2475 vap->iv_appie_wpa;
2479 setwparsnie(vap, data, appie->ie_len);
2480 setwparsnie(vap, data + 2 + data[1],
2483 if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
2484 vap->iv_opmode == IEEE80211_M_IBSS) {
2504 ieee80211_ioctl_setappie(struct ieee80211vap *vap,
2507 struct ieee80211com *ic = vap->iv_ic;
2516 error = ieee80211_ioctl_setappie_locked(vap, ireq, fc0);
2522 ieee80211_ioctl_chanswitch(struct ieee80211vap *vap, struct ieee80211req *ireq)
2524 struct ieee80211com *ic = vap->iv_ic;
2535 if (vap->iv_opmode != IEEE80211_M_HOSTAP ||
2536 (vap->iv_flags & IEEE80211_F_DOTH) == 0)
2554 ieee80211_scanreq(struct ieee80211vap *vap, struct ieee80211_scan_req *sr)
2562 struct ieee80211com *ic = vap->iv_ic;
2588 * Add an implicit NOPICK if the vap is not marked UP. This
2593 if ((vap->iv_ifp->if_flags & IFF_UP) == 0)
2596 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
2597 "%s: vap %p iv_state %#x (%s) flags 0x%x%s "
2599 __func__, vap, vap->iv_state, ieee80211_state_name[vap->iv_state],
2601 (vap->iv_ifp->if_flags & IFF_UP) == 0 ? " (!IFF_UP)" : "",
2608 * parameters in the vap and mark IEEE80211_FEXT_SCANREQ; the
2620 if (vap->iv_state == IEEE80211_S_INIT) {
2622 vap->iv_scanreq_flags = sr->sr_flags;
2623 vap->iv_scanreq_duration = sr->sr_duration;
2624 vap->iv_scanreq_nssid = sr->sr_nssid;
2626 vap->iv_scanreq_ssid[i].len = sr->sr_ssid[i].len;
2627 memcpy(vap->iv_scanreq_ssid[i].ssid,
2630 vap->iv_flags_ext |= IEEE80211_FEXT_SCANREQ;
2632 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
2634 vap->iv_flags_ext &= ~IEEE80211_FEXT_SCANREQ;
2637 error = ieee80211_check_scan(vap, sr->sr_flags,
2643 error = ieee80211_start_scan(vap, sr->sr_flags,
2657 ieee80211_ioctl_scanreq(struct ieee80211vap *vap, struct ieee80211req *ireq)
2671 error = ieee80211_scanreq(vap, sr);
2678 ieee80211_ioctl_setstavlan(struct ieee80211vap *vap, struct ieee80211req *ireq)
2690 ni = ieee80211_find_vap_node(&vap->iv_ic->ic_sta, vap,
2695 ni = ieee80211_ref_node(vap->iv_bss);
2702 isvap11g(const struct ieee80211vap *vap)
2704 const struct ieee80211_node *bss = vap->iv_bss;
2710 isvapht(const struct ieee80211vap *vap)
2712 const struct ieee80211_node *bss = vap->iv_bss;
2721 dummy_ioctl_set(struct ieee80211vap *vap, struct ieee80211req *ireq)
2728 ieee80211_ioctl_setdefault(struct ieee80211vap *vap, struct ieee80211req *ireq)
2734 error = (*set)(vap, ireq);
2742 ieee80211_ioctl_set80211(struct ieee80211vap *vap, u_long cmd, struct ieee80211req *ireq)
2744 struct ieee80211com *ic = vap->iv_ic;
2763 memset(vap->iv_des_ssid[0].ssid, 0, IEEE80211_NWID_LEN);
2764 vap->iv_des_ssid[0].len = ireq->i_len;
2765 memcpy(vap->iv_des_ssid[0].ssid, tmpssid, ireq->i_len);
2766 vap->iv_des_nssid = (ireq->i_len > 0);
2772 vap->iv_flags &= ~IEEE80211_F_PRIVACY;
2773 vap->iv_flags &= ~IEEE80211_F_DROPUNENC;
2776 vap->iv_flags |= IEEE80211_F_PRIVACY;
2777 vap->iv_flags |= IEEE80211_F_DROPUNENC;
2780 vap->iv_flags |= IEEE80211_F_PRIVACY;
2781 vap->iv_flags &= ~IEEE80211_F_DROPUNENC;
2790 k = &vap->iv_nw_keys[kid];
2793 (void) ieee80211_crypto_delkey(vap, k);
2802 ieee80211_key_update_begin(vap);
2804 if (ieee80211_crypto_newkey(vap, IEEE80211_CIPHER_WEP,
2808 IEEE80211_ADDR_COPY(k->wk_macaddr, vap->iv_myaddr);
2809 if (!ieee80211_crypto_setkey(vap, k))
2813 ieee80211_key_update_end(vap);
2828 ieee80211_key_update_begin(vap);
2829 ieee80211_crypto_set_deftxkey(vap, kid);
2830 ieee80211_key_update_end(vap);
2848 vap->iv_flags |= IEEE80211_F_PRIVACY;
2852 vap->iv_flags &= ~(IEEE80211_F_WPA|IEEE80211_F_PRIVACY);
2856 vap->iv_flags &= ~IEEE80211_F_WPA;
2858 vap->iv_flags |= IEEE80211_F_PRIVACY;
2861 vap->iv_flags &= ~IEEE80211_F_WPA;
2867 vap->iv_bss->ni_authmode = ireq->i_val;
2869 vap->iv_auth = auth;
2873 error = ieee80211_ioctl_setchannel(vap, ireq);
2878 if (vap->iv_flags & IEEE80211_F_PMGTON) {
2879 ieee80211_syncflag(vap, -IEEE80211_F_PMGTON);
2884 if ((vap->iv_caps & IEEE80211_C_PMGT) == 0)
2886 else if ((vap->iv_flags & IEEE80211_F_PMGTON) == 0) {
2887 ieee80211_syncflag(vap, IEEE80211_F_PMGTON);
2906 vap->iv_rtsthreshold = ireq->i_val;
2912 vap->iv_protmode = (enum ieee80211_protmode)ireq->i_val;
2918 ieee80211_vap_update_erp_protmode(vap);
2933 vap->iv_roaming = (enum ieee80211_roamingmode)ireq->i_val;
2939 vap->iv_flags |= IEEE80211_F_PRIVACY;
2941 vap->iv_flags &= ~IEEE80211_F_PRIVACY;
2946 vap->iv_flags |= IEEE80211_F_DROPUNENC;
2948 vap->iv_flags &= ~IEEE80211_F_DROPUNENC;
2952 error = ieee80211_ioctl_setkey(vap, ireq);
2955 error = ieee80211_ioctl_delkey(vap, ireq);
2958 error = ieee80211_ioctl_setmlme(vap, ireq);
2962 if ((vap->iv_flags & IEEE80211_F_WPA) == 0)
2964 vap->iv_flags |= IEEE80211_F_COUNTERM;
2966 vap->iv_flags &= ~IEEE80211_F_COUNTERM;
2973 flags = vap->iv_flags & ~IEEE80211_F_WPA;
2979 if (!(vap->iv_caps & IEEE80211_C_WPA1))
2984 if (!(vap->iv_caps & IEEE80211_C_WPA2))
2989 if ((vap->iv_caps & IEEE80211_C_WPA) != IEEE80211_C_WPA)
2996 vap->iv_flags = flags;
3001 if ((vap->iv_caps & IEEE80211_C_WME) == 0)
3003 ieee80211_syncflag(vap, IEEE80211_F_WME);
3005 ieee80211_syncflag(vap, -IEEE80211_F_WME);
3010 vap->iv_flags |= IEEE80211_F_HIDESSID;
3012 vap->iv_flags &= ~IEEE80211_F_HIDESSID;
3017 vap->iv_flags |= IEEE80211_F_NOBRIDGE;
3019 vap->iv_flags &= ~IEEE80211_F_NOBRIDGE;
3027 IEEE80211_ADDR_COPY(vap->iv_des_bssid, tmpbssid);
3028 if (IEEE80211_ADDR_EQ(vap->iv_des_bssid, zerobssid))
3029 vap->iv_flags &= ~IEEE80211_F_DESBSSID;
3031 vap->iv_flags |= IEEE80211_F_DESBSSID;
3035 error = ieee80211_ioctl_setchanlist(vap, ireq);
3040 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
3049 if (vap->iv_state == IEEE80211_S_INIT)
3050 ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
3052 (void) ieee80211_start_scan(vap,
3058 vap->iv_des_nssid, vap->iv_des_ssid);
3062 error = ieee80211_ioctl_scanreq(vap, ireq);
3065 IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
3067 ieee80211_cancel_scan(vap);
3071 ieee80211_syncflag_ht(vap, IEEE80211_FHT_HT);
3073 ieee80211_syncflag_ht(vap, -IEEE80211_FHT_HT);
3075 ieee80211_syncflag_ht(vap, IEEE80211_FHT_USEHT40);
3077 ieee80211_syncflag_ht(vap, -IEEE80211_FHT_USEHT40);
3082 error = ieee80211_ioctl_macmac(vap, ireq);
3085 error = ieee80211_ioctl_setmaccmd(vap, ireq);
3088 error = ieee80211_ioctl_setstastats(vap, ireq);
3091 error = ieee80211_ioctl_setstatxpow(vap, ireq);
3099 error = ieee80211_ioctl_setwmeparam(vap, ireq);
3102 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
3103 vap->iv_opmode != IEEE80211_M_MBSS &&
3104 vap->iv_opmode != IEEE80211_M_IBSS)
3108 vap->iv_dtim_period = ireq->i_val;
3114 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
3115 vap->iv_opmode != IEEE80211_M_MBSS &&
3116 vap->iv_opmode != IEEE80211_M_IBSS)
3127 vap->iv_flags |= IEEE80211_F_PUREG;
3129 vap->iv_flags &= ~IEEE80211_F_PUREG;
3131 if (isvap11g(vap))
3135 vap->iv_quiet= ireq->i_val;
3138 vap->iv_quiet_count=ireq->i_val;
3141 vap->iv_quiet_period=ireq->i_val;
3144 vap->iv_quiet_offset=ireq->i_val;
3147 if(ireq->i_val < vap->iv_bss->ni_intval)
3148 vap->iv_quiet_duration = ireq->i_val;
3154 if ((vap->iv_caps & IEEE80211_C_BGSCAN) == 0)
3156 vap->iv_flags |= IEEE80211_F_BGSCAN;
3158 vap->iv_flags &= ~IEEE80211_F_BGSCAN;
3162 vap->iv_bgscanidle = ireq->i_val*hz/1000;
3168 vap->iv_bgscanintvl = ireq->i_val*hz;
3174 vap->iv_scanvalid = ireq->i_val*hz;
3179 if ((vap->iv_caps & IEEE80211_C_TXFRAG) == 0 &&
3185 vap->iv_fragthreshold = ireq->i_val;
3190 if ((vap->iv_caps & IEEE80211_C_BURST) == 0)
3192 ieee80211_syncflag(vap, IEEE80211_F_BURST);
3194 ieee80211_syncflag(vap, -IEEE80211_F_BURST);
3201 vap->iv_bmissthreshold = ireq->i_val;
3205 error = ieee80211_ioctl_setcurchan(vap, ireq);
3211 if (((ireq->i_val ^ vap->iv_htcaps) & IEEE80211_HTCAP_SHORTGI) != 0)
3214 vap->iv_flags_ht |= IEEE80211_FHT_SHORTGI20;
3216 vap->iv_flags_ht |= IEEE80211_FHT_SHORTGI40;
3219 vap->iv_flags_ht &=
3224 if (ireq->i_val && (vap->iv_htcaps & IEEE80211_HTC_AMPDU) == 0)
3227 vap->iv_flags_ht |= IEEE80211_FHT_AMPDU_TX;
3229 vap->iv_flags_ht &= ~IEEE80211_FHT_AMPDU_TX;
3231 vap->iv_flags_ht |= IEEE80211_FHT_AMPDU_RX;
3233 vap->iv_flags_ht &= ~IEEE80211_FHT_AMPDU_RX;
3235 if (isvapht(vap))
3243 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
3244 vap->iv_ampdu_rxmax = ireq->i_val;
3246 vap->iv_ampdu_limit = ireq->i_val;
3253 vap->iv_ampdu_density = ireq->i_val;
3257 if (ireq->i_val && (vap->iv_htcaps & IEEE80211_HTC_AMSDU) == 0)
3260 vap->iv_flags_ht |= IEEE80211_FHT_AMSDU_TX;
3262 vap->iv_flags_ht &= ~IEEE80211_FHT_AMSDU_TX;
3264 vap->iv_flags_ht |= IEEE80211_FHT_AMSDU_RX;
3266 vap->iv_flags_ht &= ~IEEE80211_FHT_AMSDU_RX;
3268 if (isvapht(vap))
3273 vap->iv_amsdu_limit = ireq->i_val; /* XXX truncation? */
3277 if ((vap->iv_flags_ht & IEEE80211_FHT_HT) == 0)
3279 vap->iv_flags_ht |= IEEE80211_FHT_PUREN;
3281 vap->iv_flags_ht &= ~IEEE80211_FHT_PUREN;
3283 if (isvapht(vap))
3290 if ((vap->iv_caps & IEEE80211_C_DOTH) == 0)
3293 vap->iv_flags |= IEEE80211_F_DOTH;
3295 vap->iv_flags &= ~IEEE80211_F_DOTH;
3299 error = ieee80211_ioctl_setregdomain(vap, ireq);
3302 error = ieee80211_ioctl_setroam(vap, ireq);
3305 error = ieee80211_ioctl_settxparams(vap, ireq);
3309 if ((vap->iv_flags_ht & IEEE80211_FHT_HT) == 0)
3311 vap->iv_flags_ht |= IEEE80211_FHT_HTCOMPAT;
3313 vap->iv_flags_ht &= ~IEEE80211_FHT_HTCOMPAT;
3315 if (isvapht(vap))
3324 if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
3325 vap->iv_opmode != IEEE80211_M_STA)
3327 vap->iv_flags |= IEEE80211_F_DWDS;
3328 if (vap->iv_opmode == IEEE80211_M_STA)
3329 vap->iv_flags_ext |= IEEE80211_FEXT_4ADDR;
3331 vap->iv_flags &= ~IEEE80211_F_DWDS;
3332 if (vap->iv_opmode == IEEE80211_M_STA)
3333 vap->iv_flags_ext &= ~IEEE80211_FEXT_4ADDR;
3338 vap->iv_flags_ext |= IEEE80211_FEXT_INACT;
3340 vap->iv_flags_ext &= ~IEEE80211_FEXT_INACT;
3343 error = ieee80211_ioctl_setappie(vap, ireq);
3347 if ((vap->iv_caps & IEEE80211_C_WPA) == 0)
3349 vap->iv_flags_ext |= IEEE80211_FEXT_WPS;
3351 vap->iv_flags_ext &= ~IEEE80211_FEXT_WPS;
3355 if ((vap->iv_caps & IEEE80211_C_WPA) == 0)
3357 vap->iv_flags_ext |= IEEE80211_FEXT_TSN;
3359 vap->iv_flags_ext &= ~IEEE80211_FEXT_TSN;
3362 error = ieee80211_ioctl_chanswitch(vap, ireq);
3366 if ((vap->iv_caps & IEEE80211_C_DFS) == 0)
3369 if ((vap->iv_flags & IEEE80211_F_DOTH) == 0)
3371 vap->iv_flags_ext |= IEEE80211_FEXT_DFS;
3373 vap->iv_flags_ext &= ~IEEE80211_FEXT_DFS;
3377 vap->iv_flags_ext |= IEEE80211_FEXT_DOTD;
3379 vap->iv_flags_ext &= ~IEEE80211_FEXT_DOTD;
3380 if (vap->iv_opmode == IEEE80211_M_STA)
3386 vap->iv_htprotmode = ireq->i_val ?
3389 if (isvapht(vap))
3392 ieee80211_vap_update_ht_protmode(vap);
3395 error = ieee80211_ioctl_setstavlan(vap, ireq);
3402 (vap->iv_htcaps & IEEE80211_HTC_SMPS) == 0)
3404 vap->iv_htcaps = (vap->iv_htcaps &~ IEEE80211_HTCAP_SMPS) |
3407 if (isvapht(vap))
3412 if ((vap->iv_htcaps & IEEE80211_HTC_RIFS) == 0)
3414 vap->iv_flags_ht |= IEEE80211_FHT_RIFS;
3416 vap->iv_flags_ht &= ~IEEE80211_FHT_RIFS;
3418 if (isvapht(vap))
3424 ((vap->iv_htcaps & IEEE80211_HTCAP_TXSTBC) == 0))
3427 ((vap->iv_htcaps & IEEE80211_HTCAP_RXSTBC) == 0))
3432 vap->iv_flags_ht |= IEEE80211_FHT_STBC_TX;
3434 vap->iv_flags_ht &= ~IEEE80211_FHT_STBC_TX;
3438 vap->iv_flags_ht |= IEEE80211_FHT_STBC_RX;
3440 vap->iv_flags_ht &= ~IEEE80211_FHT_STBC_RX;
3443 if (isvapht(vap))
3449 (vap->iv_htcaps & IEEE80211_HTC_TXLDPC) == 0)
3452 (vap->iv_htcaps & IEEE80211_HTCAP_LDPC) == 0)
3457 vap->iv_flags_ht |= IEEE80211_FHT_LDPC_TX;
3459 vap->iv_flags_ht &= ~IEEE80211_FHT_LDPC_TX;
3463 vap->iv_flags_ht |= IEEE80211_FHT_LDPC_RX;
3465 vap->iv_flags_ht &= ~IEEE80211_FHT_LDPC_RX;
3468 if (isvapht(vap))
3472 if ((vap->iv_caps & IEEE80211_C_UAPSD) == 0)
3475 vap->iv_flags_ext &= ~IEEE80211_FEXT_UAPSD;
3477 vap->iv_flags_ext |= IEEE80211_FEXT_UAPSD;
3485 ieee80211_syncflag_vht(vap, IEEE80211_FVHT_VHT);
3487 ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_VHT);
3490 ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT40);
3492 ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT40);
3495 ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT80);
3497 ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT80);
3500 ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT160);
3502 ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT160);
3505 ieee80211_syncflag_vht(vap, IEEE80211_FVHT_USEVHT80P80);
3507 ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_USEVHT80P80);
3511 ((vap->iv_vht_cap.vht_cap_info & IEEE80211_VHTCAP_TXSTBC) == 0))
3514 ((vap->iv_vht_cap.vht_cap_info & IEEE80211_VHTCAP_RXSTBC_MASK) == 0))
3519 ieee80211_syncflag_vht(vap, IEEE80211_FVHT_STBC_TX);
3521 ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_STBC_TX);
3525 ieee80211_syncflag_vht(vap, IEEE80211_FVHT_STBC_RX);
3527 ieee80211_syncflag_vht(vap, -IEEE80211_FVHT_STBC_RX);
3533 error = ieee80211_ioctl_setdefault(vap, ireq);
3550 error = IFNET_IS_UP_RUNNING(vap->iv_ifp) ?
3551 vap->iv_reset(vap, ireq->i_type) : 0;
3554 if (IS_UP_AUTO(vap))
3555 ieee80211_init(vap);
3564 struct ieee80211vap *vap = ifp->if_softc;
3565 struct ieee80211com *ic = vap->iv_ic;
3571 if (ic_used && (error = ieee80211_com_vincref(vap)) != 0)
3577 if ((ifp->if_flags ^ vap->iv_ifflags) & IFF_PROMISC) {
3586 vap->iv_opmode == IEEE80211_M_MONITOR ||
3587 (vap->iv_opmode == IEEE80211_M_AHDEMO &&
3588 (vap->iv_caps & IEEE80211_C_TDMA) == 0)) {
3589 ieee80211_promisc(vap,
3591 vap->iv_ifflags ^= IFF_PROMISC;
3594 if ((ifp->if_flags ^ vap->iv_ifflags) & IFF_ALLMULTI) {
3595 ieee80211_allmulti(vap, ifp->if_flags & IFF_ALLMULTI);
3596 vap->iv_ifflags ^= IFF_ALLMULTI;
3601 * If we're the first vap and the parent is not up
3605 if (vap->iv_state == IEEE80211_S_INIT) {
3608 ieee80211_start_locked(vap);
3612 * Stop ourself. If we are the last vap to be
3617 ieee80211_stop_locked(vap);
3636 !IEEE80211_ADDR_EQ(vap->iv_myaddr, IF_LLADDR(ifp)))
3637 IEEE80211_ADDR_COPY(vap->iv_myaddr,
3649 error = ifmedia_ioctl(ifp, ifr, &vap->iv_media, cmd);
3652 error = ieee80211_ioctl_get80211(vap, cmd,
3656 error = ieee80211_priv_check_vap_manage(cmd, vap, ifp);
3658 error = ieee80211_ioctl_set80211(vap, cmd,
3663 error = copyout(&vap->iv_stats, ifr_data_get_ptr(ifr),
3664 sizeof(vap->iv_stats));
3702 error = ieee80211_priv_check_vap_setmac(cmd, vap, ifp);
3719 ieee80211_com_vdecref(vap);