]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
FILS: Add new information elements
authorJouni Malinen <jouni@qca.qualcomm.com>
Tue, 1 Sep 2015 14:50:04 +0000 (17:50 +0300)
committerJouni Malinen <j@w1.fi>
Mon, 10 Oct 2016 17:46:33 +0000 (20:46 +0300)
This adds definitions for new information elements from P802.11ai/D11.0
and parsing of these IEs.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/common/ieee802_11_common.c
src/common/ieee802_11_common.h
src/common/ieee802_11_defs.h

index b6bc449bf7dcd347041e30b510f197893765d0c2..603b9616821b2f7806e9a04042a6dd45596f511e 100644 (file)
@@ -179,6 +179,90 @@ static int ieee802_11_parse_vendor_specific(const u8 *pos, size_t elen,
 }
 
 
+static int ieee802_11_parse_extension(const u8 *pos, size_t elen,
+                                     struct ieee802_11_elems *elems,
+                                     int show_errors)
+{
+       u8 ext_id;
+
+       if (elen < 1) {
+               if (show_errors) {
+                       wpa_printf(MSG_MSGDUMP,
+                                  "short information element (Ext)");
+               }
+               return -1;
+       }
+
+       ext_id = *pos++;
+       elen--;
+
+       switch (ext_id) {
+       case WLAN_EID_EXT_ASSOC_DELAY_INFO:
+               if (elen != 1)
+                       break;
+               elems->assoc_delay_info = pos;
+               break;
+       case WLAN_EID_EXT_FILS_REQ_PARAMS:
+               if (elen < 3)
+                       break;
+               elems->fils_req_params = pos;
+               elems->fils_req_params_len = elen;
+               break;
+       case WLAN_EID_EXT_FILS_KEY_CONFIRM:
+               elems->fils_key_confirm = pos;
+               elems->fils_key_confirm_len = elen;
+               break;
+       case WLAN_EID_EXT_FILS_SESSION:
+               if (elen != FILS_SESSION_LEN)
+                       break;
+               elems->fils_session = pos;
+               break;
+       case WLAN_EID_EXT_FILS_HLP_CONTAINER:
+               if (elen < 2 * ETH_ALEN)
+                       break;
+               elems->fils_hlp = pos;
+               elems->fils_hlp_len = elen;
+               break;
+       case WLAN_EID_EXT_FILS_IP_ADDR_ASSIGN:
+               if (elen < 1)
+                       break;
+               elems->fils_ip_addr_assign = pos;
+               elems->fils_ip_addr_assign_len = elen;
+               break;
+       case WLAN_EID_EXT_KEY_DELIVERY:
+               if (elen < WPA_KEY_RSC_LEN)
+                       break;
+               elems->key_delivery = pos;
+               elems->key_delivery_len = elen;
+               break;
+       case WLAN_EID_EXT_FILS_WRAPPED_DATA:
+               elems->fils_wrapped_data = pos;
+               elems->fils_wrapped_data_len = elen;
+               break;
+       case WLAN_EID_EXT_FILS_PUBLIC_KEY:
+               if (elen < 1)
+                       break;
+               elems->fils_pk = pos;
+               elems->fils_pk_len = elen;
+               break;
+       case WLAN_EID_EXT_FILS_NONCE:
+               if (elen != FILS_NONCE_LEN)
+                       break;
+               elems->fils_nonce = pos;
+               break;
+       default:
+               if (show_errors) {
+                       wpa_printf(MSG_MSGDUMP,
+                                  "IEEE 802.11 element parsing ignored unknown element extension (ext_id=%u elen=%u)",
+                                  ext_id, (unsigned int) elen);
+               }
+               return -1;
+       }
+
+       return 0;
+}
+
+
 /**
  * ieee802_11_parse_elems - Parse information elements in management frames
  * @start: Pointer to the start of IEs
@@ -379,6 +463,35 @@ ParseRes ieee802_11_parse_elems(const u8 *start, size_t len,
                        elems->rrm_enabled = pos;
                        elems->rrm_enabled_len = elen;
                        break;
+               case WLAN_EID_CAG_NUMBER:
+                       elems->cag_number = pos;
+                       elems->cag_number_len = elen;
+                       break;
+               case WLAN_EID_AP_CSN:
+                       if (elen < 1)
+                               break;
+                       elems->ap_csn = pos;
+                       break;
+               case WLAN_EID_FILS_INDICATION:
+                       if (elen < 2)
+                               break;
+                       elems->fils_indic = pos;
+                       elems->fils_indic_len = elen;
+                       break;
+               case WLAN_EID_DILS:
+                       if (elen < 2)
+                               break;
+                       elems->dils = pos;
+                       elems->dils_len = elen;
+                       break;
+               case WLAN_EID_FRAGMENT:
+                       /* TODO */
+                       break;
+               case WLAN_EID_EXTENSION:
+                       if (ieee802_11_parse_extension(pos, elen, elems,
+                                                      show_errors))
+                               unknown++;
+                       break;
                default:
                        unknown++;
                        if (!show_errors)
index 42f39096f86ca283db0025b22b645e850fd1db7f..2c20ba6288da983bafdba8245ac2f169188c5e18 100644 (file)
@@ -64,6 +64,20 @@ struct ieee802_11_elems {
        const u8 *pref_freq_list;
        const u8 *supp_op_classes;
        const u8 *rrm_enabled;
+       const u8 *cag_number;
+       const u8 *ap_csn;
+       const u8 *fils_indic;
+       const u8 *dils;
+       const u8 *assoc_delay_info;
+       const u8 *fils_req_params;
+       const u8 *fils_key_confirm;
+       const u8 *fils_session;
+       const u8 *fils_hlp;
+       const u8 *fils_ip_addr_assign;
+       const u8 *key_delivery;
+       const u8 *fils_wrapped_data;
+       const u8 *fils_pk;
+       const u8 *fils_nonce;
 
        u8 ssid_len;
        u8 supp_rates_len;
@@ -96,6 +110,16 @@ struct ieee802_11_elems {
        u8 pref_freq_list_len;
        u8 supp_op_classes_len;
        u8 rrm_enabled_len;
+       u8 cag_number_len;
+       u8 fils_indic_len;
+       u8 dils_len;
+       u8 fils_req_params_len;
+       u8 fils_key_confirm_len;
+       u8 fils_hlp_len;
+       u8 fils_ip_addr_assign_len;
+       u8 key_delivery_len;
+       u8 fils_wrapped_data_len;
+       u8 fils_pk_len;
 
        struct mb_ies_info mb_ies;
 };
index d453aec790add11743eb2f1ce8aa0700d7acf704..fea6eee5ef73834087e6285fe051e72c95dfe26a 100644 (file)
 #define WLAN_EID_VHT_QUIET_CHANNEL 198
 #define WLAN_EID_VHT_OPERATING_MODE_NOTIFICATION 199
 #define WLAN_EID_VENDOR_SPECIFIC 221
+#define WLAN_EID_CAG_NUMBER 237
+#define WLAN_EID_AP_CSN 239
+#define WLAN_EID_FILS_INDICATION 240
+#define WLAN_EID_DILS 241
+#define WLAN_EID_FRAGMENT 242
+#define WLAN_EID_EXTENSION 255
+
+/* Element ID Extension (EID 255) values */
+#define WLAN_EID_EXT_ASSOC_DELAY_INFO 1
+#define WLAN_EID_EXT_FILS_REQ_PARAMS 2
+#define WLAN_EID_EXT_FILS_KEY_CONFIRM 3
+#define WLAN_EID_EXT_FILS_SESSION 4
+#define WLAN_EID_EXT_FILS_HLP_CONTAINER 5
+#define WLAN_EID_EXT_FILS_IP_ADDR_ASSIGN 6
+#define WLAN_EID_EXT_KEY_DELIVERY 7
+#define WLAN_EID_EXT_FILS_WRAPPED_DATA 8
+#define WLAN_EID_EXT_FILS_PUBLIC_KEY 12
+#define WLAN_EID_EXT_FILS_NONCE 13
 
 
 /* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */
@@ -505,6 +523,9 @@ enum lci_req_subelem {
        LCI_REQ_SUBELEM_MAX_AGE = 4,
 };
 
+#define FILS_NONCE_LEN 16
+#define FILS_SESSION_LEN 8
+
 #ifdef _MSC_VER
 #pragma pack(push, 1)
 #endif /* _MSC_VER */