Please note: This project is no longer active. The website is kept online for historic purposes only.
If you´re looking for a Linux driver for your Atheros WLAN device, you should continue here .

Atheros XR mode


This document applies to the madwifi-ng source code. Conclusion provided here were based on the analysis of the source code revision r1531.

Theory of operation

XR means "eXtended Range". This is a mode which extends the operational range of an AP by using lower and non standards rates : 0.25 Mb, 0.5 Mb, 1 Mb, 2 Mb, 3 Mb. It probably use the OFDM modulation as in 802.11g. Since it's a proprietary Atheros extension, several points needs to be taken care of :

  • XR mode only works between two devices having such capabilities. To know the capabilities of an AP, a special Information Element (IE XR) is contained in its beacon.
  • An AP might handle clients in XR mode and clients in non-XR mode. Since non-XR mode clients won't receive XR mode packet, we might have a hidden node problem. To avoid this situation, the XR mode seems to be a polled mode. The polling is probably initiated by the AP which issues a CTS request to forbid other station from transmitting. During this period, XR packets are sent between XR STA and XR AP.
  • Normally, AP beacons are broadcasted at 1 Mb rate since it's the lowest common denominator across all clients. When operating in XR mode, this is no longer the case. So, it might be needed for the AP to broadcast beacons at the 0.25 Mb rate as well.

Functional description

  • To enable XR mode :
    iwpriv wlan0 xr 1
  • To disable XR mode :
    iwpriv wlan0 xr 0

Implementation description

By reading the madwifi source code, it seems that the XR mode is implemented using a special VAP. Currently, madwifi is only supporting XR mode when operating as a STATION and not as an AP.

  • IE XR description (see net80211/ieee80211_output.c and net80211/ieee80211.h). The ieee80211.h structure has been updated with various capture made.
    struct ieee80211_xr_param {
        u_int8_t  param_id; /* will be IEEE80211_ELEMID_VENDOR = 221 = 0xdd */
        u_int8_t  param_len; /* 26 = 0x1a bytes */
        u_int8_t  param_oui[3]; /* will be ATH_OUI = { 0x00, 0x03, 0x7f } */
        u_int8_t  param_oui_type; /* will be ATH_OUI_TYPE_XR = 0x03 */
        u_int8_t  param_oui_sybtype; /* will be ATH_OUI_VER_XR = 0x01 */
        u_int8_t  param_version; /* 0 */
        u_int16_t param_Info; /* 0 */
        u_int8_t  param_base_bssid[IEEE80211_ADDR_LEN];
        u_int8_t  param_xr_bssid[IEEE80211_ADDR_LEN];
        u_int16_t parem_base_beacon_interval; /* little endian : 100ms ?*/
        u_int16_t param_xr_beacon_interval; /* little endian : 300ms ?*/
        u_int8_t  param_base_ath_capability;
        u_int8_t  param_xr_ath_capability;