Рейтинг:0

2 отправленных пакета имеют тег для vlan 10 и 20, один должен быть получен на сокете, созданном на eth1.10, а другой на сокете для eth1.20. Но этого не происходит

флаг cn

Пакеты, отправленные с тегом vlan 10 и 20, принимаются на обоих сокетах. Почему я получаю 4 пакета, в то время как было отправлено только 2 пакета, а также все полученные пакеты не помечены (без тега vlan)? В чем может быть проблема?

вот соответствующий код: Создать: sock = socket(AF_PACKET, SOCK_RAW, htons(MY_ETHTYPE));

memset(&if_opts, 0, sizeof(if_opts));
strncpy(if_opts.ifr_name, "eth1.10", IFNAMSIZ - 1);
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (void *)&if_opts, sizeof(if_opts);
ioctl(sock, SIOCGIFFLAGS, &if_opts);
if_opts.ifr_flags |= IFF_PROMISC;
ioctl(sock, SIOCSIFFLAGS, &if_opts);

setsockopt(носок, SOL_SOCKET, SO_BINDTODEVICE,
                  "эт1.10",
                  sizeof("eth1.10"));

Recv: size = recvfrom(sock, buf, BUF_SIZE, MSG_DONTWAIT, NULL, NULL);

David avatar
флаг cn
Вы не предоставили никакой информации о версии Ubuntu. Как вы отправляете эти пакеты, какие именно команды.
bobby avatar
флаг cn
Чтобы узнать версию, я использовал команду uname -srm. Вот дамп:
bobby avatar
флаг cn
Чтобы узнать версию, я использовал команду uname -srm. Вот дамп: Linux 4.19.0-xilinx-v2019.1 aarch64. Теперь для отправки пакетов: сокет создается с помощью sock = socket(AF_PACKET, SOCK_RAW, htons(MY_ETHTYPE)); пакет отправляется с dmac 0xffff.ffff.ffff, а smac — это mac локального интерфейса.Пакет помечен 0x8100000a или 0x81000014, ethertype — MY_ETHTYPE, за которым следует полезная нагрузка. Пакет отправляется вызовом sendto(xmtSock, buf, bufSize, 0, (struct sockaddr *)sa_raw, sizeof(sa_raw)); sa_raw содержит поля sll_ifindex, sll_halen и sll_addr.
David avatar
флаг cn
В нем нет информации о версии. Версия будет похожа на Ubuntu 18.04.
bobby avatar
флаг cn
Привет Дэвид, Какую команду я могу использовать, чтобы найти номер версии?
David avatar
флаг cn
Откройте терминал либо с помощью сочетания клавиш Ctrl+Alt+T, либо щелкнув значок терминала. Используйте команду lsb_release -a, чтобы отобразить версию Ubuntu. Ваша версия Ubuntu будет показана в строке описания. Кстати, быстрый поиск в Google мог бы дать вам эту информацию.
bobby avatar
флаг cn
lsb_release не поддерживался. Я нашел /etc/os-release после поиска в Google. Вот дамп: ID ="petalinux" Version="2019.1 (thud)". Я думаю, это означает, что это не Ubuntu. Но все же, если бы вы могли указать мне на изменения, которые могут потребоваться для того, чтобы аналогичный код работал на Ubuntu, я был бы очень признателен. Благодарность

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.