深入理解Android:wiifi-wpa_supplicant

来源:互联网 发布:数据质量提升方案 编辑:程序博客网 时间:2024/06/10 22:05
int main(int argc, char *argv[]){    int c, i;    struct wpa_interface *ifaces, *iface;    int iface_count, exitcode = -1;    struct wpa_params params;    struct wpa_global *global;    if (os_program_init())        return -1;    os_memset(&params, 0, sizeof(params));    params.wpa_debug_level = MSG_INFO;/*默认的打印输出*/    iface = ifaces = os_zalloc(sizeof(struct wpa_interface));    if (ifaces == NULL)        return -1;    iface_count = 1;    wpa_supplicant_fd_workaround(1);/*输入输出重定向到/dev/null*/    for (;;) {/*参数解析*/        c = getopt(argc, argv,               "b:Bc:C:D:de:f:g:G:hi:I:KLMm:No:O:p:P:qsTtuvW");        if (c < 0)            break;        switch (c) {        case 'b':            iface->bridge_ifname = optarg;            break;        case 'B':            params.daemonize++;            break;        case 'c':/*指定 配置文件名,参数值给了wpa_interface中的变量*/            iface->confname = optarg;            break;        case 'C':            iface->ctrl_interface = optarg;            break;        case 'D':/*驱动名称 指定 配置文件名,参数值给了wpa_interface中的变量*/            iface->driver = optarg;            break;        case 'd':#ifdef CONFIG_NO_STDOUT_DEBUG            printf("Debugging disabled with "                   "CONFIG_NO_STDOUT_DEBUG=y build time "                   "option.\n");            goto out;#else /* CONFIG_NO_STDOUT_DEBUG */            params.wpa_debug_level--;            break;#endif /* CONFIG_NO_STDOUT_DEBUG */        case 'e':/*指定随机数*/            params.entropy_file = optarg;            break;#ifdef CONFIG_DEBUG_FILE        case 'f':            params.wpa_debug_file_path = optarg;            break;#endif /* CONFIG_DEBUG_FILE */        case 'g':            params.ctrl_interface = optarg;            break;        case 'G':            params.ctrl_interface_group = optarg;            break;        case 'h':            usage();            exitcode = 0;            goto out;        case 'i':/*指定网络接口设 备,这里为wlan0*/            iface->ifname = optarg            break;        case 'I':            iface->confanother = optarg;            break;        case 'K':            params.wpa_debug_show_keys++;            break;        case 'L':            license();            exitcode = 0;            goto out;#ifdef CONFIG_P2P        case 'm':            params.conf_p2p_dev = optarg;            break;#endif /* CONFIG_P2P */        case 'o':            params.override_driver = optarg;            break;        case 'O':            params.override_ctrl_interface = optarg;            break;        case 'p':            iface->driver_param = optarg;            break;        case 'P':            os_free(params.pid_file);            params.pid_file = os_rel2abs_path(optarg);            break;        case 'q':            params.wpa_debug_level++;            break;#ifdef CONFIG_DEBUG_SYSLOG        case 's':            params.wpa_debug_syslog++;            break;#endif /* CONFIG_DEBUG_SYSLOG */#ifdef CONFIG_DEBUG_LINUX_TRACING        case 'T':            params.wpa_debug_tracing++;            break;#endif /* CONFIG_DEBUG_LINUX_TRACING */        case 't':            params.wpa_debug_timestamp++;            break;#ifdef CONFIG_DBUS        case 'u':            params.dbus_ctrl_interface = 1;            break;#endif /* CONFIG_DBUS */        case 'v':            printf("%s\n", wpa_supplicant_version);            exitcode = 0;            goto out;        case 'W':            params.wait_for_monitor++;            break;#ifdef CONFIG_MATCH_IFACE        case 'M':            params.match_iface_count++;            iface = os_realloc_array(params.match_ifaces,                         params.match_iface_count,                         sizeof(struct wpa_interface));            if (!iface)                goto out;            params.match_ifaces = iface;            iface = &params.match_ifaces[params.match_iface_count -                             1];            os_memset(iface, 0, sizeof(*iface));            break;#endif /* CONFIG_MATCH_IFACE */        case 'N':            iface_count++;            iface = os_realloc_array(ifaces, iface_count,                         sizeof(struct wpa_interface));            if (iface == NULL)                goto out;            ifaces = iface;            iface = &ifaces[iface_count - 1];            os_memset(iface, 0, sizeof(*iface));            break;        default:            usage();            exitcode = 0;            goto out;        }    }    exitcode = 0;    global = wpa_supplicant_init(&params);/*根据指定的参数构造,wpa_global对象*/    if (global == NULL) {        wpa_printf(MSG_ERROR, "Failed to initialize wpa_supplicant");        exitcode = -1;        goto out;    } else {        wpa_printf(MSG_INFO, "Successfully initialized "               "wpa_supplicant");    }    if (fst_global_init()) {        wpa_printf(MSG_ERROR, "Failed to initialize FST");        exitcode = -1;        goto out;    }#if defined(CONFIG_FST) && defined(CONFIG_CTRL_IFACE)    if (!fst_global_add_ctrl(fst_ctrl_cli))        wpa_printf(MSG_WARNING, "Failed to add CLI FST ctrl");#endif    for (i = 0; exitcode == 0 && i < iface_count; i++) {        struct wpa_supplicant *wpa_s;        if ((ifaces[i].confname == NULL &&             ifaces[i].ctrl_interface == NULL) ||            ifaces[i].ifname == NULL) {            if (iface_count == 1 && (params.ctrl_interface ||#ifdef CONFIG_MATCH_IFACE                         params.match_iface_count ||#endif /* CONFIG_MATCH_IFACE */                         params.dbus_ctrl_interface))                break;            usage();            exitcode = -1;            break;        }        wpa_s = wpa_supplicant_add_iface(global, &ifaces[i], NULL);/*wpa支持操作多个无线网络设备,这里需要将它们一一添加到WPAS中,wpas内部初始化这些设备*/        if (wpa_s == NULL) {            exitcode = -1;            break;        }    }#ifdef CONFIG_MATCH_IFACE    if (exitcode == 0)        exitcode = wpa_supplicant_init_match(global);#endif /* CONFIG_MATCH_IFACE */    if (exitcode == 0)        exitcode = wpa_supplicant_run(global);/*android中,wpas通过select /epoll I/O多路复用*/    wpa_supplicant_deinit(global);    fst_global_deinit();out:    wpa_supplicant_fd_workaround(0);    os_free(ifaces);#ifdef CONFIG_MATCH_IFACE    os_free(params.match_ifaces);#endif /* CONFIG_MATCH_IFACE */    os_free(params.pid_file);    os_program_deinit();    return exitcode;}
原创粉丝点击