int ieee80211_recv_asreq(struct ieee80211_node *ni, wbuf_t wbuf, int subtype) { struct ieee80211com *ic = ni->ni_ic; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_frame *wh; u_int8_t *frm, *efrm; u_int16_t capinfo, bintval; struct ieee80211_rsnparms rsn; u_int8_t reason; int reassoc, resp; u_int8_t *ssid, *rates, *xrates, *wpa, *wme, *ath, *htcap,*vendor_ie, *wps, *aow; u_int8_t *athextcap; #if UMAC_SUPPORT_WNM u_int8_t *timbcast; timbcast = NULL; #endif if (vap->iv_opmode != IEEE80211_M_HOSTAP && vap->iv_opmode != IEEE80211_M_BTAMP) { vap->iv_stats.is_rx_mgtdiscard++; return -EINVAL; } wh = (struct ieee80211_frame *) wbuf_header(wbuf); frm = (u_int8_t *)&wh[1]; efrm = wbuf_header(wbuf) + wbuf_get_pktlen(wbuf); if (subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) { reassoc = 1; resp = IEEE80211_FC0_SUBTYPE_REASSOC_RESP; uranus_report_wireless_event(ni->ni_vap, ni, WEVENT_AUTH_STATUS_REASSOC_REQ); } else { reassoc = 0; resp = IEEE80211_FC0_SUBTYPE_ASSOC_RESP; } /* * asreq frame format * [2] capability information * [2] listen interval * [6*] current AP address (reassoc only) * [tlv] ssid * [tlv] supported rates * [tlv] extended supported rates * [tlv] WPA or RSN * [tlv] WME * [tlv] HT Capabilities * [tlv] Atheros capabilities */ IEEE80211_VERIFY_LENGTH(efrm - frm, (reassoc ? 10 : 4)); if (!IEEE80211_ADDR_EQ(wh->i_addr3, vap->iv_bss->ni_bssid)) { IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, wh, ieee80211_mgt_subtype_name[subtype >> IEEE80211_FC0_SUBTYPE_SHIFT], "%s\n", "wrong bssid"); vap->iv_stats.is_rx_assoc_bss++; uranus_report_wireless_event(ni->ni_vap, ni, WEVENT_AUTH_STATUS_ASSOC_FAILED); return -EINVAL; }
int ieee80211_recv_asreq(struct ieee80211_node *ni, wbuf_t wbuf, int subtype) { struct ieee80211com *ic = ni->ni_ic; struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_frame *wh; u_int8_t *frm, *efrm; u_int16_t capinfo, bintval; struct ieee80211_rsnparms rsn; u_int8_t reason; int reassoc, resp; u_int8_t *ssid, *rates, *xrates, *wpa, *wme, *ath, *htcap,*vendor_ie, *wps; u_int8_t *athextcap; if (vap->iv_opmode != IEEE80211_M_HOSTAP && vap->iv_opmode != IEEE80211_M_BTAMP) { vap->iv_stats.is_rx_mgtdiscard++; return -EINVAL; } wh = (struct ieee80211_frame *) wbuf_header(wbuf); frm = (u_int8_t *)&wh[1]; efrm = wbuf_header(wbuf) + wbuf_get_pktlen(wbuf); if (subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) { reassoc = 1; resp = IEEE80211_FC0_SUBTYPE_REASSOC_RESP; /*zhaoyang1 transplant from 717*/ /*pengruofeng add start for management frame stats 2011-5-9*/ vap->iv_stats.is_rx_reassoc++; /*pengruofeng add end 2011-5-9*/ /*zhaoyang1 transplant end*/ } else { reassoc = 0; resp = IEEE80211_FC0_SUBTYPE_ASSOC_RESP; } /* * asreq frame format * [2] capability information * [2] listen interval * [6*] current AP address (reassoc only) * [tlv] ssid * [tlv] supported rates * [tlv] extended supported rates * [tlv] WPA or RSN * [tlv] WME * [tlv] HT Capabilities * [tlv] Atheros capabilities */ IEEE80211_VERIFY_LENGTH(efrm - frm, (reassoc ? 10 : 4)); if (!IEEE80211_ADDR_EQ(wh->i_addr3, vap->iv_bss->ni_bssid)) { IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, wh, ieee80211_mgt_subtype_name[subtype >> IEEE80211_FC0_SUBTYPE_SHIFT], "%s\n", "wrong bssid"); /*zhaoyang1 transplant from 717*/ /*pengruofeng add start for management frame stats 2011-5-9*/ if (reassoc) { vap->iv_stats.is_rx_reassoc_bss++; } else { vap->iv_stats.is_rx_assoc_bss++; } /*pengruofeng add end 2011-5-9*/ /*zhaoyang1 transplant end*/ return -EINVAL; }
A_STATUS wlan_parse_beacon(A_UINT8 *buf, int framelen, struct ieee80211_common_ie *cie, A_UINT8 phy_mode) /* Bug 82893 */ { A_UINT8 *frm, *efrm; A_UINT8 elemid_ssid = FALSE; frm = buf; efrm = (A_UINT8 *) (frm + framelen); /* * beacon/probe response frame format * [8] time stamp * [2] beacon interval * [2] capability information * [tlv] ssid * [tlv] supported rates * [tlv] country information * [tlv] parameter set (FH/DS) * [tlv] erp information * [tlv] extended supported rates * [tlv] WMM * [tlv] WPA or RSN * [tlv] Atheros Advanced Capabilities */ IEEE80211_VERIFY_LENGTH(efrm - frm, 12); A_MEMZERO(cie, sizeof(*cie)); cie->ie_tstamp = frm; frm += 8; cie->ie_beaconInt = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2; cie->ie_capInfo = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2; cie->ie_chan = 0; while (frm < efrm) { switch (*frm) { case IEEE80211_ELEMID_SSID: if (!elemid_ssid) { cie->ie_ssid = frm; elemid_ssid = TRUE; } break; case IEEE80211_ELEMID_RATES: cie->ie_rates = frm; if (A_OK != check_phy_rates(cie->ie_rates, phy_mode)) /* Fix Bug 82893 */ return A_EINVAL; break; case IEEE80211_ELEMID_COUNTRY: cie->ie_country = frm; break; case IEEE80211_ELEMID_FHPARMS: break; case IEEE80211_ELEMID_DSPARMS: cie->ie_chan = frm[2]; break; case IEEE80211_ELEMID_TIM: cie->ie_tim = frm; break; case IEEE80211_ELEMID_IBSSPARMS: break; case IEEE80211_ELEMID_XRATES: cie->ie_xrates = frm; if (A_OK != check_phy_rates(cie->ie_xrates, phy_mode)) /* Fix Bug 82893 */ return A_EINVAL; break; case IEEE80211_ELEMID_ERP: if (frm[1] != 1) { //A_PRINTF("Discarding ERP Element - Bad Len\n"); return A_EINVAL; } cie->ie_erp = frm[2]; break; case IEEE80211_ELEMID_RSN: cie->ie_rsn = frm; break; #ifdef WAPI_ENABLE case IEEE80211_ELEMID_WAPI: cie->ie_wapi = frm; break; #endif /* WAPI_ENABLE */ case IEEE80211_ELEMID_VENDOR: if (iswpaoui(frm)) { cie->ie_wpa = frm; } else if (iswmmoui(frm)) { cie->ie_wmm = frm; } else if (isatherosoui(frm)) { cie->ie_ath = frm; } else if(iswscoui(frm)) { cie->ie_wsc = frm; } break; default: break; } frm += frm[1] + 2; } IEEE80211_VERIFY_ELEMENT(cie->ie_rates, IEEE80211_RATE_MAXSIZE); IEEE80211_VERIFY_ELEMENT(cie->ie_ssid, IEEE80211_NWID_LEN); return A_OK; }