# ARP Monitoring (ESP-IDF / Linux TAP) Практическая работа по анализу и модификации сетевого стека **lwIP** в **ESP-IDF**. Проект перехватывает входящие ARP-пакеты, хранит обнаруженные узлы в оперативной памяти, показывает их во встроенном веб-интерфейсе и позволяет проверять выбранные адреса с помощью ICMP Echo (Ping). Рабочая конфигурация проверена на **ESP-IDF v6.0.2** с использованием целевой платформы Linux и TAP-интерфейса без физической платы ESP32. Сборка прошивки для **ESP32** также выполнена успешно; запуск на физической плате пока не проверялся. ## Структура проекта | Модуль | Назначение | | --- | --- | | `patches/lwip/etharp.c` | Изменённый файл lwIP с перехватом ARP в `etharp_input()` | | `patches/lwip/prepare.py` | Подготавливает lwIP из ESP-IDF в каталоге сборки с рабочими исправлениями | | `cmake/prepare_lwip.cmake` | Подключает подготовленную библиотеку при сборке Linux и ESP32 | | `components/arp_monitor` | Принимает IP/MAC из lwIP через очередь FreeRTOS | | `components/device_list` | Хранит до 64 найденных устройств в RAM | | `components/web_server` | GET `/` показывает таблицу; POST `/` запускает Ping с возвратом на главную | | `components/ping` | Запускает стандартный `esp_ping` для выбранных узлов | | `patches/protocol_examples_tapif_io` | Исправленные `tapif.c` и `tapif.h` для TAP-компонента ESP-IDF v6.0.2 | | `cmake/tapif_patch.cmake` | Подставляет исправленные файлы при сборке Linux | | `main/main.c` | Инициализирует компоненты и вызывает `example_connect()` | | `main/idf_component.yml` | Подключает TAP-компонент для Linux или `protocol_examples_common` для платы из ESP-IDF | Путь входящего пакета: 1. Сетевой интерфейс (TAP при тестировании на Linux) передаёт Ethernet-кадр в lwIP. 2. `ethernet_input()` определяет тип кадра `ETHTYPE_ARP` и вызывает `etharp_input()` из `patches/lwip/etharp.c`. 3. После разбора ARP-заголовка `etharp_input()` вызывает `arp_monitor_report()` с IP- и MAC-адресом отправителя. 4. `arp_monitor_report()` копирует данные в неблокирующую очередь FreeRTOS. 5. Задача `arp_monitor_task` обновляет статический массив `device_list` в RAM. 6. HTTP-обработчик читает актуальный список и формирует HTML-таблицу. ## Веб-интерфейс ![Веб-интерфейс ARP Monitoring](docs/web-interface.png) ## Примечание Проект проверен в работе на Linux/TAP. Прошивка для ESP32 успешно собирается, но на самой плате пока не запускалась. Изменённый `etharp.c` хранится в `patches/lwip`. Библиотека lwIP автоматически подготавливается из ESP-IDF v6.0.2 в каталоге сборки. Хранить её в `components` или вручную восстанавливать после клонирования не нужно. TAP-компонент берётся из ESP-IDF с исправлениями из `patches/protocol_examples_tapif_io`.