mac80211: Fix MFP Association Comeback to use Timeout Interval IE
authorJouni Malinen <jouni.malinen@atheros.com>
Mon, 19 Jan 2009 16:48:46 +0000 (18:48 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 29 Jan 2009 21:00:53 +0000 (16:00 -0500)
The separate Association Comeback Time IE was removed from IEEE 802.11w
and the Timeout Interval IE (from IEEE 802.11r) is used instead. The
editing on this is still somewhat incomplete in IEEE 802.11w/D7.0, but
still, the use of Timeout Interval IE is the expected mechanism.

Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/ieee80211.h
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c
net/mac80211/util.c

index 7800e20f197f32f847589b69cbba46e011a03bca..b1bb817d1427875a4ddc2923084fb9dfebc65b57 100644 (file)
@@ -1036,8 +1036,8 @@ enum ieee80211_eid {
        WLAN_EID_HT_INFORMATION = 61,
        /* 802.11i */
        WLAN_EID_RSN = 48,
+       WLAN_EID_TIMEOUT_INTERVAL = 56,
        WLAN_EID_MMIE = 76 /* 802.11w */,
-       WLAN_EID_ASSOC_COMEBACK_TIME = 77,
        WLAN_EID_WPA = 221,
        WLAN_EID_GENERIC = 221,
        WLAN_EID_VENDOR_SPECIFIC = 221,
@@ -1126,6 +1126,12 @@ struct ieee80211_country_ie_triplet {
        };
 } __attribute__ ((packed));
 
+enum ieee80211_timeout_interval_type {
+       WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */,
+       WLAN_TIMEOUT_KEY_LIFETIME = 2 /* 802.11r */,
+       WLAN_TIMEOUT_ASSOC_COMEBACK = 3 /* 802.11w */,
+};
+
 /* BACK action code */
 enum ieee80211_back_actioncode {
        WLAN_ACTION_ADDBA_REQ = 0,
index faa2476a24519958a614f1233077495d54810ba8..a8c72742a8b1cdc45aad49cf5bdf4a05d33eb50d 100644 (file)
@@ -837,7 +837,7 @@ struct ieee802_11_elems {
        u8 *country_elem;
        u8 *pwr_constr_elem;
        u8 *quiet_elem;         /* first quite element */
-       u8 *assoc_comeback;
+       u8 *timeout_int;
 
        /* length of them, respectively */
        u8 ssid_len;
@@ -865,7 +865,7 @@ struct ieee802_11_elems {
        u8 pwr_constr_elem_len;
        u8 quiet_elem_len;
        u8 num_of_quiet_elem;   /* can be more the one */
-       u8 assoc_comeback_len;
+       u8 timeout_int_len;
 };
 
 static inline struct ieee80211_local *hw_to_local(
index 43da6227b37c6392f830285fe218208bf53a659e..b9e4b93089c48c3f79b1fe499815eb8d36917e0b 100644 (file)
@@ -1317,9 +1317,10 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
        ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
 
        if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
-           elems.assoc_comeback && elems.assoc_comeback_len == 4) {
+           elems.timeout_int && elems.timeout_int_len == 5 &&
+           elems.timeout_int[0] == WLAN_TIMEOUT_ASSOC_COMEBACK) {
                u32 tu, ms;
-               tu = get_unaligned_le32(elems.assoc_comeback);
+               tu = get_unaligned_le32(elems.timeout_int + 1);
                ms = tu * 1024 / 1000;
                printk(KERN_DEBUG "%s: AP rejected association temporarily; "
                       "comeback duration %u TU (%u ms)\n",
index 963e0473205c21f179241732cb23325191528fbd..3f559e3d0a7cfbcd5b71bafb27fa14906fc08b3c 100644 (file)
@@ -653,9 +653,9 @@ void ieee802_11_parse_elems(u8 *start, size_t len,
                        elems->pwr_constr_elem = pos;
                        elems->pwr_constr_elem_len = elen;
                        break;
-               case WLAN_EID_ASSOC_COMEBACK_TIME:
-                       elems->assoc_comeback = pos;
-                       elems->assoc_comeback_len = elen;
+               case WLAN_EID_TIMEOUT_INTERVAL:
+                       elems->timeout_int = pos;
+                       elems->timeout_int_len = elen;
                        break;
                default:
                        break;