]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Return an enum from wpa_validate_wpa_ie()
authorJouni Malinen <jouni@codeaurora.org>
Sat, 28 Mar 2020 10:22:28 +0000 (12:22 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 28 Mar 2020 10:30:46 +0000 (12:30 +0200)
This is more specific then returning a generic int and also allows the
compiler to do more checks.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
src/ap/drv_callbacks.c
src/ap/ieee802_11.c
src/ap/wpa_auth.h
src/ap/wpa_auth_ie.c

index baf3f7c3f1a7b054648802d83159fbf3cd69fea8..f80a3857b5eb0205c721f15dcc95f3a46afb1e35 100644 (file)
@@ -109,7 +109,8 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
                        const u8 *req_ies, size_t req_ies_len, int reassoc)
 {
        struct sta_info *sta;
-       int new_assoc, res;
+       int new_assoc;
+       enum wpa_validate_result res;
        struct ieee802_11_elems elems;
        const u8 *ie;
        size_t ielen;
@@ -323,33 +324,63 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
                                          elems.rsnxe ? elems.rsnxe_len + 2 : 0,
                                          elems.mdie, elems.mdie_len,
                                          elems.owe_dh, elems.owe_dh_len);
-               if (res != WPA_IE_OK) {
+               reason = WLAN_REASON_INVALID_IE;
+               status = WLAN_STATUS_INVALID_IE;
+               switch (res) {
+               case WPA_IE_OK:
+                       reason = WLAN_REASON_UNSPECIFIED;
+                       status = WLAN_STATUS_SUCCESS;
+                       break;
+               case WPA_INVALID_IE:
+                       reason = WLAN_REASON_INVALID_IE;
+                       status = WLAN_STATUS_INVALID_IE;
+                       break;
+               case WPA_INVALID_GROUP:
+                       reason = WLAN_REASON_GROUP_CIPHER_NOT_VALID;
+                       status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID;
+                       break;
+               case WPA_INVALID_PAIRWISE:
+                       reason = WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID;
+                       status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;
+                       break;
+               case WPA_INVALID_AKMP:
+                       reason = WLAN_REASON_AKMP_NOT_VALID;
+                       status = WLAN_STATUS_AKMP_NOT_VALID;
+                       break;
+               case WPA_NOT_ENABLED:
+                       reason = WLAN_REASON_INVALID_IE;
+                       status = WLAN_STATUS_INVALID_IE;
+                       break;
+               case WPA_ALLOC_FAIL:
+                       reason = WLAN_REASON_UNSPECIFIED;
+                       status = WLAN_STATUS_UNSPECIFIED_FAILURE;
+                       break;
+               case WPA_MGMT_FRAME_PROTECTION_VIOLATION:
+                       reason = WLAN_REASON_INVALID_IE;
+                       status = WLAN_STATUS_INVALID_IE;
+                       break;
+               case WPA_INVALID_MGMT_GROUP_CIPHER:
+                       reason = WLAN_REASON_CIPHER_SUITE_REJECTED;
+                       status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY;
+                       break;
+               case WPA_INVALID_MDIE:
+                       reason = WLAN_REASON_INVALID_MDE;
+                       status = WLAN_STATUS_INVALID_MDIE;
+                       break;
+               case WPA_INVALID_PROTO:
+                       reason = WLAN_REASON_INVALID_IE;
+                       status = WLAN_STATUS_INVALID_IE;
+                       break;
+               case WPA_INVALID_PMKID:
+                       reason = WLAN_REASON_INVALID_PMKID;
+                       status = WLAN_STATUS_INVALID_PMKID;
+                       break;
+               }
+               if (status != WLAN_STATUS_SUCCESS) {
                        wpa_printf(MSG_DEBUG,
                                   "WPA/RSN information element rejected? (res %u)",
                                   res);
                        wpa_hexdump(MSG_DEBUG, "IE", ie, ielen);
-                       if (res == WPA_INVALID_GROUP) {
-                               reason = WLAN_REASON_GROUP_CIPHER_NOT_VALID;
-                               status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID;
-                       } else if (res == WPA_INVALID_PAIRWISE) {
-                               reason = WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID;
-                               status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;
-                       } else if (res == WPA_INVALID_AKMP) {
-                               reason = WLAN_REASON_AKMP_NOT_VALID;
-                               status = WLAN_STATUS_AKMP_NOT_VALID;
-                       } else if (res == WPA_MGMT_FRAME_PROTECTION_VIOLATION) {
-                               reason = WLAN_REASON_INVALID_IE;
-                               status = WLAN_STATUS_INVALID_IE;
-                       } else if (res == WPA_INVALID_MGMT_GROUP_CIPHER) {
-                               reason = WLAN_REASON_CIPHER_SUITE_REJECTED;
-                               status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY;
-                       } else if (res == WPA_INVALID_PMKID) {
-                               reason = WLAN_REASON_INVALID_PMKID;
-                               status = WLAN_STATUS_INVALID_PMKID;
-                       } else {
-                               reason = WLAN_REASON_INVALID_IE;
-                               status = WLAN_STATUS_INVALID_IE;
-                       }
                        goto fail;
                }
 
index 1f58ec87cd50a918d0f9ec01c609de2b5c87c0c0..50120c448c6780ef662271ad54afd72464f0af08 100644 (file)
@@ -1611,27 +1611,35 @@ static int auth_sae_queued_addr(struct hostapd_data *hapd, const u8 *addr)
 #endif /* CONFIG_SAE */
 
 
-static u16 wpa_res_to_status_code(int res)
+static u16 wpa_res_to_status_code(enum wpa_validate_result res)
 {
-       if (res == WPA_INVALID_GROUP)
+       switch (res) {
+       case WPA_IE_OK:
+               return WLAN_STATUS_SUCCESS;
+       case WPA_INVALID_IE:
+               return WLAN_STATUS_INVALID_IE;
+       case WPA_INVALID_GROUP:
                return WLAN_STATUS_GROUP_CIPHER_NOT_VALID;
-       if (res == WPA_INVALID_PAIRWISE)
+       case WPA_INVALID_PAIRWISE:
                return WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;
-       if (res == WPA_INVALID_AKMP)
+       case WPA_INVALID_AKMP:
                return WLAN_STATUS_AKMP_NOT_VALID;
-       if (res == WPA_ALLOC_FAIL)
+       case WPA_NOT_ENABLED:
+               return WLAN_STATUS_INVALID_IE;
+       case WPA_ALLOC_FAIL:
                return WLAN_STATUS_UNSPECIFIED_FAILURE;
-       if (res == WPA_MGMT_FRAME_PROTECTION_VIOLATION)
+       case WPA_MGMT_FRAME_PROTECTION_VIOLATION:
                return WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION;
-       if (res == WPA_INVALID_MGMT_GROUP_CIPHER)
+       case WPA_INVALID_MGMT_GROUP_CIPHER:
                return WLAN_STATUS_CIPHER_REJECTED_PER_POLICY;
-       if (res == WPA_INVALID_MDIE)
+       case WPA_INVALID_MDIE:
                return WLAN_STATUS_INVALID_MDIE;
-       if (res == WPA_INVALID_PMKID)
-               return WLAN_STATUS_INVALID_PMKID;
-       if (res != WPA_IE_OK)
+       case WPA_INVALID_PROTO:
                return WLAN_STATUS_INVALID_IE;
-       return WLAN_STATUS_SUCCESS;
+       case WPA_INVALID_PMKID:
+               return WLAN_STATUS_INVALID_PMKID;
+       }
+       return WLAN_STATUS_INVALID_IE;
 }
 
 
@@ -1651,7 +1659,7 @@ void handle_auth_fils(struct hostapd_data *hapd, struct sta_info *sta,
        u16 resp = WLAN_STATUS_SUCCESS;
        const u8 *end;
        struct ieee802_11_elems elems;
-       int res;
+       enum wpa_validate_result res;
        struct wpa_ie_data rsn;
        struct rsn_pmksa_cache_entry *pmksa = NULL;
 
@@ -3044,7 +3052,7 @@ u16 owe_process_rsn_ie(struct hostapd_data *hapd,
        u16 status;
        u8 *owe_buf, ie[256 * 2];
        size_t ie_len = 0;
-       int res;
+       enum wpa_validate_result res;
 
        if (!rsn_ie || rsn_ie_len < 2) {
                wpa_printf(MSG_DEBUG, "OWE: No RSNE in (Re)AssocReq");
@@ -3255,7 +3263,8 @@ static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
        }
 
        if (hapd->conf->wpa && wpa_ie) {
-               int res;
+               enum wpa_validate_result res;
+
                wpa_ie -= 2;
                wpa_ie_len += 2;
                if (sta->wpa_sm == NULL)
index 95544520912894c6bbc7dbe183289ce47de47e08..85fb3d6f62d4a9a0fc46b28613471d33bee496cd 100644 (file)
@@ -331,19 +331,20 @@ void wpa_deinit(struct wpa_authenticator *wpa_auth);
 int wpa_reconfig(struct wpa_authenticator *wpa_auth,
                 struct wpa_auth_config *conf);
 
-enum {
+enum wpa_validate_result {
        WPA_IE_OK, WPA_INVALID_IE, WPA_INVALID_GROUP, WPA_INVALID_PAIRWISE,
        WPA_INVALID_AKMP, WPA_NOT_ENABLED, WPA_ALLOC_FAIL,
        WPA_MGMT_FRAME_PROTECTION_VIOLATION, WPA_INVALID_MGMT_GROUP_CIPHER,
        WPA_INVALID_MDIE, WPA_INVALID_PROTO, WPA_INVALID_PMKID
 };
 
-int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
-                       struct wpa_state_machine *sm, int freq,
-                       const u8 *wpa_ie, size_t wpa_ie_len,
-                       const u8 *rsnxe, size_t rsnxe_len,
-                       const u8 *mdie, size_t mdie_len,
-                       const u8 *owe_dh, size_t owe_dh_len);
+enum wpa_validate_result
+wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
+                   struct wpa_state_machine *sm, int freq,
+                   const u8 *wpa_ie, size_t wpa_ie_len,
+                   const u8 *rsnxe, size_t rsnxe_len,
+                   const u8 *mdie, size_t mdie_len,
+                   const u8 *owe_dh, size_t owe_dh_len);
 int wpa_validate_osen(struct wpa_authenticator *wpa_auth,
                      struct wpa_state_machine *sm,
                      const u8 *osen_ie, size_t osen_ie_len);
index 11153e0b8537432fde6780a6bd1aadbed4a126db..496e8e946dec5e34a488f4c83b108107e671919b 100644 (file)
@@ -548,12 +548,13 @@ static int wpa_auth_okc_iter(struct wpa_authenticator *a, void *ctx)
 }
 
 
-int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
-                       struct wpa_state_machine *sm, int freq,
-                       const u8 *wpa_ie, size_t wpa_ie_len,
-                       const u8 *rsnxe, size_t rsnxe_len,
-                       const u8 *mdie, size_t mdie_len,
-                       const u8 *owe_dh, size_t owe_dh_len)
+enum wpa_validate_result
+wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth,
+                   struct wpa_state_machine *sm, int freq,
+                   const u8 *wpa_ie, size_t wpa_ie_len,
+                   const u8 *rsnxe, size_t rsnxe_len,
+                   const u8 *mdie, size_t mdie_len,
+                   const u8 *owe_dh, size_t owe_dh_len)
 {
        struct wpa_auth_config *conf = &wpa_auth->conf;
        struct wpa_ie_data data;