Как стать автором
Обновить

Настройка 4G WiMAX-модема на чипе Beceem в Linux

Недавно в инете появился Sprint 4G Depelopment Pack, содержащий исходники драйверов и API для модемов на чипсете Beceem, а также документацию и различные тестовые утилиты.

К сожалению, поставляемая документация местами не соотвествует, описывает прежнюю версию драйверов и многое пришлось додумывать по ходу. В частности, там заявлено ядро версии от 2.6.9 и выше. На самом же деле, требуется ядро минимум 2.6.29 т.к. используются некоторые функции USB Core API, которых нет в прежних ядрах. В этом был первый долгий затык — попытка установить на CentOS 5.5.

Необходимые требования для сборки и корректной работы:
— Ядро Linux версии не ниже 2.6.29
— Административный доступ с правами root
— Пакеты linux-source, kernel-headers, openssl 0.9.8, С-compiler, usb-modeswitch и др.

В этой статье описывается установка на Ubuntu-server-10.10 i386 с ядром 2.6.35.
Используется 4G-модем Huawei BM338 на чипсете Beceem BCSM250 от провайдера byfly (Белтелеком). Модем позиционируется как решение Mobile-WiMAX и работает на частоте 3,5 ГГц.


Сссылка на архив Sprint 4G Depelopment Pack: developer.sprint.com/getDocument.do?docId=101032

1. Подготовка ядра


Устанавливаем все необходимые пакеты:

apt-get install linux-source linux-headers-$(uname -r) openssl unzip dos2unix patch
cd /usr/src
tar xvfj linux-source-2.6.35.tar.bz2
cd linux-source-2.6.35
make oldconfig && make prepare
make modules_prepare


2. Установка и настройка usb-modeswitch


Утилита usb_modeswitch необходима для автоматического переключения устройства из режима ZeroCD (на котором драйвера для Windows) в режим модема. Если запустить lsusb, то увидим устройство в режиме ZeroCD:
Bus 001 Device 003: ID 198f:bccd Beceem Communications Inc.

Устанавливаем:
apt-get install usb-modeswitch
cat /etc/usb_modeswitch.d/198f\:bccd >> /etc/usb_modeswitch.conf


Редактируем файл /lib/udev/rules.d/40-usb_modeswitch.rules — можно удалять описания всех устройств, кроме Beceem. Должно остаться что-то вроде:

LABEL="modeswitch_rules_begin"
# Beceem BCSM250
ATTRS{idVendor}=="198f", ATTRS{idProduct}=="bccd", RUN+="usb_modeswitch '%b/%k'"
LABEL="modeswitch_rules_end"


Перезапускаем udev:
service udev restart

Теперь, если снова вставить модем, вывод lsusb должен быть такой:
Bus 001 Device 003: ID 198f:0220 Beceem Communications Inc.
— 198f:bccd поменялся на 198f:0220

3. Установка модуля ядра и Beceem API Library


Распаковываем скачанный архив:
tar xvfz Sprint4GDeveloperPack-1.1.tar.gz
cd Sprint4GDeveloperPack-1.1


Собираем:
./install.sh

Скрипт задаст ряд вопросов по поводу расположения директорий, главное указать правильную директорию с исходниками ядра. В моем случае это /usr/src/linux-source-2.6.35

Скрипт соберет модуль ядра drxvi314.so, библиотеку libxvi020.so и копирует прошивку девайса в /lib/firmware. После чего выдаст ошибку — остальные компоненты будем собирать позже вручную. Нам еще потребуется конфиг устройства от провайдера, берем его из папки с установленной программой в винде (Program files/Wimax Connection Manager/Driver/Firmware/macxvi.cfg) и кладем в /lib/firmware. Теперь загружаем модуль ядра:
modprobe drxvi314

Если все прошло удачно — на модеме должен загореться красный светодиод. Также стоит глянуть вывод dmesg -c, там должно быть что-то типа
...
[ 6.240000]
[ 6.240035] register_networkdev:Beceem Network device name is eth1!
...
...
[ 7.197554] usbcore: registered new interface driver usbbcm
[ 7.197562] Initialised usbbcm


Для автозагрузки добавляем drxvi314 в /etc/modules
Поднимаем eth1:
ifconfig eth1 up

4. Установка Beceem Connection Manager и библиотек


unzip CSCM_v1.1.6.0_source.zip
cd CSCM


Т.к. в составе исходников не оказалось заголовочных файлов OpenSSL, качаем нужную версию с сайта:
wget http://www.openssl.org/source/openssl-0.9.8o.tar.gz
tar xvfz openssl-0.9.8o.tar.gz


и кладем заголовочные файлы в нужные места:
cp -R openssl-0.9.8o/include/openssl wpa_supplicant/openssl
cp -R openssl-0.9.8o/crypto crypto
cp -R openssl-0.9.8o/ssl ssl
cp -R openssl-0.9.8o/e_os2.h e_os2.h
cp -R openssl-0.9.8o/include/openssl BeceemEAPSupplicant/BeceemEngine/openssl
cp -R openssl-0.9.8o/crypto BeceemEAPSupplicant/crypto
cp -R openssl-0.9.8o/e_os2.h BeceemEAPSupplicant/e_os2.h
ln -s /lib/libssl.so.0.9.8 /lib/libssl.so
ln -s /lib/libcrypto.so.0.9.8 /lib/libcrypto.so


Конвертируем build.sh в UNIX-формат и собираем:
dos2unix build.sh
chmod +x build.sh
./build.sh pc_linux


В конце скрипта должно быть написано SUCCESS по всем компонентам.

Кладем библиотеки, демон и клиент в нужные места:
cp bin_pc_linux/bin/lib* /lib/
cp bin_pc_linux/bin/wimax* /usr/local/bin/


5. Конфигурирование демона wimaxd


Тут есть одна непонятная вещь, над которой тоже пришлось долго «плясать с бубном».
Ранее, при сборке модуля ядра, мы уже скопировали конфиг устройства (файл macxvi.cfg), поставляемый провайдером. Такой же файлик есть и в архиве Sprint'а, но с ним модем ведет себя странно (не работают светодиоды, поиск БС происходит очень долго и т.д.). Но при этом, демон wimaxd, наоборот, корректно работает именно с конфигом Sprint'а (с родным провайдерским конфигом были проблемы с TLS-аутентификацией).

В общем, в /lib/firmware/ должно быть 2 файла:
macxvi.cfg — конфиг провайдера, его использует модуль ядра.
macxvi-sprint.cfg — конфиг Sprint'а из архива (лежит в Sprint4GDeveloperPack-1.1/Rel_5.2.7.3P1_USB/Tools/config/CFG_files_for_VSG_testing/macxvi_VSG_2.6-3.5_FLASH_r37.cfg) — он нужен для демона wimaxd

Создаем конфиг wimaxd, например /etc/wimaxd.conf
После изучения документации, а также методом проб и ошибок получилось вот такое содержимое:

/etc/wimaxd.conf:
########################################################################
BandwidthMHz 10
CenterFrequencyMHz 3416 3426 3436 3446 3516 3526 3536 3546

AuthEnabled Yes
EAPMethod 4
UserIdentity '6816C0B1C045@wimax.beltel.by'

ValidateServerCert Yes
CACertPath '/usr/local/beceem/certs'
CACertFileName '/usr/local/beceem/certs/ca.pem'
TLSDeviceCertFileName '/usr/local/beceem/certs/cpecert.pem'
TLSDevicePrivateKeyFileName '/usr/local/beceem/certs/cpekey.pem'
InnerNAIChange Yes

BeceemEngineFileName '/lib/libengine_beceem.so'

#AuthLogLevel 4
#AuthLogFileName '/tmp/CM_Auth.log'

FirmwareFileName '/lib/firmware/macxvi200.bin'
ConfigFileName '/lib/firmware/macxvi-sprint.cfg'
#######################################################################


Немного пояснений.
Параметры BandwidthMHz и CenterFrequencyMHz взяты из настроек виндошной программы.
EAPMethod 4 — EAP-TLS
UserIdentity — логин. Первая часть логина до символа @ — это МАС-адрес устройства без двоеточий. Также взят из настроек виндошной программы.
CACertPath, CACertFileName, TLSDeviceCertFileName, TLSDevicePrivateKeyFileName — пути к файлам сертификатов и ключей. Их нужно взять из папки с установленной программой в винде (Program Files/Wimax Connection Manager/cert/) и положить в указанную конфигом директорию.
InnerNAIChange Yes — не знаю что это, но без этой опции ошибка аутентификации при подключении.
FirmwareFileName, ConfigFileName — пути к файлам прошивки и конфига от Sprint'a

6. Подключение


Запускаем демон:
wimaxd -D -c /etc/wimaxd.conf

Результатом правильной работы будет непрерывный вывод сообщения Link status = WAIT FOR PHY SYNC CMD — это значит, что демон готов принимать команды от клиента. Открываем другую консоль и запускам клиент:
wimaxc -i

Должно появится приглашение
Beceem CM Server Version 1.1.6.0
>


а в консоли демона сообщение
Client socket 00000006 lock Beceem API: SUCCESS (wait = 0 ms)
Client socket 00000006 unlock Beceem API: Success


Начинаем сканирование:
> search

Через секунд 30 клиент выдаст найденные BSIDs, что-то вроде такого:
Network search returned 4 base stations.
Idx BSID Pre Freq BW RSSI CINR
0 01:01:00:00:02:00:17:00 0x05 3416.000 10.000 -70 26
1 01:01:00:00:02:00:17:20 0x05 3426.000 10.000 -76 17
2 01:01:00:00:02:00:17:10 0x05 3436.000 10.000 -74 20
3 01:01:00:00:02:00:17:30 0x05 3446.000 10.000 -72 24


Подключаемся к той, у которой соотношение сигнал/шум максимальное, в данном случае 0
> connect 0

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

=============== Received Message Start (2010/09/24 18:03:10.622) ===========
u32State = Network Entry completed
Service flow response received (Type = 6 - Subtype = 1 - Length = 8476)
Service Flow Add Indication:
Type = 13
Direction = Uplink
Connection ID = 10039
Virtual CID = 4
Service flow ID = 513
Max sustained rate = 512 kbps
Traffic priority = 0
=============== Received Message End (type=6 sub-type=1) ===============
Device status indication: Layer 2 connected

=============== Received Message Start (2010/09/24 18:03:10.682) ===========
u32State = Network Entry completed
Service flow response received (Type = 6 - Subtype = 1 - Length = 8476)
Service Flow Add Indication:
Type = 13
Direction = Downlink
Connection ID = 10040
Virtual CID = 5
Service flow ID = 512
Max sustained rate = 2680 kbps
Traffic priority = 0
================
Link status = LINKUP ACHIEVED

Здесь видны параметры скорости даунлинка/аплинка (2680/512 kbps — ограничение провайдера).
Если соединение не установилось — нужно смотреть вывод ошибок в консоли демона и пытаться исправить. Также будет полезно включить опции AuthLog и просмотреть детальный лог. Вполне вероятно, для других провайдеров параметры аутентицикации будут совсем другие.

7. Финальные шаги


После того, как все будет правильно настроено — демон можно запустить в фоне:
wimaxd -c /etc/wimaxd.conf
и занести в стартовые скрипты системы.
Клиентскую часть тоже можно автоматизировать, в документации есть пример скрипта на Python. Но я не силен в программировании на Python, поэтому оставляю это за рамками статьи.

Осталось настроить PPPoE-соединение к провайдеру. Тут уже все стандартно — запускаем pppoeconf и отвечаем на вопросы. Обратите внимание, что интерфейс eth1 изначально не поднят, перед запуском PPPoE его нужно активировать (ifconfig eth1 up)

Стартуем:
pon dsl-provider
… и вуаля! Проверяем, поднялся ли ppp0:
ifconfig ppp0

ping ftp.mgts.by
--- ftp.mgts.by ping statistics ---
177 packets transmitted, 177 received, 0% packet loss, time 176214ms
rtt min/avg/max/mdev = 42.551/59.213/71.809/8.631 ms

Работает все хорошо, проблем замечено не было. Скорость — максимальная, ограниченная провайдером. Субъективно, пинг стал меньше и ровнее, чем под Windows.

При подготовке статьи была использована документация из Sprint 4G Depelopment Pack.

P.S. Выражаю благодарность человеку под ником amod-cccp за предоставленный линк на этот пак (месяц назад искал какую-либо информацию — ничего не нашел).
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.