Как вы отправляете кадр Ethernet с поврежденной FCS? - PullRequest
8 голосов
/ 07 апреля 2009

Я не уверен, возможно ли это вообще, поскольку это может быть обработано аппаратно, но мне нужно отправить некоторые кадры Ethernet с ошибками в них. Я хотел бы иметь возможность создавать ошибки, отклонения и плохие ошибки FCS. Я работаю в Python.

Ответы [ 4 ]

9 голосов
/ 07 апреля 2009

Это можно обрабатывать аппаратно, но не всегда - и даже если это так, вы можете отключить это; см. параметры разгрузки ethtool .

Что касается получения полного контроля над создаваемыми вами кадрами - посмотрите PF_PACKET (для одного подхода) или драйвер крана (для другого).

Вот статья о , в которой используется PF_PACKET для отправки вручную созданных фреймов из Python .

4 голосов
/ 17 июня 2011

Во-первых, вы отключаете контрольную сумму вашей карты Ethernet:

sudo ethtool -K eth1 tx off

Затем вы отправляете поврежденные кадры из python:

#!/usr/bin/env python

from socket import *

#
# Ethernet Frame:
# [
#   [ Destination address, 6 bytes ]
#   [ Source address, 6 bytes      ]
#   [ Ethertype, 2 bytes           ]
#   [ Payload, 40 to 1500 bytes    ]
#   [ 32 bit CRC chcksum, 4 bytes  ]
# ]
#

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth1", 0))
src_addr = "\x01\x02\x03\x04\x05\x06"
dst_addr = "\x01\x02\x03\x04\x05\x06"
payload = ("["*30)+"PAYLOAD"+("]"*30)
checksum = "\x00\x00\x00\x00"
ethertype = "\x08\x01"
s.send(dst_addr+src_addr+ethertype+payload+checksum)

См. Аналогичный вопрос

3 голосов
/ 02 декабря 2011

попробуйте использовать scapy для python, есть примеры для генерации гигантских фреймов, а также фреймы runt. http://www.dirk -loss.de / scapy-док / usage.html

2 голосов
/ 19 сентября 2014

Программа не работала так, как мне предназначалось, чтобы генерировать ошибки 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 также должны работать. Если вы не используете ни одну из этих карт, эта опция сокета, вероятно, будет недоступна.

...