Android wpa_supplicant 源码分析四 -- wpa_supplicant_add_iface()

wpa_supplicant_add_iface()

        wpa_supplicant_init_iface(wpa_s, &t_iface)

                // 读取wpa_supplicant.conf配置文件, /data/vendor/wifi/wpa/wpa_supplicant.conf , /vendor/etc/wifi/wpa_supplicant_overlay.conf

                wpa_config_read(wpa_s->confanother, wpa_s->conf); 

                wpas_init_driver(wpa_s, iface) // 初始化驱动

                        wpa_supplicant_set_driver(wpa_s, driver)  // 根据-Dnl80211、-Dwired等参数,确定驱动类型

                                select_driver(wpa_s, i);  // 遍历wpa_drivers全局结构体,根据名字查找驱动

                                        wpa_drivers[i]->global_init(global)    //  返回struct nl80211_global对象,全局上下文信息

                                                nl80211_global_init()

                                                        netlink_init(cfg)   // 处理网卡状态变化事件:UP/DORMANT/REMOVED

                                                                netlink->sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);

                                                                bind(netlink->sock, (struct sockaddr *) &local, sizeof(local))

                                                                eloop_register_read_sock(netlink->sock, netlink_receive, netlink,  NULL);

                                                        wpa_driver_nl80211_init_nl_global(global)

                                                                global->nl = nl_create_handle(global->nl_cb, "nl");  // 用于发送netlink消息

                                                                global->nl_event = nl_create_handle(global->nl_cb, "event"); // 用于发送netlink消息

                                                                nl_cb_set(global->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,no_seq_check, NULL);

                                                                nl_cb_set(global->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,process_global_event, global);  // 设置netlink消息回调处理函数

                                                        global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0)

                        wpa_drv_init(wpa_s, wpa_s->ifname);  // driver的局部上下文信息初始化

                                wpa_s->driver->init2 / init (wpa_s, ifname, wpa_s->global_drv_priv);  // 返回struct i802_bss对象

                                        init2 = wpa_driver_nl80211_init,  --> wpa_driver_nl80211_drv_init

                                                nl80211_init_bss(bss)

                                                        // 设置bss事件处理回调函数,注意此时并没有创建nl_handle即nl_socket

                                                        nl_cb_set(bss->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,no_seq_check, NULL);
                                                        nl_cb_set(bss->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,process_bss_event, bss);

                                                wpa_driver_nl80211_finish_drv_init(drv, set_addr, 1, driver_params)

                                                        wpa_driver_nl80211_capa(drv)

                                                        nl80211_set_param(bss, driver_params)

                                                        wpa_driver_nl80211_set_mode(bss, nlmode)  // 设置接口类型为NL80211_IFTYPE_STATION

                                                        wpa_driver_nl80211_drv_init_rfkill(drv);

                                                                /*rfkill代表radio frequency( RF) connector kill switch support, 
                                                                它是Kernel中的一个子系统( subsystem) 。 
                                                                其功能是控制系统中射频设备的电源( 包括Wi-Fi、 GPS、BlueTooth、 FM等设备。 
                                                                注意, 这些设备驱动只有把自己注册到rfkill子系统中后, rfkill才能对它们起作用) 
                                                                的工作以避免浪费电力。 rfkill有软硬两种方式来禁止( block) RF设备。*/

                                                                drv->rfkill = rfkill_init(rcfg);

                                                                        eloop_register_read_sock(rfkill->fd, rfkill_receive, rfkill, NULL);   // 接收rfkill事件,查看无线设备是开启还是关闭。

                                                drv->eapol_tx_sock = socket(PF_PACKET, SOCK_DGRAM, 0);

                        wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param)

                        wpa_drv_get_ifname(wpa_s);

                        wpa_driver_get_radio_name(wpa_s);

                        radio_add_interface(wpa_s, rn);

                wpa_supplicant_init_wpa(wpa_s)  // 初始化wpa_sm相关的资源

                        wpa_sm_init(ctx);  // 初始化wpa_sm状态机

                wpa_sm_set_ifname(...)

                wpa_sm_set_param(...)

                wpa_drv_get_hw_feature_data(wpa_s,  &wpa_s->hw.num_modes,&wpa_s->hw.flags)  // vht ,ht 20 ...

                wpa_drv_get_capa(wpa_s, &capa)

                wpa_supplicant_driver_init(wpa_s)

                        wpa_supplicant_update_mac_addr(wpa_s)   

                                l2_packet_init(wpa_s->ifname,  wpa_drv_get_mac_addr(wpa_s), ETH_P_EAPOL, wpa_supplicant_rx_eapol, wpa_s, 0);

                        wpa_supplicant_req_scan(wpa_s, interface_count % 3, 100000);  // 发起有效SSID的扫描

                wpa_drv_set_country(wpa_s, wpa_s->conf->country)  // set country

                wpas_wps_init(wpa_s)    // 设置3个callback,处理认证事件

                            wps->cred_cb = wpa_supplicant_wps_cred;
                            wps->event_cb = wpa_supplicant_wps_event;
                            wps->rf_band_cb = wpa_supplicant_wps_rf_band;

                wpa_supplicant_init_eapol(wpa_s)   // 初始化EAPOL

                wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);

                wpa_supplicant_ctrl_iface_init(wpa_s)

                gas_query_init(wpa_s);

                wpas_p2p_init(wpa_s->global, wpa_s)

                wpa_bss_init(wpa_s)

                wpas_set_wowlan_triggers(wpa_s, &capa)

                pcsc_reader_init(wpa_s)

                wpas_init_ext_pw(wpa_s)

                wpas_rrm_reset(wpa_s);

                wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans);

                hs20_init(wpa_s);

                wpas_mbo_update_non_pref_chan(wpa_s, wpa_s->conf->non_pref_chan);

                wpa_supplicant_set_default_scan_ies(wpa_s);

        wpas_notify_iface_added(wpa_s)

        wpas_notify_network_added(wpa_s, ssid)

        wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值