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
- Tomáš Matějíček, U:Fon v Linuxu a modem ADU-510 CDMA
- CDMA modem O2 hang up (diskuse na Root.cz)
CDMA, AnyData a FreeBSD
- Jan Jílek, ABC Linuxu, AnyDaTa modem FreeBSD