Я пытаюсь захватить некоторые кадры Ethernet с Linux. Некоторые из этих пакетов / кадров являются недействительными и содержат поврежденные данные.
Например, кадр Ethernet содержит тип 0x0800, который является IPv4, но следующие данные содержат только случайные байты. Кроме того, MAC-адрес источника и получателя неизвестен и не предсказуем.
Чтобы получить эти кадры, я написал программу на C, которая сначала использовала необработанные сокеты. Это не сработало, как ожидалось, поэтому я перешел на libpcap.
Я открываю устройство Ethernet в случайном режиме, чтобы получить все кадры и предотвратить фильтрацию по MAC-адресу. Это работает просто отлично. Я могу получать кадры с любым MAC-адресом назначения.
Теперь мы подошли к большой проблеме:
Я отправляю кадр Ethernet со случайным назначением и исходным MAC-адресом. поле Type равно 0x1234, а данные - всего несколько байтов, скажем, 0xdeadbeef. Это дополняется до минимального количества полезной нагрузки. Этот кадр получен моей программой, использующей libpcap просто отлично.
Когда я отправляю тот же кадр, используя "известное" значение поля типа Ethernet, например 0x0800, кадр сбрасывается, и моя программа не может его получить.
Программное обеспечение работает на встроенной платформе, Altera Cyclone V SoC с модулем Ethernet STMMAC. На обычном ПК / ноутбуке и т.д. Программа работает нормально и может даже получать эти недопустимые кадры IPv4.
Чтобы узнать, где отбрасываются пакеты, я посмотрел файлы /sy/class/net/eth0/statistics/rx_*
. Есть файлы, которые подсчитывают количество полученных пакетов и байтов, а также количество отброшенных пакетов. эти статистические данные работают нормально с обычным трафиком Ethernet. Однако отправка неверного кадра, как описано выше, не приводит к каким-либо изменениям статистики. Водитель даже не считает счетчик пропущенных кадров. Я не могу этого понять, потому что, насколько я знаю, статистика сетевого интерфейса затрагивается, как только аппарат получает пакет. Процесс фильтрации и оценки сетевого стека не должен иметь к этому никакого отношения. Я прав? Поэтому мне кажется, что какой-то действительно низкий код драйвера фильтрует эти пакеты или, может быть, даже само оборудование.
Опять же: с обычным ПК на другой стороне пакеты могут быть получены с помощью программы, которую я написал.
Вторая проблема связана с действительными пакетами TCP:
Хотя я использую libpcap, который предоставляет мне необработанный трафик, полученные TCP-пакеты повторно собираются в огромные пакеты, которые даже больше, чем MTU принимающего сетевого интерфейса. эти пакеты также обычно принимаются с ПК.
Может кто-нибудь мне помочь? Мне нужно получать сырой Ethernet-трафик "как есть", используя Linux на платформе Altera SoC-FPGA.