Увеличение предельного MTU в Windows для чипа Realtek 8111B

Впервые опубликовано на форуме 2010-04-21, на сайте - 2011-03-06

Дано

Имеем следующие сетевые карточки (встроенными в материнку GA-MA790FX):

  • 02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
  • 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)

Ситуация в GNU/Linux

В Debian GNU/Linux с ядром версии 2.6.28.9:

rm@alpha:~$ sudo ifconfig eth0 mtu 7200
rm@alpha:~$ sudo ifconfig eth0 mtu 7201
SIOCSIFMTU: Invalid argument

Успешно смогли выставить MTU в 7200. Нас пингуют (без фрагментации пакетов) успешно:

rm@haru:~$ ping -M do -s 7172 alpha.i4
PING alpha.i4 (192.168.0.1) 7172(7200) bytes of data.
7180 bytes from alpha.i4 (192.168.0.1): icmp_seq=1 ttl=64 time=0.990 ms

Ситуация в Windows

В Windows 7, с новейшей версией драйверов. Ставим в свойствах сетевой карты “7KB MTU”. Нам говорят мол, “угу”, всё нормально. По факту, максимальный размер кадра, которым пингуется этот компьютер будучи запущенным под Windows - “круглое число” MTU 4082. На байт больше - и всё, пакеты теряются. Налицо искусственное ограничение в Windows-драйвере.

Исправление

Изучение .inf-файла к драйверу показало, что для данных девайсов VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_01 нынешними версиями драйверов в реестр прописываются значения Jumbo Packets до 4096 байт, а то, что у меня там была возможность выбрать 7168 - это, видимо, осталось после установки старых версий. Однако это не страшно, берём и добавляем нужное значение вручную:

Дальше - интереснее. Нагугленный где-то Realtek_Windows_Vista_Driver_Adv_Properties.htm сообщает самый главный секрет:

2KB MTU : MTU is 2*1024 bytes
3KB MTU : MTU is 3*1024 bytes
4KB MTU : MTU is 4*1024 bytes
5KB MTU : MTU is 5*1024 bytes
6KB MTU : MTU is 6*1024 bytes
7KB MTU : MTU is 7*1024 bytes
<...>
Althrough, the Advanced page has Disable, 2KB MTU, 3KB MTU, ... 7KB MTU.
Driver will not enable the option which exceeds the NIC hardware limitation.
If exceeds, driver automatically decreases the length to a proper value.

Прогоняем sys-файл драйвера через дизассемблер (objdump). В получившемся листинге находим таблицу соответствий различных чипов и размеров кадра, на которые по мнению драйвера данные чипы способны. Ориентир для поиска - hex-значения 0x2400 (9 КБ), 0x1c00 (7 КБ) и 0x1000 (4 КБ), находящиеся в непосредственной близости друг от друга (в пределах пары экранов листинга). Находим, затем меняем ровно один байт:

Устанавливаем драйвер, подписываем с помощью полезной программы dseo13b.exe.

После перезагрузки проверяем - размер кадра до (7154+14=)7168 байт отлично выставляется и без всяких проблем работает! :)

P.S. Если в сети есть GNU/Linux-машины, для корректного общения с этой виндовой на них нужно сделать ifconfig eth0 mtu 7154.

Ссылки


r8169-windows-mtu.txt · Last modified: 2011-03-06 16:43 UTC by rm