eap状态机代码分析-(1)结构定义

eap状态机代码分析-(1)结构定义

 

NJZhuJinhua@csdn May.09, 2010
mail:jinhua1982@gmail.com
http://blog.csdn.net/njzhujinhua
转载请注明出处。

 

通常来说,一个eap状态机关联于一个session内,在多次交互时根据state匹配到相同的session进而找到同一个状态机并继续运行。本节我们关注于eap状态机部分。

首先看下eap状态机的定义:
/**
 * struct eap_sm - EAP server state machine data
 */
struct eap_sm {
    enum {
        EAP_DISABLED, EAP_INITIALIZE, EAP_IDLE, EAP_RECEIVED,
        EAP_INTEGRITY_CHECK, EAP_METHOD_RESPONSE, EAP_METHOD_REQUEST,
        EAP_PROPOSE_METHOD, EAP_SELECT_ACTION, EAP_SEND_REQUEST,
        EAP_DISCARD, EAP_NAK, EAP_RETRANSMIT, EAP_SUCCESS, EAP_FAILURE,
        EAP_TIMEOUT_FAILURE, EAP_PICK_UP_METHOD,
        EAP_INITIALIZE_PASSTHROUGH, EAP_IDLE2, EAP_RETRANSMIT2,
        EAP_RECEIVED2, EAP_DISCARD2, EAP_SEND_REQUEST2,
        EAP_AAA_REQUEST, EAP_AAA_RESPONSE, EAP_AAA_IDLE,
        EAP_TIMEOUT_FAILURE2, EAP_FAILURE2, EAP_SUCCESS2
    } EAP_state;

    /* Constants */
    int MaxRetrans;
[最大重传次数,eap支持超时重发机制.eap_sm在初始化时赋值为5
    sm->MaxRetrans = 5; /* RFC 3748: max 3-5 retransmissions suggested */
当然你可根据需要将此值做成可配
]

    struct eap_eapol_interface eap_if;

这个eap_if里面的变量以前版本是直接列在这里的,现在封装在eap_eapol_interface的变量内了,当然这样也清晰点。
主要放些直接与消息相关的,如req及resp的数据,当前是req还是resp,是否到了重传的时机(retransWhile)等。】
    /* Full authenticator state machine local variables */

    /* Long-term (maintained betwen packets) */
    EapType currentMethod;
【当前采用的Method,初始为EAP_TYPE_NONE,其后根据响应中的type定或自选】
    u8 currentId;
【当前eap id。开始设为-1,作为backend_AAA时被设为响应消息eapid,需要发送eapreq的时候设为nextId】
    enum {
        METHOD_PROPOSED, METHOD_CONTINUE, METHOD_END
    } methodState;
【】
    int retransCount;
【传送次数】
    struct wpabuf *lastReqData;
【记下已经发出的请求数据,如需要重传时需要发此数据】
    int methodTimeout;

    /* Short-term (not maintained between packets) */
    Boolean rxResp;
【收到消息的id为resp时设置rxResp为TRUE】
    int respId;
【收到的resp消息的】
    EapType respMethod;
    int respVendor;
    int respVendorMethod;
    Boolean ignore;
    enum {
        DECISION_SUCCESS, DECISION_FAILURE, DECISION_CONTINUE,
        DECISION_PASSTHROUGH
    } decision;

    /* Miscellaneous variables */
    const struct eap_method *m; /* selected EAP method */
【当前选定的eap method】
    /* not defined in RFC 4137 */
    Boolean changed;
【状态机是否改变,在不变时则退出状态机运行,后续可能要发送eapreq,eapsuccess或eapfailure,或在pending时不做事情】
    void *eapol_ctx, *msg_ctx;
【eapol_ctx:上下文信息,在状态机初始化时指向session,之后不动。
msg_ctx:尚未使用】
    struct eapol_callbacks *eapol_cb;
【状态机初始化时设置eapol_cb。
struct eapol_callbacks为多个需要用到的回调函数如get_eap_user等组成的结构体】
    void *eap_method_priv;
【由各个eap method定义的数据,在EAP_INITIALIZE是sm->eap_method_priv = sm->m->initPickUp(sm)   指向eap_identity_data
在具体EAP method阶段则是具体eap_xxx_data】
    u8 *identity;
    size_t identity_len;
【在eap_identity_process内赋值,取自eap-resp/identity】

    /* Whether Phase 2 method should validate identity match */
    int require_identity_match;
【EAP-GTC用到】
    int lastId; /* Identifier used in the last EAP-Packet */
    struct eap_user *user;
    int user_eap_method_index;
    int init_phase2;
【eap_ttls_phase2_eap_init  eap_peap_phase2_init两个函数内设置为1】
    void *ssl_ctx;
【在状态机初始化eap_server_sm_init内设置为一个全局的g_ssl_context上下文。后者通过
g_ssl_context = tls_init(NULL);
实现初始化。

    void *eap_sim_db_priv;
【指向系统配置的eap_sim/aka的配置信息,为eap_sim_db_data结构。主要含有与hlr的通信套接字信息,假名表,重鉴权用户信息,pending的用户查询等】
    Boolean backend_auth;
【是否作为backend authentication server】
    Boolean update_user;
【sm->identity是否更新了的标志,如为true时可能需要重新获取用户信息】
    int eap_server;
【是作为eapserver还是passthrough?】

    int num_rounds;
【eap交互次数,最大允许EAP_MAX_AUTH_ROUNDS=50次】
    enum {
        METHOD_PENDING_NONE, METHOD_PENDING_WAIT, METHOD_PENDING_CONT
    } method_pending;
【状态机初始化时method_pending为METHOD_PENDING_NONE,因业务需要,可以将method_pending设置为METHOD_PENDING_WAIT。
eap状态机在处理EAP_PROPOSE_METHOD或EAP_METHOD_RESPONSE时,如果为WAIT则什么不做,退出状态机。
如果为CONT则设置method_pending = METHOD_PENDING_NONE并继续执行EAP_METHOD_RESPONSE状态。
eap具体method业务在收到响应等需要的时候调用eap_sm_pending_cb,他会设置method_pending为CONT,这样再激活状态机他会继续执行。】

    u8 *auth_challenge;
    u8 *peer_challenge;
【均是eap-mschapv2鉴权过程中的参数,分别由server和peer生成的随机数】

    u8 *pac_opaque_encr_key;
【如果配置文件配了:
# Encryption key for EAP-FAST PAC-Opaque values. This key must be a secret,
# random value. It is configured as a 16-octet value in hex format. It can be
# generated, e.g., with the following command:
# od -tx1 -v -N16 /dev/random | colrm 1 8 | tr -d ' '
#pac_opaque_encr_key=000102030405060708090a0b0c0d0e0f
则状态机初始化时会设置该变量,但是本版本没有使用。没找到EAP-FAST】
    u8 *eap_fast_a_id;
    size_t eap_fast_a_id_len;
    char *eap_fast_a_id_info;
    enum {
        NO_PROV, ANON_PROV, AUTH_PROV, BOTH_PROV
    } eap_fast_prov;
    int pac_key_lifetime;
    int pac_key_refresh_time;
    int eap_sim_aka_result_ind;
    int tnc;
【以上均取自配置文件,eapserver用不着这些。】
    struct wps_context *wps;
    struct wpabuf *assoc_wps_ie;

    Boolean start_reauth;
};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值