Pfsense #1 — Fix Realtek Drivers 8168/8111. Путь самурая к успеху.
Я столкнулся с проблемой на роутере с сетухой Realtek, что при нагрузке, сеть начинает флапать, и в логах это видно вот так:
re0: watchdog timeout
re0: link state changed to DOWN
re0: link state changed to UP
re0: watchdog timeout
re0: link state changed to DOWN
re0: link state changed to UP
А на графике вот так:


Сеть сначала начинает пропадать и появляться, а потом, просто виснет наглухо до ребута роутера. Советы вида — disable offload не помогли. Что делать?

Что еще пишут западные коллеги:
Replacing the card with another Realtek card did not help.
Replacing the Realtek card with an Intel card did solve all problems.
Это, конечно, все отлично, когда вы можете заменить сетевую карту на другую А если нет?
На форумах, эта проблема известна со времен версии 11.1


Железка у меня — Qotom Q150P-S08 (Intel Celeron N3160 @1.6GHz 4 ядра, 2GB DDR3L, 32GB SSD).
Есть 2 пути решения проблемы:
- Быстрый — скачать готовый if_re.ko и залить его в /boot/kernel, не забыв подредактировать /boot/loader.conf, добавив в конец файла
if_re_load="YES
"
- Путь самурая — собрать самому из исходников, кто знает, может через месяц обновлений Pfsense 2.5.X п.1 будет неактуален?
Какая у вас модель сетевухи на Pfsense можно узнать командой:sysctl -a | grep -E 'dev.(igb|ix|em|re).*.%desc:'
Получите вывод вида: dev.re.0.%desc: RealTek 8168/8111 B/C/CP/D/DP/E/F/G PCIe Gigabit Ethernet
Компилим драйвер из исходников
- Тестил на Pfsense’е этой версии (FreeBSD 12.0-RELEASE-p8 FreeBSD 12.0-RELEASE-p8 2ffab8b5708(RELENG_2_5) pfSense amd64)
- Ставим FreeBSD 12.0, компилить драйвер будем в ней, т.к. в Pfsense компилятора нет и вы получите ошибку (
make: "/usr/share/mk/bsd.compiler.mk" line 157: Unable to determine compiler type for CC=cc. Consider setting COMPILER_TYPE
) - Скачиваем пак с исходниками исправленных драйверов
- Скачиваем
src.txz
из (спустя какое-то время эта ссылка поменяется, т.к. выйдут новые релизы и т.д., но смысл понятен).
ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/12.0-RELEASE/ - Закидываем src.txz в /tmp
- Распаковываем архив
tar -C / -xvf /tmp/src.txz
(если не залить исходники, то вы получите ошибку Unable to locate the kernel source tree. Set SYSDIR to override.) - Файлы из пака с исходниками исправленных драйверов закидываем в /boot/kernel
- Переходим в /boot/kernel
- Компилим драйвер командой make
- Получаем вывод как ниже:
root@freebsd:/boot/modules # make
machine -> /usr/src/sys/amd64/include
x86 -> /usr/src/sys/x86/include
:> opt_bdg.h
awk -f /usr/src/sys/tools/makeobjops.awk /usr/src/sys/kern/device_if.m -h
awk -f /usr/src/sys/tools/makeobjops.awk /usr/src/sys/kern/bus_if.m -h
awk -f /usr/src/sys/tools/makeobjops.awk /usr/src/sys/dev/pci/pci_if.m -h
Warning: Object directory not changed from original /boot/modules
cc -O2 -pipe -fno-strict-aliasing -Werror -D_KERNEL -DKLD_MODULE -nostdinc -I. -I/usr/src/sys -I/usr/src/sys/contrib/ck/include -fno-common -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -MD -MF.depend.if_re.o -MTif_re.o -mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -msoft-float -fno-asynchronous-unwind-tables -ffreestanding -fwrapv -fstack-protector -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=__freebsd_kprintf__ -Wmissing-include-dirs -fdiagnostics-show-option -Wno-unknown-pragmas -Wno-error-tautological-compare -Wno-error-empty-body -Wno-error-parentheses-equality -Wno-error-unused-function -Wno-error-pointer-sign -Wno-error-shift-negative-value -Wno-address-of-packed-member -mno-aes -mno-avx -std=iso9899:1999 -c if_re.c -o if_re.o
ld -m elf_x86_64_fbsd -d -warn-common --build-id=sha1 -r -d -o if_re.ko if_re.o
:> export_syms
awk -f /usr/src/sys/conf/kmod_syms.awk if_re.ko export_syms | xargs -J% objcopy % if_re.ko
objcopy --strip-debug if_re.ko
root@freebsd:/boot/modules #
- Подготавливаем драйвер make install (меняем права, владельца и тд.). Ну, или, руками выставляем права / владельца.
root@freebsd:/boot/modules # make install
install -T release -o root -g wheel -m 555 if_re.ko /boot/modules/
kldxref /boot/modules


- Переходим в наш Pfsense
- Переносим if_re.ko из /boot/modules (из FreeBSD 12) в /boot/kernel (нашего Pfsense)
- Редактируем файл /boot/loader.conf и добавляем в конец файла
if_re_load="YES"
, сохраняем. Должно получиться что-то типа:
kern.cam.boot_delay=10000
if_re_load="YES"
autoboot_delay="3"
hw.usb.no_pf="1"
net.pf.request_maxcount="400000"
- Ребутаем Pfsense
- Проверяем через команду kldstat, что нет ошибок и драйвера загрузились. Должно получится, как ниже:
Id Refs Address Size Name
1 14 0xffffffff80200000 3123108 kernel
2 1 0xffffffff83324000 7cce0 if_re.ko
3 1 0xffffffff83411000 fe0 cpuctl.ko
4 1 0xffffffff83412000 7ec0 aesni.ko
5 1 0xffffffff8341a000 3110 cryptodev.ko
6 1 0xffffffff8341e000 b98 coretemp.ko
- Если что-то пошло не так, то вы увидите ошибку (KLD if_re.ko: depends on kernel — not available or version mismatch linker_load_file: /boot/kernel/if_re.ko — unsupported file type). Это значит, что вы пытались подпихнуть драйвер от версии FreeBSD 11.1 и т.д. Этот лог видно будет через команду dmesg.
После всех работ — проверяем. Отлично, отвала сети не наблюдается!

Полезные ссылочки
https://blog.volobuev.su/zamena-vmware-tools-na-open-vm-tools-na-freebsd/
https://download.freebsd.org/ftp/releases/VM-IMAGES/12.0-RELEASE/amd64/Latest/
https://forum.netgate.com/topic/133536/official-realtek-driver-v1-95-binary
https://gist.github.com/jovimon/524e116471f249626fd2ccd141f3fe05
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=166724