Image missing.
libwifi: an 802.11 frame parsing and generation library written in C (2023)

created: Nov. 15, 2025, 10:16 p.m. | updated: Nov. 16, 2025, 6:39 p.m.

-lwifiParsingstatic int got_radiotap = 0; int main(int argc, const char *argv[]) { pcap_t handle = {0}; char errbuf[PCAP_ERRBUF_SIZE] = {0}; if ((handle = pcap_create(argv[2], errbuf)) == NULL) { exit(EXIT_FAILURE); } if (pcap_activate(handle) != 0) { pcap_close(handle); exit(EXIT_FAILURE); } int linktype = pcap_datalink(handle); if (linktype == DLT_IEEE802_11_RADIO) { got_radiotap = 1; } else if (linktype == DLT_IEEE802_11) { got_radiotap = 0; } else { pcap_close(handle); exit(EXIT_FAILURE); } pd = pcap_dump_open(handle, PCAP_SAVEFILE); pcap_loop(handle, -1 /*INFINITY*/, &parse_packet, (unsigned char *) pd); }libwifi_get_frame()struct libwifi_framevoid parse_packet(unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) { unsigned long data_len = header->caplen; unsigned char *data = (unsigned char *) packet; struct libwifi_frame frame = {0}; int ret = libwifi_get_wifi_frame(&frame, data, data_len, got_radiotap); if (ret != 0) { printf("[!] Error getting libwifi_frame: %d", ret); return; }libwifi_framelibwifi_parse_beacon()libwifi_parse_beacon()struct libwifi_bssif (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_BEACON) { struct libwifi_bss bss = {0}; int ret = libwifi_parse_beacon(&bss, &frame); if (ret != 0) { printf("Failed to parse beacon: %d", ret); return; } printf("SSID: %s, Channel: %d", bss.ssid, bss.channel); } }Generationlibwifi_create_beacon()int main(int argc, char **argv) { struct libwifi_beacon beacon = {0}; static unsigned char bcast[] = "\xFF\xFF\xFF\xFF\xFF\xFF"; static unsigned char tx[] = "\x00\x20\x91\xAA\xBB\CC"; int ret = libwifi_create_beacon(&beacon, bcast, tx, tx, "wifi-beacon", 11); if (ret != 0) { return ret; }pcap_dump()unsigned char *buf = NULL; size_t buf_sz = libwifi_get_beacon_length(&beacon); buf = malloc(buf_sz); if (buf == NULL) { exit(EXIT_FAILURE); } ret = libwifi_dump_beacon(&beacon, buf, buf_sz); if (ret < 0) { return ret; } // Inject frame bytes or write bytes to file libwifi_free_beacon(&beacon); free(buf); }libwifi exposes functions and structs to make parsing and generating WiFi frames very easy, and examples can be found in the source examples directory.When using libwifi, be sure to passto the linker, and make sure that the libwifi shared library is installed on the system.The generic flow of a program using libwifi to parse frames is a loop that reads captured packets as raw data, such as with libpcap from a file or monitor interface, then parse the frame into a common datatype, then parse again to retrieve frame specific data.The data from the libpcap loop is then given towhich checks for frame validity and type/subtype, and stores the data in aThestruct can then be given to one of the frame parser functions, such as. Since the header comment forindicates that the parsed data is stored in a, we need to initalise one and pass it as a parameter.We'll use the BSS struct to easily show the SSID and Channel from the sniffed beacon frame.For frame generation, you only need to provide the required data to one of the frame generation functions. In this example,From here, we can use the dumper function for this frame subtype to write the beacon in raw byte format to a buffer. This can be useful for writing the generated frame out to a pcap file usingor transmitting from a monitor mode interface.

2 days, 7 hours ago: Hacker News