hostapd之main()函数分析

总体结构

hostapd 的main函数位于hostapd/hostapd.c中。函数开始是日志相关以及对命令行参数选项的处理。紧接着进入hostapd初始化阶段,hostapd包括以下四个步骤。初始化完成之后,进入eloop_run(),通过select函数判断是否有新的事件,并调用相应处理函数进行处理。最后阶段,hostapd释放内存,并进行一些清理工作。

hostapd-main代码结构图

一.hostapd main函数中命令行读取

h:调用usage()函数,打印使用说明

static void usage(void)

{

    show_version();

    fprintf(stderr,

        "/n"

        "usage: hostapd [-hdBKtv] [-P <PID file>] "

        "<configuration file(s)>/n"

        "/n"

        "options:/n"

        "   -h   show this usage/n"

        "   -d   show more debug messages (-dd for even more)/n"

        "   -B   run daemon in the background/n"

        "   -P   PID file/n"

        "   -K   include key data in debug messages/n"

        "   -t   include timestamps in some debug messages/n"

        "   -v   show hostapd version/n");

    exit(1);

}

 

d:

        case 'd':

            debug++;

            if (wpa_debug_level > 0)

                wpa_debug_level--;

如果选项中每出现一个ddebug级别递增,同时日志级别数字降低。

src/utils/wpa_debug.c中有定义:

int wpa_debug_level = MSG_INFO;

int wpa_debug_show_keys = 0;

int wpa_debug_timestamp = 0;

这里enum { MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR }; 其中MSG_INFO值为2,在该级别时正常情况下基本没有日志输出。

默认级别就是MSG_INFO,因而要想获得更多执行流程中的输出就需要增加debug级别。如果想把码流及各radius属性均打印出的话就将级别调为MSG_MSGDUMP=0吧。

【本系列分析中debug级别或日志级别越高指的是debug变量值越大,wpa_debug_level值越低。】

 

B:作为守护进程运行,

        case 'B':

            daemonize++;

            break;

    如果含有该选项则执行os_daemonize(pid_file)

    if (daemonize && os_daemonize(pid_file)) {

        perror("daemon");

        goto out;

    }

utils/os_win32.c中该函数未实现。

utils/os_unix.c中定义为

int os_daemonize(const char *pid_file)

{

#ifdef __uClinux__

    return -1;

#else /* __uClinux__ */

    if (os_daemon(0, 0)) {

        perror("daemon");

        return -1;

    }

    if (pid_file) {

        FILE *f = fopen(pid_file, "w");

        if (f) {

            fprintf(f, "%u/n", getpid());

            fclose(f);

        }

    }

    return -0;

#endif /* __uClinux__ */

}

其中os_daemon即为daemon系统调用。如果调用成功则获取进程id并写入pid_file指定的文件中。

 

K:

        case 'K':

            wpa_debug_show_keys++;

            break;

用于控制在调试时是否输出密钥相关key值。如需输出密钥还需要设置日志级别为MSG_DEBUG或以上

例如:

    wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: Derived implicit challenge",

            challenge, len);

如果选项中没有K显式说明,则即使日志级别为MSG_DEBUGMSG_MSGDUMP也不会输出的。

 

P:

        case 'P':

            os_free(pid_file);

            pid_file = os_rel2abs_path(optarg);

            break;

设定pid_file的值,os_rel2abs_path 将参数提供的相对路径转为绝对路径。

 

t:

        case 't':

            wpa_debug_timestamp++;

            break;

该项作用为在日志中包含时间戳信息。

wpa_debug_timestamp的定义参见选项d时的说明,默认值为0,即不包含。

带时间戳效果为

1270995804.000000: EAP: EAP entering state RECEIVED

1270995804.000000: EAP: parseEapResp: rxResp=1 respId=77 respMethod=21 respVendor=0 respVendorMethod=0

1270995804.000000: EAP: EAP entering state INTEGRITY_CHECK

1270995804.000000: EAP: EAP entering state METHOD_RESPONSE

1270995804.000000: SSL: Received packet(len=176) - Flags 0x00

1270995804.000000: SSL: Received packet: Flags 0x0 Message Length 0

 

v

        case 'v':

            show_version();

            exit(1);

            break;

显式版本号并退出。

static void show_version(void)

{

    fprintf(stderr,

        "hostapd v" VERSION_STR "/n"

        "User space daemon for IEEE 802.11 AP management,/n"

        "IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator/n"

        "Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi> "

        "and contributors/n");

}

#define VERSION_STR "0.6.10"

二.hostapd初始化

hostapd_setup_interface中主要进行了如下工作:

初始化驱动接口、确认配置,并根据配置设置驱动参数、清除过时的station、根据配置设置信道,加密算法,beacons以及WDS links

 

1.初始化驱动接口hostapd_driver_init()

 

三.hostapd运行

四.hostapd结束

五.总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值