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

该博客详细阐述了wpa_supplicant在初始化接口时的步骤,包括读取配置文件、初始化驱动、选择和初始化驱动类型、设置netlink消息回调处理函数、处理rfkill事件以及初始化wpa_sm状态机等关键操作。整个过程涉及了网络连接、无线设备管理、EAPOL协议和WPS认证等多个方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

### 荣耀 MagicBook Pro 配置与性能 #### 处理器与图形处理能力 荣耀 MagicBook Pro 提供了强大的计算能力和出色的图形处理表现。其搭载英特尔 i5 或 i7 处理器,能够满足日常办公、游戏娱乐以及视频编辑等多种需求[^4]。此外,在显卡方面,虽然未提及独立显卡型号,但从整体性能来看,该设备足以应对主流的游戏和图像处理任务。 #### 存储与内存 在存储方案上,标准版本配备 512GB 的 PCIe 固态硬盘,提供高速的数据读写速度,适合大多数用户的文件管理和软件安装需求。然而,对于需要更大容量存储空间的用户而言,可以通过自行更换硬盘来扩展至更高规格,例如升级到 1TB SSD 是可行的选择[^3]。与此同时,机器内置 8GB 双通道 DDR4 内存,默认频率为 2400MHz,确保多任务运行流畅无阻。 #### 屏幕显示效果 作为一款主打全面屏概念的产品,荣耀 MagicBook Pro 搭载了一块 16.1 英寸的大尺寸显示屏,具备较高的分辨率和支持广视角技术,带来沉浸式的视觉享受。这种设计不仅提升了观看体验,还使得长时间工作下的眼睛疲劳感有所缓解。 #### 特色功能——Magic-link 2.0 值得一提的是,新款机型引入了增强型互联解决方案即 Magic-link 2.0 魔法互传特性。这项创新允许用户轻松实现手机同电脑间资料(如照片、文档等)的一键式无线传输操作,极大地方便了跨平台协作场景中的效率提升[^2]。 ```python # 示例代码展示如何查询硬件基本信息 (Python) import platform def get_system_info(): system = platform.system() processor = platform.processor() architecture = platform.architecture()[0] return f"System Info:\nOS:{system}\nProcessor:{processor}\nArchitecture:{architecture}" print(get_system_info()) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值