#ifndef FRAME_PARSER_H #define FRAME_PARSER_H #include #include #include /** * @brief 802.11 Frame types */ typedef enum { FRAME_TYPE_MANAGEMENT = 0, FRAME_TYPE_CONTROL = 1, FRAME_TYPE_DATA = 2, FRAME_TYPE_RESERVED = 3 } wifi_frame_type_t; /** * @brief Parsed 802.11 frame information (similar to ESP32 wifi_frame_info_t) */ typedef struct { // Frame Control uint16_t frame_control; uint8_t type; uint8_t subtype; bool to_ds; bool from_ds; bool retry; // Duration/ID (NAV) uint16_t duration_id; // MAC Addresses uint8_t addr1[6]; // Receiver Address (RA) uint8_t addr2[6]; // Transmitter Address (TA) uint8_t addr3[6]; // BSSID/SA/DA uint8_t addr4[6]; // Optional Address 4 bool has_addr4; // Sequence Control uint16_t seq_ctrl; uint16_t fragment_num; uint16_t sequence_num; // PHY info (from radiotap header if available) int8_t rssi; uint8_t mcs; uint8_t spatial_streams; // NSS uint8_t bandwidth; // 0=20MHz, 1=40MHz, 2=80MHz, 3=160MHz bool sgi; // Short Guard Interval uint32_t phy_rate_kbps; // Frame size uint16_t frame_len; } wifi_frame_info_t; /** * @brief Parse 802.11 frame header * @param packet Raw packet data (including radiotap header if present) * @param len Packet length * @param frame_info Output: parsed frame information * @return 0 on success, -1 on error */ int parse_80211_frame(const uint8_t *packet, size_t len, wifi_frame_info_t *frame_info); /** * @brief Get human-readable frame type name */ const char *get_frame_type_name(uint8_t type, uint8_t subtype); /** * @brief Print frame information (for verification/comparison with ESP32) */ void print_frame_info(const wifi_frame_info_t *frame_info, uint64_t timestamp_us); #endif /* FRAME_PARSER_H */