интерфейс Ethernet в Linux отбрасывает пакеты
Я пытаюсь захватить некоторые кадры Ethernet с Linux. Некоторые из этих пакетов / кадров являются недействительными и содержат поврежденные данные.
Например, кадр Ethernet содержит тип 0x0800, который является IPv4, но следующие данные содержат только случайные байты. Кроме того, MAC-адрес источника и получателя неизвестен и не предсказуем.
Чтобы получить эти кадры, я написал программу на C, которая сначала использовала необработанные сокеты. Это не сработало, как ожидалось, поэтому я перешел на libpcap.
Я открываю устройство Ethernet в случайном режиме, чтобы получить все кадры и предотвратить фильтрацию по MAC-адресу. Это работает просто отлично. Я могу получать кадры с любым MAC-адресом назначения.
Теперь мы подошли к большой проблеме:
Я отправляю кадр Ethernet со случайным назначением и исходным MAC-адресом. поле Тип - 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.
0 ответов на вопрос
Похожие вопросы
-
9
В чем разница между командами "su -s" и "sudo -s"?
-
4
Требуется хороший бесплатный образ Ubuntu Server VMWare
-
4
Каковы различия между основными дистрибутивами Linux? Я замечу?
-
-
2
Ограничить использование процессора для Flash в Firefox?
-
2
Как мне заставить мой микрофон работать под Debian GNOME?
-
2
Конки установки - образцы / идеи?
-
3
Каковы различия между оконными менеджерами Linux?
-
2
ThunderBird / Синхронизация освещения с SE k770i
-
4
Файловая система Linux
-
6
Полноэкранная медленная вспышка в KDE 4