Как я USB ADSL модем заборол в линуксе

Дата публикации: 2007-01-01
Тут недавно у меня опять приключился день рождения. Точнее у нас с сыном :)
И один друг мне подарил USB ADSL модем, фирмы D-Link, марки DSL-200. Вот оно чудо китайской промышленности

Тут недавно у меня опять приключился день рождения. Точнее у нас с сыном :)
И один друг мне подарил USB ADSL модем, фирмы D-Link, марки DSL-200. Вот оно чудо китайской промышленности

А второй друг подарил мне бубен :)
Нет, я не шучу, совершенно серьезно - самый настоящий бубен, калибр примерно 25 сантиметров - для решения проблем соответсвующих данному калибру. Я его тут же повесил на стеночку на своем рабочем месте. Ну и воспользовавщись этими двумя приборами - и надо сказать у меня получилось! Это была вводная, теперь давайте я расскажу по порядку как лично я заставил работать этот модем в линуксе. Наверняка я много моментов упущу, но вдруг кому то покажется полезным, кому-то поможет в решении аналогичной задачи.
Итак имеем шаманский бубен, ADSL-ный USB-модем D-Link DSL 200 rev b1, тачку со Slackware 10.1 (что-то я ленивый в последнее время стал, или винты такие большие пошли - установку выбрал полную, со всеми пакетами - 2 CD)
Еще залез на сайт http://eciadsl.flashtux.org и долго долго долго его читал (но не потому что читаю плохо, а потому что внимательно). Еще я читал http://eciadsl.sourceforge.net/scripts/forum/ - это форум поддержки ECI
Со странички http://eciadsl.flashtux.org/download.php?lang=en Я скачал Patch kernel 2.4.28/29 - возможно когда вы чиатть это будет и патча то уже не будет :), но скачал я его по этой ссылке http://eciadsl.flashtux.org/download/beta/2.4.28-usb-devio.patch
Скопировал 2.4.28-usb-devio.patch в /usr/src/linux, затем
    cd /usr/src/linux
    patch -p1 < 2.4.28-usb-devio.patch
    
Ядро возможно вполне бы меня и устроило которое шло с дистрибутивом, но его я все же перекомпилировалю (тем более из-за того что патч наложил). Подгрузил конфиг который опять же был для дефолтно собранного ядра и выставил поддержку своего процессора, включил поддержку ATM (и еще там поковырялся - но это вы уж сами, можно по докам из ECI пункты 5.3, 5.3.1, добавил поддержку USB, ну и сетевых вещей относящихся к IP и PPP.
Данный модем построен на чипсете GS7470, поэтому все с той же странички http://eciadsl.flashtux.org/download.php?lang=en в разделе Development version я выбрал пакет EciAdsl Nortek (на момент написания его можно было скачать по адресу: http://eciadsl.flashtux.org/download/nortek-2021/eciadsl-usermode-0.10-nortek-alpha.tar.bz2) Скачал, распаковал в /usr/local/src/eciadsl-usermode-0.10-nortek-alpha, затем стандартно
     cd /usr/local/src/eciadsl-usermode-0.10-nortek-alpha
     ./configure
     make
     make install
     make cfg
    
Поотвечал на вопросы которая задает конфигуратор, старался отвечать правильно, не ошибаясь :). В результате был создан каталог /etc/eciadsl с конфигами и файлом для синхронизации модема synch01.bin. В результате файл /etc/eciadsl/eciadsl.conf выглядел у меня так:
     VID1=2001
     PID1=5100
     VID2=2001
     PID2=5100
     MODE=LLC_SNAP_RFC1483_BRIDGED_ETH_NO_FCS
     VCI=35
     VPI=0
     FIRMWARE=/etc/eciadsl/firmware00.bin
     SYNCH=/etc/eciadsl/gs7470_synch06.bin
     PPPD_USER=username
     PPPD_PASSWD=password
     USE_DHCP=no
     USE_STATICIP=no
     STATICIP=
     GATEWAY=
     MODEM=D-Link DSL200 rev B1
     MODEM_CHIPSET=GS7470
     SYNCH_ALTIFACE=5
     PPPOECI_ALTIFACE=1
     PROVIDER=Other
     DNS1=
     DNS2=
    
Вместо PPPD_USER и PPPD_PASSWD у меня конечно стоят другие логин и пароль который мне дал провайдер, но я вам его не скажу! :). Кроме того эти логин и пароль были записаны в pap-secrets и chap-secrets (Хотя для Волготелекома куда я подключен достаточно авторизации по PAP). Выглядели эти строчки одинаково
     # client        server  secret                  IP addresses
     "username"      *       "password"              *
    
И еще был создан файлик /etc/ppp/peers/adsl вот такого вида
     debug
     kdebug 1
     noipdefault
     defaultroute
     pty "/usr/local/bin/eciadsl-pppoeci -vpi 0 -vci 35 -vendor 0x2001 -product 0x5100 -mode LLC_SNAP_RFC1483_BRIDGED_ETH_NO_FCS"
     sync
     user "username"
     default-asyncmap
     noaccomp
     nopcomp
     noccp
     novj
     holdoff 10
     linkname eciadsl
     maxfail 10
     usepeerdns
     noauth
     lcp-echo-interval 0
     noproxyarp
     persist
    

Из каталога /usr/local/src/eciadsl-... копируем все файлы *.bin в /etc/eciadsl и прописываем первый из них в /etc/eciadsl/eciadsl.conf
   synch=/etc/eciadsl/g7470_synch01.bin
  

Дальше все работы надо проводить со включенной ADSL линией!
Запускаем eciadsl-start.
Если на третьем шаге он очень на долго зависнет,

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

  
или выплюнется с ошибкой - то прописываем по порядку следующий synch*.bin файл, выдергиваем усб-шнур из модема, заново его включаем в модем и снова запускаем eciadsl-start.
Не наступите на те же грабли что и я :). Во первых я запускал все без ADSL-линии - на тот момент она уже работала с другим модемом, и я хотел "поднять" модем сам по себе. Еще я не сразу заметил каталог G7470_SYNCH_BIN и использовал сначала стандартные synch.bin файлы - представьте сколько мне пришлось побегать (а чтобы передернуть усб-шнур мне приходилось пройти метра 3 до сервера где был установлен модем) - ведь стандартных файлов было около 60 (ADSL линия включена не была! :) )
Кстати для этого поддержку USB-устройств, лучше сделать через модули - тогда их можно выгружать и подгружать - бегать к серверу с модемом, для того чтобы выдернуть и снова подключить усб-шнур уже не надо.

Мне повезло, нужный synch.bin файл был 6-м по счету :).
Если же вам не повезло - то отчаиватся не стоит. Есть возможность сделать synch.bin под ваш модем и вашу систему. Но для этого нужно поработать в Windows. Надо скачать USB-sniffer и USB-драйвера ECI Хотя возможно именно ECI драйвера не нужны и нужный файл можно сгенерировать с помощью штатных виндовс-драйверов для вашего модема. Однако хочу сразу сказать - у меня так ничего и не вышло - винда в результате моих манипуляций даже впервые на этом компе у меня вылетела в синий экран :).
Надо отредактировать inf-файлы как сказано в пункте .. и установить их (вместо стандартных конечно)
Затем отключить от усб все кроме модема, запустить снифер (опять же все надо проделать при включенной ADSL-линии) и установить его на модеме.
Затем выдернуть и снова воткнуть усб-шнур, дождаться пока модем синфронизируется и деинсталировать усб-снифер. В каталоге %WinSystemRoot% будет лежать файл usbsnoop.log - его надо передать в линукс в котором вы хотите установить модем любым известным вам способом :) (кстати говоря, у меня не получалось сделать нормальный лог-файл, потому что мне не удавалось деинсталировать нормально снифер - даже при деинсталяции лог-файл продолжал расти.
Затем, когда у вас есть этот лог-файл запускаете
   eciadsl-vendor.pl usbsnoop.log
  
и получаете synch999.bin. Прописываете его в /etc/eciadsl/eciadsl.conf и пробуйте...
root@ftp2:/etc/eciadsl# eciadsl-start

[EciAdsl 1/5] Setting up USB support...

Preliminary USB device filesystem is OK

[EciAdsl 2/5] Uploading firmware...

Process skipped .. no more needed
firmware loaded successfully

[EciAdsl 3/5] Synchronization...

OK eciadsl-synch: success
Synchronization successful

[EciAdsl 4/5] Connecting to provider...

Connection successful

[EciAdsl 5/5] Setting up route table...

Waiting for tap0...
ERROR: couldn't set your static IP or your external gateway
If you don't use PPPoE, please check your configuration.

После этого успешного завершения скрипт хоть и поругался что мол ERROR - но в моем случае все нормально, Волготелеком использует PPPoE, поэтому скрипт eciadsl-start завершается именно так, в результате у меня создается интерфейс tap0 поверх которого и запускается затем PPPoE. Т.е. грубо говоря, eciadsl-start - создал канал, теперь нам надо чтоб он заработали и по нему побежал ip-трафик.
Для этого запускаем adsl-start - это скрипт который сделан для дистрибутивал Slackware и пакета rp-pppoe (и именно им надо воспользоватся если вы не используете slackware и хотите все поднять вручную - мое повествование так глубоко не уходит :) )
root@ftp2:/etc/eciadsl# adsl-start
......... Connected!

После этого, по крайней мере у меня - создался ppp0 который собственно и есть, наше "окно в интернет" Эксперименты я проводил на "левой" тачке, поэтому интерес здесь представляют только интерфейсы tap0 и ppp0 :)
root@ftp2:/etc/eciadsl# ifconfig
bond0     Link encap:Ethernet  HWaddr 00:50:BF:44:32:12
          inet addr:172.20.0.4  Bcast:172.20.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:24218244 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35814940 errors:0 dropped:0 overruns:6 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2130274455 (2031.5 Mb)  TX bytes:1174519034 (1120.1 Mb)

eth0      Link encap:Ethernet  HWaddr 00:50:BF:44:32:12
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:5562532 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11938318 errors:0 dropped:0 overruns:2 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:689679672 (657.7 Mb)  TX bytes:1822811492 (1738.3 Mb)
          Interrupt:9 Base address:0x9000

eth1      Link encap:Ethernet  HWaddr 00:50:BF:44:32:12
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:8210383 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11938311 errors:0 dropped:0 overruns:2 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:661000966 (630.3 Mb)  TX bytes:1824369878 (1739.8 Mb)
          Interrupt:5 Base address:0xb000

eth2      Link encap:Ethernet  HWaddr 00:50:BF:44:32:12
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:10445329 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11938311 errors:0 dropped:0 overruns:2 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:779593817 (743.4 Mb)  TX bytes:1822304960 (1737.8 Mb)
          Interrupt:11 Base address:0xd000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:838 errors:0 dropped:0 overruns:0 frame:0
          TX packets:838 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:41900 (40.9 Kb)  TX bytes:41900 (40.9 Kb)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:213.24.10x.xxx  P-t-P:192.168.222.55  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:92 (92.0 b)  TX bytes:64 (64.0 b)

tap0      Link encap:Ethernet  HWaddr 00:FF:56:EC:E2:9E
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:154 errors:0 dropped:0 overruns:0 frame:0
          TX packets:37 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:9705 (9.4 Kb)  TX bytes:1277 (1.2 Kb)

root@ftp2:/etc/eciadsl# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.222.55  0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
172.20.0.0      0.0.0.0         255.255.255.0   U     0      0        0 bond0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo

Настраиваем роутинг и если надо iptables - и вуаля. Этот этап я тоже особо не расшифровываю - у каждого свои потребности - я например поверх этого соединения создавал еще VPN-туннель, и т.д. и т.п.