79#ifndef POLITICIAN_NO_PCAPNG
83 uint32_t shb_type = 0x0A0D0D0A;
84 uint32_t shb_len = 28;
85 uint32_t magic = 0x1A2B3C4D;
88 int64_t section_len = -1;
90 memcpy(buffer + offset, &shb_type, 4); offset += 4;
91 memcpy(buffer + offset, &shb_len, 4); offset += 4;
92 memcpy(buffer + offset, &magic, 4); offset += 4;
93 memcpy(buffer + offset, &v_major, 2); offset += 2;
94 memcpy(buffer + offset, &v_minor, 2); offset += 2;
95 memcpy(buffer + offset, §ion_len, 8); offset += 8;
96 memcpy(buffer + offset, &shb_len, 4); offset += 4;
99 uint32_t idb_type = 0x00000001;
100 uint32_t idb_len = 20;
101 uint16_t link_type = 127;
102 uint16_t reserved = 0;
103 uint32_t snaplen = 65535;
105 memcpy(buffer + offset, &idb_type, 4); offset += 4;
106 memcpy(buffer + offset, &idb_len, 4); offset += 4;
107 memcpy(buffer + offset, &link_type, 2); offset += 2;
108 memcpy(buffer + offset, &reserved, 2); offset += 2;
109 memcpy(buffer + offset, &snaplen, 4); offset += 4;
110 memcpy(buffer + offset, &idb_len, 4); offset += 4;
119size_t writePcapngPacket(
const uint8_t* payload,
size_t payload_len, int8_t rssi, uint8_t channel, uint64_t ts_usec, uint8_t* buffer,
size_t max_len) {
120#ifndef POLITICIAN_NO_PCAPNG
122 uint16_t chan_flags = 0;
124 freq = 2407 + (channel * 5);
125 if (channel == 14) freq = 2484;
128 freq = 5000 + (channel * 5);
132 uint8_t radiotap[14] = {
135 0x28, 0x00, 0x00, 0x00,
136 (uint8_t)(freq & 0xFF), (uint8_t)(freq >> 8),
137 (uint8_t)(chan_flags & 0xFF), (uint8_t)(chan_flags >> 8),
142 uint32_t rt_len = 14;
143 uint32_t cap_len = (uint32_t)payload_len + rt_len;
144 uint32_t pkt_len = (uint32_t)payload_len + rt_len;
145 uint32_t aligned_pkt_len = (cap_len + 3) & ~3;
146 uint32_t pkt_padding = aligned_pkt_len - cap_len;
149 uint32_t opt_len = 20;
150 uint32_t block_len = 32 + aligned_pkt_len + opt_len;
152 if (block_len > max_len)
return 0;
155 uint32_t epb_type = 0x00000006;
156 uint32_t interface_id = 0;
157 uint32_t ts_high = (uint32_t)(ts_usec >> 32);
158 uint32_t ts_low = (uint32_t)(ts_usec & 0xFFFFFFFF);
160 memcpy(buffer + offset, &epb_type, 4); offset += 4;
161 memcpy(buffer + offset, &block_len, 4); offset += 4;
162 memcpy(buffer + offset, &interface_id, 4); offset += 4;
163 memcpy(buffer + offset, &ts_high, 4); offset += 4;
164 memcpy(buffer + offset, &ts_low, 4); offset += 4;
165 memcpy(buffer + offset, &cap_len, 4); offset += 4;
166 memcpy(buffer + offset, &pkt_len, 4); offset += 4;
168 memcpy(buffer + offset, radiotap, rt_len); offset += rt_len;
169 memcpy(buffer + offset, payload, payload_len); offset += payload_len;
171 if (pkt_padding > 0) {
172 memset(buffer + offset, 0, pkt_padding); offset += pkt_padding;
176 uint16_t opt_code; uint16_t opt_vlen;
179 opt_code = 0x8001; opt_vlen = 1;
180 memcpy(buffer + offset, &opt_code, 2); offset += 2;
181 memcpy(buffer + offset, &opt_vlen, 2); offset += 2;
182 buffer[offset++] = (uint8_t)rssi;
183 memset(buffer + offset, 0, 3); offset += 3;
186 opt_code = 0x8002; opt_vlen = 1;
187 memcpy(buffer + offset, &opt_code, 2); offset += 2;
188 memcpy(buffer + offset, &opt_vlen, 2); offset += 2;
189 buffer[offset++] = channel;
190 memset(buffer + offset, 0, 3); offset += 3;
193 opt_code = 0x0000; opt_vlen = 0;
194 memcpy(buffer + offset, &opt_code, 2); offset += 2;
195 memcpy(buffer + offset, &opt_vlen, 2); offset += 2;
197 memcpy(buffer + offset, &block_len, 4); offset += 4;
201 (void)payload; (void)payload_len; (void)rssi; (void)channel; (void)ts_usec; (void)buffer; (void)max_len;
207#ifndef POLITICIAN_NO_PCAPNG
210 uint64_t ts = (uint64_t)
millis() * 1000;
216 pkt[p++] = 0x80; pkt[p++] = 0x00; pkt[p++] = 0x00; pkt[p++] = 0x00;
217 for (
int i=0; i<6; i++) pkt[p++] = 0xFF;
218 memcpy(pkt + p, rec.
bssid, 6); p += 6;
219 memcpy(pkt + p, rec.
bssid, 6); p += 6;
220 pkt[p++] = 0x00; pkt[p++] = 0x00;
222 memset(pkt + p, 0, 8); p += 8;
223 pkt[p++] = 0x64; pkt[p++] = 0x00;
224 pkt[p++] = 0x11; pkt[p++] = 0x04;
226 pkt[p++] = 0x00; pkt[p++] = rec.
ssid_len;
228 pkt[p++] = 0x03; pkt[p++] = 0x01; pkt[p++] = rec.
channel;
231 if (w == 0)
return offset;
238 pkt[p++] = 0x08; pkt[p++] = 0x02; pkt[p++] = 0x00; pkt[p++] = 0x00;
239 memcpy(pkt + p, rec.
sta, 6); p += 6;
240 memcpy(pkt + p, rec.
bssid, 6); p += 6;
241 memcpy(pkt + p, rec.
bssid, 6); p += 6;
242 pkt[p++] = 0x00; pkt[p++] = 0x00;
243 pkt[p++] = 0x00; pkt[p++] = 0x00;
246 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
247 memcpy(pkt + p, snap, 8); p += 8;
250 pkt[p++] = 0x01; pkt[p++] = 0x03;
252 uint16_t eapol_len = 95 + 22;
253 pkt[p++] = (eapol_len >> 8); pkt[p++] = (eapol_len & 0xFF);
256 uint8_t eapolPayload[95] = {0};
257 eapolPayload[0] = 0x02;
258 eapolPayload[1] = 0x00; eapolPayload[2] = 0x8A;
259 eapolPayload[5] = 0x00; eapolPayload[6] = 0x00; eapolPayload[7] = 0x00; eapolPayload[8] = 0x00;
260 eapolPayload[9] = 0x00; eapolPayload[10] = 0x00; eapolPayload[11] = 0x00; eapolPayload[12] = 0x01;
262 eapolPayload[93] = 0x00; eapolPayload[94] = 0x16;
264 memcpy(pkt + p, eapolPayload, 95); p += 95;
267 pkt[p++] = 0xDD; pkt[p++] = 0x14; pkt[p++] = 0x00; pkt[p++] = 0x0F; pkt[p++] = 0xAC; pkt[p++] = 0x04;
268 memcpy(pkt + p, rec.
pmkid, 16); p += 16;
271 if (w == 0)
return offset;
278 pkt[p++] = 0xB0; pkt[p++] = 0x00; pkt[p++] = 0x00; pkt[p++] = 0x00;
279 memcpy(pkt + p, rec.
bssid, 6); p += 6;
280 memcpy(pkt + p, rec.
sta, 6); p += 6;
281 memcpy(pkt + p, rec.
bssid, 6); p += 6;
282 pkt[p++] = 0x00; pkt[p++] = 0x00;
285 pkt[p++] = 0x03; pkt[p++] = 0x00;
286 pkt[p++] = rec.
sae_seq; pkt[p++] = 0x00;
287 pkt[p++] = 0x00; pkt[p++] = 0x00;
290 if (rec.sae_len > 0) {
291 memcpy(pkt + p, rec.sae_data, rec.sae_len);
296 if (w == 0)
return offset;
304 pkt[p++] = 0x08; pkt[p++] = 0x02; pkt[p++] = 0x00; pkt[p++] = 0x00;
305 memcpy(pkt + p, rec.
sta, 6); p += 6;
306 memcpy(pkt + p, rec.
bssid, 6); p += 6;
307 memcpy(pkt + p, rec.
bssid, 6); p += 6;
308 pkt[p++] = 0x00; pkt[p++] = 0x00;
309 pkt[p++] = 0x00; pkt[p++] = 0x00;
311 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
312 memcpy(pkt + p, snap, 8); p += 8;
314 pkt[p++] = 0x01; pkt[p++] = 0x03;
315 uint16_t eapol_len = 95;
316 pkt[p++] = (eapol_len >> 8); pkt[p++] = (eapol_len & 0xFF);
318 uint8_t eapolPayload[95] = {0};
319 eapolPayload[0] = 0x02;
320 eapolPayload[1] = 0x00; eapolPayload[2] = 0x8A;
321 eapolPayload[12] = 0x01;
322 memcpy(&eapolPayload[13], rec.
anonce, 32);
324 memcpy(pkt + p, eapolPayload, 95); p += 95;
327 if (w == 0)
return offset;
332 if (rec.eapol_m2_len > 0) {
334 pkt[p++] = 0x08; pkt[p++] = 0x01; pkt[p++] = 0x00; pkt[p++] = 0x00;
335 memcpy(pkt + p, rec.
bssid, 6); p += 6;
336 memcpy(pkt + p, rec.
sta, 6); p += 6;
337 memcpy(pkt + p, rec.
bssid, 6); p += 6;
338 pkt[p++] = 0x00; pkt[p++] = 0x00;
339 pkt[p++] = 0x00; pkt[p++] = 0x00;
341 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
342 memcpy(pkt + p, snap, 8); p += 8;
344 memcpy(pkt + p, rec.eapol_m2, rec.eapol_m2_len); p += rec.eapol_m2_len;
347 if (w == 0)
return offset;
354 pkt[p++] = 0x08; pkt[p++] = 0x02; pkt[p++] = 0x00; pkt[p++] = 0x00;
355 memcpy(pkt + p, rec.
sta, 6); p += 6;
356 memcpy(pkt + p, rec.
bssid, 6); p += 6;
357 memcpy(pkt + p, rec.
bssid, 6); p += 6;
358 pkt[p++] = 0x00; pkt[p++] = 0x00;
359 pkt[p++] = 0x00; pkt[p++] = 0x00;
361 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
362 memcpy(pkt + p, snap, 8); p += 8;
367 if (w == 0)
return offset;
374 pkt[p++] = 0x08; pkt[p++] = 0x01; pkt[p++] = 0x00; pkt[p++] = 0x00;
375 memcpy(pkt + p, rec.
bssid, 6); p += 6;
376 memcpy(pkt + p, rec.
sta, 6); p += 6;
377 memcpy(pkt + p, rec.
bssid, 6); p += 6;
378 pkt[p++] = 0x00; pkt[p++] = 0x00;
379 pkt[p++] = 0x00; pkt[p++] = 0x00;
381 uint8_t snap[8] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E };
382 memcpy(pkt + p, snap, 8); p += 8;
387 if (w == 0)
return offset;
394 (void)rec; (void)buffer; (void)max_len;