Este artículo explica cómo instalar un módem 3G USB (también conocido como "dongle") Huawei E173 en Linux para conectarse a Internet a través de la red de banda ancha móvil. Actualmente Huawei es el mayor fabricante de equipamiento de redes y equipo de telecomunicaciones de China y del mundo, dejando en el segundo puesto a Ericsson desde el año 2012. Las empresas proveedoras de telefonía móvil ofrecen el acceso a Internet a través de banda ancha móvil e inalámbrica de alta velocidad mediante módems 3G USB. El modelo E173 de Huawei es uno de los muchos que utiliza Movistar para proveer banda ancha móvil en Argentina.

A modo de ejemplo, la instalación del módem 3G Huawei E173 es sobre CentOS 6.3, aunque el procedimiento es el mismo para cualquier distribución.

Lo primero que se debe hacer es insertar el dongle USB en nuestro sistema.

El kernel linux detecta el dispositivo correctamente y se observan los siguientes mensajes en el log:

$ sudo cat /var/log/messages
kernel: usb 2-1.6: new high speed USB device number 7 using ehci_hcd
kernel: usb 2-1.6: New USB device found, idVendor=12d1, idProduct=1c0b
kernel: usb 2-1.6: New USB device strings: Mfr=2, Product=1, SerialNumber=0
kernel: usb 2-1.6: Product: HUAWEI Mobile
kernel: usb 2-1.6: Manufacturer: HUAWEI
kernel: usb 2-1.6: configuration #1 chosen from 1 choice
kernel: scsi8 : SCSI emulation for USB Mass Storage devices
kernel: scsi9 : SCSI emulation for USB Mass Storage devices
kernel: scsi 8:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 2
kernel: scsi 9:0:0:0: Direct-Access     HUAWEI   SD Storage       2.31 PQ: 0 ANSI: 2
kernel: sr1: scsi-1 drive
kernel: sr 8:0:0:0: Attached scsi generic sg2 type 5
kernel: sd 9:0:0:0: Attached scsi generic sg3 type 0
kernel: sd 9:0:0:0: [sdb] Attached SCSI removable disk

Como se observa, el dispositivo ha sido reconocido como un medio removible (CD-ROM). Esto es correcto porque el dongle posee una memoria ROM que contiene los drivers y el instalador tanto para Windows como para GNU/Linux.

Utilizando la herramienta lsusb podemos obtener información de los buses USB en el sistema y los dispositivos conectados:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120
Bus 003 Device 003: ID 0e8f:0022 GreenAsia Inc.
Bus 002 Device 003: ID 12d1:1c0b Huawei Technologies Co., Ltd. E173s 3G broadband stick (modem off)

El kernel detecta el dongle como "broadband stick", módem de banda ancha USB en español.

Para copiar el instalador del driver y el software de conexión es necesario montar el sistema de archivos del dispositivo. En GNOME 2 abrir "Places > Computer":

Doble clic sobre "Movistar 3.5G" para montar el sistema de archivos:

La carpeta "Linux" posee el instalador del driver y software de conexión para GNU/Linux. Desde el intérprete de comandos pasar a superusuario ("root"):

$ sudo su
#

Para realizar la instalación, copiar la carpeta "Linux" al directorio de archivos temporales "/tmp":

# cp -a /media/Movistar\ 3.5G/Linux/ /tmp/

Antes de ejecutar el instalador, cambiar al directorio "/tmp/Linux" y asignar permisos de ejecución al script "install":

# cd /tmp/Linux/
# chmod +x install

Ahora es posible ejecutar el script "install" que se encarga de instalar el driver junto con la aplicación "Mobile Partner" provista por Huawei que se incluye en el dongle. Utilizar el directorio de instalación por defecto "/usr/local/Movistar_3.5G":

# ./install

 Please input the absolute path for install[/usr/local/Movistar_3.5G]: 

Local path is: /usr/local/Movistar_3.5G

Installing Movistar 3.5G.../usr/local/Movistar_3.5G/driver/ndis_driver
Usage: modinfo [-0][-F field][-k kernelversion][-b basedir]  module...
 Prints out the information about one or more module(s).              
 If a fieldname is given, just print out that field (or nothing if not found).
 Otherwise, print all information out in a readable form                      
 If -0 is given, separate with nul, not newline.                              
 If -b is given, use an image of the module tree.                             
ERROR: Removing 'cdc_ether': No such file or directory                        
ERROR: Removing 'usbnet': No such file or directory                           
ERROR: Removing 'hw_cdc_driver': No such file or directory                    
make -C src/ clean                                                            
make[1]: Entering directory `/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src'
rm -rf *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags .tmp_versions Module.symvers Modules.symvers *.order
/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/add_header.sh  "clean" "/lib/modules/2.6.32-358.18.1.el6.x86_64/build/include/linux/usb"                                                                                                                         
rmmod -f hw_cdc_driver                                                                                                               
ERROR: Removing 'hw_cdc_driver': No such file or directory                                                                           
make[1]: *** [clean] Error 1                                                                                                         
make[1]: Leaving directory `/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src'                                                
make: *** [clean] Error 2                                                                                                            
make -C src/ modules                                                                                                                 
make[1]: Entering directory `/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src'                                               
#/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/add_header.sh  "modules" "/lib/modules/2.6.32-358.18.1.el6.x86_64/build/include/linux/usb"                                                                                                                      
make -C /lib/modules/2.6.32-358.18.1.el6.x86_64/build SUBDIRS=/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src modules       
make[2]: Entering directory `/usr/src/kernels/2.6.32-358.18.1.el6.x86_64'                                                            
  CC [M]  /usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/hw_cdc_driver.o                                                   
/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/hw_cdc_driver.c: In function ‘rx_tlp_parse’:                                
/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/hw_cdc_driver.c:602: warning: ISO C90 forbids mixed declarations and code   
  Building modules, stage 2.                                                                                                         
  MODPOST 1 modules                                                                                                                  
  CC      /usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/hw_cdc_driver.mod.o                                               
  LD [M]  /usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/hw_cdc_driver.ko.unsigned                                         
  NO SIGN [M] /usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/hw_cdc_driver.ko                                              
make[2]: Leaving directory `/usr/src/kernels/2.6.32-358.18.1.el6.x86_64'                                                             
strip --strip-debug hw_cdc_driver.ko                                                                                                 
make[1]: Leaving directory `/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src'                                                
make -C src/ install                                                                                                                 
make[1]: Entering directory `/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src'                                               
#install -m 744 -c hw_cdc_driver.ko /lib/modules/2.6.32-358.18.1.el6.x86_64/kernel/drivers/usb/net                                   
#depmod -a
#modprobe hw_cdc_driver
/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src/add_header.sh  "install"
modprobe hw_cdc_driver
make[1]: Leaving directory `/usr/local/Movistar_3.5G/driver/ndis_driver/ndis_src/src'

The Linux NDIS driver is installed successfully.
AUTORUNPATH=/home/emi/.config/autostart
ADDRUNLEVEL=/etc/rc.d/rc5.d
`/etc/rc.d/rc5.d/S99runhwactivator' -> `/etc/init.d/runhwactivator'
`/etc/rc.d/rc5.d/K10runhwactivator' -> `/etc/init.d/runhwactivator'
ADDRUNLEVEL=/etc/rc.d/rc2.d
`/etc/rc.d/rc2.d/S99runhwactivator' -> `/etc/init.d/runhwactivator'
`/etc/rc.d/rc2.d/K10runhwactivator' -> `/etc/init.d/runhwactivator'
ADDRUNLEVEL=/etc/rc.d/rc4.d
`/etc/rc.d/rc4.d/S99runhwactivator' -> `/etc/init.d/runhwactivator'
`/etc/rc.d/rc4.d/K10runhwactivator' -> `/etc/init.d/runhwactivator'
ADDRUNLEVEL=/etc/rc.d/rc3.d
`/etc/rc.d/rc3.d/S99runhwactivator' -> `/etc/init.d/runhwactivator'
`/etc/rc.d/rc3.d/K10runhwactivator' -> `/etc/init.d/runhwactivator'
sed: -e expression #1, char 38: unterminated `s' command
                                                                                                [ done ]

Finished, press any key to exit

El script instala el driver como un módulo del kernel ("hw_cdc_driver"), es posible ver que se encuentra cargado utilizando la herramienta lsmod:

# lsmod | grep cdc
cdc_acm                21702  0
hw_cdc_driver          24786  0
mii                     5376  1 hw_cdc_driver

Luego de la instalación se observa que el "product id" de dispositivo del dongle USB ha cambiado de "1c0b" a "1c05" y se observa "modem on" (antes mostraba "modem off"), de esta forma el dispositivo se reconoce correctamente como un módem 3G y no como un dispositivo de almacenamiento externo:

# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120
Bus 003 Device 003: ID 0e8f:0022 GreenAsia Inc.
Bus 002 Device 004: ID 12d1:1c05 Huawei Technologies Co., Ltd. E173s 3G broadband stick (modem on)

Cuando la instalación finaliza se abre automáticamente la aplicación de conexión "Mobile Partner" para iniciar la conexión:

Clic sobre "Conectar" para iniciar la conexión:

Dependiendo de la señal, tal vez será necesario más de un intento. En la barra inferior se observan las velocidades de transferencia de subida y bajada que están siendo utilizadas en tiempo real.

Además se agrega un icono en la barra de notificaciones de GNOME:

Desde el menú "Ayuda" es posible determinar la versión de la aplicación. En este caso se trata de la versión 21, la cual corresponde con la última versión disponible para GNU/Linux.

Desde "Herramientas > Opciones" es posible indicar que inicie la aplicación automáticamente al iniciar el sistema:

Una vez conectado aparece la nueva interfaz de red "ppp0":

# ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol
          inet addr:186.140.7.3  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:128 (128.0 b)  TX bytes:182 (182.0 b)

La ruta por defecto es a través de la interfaz "ppp0":

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.64.64.64     *               255.255.255.255 UH    0      0        0 ppp0
192.168.234.1   192.168.234.17  255.255.255.255 UGH   0      0        0 tun0
192.168.234.17  *               255.255.255.255 UH    0      0        0 tun0
192.168.100.0   *               255.255.255.0   U     0      0        0 virbr4
10.10.10.0      192.168.234.17  255.255.255.0   UG    0      0        0 tun0
10.10.11.0      192.168.234.17  255.255.255.0   UG    0      0        0 tun0
192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
10.9.0.0        *               255.255.255.0   U     0      0        0 virbr2
192.168.222.0   *               255.255.255.0   U     0      0        0 virbr1
default         *               0.0.0.0         U     0      0        0 ppp0

Desde el explorador es posible navegar al sitio www.whatismyip.com para comprobar que efectivamente estamos accediendo a Internet a través del módem 3G. Notar que la dirección IP es la misma que reporta ifconfig, la cual es una IP pública:

Por supuesto, la aplicación "Mobile Partner" permite enviar y recibir SMS:

usb_modeswitch

Si en lugar de utilizar el driver y la aplicación propietaria se desea utilizar otra herramienta, por ejemplo "NetworkManager" en conjunto con "ModemManager", es necesario instalar la herramienta usb_modeswitch para que el dispositivo se reconozca correctamente como módem 3G y no como dispositivo de almacenamiento externo.

Estos dispositivos USB incluyen los drivers propietarios para Windows y Linux onboard. Cuando se conectan por primera vez, se reconocen como dispositivos de almacenamiento extraíbles e intentan instalar el driver automáticamente. Si el driver ya está instalado, el dispositivo de almacenamiento desaparece y aparece un nuevo dispositivo (por eso el cambio de "product id"), por ejemplo el módem USB. Esta característica se llama "ZeroCD".

En la mayoría de las distribuciones GNU/Linux esto no es necesario, ya que el driver se incluye como un módulo del kernel tal como "usbserial". Sin embargo puede suceder que el dispositivo siga apareciendo como "usb-storage" por defecto. La herramienta usb_modeswitch ("usb-modeswitch" en Debian y derivados) soluciona este inconveniente enviando el comando que realiza el cambio, o switch, en el dispositivo de "usb-storage" a "usbserial".

En CentOS 6.3 usb_modeswitch no es necesario, ya que al instalar la aplicación propietaria ésta se encarga del switch automáticamente.

Realizar los siguientes pasos sólo si se desea utilizar otro driver en lugar del propietario.

Al insertar el dispositivo se observa "modem off" y el product id "1c0b":

# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120
Bus 003 Device 003: ID 0e8f:0022 GreenAsia Inc.
Bus 002 Device 011: ID 12d1:1c0b Huawei Technologies Co., Ltd. E173s 3G broadband stick (modem off)

En CentOS es posible instalar "usb_modeswitch" mediante:

# yum install usb_modeswitch

Los archivos de configuración para los dispositivos soportados se encuentran en el directorio /etc/usb_modeswitch.d/, copiar el archivo de configuración correspondiente para que tenga un nombre más fácil de identificar:

# cp /etc/usb_modeswitch.d/12d1\:1c0b /etc/usb_modeswitch.d/E173s

Luego ejecutar usb_modeswitch indicando el vendor id y product id origen mediante los parámetros -v y -p respectivamente:

# usb_modeswitch -c /etc/usb_modeswitch.d/E173s -v 12d1 -p 1c0b

Looking for target devices ...
 No devices in target mode or class found
Looking for default devices ...          
   found matching product ID             
   adding device                         
 Found device in default mode, class or configuration (1)
Accessing device 003 on bus 002 ...                      
Getting the current device configuration ...             
 OK, got current device configuration (1)                
Using first interface: 0x00                              
Using endpoints 0x0f (out) and 0x8f (in)                 
Inquiring device details; driver will be detached ...    
Looking for active driver ...                            
 OK, driver found ("usb-storage")                        
 OK, driver "usb-storage" detached

SCSI inquiry data (for identification)
-------------------------
  Vendor String: HUAWEI
   Model String: Mass Storage
Revision String: 2.31
-------------------------

USB description data (for identification)
-------------------------
Manufacturer: HUAWEI
     Product: HUAWEI Mobile
  Serial No.: not provided
-------------------------
Setting up communication with interface 0
Using endpoint 0x0f for message sending ...
Trying to send message 1 to endpoint 0x0f ...
 OK, message successfully sent
Resetting response endpoint 0x8f
Resetting message endpoint 0x0f
 Device is gone, skipping any further commands
-> Run lsusb to note any changes. Bye.

Inmediatamente se observa que el dispositivo ahora posee el product id "1c05" correspondiente al módem, además reporta "modem on":

# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120
Bus 003 Device 003: ID 0e8f:0022 GreenAsia Inc.
Bus 002 Device 010: ID 12d1:1c05 Huawei Technologies Co., Ltd. E173s 3G broadband stick (modem on)

Si se desea hacer persistente el cambio, es necesario agregar un regla en el administrador de dispositivos udev

Dentro del directorio "/etc/udev/rules.d/" crear el archivo "40-usb_modeswitch.rules" con el siguiente contenido:

# Huawei E173
ATTRS{idVendor}=="12d1",ATTRS{idProduct}=="1c24", RUN+="/usr/sbin/usb_modeswitch -c /etc/usb_modeswitch.d/E173s -v 12d1 -p 1c0b"

Finalmente reiniciar udev:

service udev restart


Tal vez pueda interesarte


Compartí este artículo