использование Windows-драйверов сетевых устройств под FreeBSD

Как-то раз нужно было мне настроить поддержку железки D-Link DWL-G520+ под FreeBSD. А как извесно во FreeBSD, начиная с 5 ветки, имеется такая вещь, как NDIS (для тех кто не в курсе - это эмулятор для Windows-драйверов, из *.sys & *.ini фаилов...).
Поставил я FreeBSD-5.3-generic и взял диск D-Link DWL-G520+ c набором XP-шных драйверов в составе:

- FwRad16.bin;
- FwRad17.bin;
- GPLUS.inf;
- GPLUS.sys.

Скопировал я эти файлы в /usr/src/d-link (вы можете копировать их куда хотите, это не имеет значения).
Затем заходим в каталог с NDIS:
#cd /usr/src/sys/modules/if_ndis

Создаём запускающий фаил ndis_driver_data.h:
#ndiscvt -i /usr/src/d-link/GPLUS.inf -s usr/src/d-link/GPLUS.sys -o ndis_driver_data.h

Заходим в каталог с NDIS-файлами для компиляции:
#cd /usr/src/sys/dev/if_ndis/

Правим файлы if_ndis.c, if_ndis_pccard.c и if_ndis_pci.c на предмет замены в них строчки
#include "ndis_driver_data.h"


на
#include "/usr/src/sys/modules/if_ndis/ndis_driver_data.h"

В конфиге ядра прописываем:
options NDISAPI
device ndis
device wlan

Затем я написал скрипт для rc.d, который положил, как вы могли догадаться, в /usr/local/etc/rc.d. Скрипт назвал ndis_run.sh. Вот что он у меня собой представляет:
#!/bin/sh
sleep 5
kldload ndis
sleep 5
ifconfig 172.16.0.2 netmask 255.255.255.0 ssid mu_ssid up
sleep 5
route add default 172.16.0.1

Прошу иметь в виду, что строчка – нужна только если в конфиге ядра нет "options NDISAPI" и "device ndis", если есть - не пишите эту строчку! Вероятно можно запускать как-то еще, однако и так ничего ;)
Когда начинает подгружаться скрипт, то пишется что-то наврое «нет *.bin и не могу загрузить». Решение:
#mkdir /compat/ndis
#cp /usr/src/d-link/FwRad16.bin /compat/ndis
#cp /usr/src/d-link/FwRad17.bin /compat/ndis

Перезагружаемся.
#kldstat -v|grep ndis

Результат выполнения этой команды должен быть таким:
112 ndisapi
119 pci/ndis
120 cardbus/ndis

Если все прошло нормально, то дальше ifconfig отдаст устроиство как ndis0.
Минусы подхода (думаю, легко устраняемо после внимательного изучения процесса загрузки и сборки ядра):

1. Скрипт /etc/rc.network отрабатывается раньше, чем запустится драйвер ndis0, что мешает конфигурить логические составляющие интерфейса типа SSID и IP-адреса посредством прописывания оных в /etc/rc.conf.
Выход - настраивать все в /etc/rc.local, что не есть правильно.

2. Неупорядоченность самого процесса сборки. Думаю, при правильном размещении ndis_driver_data.h и\или написании добротного патчика к соответствующим Makefile'ам все будет гораздо изящнее.



sypper-pit. Благодарен за помощь Madzhara ака OF462M-2.¶



Сетевые решения. Статья была опубликована в номере 03 за 2005 год в рубрике sysadmin

©1999-2024 Сетевые решения