Merge commit 'garage/master'
[wpasupplicant] / wpa_supplicant / wpa_supplicant.c
index ddfe706..d03e9da 100644 (file)
@@ -21,6 +21,7 @@
 #include "common.h"
 #include "eapol_supp/eapol_supp_sm.h"
 #include "eap_peer/eap.h"
+#include "eap_server/eap_methods.h"
 #include "wpa.h"
 #include "eloop.h"
 #include "config.h"
@@ -510,6 +511,9 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_states state)
                   wpa_supplicant_state_txt(wpa_s->wpa_state),
                   wpa_supplicant_state_txt(state));
 
+       if (state != WPA_SCANNING)
+               wpa_supplicant_notify_scanning(wpa_s, 0);
+
        wpa_supplicant_dbus_notify_state_change(wpa_s, state,
                                                wpa_s->wpa_state);
 
@@ -1295,7 +1299,6 @@ void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
                                   int reason_code)
 {
        u8 *addr = NULL;
-       wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
        if (!is_zero_ether_addr(wpa_s->bssid)) {
                if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
                        ieee80211_sta_deauthenticate(wpa_s, reason_code);
@@ -1305,11 +1308,10 @@ void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
                addr = wpa_s->bssid;
        }
        wpa_clear_keys(wpa_s, addr);
+       wpa_supplicant_mark_disassoc(wpa_s);
        wpa_s->current_ssid = NULL;
        wpa_sm_set_config(wpa_s->wpa, NULL);
        eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
-       eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
-       eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
 }
 
 
@@ -1572,6 +1574,13 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
        wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
        wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
 
+#ifdef CONFIG_AP
+       if (wpa_s->ap_iface) {
+               wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
+               return;
+       }
+#endif /* CONFIG_AP */
+
        if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
                wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
                           "no key management is configured");
@@ -1631,13 +1640,6 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
 }
 
 
-void wpa_supplicant_sta_free_hw_features(struct hostapd_hw_modes *hw_features,
-                                        size_t num_hw_features)
-{
-       ieee80211_sta_free_hw_features(hw_features, num_hw_features);
-}
-
-
 void wpa_supplicant_sta_rx(void *ctx, const u8 *buf, size_t len,
                           struct ieee80211_rx_status *rx_status)
 {
@@ -2120,6 +2122,17 @@ struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
                return NULL;
        }
 
+#ifdef CONFIG_AP
+       ret = eap_server_register_methods();
+       if (ret) {
+               wpa_printf(MSG_ERROR, "Failed to register EAP server methods");
+               if (ret == -2)
+                       wpa_printf(MSG_ERROR, "Two or more EAP methods used "
+                                  "the same EAP type.");
+               return NULL;
+       }
+#endif /* CONFIG_AP */
+
        global = os_zalloc(sizeof(*global));
        if (global == NULL)
                return NULL;
@@ -2243,6 +2256,9 @@ void wpa_supplicant_deinit(struct wpa_global *global)
                wpa_supplicant_dbus_ctrl_iface_deinit(global->dbus_ctrl_iface);
 
        eap_peer_unregister_methods();
+#ifdef CONFIG_AP
+       eap_server_unregister_methods();
+#endif /* CONFIG_AP */
 
        for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
                if (!global->drv_priv[i])