WIRELESS_EXT in include/linux/wireless.h changed between 2.6.9-34.0.2.EL-i686 and 2.6.9-42.0.2.EL from 16 to 18. However, the API does not appear to correspond to version 18 of the wireless extensions. Specifically, the madwifi driver no longer compiles under RHEL4. It fails in the following struct: static struct iw_handler_def ieee80211_iw_handler_def = { #define N(a) (sizeof (a) / sizeof (a[0])) .standard = (iw_handler *) ieee80211_handlers, .num_standard = N(ieee80211_handlers), .private = (iw_handler *) ieee80211_priv_handlers, .num_private = N(ieee80211_priv_handlers), .private_args = (struct iw_priv_args *) ieee80211_priv_args, .num_private_args = N(ieee80211_priv_args), #if WIRELESS_EXT >= 17 .get_wireless_stats = ieee80211_iw_getstats, #endif #undef N }; because get_wireless_stats is now expected to be in struct iw_handler_def, but it is not. get_wireless_stats moved into struct iw_handler_def from struct net_device between versions 16 and 17 of the wireless extensions. The diff is here: http://www.hpl.hp.co.uk/personal/Jean_Tourrilhes/Linux/iw269_we17-12.diff
This is NOTABUG. The relocating get_wireless_stats to iw_handler_def was optional for drivers in the upstream kernel under WE-17. Leaving it in the netdev structure was perfectly acceptable. Moving it breaks kABI guarantees in RHEL only for the benefit for those who are recompiling anyway (and hence should be capable of making minor source changes as necessary).