Utiliser le modem ECI USB sous Linux

Ayant besoin d’une connexion à haut débit pour mon travail (je travaille à domicile), et travaillant sous linux, il m’a fallu passer par les affres de la configuration d’une connexion ADSL sous linux.

La configuration en question n’a pas été sans difficulté : tout d’abord équipé d’un modem ethernet (dont la configuration est supposément plus aisée sous linux), je n’ai jamais pu faire marcher celui-ci pour une raison que je n’ai pas pu déterminer (pour ceux intéressés, les requêtes de connexion restaient sans réponses).

C'est donc avec bonheur que j’ai constaté que la connexion avec un modem USB ECI pouvait se faire sans trop de problèmes grâce au pilote eci-adsl développé sur SourceForge.

Installation du pilote

Après avoir téléchargé l’archive compressée depuis le site du projet, et en ayant suivi les différentes indications d’installation (en particulier, la création du fichier /etc/ppp/peers/adsl), j’ai pu lancer la commande /usr/bin/local/startmodem et voir mon modem se connecter à mon fournisseur d’accès (Nerim) du premier coup.

Le hic, c'est qu'il n’a voulu le faire que le premier coup ! Il bloquait ensuite lors de la deuxième partie de la connexion au block 259, ce qui, après moultes recherches s'avéra être dû à un mauvais fichier de synchronisation, qui, une fois changé pour une autre version (version DMT sur Aix-en-Provence), m’a permis de me connecter sans difficulté sur Internet.

Les modules pour le noyau (version 2.4.x) nécessaires à la connexion sont les suivants :

  • usb-uhci pour la gestion du système USB (le pilote uhci compilé directement dans le noyau ne fonctionnait pas avec le modem)
  • ppp_deflate, ppp_generic, slhc, ppp_synctty, af_packet, n_hdlc pour la gestion de la connexion PPP

Réseau local par N.A.T.

Disposant de plusieurs ordinateurs à domicile, j’ai mis en place une translation d’adresse réseau permettant aux autres ordinateurs relié à l’ordinateur assurant la connexion d’accéder à Internet de manière transparente.

Pour cela, il m’a fallu activer les iptables, qui nécessitent les modules suivants : ip_tables, ip_conntrack, iptables_nat, ipt_MASQUERADE, iptable_filter. Les procédures d’installation sont détaillées dans un HOWTO.

Une fois cela fait, utilisant Debian (Woody), j’ai ajouté le fichier iptables suivant dans le répertoire /etc/ppp/ip-up.d/ :

#!/bin/sh

/bin/echo "1" > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o $PPP_IFACE -j MASQUERADE

La première ligne active la transmission des paquets réseaux d’une interface réseau à une autre. La deuxième active la translation d’adresse réseau depuis l’interface indiquée par la variable PPP_IFACE vers les autres interfaces (en l’occurrence, eth0 pour mon installation).

Ensuite, j’ai installé un service DHCP sur l’ordinateur de la connexion avec le fichier /etc/dhcp.conf suivant :

default-lease-time 600;
max-lease-time 7200;

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.2 192.168.0.20;
  option routers 192.168.0.1;
  option domain-name-servers 62.4.16.70, 62.4.17.109;
  }

Cela permet à tout ordinateur sur le réseau local de se connecter directement à internet via DHCP. 192.168.0.1 est l’adresse affectée à l’ordinateur connecté au modem, et que j’ai dû indiquer "en dur" les serveurs DNS de mon fournisseur d’accès (faute d’avoir trouvé un autre moyen).

Branchement à chaud (hotplug)

Devoir lancé en tant que root la commande /usr/local/bin/startmodem ne me paraissant pas très "convivial", j’ai décidé de faire en sorte que la connexion se lance automatiquement lorsque le modem est branché.

J’utilise pour cela les scripts de hotplug (disponible sous débian dans le paquet hotplug). La mise en place de ces scripts pour le cas de mon modem ECI USB se fait de la manière suivante :

  • le fichier /etc/hotplug/usb.usermap.local est comme suit:
    Content of usb.usermap.local in a tabularized format for better reading
    # usb modulematch_flagsidVendoridProductbcdDevice_lobcdDevice_hibDeviceClassbDeviceSubClassbDeviceProtocolbInterfaceClassbInterfaceSubClassbInterfaceProtocoldriver_info
    # match_flags set to 0x0003 seems to correspond to a device matching idVendor and idProduct
    # Device of the chip before loading the firmware
    ez-usb0x00030x05470x21310x00000x00000x00000x000x000x000x000x000x00000000
    # Device of the modem itself
    modem-adsl0x00030x09150x80000x00000x00000x00000x000x000x000x000x000x00000000
    Notez qu'une foit ce fichier ajouté, il faut lancer /usr/sbin/update-usb.usermap [ceci s'applique sans doute uniquement à Debian, pour les autres distributions, il doit sans doute falloir éditer /etc/hotplug/usb.usermap directement]
  • ensutie, j’ai créé les fichiers suivants (en prenant soin de les rendre exécutables), consistant essentiellement en le contenu de /usr/local/bin/startmodem divisé convenablement :
    • /etc/hotplug/usb/ez-usb :
      #!/bin/sh
      
      /usr/local/bin/eci-load1 /usr/local/bin/eci_firm_kit_wanadoo.bin
      if [ $? -ne 0 ] ; then
      	echo "Failed to load firmware" ;
      	exit -1 ;
      fi ;
      echo "Load Firmware OK"
    • /etc/hotplug/usb/modem-adsl :
      #!/bin/sh
      /usr/local/bin/eci-load2 /usr/local/bin/eci_wan3.bin
      if [ $? -ne 0 ] ; then
              echo "Failed to setup the modem" ;
      	exit -1 ;
      fi ;
      echo "  … Setup Modem OK" ;
      
      echo "… modem init OK" ;
      
      echo "Connect Modem …" ;
      nice --20 pppd call adsl updetach
      if [ $? -ne 0 ] ; then
              echo "Connexion failed" ;
      	exit -1 ;
      fi ;
      echo "… Connect Modem OK" ;

Désormais, ma connexion s'établit automatiquement lorsque le modem est branché ! Notez que, en théorie, cela n’est quasiment jamais nécessaire (surtout en ayant l’option persist dans /etc/ppp/peers/adsl), mais que dans la pratique, cela s'avère bien utile :)