Разве так должен работать wpa_supplicant!? [SOLVED]
Всё уже работает, но разумеется и очевидно, что работает не так, как надо. А теперь всё сначала и по-порядку...
Исходные данные такие: ноутбук Samsung Q45c модель FY01. Не трудитесь, я типа пионэр, спасибо супруге ;) На данный момент уже имею stage4 ~x86 с ядром 2.6.25-tuxonice-r4. Железо и hibernate (через ACPI S4) настроил практически всё.
PROMPT> lspci -vnn
08:00.0 Ethernet controller [0200]: Atheros Communications Inc. AR242x 802.11ab$
Subsystem: Askey Computer Corp. Device [144f:7131]
Flags: bus master, fast devsel, latency 0, IRQ 5
Memory at d0200000 (64-bit, non-prefetchable) [=64K]
Capabilities: [40] Power Management version 2
Capabilities: [50] Message Signalled Interrupts: Mask- 64bit- Queue=0/0$
Capabilities: [60] Express Legacy Endpoint, MSI 00
Capabilities: [90] MSI-X: Enable- Mask- TabSize=1
Kernel modules: ath_pci
Ну очень нехороший чип 168c:001c (rev 01). Через ndiswrapper с прилагаемыми дровами работать не хотел. MadWifi из портов его тоже не опознаёт (неизвестное устройство). Единственный способ подхватить эту железку - установить MadWifi из оверлея со специальным патчем от Atheros, что я и сделал.
Сначала всё делалось для архитектуры x86_64, но дойдя до wifi, обнаружилось, что это единственный способ подхватить железку и работает он ТОЛЬКО с x86!!! :( Экспериментальным путём установлена "рабочая" последовательность загрузки модулей (в /etc/conf.d/modules пропишу потом):
PROMPT> modprobe wlan_tkip
PROMPT> modprobe ath_rate_amrr
PROMPT> modprobe wlan_scan_ap
PROMPT> modprobe ath_hal
PROMPT> modprobe ath_pci
В результате, оно видеццо:
PROMPT> dmesg|tail -n25
ACPI: PCI interrupt for device 0000:00:14.2 disabled
wlan: trunk
ath_rate_amrr: no version for "ieee80211_iterate_nodes" found: kernel tainted.
ath_rate_amrr: 0.1 (trunk)
ath_hal: module license 'Proprietary' taints kernel.
ath_hal: 0.10.2.2-ATHEROS (AR5210, AR5211, AR5212, AR5416, RF5111, RF5112, RF2413, RF5413, RF2133, RF2425)
ath_pci: trunk
ACPI: PCI Interrupt 0000:08:00.0[A] -> GSI 18 (level, low) -> IRQ 18
PCI: Setting latency timer of device 0000:08:00.0 to 64
MadWifi: ath_attach: HAL managed transmit power control (TPC) disabled.
MadWifi: ath_attach: Interference mitigation is supported. Currently disabled.
MadWifi: ath_attach: Switching rfkill capability off.
ath_rate_sample: 1.2 (trunk)
wifi0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
wifi0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
wifi0: H/W encryption support: WEP AES AES_CCM TKIP
wifi0: ath_announce: Use hw queue 1 for WME_AC_BE traffic
wifi0: ath_announce: Use hw queue 0 for WME_AC_BK traffic
wifi0: ath_announce: Use hw queue 2 for WME_AC_VI traffic
wifi0: ath_announce: Use hw queue 3 for WME_AC_VO traffic
wifi0: ath_announce: Use hw queue 4 for XR traffic
wifi0: ath_announce: Use hw queue 7 for UAPSD traffic
wifi0: ath_announce: Use hw queue 8 for CAB traffic
wifi0: ath_announce: Use hw queue 9 for beacons
ath_pci: wifi0: Atheros 5424/2424: mem=0xd0200000, irq=18
Ну, эта... результат эксперимента со стеками WiFi в ЯДРЕ, верну потом на новый:
ath_rate_amrr: no version for "ieee80211_iterate_nodes" found: kernel tainted.
Простая домашняя защита - WPA-PSK, TKIP, скрытый SSID, привязка к BSSID (AP mac), привязка к mac клиента на AP:
PROMPT> cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
update_config=1
network={
ssid="MyHomeAP"
bssid=00:21:a7:f3:72:54
proto=WPA
key_mgmt=WPA-PSK
pairwise=TKIP
group=TKIP
psk="my very big secret text ;)"
priority=5
}
Оно работает!
PROMPT> rm -rf /var/run/wpa_*
PROMPT> wpa_supplicant -iath0 -Dmadwifi -dd -c/etc/wpa_supplicant/wpa_supplicant.conf
На экране виден подробный отчёт о происходящем, успешная авторизация происходит довольно быстро. Переходим на другую консоль и запускаем:
dhcpcd ath0
И о чудо, я в инете! Работает всё стабильно часами. Даже если выключить антенну и включить - связь возобновляется, качаются большие файлы, скорость 54M, делается emerge world :-) Очевидно, что что-то не так...
Если всё прибить, выгрузить и вернуться к шагу после загрузки модулей, смотрим, как настроена и работает автоматика (baselayout2+openrc):
PROMPT> cat /etc/conf.d/net
wpa_supplicant_ath0="-Dmadwifi -dd -c/etc/wpa_supplicant/wpa_supplicant.conf"
config_ath0="dhcp"
PROMPT> /etc/init.d/net.ath0 start
* WARNING: net.ath0 has already started, but is inactive
PROMPT> /etc/init.d/net.ath0 stop
* Bringing down interface ath0
* Removing addresses
PROMPT> # /etc/init.d/net.ath0 start
* Bringing up interface ath0
* Starting wpa_supplicant on ath0 ... [ ok ]
* Starting wpa_cli on ath0 ... [ ok ]
* Backgrounding ... ...
* WARNING: net.ath0 has started, but is inactive
PROMPT> ping -c1 rbc.ru
ping: unknown host rbc.ru
ifconfig ip, разумеется, не показывает :( Но в памяти висят два процесса. Судя по манам/доке, так и должно быть - /lib/rc/net/wpa_supplicant.sh запускает всё правильно с нужными опциями, в частности -B для демонизации. Висит wpa_supplicant и висит wpa_cli. И что самое удивительное, и они правильно работают! Т.е. командным интерфейсом я вижу свою точку доступа.
На этом нормальная логика заканчивается и начинается полтергейст. Во-первых, по листингу выше видно, что когда модули загружены, служба пишет, что уже была запущена раньше. Ничего страшного! На самом деле всё так же запускается - особенность вышеупомянутого скрипта из openrc. А вот если выгрузить все модули, выводится ошибка и ничего не запускается. Т.е. стартовый скрипт эти модули сам не грузит.
Во-вторых, из документации по wpa_supplicant следует, что после запуска интерфейс уже должен работать. Как это работает? Обнаружив подходящую сеть wpa_supplicant посылает по связанному сокету (в данном случае - скрипту wpa_cli) текстовое сообщение - связалсо/отвязазалсо. В ответ скрипт должен... о боже!!! Запустить/остановить службу, т.е. снова /etc/init.d/net.ath0 {start|stop} - ну нифига себе! Не кажется это странным? Сразу скажу, что повторный запуск не приводит ни к чему, кроме флуда.
В-третьих, в документации по baselayout2/openrc сказано, как конфигурить wifi с wpa_supplicant. Очевидное несоответствие действительности! Например, что вполне логично, там сказано "config_SSID=...", где SSID - "MyHomeAP" и т.д. Но так оно тем более не работает, ибо на самом деле подставляется по дефолту config_ath0="dhcp".
Ладно. Фтопку последний wpa_supplicant! Сношу, маскирую и ставлю предыдущие:
PROMPT> cd /usr/portage/net-wireless/wpa_supplicant && ls *.ebuild
wpa_supplicant-0.5.10.ebuild
wpa_supplicant-0.5.7.ebuild
wpa_supplicant-0.5.8.ebuild
wpa_supplicant-0.6.1.ebuild
wpa_supplicant-0.6.3.ebuild
Картина таже :( Остаётся грешить на baselaout2/openrc из ~x86. Может нужно и config_ath0, и config_MyHomeAP? А что об этом думают академики? :-)))
- Для комментирования войдите или зарегистрируйтесь
Написал демона,
Написал демона, который выполняет те же "ручные" действия, что я здесь описывал, т.е. запускает wpa_supplicant -qq >/dev/null 2>&1 & (в фоне), как это обычно делается во многих никс-системах, но не в gentoo. В результате всё работает на ура.
Но меня это не удовлетворило и потратил ещё два дня на написание демона, работающего по всем канонам gentoo. Только не стал его интегрировать ни с какими сетевыми модулями openrc, поскольку мне достаточно статической конфигурации и DHCP.
Этот скрипт сам загружает и выгружает модули ядра, запускает в режиме демонизации wpa_supplicant и wpa_cli, имеет две extra commands - CONNECTED и DISCONNECTED, получаемые от wpa_cli.sh в случае соединения. Короче, реализовал функционал, обеспечиваемый скриптами openrc.
Каково же было моё удивление, когда этот демон оказался таким же нерабочим, что и входящий в систему!!! Оказалось, что wpa_supplicant с параметром -B (т.е. запущенный в режиме демонизации) работает с AP не так, как без этого параметра. Это можно наблюдать через командный интерфейс wpa_cli.
Он видит сети, пытается авторизоваться, но сделать этого не может. По истечению времени процесс повторяется бесконечно. Именно поэтому сообщение CONNECTED никогда не отправляется нашим демонам, именно по этой же причине интерфейс до конца так и не поднимается. Т.е., казалось бы
wpa_supplicant -iath0 -Dmadwifi -qq -B -P /path/to/pidfile
и
wpa_supplicant -iath0 -Dmadwifi -qq >/dev/null 2>&1 &
echo -n "$$" > /path/to/pidfile
это - одно и тоже, ан нет!!! Кто виноват? wpa_supplicant? MadWifi из trunk-овского оверлея с патчем от Atheros? Как бы это за багзиллить???
Сколько букф..
Сколько букф.. стандартный процесс локализации бага, но не о всём же писать :) Не тема а блог прямо.
Если коротко, насколько я понял проблема в том, что у тебя wpa_supplicant в nodetach режиме авторизуется нормально, а в режиме демона нет. Если так, предлагаю запостить баг на багзилле wpa_supplicant. Если проблема не в них, помогут решить что дальше делать.
Таже проблемма ...
После обновления baselayout 2.0 + openrc 0.2.5 наблюдаются теже грабли с wifi, только чипсет intel 2915ABG.
У кого-нить получилось пофиксить этот баг штатными средствами?
Пока не знаю в чём баг
Но у меня всё наконец-то заработало с определённым ядром и дровами. При том же baselayot+openrc.
с wpa_supplicant
с wpa_supplicant подключение рулится тока wpa_supplicant а не openrc =)
те все указывается в его конфиге а не в conf.d/net
___________________________________________
Gentoo GNU/Linux 2.6.26 GCC 4.3.1
Working on Gentoo for iPAQ hx4700 :-)
Если у вас компьютер с Windows, есть два выхода: выбросить компьютер в форточку или выбросить форточки с компьютера
Нет, не так :(
Здесь речь о пусковой части, скриптах, стартующих службу. Но я тоже думаю, что это не они. Скорее, виноват wpa_supplicant с флагом -B. Особенно, если был собран с опцией madwifi или запущен с -Dmadwifi. Я думаю, собирать всё же надо без madwifi и запускать как -Dwext. Если весь софт свежайший, канеш... Да, это следует из доки по wpa_supplicant ;)
Заработало! :)
See: http://www.gentoo.ru/node/10988#comment-80349
Видимо, дело всё-таки было в дровах.
При этом у меня ~amd64 (Core 2 Duo), [168c:001c] и subsystem [144f:7131].