Приветствую, русское сообщество :) По работе стало необходимо получать/отправлять пакеты 1530 байт (соответственно, 1548 и больше байт ethernet кадры) на моем ноутбуке. Карточка следующая: 03:00.0 Ethernet controller: Broadcom Corporation BCM4401-B0 100Base-TX (rev 02) В драйвере b44.c жестко прописаны макросы: #define B44_MAX_MTU 1500 #define RX_PKT_BUF_SZ (1536 + RX_PKT_OFFSET) и проверка в функции приема кадра: if ((len > (RX_PKT_BUF_SZ - RX_PKT_OFFSET)) ... drop_it: Из этого вижу, что можно уставить максимум MTU 1500 и принять ethernet кадр до 1536 байт. Вопрос второстепенный: может ли кто-то объяснить, почему по умолчанию выделяется 1536 байт? Понятно, что предусматриваются теги 802.1Q, MPLS метки и тп. Но подобный функционал зашит во множество сетевого оборудования и это критично для сети провайдера. Просто хочется понять... Мною были выполнены следующие действия: - B44_MAX_MTU увеличено до 1530 - RX_PKT_BUF_SZ увеличено до (1548 + RX_PKT_OFFSET) После этого сетевуха работает нормально с пакетами 1530 байт по обычной ethernet сети. Теперь основной вопрос: есть ли какие-то подводные камни подобного решения (пока рассматриваю заголовок ethernet 18байт) и, если все работает, почему в ядре стоит жесткое ограничение на 1500 байт? Буду рад услышать ответы/мнения/предположения. Спасибо.
Немного поэкспериментировал с драйвером b44. Кому интересно или нужна поддержка пакетов больше 1500 байт можно читать дальше :) Из документации BCM440X Programmer's Reference Guide следует, что максимальный размер буфера под кадр - 0x1000 байт. Указание большего размера приводит к "ошибке протокола" (стр. 39 гайда). Поэтому в коде b44.c в поле дескриптора записывается значение (RX_PKT_BUF_SZ & 0x1fff). Все буферы выделяются с размером RX_PKT_BUF_SZ без проверок и ограничений. Т.е. значение RX_PKT_BUF_SZ можно править до максимально поддерживаемого карточкой и все должно работать (в идеале). Мне удалось добиться максимального размера кадра 2047 (в отлиции от предполагаемого 4096). Это MTU 2029 без дополнительных тегов и заголовков. При чем 2048 - это 0x800, тип протокола IP в ethernet заголовке. Может это просто совпадение... Итого, для изменения максимального MTU нужно изменить в b44.c B44_MAX_MTU и установить RX_PKT_BUF_SZ равное как минимум (B44_MAX_MTU + 18 + RX_PKT_OFFSET). Но нельзя устанавливать RX_PKT_BUF_SZ в значение больше 0x1000. Это приведет к непредсказуемому поведению. Причиной тому обнуление старших бит RX_PKT_BUF_SZ вместо проверки на превышение 0x1000, при инициализации дескрипторов рингов. 3 мая 2012 г., 15:05 пользователь Dmitry Podgorny <pasis.ua@gmail.com> написал:
Приветствую, русское сообщество :)
По работе стало необходимо получать/отправлять пакеты 1530 байт (соответственно, 1548 и больше байт ethernet кадры) на моем ноутбуке. Карточка следующая: 03:00.0 Ethernet controller: Broadcom Corporation BCM4401-B0 100Base-TX (rev 02)
В драйвере b44.c жестко прописаны макросы: #define B44_MAX_MTU 1500 #define RX_PKT_BUF_SZ (1536 + RX_PKT_OFFSET) и проверка в функции приема кадра: if ((len > (RX_PKT_BUF_SZ - RX_PKT_OFFSET)) ... drop_it:
Из этого вижу, что можно уставить максимум MTU 1500 и принять ethernet кадр до 1536 байт.
Вопрос второстепенный: может ли кто-то объяснить, почему по умолчанию выделяется 1536 байт? Понятно, что предусматриваются теги 802.1Q, MPLS метки и тп. Но подобный функционал зашит во множество сетевого оборудования и это критично для сети провайдера. Просто хочется понять...
Мною были выполнены следующие действия:
B44_MAX_MTU увеличено до 1530 RX_PKT_BUF_SZ увеличено до (1548 + RX_PKT_OFFSET)
После этого сетевуха работает нормально с пакетами 1530 байт по обычной ethernet сети. Теперь основной вопрос: есть ли какие-то подводные камни подобного решения (пока рассматриваю заголовок ethernet 18байт) и, если все работает, почему в ядре стоит жесткое ограничение на 1500 байт?
Буду рад услышать ответы/мнения/предположения. Спасибо.
participants (1)
-
Dmitry Podgorny