蓝牙和WIFI

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

文 | 力卉编程

上一篇 下一篇

猜你喜欢

热点阅读