D-Link DWL-900+ Hack

dwl-900ap.jpg
Il DWL-900+ si presta ad alcune modifiche interessanti.
Passiamo subito al dunque, le possibili modifiche che conosco sono le seguenti.

NOTA: tutte le modifiche proposte qui potrebbero danneggiare il vostro Access Point. Anche se fino ad ora non sono mai venuto a conoscenza di un caso di danneggiamento irreversibile dell'AP, è bene partire col questo ordine di idee: che l'AP da modificare è “sacrificabile” (in nome della curiosità :) ).

Acinonyx firmware hack! Piu' potenza e risolti vari bug!

Questo firmware modificato (versione 3.06) permette di impostare la potenza di uscita a 18dB e risolve un bug che rendeva i firmware superiori alla versione 3.02 inutilizzabili per i link a lunga distanza! Infatti dolo la versione 3.02 la selezione dell'antenna non funziona più, o meglio funziona a metà: l'antenna ricevente, infatti, rimane sempre quella interna, a prescindere dall'impostazione effettuata! Senza eliminare dunque lo switch del diversity i nuovi firmware non si possono utilizzare per link superiori ai 100m!
Dopo aver sostituito la versione 3.02 con questo firmware la maggior parte delle persone hanno riscontrato maggiori prestazioni, anche installandolo su uno solo degli endpoint! Le prestazioni in molti casi sono aumentate del 10-20%, mentre nel mio caso sono piu' che raddoppiate!

Il firmware hack 0.6 ha le seguenti caratteristiche:

  • Antenna selection remains the same for both RX and TX
  • More TX power control settings (0 - 18dbm)
  • Power control works on all modes
  • Additional channels (12, 13 and 14)
  • Better web interface

Scaricabile qui: http://www.acinonyx.tk/
Oppure dal nostro mirror: 3.06_mod_0.6_acinonyx.zip

Trasfromazione di un DWL-900+ rev B in un US Robotics USR2249

Questa modifica è stata effettuata, che io sappia, per la prima volta da Napoliwireless.net (cioè noi) con l'ausilio di Nabuk.org (Nabuk ha gentilmente deciso di immolare uno dei suoi AP).
L'access point US Robotics a 22 Mbit (USR842249) è praticamente identico al DWL-900+ rev B, c'e' solo una piccola differenza nella disposizione dei componenti sul PCB.
La grossa differenza sta nel firmware: la D-Link infatti sta facendo uscire una nuova versione ogni uno o due mesi, mentre US Robotics ne ha rilasciate pochissime (io ne conosco solo una); il firmware USR sembra inoltre essere molto più stabile e performante di quello D-Link (tutto questo nonostante il firmware sia prodotto comunque da una terza società, la Global Sun Technologies).
Detto questo, il mio pallino è stato di capire se si potesse installare il firmware US Robotics sul DWL-900+ rev B. La Global Sun Technologies ha previsto una mossa del genere ed ha incluso nel firmware un identificativo di versione che comprende anche identificativo del produttore dell'hardware (il Vendor ID). Il vendor ID entra a far parte del checksum del firmware, e se si tenta di caricare un firmware di un produttore diverso si ottiene il classico “Checksum Error”.
Per fortuna, il checksum viene fatto proprio facendo una sorta di somma dei byte che compongono il firmware (l'algritmo in ogni caso non ci è noto, ma ci piacerebbe saperlo). Siccome il vendor ID è costituito da un solo Byte, anche il checksum cambia di poco, anzi per fortuna di pochissimo: in pratica se la differenza tra due vendor ID è pari a X, basta sommare X al checksum (considerato come un numero little endian a 32 bit) per ottenere un checksum valido per la modifica del vendor ID.
Il vendor ID si trova alla fine del file .bin del firmware, insieme all'ID di versione del firmware; l'ID di versione è costituito da 24 caratteri ed è in genere simile alla stringa che segue (è quello del DWL900+ rev B):
GL2422AP-00-0M0 T1.0 -04

L'ultimo carattere, '4', è il vendor ID che è stato assegnato a D-Link. Quello di US Robotics è '6':
GL2422AP-00-0M0 T1.0 -06

Il checksum del'ultima versione del firmware US Robotics 2249 è:
87 AE 29 26

per trasformare il firmware in qualcosa che il D-Link DWL-900+ rev B accetti come buono si deve cambiare il vendor ID da 6 a 4, sottraendo due, dunque, al vendor ID di US Robotics. Il checksum va dunque aggiornato allo stesso modo, basta sottrarvi 2:
87 AE 29 24

Le modifiche vanno fatte con un editor esadecimale ovviamente (ricordate che il carattere ASCII '4' corisponde a 34 in esadecimale e '6' a 36).
Le istruzioni che ho riportato sono valide per trasformare un Access Point di qualsiasi altra marca che sia basato sullo stesso Hardware del DWL-900+. Tuttavia è stato appurato che tale sistema funziona solo quando il checksum del firmware è “fatto in un certo modo”; in pratica ci sono versioni del firmware con le quali questo giochetto non funziona. Sfortunatamente non ci è noto l'algoritmo per calcolare il checksum.

Cmq, ecco dei firmware già modificati, uno per trasfromare il DWL-900+ rev B in USR2249
Firmware per trasfromare il DWL-900+ rev B in USR2249

Questo firmware dovrebbe servire per tornare indietro, ad un firmware versione 2.2 (è stata usata con successo da tutti coloro che ci hanno provato)
Firmware per ritrasformare DWL-900+ trasformato in USR2249 di nuovo in un vero DWL-900+ DLink
Dopo essere tornati indietro, non dimenticate di aggiornare il firmware ad una versione più recente.

Ecco il programma standalone per amministrare l'AP:
Programma di gestione dell'Access Point per l'USR2249
NOTA: dopo l'update l'Access Point potrebbe essere configurato per ottenere l'IP tramite DHCP. Se non avete un server DHCP dovete usare per forza il programma di gestione di US Robotics. Per default l'AP US Robotics ha Username e Password non settate, se ve le chiede dovreste lasciarle vuote

Il link che segue punta ad un file che ho trovato sulla rete, contenente molti firmware già modificati, che servono per trasformare Access Point di vari produttori in un DWL-900+ rev B.
Firmware vari per trasformare Access Point di varie marche in D-Link DWL900+

Ecco una foto fatta da Nabuk che dimostra l'avvenuta trasformazione di un DWL-900+ rev B in USR2249 (click per ingrandire)

NOTA: questa modifica ha funzionato per noi, ma non c'è nessuna garanzia che non possa rendere inutilizzabile il vostro Access Point. Inoltre con buona probabilità la garanzia viene invalidata.

Aumento della potenza di uscita a 20dB

E' possibile portare la potenza di uscita dell'Access Point da un massimo di 17dB a 20dB. Per farlo è stato necessario modificare il firmware. Il firmware modificato funziona sia sul DWL900+ rev B che Rev C1 e lo trovate qui:
http://home.earthlink.net/~mlampie/PowerHackDWL-900+.html

Se non dovesse funzionare piu' questa pagina, usate le mie copie:

NOTA: per la Rev C2 il power hack non funziona ancora

Purtroppo il sistema per calcolare il checksum è noto solo ai ragazzi che hanno fatto queste versioni del firmware modificate, e quindi non possiamo provare nessun hack fatto da noi fino a quando non ci riveleranno l'algoritmo (o lo scopriamo noi da soli).

Ecco un'immagine di Netstumbler che evidenzia la differenza trà i 17 dB del firmware standard ed i 20 dB del firmware modificato:
{{:hack:20db_dwl900plus_power_hack.gif?nolink}

Una curiosità. Anche senza modificare il firmware, con la versione 3.05b2 è possibile effettuare una sorta di hack, semplicemente forzando il valore della potenza di uscita a 20 nella pagina di configurazione dell'access point.
Per farlo è necessario conoscere un po' di HTML (salvare e modificare la pagina dove si cambia la potenza di uscita) oppure procurarsi Mozilla ed usare il suo DOM-Inspector per modificare al volo il valore della combo-box.
Il risultato che si ottiene è un segnale molto più stabile, anche se non c'e' un vero e propio scalino come nel caso del firmware modificato:
{{:hack:20db_dwl900plus_power_hack_no_firmware.gif?nolink}

Per realizzare questo hack usando il DOM inspector di Mozilla:

  1. Caricare Mozilla/Firefox
  2. Selezionare il menu Tools→DOM Inspector
  3. Nella barra degli indirizzi del DOM Inspector scrivete: http://192.168.0.50/adv_perform.html (sostituite a 192.168.0.50 l'indirizzo del vostro AP)
  4. Selezionate il menu Search→Select element by Click
  5. Cercate il combo-box dove si sceglie la potenza di uscita nel browser del DOM Inspector
  6. Cliccateci sopra: una cornice rossa intorno alla combo-box dovrebbe lampeggiare
  7. Appena al di sopra del browser del DOM Inspector verrà selezionato il nodo (SELECT) corrispondente alla combo box
  8. Cliccate due volte sul nodo SELECT per aprirlo
  9. Scegliete il primo sottonodo (OPTION)
  10. Nel pannello di fianco dovrebbe apparire adesso sotto il campo “nodeName” il valore “value” seguito da “17”
  11. Cliccate su value col tasto destro e scegliete “Edit”
  12. Scrivete 20 al posto di 17
  13. Nel browser del DOM Inspector cliccate sul pulsante “Apply” per applicare il cambiamento effettuato
  14. Fine

Aumento della potenza di uscita, modifica hardware

Modifica hardware per portare al massimo la potenza di uscita del dwl900ap+ rev C2 e B, di Francesco Berti (http://www.selit.it)

Dopo le piccole modifiche riguardanti lo switch del diversity finalmente si è giunti ad hackerare seriamente la parte radio del dwl900ap+ Guardando a fondo nella sezione radio del dwl900ap+ rev C2 è facile notare la presenza di un trasceiver della Maxim MAX2820 e di un finale RF sempre della Maxim MAX2242 capace di erogare 22 dBm.
Naturalmente entrambi questi componenti sono controllati opportunamente dal dsp che impone quindi la potenza massima di uscita al valore stabilito nel firmware.
Leggendo il datasheet del MAX2820 si può notare che il pin 12 va a controllare il guadagno dell' ultimo stadio, infatti variando questa tensione da 0 a 2 Volts è possibile modificare il guadagno in un range di ben 35 dB.
Dal datasheet del MAX 2242 si evince la possibilità di avere in uscita 22 dBm se si fornisce l'opportuna corrente di Bias.
Quindi ponendo a massa il pin 12 del Max 2820 si porta il driver alla massima potenza di uscita e ponendo una resistenza da 6800 ohm verso massa dal pin Bias del Max 2242 si otterrà in uscita la massima potenza di circa 22 dBm.

Nella foto qui sotto sono evidenziati i chip sopra menzionati:

Il pin Bias è connesso al DAC tramite una pista posta sulla parte sottostante dello stampato, per modificare il valore di questa corrente sarà necessario sostituire una resistenza da 0 ohm ( un corto ) posta vicino al Max 2820 con una da 8.2 Kohm ed aggiungerne una da 6.8 Kohm fra il pin bias e la massa; così facendo avremo sempre il 22 dBm in uscita con 3.3 V di alimentazione.
Ovviamente viste le dimensione della scheda dovrete necessariamente utilizzare resistenze smd.
Per maggior chiarezza vi riporto qui sotto una foto della modifica:

La stessa modifica è applicabile alla rev B; il trasceiver in questo caso non è un Maxim, ma un RFMD 2948 ed il pin del controllo guadagno è li numero 8, questo andrà posto a 2.8 V a differenza di quello del Maxim che dovevamo porre a 0 V.
La modifica quindi può riassumersi semplicemente nel cortocircuitare il pin 7 ed il pin 8 assieme, visto che sul pin 7 abbiamo i 2.8 V a disposizione.
Da prove effettuate nella rev B questa modifica è quasi inutile se si utilizza il firmware hackerato, visto che il pin 8 viene posto a 2.1 V direttamente settando maxpower nel menù di configurazione.
Invece ritengo interessante nella rev B applicare comunque la modifica al controllo bias del finale RF.
Vi allego per comodità i datasheet dei componenti riportati in questo articolo così che possiate farvi un idea migliore del funzionamento della parte Rf di questi access point.

Power Over Ethernet per il DWL-900+ rev B

Questa modifica è discussa sul sito di Ralph Fowler insieme, nella pagina dedicata interamente all'Access Point D-Link:
http://www.ralphfowler.com/links/dwl900.html

Una modifica per la rev C dovrebbe essere del tutto analoga, ma non mi sono mai applicato a studiarla.

Alimentare il DWL-900+ con tensioni superiori a 5 volt

Sempre sul sito di Ralph Fowler viene dimostrato che è possibile alimentare il DWL-900+ con un voltaggio superiore ai 5v (fino ad una trentina!)

Al suo interno c'è infatti un convertitore switching DC/DC, in grado di accettare in input tensioni da 5 a 30 volt e di dare in output sempre 5 volt.
Perchè usare una tensione maggiore? I motivi che conosco io sono tre: è possibile usare un solo alimentatore da più di 5 volt per più apparecchiature; è posibile usare delle batterie da 6 o 12 volt senza alcun convertitore aggiuntivo; si possono usare cavi per il passaggio della tensione in continue anche mooooolto lunghi e sottili.
Ci sono moltissimi apparecchi alimentati a 12 o 9 volt, che vengono forniti spesso con alimentatori sovradimensionati (in genere dal doppio al quadruplo); è quindi possibile usare uno slo di questi alimentatori per alimentare ad esempio 2 DWL900+ ed uno switch.
Nel caso dell'alimentazione a batteria, la presenza del convertitore switching integrato è una manna: si evita infatti di dover convertire esternamente la tensione della batteria da 12 (o 6) a 5 volt (cosa che se non viene fatta appunto con un convertitore switching comporta un enorme spreco di energia ed una durata molto inferiore delle batterie).
Quando poi si devono far percorrere decine di metri alla corrente continua, magari su un doppino sottilissimo come quello dell'ethernet, è facile che all'altro capo la tensione che arriva è decisamente inferiore ed insufficiente ad alimentare gli apparecchi. Mentre mettendo un bel alimentatore da 12, si possono percorrere decine o centinaia di metri di cavo prima che la tensione scenda a meno di 5.

Transforming a DWL-900+ rev B to a US Robotics USR2249

This site is not in English, but because this hack has ben implemented by NapoliWireless.net I think that is difficult to find this information in a language other than Italian.
So, there are just the essential informations to transform an Access Point D-Link DWL-900+ rev B to an US Robotics USR 2249 (842249), just loading the USR firmware to the D-Link device. The USR Firmware has ben modified to let the D-Link one think that we are flashing an original D-Link Firmware.

We supply a firmware to transform the D-Link to an USR:
Firmware to transform DWL-900+ rev B to USR2249

And also a firmware to roll back to the D-Link firmware, back to version 2.2.
Firmware to roll back a DWL-900+ transformed in USR2249 again to a real DLink DWL-900+
Don't forget to upgrade to a newer version: 2.2 is very buggy.

The following file contains some firmware found on the Internet that let you transform some AP from varius vendor to a DLink DWL-900+ rev B.
Firmware files that let you transform Access Points from various vendors to a D-Link DWL900+

NOTE: After you trasnform the DWL-900+ to USR2249 the AP may be configured to be a DHCP client. If you don't have a DHCP server you should use the USR2249 configuration utility to set a static IP. Default username and password are blank.
USR2249 configuration utility

Why you should do the change? Because US Robotic's firmware looks like to be more stable and performat than the D-Link one. And also think about that: D-Link is releasing almost a firmware revision every 1 or 2 month, while US Robotics just released 1 or 2 upgrades.

A picture from Nabuk that show the DWL-900+ rev B transformed to a USR2249 (click to enlarge)

NOTE: this firmware files are ONLY for DWL-900+ hardware revision B and US Robotics USR2249. There is no warranty that flashing your AP with a firmware coming from another vendor would not destroy you device. The warranty may also be lost.

Checksum calculator

MIRROR DI:
http://acinonyx.silverton.gr/dwl_checksum/README http://acinonyx.silverton.gr/dwl_checksum/dwl_checksum.c

DWL-900AP+/800AP+/810 Modification Instructions

  • Unarj some_firmware.bin (is actually an arj archive)
  • Modify NML.MEM image
  • Arj NML.MEM back to some_firmware.bin
  • Pad zeros to end of some_firmware.bin until it reaches size 0xe0000
  • Copy hardware version string starting at address 0xdffe0
  • Compile dwl_checksum.c:
    gcc -o dwl_checksum dwl_checksum.c
  • Calculate 32bit checksum:
    dwl_checksum < some_firmware.bin
  • Copy 32bit checksum (lsbyte to msbyte) at address 0xdfffc

;-)

#include <stdio.h>
#include <stdint.h>
 
#define SIZE  0xe0000
#define MAGIC 0xaabbbbaa
 
int
main (void)
{
  int data;
  uint32_t checksum = 0;
  uint32_t cnt;
 
  for (cnt = 0; (data = getchar ()) != EOF; cnt++)
    {
      checksum ^= ((uint32_t) data) << ((cnt % sizeof checksum) * 8);
    }
 
  checksum ^= MAGIC;
 
  if (cnt != SIZE)
    fprintf (stderr,
	     "WARNING: Firmware size incorrect! Should be exactly %d bytes.\n",
	     SIZE);
  else
    printf ("Checksum: 0x%x\nFile Size: %d bytes\n", checksum, cnt);
 
  return 0;
}

References

hack/dwl_900.txt · Ultima modifica: 2010/12/22 11:43 da midori
 
Recent changes RSS feed Valid XHTML 1.0 Valid CSS Driven by DokuWiki

(C) 2013 Giuseppe Amato - tutti i diritti riservati.