Moved WPA setup etc. association processing away from driver_*.c
authorJouni Malinen <jouni.malinen@atheros.com>
Fri, 9 Jan 2009 14:13:07 +0000 (16:13 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 9 Jan 2009 14:13:07 +0000 (16:13 +0200)
This is all details that should not need to be handled in driver_*.c.

hostapd/driver.h
hostapd/driver_bsd.c
hostapd/driver_madwifi.c
hostapd/driver_test.c
hostapd/hostapd.c

index 29cc91b..d13c919 100644 (file)
@@ -216,5 +216,7 @@ void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
 void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
                       const u8 *buf, size_t len, int ack);
 void hostapd_rx_from_unknown_sta(struct hostapd_data *hapd, const u8 *addr);
+int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
+                       const u8 *ie, size_t ielen);
 
 #endif /* DRIVER_H */
index 14c3662..baf10b2 100644 (file)
@@ -530,59 +530,27 @@ static int
 bsd_new_sta(struct bsd_driver_data *drv, u8 addr[IEEE80211_ADDR_LEN])
 {
        struct hostapd_data *hapd = drv->hapd;
-       struct hostapd_bss_config *conf = hapd->conf;
-       struct sta_info *sta;
        struct ieee80211req_wpaie ie;
-       int new_assoc, ielen, res;
-
-       hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
-               HOSTAPD_LEVEL_INFO, "associated");
+       int new_assoc, ielen = 0, res;
+       u8 *iebuf = NULL;
 
-       sta = ap_sta_add(hapd, addr);
-       if (sta == NULL)
-               return -1;
        /*
         * Fetch and validate any negotiated WPA/RSN parameters.
         */
-       if (conf->wpa) {
-               memset(&ie, 0, sizeof(ie));
-               memcpy(ie.wpa_macaddr, addr, IEEE80211_ADDR_LEN);
-               if (get80211var(drv, IEEE80211_IOC_WPAIE, &ie, sizeof(ie)) < 0) {
-                       printf("Failed to get WPA/RSN information element.\n");
-                       return -1;              /* XXX not right */
-               }
-               ielen = ie.wpa_ie[1];
-               if (ielen == 0) {
-                       printf("No WPA/RSN information element for station!\n");
-                       return -1;              /* XXX not right */
-               }
+       memset(&ie, 0, sizeof(ie));
+       memcpy(ie.wpa_macaddr, addr, IEEE80211_ADDR_LEN);
+       if (get80211var(drv, IEEE80211_IOC_WPAIE, &ie, sizeof(ie)) < 0) {
+               printf("Failed to get WPA/RSN information element.\n");
+               goto no_ie;
+       }
+       iebuf = ie.wpa_ie;
+       ielen = ie.wpa_ie[1];
+       if (ielen == 0)
+               iebuf = NULL;
+       else
                ielen += 2;
-               if (sta->wpa_sm == NULL)
-                       sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth,
-                                                       sta->addr);
-               if (sta->wpa_sm == NULL) {
-                       printf("Failed to initialize WPA state machine\n");
-                       return -1;
-               }
-               res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm,
-                                         ie.wpa_ie, ielen, NULL, 0);
-               if (res != WPA_IE_OK) {
-                       printf("WPA/RSN information element rejected? "
-                               "(res %u)\n", res);
-                       return -1;
-               }
-       }
 
-       /*
-        * Now that the internal station state is setup
-        * kick the authenticator into action.
-        */
-       new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0;
-       sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC;
-       wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC);
-       hostapd_new_assoc_sta(hapd, sta, !new_assoc);
-       ieee802_1x_notify_port_enabled(sta->eapol_sm, 1);
-       return 0;
+       return hostapd_notif_assoc(hapd, addr, iebuf, ielen);
 }
 
 #include <net/route.h>
index dfdf79c..47dab48 100644 (file)
@@ -855,23 +855,22 @@ madwifi_set_wps_probe_resp_ie(const char *ifname, void *priv, const u8 *ie,
 #endif /* CONFIG_WPS */
 
 static int
-madwifi_process_wpa_ie(struct madwifi_driver_data *drv, struct sta_info *sta)
+madwifi_new_sta(struct madwifi_driver_data *drv, u8 addr[IEEE80211_ADDR_LEN])
 {
        struct hostapd_data *hapd = drv->hapd;
        struct ieee80211req_wpaie ie;
-       int ielen, res;
-       u8 *iebuf;
+       int ielen = 0, res;
+       u8 *iebuf = NULL;
 
        /*
         * Fetch negotiated WPA/RSN parameters from the system.
         */
        memset(&ie, 0, sizeof(ie));
-       memcpy(ie.wpa_macaddr, sta->addr, IEEE80211_ADDR_LEN);
+       memcpy(ie.wpa_macaddr, addr, IEEE80211_ADDR_LEN);
        if (set80211priv(drv, IEEE80211_IOCTL_GETWPAIE, &ie, sizeof(ie))) {
-               wpa_printf(MSG_ERROR, "%s: Failed to get WPA/RSN IE",
+               wpa_printf(MSG_DEBUG, "%s: Failed to get WPA/RSN IE",
                           __func__);
-               printf("Failed to get WPA/RSN information element.\n");
-               return -1;              /* XXX not right */
+               goto no_ie;
        }
        wpa_hexdump(MSG_MSGDUMP, "madwifi req WPA IE",
                    ie.wpa_ie, IEEE80211_MAX_OPT_IE);
@@ -891,54 +890,15 @@ madwifi_process_wpa_ie(struct madwifi_driver_data *drv, struct sta_info *sta)
                        iebuf[1] = 0;
        }
 #endif /* MADWIFI_NG */
-       ielen = iebuf[1];
-       if (ielen == 0) {
-#ifdef CONFIG_WPS
-               if (hapd->conf->wps_state) {
-                       wpa_printf(MSG_DEBUG, "STA did not include WPA/RSN IE "
-                                  "in (Re)Association Request - possible WPS "
-                                  "use");
-                       sta->flags |= WLAN_STA_MAYBE_WPS;
-                       return 0;
-               }
-#endif /* CONFIG_WPS */
-               printf("No WPA/RSN information element for station!?\n");
-               return -1;              /* XXX not right */
-       }
-       ielen += 2;
-       if (sta->wpa_sm == NULL)
-               sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth, sta->addr);
-       if (sta->wpa_sm == NULL) {
-               printf("Failed to initialize WPA state machine\n");
-               return -1;
-       }
-       res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm,
-                                 iebuf, ielen, NULL, 0);
-       if (res != WPA_IE_OK) {
-               printf("WPA/RSN information element rejected? (res %u)\n", res);
-               return -1;
-       }
-       return 0;
-}
-
-static int
-madwifi_new_sta(struct madwifi_driver_data *drv, u8 addr[IEEE80211_ADDR_LEN])
-{
-       struct hostapd_data *hapd = drv->hapd;
-       struct sta_info *sta;
-       int new_assoc;
 
-       hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
-               HOSTAPD_LEVEL_INFO, "associated");
+       ielen = iebuf[1];
+       if (ielen == 0)
+               iebuf = NULL;
+       else
+               ielen += 2;
 
-       sta = ap_get_sta(hapd, addr);
-       if (sta) {
-               accounting_sta_stop(hapd, sta);
-       } else {
-               sta = ap_sta_add(hapd, addr);
-               if (sta == NULL)
-                       return -1;
-       }
+no_ie:
+       res = hostapd_notif_assoc(hapd, addr, iebuf, ielen);
 
        if (memcmp(addr, drv->acct_mac, ETH_ALEN) == 0) {
                /* Cached accounting data is not valid anymore. */
@@ -946,21 +906,7 @@ madwifi_new_sta(struct madwifi_driver_data *drv, u8 addr[IEEE80211_ADDR_LEN])
                memset(&drv->acct_data, 0, sizeof(drv->acct_data));
        }
 
-       if (hapd->conf->wpa) {
-               if (madwifi_process_wpa_ie(drv, sta))
-                       return -1;
-       }
-
-       /*
-        * Now that the internal station state is setup
-        * kick the authenticator into action.
-        */
-       new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0;
-       sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC;
-       wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC);
-       hostapd_new_assoc_sta(hapd, sta, !new_assoc);
-       ieee802_1x_notify_port_enabled(sta->eapol_sm, 1);
-       return 0;
+       return res;
 }
 
 static void
index 6199383..667ed98 100644 (file)
@@ -432,70 +432,12 @@ static int test_driver_new_sta(struct test_driver_data *drv,
                               const u8 *ie, size_t ielen)
 {
        struct hostapd_data *hapd;
-       struct sta_info *sta;
-       int new_assoc, res;
 
        hapd = test_driver_get_hapd(drv, bss);
        if (hapd == NULL)
                return -1;
 
-       hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
-               HOSTAPD_LEVEL_INFO, "associated");
-
-       sta = ap_get_sta(hapd, addr);
-       if (sta) {
-               accounting_sta_stop(hapd, sta);
-       } else {
-               sta = ap_sta_add(hapd, addr);
-               if (sta == NULL)
-                       return -1;
-       }
-       sta->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS);
-
-       if (hapd->conf->wpa) {
-               if (ie == NULL || ielen == 0) {
-                       if (hapd->conf->wps_state) {
-                               sta->flags |= WLAN_STA_WPS;
-                               goto skip_wpa_check;
-                       }
-
-                       printf("test_driver: no IE from STA\n");
-                       return -1;
-               }
-               if (hapd->conf->wps_state && ie[0] == 0xdd && ie[1] >= 4 &&
-                   os_memcmp(ie + 2, "\x00\x50\xf2\x04", 4) == 0) {
-                       sta->flags |= WLAN_STA_WPS;
-                       goto skip_wpa_check;
-               }
-
-               if (sta->wpa_sm == NULL)
-                       sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth,
-                                                       sta->addr);
-               if (sta->wpa_sm == NULL) {
-                       printf("test_driver: Failed to initialize WPA state "
-                              "machine\n");
-                       return -1;
-               }
-               res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm,
-                                         ie, ielen, NULL, 0);
-               if (res != WPA_IE_OK) {
-                       printf("WPA/RSN information element rejected? "
-                              "(res %u)\n", res);
-                       wpa_hexdump(MSG_DEBUG, "IE", ie, ielen);
-                       return -1;
-               }
-       }
-skip_wpa_check:
-
-       new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0;
-       sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC;
-       wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC);
-
-       hostapd_new_assoc_sta(hapd, sta, !new_assoc);
-
-       ieee802_1x_notify_port_enabled(sta->eapol_sm, 1);
-
-       return 0;
+       return hostapd_notif_assoc(hapd, addr, ie, ielen);
 }
 
 
index 04b78f8..8a692ee 100644 (file)
@@ -298,6 +298,75 @@ void hostapd_rx_from_unknown_sta(struct hostapd_data *hapd, const u8 *addr)
 }
 
 
+int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
+                       const u8 *ie, size_t ielen)
+{
+       struct sta_info *sta;
+       int new_assoc, res;
+
+       hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211,
+                      HOSTAPD_LEVEL_INFO, "associated");
+
+       sta = ap_get_sta(hapd, addr);
+       if (sta) {
+               accounting_sta_stop(hapd, sta);
+       } else {
+               sta = ap_sta_add(hapd, addr);
+               if (sta == NULL)
+                       return -1;
+       }
+       sta->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS);
+
+       if (hapd->conf->wpa) {
+               if (ie == NULL || ielen == 0) {
+                       if (hapd->conf->wps_state) {
+                               wpa_printf(MSG_DEBUG, "STA did not include "
+                                          "WPA/RSN IE in (Re)Association "
+                                          "Request - possible WPS use");
+                               sta->flags |= WLAN_STA_MAYBE_WPS;
+                               goto skip_wpa_check;
+                       }
+
+                       wpa_printf(MSG_DEBUG, "No WPA/RSN IE from STA");
+                       return -1;
+               }
+               if (hapd->conf->wps_state && ie[0] == 0xdd && ie[1] >= 4 &&
+                   os_memcmp(ie + 2, "\x00\x50\xf2\x04", 4) == 0) {
+                       sta->flags |= WLAN_STA_WPS;
+                       goto skip_wpa_check;
+               }
+
+               if (sta->wpa_sm == NULL)
+                       sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth,
+                                                       sta->addr);
+               if (sta->wpa_sm == NULL) {
+                       wpa_printf(MSG_ERROR, "Failed to initialize WPA state "
+                                  "machine");
+                       return -1;
+               }
+               res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm,
+                                         ie, ielen, NULL, 0);
+               if (res != WPA_IE_OK) {
+                       wpa_printf(MSG_DEBUG, "WPA/RSN information element "
+                                  "rejected? (res %u)", res);
+                       wpa_hexdump(MSG_DEBUG, "IE", ie, ielen);
+                       return -1;
+               }
+       }
+skip_wpa_check:
+
+       new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0;
+       sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC;
+       wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC);
+
+       hostapd_new_assoc_sta(hapd, sta, !new_assoc);
+
+       ieee802_1x_notify_port_enabled(sta->eapol_sm, 1);
+
+       return 0;
+}
+
+
 #ifdef EAP_SERVER
 static int hostapd_sim_db_cb_sta(struct hostapd_data *hapd,
                                 struct sta_info *sta, void *ctx)