netlink怎么调用nl80211

发布网友 发布时间:2022-04-20 09:49

我来回答

1个回答

热心网友 时间:2023-07-07 23:51

想要两节nl80211.h的调用方法,推荐看一下iw的源代码。
大体流程如下:(只是逻辑关系,从iw源代码中抽取)
nl_socket_alloc(); //生成netlink的socket(netlink相关内容参考上文给出的介绍)
nl_socket_set_buffer_size(state->nl_sock, 8192, 8192); //调整缓存大小
genl_connect(state->nl_sock) //socket和内核连接(注意,这里用的genl的函数封装,具体可查参考(上文给出的地址))
genl_ctrl_resolve(state->nl_sock, "nl80211"); //genl的概念,向内核查询一下协议族的标志
msg = nlmsg_alloc(); //生成要发送往内核的帧(还没有填充内容)
cb = nl_cb_alloc(iw_debug ? NL_CB_DEBUG : NL_CB_DEFAULT); //生成回调函数,回调函数相关,见第一篇netlink的文档
genlmsg_put(msg, 0, 0, state->nl80211_id, 0, //往刚生成的帧中填充头部信息
cmd->nl_msg_flags, cmd->cmd, 0);
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devidx); //向刚生成的帧内部添加一个属性值
nl_socket_set_cb(state->nl_sock, s_cb); //设置回调函数
nl_send_auto_complete(state->nl_sock, msg); //发送刚生成的帧给内核。自此,内核当收到该请求时就会执行在帧中填充的命令索引和参数。比如搜索无线网,帧中就会填充scan命令对应的索引和要扫描的信道作为参数。
while (err > 0)
nl_recvmsgs(state->nl_sock, cb); //等待接收内核的反馈
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com