fiwi_monitor/src/frame_parser.h

77 lines
1.9 KiB
C

#ifndef FRAME_PARSER_H
#define FRAME_PARSER_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
/**
* @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 */