This is an old revision of the document!
Увеличение предельного 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:
<code>rm@alpha:~$ sudo ifconfig eth0 mtu 7200
rm@alpha:~$ sudo ifconfig eth0 mtu 7201
SIOCSIFMTU: Invalid argument</code>
Успешно смогли выставить MTU в 7200. Нас пингуют (без фрагментации пакетов) успешно:
<code>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</code>
===== Ситуация в 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 сообщает самый главный секрет:
<code>
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.</code>
Прогоняем sys-файл драйвера через дизассемблер (objdump
). В получившемся листинге находим таблицу соответствий различных чипов и размеров кадра, на которые по мнению драйвера данные чипы способны. Ориентир для поиска - hex-значения 0x2400
(9 КБ), 0x1c00
(7 КБ) и 0x1000
(4 КБ), находящиеся в непосредственной близости друг от друга (в пределах пары экранов листинга). Находим, затем меняем ровно один байт:
Устанавливаем драйвер, подписываем с помощью полезной программы dseo13b.exe.
После перезагрузки проверяем - размер кадра до (7154+14=)7168 байт отлично выставляется и без всяких проблем работает! :)
P.S. Если в сети есть GNU/Linux-машины, для корректного общения с этой виндовой на них нужно сделать ifconfig eth0 mtu 7154
.
===== Ссылки =====
* Обсуждение на форуме iXBT