Настройка MTU пространства имен сети в C по сравнению с утилитой «ip» с большими кадрами EthernetLinux

Anonymous
Настройка MTU пространства имен сети в C по сравнению с утилитой «ip» с большими кадрами Ethernet

Сообщение Anonymous »

У меня есть проект Linux C, который (среди прочих) отправляет (размером более 1500 байт) необработанные кадры Ethernet между сетевыми интерфейсами различных процессов. У меня есть несколько системных тестов, в которых эта функциональность проверяется с использованием сетевых пространств имен. У меня нет привычки допускать провалы тестов, поэтому пять лет назад все эти тесты прошли успешно.
Из-за разных приоритетов я оставил проект в покое в 2022 году и начал его несколько недель назад. Поэтому я запускаю системные тесты, которые написал для них, и все они проваливаются. Поэтому я начал расследование.
Я обнаружил, что все работает нормально, за исключением этих больших кадров Ethernet. Они в обязательном порядке вызывали код ошибки 105 или 90; коды ошибок, относящиеся к слишком большому размеру пакетов или слишком маленькому буферу. Я проверил свой код, и вроде бы он все делает правильно: он устанавливает MTU интерфейса с помощью обычных вызовов ioctl.

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

  ifr.ifr_mtu = 9000;
if (ioctl(rawsock, SIOCSIFMTU, (caddr_t)&ifr) < 0) {
DBGMSG("NETP Could not set MTU %u to device '%s'\n", mtu, device);
return -1;
}
Я даже это добавил:

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

  setsockopt(rawsock, SOL_SOCKET, SO_SNDBUF, (void*)&mtu, sizeof(mtu));
setsockopt(rawsock, SOL_SOCKET, SO_RCVBUF, (void*)&mtu, sizeof(mtu));
Ничего не получилось. Затем я просто установил MTU интерфейса в тестовом скрипте, используя «ip», и все снова заработало:

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

ip netns exec core2 ip link set core2red mtu 9000
Кто-нибудь знает, что здесь произошло? То есть я могу снова работать и развиваться над этим проектом, но меня это все равно беспокоит. Что произошло за последние пять лет, что установка MTU через C не так хороша, как то, что делает утилита ip?

Подробнее здесь: https://stackoverflow.com/questions/798 ... net-frames

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