50 uint32_t shb_type = 0x0A0D0D0A;
51 uint32_t shb_len = 28;
52 uint32_t magic = 0x1A2B3C4D;
55 int64_t section_len = -1;
57 memcpy(buffer + offset, &shb_type, 4); offset += 4;
58 memcpy(buffer + offset, &shb_len, 4); offset += 4;
59 memcpy(buffer + offset, &magic, 4); offset += 4;
60 memcpy(buffer + offset, &v_major, 2); offset += 2;
61 memcpy(buffer + offset, &v_minor, 2); offset += 2;
62 memcpy(buffer + offset, §ion_len, 8); offset += 8;
63 memcpy(buffer + offset, &shb_len, 4); offset += 4;
66 uint32_t idb_type = 0x00000001;
67 uint32_t idb_len = 20;
68 uint16_t link_type = 127;
69 uint16_t reserved = 0;
70 uint32_t snaplen = 65535;
72 memcpy(buffer + offset, &idb_type, 4); offset += 4;
73 memcpy(buffer + offset, &idb_len, 4); offset += 4;
74 memcpy(buffer + offset, &link_type, 2); offset += 2;
75 memcpy(buffer + offset, &reserved, 2); offset += 2;
76 memcpy(buffer + offset, &snaplen, 4); offset += 4;
77 memcpy(buffer + offset, &idb_len, 4); offset += 4;
82size_t writePcapngPacket(
const uint8_t* payload,
size_t payload_len, int8_t rssi, uint32_t ts_usec, uint8_t* buffer,
size_t max_len) {
83 uint8_t radiotap[8] = { 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 };
84 uint32_t cap_len = payload_len + 8;
85 uint32_t pkt_len = payload_len + 8;
86 uint32_t aligned_len = (cap_len + 3) & ~3;
87 uint32_t padding = aligned_len - cap_len;
88 uint32_t block_len = 32 + aligned_len;
90 if (block_len > max_len)
return 0;
93 uint32_t epb_type = 0x00000006;
94 uint32_t interface_id = 0;
96 uint32_t ts_low = ts_usec;
98 memcpy(buffer + offset, &epb_type, 4); offset += 4;
99 memcpy(buffer + offset, &block_len, 4); offset += 4;
100 memcpy(buffer + offset, &interface_id, 4); offset += 4;
101 memcpy(buffer + offset, &ts_high, 4); offset += 4;
102 memcpy(buffer + offset, &ts_low, 4); offset += 4;
103 memcpy(buffer + offset, &cap_len, 4); offset += 4;
104 memcpy(buffer + offset, &pkt_len, 4); offset += 4;
106 memcpy(buffer + offset, radiotap, 8); offset += 8;
107 memcpy(buffer + offset, payload, payload_len); offset += payload_len;
111 memcpy(buffer + offset, &zero, padding); offset += padding;
114 memcpy(buffer + offset, &block_len, 4); offset += 4;
122 uint32_t ts = millis() * 1000;
128 pkt[p++] = 0x80; pkt[p++] = 0x00; pkt[p++] = 0x00; pkt[p++] = 0x00;
129 for (
int i=0; i<6; i++) pkt[p++] = 0xFF;
130 memcpy(pkt + p, rec.
bssid, 6); p += 6;
131 memcpy(pkt + p, rec.
bssid, 6); p += 6;
132 pkt[p++] = 0x00; pkt[p++] = 0x00;
134 memset(pkt + p, 0, 8); p += 8;
135 pkt[p++] = 0x64; pkt[p++] = 0x00;
136 pkt[p++] = 0x11; pkt[p++] = 0x04;
138 pkt[p++] = 0x00; pkt[p++] = rec.
ssid_len;
140 pkt[p++] = 0x03; pkt[p++] = 0x01; pkt[p++] = rec.
channel;
142 size_t w =
writePcapngPacket(pkt, p, -50, ts++, buffer + offset, max_len - offset);
143 if (w == 0)
return offset;
150 pkt[p++] = 0x08; pkt[p++] = 0x02; pkt[p++] = 0x00; pkt[p++] = 0x00;
151 memcpy(pkt + p, rec.
sta, 6); p += 6;
152 memcpy(pkt + p, rec.
bssid, 6); p += 6;
153 memcpy(pkt + p, rec.
bssid, 6); p += 6;
154 pkt[p++] = 0x00; pkt[p++] = 0x00;
155 pkt[p++] = 0x00; pkt[p++] = 0x00;
158 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
159 memcpy(pkt + p, snap, 8); p += 8;
162 pkt[p++] = 0x01; pkt[p++] = 0x03;
164 uint16_t eapol_len = 95 + 22;
165 pkt[p++] = (eapol_len >> 8); pkt[p++] = (eapol_len & 0xFF);
168 uint8_t eapolPayload[95] = {0};
169 eapolPayload[0] = 0x02;
170 eapolPayload[1] = 0x00; eapolPayload[2] = 0x8A;
171 eapolPayload[5] = 0x00; eapolPayload[6] = 0x00; eapolPayload[7] = 0x00; eapolPayload[8] = 0x00;
172 eapolPayload[9] = 0x00; eapolPayload[10] = 0x00; eapolPayload[11] = 0x00; eapolPayload[12] = 0x01;
174 eapolPayload[93] = 0x00; eapolPayload[94] = 0x16;
176 memcpy(pkt + p, eapolPayload, 95); p += 95;
179 pkt[p++] = 0xDD; pkt[p++] = 0x14; pkt[p++] = 0x00; pkt[p++] = 0x0F; pkt[p++] = 0xAC; pkt[p++] = 0x04;
180 memcpy(pkt + p, rec.
pmkid, 16); p += 16;
182 size_t w =
writePcapngPacket(pkt, p, -50, ts++, buffer + offset, max_len - offset);
183 if (w == 0)
return offset;
191 pkt[p++] = 0x08; pkt[p++] = 0x02; pkt[p++] = 0x00; pkt[p++] = 0x00;
192 memcpy(pkt + p, rec.
sta, 6); p += 6;
193 memcpy(pkt + p, rec.
bssid, 6); p += 6;
194 memcpy(pkt + p, rec.
bssid, 6); p += 6;
195 pkt[p++] = 0x00; pkt[p++] = 0x00;
196 pkt[p++] = 0x00; pkt[p++] = 0x00;
198 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
199 memcpy(pkt + p, snap, 8); p += 8;
201 pkt[p++] = 0x01; pkt[p++] = 0x03;
202 uint16_t eapol_len = 95;
203 pkt[p++] = (eapol_len >> 8); pkt[p++] = (eapol_len & 0xFF);
205 uint8_t eapolPayload[95] = {0};
206 eapolPayload[0] = 0x02;
207 eapolPayload[1] = 0x00; eapolPayload[2] = 0x8A;
208 eapolPayload[12] = 0x01;
209 memcpy(&eapolPayload[13], rec.
anonce, 32);
211 memcpy(pkt + p, eapolPayload, 95); p += 95;
213 size_t w =
writePcapngPacket(pkt, p, -50, ts++, buffer + offset, max_len - offset);
214 if (w == 0)
return offset;
221 pkt[p++] = 0x08; pkt[p++] = 0x01; pkt[p++] = 0x00; pkt[p++] = 0x00;
222 memcpy(pkt + p, rec.
bssid, 6); p += 6;
223 memcpy(pkt + p, rec.
sta, 6); p += 6;
224 memcpy(pkt + p, rec.
bssid, 6); p += 6;
225 pkt[p++] = 0x00; pkt[p++] = 0x00;
226 pkt[p++] = 0x00; pkt[p++] = 0x00;
228 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
229 memcpy(pkt + p, snap, 8); p += 8;
237 size_t w =
writePcapngPacket(pkt, p, -50, ts++, buffer + offset, max_len - offset);
238 if (w == 0)
return offset;