/*----------------------------------------------------------------------------*/ void handle_packet(packet_t* p) { if (p->info.rssi >= conf.rssi_min && p->header.net == conf.my_net){ if (p->header.typ == BEACON){ PRINTF("[PHD]: Beacon\n"); handle_beacon(p); } else { if (is_my_address(&(p->header.nxh))){ switch (p->header.typ){ case DATA: PRINTF("[PHD]: Data\n"); handle_data(p); break; case RESPONSE: PRINTF("[PHD]: Response\n"); handle_response(p); break; case OPEN_PATH: PRINTF("[PHD]: Open Path\n"); handle_open_path(p); break; case CONFIG: PRINTF("[PHD]: Config\n"); handle_config(p); break; default: PRINTF("[PHD]: Request/Report\n"); handle_report(p); break; } } } } else { packet_deallocate(p); } }
/*---------------------------------------------------------------------------*/ int handler_802154_frame_received(frame802154_t *frame) { if(answer_beacon_requests && frame->fcf.frame_type == FRAME802154_CMDFRAME && frame->payload[0] == FRAME802154_BEACONREQ) { others_beacon_reply = 0; ctimer_set(NULL, &beacon_send_timer, CLOCK_SECOND / 16 + (CLOCK_SECOND * (random_rand() & 0xff)) / 0x200, &handle_beacon_send_timer, NULL); return 1; } if(frame->fcf.frame_type == FRAME802154_BEACONFRAME) { HANDLER_802154_STAT(handler_802154_stats.beacons_received++); handle_beacon(frame); return 1; } return 0; }
/** * ieee802_11_mgmt - process incoming IEEE 802.11 management frames * @hapd: hostapd BSS data structure (the BSS to which the management frame was * sent to) * @buf: management frame data (starting from IEEE 802.11 header) * @len: length of frame data in octets * @fi: meta data about received frame (signal level, etc.) * * Process all incoming IEEE 802.11 management frames. This will be called for * each frame received from the kernel driver through wlan#ap interface. In * addition, it can be called to re-inserted pending frames (e.g., when using * external RADIUS server as an MAC ACL). */ void ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, struct hostapd_frame_info *fi) { struct ieee80211_mgmt *mgmt; int broadcast; u16 fc, stype; mgmt = (struct ieee80211_mgmt *) buf; fc = le_to_host16(mgmt->frame_control); stype = WLAN_FC_GET_STYPE(fc); if (stype == WLAN_FC_STYPE_BEACON) { handle_beacon(hapd, mgmt, len, fi); return; } broadcast = mgmt->bssid[0] == 0xff && mgmt->bssid[1] == 0xff && mgmt->bssid[2] == 0xff && mgmt->bssid[3] == 0xff && mgmt->bssid[4] == 0xff && mgmt->bssid[5] == 0xff; if (!broadcast && os_memcmp(mgmt->bssid, hapd->own_addr, ETH_ALEN) != 0) { printf("MGMT: BSSID=" MACSTR " not our address\n", MAC2STR(mgmt->bssid)); return; } if (stype == WLAN_FC_STYPE_PROBE_REQ) { handle_probe_req(hapd, mgmt, len); return; } if (os_memcmp(mgmt->da, hapd->own_addr, ETH_ALEN) != 0) { hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "MGMT: DA=" MACSTR " not our address", MAC2STR(mgmt->da)); return; } switch (stype) { case WLAN_FC_STYPE_AUTH: wpa_printf(MSG_DEBUG, "mgmt::auth"); handle_auth(hapd, mgmt, len); break; case WLAN_FC_STYPE_ASSOC_REQ: wpa_printf(MSG_DEBUG, "mgmt::assoc_req"); handle_assoc(hapd, mgmt, len, 0); break; case WLAN_FC_STYPE_REASSOC_REQ: wpa_printf(MSG_DEBUG, "mgmt::reassoc_req"); handle_assoc(hapd, mgmt, len, 1); break; case WLAN_FC_STYPE_DISASSOC: wpa_printf(MSG_DEBUG, "mgmt::disassoc"); handle_disassoc(hapd, mgmt, len); break; case WLAN_FC_STYPE_DEAUTH: wpa_printf(MSG_DEBUG, "mgmt::deauth"); handle_deauth(hapd, mgmt, len); break; case WLAN_FC_STYPE_ACTION: wpa_printf(MSG_DEBUG, "mgmt::action"); handle_action(hapd, mgmt, len); break; default: hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "unknown mgmt frame subtype %d", stype); break; } }