18dbcf02cSchristos /*
28dbcf02cSchristos * IEEE 802.1X-2004 Authenticator - State dump
33c260e60Schristos * Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi>
48dbcf02cSchristos *
5e604d861Schristos * This software may be distributed under the terms of the BSD license.
6e604d861Schristos * See README for more details.
78dbcf02cSchristos */
88dbcf02cSchristos
98dbcf02cSchristos #include "includes.h"
108dbcf02cSchristos
118dbcf02cSchristos #include "common.h"
128dbcf02cSchristos #include "eap_server/eap.h"
138dbcf02cSchristos #include "eapol_auth_sm.h"
148dbcf02cSchristos #include "eapol_auth_sm_i.h"
158dbcf02cSchristos
port_type_txt(PortTypes pt)168dbcf02cSchristos static inline const char * port_type_txt(PortTypes pt)
178dbcf02cSchristos {
188dbcf02cSchristos switch (pt) {
198dbcf02cSchristos case ForceUnauthorized: return "ForceUnauthorized";
208dbcf02cSchristos case ForceAuthorized: return "ForceAuthorized";
218dbcf02cSchristos case Auto: return "Auto";
228dbcf02cSchristos default: return "Unknown";
238dbcf02cSchristos }
248dbcf02cSchristos }
258dbcf02cSchristos
268dbcf02cSchristos
port_state_txt(PortState ps)278dbcf02cSchristos static inline const char * port_state_txt(PortState ps)
288dbcf02cSchristos {
298dbcf02cSchristos switch (ps) {
308dbcf02cSchristos case Unauthorized: return "Unauthorized";
318dbcf02cSchristos case Authorized: return "Authorized";
328dbcf02cSchristos default: return "Unknown";
338dbcf02cSchristos }
348dbcf02cSchristos }
358dbcf02cSchristos
368dbcf02cSchristos
ctrl_dir_txt(ControlledDirection dir)378dbcf02cSchristos static inline const char * ctrl_dir_txt(ControlledDirection dir)
388dbcf02cSchristos {
398dbcf02cSchristos switch (dir) {
408dbcf02cSchristos case Both: return "Both";
418dbcf02cSchristos case In: return "In";
428dbcf02cSchristos default: return "Unknown";
438dbcf02cSchristos }
448dbcf02cSchristos }
458dbcf02cSchristos
468dbcf02cSchristos
auth_pae_state_txt(int s)478dbcf02cSchristos static inline const char * auth_pae_state_txt(int s)
488dbcf02cSchristos {
498dbcf02cSchristos switch (s) {
508dbcf02cSchristos case AUTH_PAE_INITIALIZE: return "INITIALIZE";
518dbcf02cSchristos case AUTH_PAE_DISCONNECTED: return "DISCONNECTED";
528dbcf02cSchristos case AUTH_PAE_CONNECTING: return "CONNECTING";
538dbcf02cSchristos case AUTH_PAE_AUTHENTICATING: return "AUTHENTICATING";
548dbcf02cSchristos case AUTH_PAE_AUTHENTICATED: return "AUTHENTICATED";
558dbcf02cSchristos case AUTH_PAE_ABORTING: return "ABORTING";
568dbcf02cSchristos case AUTH_PAE_HELD: return "HELD";
578dbcf02cSchristos case AUTH_PAE_FORCE_AUTH: return "FORCE_AUTH";
588dbcf02cSchristos case AUTH_PAE_FORCE_UNAUTH: return "FORCE_UNAUTH";
598dbcf02cSchristos case AUTH_PAE_RESTART: return "RESTART";
608dbcf02cSchristos default: return "Unknown";
618dbcf02cSchristos }
628dbcf02cSchristos }
638dbcf02cSchristos
648dbcf02cSchristos
be_auth_state_txt(int s)658dbcf02cSchristos static inline const char * be_auth_state_txt(int s)
668dbcf02cSchristos {
678dbcf02cSchristos switch (s) {
688dbcf02cSchristos case BE_AUTH_REQUEST: return "REQUEST";
698dbcf02cSchristos case BE_AUTH_RESPONSE: return "RESPONSE";
708dbcf02cSchristos case BE_AUTH_SUCCESS: return "SUCCESS";
718dbcf02cSchristos case BE_AUTH_FAIL: return "FAIL";
728dbcf02cSchristos case BE_AUTH_TIMEOUT: return "TIMEOUT";
738dbcf02cSchristos case BE_AUTH_IDLE: return "IDLE";
748dbcf02cSchristos case BE_AUTH_INITIALIZE: return "INITIALIZE";
758dbcf02cSchristos case BE_AUTH_IGNORE: return "IGNORE";
768dbcf02cSchristos default: return "Unknown";
778dbcf02cSchristos }
788dbcf02cSchristos }
798dbcf02cSchristos
808dbcf02cSchristos
reauth_timer_state_txt(int s)818dbcf02cSchristos static inline const char * reauth_timer_state_txt(int s)
828dbcf02cSchristos {
838dbcf02cSchristos switch (s) {
848dbcf02cSchristos case REAUTH_TIMER_INITIALIZE: return "INITIALIZE";
858dbcf02cSchristos case REAUTH_TIMER_REAUTHENTICATE: return "REAUTHENTICATE";
868dbcf02cSchristos default: return "Unknown";
878dbcf02cSchristos }
888dbcf02cSchristos }
898dbcf02cSchristos
908dbcf02cSchristos
auth_key_tx_state_txt(int s)918dbcf02cSchristos static inline const char * auth_key_tx_state_txt(int s)
928dbcf02cSchristos {
938dbcf02cSchristos switch (s) {
948dbcf02cSchristos case AUTH_KEY_TX_NO_KEY_TRANSMIT: return "NO_KEY_TRANSMIT";
958dbcf02cSchristos case AUTH_KEY_TX_KEY_TRANSMIT: return "KEY_TRANSMIT";
968dbcf02cSchristos default: return "Unknown";
978dbcf02cSchristos }
988dbcf02cSchristos }
998dbcf02cSchristos
1008dbcf02cSchristos
key_rx_state_txt(int s)1018dbcf02cSchristos static inline const char * key_rx_state_txt(int s)
1028dbcf02cSchristos {
1038dbcf02cSchristos switch (s) {
1048dbcf02cSchristos case KEY_RX_NO_KEY_RECEIVE: return "NO_KEY_RECEIVE";
1058dbcf02cSchristos case KEY_RX_KEY_RECEIVE: return "KEY_RECEIVE";
1068dbcf02cSchristos default: return "Unknown";
1078dbcf02cSchristos }
1088dbcf02cSchristos }
1098dbcf02cSchristos
1108dbcf02cSchristos
ctrl_dir_state_txt(int s)1118dbcf02cSchristos static inline const char * ctrl_dir_state_txt(int s)
1128dbcf02cSchristos {
1138dbcf02cSchristos switch (s) {
1148dbcf02cSchristos case CTRL_DIR_FORCE_BOTH: return "FORCE_BOTH";
1158dbcf02cSchristos case CTRL_DIR_IN_OR_BOTH: return "IN_OR_BOTH";
1168dbcf02cSchristos default: return "Unknown";
1178dbcf02cSchristos }
1188dbcf02cSchristos }
1198dbcf02cSchristos
1208dbcf02cSchristos
eapol_auth_dump_state(struct eapol_state_machine * sm,char * buf,size_t buflen)1213c260e60Schristos int eapol_auth_dump_state(struct eapol_state_machine *sm, char *buf,
1223c260e60Schristos size_t buflen)
1238dbcf02cSchristos {
1243c260e60Schristos char *pos, *end;
1253c260e60Schristos int ret;
1263c260e60Schristos
1273c260e60Schristos pos = buf;
1283c260e60Schristos end = pos + buflen;
1293c260e60Schristos
1303c260e60Schristos ret = os_snprintf(pos, end - pos, "aWhile=%d\nquietWhile=%d\n"
1313c260e60Schristos "reAuthWhen=%d\n",
1328dbcf02cSchristos sm->aWhile, sm->quietWhile, sm->reAuthWhen);
133*bb610346Schristos if (os_snprintf_error(end - pos, ret))
1343c260e60Schristos return pos - buf;
1353c260e60Schristos pos += ret;
1363c260e60Schristos
1378dbcf02cSchristos #define _SB(b) ((b) ? "TRUE" : "FALSE")
1383c260e60Schristos ret = os_snprintf(pos, end - pos,
1393c260e60Schristos "authAbort=%s\n"
1403c260e60Schristos "authFail=%s\n"
1413c260e60Schristos "authPortStatus=%s\n"
1423c260e60Schristos "authStart=%s\n"
1433c260e60Schristos "authTimeout=%s\n"
1443c260e60Schristos "authSuccess=%s\n"
1453c260e60Schristos "eapFail=%s\n"
1463c260e60Schristos "eapolEap=%s\n"
1473c260e60Schristos "eapSuccess=%s\n"
1483c260e60Schristos "eapTimeout=%s\n"
1493c260e60Schristos "initialize=%s\n"
1508dbcf02cSchristos "keyAvailable=%s\n"
1513c260e60Schristos "keyDone=%s\n"
1523c260e60Schristos "keyRun=%s\n"
1533c260e60Schristos "keyTxEnabled=%s\n"
1543c260e60Schristos "portControl=%s\n"
1553c260e60Schristos "portEnabled=%s\n"
1563c260e60Schristos "portValid=%s\n"
1573c260e60Schristos "reAuthenticate=%s\n",
1583c260e60Schristos _SB(sm->authAbort),
1593c260e60Schristos _SB(sm->authFail),
1603c260e60Schristos port_state_txt(sm->authPortStatus),
1613c260e60Schristos _SB(sm->authStart),
1623c260e60Schristos _SB(sm->authTimeout),
1633c260e60Schristos _SB(sm->authSuccess),
1643c260e60Schristos _SB(sm->eap_if->eapFail),
1653c260e60Schristos _SB(sm->eapolEap),
1663c260e60Schristos _SB(sm->eap_if->eapSuccess),
1678dbcf02cSchristos _SB(sm->eap_if->eapTimeout),
1683c260e60Schristos _SB(sm->initialize),
1693c260e60Schristos _SB(sm->eap_if->eapKeyAvailable),
1703c260e60Schristos _SB(sm->keyDone), _SB(sm->keyRun),
1713c260e60Schristos _SB(sm->keyTxEnabled),
1723c260e60Schristos port_type_txt(sm->portControl),
1733c260e60Schristos _SB(sm->eap_if->portEnabled),
1743c260e60Schristos _SB(sm->portValid),
1758dbcf02cSchristos _SB(sm->reAuthenticate));
176*bb610346Schristos if (os_snprintf_error(end - pos, ret))
1773c260e60Schristos return pos - buf;
1783c260e60Schristos pos += ret;
1798dbcf02cSchristos
1803c260e60Schristos ret = os_snprintf(pos, end - pos,
1813c260e60Schristos "auth_pae_state=%s\n"
1823c260e60Schristos "eapolLogoff=%s\n"
1833c260e60Schristos "eapolStart=%s\n"
1843c260e60Schristos "eapRestart=%s\n"
1853c260e60Schristos "portMode=%s\n"
1863c260e60Schristos "reAuthCount=%d\n"
1873c260e60Schristos "quietPeriod=%d\n"
1883c260e60Schristos "reAuthMax=%d\n"
1893c260e60Schristos "authEntersConnecting=%d\n"
1903c260e60Schristos "authEapLogoffsWhileConnecting=%d\n"
1913c260e60Schristos "authEntersAuthenticating=%d\n"
1923c260e60Schristos "authAuthSuccessesWhileAuthenticating=%d\n"
1933c260e60Schristos "authAuthTimeoutsWhileAuthenticating=%d\n"
1943c260e60Schristos "authAuthFailWhileAuthenticating=%d\n"
1953c260e60Schristos "authAuthEapStartsWhileAuthenticating=%d\n"
1963c260e60Schristos "authAuthEapLogoffWhileAuthenticating=%d\n"
1973c260e60Schristos "authAuthReauthsWhileAuthenticated=%d\n"
1983c260e60Schristos "authAuthEapStartsWhileAuthenticated=%d\n"
1993c260e60Schristos "authAuthEapLogoffWhileAuthenticated=%d\n",
2003c260e60Schristos auth_pae_state_txt(sm->auth_pae_state),
2013c260e60Schristos _SB(sm->eapolLogoff),
2023c260e60Schristos _SB(sm->eapolStart),
2038dbcf02cSchristos _SB(sm->eap_if->eapRestart),
2043c260e60Schristos port_type_txt(sm->portMode),
2053c260e60Schristos sm->reAuthCount,
2063c260e60Schristos sm->quietPeriod, sm->reAuthMax,
2073c260e60Schristos sm->authEntersConnecting,
2083c260e60Schristos sm->authEapLogoffsWhileConnecting,
2093c260e60Schristos sm->authEntersAuthenticating,
2103c260e60Schristos sm->authAuthSuccessesWhileAuthenticating,
2113c260e60Schristos sm->authAuthTimeoutsWhileAuthenticating,
2123c260e60Schristos sm->authAuthFailWhileAuthenticating,
2133c260e60Schristos sm->authAuthEapStartsWhileAuthenticating,
2143c260e60Schristos sm->authAuthEapLogoffWhileAuthenticating,
2153c260e60Schristos sm->authAuthReauthsWhileAuthenticated,
2163c260e60Schristos sm->authAuthEapStartsWhileAuthenticated,
2173c260e60Schristos sm->authAuthEapLogoffWhileAuthenticated);
218*bb610346Schristos if (os_snprintf_error(end - pos, ret))
2193c260e60Schristos return pos - buf;
2203c260e60Schristos pos += ret;
2218dbcf02cSchristos
2223c260e60Schristos ret = os_snprintf(pos, end - pos,
2233c260e60Schristos "be_auth_state=%s\n"
2243c260e60Schristos "eapNoReq=%s\n"
2253c260e60Schristos "eapReq=%s\n"
2263c260e60Schristos "eapResp=%s\n"
2273c260e60Schristos "serverTimeout=%d\n"
2283c260e60Schristos "backendResponses=%d\n"
2293c260e60Schristos "backendAccessChallenges=%d\n"
2303c260e60Schristos "backendOtherRequestsToSupplicant=%d\n"
2313c260e60Schristos "backendAuthSuccesses=%d\n"
2323c260e60Schristos "backendAuthFails=%d\n",
2338dbcf02cSchristos be_auth_state_txt(sm->be_auth_state),
2343c260e60Schristos _SB(sm->eap_if->eapNoReq),
2353c260e60Schristos _SB(sm->eap_if->eapReq),
2368dbcf02cSchristos _SB(sm->eap_if->eapResp),
2373c260e60Schristos sm->serverTimeout,
2383c260e60Schristos sm->backendResponses,
2393c260e60Schristos sm->backendAccessChallenges,
2403c260e60Schristos sm->backendOtherRequestsToSupplicant,
2413c260e60Schristos sm->backendAuthSuccesses,
2423c260e60Schristos sm->backendAuthFails);
243*bb610346Schristos if (os_snprintf_error(end - pos, ret))
2443c260e60Schristos return pos - buf;
2453c260e60Schristos pos += ret;
2468dbcf02cSchristos
2473c260e60Schristos ret = os_snprintf(pos, end - pos,
2483c260e60Schristos "reauth_timer_state=%s\n"
2493c260e60Schristos "reAuthPeriod=%d\n"
2503c260e60Schristos "reAuthEnabled=%s\n",
2513c260e60Schristos reauth_timer_state_txt(sm->reauth_timer_state),
2523c260e60Schristos sm->reAuthPeriod,
2533c260e60Schristos _SB(sm->reAuthEnabled));
254*bb610346Schristos if (os_snprintf_error(end - pos, ret))
2553c260e60Schristos return pos - buf;
2563c260e60Schristos pos += ret;
2578dbcf02cSchristos
2583c260e60Schristos ret = os_snprintf(pos, end - pos,
2593c260e60Schristos "auth_key_tx_state=%s\n",
2608dbcf02cSchristos auth_key_tx_state_txt(sm->auth_key_tx_state));
261*bb610346Schristos if (os_snprintf_error(end - pos, ret))
2623c260e60Schristos return pos - buf;
2633c260e60Schristos pos += ret;
2648dbcf02cSchristos
2653c260e60Schristos ret = os_snprintf(pos, end - pos,
2663c260e60Schristos "key_rx_state=%s\n"
2673c260e60Schristos "rxKey=%s\n",
2683c260e60Schristos key_rx_state_txt(sm->key_rx_state),
2693c260e60Schristos _SB(sm->rxKey));
270*bb610346Schristos if (os_snprintf_error(end - pos, ret))
2713c260e60Schristos return pos - buf;
2723c260e60Schristos pos += ret;
2738dbcf02cSchristos
2743c260e60Schristos ret = os_snprintf(pos, end - pos,
2753c260e60Schristos "ctrl_dir_state=%s\n"
2763c260e60Schristos "adminControlledDirections=%s\n"
2778dbcf02cSchristos "operControlledDirections=%s\n"
2783c260e60Schristos "operEdge=%s\n",
2798dbcf02cSchristos ctrl_dir_state_txt(sm->ctrl_dir_state),
2803c260e60Schristos ctrl_dir_txt(sm->adminControlledDirections),
2818dbcf02cSchristos ctrl_dir_txt(sm->operControlledDirections),
2823c260e60Schristos _SB(sm->operEdge));
283*bb610346Schristos if (os_snprintf_error(end - pos, ret))
2843c260e60Schristos return pos - buf;
2853c260e60Schristos pos += ret;
2868dbcf02cSchristos #undef _SB
2873c260e60Schristos
2883c260e60Schristos return pos - buf;
2898dbcf02cSchristos }
290