Wifi笔记 | wpa_supplicant与内核的通信
2019-12-27 本文已影响0人
力卉编程
内核中nl80211模块
nl80211直接使用的是Generic Netlink接口,添加了一个name为“nl80211”的family和对应的 ops方法,同时注册了多个多播组
代码位置
kernel/net/wireless/nl80211.c
kernel/include/uapi/linux/nl80211.h
nl80211添加到genl中的family
static struct genl_family nl80211_fam = {
.id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */
.name = "nl80211", /* have users key off the name instead */
.hdrsize = 0, /* no private header */
.version = 1, /* no particular meaning now */
.maxattr = NL80211_ATTR_MAX,
.netnsok = true,
.pre_doit = nl80211_pre_doit,
.post_doit = nl80211_post_doit,
};
static struct genl_ops nl80211_ops[]
是nl80211可以接受到的命令,每种命令都有相应的nl80211处理函数
wifi的scan,associate,connect等等,都是由此处理的
wpa_supplicant中的genl socekt
wpa_s中与nl80211的通信时创建了两条socket,一条用于发送消息到内核,一条接收内核中的多播消息,
scoekt的初始化源码在wpa_driver_nl80211_init_nl_global()中
7.2.1 发送消息的socekt:
global->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
global->nl = nl_create_handle(global->nl_cb, "nl");
# 在nl80211中,每接收到一条命令,都会通过socket发送回相应的处理结果
# 其中nl_cb可以自定义函数处理内核返回的消息。
# 在global->nl发送命令前,通过以下函数设置自定义的结果处理函数。
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, valid_handler, valid_data);
7.2.2接收内核多播消息的socekt:
global->nl_event = nl_create_handle(global->nl_cb, "event");
# 获取nl80211中各个多播组的group_id,并添加socekt到该多播组
ret = nl_get_multicast_id(global, "nl80211", "scan");
ret = nl_socket_add_membership(global->nl_event, ret);
文 | 力卉编程