Change EAPOL authenticator hapd pointers to be opaque context

This cleans up the eapol_sm.c interface to not depend on any
hostapd-specific data structures.
This commit is contained in:
Jouni Malinen 2009-11-29 19:49:14 +02:00
parent d79b779204
commit a2befd37cc
3 changed files with 23 additions and 31 deletions

View file

@ -31,16 +31,16 @@ static struct eapol_callbacks eapol_cb;
/* EAPOL state machines are described in IEEE Std 802.1X-2004, Chap. 8.2 */ /* EAPOL state machines are described in IEEE Std 802.1X-2004, Chap. 8.2 */
#define setPortAuthorized() \ #define setPortAuthorized() \
sm->eapol->cb.set_port_authorized(sm->hapd, sm->sta, 1) sm->eapol->cb.set_port_authorized(sm->eapol->conf.ctx, sm->sta, 1)
#define setPortUnauthorized() \ #define setPortUnauthorized() \
sm->eapol->cb.set_port_authorized(sm->hapd, sm->sta, 0) sm->eapol->cb.set_port_authorized(sm->eapol->conf.ctx, sm->sta, 0)
/* procedures */ /* procedures */
#define txCannedFail() eapol_auth_tx_canned_eap(sm, 0) #define txCannedFail() eapol_auth_tx_canned_eap(sm, 0)
#define txCannedSuccess() eapol_auth_tx_canned_eap(sm, 1) #define txCannedSuccess() eapol_auth_tx_canned_eap(sm, 1)
#define txReq() eapol_auth_tx_req(sm) #define txReq() eapol_auth_tx_req(sm)
#define abortAuth() sm->eapol->cb.abort_auth(sm->hapd, sm->sta) #define abortAuth() sm->eapol->cb.abort_auth(sm->eapol->conf.ctx, sm->sta)
#define txKey() sm->eapol->cb.tx_key(sm->hapd, sm->sta) #define txKey() sm->eapol->cb.tx_key(sm->eapol->conf.ctx, sm->sta)
#define processKey() do { } while (0) #define processKey() do { } while (0)
@ -55,7 +55,7 @@ static void eapol_auth_logger(struct eapol_authenticator *eapol,
{ {
if (eapol->cb.logger == NULL) if (eapol->cb.logger == NULL)
return; return;
eapol->cb.logger(eapol->conf.hapd, addr, level, txt); eapol->cb.logger(eapol->conf.ctx, addr, level, txt);
} }
@ -99,7 +99,8 @@ static void eapol_auth_tx_canned_eap(struct eapol_state_machine *sm,
eapol_auth_vlogger(sm->eapol, sm->addr, EAPOL_LOGGER_DEBUG, eapol_auth_vlogger(sm->eapol, sm->addr, EAPOL_LOGGER_DEBUG,
"Sending canned EAP packet %s (identifier %d)", "Sending canned EAP packet %s (identifier %d)",
success ? "SUCCESS" : "FAILURE", eap.identifier); success ? "SUCCESS" : "FAILURE", eap.identifier);
sm->eapol->cb.eapol_send(sm->hapd, sm->sta, IEEE802_1X_TYPE_EAP_PACKET, sm->eapol->cb.eapol_send(sm->eapol->conf.ctx, sm->sta,
IEEE802_1X_TYPE_EAP_PACKET,
(u8 *) &eap, sizeof(eap)); (u8 *) &eap, sizeof(eap));
sm->dot1xAuthEapolFramesTx++; sm->dot1xAuthEapolFramesTx++;
} }
@ -127,7 +128,8 @@ static void eapol_auth_tx_req(struct eapol_state_machine *sm)
eapol_auth_vlogger(sm->eapol, sm->addr, EAPOL_LOGGER_DEBUG, eapol_auth_vlogger(sm->eapol, sm->addr, EAPOL_LOGGER_DEBUG,
"Sending EAP Packet (identifier %d)", "Sending EAP Packet (identifier %d)",
sm->last_eap_id); sm->last_eap_id);
sm->eapol->cb.eapol_send(sm->hapd, sm->sta, IEEE802_1X_TYPE_EAP_PACKET, sm->eapol->cb.eapol_send(sm->eapol->conf.ctx, sm->sta,
IEEE802_1X_TYPE_EAP_PACKET,
wpabuf_head(sm->eap_if->eapReqData), wpabuf_head(sm->eap_if->eapReqData),
wpabuf_len(sm->eap_if->eapReqData)); wpabuf_len(sm->eap_if->eapReqData));
sm->dot1xAuthEapolFramesTx++; sm->dot1xAuthEapolFramesTx++;
@ -220,7 +222,7 @@ SM_STATE(AUTH_PAE, DISCONNECTED)
sm->reAuthCount = 0; sm->reAuthCount = 0;
sm->eapolLogoff = FALSE; sm->eapolLogoff = FALSE;
if (!from_initialize) { if (!from_initialize) {
sm->eapol->cb.finished(sm->hapd, sm->sta, 0, sm->eapol->cb.finished(sm->eapol->conf.ctx, sm->sta, 0,
sm->flags & EAPOL_SM_PREAUTH); sm->flags & EAPOL_SM_PREAUTH);
} }
} }
@ -277,7 +279,7 @@ SM_STATE(AUTH_PAE, HELD)
"%d (%s)", sm->eap_type_supp, "%d (%s)", sm->eap_type_supp,
eap_server_get_name(0, sm->eap_type_supp)); eap_server_get_name(0, sm->eap_type_supp));
} }
sm->eapol->cb.finished(sm->hapd, sm->sta, 0, sm->eapol->cb.finished(sm->eapol->conf.ctx, sm->sta, 0,
sm->flags & EAPOL_SM_PREAUTH); sm->flags & EAPOL_SM_PREAUTH);
} }
@ -303,7 +305,7 @@ SM_STATE(AUTH_PAE, AUTHENTICATED)
sm->eap_type_authsrv, sm->eap_type_authsrv,
eap_server_get_name(0, sm->eap_type_authsrv), eap_server_get_name(0, sm->eap_type_authsrv),
extra); extra);
sm->eapol->cb.finished(sm->hapd, sm->sta, 1, sm->eapol->cb.finished(sm->eapol->conf.ctx, sm->sta, 1,
sm->flags & EAPOL_SM_PREAUTH); sm->flags & EAPOL_SM_PREAUTH);
} }
@ -610,7 +612,7 @@ SM_STATE(REAUTH_TIMER, REAUTHENTICATE)
SM_ENTRY_MA(REAUTH_TIMER, REAUTHENTICATE, reauth_timer); SM_ENTRY_MA(REAUTH_TIMER, REAUTHENTICATE, reauth_timer);
sm->reAuthenticate = TRUE; sm->reAuthenticate = TRUE;
sm->eapol->cb.eapol_event(sm->hapd, sm->sta, sm->eapol->cb.eapol_event(sm->eapol->conf.ctx, sm->sta,
EAPOL_AUTH_REAUTHENTICATE); EAPOL_AUTH_REAUTHENTICATE);
} }
@ -761,12 +763,10 @@ eapol_auth_alloc(struct eapol_authenticator *eapol, const u8 *addr,
int flags, const struct wpabuf *assoc_wps_ie, void *sta_ctx) int flags, const struct wpabuf *assoc_wps_ie, void *sta_ctx)
{ {
struct eapol_state_machine *sm; struct eapol_state_machine *sm;
struct hostapd_data *hapd; /* TODO: to be removed */
struct eap_config eap_conf; struct eap_config eap_conf;
if (eapol == NULL) if (eapol == NULL)
return NULL; return NULL;
hapd = eapol->conf.hapd;
sm = os_zalloc(sizeof(*sm)); sm = os_zalloc(sizeof(*sm));
if (sm == NULL) { if (sm == NULL) {
@ -778,7 +778,6 @@ eapol_auth_alloc(struct eapol_authenticator *eapol, const u8 *addr,
os_memcpy(sm->addr, addr, ETH_ALEN); os_memcpy(sm->addr, addr, ETH_ALEN);
sm->flags = flags; sm->flags = flags;
sm->hapd = hapd;
sm->eapol = eapol; sm->eapol = eapol;
sm->sta = sta_ctx; sm->sta = sta_ctx;
@ -857,7 +856,7 @@ void eapol_auth_free(struct eapol_state_machine *sm)
static int eapol_sm_sta_entry_alive(struct eapol_authenticator *eapol, static int eapol_sm_sta_entry_alive(struct eapol_authenticator *eapol,
const u8 *addr) const u8 *addr)
{ {
return eapol->cb.sta_entry_alive(eapol->conf.hapd, addr); return eapol->cb.sta_entry_alive(eapol->conf.ctx, addr);
} }
@ -928,14 +927,14 @@ restart:
return; return;
} }
sm->eapol->cb.aaa_send( sm->eapol->cb.aaa_send(
sm->hapd, sm->sta, sm->eapol->conf.ctx, sm->sta,
wpabuf_head(sm->eap_if->aaaEapRespData), wpabuf_head(sm->eap_if->aaaEapRespData),
wpabuf_len(sm->eap_if->aaaEapRespData)); wpabuf_len(sm->eap_if->aaaEapRespData));
} }
} }
if (eapol_sm_sta_entry_alive(eapol, addr)) if (eapol_sm_sta_entry_alive(eapol, addr))
sm->eapol->cb.eapol_event(sm->hapd, sm->sta, sm->eapol->cb.eapol_event(sm->eapol->conf.ctx, sm->sta,
EAPOL_AUTH_SM_CHANGE); EAPOL_AUTH_SM_CHANGE);
} }
@ -1202,8 +1201,8 @@ static int eapol_sm_get_eap_user(void *ctx, const u8 *identity,
struct eap_user *user) struct eap_user *user)
{ {
struct eapol_state_machine *sm = ctx; struct eapol_state_machine *sm = ctx;
return sm->eapol->cb.get_eap_user(sm->hapd, identity, identity_len, return sm->eapol->cb.get_eap_user(sm->eapol->conf.ctx, identity,
phase2, user); identity_len, phase2, user);
} }
@ -1237,7 +1236,7 @@ int eapol_auth_eap_pending_cb(struct eapol_state_machine *sm, void *ctx)
static int eapol_auth_conf_clone(struct eapol_auth_config *dst, static int eapol_auth_conf_clone(struct eapol_auth_config *dst,
struct eapol_auth_config *src) struct eapol_auth_config *src)
{ {
dst->hapd = src->hapd; dst->ctx = src->ctx;
dst->eap_reauth_period = src->eap_reauth_period; dst->eap_reauth_period = src->eap_reauth_period;
dst->wpa = src->wpa; dst->wpa = src->wpa;
dst->individual_wep_key_len = src->individual_wep_key_len; dst->individual_wep_key_len = src->individual_wep_key_len;
@ -1333,6 +1332,7 @@ struct eapol_authenticator * eapol_auth_init(struct eapol_auth_config *conf,
eapol->cb.set_port_authorized = cb->set_port_authorized; eapol->cb.set_port_authorized = cb->set_port_authorized;
eapol->cb.abort_auth = cb->abort_auth; eapol->cb.abort_auth = cb->abort_auth;
eapol->cb.tx_key = cb->tx_key; eapol->cb.tx_key = cb->tx_key;
eapol->cb.eapol_event = cb->eapol_event;
return eapol; return eapol;
} }

View file

@ -49,12 +49,8 @@ struct eapol_auth_config {
int tnc; int tnc;
struct wps_context *wps; struct wps_context *wps;
/* /* Opaque context pointer to owner data for callback functions */
* Pointer to hostapd data. This is a temporary workaround for void *ctx;
* transition phase and will be removed once IEEE 802.1X/EAPOL code is
* separated more cleanly from rest of hostapd.
*/
struct hostapd_data *hapd;
}; };
struct eap_user; struct eap_user;
@ -240,10 +236,6 @@ struct eapol_state_machine {
struct eapol_authenticator *eapol; struct eapol_authenticator *eapol;
void *sta; /* station context pointer to use in callbacks */ void *sta; /* station context pointer to use in callbacks */
/* Somewhat nasty pointer to global hostapd data to avoid
* passing this to every function */
struct hostapd_data *hapd;
}; };

View file

@ -1666,7 +1666,7 @@ int ieee802_1x_init(struct hostapd_data *hapd)
struct eapol_auth_cb cb; struct eapol_auth_cb cb;
os_memset(&conf, 0, sizeof(conf)); os_memset(&conf, 0, sizeof(conf));
conf.hapd = hapd; conf.ctx = hapd;
conf.eap_reauth_period = hapd->conf->eap_reauth_period; conf.eap_reauth_period = hapd->conf->eap_reauth_period;
conf.wpa = hapd->conf->wpa; conf.wpa = hapd->conf->wpa;
conf.individual_wep_key_len = hapd->conf->individual_wep_key_len; conf.individual_wep_key_len = hapd->conf->individual_wep_key_len;