This avoids direct calls to WPA authenticator from eapol_sm.c.
#include "eapol_sm.h"
#include "eloop.h"
#include "common/eapol_common.h"
-#include "wpa.h"
#include "sta_info.h"
#include "eap_server/eap.h"
#include "state_machine.h"
SM_ENTRY_MA(REAUTH_TIMER, REAUTHENTICATE, reauth_timer);
sm->reAuthenticate = TRUE;
- wpa_auth_sm_event(sm->sta->wpa_sm, WPA_REAUTH_EAPOL);
+ sm->eapol->cb.eapol_event(sm->hapd, sm->sta,
+ EAPOL_AUTH_REAUTHENTICATE);
}
}
if (eapol_sm_sta_entry_alive(eapol, addr))
- wpa_auth_sm_notify(sm->sta->wpa_sm);
+ sm->eapol->cb.eapol_event(sm->hapd, sm->sta,
+ EAPOL_AUTH_SM_CHANGE);
}
EAPOL_LOGGER_DEBUG, EAPOL_LOGGER_INFO, EAPOL_LOGGER_WARNING
} eapol_logger_level;
+enum eapol_event {
+ EAPOL_AUTH_SM_CHANGE,
+ EAPOL_AUTH_REAUTHENTICATE
+};
+
struct eapol_auth_cb {
void (*eapol_send)(void *ctx, void *sta_ctx, u8 type, const u8 *data,
size_t datalen);
void (*set_port_authorized)(void *ctx, void *sta_ctx, int authorized);
void (*abort_auth)(void *ctx, void *sta_ctx);
void (*tx_key)(void *ctx, void *sta_ctx);
+ void (*eapol_event)(void *ctx, void *sta_ctx, enum eapol_event type);
};
/**
}
+static void ieee802_1x_eapol_event(void *ctx, void *sta_ctx,
+ enum eapol_event type)
+{
+ /* struct hostapd_data *hapd = ctx; */
+ struct sta_info *sta = sta_ctx;
+ switch (type) {
+ case EAPOL_AUTH_SM_CHANGE:
+ wpa_auth_sm_notify(sta->wpa_sm);
+ break;
+ case EAPOL_AUTH_REAUTHENTICATE:
+ wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH_EAPOL);
+ break;
+ }
+}
+
+
int ieee802_1x_init(struct hostapd_data *hapd)
{
int i;
cb.set_port_authorized = ieee802_1x_set_port_authorized;
cb.abort_auth = _ieee802_1x_abort_auth;
cb.tx_key = _ieee802_1x_tx_key;
+ cb.eapol_event = ieee802_1x_eapol_event;
hapd->eapol_auth = eapol_auth_init(&conf, &cb);
if (hapd->eapol_auth == NULL)