void ol_rx_err( ol_pdev_handle pdev, u_int8_t vdev_id, u_int8_t *peer_mac_addr, int tid, u_int32_t tsf32, enum ol_rx_err_type err_type, adf_nbuf_t rx_frame) { struct ieee80211_frame wh; struct ether_header *eh; struct ol_ath_softc_net80211 *scn ; struct ieee80211vap *vap; enum ieee80211_opmode opmode; A_BOOL notify = TRUE; eh = (struct ether_header *)adf_nbuf_data(rx_frame); scn = (struct ol_ath_softc_net80211 *)pdev; vap = ol_ath_vap_get(scn, vdev_id); if(vap == NULL) { printk("%s: vap is NULL \n", __func__); return; } opmode = ieee80211_vap_get_opmode(vap); if (err_type == OL_RX_ERR_TKIP_MIC) { /*TODO: Reconstructing the WLAN header for now from ether header * since WLAN header is not available for HL case. */ wh.i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh.i_dur[0] = wh.i_dur[1] = 0; wh.i_seq[0] = wh.i_seq[1] = 0; adf_os_mem_copy(&wh.i_addr1, &vap->iv_myaddr, IEEE80211_ADDR_LEN); adf_os_mem_copy(&wh.i_addr2, peer_mac_addr, IEEE80211_ADDR_LEN); if (opmode == IEEE80211_M_HOSTAP || opmode == IEEE80211_M_WDS) { wh.i_fc[1] = IEEE80211_FC1_DIR_TODS; adf_os_mem_copy(&wh.i_addr3, &eh->ether_dhost , IEEE80211_ADDR_LEN); } else if (opmode == IEEE80211_M_STA) { wh.i_fc[1] = IEEE80211_FC1_DIR_FROMDS; adf_os_mem_copy(&wh.i_addr3, &eh->ether_shost , IEEE80211_ADDR_LEN); } else { /*TODO: Handle other cases*/ notify = FALSE; } if (notify) { printk("%s: TKIP MIC failure \n",__func__); ieee80211_notify_michael_failure(vap,(const struct ieee80211_frame *)&wh,0); } } }
static void ath_handle_micerror(struct ieee80211com *ic, struct ieee80211_frame *wh, int keyix) { struct ieee80211_node *ni; /* XXX recheck MIC to deal w/ chips that lie */ /* XXX discard MIC errors on !data frames */ ni = ieee80211_find_rxnode(ic, (const struct ieee80211_frame_min *) wh); if (ni != NULL) { ieee80211_notify_michael_failure(ni->ni_vap, wh, keyix); ieee80211_free_node(ni); } }