Gyakorlatilag ugyanazt a konfigot használom, mint a 32 bites rendszeren. Meg kellett patkolni a wpa_supplicant-0.6.3.ebuild-et, hogy ugyan már engedélyezze a ralink drivert a config fájlban. Ebből is látszik, hogy a wpa_supplicant-ben a ralink cucc nem a legstabilabb driver. Na mindegy, lássuk 64 biten ez miért nem megy.
Hamar kiderült, hogy nem a driver a hibás, hanem a supplicant, mert a syslogban kiszúrtam, hogy segfaultol. Hát akkor gdb. A gdb backtrace kimutatta, hogy a ralink driver (ralink drivernek nevezem a wpa_supplicant rt61 kernel driverhez ioctl-en keresztül kapcsolódó részét, ami -Dralink kapcsolóra jön elő) a hibás, méghozzá a get_scan_results függvény.
Na most itt egy több órás kínszenvedés következett, amíg rájöttem egy pofon egyszerű, ám elsőre elég váratlan dologra: a kernel rt61 driverében (ez egyébként a legfrissebb CVS rt61 driver) az ULONG típus 32 bites, viszont a wpa_supplicant ralink driverjében már 64. Ezek után már el lehet képzelni, hogy ezek ketten szépen elbeszéltek egymás mellett az ULONG típusú elemeket tartalmazó struktúrák átadása közben... A megoldás pedig annyi, hogy természetesen nem a kernel drivert írom át (mint ahogy azt próbálkozásaim során megtettem párszor), hanem a supplicantos ralink driver headerjében az ULONG definícióját. És működik. A patch olyan rövid, hogy közre is adom itt:
diff -ruN wpa_supplicant-0.6.3.orig/src/drivers/driver_ralink.h wpa_supplicant-0.6.3/src/drivers/driver_ralink.h
--- wpa_supplicant-0.6.3.orig/src/drivers/driver_ralink.h 2008-02-23 03:45:24.000000000 +0100
+++ wpa_supplicant-0.6.3/src/drivers/driver_ralink.h 2008-07-07 18:47:16.000000000 +0200
@@ -78,8 +78,8 @@
#define SHORT int
#define UINT u32
#undef ULONG
-//#define ULONG u32
-#define ULONG unsigned long /* 32-bit in 32-bit CPU or 64-bit in 64-bit CPU */
+#define ULONG u32
+/*#define ULONG unsigned long / * 32-bit in 32-bit CPU or 64-bit in 64-bit CPU */
#define USHORT unsigned short
#define UCHAR unsigned char
@@ -90,7 +90,7 @@
#define BOOLEAN u8
//#define LARGE_INTEGER s64
#define VOID void
-#define LONG long
+#define LONG int
#define LONGLONG s64
#define ULONGLONG u64
typedef VOID *PVOID;
Remélem segít majd másnak is. Ja, és a wpa_supplicant bugzillába is bejelentettem.
- Kodest blogja
- A hozzászóláshoz be kell jelentkezni
- 826 megtekintés
Hozzászólások
bugreport? :)
- A hozzászóláshoz be kell jelentkezni
Ja, és a wpa_supplicant bugzillába is bejelentettem.
- A hozzászóláshoz be kell jelentkezni
Most reagáltak éppen a bugreportomra. Érdekes, hogy a ralinket még soha sem használta amd64-en senki wpa_supplicant-tel.
- A hozzászóláshoz be kell jelentkezni