Настройка Wi-Fi соединения во FreeBSD 8.0 при использовании NDIS-драйвера

vark аватар

Имеем ноутбук HP 2140 со встроенным Broadcom Wi-Fi с ревизией чипа 4315 (в Linux в логах россказни о 4312, но это враки). Родного драйвера под FreeBSD 8.0 нет, и неизвестно, когда появится - драйвер bwi от Paradox (http://paradox.lissyara.su/bwi.04b.tar.bz2 или /usr/src/sys/modules/bwi) данную ревизию чипа не поддерживает; в NetBSD и OpenBSD так же на данный момент этот чип не поддерживается.

Поэтому, есть только один выход - NDISulator, то есть - механизм конвертирования драйвера от Windows (XP) в модуль ядра для FreeBSD.

Для начала, добавим в конфиг ядра несколько опций:

options NDISAPI
device ndis

последующие опции и так есть в GENERIC-ядре, но проверим их наличие в нашем:

device wlan
options IEEE80211_DEBUG # enable debug msgs
options IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's
options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device firmware # firmware assist module

Так же можно подгрузить поддержку всех device через /boot/loader.conf или же вручную:

kldload /boot/kernel/wlan_xauth.ko

Этот модуль нам понадобится, если мы используем WPA/WPA2.

Итак, собираем ядро, или грузим модули - как угодно.

Далее создаем драйвер через NDISulator. Для этого из соотв. виндового драйвера выдираются файлики .sys и .inf, соответствующие нашей карточке (в моём случае - bcmwl5.sys и bcmwl5.inf). Складываем эти 2 файла в директорию /usr/src/sys/modules/if_ndis/ , и запускаем

root@hp2140:/usr/src/sys/modules/if_ndis# ndisgen bcmwl5.inf bcmwl5.sys

и следуя подсказкам программы на экране, в ответ на все вопросы жмём Enter.

В результате у нас получится файл-модуль ядра с именем bcmwl5_sys.ko, и мы переместим его, для нашего удобства, в директорию /boot/modules.

NB! Очень не советую прописывать загрузку сгенеренного через NDIS модуля в /boot/loader.conf - это 100% приведет к панике ядра при загрузке системы. Мы поступим немножко хитрее, а именно - создадим скрипты для поднятия соединения через Wi-Fi (3 скрипта - по одному на каждый тип шифрования), и из скрипта и будем подгружать модуль.

Подгружаем данный модуль и смотрим вывод ifconfig. Если появился девайс ndis0, запоминаем соответствующий ему MAC-адрес (см ниже, может пригодиться).

ndis0: flags=8803<UP,BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 2290
ether 00:21:32:06:1d:e0
media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)
status: no carrier

Но работать напрямую с этим устройством в FreeBSD 8.0 мы не можем, необходимо создать клонированное устройство, с помощью команды ifconfig wlan0 create wlandev ndis0 (далее опции, которые мы не сможем изменить НЕ на этапе создания устройства).

1. Точка доступа настроена в режиме без шифрования, с фильтрацией по MAC-адресу, IP выдается по DHCP:


root@hp2140:~# cat up_wifi_open.sh
#!/bin/sh
kldload /boot/modules/bcmwl5_sys.ko
ifconfig wlan0 create wlandev ndis0 country UA channel 1 ssid your-AP-name
ifconfig wlan0 up
dhclient wlan0

После запуска скрипта получаем:

ndis0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
ether 00:21:32:06:1d:e0
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g
status: associated
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:21:32:06:1d:e0
inet 10.0.9.100 netmask 0xffffff00 broadcast 10.0.9.255
media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g
status: associated
ssid your-AP-name channel 1 (2412 Mhz 11g) bssid 00:16:38:0b:e7:35
regdomain NONE country UA authmode OPEN privacy OFF powersavemode CAM
powersavesleep 100 txpower 30 bmiss 7 mcastrate 6 mgmtrate 6
scanvalid 60 protmode CTS

2. На точке доступа настроено WEP-шифрование, IP выдается по DHCP:


root@hp2140:~# cat up_wifi_wep.sh
#!/bin/sh
kldload /boot/modules/bcmwl5_sys.ko
kldload /boot/kernel/wlan_xauth.ko
ifconfig wlan0 create wlandev ndis0 country UA channel 1 ssid your-AP-name authmode shared deftxkey 1 wepmode mixed wepkey 1:0xc9ea80f602
ifconfig wlan0 up
dhclient wlan0

Строка настройки WEP бралась из свеженькго хендбука, но - с параметром wepmode on не завелось, зато забегало с wepmode mixed, хотя на некоторых карточках это - синонимы. Также, как утверждает man ifconfig, без обязательного указания deftxkey WEP не будет работать (тогда и в параметре wepkey значение ключа предваряем его индексом, который собственно и есть значение параметра deftxkey). Нужен или нет authmode shared - не совсем понятно, но значение shared соответствует именно WEP.

После запуска скрипта получаем:

ndis0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
ether 00:21:32:06:1d:e0
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g
status: associated
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:21:32:06:1d:e0
inet 10.0.9.100 netmask 0xffffff00 broadcast 10.0.9.255
media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g
status: associated
ssid your-AP-name channel 1 (2412 Mhz 11g) bssid 00:16:38:0b:e7:35
regdomain NONE country UA authmode SHARED privacy ON deftxkey 1
wepkey 1:40-bit txpower 30 bmiss 7 mcastrate 6 mgmtrate 6 scanvalid 60
protmode CTS

3. На точке доступа настроено шифрование WPA2-Personal (TKIP+AES), IP выдается по DHCP:


root@hp2140:~# cat up_wifi_wpa.sh
#!/bin/sh
kldload /boot/modules/bcmwl5_sys.ko
kldload /boot/kernel/wlan_xauth.ko
ifconfig wlan0 create wlandev ndis0 country UA channel 1 ssid your-AP-name authmode WPA
ifconfig wlan0 up
wpa_supplicant -i wlan0 -D ndis -s -c /etc/wpa_supplicant.conf &
dhclient wlan0

Использование wpa_supplicant тоже рекомендовано хендбуком, но - без опции -D ndis ничего не работало - карточка не видела AP; между прочим, в man wpa_supplicant этой опции просто нет! Сию опцию удалось выловить гуглением - http://forums.freebsd.org/showthread.php?t=2477&page=5
Опция -s указывает, что все отладочные сообщения от wpa_supplicant будут передаваться в syslog, а не выводиться на терминал.

Конфиг wpa_supplicant.conf довольно прост - у меня завелось с минимумом опций. Пароль можно как задать явно в виде ASCII-текста (см. закомментированную опцию), так и в виде 256-битного ключа, что делается с помощью утилиты wpa_passphrase (см. http://www.lissyara.su/articles/freebsd/trivia/wifi_wpa/ )


root@hp2140:~# wpa_passphrase your-AP-name secret_passwd > /etc/wpa_supplicant.conf

root@hp2140:~# cat /etc/wpa_supplicant.conf

network={
ssid="your-AP-name"
# psk="secret_passwd"
psk=e133c32ee890473285ac7e17e764de773606847b48ab08dc159c7f95dd6cb736
}

После запуска скрипта получаем:

ndis0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
ether 00:21:32:06:1d:e0
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g
status: associated
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:21:32:06:1d:e0
inet 10.0.9.100 netmask 0xffffff00 broadcast 10.0.9.255
media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g
status: associated
ssid your-AP-name channel 1 (2412 Mhz 11g) bssid 00:16:38:0b:e7:35
regdomain NONE country UA authmode WPA2/802.11i privacy OFF
txpower 30 bmiss 7 mcastrate 6 mgmtrate 6 scanvalid 60 protmode CTS
roaming MANUAL

Вот только почему показывает, что privacy OFF - непонятно…