Программа не работала так, как мне предназначалось, чтобы генерировать ошибки FCS.
Сетевой драйвер снова добавил правильную контрольную сумму в конце сгенерированного кадра. Конечно, вполне возможно, что решение работает на некоторых картах, но я уверен, что не с любой из Intel. (Это также работает без каких-либо изменений в ethtool для меня.)
Как минимум с сетевой картой Intel e1000e вам нужно внести небольшие изменения в приведенный выше код:
Добавьте следующую строку после «s = socket (AF_PACKET, SOCK_RAW)»:
s.setsockopt(SOL_SOCKET,43,1)
Это указывает драйверу NIC на использование опции «SO_NOFCS», определенной в socket.h, и отправку кадра без вычисления и добавления FCS.
Вас также может заинтересовать следующая C-программа, которая показала мне, как это сделать: http://markmail.org/thread/eoquixklsjgvvaom
Но имейте в виду, что программа не будет работать на последних ядрах без небольших изменений.
SOL_SOCKET, кажется, изменил числовой идентификатор с 42 на 43 в прошлом.
По словам первоначального автора, эта функция должна быть доступна по крайней мере для следующих драйверов: e100, e1000 и e1000e. Быстрый grep в исходных текстах ядра 3.16.0 указывает, что ixgbe igb и i40e также должны работать. Если вы не используете ни одну из этих карт, эта опция сокета, вероятно, будет недоступна.