wpa_supplicant 软件架构分析

1.    PF_INET socket接口,主要用于向kernel 发送ioctl命令,控制并获取相应信息。

2.    PF_NETLINK socket接口,主要用于接收kernel发送上来的event 事件。

3.    PF_PACKET socket接口,主要用于向driver传递802.1X报文。

主要涉及到的文件包括:“driver.h”,“drivers.c”,“driver_wext.h”,“driver_wext.c”,“l2_packet.h”和“l2_packet_linux.c”。其中“driver.h”,“drivers.c”,“driver_wext.h”和“driver_wext.c”实现PF_INETsocket接口和PF_NETLINK socket接口;“l2_packet.h”和“l2_packet_linux.c”实现PF_PACKET socket接口。

(1)“driver.h”,“drivers.c”主要用于封装底层差异对外显示一个相同的wpa_driver_ops接口。Wpa_supplicant可支持atmel, Broadcom, ipw, madwifi, ndis, nl80211, wext等多种驱动。

其中一个最主要的数据结构为wpa_driver_ops, 其定义了driver相关的各种操作接口。

(2)“driver_wext.h”,“driver_wext.c”实现了wext形式的wpa_driver_ops,并创建了PF_INETsocket接口和PF_NETLINK socket接口,然后通过这两个接口完成与kernel的信息交互。

Wext提供的一个主要数据结构为:

struct wpa_driver_wext_data {

       void *ctx;

       int event_sock;

       int ioctl_sock;

       int mlme_sock;

       char ifname[IFNAMSIZ + 1];

       int ifindex;

       int ifindex2;

       int if_removed;

       u8 *assoc_req_ies;

       size_t assoc_req_ies_len;

       u8 *assoc_resp_ies;

       size_t assoc_resp_ies_len;

       struct wpa_driver_capa capa;

       int has_capability;

       int we_version_compiled;

       /* for set_auth_alg fallback */

       int use_crypt;

       int auth_alg_fallback;

       int operstate;

       char mlmedev[IFNAMSIZ + 1];

       int scan_complete_events;

};

其中event_sock 为PF_NETLINK socket接口,ioctl_sock为PF_INET socket借口。

Driver_wext.c实现了大量底层处理函数用于实现wpa_driver_ops操作参数,其中比较重要的有:

void * wpa_driver_wext_init(void *ctx, const char *ifname);

/* 初始化wpa_driver_wext_data 数据结构,并创建PF_NETLINK socket和 PF_INET socket 接口 */

void wpa_driver_wext_deinit(void *priv);

/* 销毁wpa_driver_wext_data 数据结构,PF_NETLINK socket和 PF_INETsocket 接口 */

static void wpa_driver_wext_event_receive(int sock, void *eloop_ctx,

                                     void *sock_ctx);

/* 处理kernel主动发送的event事件的 callback 函数 */

最后,将实现的操作函数映射到一个全局的wpa_driver_ops类型数据结构 wpa_driver_wext_ops中。

const struct wpa_driver_ops wpa_driver_wext_ops = {

       .name = "wext",

       .desc = "Linux wireless extensions (generic)",

       .get_bssid = wpa_driver_wext_get_bssid,

       .get_ssid = wpa_driver_wext_get_ssid,

       .set_wpa = wpa_driver_wext_set_wpa,

       .set_key = wpa_driver_wext_set_key,

       .set_countermeasures = wpa_driver_wext_set_countermeasures,

       .set_drop_unencrypted = wpa_driver_wext_set_drop_unencrypted,

       .scan = wpa_driver_wext_scan,

       .get_scan_results2 = wpa_driver_wext_get_scan_results,

       .deauthenticate = wpa_driver_wext_deauthenticate,

       .disassociate = wpa_driver_wext_disassociate,

       .set_mode = wpa_driver_wext_set_mode,

       .associate = wpa_driver_wext_associate,

       .set_auth_alg = wpa_driver_wext_set_auth_alg,

       .init = wpa_driver_wext_init,

       .deinit = wpa_driver_wext_deinit,

       .add_pmkid = wpa_driver_wext_add_pmkid,

       .remove_pmkid = wpa_driver_wext_remove_pmkid,

       .flush_pmkid = wpa_driver_wext_flush_pmkid,

       .get_capa = wpa_driver_wext_get_capa,

       .set_operstate = wpa_driver_wext_set_operstate,

};

(3)“l2_packet.h”和“l2_packet_linux.c”主要用于实现PF_PACKET socket接口,通过该接口,wpa_supplicant可以直接将802.1X packet发送到L2层,而不经过TCP/IP协议栈。

其中主要的功能函数为:

struct l2_packet_data * l2_packet_init(

       const char *ifname, const u8 *own_addr, unsigned short protocol,

       void (*rx_callback)(void *ctx, const u8 *src_addr,

                         const u8 *buf, size_t len),

       void *rx_callback_ctx, int l2_hdr);

/* 创建并初始化PF_PACKET socket接口,其中rx_callback 为从L2接收到的packet 处理callback函数 */

void l2_packet_deinit(struct l2_packet_data *l2);

/* 销毁 PF_PACKET socket接口 */

int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto,

                 const u8 *buf, size_t len);

/* L2层packet发送函数,wpa_supplicant用此发送L2层 802.1X packet  */

static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx);

/*  L2层packet接收函数,接收来自L2层数据后,将其发送到上层  */

4. Control interface commands

       PING

       MIB

       STATUS

       STATUS-VERBOSE

       PMKSA

       SET <variable> <valus>

       LOGON

       LOGOFF

       REASSOCIATE

       RECONNECT

       PREAUTH <BSSID>

       ATTACH

       DETACH

       LEVEL <debug level>

       RECONFIGURE

       TERMINATE

       BSSID <network id> <BSSID>

       LIST_NETWORKS

       DISCONNECT

       SCAN

       SCAN_RESULTS

       BSS

       SELECT_NETWORK <network id>

       ENABLE_NETWORK <network id>

       DISABLE_NETWORK <network id>

       ADD_NETWORK

       REMOVE_NETWORK <network id>

       SET_NETWORK <network id> <variable> <value>

       GET_NETWORK <network id> <variable>

       SAVE_CONFIG

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: wpa_supplicant是一个开源的Wi-Fi客户端,用于连接无线网络。它支持多种加密方式和认证协议,包括WPA、WPA2、EAP等。wpa_supplicant的源码分析可以帮助我们深入了解它的工作原理和实现细节,从而更好地使用和定制它。具体分析可以从以下几个方面入手: 1. 网络配置和管理:wpa_supplicant支持多种网络配置方式,包括静态配置和动态获取IP地址等。它还提供了一套API接口,可以用于管理网络连接状态、扫描可用网络、获取网络信息等。 2. 安全认证和加密:wpa_supplicant支持多种安全认证和加密方式,包括WPA、WPA2、EAP等。它还提供了一套API接口,可以用于配置和管理安全认证和加密方式。 3. 事件处理和消息传递:wpa_supplicant使用事件和消息来处理网络连接状态、扫描结果、安全认证和加密等。它提供了一套事件处理机制和消息传递机制,可以用于处理各种事件和消息。 4. 代码结构和模块设计:wpa_supplicant的代码结构和模块设计比较清晰,可以帮助我们更好地理解它的实现细节和工作原理。它包括多个模块,如驱动模块、网络配置模块、安全认证模块等。 总之,wpa_supplicant源码分析可以帮助我们深入了解它的工作原理和实现细节,从而更好地使用和定制它。 ### 回答2: wpa_supplicant是一个为无线网络提供WPA/WPA2加密认证的开源软件,它主要用于Linux和Unix操作系统。wpa_supplicant是基于wpa_action而来,可以支持WPA/WPA2的个人和企业级认证方式,对于无线网络的各种强制策略、速率限制以及数据包报错处理等都有了充分的支持。 在wpa_supplicant源码中,主要分为4个模块:配置文件解析、状态机、消息驱动和驱动层。其中,配置文件解析主要完成对配置文件的读取和解析,读取并解析遵循wpa_supplicant的配置格式,将解析到的配置存放在结构体中,并通过对结构体的操作实现了参数的获取、设置等操作。状态机部分是wpa_supplicant最核心的模块,它实现了所有的状态转移和状态迁移,以及根据不同状态发送不同的管理帧,例如扫描请求、认证请求、关联请求等。消息驱动部分主要完成对消息的处理和转发,它会把收到的消息传给状态机,并根据接口类型进行处理。最后,驱动层部分是和无线网卡驱动相关的部分,主要完成各种无线网络操作的具体实现。 在使用wpa_supplicant时,我们可以通过修改配置文件来配置连接属性并启动wpa_supplicant,或者运行wpa_cli命令直接与wpa_supplicant进行交互。在wpa_supplicant中,当SSID和密码被输入后,它会将身份验证消息发送给AP进行身份验证,并根据AP响应更新状态。如果认证成功,则可以进行DHCP分配地址,完成对无线网络的接入。 总之,wpa_supplicant源码分析对于理解无线网络认证和连接过程非常有帮助,它充分利用了状态机的思想,实现了WPA/WPA2的加密认证,可以说是无线网络连接过程中必不可少的一部分。 ### 回答3: wpa_supplicant是一款常用的无线(Wi-Fi)网络实现工具,它采用C语言编写,提供了跨平台的实现。使用wpa_supplicant可以方便地连接和管理无线网络,支持WPA和WPA2等多种安全认证协议。在实现过程中,wpa_supplicant采用了多线程和事件驱动的方式,提高了性能和扩展性。 在wpa_supplicant源码中,主要包含以下几个模块:网络配置、网络扫描、认证、加密、驱动程序和事件处理。其中,网络配置模块主要负责配置网络连接的参数,例如SSID、密码等;网络扫描模块负责扫描附近的无线网络,并返回扫描结果;认证模块和加密模块负责实现WPA和WPA2等安全认证协议;驱动程序模块负责实现无线网卡的驱动程序,不同网卡驱动程序的实现方式各不相同;事件处理模块负责处理各种事件,例如连接成功、认证失败等,并根据不同的事件做出相应的处理。 值得注意的是,wpa_supplicant源码中实现了很多高级功能,例如WPS、P2P等,这些功能大大增强了wpa_supplicant的实用性和扩展性。 总之,wpa_supplicant源码的分析非常复杂,需要对无线网络、网络协议、驱动程序等方面有深入的理解,才能正确地理解和使用wpa_supplicant。对于开发者而言,如果要对wpa_supplicant做出一些改进和扩展,需要熟练掌握wpa_supplicant源码的实现机制和原理,这样才能确保修改的代码正确、高效和健壮。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值