Parto dall'ultimo (comunque sono benvenute discussioni anche sui precedenti, magari mettendone il nome nel titolo per una più veloce identificazione).
Allora, primo problema, con il modulo esterno al kernel ipw2100 (http://ipw2100.sourceforge.net/), serve per la prima versione delle schede mini-pci wireless incluse nei sistemi Centrino, i successivi sono gli ipw2200 (http://ipw2200.sourceforge.net/), ma torniamo al 2100 in quanto io uso quello.
Compilando il driver ho ricevuto il seguente messaggio di errore:
codice:
make -C /lib/modules/2.6.12-rc6/build SUBDIRS=/home/gigi/modules-extra/Wireless/ipw2100-1.1.0
(qui sono andato a capo io per non "allargare" troppo il thread!)
MODVERDIR=/home/gigi/modules-extra/Wireless/ipw2100-1.1.0 modules
make[1]: Entering directory `/usr/src/linux-2.6.12-rc6'
CC [M] /home/gigi/modules-extra/Wireless/ipw2100-1.1.0/ipw2100.o
In file included from /home/gigi/modules-extra/Wireless/ipw2100-1.1.0/ipw2100.h:43,
from /home/gigi/modules-extra/Wireless/ipw2100-1.1.0/ipw2100.c:167:
/home/gigi/modules-extra/Wireless/ipw2100-1.1.0/ieee80211.h:647: error: redefinition of `is_multicast_ether_addr'
include/linux/etherdevice.h:67: error: `is_multicast_ether_addr' previously defined here
make[2]: *** [/home/gigi/modules-extra/Wireless/ipw2100-1.1.0/ipw2100.o] Error 1
make[1]: *** [_module_/home/gigi/modules-extra/Wireless/ipw2100-1.1.0] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.12-rc6'
make: *** [modules] Error 2
In pratica, la funzione "is_multicast_ether_addr" era implementata nel file header ieee80211.h facente parte del modulo e non nei kernel precedenti a questo, da questo è stata invece implementata nel file "include/linux/etherdevice.h", e la cosa non va bene (il compilatore non capisce quale delle due deve usare e... nel dubbio esce con un errore! ).
La soluzione che ho adottato è stata semplicemente di commentare la parte di codice inerente a questa funzione nel modulo, perciò in ieee80211.h, e usare quella implementata nel kernel (mi sembra la scelta più sicura e più funzionale per il sistema).
Applicare questa patch nel modo sopra descritto è molto semplice per chi ha un minimo di dimestichezza con il C/C++ (o anche altri linguaggi), per i più pigri ho però preparato una piccolissima patch da applicare con l'ononimo comando, è la seguente:
codice:
--- ieee80211.h.old 2005-06-07 13:43:44.000000000 +0200
+++ ieee80211.h 2005-06-07 13:43:44.000000000 +0200
@@ -642,11 +642,12 @@
#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
-
+/*
extern inline int is_multicast_ether_addr(const u8 *addr)
{
return ((addr[0] != 0xff) && (0x01 & addr[0]));
}
+*/
extern inline int is_broadcast_ether_addr(const u8 *addr)
{
Se fate un copia/incolla in un file e lo chiamate come l'ho chiamato io: "ieee80211.h-krn-2.6.12-rc6.diff", potete poi applicarlo spostando il file nella directory decompressa del modulo e lanciando:
patch -p0 < ieee80211.h-krn-2.6.12-rc6.diff
dopo potete compilare e installare il modulo senza problemi.