# Packet Dump (декодирование IP-пакетов) ## 1. Назначение Вспомогательный модуль для диагностики: парсит сырой IPv4-пакет и формирует человекочитаемую строку с IP-адресами, протоколом, портами, флагами и hex-дампом первых 32 байт payload. Используется только в отладочных логах (категории `TUN`, `ROUTING`) для трассировки проходящих через TUN пакетов. ## 2. Как пользоваться ```c #include "packet_dump.h" // packet_data указывает на начало IPv4-заголовка const uint8_t* packet_data = ...; size_t len = ...; char* str = dump_ip_packet_to_buffer(packet_data, len); DEBUG_DEBUG(DEBUG_CATEGORY_TUN, "[TUN->] %s", str); ``` **Важно:** функция возвращает указатель на статический буфер (1024 байта). Не thread-safe. Каждый вызов перезаписывает предыдущий результат. ### Примеры вывода ``` IPv4 TCP 192.168.1.5:443 -> 10.0.0.2:54321 (1420 bytes) [ACK,PSH] seq=123456 ack=789012 win=64240 data: 1703012345... IPv4 UDP 10.0.0.1:53 -> 192.168.1.3:45678 (76 bytes) len=56 data: 4500003c... IPv4 ICMP 10.0.0.1 -> 8.8.8.8 (84 bytes) echo_request seq=1 id=1234 data: 08004d2c... IPv4 ICMP 8.8.8.8 -> 10.0.0.1 (84 bytes) echo_reply seq=1 id=1234 data: 0000552c... ``` ## 3. API ### Функции **`dump_ip_packet_to_buffer(data, len)`** — парсит IPv4-заголовок и заголовок транспортного уровня, возвращает строку вида `IPv4 PROTO SRC:PORT -> DST:PORT (SIZE bytes) DETAILS data: HEX...`. Параметры: - `data` — указатель на начало IPv4-пакета - `len` — полная длина данных - Возвращает `static char[1024]` Обрабатываемые протоколы: - **TCP (6):** порты, seq/ack, флаги (FIN, SYN, RST, PSH, ACK, URG, ECE, CWR), window - **UDP (17):** порты, длина - **ICMP (1):** тип/code, echo_request/echo_reply с seq и id Для нераспознанных протоколов выводит `src_ip:0 -> dst_ip:0` и 32 байта payload (может выйти за границы пакета — диагностический код, безопасностью жертвует в пользу информативности). Hex-дамп: 32 байта транспортного payload (начиная с `data[ihl]`), 4 группы по 8 байт. **`tcp_flags_to_str(flags)`** (static) — преобразует байт TCP-флагов в строку вида `SYN,ACK` или `none`. ### Где используется - `tun_if.c` — логирование пакетов из/в TUN-интерфейс (категория `TUN`, уровень `DEBUG`) - `tun_windows.c` — то же для Windows - `routing.c` — логирование маршрутизируемых пакетов (категория `ROUTING`, уровень `DEBUG`) ### Зависимости - `platform_compat.h` — порядок байт (не используется в текущей реализации, IP-адреса читаются напрямую как LE) - Стандартная библиотека: ``, ``