LINUX.ORG.RU

Wifi realtek rtl8188ce и доступные каналы

 ,


0

3

Доброго дня. Скажем так - академический интерес: :) Имеем беспроводной адаптер на чипсете rtl8188ce (драйвер rtl8192ce). Изначально 14 канал недоступен (по понятным причинам :)). Задать country code «вручную» не удалось, а потому заглянул сразу в драйвер. После некоторых правок исходного кода драйвера iw list стал показывать, что 14 канал доступен (ранее писал disabled). Кроме того, через iwconfig удается выставить 14 канал, соответственно затем iwconfig wlan0 показывал частоту, соответствующую 14 каналу. Однако при старте hostapd и указании в ее конфиге 14 канала демон не стартует с отсылкой на то, что канал задан не верно. Большого опыта «столкновений» с wifi адаптерами не имею. Подозреваю, что дело посерьезнее чем ограничение на уровне драйвера и проблема кроется в EEPROM. Или все же стоит заглянуть в собственно исходники hostapd на предмет того, по какой причине он отказывается инициализировать данный канал?

Вдогонку. Собственно возникло подозрение, что правил я несколько не там и нужно было уходить «ниже уровнем» собственно там, где eeprom читается. Пробую.

vedmysh ()

Когда я пытался поменять количество каналов в дешевой TP-LINK TL-WN360G (mini-pci wifi card, Chipset: Atheros AR5007G), выставляя свою страну, то оно никак не менялось, ни количество каналов, ни страна. Меня это разозлило, я немножко поискал (уж не помню где, но у разработчиков ath5k). Ответ был ожидаем: производители недорогих чипов зачастую не заморачиваются и блокируют эту возможность (либо не реализовывают ее), жестко прошивая одно значение (в большинстве случаев - Китай, где разрешены минимальные 11 каналов), которое легально во всех странах. Так я узнал, что cdra мне до фени и я нахожусь в китае.)

Возможно, у вас похожий случай. Отпишитесь, если разберетесь.

giodiodr ()
Ответ на: комментарий от giodiodr

Если я верно понял исходный код, то в моем случае channel plan все таки читается из eeprom. Вот только одно но. «Добрался» собственно до нужной функции, «ниже» вроде бы и некуда, подменил на нужные мне данные, собрал модуль, но результат остался прежним - hostapd не стартует. Теперь ломаю голову - то ли я все-таки где-то что-то упустил (так как исходные тексты просмотрел весьма поверхностно), то ли проблема кроется уже в hostapd. Написал письмо разработчику драйвера. Буду надеяться, что ответит. А по ходу дела на досуге посмотрю еще на драйвер.

vedmysh ()
Ответ на: комментарий от vedmysh

Я так глубоко рыть не умею, но читать-то у меня читал (согласно dmesg), но потом сбрасывал обратно в китай. Кстати, там была фраза, что если устройства изначально предназначаются для китайского рынка, то производители тем более не заморачиваются каким-то там cdra.

giodiodr ()
Ответ на: комментарий от vedmysh

Вот кстати частичный ответ с http://linuxwireless.org/en/users/Documentation/FAQ

Q: Why can't i use channel X, i did iw reg set NN but it is still unavailable

A: Every card sold was certified to work in a particular regulatory environment (that being set of channels, maximum allowed power, other special flags etc). On Intel cards these restrictions are enforced by firmware, Atheros's equipment has regdomain code in EEPROM which is read on startup by the driver and then (if it's not «world» regdomain) CRDA is contacted to get a set of regulatory requirements.

giodiodr ()
Ответ на: комментарий от giodiodr

iw reg set я попробовал с самого начала. Естественно это мне ничего не дало, что и натолкнуло на мысль заглянуть в драйвера :) Просто было сомнительно, что на карточке, которая продается повсеместно совершенно спокойно работает в диапазоне с 1-13 хардверно заблокирован 14-ый. А если не хардверно, то это можно исправить, вопрос только где - это либо софт, либо драйвер, либо фирмварь. Софт отбросил, поскольку не универсально было бы городить это на стороне софта.

Кстати обнаружил интересную вещь. В исходных текстах присутствуют константы, которые по сути определяют функционал адаптеров. Выглядят они так:

enum country_code_type_t { COUNTRY_CODE_FCC = 0, COUNTRY_CODE_IC = 1, COUNTRY_CODE_ETSI = 2, COUNTRY_CODE_SPAIN = 3, COUNTRY_CODE_FRANCE = 4, COUNTRY_CODE_MKK = 5, COUNTRY_CODE_MKK1 = 6, COUNTRY_CODE_ISRAEL = 7, COUNTRY_CODE_TELEC = 8, COUNTRY_CODE_MIC = 9, COUNTRY_CODE_GLOBAL_DOMAIN = 10, COUNTRY_CODE_WORLD_WIDE_13 = 11, COUNTRY_CODE_TELEC_NETGEAR = 12,

/*add new channel plan above this line */ COUNTRY_CODE_MAX }

Константа COUNTRY_CODE_GLOBAL_DOMAIN и есть нужная мне - она указывает на поддержку оборудованием диапазона 2.4Ггц и 14 каналов (неисправленный драйвер подключал COUNTRY_CODE_WORLD_WIDE_13 channel plan). Но при этом, скажем так, уровнем ниже спецом для ce варианта есть макроопределения констант якобы от eeprom, которые выглядят так:

#define>EEPROM_CHANNEL_PLAN_FCC 0x0 #define>EEPROM_CHANNEL_PLAN_IC 0x1 #define>EEPROM_CHANNEL_PLAN_ETSI 0x2 #define>EEPROM_CHANNEL_PLAN_SPAIN 0x3 #define>EEPROM_CHANNEL_PLAN_FRANCE 0x4 #define>EEPROM_CHANNEL_PLAN_MKK 0x5 #define>EEPROM_CHANNEL_PLAN_MKK1 0x6 #define>EEPROM_CHANNEL_PLAN_ISRAEL 0x7 #define>EEPROM_CHANNEL_PLAN_TELEC 0x8 #define>EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 #define>EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA #define>EEPROM_CHANNEL_PLAN_NCC 0xB #define>EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80

По идее и те и другие должны совпадать. Но не тут то было - видно, что они «плывут» начиная с 9. Правда, надо сказать, что константы EEPROM_ вообще нигде не используются.

vedmysh ()
Ответ на: комментарий от vedmysh

На моей хадварно есть только 11 и все.

По ходу в драйверах бардак, как и во всем линуксе. Кто-то шо то написал, кто-то дописал и так далее. А потом оно работает неправильно, ибо первый имел в виду одно, а второй другое )))

giodiodr ()
Ответ на: комментарий от giodiodr

На счет того, что они должны совпадать я просто предположил :) Это напрашивается из логики, но тем не менее шанс есть, что там все верно. А то, что константы EEPROM_* нигде не используются это вобщем то не трагедия. Сейчас попробую пересобрать модуль и подменить при чтении из eeprom channel plan используя соответствующую константу EEPROM_. Бардак он везде - энтропия со временем только возрастает :) Вероятность бардака в драйверах конечно гораздо выше, чем в ядре. Но на мой взгляд драйвера риалтека вцелом написанны весьма аккуратно. Правда, если быть до конца честным я уже поставил один тестовый патч буквально двухнедельной давности, т.к. до него сей модуль за ночь отправил мой домашний сервер 5 раз в ребут из за утечки памяти при работе с dma :):):)

vedmysh ()

http://linuxwireless.org/en/developers/Regulatory тебе для начала суда как минимум, если в двух словах, тебе для начала нада либо выставить страну где разрешен нужный тебе канал либо поправить regdb, а потом уже в драйвер лесть если понадобится.

GHhost ()
Ответ на: комментарий от GHhost

Спасибо, посмотрю. А разве страна находится не в eeprom в моем случае и какова корреляция страны и собственно channel plan'а?

vedmysh ()

Раз уж речь зашла об этом чипе, кто-нибудь использует эти карты с 3.3.1? В этой версии изменили механизм загрузки firmware для всех драйверов семейства, так что вкомпиленная в ядро прошивка больше не подгружается.

Lighting ★★★★★ ()
Ответ на: комментарий от Lighting

Использует.

Linux homeserver.home 3.3.1 #1 SMP Mon Apr 9 00:52:00 MSK 2012 x86_64 x86_64 x86_64 GNU/Linux

03:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8188CE 802.11b/g/n WiFi Adapter (rev 01)

Драйвер собирал тот, что выложен на сайте риалтек, все работает.

vedmysh ()
Ответ на: комментарий от vedmysh

Драйвер собирал тот, что выложен на сайте риалтек, все работает.

Но зачем? Он ведь в ядре.

Lighting ★★★★★ ()
Ответ на: комментарий от GHhost

По поводу совета я таки не понимаю :) Вот, что я имею сейчас после некоторых моих телодвижений с драйвером (а может они и не причем):

]# dmesg | grep rtl rtlwifi-0:rtl_regd_init():<0-0> rtl: EEPROM regdomain: 0xa rtlwifi-0:rtl_regd_init():<0-0> rtl: Country alpha2 being used: JP rtlwifi-0:_rtl_regdomain_select():<0-0> rtl: _rtl_regdomain_select GLOBAL_DOMAIN ieee80211 phy0: Selected rate control algorithm 'rtl_rc' rtlwifi: wireless switch is on

GLOBAL_DOMAIN это профиль, при котором доступны все каналы в диапазоне 2.4 Ггц. Country alpha2 это как раз код для CRDA и собственно внутри драйвера эта инициализация и просиходит:

/* * <3> init CRDA must come after init * mac80211 hw in _rtl_init_mac80211. */ if (rtl_regd_init(hw, rtl_reg_notifier)) { RT_TRACE(COMP_ERR, DBG_EMERG, («REGD init failed\n»)); return 1; }

Внутри вызова rtl_regd_init и ниже.

Теперь я говорю:

# iw reg set JP

Для японии у нас доступны все 14 каналов.

# iw list

и вижу:

Frequencies: * 2412 MHz [1] (20.0 dBm) * 2417 MHz [2] (20.0 dBm) * 2422 MHz [3] (20.0 dBm) * 2427 MHz [4] (20.0 dBm) * 2432 MHz [5] (20.0 dBm) * 2437 MHz [6] (20.0 dBm) * 2442 MHz [7] (20.0 dBm) * 2447 MHz [8] (20.0 dBm) * 2452 MHz [9] (20.0 dBm) * 2457 MHz [10] (20.0 dBm) * 2462 MHz [11] (20.0 dBm) * 2467 MHz [12] (20.0 dBm) * 2472 MHz [13] (20.0 dBm) * 2484 MHz [14] (20.0 dBm) (passive scanning)

То есть канал 14 доступен. Но hostapd не хочет работать. Вот и хотелось бы более конкретного совета (а не просто ссылку на общее описание CRDA) на сей счет, возможно я совершенно не в том направлении рою.

vedmysh ()
Ответ на: комментарий от Lighting

Тот, что в ядре у меня не завелся. Разбираться не стал. lspci показывал, что драйвер подгружен, однако соответствующего сетевого интерфейса не было. Возможно по описанной вами причине. В итоге взял дистрибутив от Realtek.

vedmysh ()
Ответ на: комментарий от vedmysh

в eeprom тоже находится, вобщем то там по ссылке или гдето рядом все это должно быть разжевано, в двух словах, в regdb для каждой страны расписаны каналы мощьность ит, при попадании в эту страну соотвественно эти ограничения и накладываются вне зависимости от того что умеет железка, если данная подсистема отсутствует то автоматом врубается word domain в котором ограничения удовлетворящие требования любой страны - 100 миливат 11 каналов если память не изменяет. поэтому что бы ты ни крутил в драйвере эффекта это не возымеет пока не исправиш эти ограничения.

GHhost ()
Ответ на: комментарий от GHhost

Что из себя представляет база я понимаю. Вопрос только в том, зачем определять country code из eeprom например (если конечно этот eeprom есть) если он по факту не используется. Вот сейчас у меня драйвер говорит crda инфраструктуре следующее - я могу 2.4 Ггц каналы с 1-14 и вообще country code у меня JP. iw list верит. При этом через iwconfig задать 14 канал я могу (при этом вижу, что частота на адаптере устанавливается правильная), а вот запустить hostapd нет. Или это ничего не значит? В конфиге hostapd тоже задан JP. Утрирую - linux плюет на то, что ему говорит драйвер говоря - врешь ты все, мужик, в России ты. И вот хрен тебе, а не 14 канал. 13 - пожалуйста, но не 14. И этого я как раз таки понять не могу - исходя из чего он решает, что я не достоин. Не видно зацепок.

vedmysh ()
Ответ на: комментарий от vedmysh

ну блин, hostapd -dd /path/to/config и смотри почему он не работает на 14 канале, и конфигурацию я твою hoastap чтото никак не могу телепатически прочитать. ты случайно чепчик из фольги не надел?:)

GHhost ()
Ответ на: комментарий от vedmysh

в eeprom определяется для того чтоп производитель мог выпустить карты предназначенные исключительно для какой то страны с, по сути все то же самое только еще один уровень ограничений, бывают и такие требования в некоторых странах, вобщем то какрас для того чтоп соответствовать всяким разным требованиям всяких разных стран всю ету байду и придумали.

GHhost ()
Ответ на: комментарий от GHhost

Скорее чугунный тазик :) Собственно там негде ошибиться, в конфиге то hostapd. Тем более что остальные каналы прекрасно работают. По этому и приводить его не стал.

К слову, ответил разработчик драйвера. Все мои потуги с правкой драйвера по большому счету лишние. Цитирую:

I cannot test channel 14, but I thought that if you implement CRDA and load cfg80211 with the parameter ieee80211_regdom=JP, then the default channel plan will be overridden.

Смущает только 'if you implement CRDA'. То бишь что под этим имеется ввиду.

vedmysh ()
Ответ на: комментарий от vedmysh

я уже сразу вижу места где там можно ошибица, к примеру можно указать страну в конфиге hostapd, он ее применит и снесет 14 канал, можно указать HT40+ в ht_capab - так же не заработает на 14 канале, так что хватает там мест для ошибки, собсно разработчик тебе сказал примерно то же что и я, CRDA это какрас userspace тулза применяющая ограничения из regdb.

GHhost ()
Ответ на: комментарий от vedmysh

Я же сказал, что карте для работы необходим firmware(из пакета linux-firmware, файл rtl8192cfw.bin). А описанная проблема проявляется только на ядре 3.3.1.

Lighting ★★★★★ ()
Ответ на: комментарий от GHhost

Собственно, думаю, что если бы проблема была в ht капсах (сиречь capabilities) и HT40+ то не работал бы и 13 канал ;) А он прекрасно работает под hostapd. Страна для 14 канала указана верно, об этом я писал. Но у меня ощущение, уж простите, что вы не особо вчитываетесь в то, что вам пишут. Но спасибо за участие и разогрев темы :)

А вы себя хвалить любите я смотрю :) Как по мне, вы и разработчик говорили о совершенно разных вещах. А разработчик одним предложением указал на конкретный параметр дабы я не истязал бренную тушку его драйвера :)

Хотя не факт, что при этом все заработает еще. Буду пробовать.

vedmysh ()
Ответ на: комментарий от Lighting

Так что вы от меня то хотите ? :) У меня адаптер работает.

vedmysh ()
Ответ на: комментарий от vedmysh

ну пробуйте рас не хотите логи и конфигурацию показывать.

GHhost ()
Ответ на: комментарий от GHhost

Уговорили, сейчас покажу. Только ведь плавно уходим в офтопик :)
Что касается ht_capab они верные. Уж сопоставить информацию от iw list с параметрами совершенно не сложно.

interface=wlan0
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ssid=xxxxxxxxx
country_code=JP
hw_mode=g
channel=14
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=1
accept_mac_file=/etc/hostapd.accept
auth_algs=1
ignore_broadcast_ssid=0
wmm_enabled=0
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
ap_max_inactivity=300
ieee80211n=1
ht_capab=[SMPS-STATIC][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935][DSSS_CCK-40]
eapol_key_index_workaround=0
eap_server=0
own_ip_addr=127.0.0.1
wpa=2
wpa_passphrase=xxxxxxxxx
rsn_pairwise=CCMP

При этом конфиге hostapd не стартует:

Starting hostapd. Configuration file: /etc/hostapd.conf
wlan0: IEEE 802.11 Configured channel (14) not found from the channel list of current mode (1) IEEE 802.11g
wlan0: IEEE 802.11 Hardware does not support configured channel
Could not select hw_mode and channel. (-1)
wlan0: Unable to setup interface.
rmdir[ctrl_interface]: No such file or directory
[FAILED]

К слову о crda из dmesg:

cfg80211: Calling CRDA for country: JP
cfg80211: Regulatory domain changed to country: JP
cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm)
cfg80211: (2457000 KHz - 2482000 KHz @ 20000 KHz), (N/A, 2000 mBm)
cfg80211: (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm)
cfg80211: (4910000 KHz - 4930000 KHz @ 10000 KHz), (N/A, 2300 mBm)
cfg80211: (4910000 KHz - 4990000 KHz @ 40000 KHz), (N/A, 2300 mBm)
cfg80211: (4930000 KHz - 4950000 KHz @ 10000 KHz), (N/A, 2300 mBm)
cfg80211: (5030000 KHz - 5045000 KHz @ 10000 KHz), (N/A, 2300 mBm)
cfg80211: (5030000 KHz - 5090000 KHz @ 40000 KHz), (N/A, 2300 mBm)
cfg80211: (5050000 KHz - 5060000 KHz @ 10000 KHz), (N/A, 2300 mBm)
cfg80211: (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
cfg80211: (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
cfg80211: (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2300 mBm)
cfg80211: Calling CRDA for country: JP

iw list уже приводил в качестве примера

vedmysh ()
Ответ на: комментарий от vedmysh

Ха, сдается мне, проблема в том, что 14 канал имеет приписку passive scanning

vedmysh ()
Ответ на: комментарий от vedmysh

допиши попробуй [HT40-] в ht_capab, и лог таки с -dd лучше приведи, он там много чего интересного пишет. и кстати ты вообще проверял работу 14 канала? в ad-hoc к примеру?

GHhost ()
Ответ на: комментарий от GHhost

HT40 параметры носят скажем так рекомендательный характер и при запуске hostapd может их проигнорировать в зависимости от того, что твориться в эфире. Но суть не в том. Проблема действительно в пометке Passive scanning - на каналах отмеченных таким образом (или флажком no IBSS) нельзя создавать ap :)

vedmysh ()
Ответ на: комментарий от vedmysh

игнорировать может, я не помню как он себя ведет при их отсутствии, насчет флажков - подредактируй regdb или найди страну где их нет:)

GHhost ()
Ответ на: комментарий от GHhost

Да нормально себя ведет :) А вот с ними как вы верно отметили могут быть нехорошие нюансы, если человек плохо себе представляет, что он делает :)

Я уже посмотрел, для JP нет ограничений касательно passive scanning (полагаю, no-ofdm никак на это не влияет):

country JP: (2402 - 2472 @ 40), (N/A, 20) (2457 - 2482 @ 20), (N/A, 20) (2474 - 2494 @ 20), (N/A, 20), NO-OFDM (4910 - 4930 @ 10), (N/A, 23) (4910 - 4990 @ 40), (N/A, 23) (4930 - 4950 @ 10), (N/A, 23) (5030 - 5045 @ 10), (N/A, 23) (5030 - 5090 @ 40), (N/A, 23) (5050 - 5060 @ 10), (N/A, 23) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 23), DFS

Ради интереса опять полез в драйвер, нашел там в коде место где на 14 канал вешается признак passive scanning и убрал его. Пересобрал драйвер. По iw list флажок пропал. Я было порадовался, но не тут то было. Hostapd, правда, запустился без проблем. Но в эфире тишина :) Нету точки доступа :)

vedmysh ()
Ответ на: комментарий от vedmysh

ну да я тоже уже посмотрел и подумал что флаг из драйвера ибо

country JP: (2402 - 2472 @ 40), (N/A, 20) (2457 - 2482 @ 20), (N/A, 20) (2474 - 2494 @ 20), (N/A, 20), NO-OFDM (4910 - 4930 @ 10), (N/A, 23) (4910 - 4990 @ 40), (N/A, 23) (4930 - 4950 @ 10), (N/A, 23) (5030 - 5045 @ 10), (N/A, 23) (5030 - 5090 @ 40), (N/A, 23) (5050 - 5060 @ 10), (N/A, 23) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 23), DFS

NO-OFDM означает только 802.11b, а ты пытаешся взлететь с N, возможно и тишина, стран с 14 каналом я чето там больше не вижу, так что только редактировать базу.

GHhost ()
Ответ на: комментарий от GHhost

Увы и ах :) На сегодня я пожалуй пас :) Еще раз спасибо за участие в марафоне :)

vedmysh ()
Ответ на: комментарий от vedmysh

да незашто, просто уже проходили все это, кстати из hostapd страну и 802.11d лучше убрать ибо когда они там есть они адверсяца клиенту, и он применяет правила для них у себя тоже(правда не все это поддерживают), и в случае отредактированной базы на ап получица ой вида клиент сам себе же заблокирвал 14 канал если у него база не редактированная.

GHhost ()
Ответ на: комментарий от GHhost

На досуге попробую подкорректировать базу. Если что еще отпишусь :)

vedmysh ()
Ответ на: комментарий от vedmysh

Пока решил забыть о 14 канале. Тут еще нарисовалось странное поведение dlna телевизора. Думаю, что для начала заменю штатные антенны на адаптере на другие с большим коэффициентом усиления.

vedmysh ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.