Отправка необработанных пакетов обратно в сетевой стек хостаLinux

Ответить
Anonymous
 Отправка необработанных пакетов обратно в сетевой стек хоста

Сообщение Anonymous »

Я пишу стек TCP/IP для встраиваемых систем, но мне хотелось протестировать его на своей хост-системе.
Первоначально я попробовал использовать Tap0 + мост. Но я быстро понял, что разумнее всего будет привязаться к устройству Ethernet.

Код: Выделить всё

    // devname is "eth0"

fd = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) ); // or AF_PACKET/IPPROTO_RAW / PF_PACKET/htons(ETH_P_ALL)
struct ifreq if_idx;
memset(&if_idx, 0, sizeof(struct ifreq));
strncpy(if_idx.ifr_name, devname, IFNAMSIZ-1);
if (ioctl(fd, SIOCGIFINDEX, &if_idx) < 0)
Error

struct sockaddr_ll socket_address = {
.sll_ifindex = if_idx.ifr_ifindex,
.sll_halen = 0,
.sll_family = AF_PACKET,
.sll_protocol = htons(ETH_P_ALL),
.sll_hatype = 0,
.sll_pkttype = PACKET_BROADCAST,
};

if ( bind( fd, (const struct sockaddr*)&socket_address, sizeof( socket_address ) ) < 0 )
Error
Затем я тоже попробовал это (похоже, это не требуется, за исключением перевода сетевой карты в беспорядочный режим)

Код: Выделить всё

    // https://stackoverflow.com/questions/10070008/reading-from-pf-packet-sock-raw-with-read-misses-packets MAYBE?
struct packet_mreq mr = {
.mr_ifindex = socket_address.sll_ifindex,
.mr_type = PACKET_MR_PROMISC,
};
if (setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) {
FAIL( "Error setting packet membership\n" );
}

struct ifreq ifr = { 0 };
strncpy(ifr.ifr_name, devname, IFNAMSIZ-1);
if( ioctl( fd, SIOCGIFHWADDR, &ifr ) < 0 )
Error

memcpy( mymac, (char*)ifr.ifr_hwaddr.sa_data, 6 );
int rv = setsockopt( fd, SOL_SOCKET, SO_BINDTODEVICE, devname, strlen(devname) );
Я могу легко получать пакеты с помощью read() и могу отвечать с помощью write() или send(), и все отлично работает с другими компьютерами в сети. Но когда моя локальная машина отправляет пакеты моего стека IP, стек получает сообщения и пытается отправить их обратно. Я также вижу эти ответы в Wireshark при мониторинге устройства... но система (пользовательское пространство/пространство ядра) не видит пакеты.
Я специально пробовал использовать sendto() с различными адресами sockaddr_ll, и, похоже, мне не удалось добиться сбоя, но тем не менее моя локальная система не получает ни одного пакета локально.
Что мне не хватает? Как мне отправить пакеты из программы C на локальный сетевой интерфейс и сделать так, чтобы моя локальная система их видела?
Сейчас я даже не могу заставить свою локальную систему видеть ответы arp.

Подробнее здесь: https://stackoverflow.com/questions/798 ... king-stack
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»