wpa_supplicant下行接口浅析
wpa_supplicant通过socket通信机制实现下行接口,与内核进行通信,获取信息或下发命令。
以下摘自http://blog.csdn.net/fxfzz/article/details/6176414 ,该文章应该主要是分析wpa_supplicant_6的,和wpa_supplicant_8确实存在一些差别!!!以下还是根据6来分析。
wpa_supplicant提供的下行接口主要用于和kernel(driver)进行通信,下发命令和获取信息。
wpa_supplicant下行接口主要包括三种重要的接口:
.PF_INET socket接口,主要用于向kernel 发送ioctl命令,控制并获取相应信息。
.PF_NETLINK socket接口,主要用于接收kernel发送上来的event 事件。
.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_INET socket接口和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_INET socket接口和PF_NETLINK socket接口(wpa_supplicant_8中没有创建PF_NETLINK socket接口),然后通过这两个接口完成与kernel的信息交互。
wext提供的一个主要数据结构为:
struct wpa_driver_wext_data {
void *ctx;
int event_sock; //PF_NETLINK socket接口
int ioctl_sock; //PF_INET socket接口
int mlme_sock;
char ifname[IFNAMSIZ + ];
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 + ];
int scan_complete_events;
};
其中event_sock 为PF_NETLINK socket接口,ioctl_sock为PF_INET socket接口。
driver_wext.c实现了大量底层处理函数用于实现wpa_driver_ops操作参数,其中比较重要的有:
/* 初始化wpa_driver_wext_data 数据结构,并创建PF_NETLINK socket和 PF_INET socket 接口 */
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_supplicant_6上,wpa_supplicant_8中没有....
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协议栈。
其中主要的功能函数为:
/* 创建并初始化PF_PACKET socket接口,其中rx_callback 为从L2接收到的packet 处理callback函数 */
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);
ps:l2_packet_init方法中有代码:
eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL);
即注册了与socket关联的回调方法为l2_packet_receive。
/* 销毁 PF_PACKET socket接口 */
void l2_packet_deinit(struct l2_packet_data *l2);
/* L2层packet发送函数,wpa_supplicant用此发送L2层 802.1X packet */
int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr, u16 proto,
const u8 *buf, size_t len);
/* L2层packet接收函数,接收来自L2层数据后,将其发送到上层 */
static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx);
最后,附图说明wpa_supplicant与驱动交互的过程。从该图看,因为应用层部分还有WifiLayer类,说明android源码应该是2.1的,比较老了。不过分析了下wpa_supplicant,感觉变动不大,还是可以参考一下底层这一部分的。

wpa_supplicant下行接口浅析的更多相关文章
- wpa_supplicant上行接口浅析
摘自http://blog.csdn.net/fxfzz/article/details/6176414 wpa_supplicant提供的接口 从通信层次上划分, 上行接口:wpa_supplica ...
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
- Java集合框架之Set接口浅析
Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...
- Java集合框架之List接口浅析
Java集合框架之List接口浅析 一.List综述: 毫无疑问List接口位于java.util包下,继承自 Collection接口 存储元素的特点: 有序可重复(有序:即存进去是什么顺序,取出来 ...
- Function.prototype.bind接口浅析
本文大部分内容翻译自 MDN内容, 翻译内容经过自己的理解. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glo ...
- Linux驱动中completion接口浅析(wait_for_complete例子,很好)【转】
转自:http://blog.csdn.net/batoom/article/details/6298267 completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成.可以利用 ...
- C# IEnumerable 和 IEnumerator接口浅析
温故而知新,可以为师矣,有空经常复习一下基础知识是有必要的,并且能加深理解和记忆. Foreach常用于循环访问集合,对实现IEnumerable的接口的容器进行遍历,IEnumerable和IEnu ...
- Linux驱动中completion接口浅析(wait_for_complete例子,很好)
completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成.可以利用下面的宏静态创建completion: DECLARE_CO ...
- JSP接口浅析
一.tree型关系 JSP页面继承了org.apache.jasper.runtime.HttpJspBase抽象类并实现了org.apache.jasper.runtime.JspSourceDep ...
随机推荐
- 可能是catalan数吧
What's the number of distinct BSTs containing nodes {1, 2, 3 ,4}? 包含节点{1,2,3,4}的不同二叉搜索树有多少棵? int Num ...
- 最优贸易(tarjan,spfa)
题目描述 C国有n个大城市和m 条道路,每条道路连接这 n个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...
- 剑指Offer_编程题之从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值.
- zabbix基本监控各指标简解
监控项目及使用模板 监控http和https: Template App HTTP Service Template App HTTPS Service 监控cpu,内存,网络等: Templ ...
- linux系统基础之---系统基本安全(基于centos7.4 1708)
- 静态导入方法即自动拆装箱(java)
package example6;import static java.lang.System.out;import static java.util.Arrays.sort;import java. ...
- Spring Security学习笔记(一)
认证和权限控制 AuthenticationManager是认证的主要接口,它只有一个authenticate方法,可以做3件事情. 返回一个认证信息(Authentication),表示认证成功 抛 ...
- 【JVM】上帝视角看JVM内存模型,分而治之论各模块详情
1. 上帝视角 [树看JVM] [图看JVM] 2. 分而治之 2.1 堆区 构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden).幸存者区(survivor from .survivor ...
- 分析nginx 日志常用命令
一.概念 并发连接数 客户端向服务器发起请求,并建立了TCP连接.每秒钟服务器链接的总TCP数量,就是并发连接数.请求数 请求数指的是客户端在建立完连接后,向http服务发出GET/POS ...
- Hive的安装与部署(MySQL作为元数据库)
Hive的安装与部署(MySQL作为元数据) (开始之前确保Hadoop环境已经启动,确保Linux下的MySQL已经安装好) 1. 安装Hive (1)下载安装包 可从apache上下载hi ...