Re: Jumbo frames для драйвера b44
Dmitry Podgorny
pasis.ua at gmail.com
Wed Oct 3 14:12:43 EDT 2012
Немного поэкспериментировал с драйвером 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 at 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 байт?
>
> Буду рад услышать ответы/мнения/предположения.
> Спасибо.
More information about the Kernel-russian
mailing list