hostapd的radius/eap server代码分析(4)-在windows下启动hostapd的radius/eap server

hostapd的radius/eap server代码分析(4)-在windows下启动hostapd的radius/eap server

 

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

 

为了更好的调测hostapd,通过删减及增加必要代码实现了windows下的hostapd框架,框架仍然读的是hostapd的配置文件,安全关联,用户信息等。

 

这个架子仅简单搭建,仅为实现hostapd的启动,用于协议研究。同时也描述了实现backend authentication server要做的一些事情。

 

 

1:main函数,很简单就两大步  @main.cpp
int main(int argc,char ** const argv)
{
    // 初始化radius及EAP server
    InitEAP();

    if (argc == 1)
    {
        cout<<"usage:prog ip:port"<
        return -1;
    }

    // 启动业务线程,处理消息。我是通过ACE的ACE_Event_Handler及ACE_Reactor实现的,这不是重点,不放出。
    RunEapServer(argv[1]);

    return 0;
};

 

 

2:@initeap.cpp

//extern hostapd_data *g_hostapdcfg;
extern void         *g_ssl_context;
extern void         *g_eap_sim_db_priv;
char                *g_config_fname = "./config/hostapd.conf";
radius_server_data  *g_radius_server_data = NULL;

 

/**************************************************
function:int InitEAP()
Detail:  register eap methods, apply hostapd config and openssl init
para In: N/A
para Out:N/A
return value: 0 success
Author:Zhu.Jinhua 2010.05.01
***************************************************/
int InitEAP()
{
//eap方法注册
    if (eap_server_register_methods())
    {
        cout<<"Failed to register EAP methods"<
        return -1;
    }
    //读取配置文件,同时获知用户信息,安全关联等的配置文件目录及文件名
    struct hostapd_config *hostapdconf = NULL;
    hostapdconf = hostapd_config_read((const char *)g_config_fname);
    if (NULL == hostapdconf)
    {
        return -1;
    }

    //初始化Openssl
    if(InitOpenssl(hostapdconf))
    {
        PTRACE(1,"Failed to InitOpenssl");
    }

//radius server的设置
    hostapd_setup_radius_srv(hostapdconf);
    //add for openssl Multi Thread using,
    thread_setup();
    return 0;
};

 

 

int InitOpenssl(/*struct hostapd_data *hostapddata, */hostapd_config *hostapdconf)
{
    struct tls_connection_params params;
    memset(&params, 0, sizeof(params));
    struct hostapd_bss_config *bssconf = hostapdconf->bss;

    // call tls_init initialize ssl context
    g_ssl_context = tls_init(NULL);
    if (g_ssl_context == NULL)
    {
        return -1;
    }
    os_memset(&params, 0, sizeof(params));
    params.ca_cert = bssconf->ca_cert;
    params.server_cert = bssconf->server_cert;
    params.private_key = bssconf->private_key;
    params.private_key_passwd = bssconf->private_key_passwd;
//    params.dh_file = hapd->conf->dh_file;
    if (tls_global_set_params(g_ssl_context, &params)) {
        wpa_printf(MSG_ERROR, "Failed to set TLS parameters");
        return -1;
    }
    if (tls_global_set_verify(g_ssl_context,
        0/*hapd->conf->check_crl*/))
    {
        wpa_printf(MSG_ERROR, "Failed to enable check_crl");
        return -1;
    }

 

    /**
* eap_sim_db_init - Initialize EAP-SIM DB / authentication gateway interface
* @config: Configuration data (e.g., file name)
* @get_complete_cb: Callback function for reporting availability of triplets
* @ctx: Context pointer for get_complete_cb
* Returns: Pointer to a private data structure or %NULL on failure
*/
//虽然这部分有了,但是具体eap_sim/aka还没完成,暂时没试验这个
#ifdef EAP_SERVER
    if (bssconf->eap_sim_db)
    {
        g_eap_sim_db_priv =
            eap_sim_db_init(bssconf->eap_sim_db,
            hostapd_sim_db_cb, g_radius_server_data);
        if (g_eap_sim_db_priv == NULL)
        {
            wpa_printf(MSG_ERROR, "Failed to initialize EAP-SIM "
                "database interface");
            return -1;
        }
    }
#endif /* EAP_SERVER */

    return 0;
}

 

 

static int hostapd_setup_radius_srv(struct hostapd_config *hostapdconf)
{
    struct radius_server_conf srv;
    os_memset(&srv, 0, sizeof(srv));

    struct hostapd_bss_config *conf = hostapdconf->bss;
//安全关联
    srv.client_file = conf->radius_server_clients;
//鉴权端口,在我们的实现中,由RunEapServer实现了,这里的并没用到
    srv.auth_port = conf->radius_server_auth_port;
    srv.conf_ctx = conf;
//eap_sim/aka用到的数据
    srv.eap_sim_db_priv = g_eap_sim_db_priv;//hostapdconf->eap_sim_db_priv;
//ssl相关用到的全局上下文
    srv.ssl_ctx = g_ssl_context;
    srv.pac_opaque_encr_key = conf->pac_opaque_encr_key;
    srv.eap_fast_a_id = conf->eap_fast_a_id;
    srv.eap_fast_a_id_len = conf->eap_fast_a_id_len;
    srv.eap_fast_a_id_info = conf->eap_fast_a_id_info;
    srv.eap_fast_prov = conf->eap_fast_prov;
    srv.pac_key_lifetime = conf->pac_key_lifetime;
    srv.pac_key_refresh_time = conf->pac_key_refresh_time;
    srv.eap_sim_aka_result_ind = conf->eap_sim_aka_result_ind;
    srv.tnc = conf->tnc;
    srv.wps = NULL;//hapd->wps;
    srv.ipv6 = 0;
//获取用户信息的回调函数
    srv.get_eap_user = hostapd_radius_get_eap_user;
    srv.eap_req_id_text = conf->eap_req_id_text;
    srv.eap_req_id_text_len = conf->eap_req_id_text_len;
    g_radius_server_data = radius_server_init(&srv);

    //g_radius_server_data = radius_server_init(&srv);
    if (g_radius_server_data == NULL) {
        wpa_printf(MSG_ERROR, "RADIUS server initialization failed.");
        return -1;
    }
    return 0;
}

 

 

 

/**************************************************
function:int hostapd_radius_get_eap_user()
Detail:  callback of get eap user for radius_server_init
para In: void *ctx, config
const u8 *identity,
size_t identity_len,
int phase2: is phase2?
para Out:struct eap_user *user
return value: 0 success
Author:Zhu.Jinhua 2010.05.01
***************************************************/
static int hostapd_radius_get_eap_user(void *ctx, const u8 *identity,
                                       size_t identity_len, int phase2,
                                       struct eap_user *user)
{
    const struct hostapd_eap_user *eap_user;
    int i, count;
    eap_user = hostapd_get_eap_user((hostapd_bss_config *)ctx, identity, identity_len, phase2);
    if (eap_user == NULL)
        return -1;
    if (user == NULL)
        return 0;
    os_memset(user, 0, sizeof(*user));
    count = EAP_USER_MAX_METHODS;
    if (count > EAP_MAX_METHODS)
        count = EAP_MAX_METHODS;
    for (i = 0; i < count; i++) {
        user->methods[i].vendor = eap_user->methods[i].vendor;
        user->methods[i].method = eap_user->methods[i].method;
    }
    if (eap_user->password) {
        user->password = (unsigned char *)os_malloc(eap_user->password_len);
        if (user->password == NULL)
            return -1;
        os_memcpy(user->password, eap_user->password,
            eap_user->password_len);
        user->password_len = eap_user->password_len;
        user->password_hash = eap_user->password_hash;
    }
    user->force_version = eap_user->force_version;
    user->ttls_auth = eap_user->ttls_auth;
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据你提供的信息,hostapd服务目前正在自动重启,并且启动失败了。可以通过查看服务的日志信息来确定服务启动失败的具体原因。你可以使用以下命令来查看hostapd服务的日志信息: ``` journalctl -u hostapd.service ``` 该命令将显示hostapd服务的日志信息。通过查看日志信息,你可以确定服务启动失败的原因,并采取相应的措施来解决问题。常见的hostapd服务启动失败原因包括: 1. 配置文件错误:hostapd服务的配置文件通常存储在/etc/hostapd/hostapd.conf文件中。如果该文件中存在语法错误或者其他问题,服务可能会启动失败。你可以使用文本编辑器打开该文件,检查其中是否存在问题,并进行修复。 2. 依赖关系错误:hostapd服务可能依赖于其他服务,如果这些服务没有正确启动hostapd服务也可能启动失败。你可以使用以下命令查看hostapd服务所依赖的其他服务: ``` systemctl list-dependencies hostapd.service ``` 如果该命令输出了一些依赖的服务没有正确启动,你可以尝试启动这些服务或者查找解决方法。 3. 硬件设备问题:hostapd服务需要Wi-Fi网卡来提供热点服务。如果Wi-Fi网卡驱动程序没有正确安装或者网卡硬件出现问题,hostapd服务也可能启动失败。你可以使用以下命令查看Wi-Fi网卡的状态: ``` iwconfig ``` 如果该命令输出了错误信息或者网卡状态异常,你可以尝试重新安装网卡驱动程序或者更换网卡硬件。 如果以上方法都无法解决问题,你可以考虑卸载并重新安装hostapd服务,或者向相关技术支持寻求帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值