static int __init init_crypto_wep_test(void) { struct ieee80211com ic; struct ieee80211vap vap; int i, pass, total; memset(&ic, 0, sizeof(ic)); memset(&vap, 0, sizeof(vap)); vap.iv_ic = ⁣ if (debug) vap.iv_debug = IEEE80211_MSG_CRYPTO; ieee80211_crypto_attach(&ic); ieee80211_crypto_vattach(&vap); pass = 0; total = 0; for (i = 0; i < ARRAY_SIZE(weptests); i++) if (tests & (1 << i)) { total++; pass += runtest(&vap, &weptests[i]); } printk("%u of %u 802.11i WEP test vectors passed\n", pass, total); ieee80211_crypto_vdetach(&vap); ieee80211_crypto_detach(&ic); return (pass == total ? 0 : -ENXIO); }
static int __init init_crypto_wep_test(void) { struct { struct ieee80211vap vap; struct ieee80211com ic; struct net_device netdev; } *buf; struct ieee80211vap *vap; int i, pass, total; buf = kzalloc(sizeof(*buf), GFP_KERNEL); if (!buf) return -ENOMEM; vap = &buf->vap; vap->iv_ic = &buf->ic; vap->iv_dev = &buf->netdev; vap->iv_ic->ic_dev = vap->iv_dev; strncpy(vap->iv_dev->name, "WEP test", sizeof(vap->iv_dev->name) - 1); if (debug) vap->iv_debug = IEEE80211_MSG_CRYPTO; ieee80211_crypto_attach(vap->iv_ic); ieee80211_crypto_vattach(vap); pass = 0; total = 0; for (i = 0; i < ARRAY_SIZE(weptests); i++) if (tests & (1 << i)) { total++; pass += runtest(vap, &weptests[i]); } printk("%u of %u 802.11i WEP test vectors passed\n", pass, total); ieee80211_crypto_vdetach(vap); ieee80211_crypto_detach(vap->iv_ic); kfree(buf); return (pass == total ? 0 : -ENXIO); }
static int __init init_crypto_ccmp_test(void) { struct ieee80211com *ic; struct ieee80211vap *vap; int i, pass, total; ic = kzalloc(sizeof(*ic), GFP_KERNEL); if (!ic) return -ENOMEM; ieee80211_crypto_attach(ic); vap = kzalloc(sizeof(*vap), GFP_KERNEL); if (!vap) { kfree(ic); return -ENOMEM; } vap->iv_ic = ic; if (debug) vap->iv_debug = IEEE80211_MSG_CRYPTO; ieee80211_crypto_vattach(vap); pass = 0; total = 0; for (i = 0; i < ARRAY_SIZE(ccmptests); i++) if (tests & (1 << i)) { total++; pass += runtest(vap, &ccmptests[i]); } printk("%u of %u 802.11i AES-CCMP test vectors passed\n", pass, total); ieee80211_crypto_vdetach(vap); ieee80211_crypto_detach(ic); kfree(vap); kfree(ic); return (pass == total ? 0 : -ENXIO); }
/* * Prepare a vap for use. Drivers use this call to * setup net80211 state in new vap's prior attaching * them with ieee80211_vap_attach (below). */ int ieee80211_vap_setup(struct ieee80211com *ic, struct ieee80211vap *vap, const char name[IFNAMSIZ], int unit, int opmode, int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t macaddr[IEEE80211_ADDR_LEN]) { struct ifnet *ifp; ifp = if_alloc(IFT_ETHER); if (ifp == NULL) { if_printf(ic->ic_ifp, "%s: unable to allocate ifnet\n", __func__); return ENOMEM; } if_initname(ifp, name, unit); ifp->if_softc = vap; /* back pointer */ ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST; ifp->if_start = ieee80211_start; ifp->if_ioctl = ieee80211_ioctl; ifp->if_init = ieee80211_init; /* NB: input+output filled in by ether_ifattach */ ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN); ifq_set_ready(&ifp->if_snd); vap->iv_ifp = ifp; vap->iv_ic = ic; vap->iv_flags = ic->ic_flags; /* propagate common flags */ vap->iv_flags_ext = ic->ic_flags_ext; vap->iv_flags_ven = ic->ic_flags_ven; vap->iv_caps = ic->ic_caps &~ IEEE80211_C_OPMODE; vap->iv_htcaps = ic->ic_htcaps; vap->iv_opmode = opmode; vap->iv_caps |= ieee80211_opcap[opmode]; switch (opmode) { case IEEE80211_M_WDS: /* * WDS links must specify the bssid of the far end. * For legacy operation this is a static relationship. * For non-legacy operation the station must associate * and be authorized to pass traffic. Plumbing the * vap to the proper node happens when the vap * transitions to RUN state. */ IEEE80211_ADDR_COPY(vap->iv_des_bssid, bssid); vap->iv_flags |= IEEE80211_F_DESBSSID; if (flags & IEEE80211_CLONE_WDSLEGACY) vap->iv_flags_ext |= IEEE80211_FEXT_WDSLEGACY; break; #ifdef IEEE80211_SUPPORT_TDMA case IEEE80211_M_AHDEMO: if (flags & IEEE80211_CLONE_TDMA) { /* NB: checked before clone operation allowed */ KASSERT(ic->ic_caps & IEEE80211_C_TDMA, ("not TDMA capable, ic_caps 0x%x", ic->ic_caps)); /* * Propagate TDMA capability to mark vap; this * cannot be removed and is used to distinguish * regular ahdemo operation from ahdemo+tdma. */ vap->iv_caps |= IEEE80211_C_TDMA; } break; #endif } /* auto-enable s/w beacon miss support */ if (flags & IEEE80211_CLONE_NOBEACONS) vap->iv_flags_ext |= IEEE80211_FEXT_SWBMISS; /* auto-generated or user supplied MAC address */ if (flags & (IEEE80211_CLONE_BSSID|IEEE80211_CLONE_MACADDR)) vap->iv_flags_ext |= IEEE80211_FEXT_UNIQMAC; /* * Enable various functionality by default if we're * capable; the driver can override us if it knows better. */ if (vap->iv_caps & IEEE80211_C_WME) vap->iv_flags |= IEEE80211_F_WME; if (vap->iv_caps & IEEE80211_C_BURST) vap->iv_flags |= IEEE80211_F_BURST; #if 0 /* * NB: bg scanning only makes sense for station mode right now * * XXX: bgscan is not necessarily stable, so do not enable it by * default. It messes up atheros drivers for sure. * (tested w/ AR9280). */ if (vap->iv_opmode == IEEE80211_M_STA && (vap->iv_caps & IEEE80211_C_BGSCAN)) vap->iv_flags |= IEEE80211_F_BGSCAN; #endif vap->iv_flags |= IEEE80211_F_DOTH; /* XXX no cap, just ena */ /* NB: DFS support only makes sense for ap mode right now */ if (vap->iv_opmode == IEEE80211_M_HOSTAP && (vap->iv_caps & IEEE80211_C_DFS)) vap->iv_flags_ext |= IEEE80211_FEXT_DFS; vap->iv_des_chan = IEEE80211_CHAN_ANYC; /* any channel is ok */ vap->iv_bmissthreshold = IEEE80211_HWBMISS_DEFAULT; vap->iv_dtim_period = IEEE80211_DTIM_DEFAULT; /* * Install a default reset method for the ioctl support; * the driver can override this. */ vap->iv_reset = default_reset; IEEE80211_ADDR_COPY(vap->iv_myaddr, macaddr); ieee80211_sysctl_vattach(vap); ieee80211_crypto_vattach(vap); ieee80211_node_vattach(vap); ieee80211_power_vattach(vap); ieee80211_proto_vattach(vap); #ifdef IEEE80211_SUPPORT_SUPERG ieee80211_superg_vattach(vap); #endif ieee80211_ht_vattach(vap); ieee80211_scan_vattach(vap); ieee80211_regdomain_vattach(vap); ieee80211_radiotap_vattach(vap); ieee80211_ratectl_set(vap, IEEE80211_RATECTL_AMRR); return 0; }
int ieee80211_vap_setup(struct ieee80211com *ic, struct ieee80211vap *vap, int opmode, int scan_priority_base, int flags, const u_int8_t bssid[IEEE80211_ADDR_LEN]) { #define IEEE80211_C_OPMODE \ (IEEE80211_C_IBSS | IEEE80211_C_HOSTAP | IEEE80211_C_AHDEMO | \ IEEE80211_C_MONITOR) int i; #if 1 /* DISABLE_FOR_PLUGFEST_GSTANTON */ vap->iv_debug |= (IEEE80211_MSG_TDLS | IEEE80211_MSG_POWER | IEEE80211_MSG_STATE); #endif vap->iv_ic = ic; vap->iv_create_flags=flags; vap->iv_flags = ic->ic_flags; /* propagate common flags */ vap->iv_flags_ext = ic->ic_flags_ext; vap->iv_ath_cap = ic->ic_ath_cap; /* Default Multicast traffic to lowest rate of 1000 Kbps*/ vap->iv_mcast_fixedrate = 0; vap->iv_caps = ic->ic_caps &~ IEEE80211_C_OPMODE; vap->iv_ath_cap &= ~IEEE80211_ATHC_WME; vap->iv_node_count = 0; vap->iv_ccmpsw_seldec = 1; atomic_set(&vap->iv_rx_gate,0); for (i = 0; i < IEEE80211_APPIE_MAX_FRAMES; i++) { LIST_INIT(&vap->iv_app_ie_list[i]); } /* * By default, supports sending our Country IE and 802.11h * informations (but also depends on the lower ic flags). */ ieee80211_vap_country_ie_set(vap); ieee80211_vap_doth_set(vap); switch (opmode) { case IEEE80211_M_STA: /* turn on sw bmiss timer by default */ ieee80211_vap_sw_bmiss_set(vap); break; case IEEE80211_M_IBSS: vap->iv_caps |= IEEE80211_C_IBSS; vap->iv_ath_cap &= ~IEEE80211_ATHC_XR; break; case IEEE80211_M_AHDEMO: vap->iv_caps |= IEEE80211_C_AHDEMO; vap->iv_ath_cap &= ~IEEE80211_ATHC_XR; break; case IEEE80211_M_HOSTAP: vap->iv_caps |= IEEE80211_C_HOSTAP; vap->iv_ath_cap &= ~(IEEE80211_ATHC_XR | IEEE80211_ATHC_TURBOP); break; case IEEE80211_M_MONITOR: vap->iv_caps |= IEEE80211_C_MONITOR; vap->iv_ath_cap &= ~(IEEE80211_ATHC_XR | IEEE80211_ATHC_TURBOP); break; case IEEE80211_M_WDS: vap->iv_caps |= IEEE80211_C_WDS; vap->iv_ath_cap &= ~(IEEE80211_ATHC_XR | IEEE80211_ATHC_TURBOP); IEEE80211_VAP_WDS_ENABLE(vap); break; } vap->iv_opmode = opmode; #ifdef ATH_SUPPORT_TxBF vap->iv_txbfmode = 1; #endif vap->iv_scan_priority_base = scan_priority_base; vap->iv_chanchange_count = 0; vap->channel_change_done = 0; #ifdef ATH_SUPPORT_QUICK_KICKOUT vap->iv_sko_th = ATH_TX_MAX_CONSECUTIVE_XRETRIES; #endif spin_lock_init(&vap->iv_lock); vap->iv_bsschan = ic->ic_curchan; /* initialize bss chan to cur chan */ /* * Enable various functionality by default if we're capable. */ /* NB: bg scanning only makes sense for station mode right now */ if ((ic->ic_opmode == IEEE80211_M_STA) && (vap->iv_caps & IEEE80211_C_BGSCAN)) vap->iv_flags |= IEEE80211_F_BGSCAN; vap->iv_dtim_period = IEEE80211_DTIM_DEFAULT; vap->iv_bmiss_count_for_reset = IEEE80211_DEFAULT_BMISS_COUNT_RESET; vap->iv_bmiss_count_max = IEEE80211_DEFAULT_BMISS_COUNT_MAX; vap->iv_des_mode = IEEE80211_MODE_AUTO; vap->iv_cur_mode = IEEE80211_MODE_AUTO; vap->iv_des_modecaps = (1 << IEEE80211_MODE_AUTO); vap->iv_des_chan[IEEE80211_MODE_AUTO] = IEEE80211_CHAN_ANYC; vap->iv_des_chan[IEEE80211_MODE_11A] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11A); vap->iv_des_chan[IEEE80211_MODE_11B] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11B); vap->iv_des_chan[IEEE80211_MODE_11G] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11G); vap->iv_des_chan[IEEE80211_MODE_11NA_HT20] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11NA_HT20); vap->iv_des_chan[IEEE80211_MODE_11NG_HT20] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11NG_HT20); vap->iv_des_chan[IEEE80211_MODE_11NA_HT40PLUS] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11NA_HT40PLUS); vap->iv_des_chan[IEEE80211_MODE_11NA_HT40MINUS] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11NA_HT40MINUS); vap->iv_des_chan[IEEE80211_MODE_11NG_HT40PLUS] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11NG_HT40PLUS); vap->iv_des_chan[IEEE80211_MODE_11NG_HT40MINUS] = ieee80211_find_dot11_channel(ic, 0, IEEE80211_MODE_11NG_HT40MINUS); /* apply registry settings */ vap->iv_des_ibss_chan = ic->ic_reg_parm.defaultIbssChannel; vap->iv_rateCtrlEnable = ic->ic_reg_parm.rateCtrlEnable; vap->iv_fixed_rateset = ic->ic_reg_parm.transmitRateSet; vap->iv_fixed_retryset = ic->ic_reg_parm.transmitRetrySet; vap->iv_max_aid = IEEE80211_AID_DEF; /* default max aid(should be a config param ?) */ vap->iv_keep_alive_timeout = IEEE80211_DEFULT_KEEP_ALIVE_TIMEOUT; /* keep alive time out */ vap->iv_inact_count = (vap->iv_keep_alive_timeout + IEEE80211_INACT_WAIT -1)/IEEE80211_INACT_WAIT; #ifdef ATH_SUPPORT_TxBF vap->iv_autocvupdate = ic->ic_reg_parm.autocvupdate; vap->iv_cvupdateper = ic->ic_reg_parm.cvupdateper; #endif /* set WMM-related parameters */ vap->iv_wmm_enable = ic->ic_reg_parm.wmeEnabled; if (ieee80211com_has_cap(ic, IEEE80211_C_WME)) { if (vap->iv_wmm_enable) { ieee80211_vap_wme_set(vap); } else { ieee80211_vap_wme_clear(vap); } } else { ieee80211_vap_wme_clear(vap); } vap->iv_wmm_power_save = 0; vap->iv_smps_rssithresh = ic->ic_reg_parm.smpsRssiThreshold; vap->iv_smps_datathresh = ic->ic_reg_parm.smpsDataThreshold; { u_int8_t uapsd_flag; uapsd_flag = (ic->ic_reg_parm.uapsd.vo ? WME_CAPINFO_UAPSD_VO : 0) | (ic->ic_reg_parm.uapsd.vi ? WME_CAPINFO_UAPSD_VI : 0) | (ic->ic_reg_parm.uapsd.bk ? WME_CAPINFO_UAPSD_BK : 0) | (ic->ic_reg_parm.uapsd.be ? WME_CAPINFO_UAPSD_BE : 0); ieee80211_set_uapsd_flags(vap, uapsd_flag); } IEEE80211_ADDR_COPY(vap->iv_myaddr, ic->ic_myaddr); IEEE80211_ADDR_COPY(vap->iv_my_hwaddr, ic->ic_my_hwaddr); for(i=0;i<IEEE80211_MAX_VAP_EVENT_HANDLERS; ++i) { vap->iv_event_handler[i] = NULL; } vap->iv_tsf_offset.offset = 0; vap->iv_tsf_offset.offset_negative = false; /*by defualt wep key cache will not be allocated in first four slots */ vap->iv_wep_keycache = 0; #if ATH_SUPPORT_WPA_SUPPLICANT_CHECK_TIME vap->iv_rejoint_attemp_time = 20; #endif /* by defualt we will send disassoc while doing ath0 down */ vap->iv_send_deauth= 0; #if UMAC_SUPPORT_APONLY vap->iv_aponly = true; #else vap->iv_aponly = false; #endif /* attach other modules */ ieee80211_rateset_vattach(vap); ieee80211_proto_vattach(vap); ieee80211_node_vattach(vap); ieee80211_crypto_vattach(vap); ieee80211_vap_pause_vattach(ic,vap); ieee80211_rrm_vattach(ic,vap); ieee80211_wnm_vattach(ic,vap); ieee80211_power_vattach(vap, 1, /* enable full sleep */ ic->ic_reg_parm.sleepTimePwrSaveMax, ic->ic_reg_parm.sleepTimePwrSave, ic->ic_reg_parm.sleepTimePerf, ic->ic_reg_parm.inactivityTimePwrSaveMax, ic->ic_reg_parm.inactivityTimePwrSave, ic->ic_reg_parm.inactivityTimePerf, ic->ic_reg_parm.smpsDynamic, ic->ic_reg_parm.psPollEnabled); ieee80211_mlme_vattach(vap); ieee80211_scan_table_vattach(vap, &(vap->iv_scan_table), ic->ic_osdev); ieee80211_aplist_vattach(&(vap->iv_candidate_aplist), vap, ieee80211_vap_get_scan_table(vap), vap->iv_ic->ic_scanner, vap->iv_ic->ic_osdev); ieee80211_aplist_config_vattach(&(vap->iv_aplist_config), vap->iv_ic->ic_osdev); ieee80211_acl_attach(vap); ieee80211_scs_vattach(vap); ieee80211_aow_vattach(vap); ieee80211_ald_vattach(vap); #if ATH_SUPPORT_WIFIPOS ieee80211_wifipos_vattach(vap); #endif return 1; #undef IEEE80211_C_OPMODE }