CDMA, AnyData a GNU/Linux

Připojení k Internetu prostřednictvím technologie CDMA u nás nyní nabízejí dva subjekty. Oba v současnosti používají modemy AnyData, jejichž podpora a zprovoznění v GNU/Linuxu jsou probírány v tomto dokumentu.

Já jsem používal modem GTRAN v současné době používám ADU-300H. Modemy ADU-100H a ADU-510L k dispozici nemám, nicméně ADU-E100H je s přihlédnutím ke GNU/Linuxu totožný s ADU-300H a v případě ADU-510L odkazuji na příslušný návod v závěru dokumentu.

Stav podpory

Modemy GTRAN i AnyData byly navzdory jistým chybkám provozuschopné už v jádrech řady 2.4. Modem GTRAN jsem úspěšně používal již s jádrem 2.4.19 (modul cdc-acm). Aktuální AnyData ADU-E300H jde překvapivě s tímto jádrem taktéž zprovoznit (prostřednictvím modulu usbserial). V tomto případě (a dalších jádrech s verzí menší než 2.6.18) bylo nutné modul zavést ručně takto:

 modprobe usbserial vendor=0x16d5 product=0x6501

V případě modemu AnyData tkvěl hlavní problém v neschopnosti modem správně zavěsit. V případě, že se chtěl uživatel po ukončení spojení znovu připojit, musel modem fyzicky odpojit a opět připojit. Tato chyba byla opravena v jádře 2.6.18 (dle referencí pouze pro modely ADU-E100H a ADU-300H, ADU-510L je tímto patrně postižen stále).

Po připojení modemu dojde k jeho detekci a vytvoření příslušných souborů /dev/ttyUSB0 a /dev/ttyUSB1 (v případě ADU-510L dojde ještě k vytvoření zařízení /dev/ttyUSB2). K připojení je nutné použít zařízení /dev/ttyUSB0. Výpis dmesg ukazuje výpis podobný tomuto:

 drivers/usb/serial/usb-serial.c: USB Serial support registered for GSM modem (1-port)
 option 2-2:1.0: GSM modem (1-port) converter detected
 usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0
 option 2-2:1.1: GSM modem (1-port) converter detected
 usb 2-2: GSM modem (1-port) converter now attached to ttyUSB1
 usbcore: registered new driver option
 drivers/usb/serial/option.c: USB Driver for GSM modems: v0.7.1

Poté stačí vytvořit PPP spojení dle libosti jakoukoliv metodou (ruční editace konfiguráků, ppp-config, wvdial či grafické nástroje kppp nebo gnome-ppp).

Postup zprovoznění

Zařízení

Abychom mohli s modemem pracovat, musíme zajistit následující:

  • zavedení modulu
  • vytvoření příslušných speciálných souborů v /dev

V případě novějšího jádra (2.6.18 a výše), modelů ADU-E100H a ADU-E300H a funkčního démona udev by mělo být obojí automatické.

Pokud se po připojení modemu příslušné soubory /dev/ttyUSB0 a /dev/ttyUSB1 nevytvoří (což bude případ modemu ADU-510L i na novějších jádrech), zkusíme nejprve zavést modul usbserial ručně:

 modprobe usbserial vendor=0x16d5 product=0x6501

V případě, že nemáme k dispozici udev nebo jeho starší ekvivalent, který po zavedení modulu příslušné soubory vytvoří, budeme je muset vytvořit ručně:

 mknod /dev/ttyUSB0 c 188 0
 mknod /dev/ttyUSB1 c 188 1

ADU-510L

Soudě dle referencí, Linux zatím tento modem sám nerozpozná, je třeba mu pomoci „ručně“:

 modprobe usbserial vendor=0x16d5 product=0x6502

Je-li to třeba (chybí-li udev), lze příslušné soubory zařízení vytvořit ručně (viz postup výše).

Konfigurace

Jak už bylo řečeno, nic speciálního již není třeba, stačí vytvořit PPP spojení dle libosti jakoukoliv metodou (ruční editace konfiguráků, ppp-config, wvdial či grafické nástroje kppp nebo gnome-ppp). Pokud zvolíte grafické nástroje, nezapomeňte specifikovat správné zařízení /dev/ttyUSB0.

Ruční konfigurace spočívá ve vytvoření následujících souborů. Nejprve vytvoříme /etc/ppp/peers/anydata s následujícím obsahem:

 /dev/ttyUSB0
 921600
 noipdefault
 defaultroute
 ipcp-accept-local
 usepeerdns
 nopcomp
 noauth
 noaccomp
 nodetach
 debug
 user "6xxxxxxxx@etcz"
 connect "/usr/sbin/chat -s -S -V -t 5 -f /etc/ppp/anydata.chat"

Nezapomeňte si upravit parametr user, aby odpovídal vašemu uživatelskému jménu. Parametr nodetach můžete po odladění spojení nahradit parametrem detach, aby se pppd spouštěl na pozadí jako démon (všechny hlášky pak uvidíte ve /var/log). S parametrem nodetach uvidíte všechny hlášky přímo na konzoli po spuštění pppd.

Parametr debug zajistí komplexnější výpis vhodný pro ladění případných problémů. Díky tomu pak můžete snadněji určit příčinu toho, proč spojení vypadlo nebo co se stalo. Opět, po odladění spojení můžete tento parametr odstranit.

Dále vytvoříme soubor /etc/ppp/anydata.chat:

 '' ''
 '' 'ATZ'
 'OK' 'AT+CSQ?'
 'OK' 'ATI'
 'OK' 'ATDT#777'
 'CONNECT' 'ATO'

Řádku obsahující příkaz AT+CSQ? můžete odstranit, není nutná. Tento příkaz se dotáže modemu na sílu signálu. Tu pak uvidíte v příslušném výpisu (nebo v logu). V příslušném výpisu vás bude zajímat první číslo. Hodnota 31 je maximum, hodnoty nad 15 by měly být v pořádku.

Abychom se mohli úspěšně přihlásit, musíme zadat jméno a heslo. To pro jistotu umístíme do souborů /etc/ppp/chap-secrets a /etc/ppp/pap-secrets v následujícím tvaru:

 "6xxxxxxxx@etcz" * "heslo"

Poté se lze připojit pomocí příkazu:

 pppd call anydata

Řešení problémů

Odpojování modemu

U svého modemu jsem se setkal s nepříjemnou tendencí spojení zavěsit při provozu (tj. při přenášení dat). K tomu občas dojde, pokud se modemu pošle paket s jinou zdrojovou adresou než tou, kterou očekává (více viz zde). Problém se objevuje zejména, pokud počítač, ke kterému je modem připojen, pracuje jako router. Řešení zahrnuje úpravu firewallu (viz dále).

Já jsem problém vyřešil následujícím způsobem. Není to patrně čisté řešení, ale funguje:

iptables -A OUTPUT -m state --state INVALID -o ppp0 -j DROP
iptables -A FORWARD -m state --state INVALID -o ppp0 -j DROP
iptables -t nat -A OUTPUT -m state --state INVALID -o ppp0 -j DROP

Dle diskuse na Root.cz by mělo fungovat také toto řešení:

iptables -A FORWARD -m conntrack --ctstate INVALID -j REJECT

Nezapomeňte také, v případě CDMA routeru, na maškarádu:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Nouzové řešení

Pokud vše selže, můžeme uplatnit řešení typu „kýbyl na děravou střechu“. Vytvoříme skript, který v případě pádu spojení opět obnoví. Skript může vypadat třeba takto (tato ukázka předpokládá parametr nodetach - viz výše):

 #!/bin/bash
 
 while [ -e /dev/ttyUSB0 ]; do
    pppd call anydata
    sleep 1
 done

Tento skript by měl ve spolupráci s udevem nebo jiným systémem pro dynamickou správu hardwaru zajistit, že dokud bude modem připojen (resp. dokud bude existovat soubor /dev/ttyUSB0), bude spojení obnovováno. Po odpojení modemu skript skončí.

Nemožnost obnovy spojení po přerušení

Tento problém se vyskytuje u starších jader nebo u modemu ADU-510L i s novějším jádrem. Zde jsou dvě možnosti řešení (nedělejte si ale příliš veliké naděje, mně nefungovalo ani jedno z těchto řešení).

Jednou z možností je poslat modemu příkaz ATH k ukončení spojení před jeho obnovou. V naší konfiguraci byste upravili soubor /etc/ppp/anydata.chat takto:

 '' ''
 '' 'ATH'
 '' 'ATZ'
 'OK' 'AT+CSQ?'
 'OK' 'ATI'
 'OK' 'ATDT#777'
 'CONNECT' 'ATO'

Druhou možností je odstranit příslušné moduly a znovu je zavést, třeba nějak takto (pozor na další zařízení připojená přes USB sběrnici, zkontrolujte si pomocí lsmod, co všechno „visí“ na modulu usbcore a odstraňte to pomocí rmmod před odstraněním usbcore):

 rmmod option
 rmmod usbserial
 rmmod ehci_hcd
 rmmod uhci_hcd
 rmmod usbcore
 
 modprobe usbcore
 modprobe uhci_hcd
 modprobe ehci_hcd
 modprobe usbserial
 modprobe option

Pokud zavádíte modul usbserial ručně, musíte při jeho zavádění přidat příslušné parametry (viz výše).

Poslední možností je upgrade na novější jádro, kde je chyba již vyřešena. Doufejme, že chyba bude opravena i v případě modemu ADU-510L (možná už je, tato informace je již nějakou dobu stará).

Zdroje

CDMA, AnyData a FreeBSD