void wcom_neighbors_v_receive_msg( wcom_mac_addr_t *addr, wcom_mac_rx_options_t *options, uint8_t *data, uint8_t len ){ // get message uint8_t *type = data; // get version field uint8_t *version = type + 1; // check protocol version if( *version != WCOM_NEIGHBOR_PROTOCOL_VERSION ){ return; } // process message if( *type == WCOM_NEIGHBOR_MSG_TYPE_BEACON ){ process_beacon( (wcom_msg_beacon_t *)type, addr, options ); } else if( *type == WCOM_NEIGHBOR_MSG_TYPE_FLASH ){ process_flash( (wcom_msg_flash_t *)type, addr, options ); } else if( *type == WCOM_NEIGHBOR_MSG_TYPE_THUNDER ){ process_thunder( (wcom_msg_thunder_t *)type, addr, options ); } else if( *type == WCOM_NEIGHBOR_MSG_TYPE_EVICT ){ process_evict( (wcom_msg_evict_t *)type, addr, options ); } }
static void process_packet(void *packet, const int len) { struct ieee80211_frame *wh = (struct ieee80211_frame *) packet; #if 0 printf("GOT %d\n", len); hexdump(packet, len); #endif if (len < (int) sizeof(*wh)) return; switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { case IEEE80211_FC0_TYPE_MGT: switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { case IEEE80211_FC0_SUBTYPE_BEACON: process_beacon(wh, len); break; case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: grab_hidden_ssid(wh->i_addr3, wh, len, 2 + 2); break; case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: grab_hidden_ssid(wh->i_addr3, wh, len, 2 + 2 + 6); break; case IEEE80211_FC0_SUBTYPE_PROBE_RESP: grab_hidden_ssid(wh->i_addr3, wh, len, 8 + 2 + 2); break; } break; case IEEE80211_FC0_TYPE_DATA: process_data(wh, len); break; } }