experimentando con wifi (broadcom bcm43xx y atheros madwifi)

He tenido la oportunidad de comprar por Internet uno de esos artilugios geek que son indispensables, en este caso un wardriving kit que consta una tarjeta mini-pci atheros 5004, con su propia antena interna de 2dbi, un pigtail externo SMA, un CD de guias y otro con Backtrack (una distro para seguridad basada en slackware y KDE).
Pero como no soy black hat, dicho "regalito" fue de reyes magos para mi compadre walter, en pocos dias el compa creará en su blog una entrada sobre las "maromas" y huecos para que entrara en su portatil la tarjeta, la antena y peor aun, para que de ella saliera el pigtail! …
ahora la portatil del compa parece un unicornio, con esa antena saliendo de su parte frontal, desventajas?, accidentalmente con la fresadora picó el cable de la corneta derecha, pero el usa más el internet que las cornetas asi que es un fallo sin importancia.

Pero antes de entregarsela, decidí probar sus características e instalarla en mi linux fedora, fue una tarea "ardua" pues según la misma gente de madwifi, el driver es dependiente del kernel y las versiones superiores generan un fallo de inclusión en el make (más específicamente en <linux/config.h>) dicho archivo YA NO EXISTE en kernels superiores a la version 2.6.18, y como yo tengo la 2.6.19 (Linux prozac.jesuslara.com.ve 2.6.19 #11 SMP) entonces evidentemente la formula del simple make, make install NO FUNCIONO.
pero tranquilos, que eso no es nada del otro mundo; solo hay que agregar las siguientes lineas:
#include <linux/version.h>
#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) )
#include <linux/config.h>
#endif

Y eliminar la declaracion inicial de config.h en los archivos afectados, es decir:

hal/linux/ah_osdep.c
ath/if_ath.c
ath/if_ath_pci.c
ath_rate/sample/sample.c
net80211/if_media.c
net80211/ieee80211.c
net80211/ieee80211_beacon.c
net80211/ieee80211_crypto.c
net80211/ieee80211_crypto_none.c
net80211/ieee80211_input.c
net80211/ieee80211_node.c
net80211/ieee80211_output.c
net80211/ieee80211_power.c
net80211/ieee80211_proto.c
net80211/ieee80211_scan.c
net80211/ieee80211_wireless.c
net80211/ieee80211_linux.c
net80211/ieee80211_monitor.c
net80211/ieee80211_acl.c
net80211/ieee80211_crypto_ccmp.c
net80211/ieee80211_scan_ap.c
net80211/ieee80211_crypto_tkip.c
net80211/ieee80211_crypto_wep.c
net80211/ieee80211_xauth.c
(larga no?) …

Fuente

Aunque ahi les envio el fuente ya modificado para funcionar en kernel 2.6.18 en adelante (mi compa con debian etch solo tuvo que hacer mak y make install); no vale la pena notificarlo a madwifi, ellos ya están al tanto del fallo y ya se encuentra corregido en la versión trunk (disponible como estable cuando salga la version 9.3 del driver).

posterior a la correción, solamente tuve que hacer make y make install para obtener el driver.

ejecute:
>modprobe ath_pci
y se creo el dispositivo
>modprobe wlan_scan_sta
y el modulo de scan se debe activar tambien …
a partir de ahi un:
wlist ath0 scan

En fedora hice un paso adicional: crear un archivo en network-scripts para el dhclient

STARTMODE=hotplug
DEVICE=ath0
BOOTPROTO=dhcp
WIRELESS=yes
MODE=Managed
ESSID=any
IPV6INIT=no
onBOOT=yes
USERCTL=no
PEERDNS=no

y ya se puede usar la nueva tarjeta atheros …
(vale acotar que ya walter logró ponerla en modo ap y monitor perfectamente, espero por la mia (que viene en camino) para hacer ese tipo de pruebas).

luego de entregar (con mucha resistencia) el wardriving kit, walter me ha pasado su antigua wifi (para montarla en mi slot mini-pci, pues mi antigua intel pro wireless 2200 se quemó después de un par de experimentos) .

su antigua wifi era una broadcom bcm43xx (la infame y desgraciada); todos (incluso el) han optado por el camino de las ndiswrapper, en mi caso (por eso uso fedora, me encanta el dolor y la catársis que este proporciona), no me gusta ndiswrapper porque asume usar algo "no libre" sino un fork de un driver para windows; el driver para el kernel de la broadcom (el bcm43xx) todos alegan y asegura que el driver está bastante mal documentado e implementado (bueno, si, es cierto); walter me dijo de montarlo con ndiswrapper (yum o apt puro) pero en fin, decidi que no perdía nada en averiguar que "estaba pasando"; el driver viene compilado ‘por defecto’ en el FC6, pero como mi kernel es el 2.6.19, lo habia compilado "por si acaso".
con modprobe bcm43xx inicialmente solicitó el firmware:
para ello hay que obtener una aplicacion (conocida como bcm43xx-fwcutter) en mi caso la descargué y compilé (de la pagina del proyecto, http://bcm43xx.berlios.de), pero usuarios mas noveles pueden agregar a ATRPMS como repositorio de yum y ejecutar:
>yum install bcm43xx-fwcutter
(fuente del bcm43xx-fwcutter)
el problema era el driver para windows, yo no tengo windows!, bueno, que no corra la sangre, para ello descargué la versión ‘mas actual’ que pude conseguir (linksys tenia una mas actual (4.1), pero extrañamente mide 73MB, que es?, un sistema operativo para la tarjeta?) de la siguiente pagina:
>drivers para HP broadcomm version 4.0
como el driver es un .exe (realmente es un zip autoextraible) entonces ejecuté:
>wine sp30381.exe
a lo cual el driver se extrae en el wine drive c (para los que no tengan wine, ejecuten yum install wine).
>cd /home/jesuslara/.wine/drive_c/SWSetup/SP30381A/ (la ruta completa a mi wine, drive_c de wine y al driver extraido).
la lo cual caemos en la carpeta donde está el archivo que necesitamos (el bcmwl5.sys)
verificamos que nos sirve:
>bcm43xx-fwcutter -i bcmwl5.sys
 
  filename   :  bcmwl5.sys
  version    :  3.100.65.1
  MD5        :  d5f1ab1aab8b81bca6f19da9554a267a
  microcodes :  2 4 5
  pcms       :  4 5

  microcode  :  2
  revision   :  0x0123
  patchlevel :  0x0021
  date       :  2005-01-22
  time       :  19:48:06

  microcode  :  4
  revision   :  0x0123
  patchlevel :  0x0021
  date       :  2005-01-22
  time       :  19:48:06

  microcode  :  5
  revision   :  0x0123
  patchlevel :  0x0021
  date       :  2005-01-22
  time       :  19:48:06

ejecutamos la "creación del firmware"
>bcm43xx-fwcutter -w /lib/firmware bcmwl5.sys (/lib/firmware es donde se guardan los firmware de algunos dispositivos en varias distro).

luego de "creado" el firmware, debemos corregir un "detalle" del modulo creando un archivo en:
>touch /etc/modprobe.d/bcm43xx
y copiamos dentro lo siguiente:

alias pci:v000014E4d0x00004301sv*sd*bc*sc*i* bcm43xx
alias pci:v000014E4d0x00004307sv*sd*bc*sc*i* bcm43xx
alias pci:v000014E4d0x00004318sv*sd*bc*sc*i* bcm43xx
alias pci:v000014E4d0x00004320sv*sd*bc*sc*i* bcm43xx
alias pci:v000014E4d0x00004324sv*sd*bc*sc*i* bcm43xx
alias pci:v000014E4d0x00004325sv*sd*bc*sc*i* bcm43xx

guardamos y removemos el driver del kernel:
>rmmod bcm43xx
y volvemos a cargar:
>modprobe bcm43xx

esta vez, dmesg no se llena de errores.
levantamos la interfaz:
>ifconfig eth1 up

Nota: ahora si aparece un fallo del driver en dmesg; me encuentro investigando que significa:
bcm43xx: Radio turned on
bcm43xx: ASSERTION FAILED (radio_attenuation < 10) at: drivers/net/wireless/bcm43xx/bcm43xx_phy.c:1496:bcm43xx_find_lopair()
bcm43xx: ASSERTION FAILED (radio_attenuation < 10) at: drivers/net/wireless/bcm43xx/bcm43xx_phy.c:1496:bcm43xx_find_lopair()
bcm43xx: Chip initialized
bcm43xx: 32-bit DMA initialized
bcm43xx: Keys cleared
bcm43xx: Selected 802.11 core (phytype 2)
bcm43xx: ASSERTION FAILED (radio_attenuation < 10) at: drivers/net/wireless/bcm43xx/bcm43xx_phy.c:1496:bcm43xx_find_lopair()
ADDRCONF(NETDEV_UP): eth1: link is not ready

Sin embargo: el driver ahora realiza el scan de manera eficiente:
>iwlist eth1 scan
eth1 scan complete:
          Cell 02 – Address: 00:13:10:42:D3:F5
                    ESSID:"dd-wrt"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:6
                    Encryption key:off
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=100/100  Signal level=-51 dBm  Noise level=-73 dBm
                    Extra: Last beacon: 181ms ago

he decidido asociarme:
>iwconfig eth1 essid dd-wrt mode managed channel 6 ap 00:13:10:42:D3:F5
y he "pedido" un IP al dhcp del router:
>dhclient eth1
Internet Systems Consortium DHCP Client V3.0.4-RedHat
Copyright 2004-2006 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

Listening on LPF/eth1/00:14:a4:63:e3:87
Sending on   LPF/eth1/00:14:a4:63:e3:87
Sending on   Socket/fallback
DHCPREQUEST on eth1 to 255.255.255.255 port 67
DHCPACK from 10.2.1.254
bound to 10.2.1.35 — renewal in 267582 seconds.

reviso rutas:
>route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.2.1.0        *               255.255.255.0   U     0      0        0 eth1
default         10.2.1.254      0.0.0.0         UG    0      0        0 eth1

y verifico que hemos asociado "correctamente":
>iwconfig eth1
eth1      IEEE 802.11b/g  ESSID:"dd-wrt"  Nickname:"Broadcom 4318"
          Mode:Managed  Frequency=2.437 GHz  Access Point: 00:13:10:42:D3:F5  
          Bit Rate=11 Mb/s   Tx-Power=18 dBm  
          RTS thr:off   Fragment thr:off
          Encryption key:off
          Link Quality=48/100  Signal level=-61 dBm  Noise level=-73 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Si todo esta ‘correcto’ podremos navegar sin problemas; tiene muchisimos defectos el driver, a una moderada distancia del ap pierde su asociación de manera recurrente; suele "embasurar" algunos paquetes icmp y no enciende permanentemente el led de wireless, sino que lo usa como un indicador de "status activity" o de transferencia; haciendo que el led de mi portatil parezca más de disco duro que de wifi.

Pero a la final, con un poco de leer y paciencia, he logrado hacer funcionar el driver bcm43xx en Fedora y este post lo estoy publicando conectado con dicha tarjeta broadcom (no espero para tener mi atheros!, jajaja).

Espero que les sirvan los tips.
PD: fuente del madwifi-9.2.1 editado para ser compilado en kernels superiores a la 2.6.18

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 8 enero 2007 en Linux, PlanetaLinux. Añade a favoritos el enlace permanente. 3 comentarios.

  1. Ya dispuse del fuente de madwifi en la postdata de este post; ya ha sido probado con exito en dos distros con kernel 2.6.18, la mia y el debian etch de walter, espero que alguien más con un kernel nuevo pruebe dicho fuente.

  2. Yo no tuve éxit con la versión 0.9.2.1 y decidí usar los snapshots (http://snapshots.madwifi.org) que se construyen día a día. La distro con que lo compilé y empaqueté es Slackware 11 con kernel 2.6.19.

    Gracias por el dato, un abrazo.

  3. Impresionante, no podía cambiar el kernel por otos motivos, asi que ya estaba pensando en comprame otra tarjeta de red. Intenté tocar las fuentes, pero al final cascaba por otro sitio. Chapo, ya tengo cargado el ath_pci!!!

    Mill gracias!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: