写在前面

关于nl80211和cfg80211
这个之前一直困扰,今天问了下坐我旁边的大神,终于稍微懂了点

nl80211 是内核的一套无线驱动接口,标志性的特征就是 TAG-DATA一一对应,例如
bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 就是从netlink msg中取出mac存到bssid中去
wpa_supplicant 发起的MLME命令都是按固定格式发送netlink msg(socket通信)给nl80211(supplicant是用户态,而nl80211是内核态)
nl80211用于配置一个cfg80211设备,且用于kernel与userspace间的通信

cfg80211则类似一个插座,从架构图上看,更下面的driver是插头,上面的nl80211是插孔
driver在初始化的时候(gl_init)会向cfg80211注册一个wireless device(wdev),将所有80211相关的api注入此wdev
这些api再被nl80211调用,比如
nl80211_associate -> cfg80211_mlme_assoc

回到正题

书接上文,继续从 assoc 动作窥伺supplicant与driver的交互

//nl80211.c
nl80211_associateerr = cfg80211_mlme_assoc(rdev, dev, chan, bssid, ssid, ssid_len, &req);//mlme.c
//req -> struct cfg80211_assoc_request *req
cfg80211_mlme_assocerr = rdev_assoc(rdev, dev, req);//rdev-ops.h
//是不是感觉和 wpa_drv_associate 很像捏
static inline int rdev_disassoc(struct cfg80211_registered_device *rdev,struct net_device *dev,struct cfg80211_disassoc_request *req)
{int ret;ret = rdev->ops->disassoc(&rdev->wiphy, dev, req);return ret;
}

rdev->ops 一般会在driver init的时候注入,这个各家厂商的设计不一样。保命起见,我不能直接放源码
但可以明确的是

static inline struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
所有wlan driver init过程中都会调用此函数(或者wiphy_new_nm)来创建一个wiphy变量,并将一堆ops绑定它

所以我们知道
wpa_supplicant 的一个动作要经过

  1. 把信息按格式塞到对应tag,发送nl_msg,传给nl80211
  2. nl80211取出信息,封装好之后,调用cfg80211的api,cfg80211的api调用实质是 cfg80211_registered_device *dev->ops
  3. driver执行动作

到这里,作为一个驱动工程师该了解的就差不多了

一些后续学习的想法

这个流程过完之后,后面的学习大致顺序是

  1. 看一下driver如何告诉supplicant自己做的一些事情以及结果
  2. 简单过下 wpa_supplicant_ 前缀的函数,要知道supplicant能做哪些事情,带参是什么
  3. 同上,整理wifi常见特性使用时supplicant做的操作,比如连接一个热点,WLAN直连等
  4. 是时候自己用wpa_cli写一些“属于自己”的函数了

看源码的过程中,还是要尽量做到对 数据结构 敏感

【wpa_supplicant】从 assoc 动作窥伺supplicant与driver的交互(二)相关推荐

  1. 【wpa_supplicant】从 assoc 动作窥伺supplicant与driver的交互(一)

    最近看到了一个大神的博客,结合自己学习 wpa_supplicant 的体验,有了一些感悟. 阅读源码,特别是一整份极大的源码时,要多去揣测作者的编码心态和编码习惯: 初期走读的时候,不要去尝试做到面 ...

  2. V4L2用户空间和kernel层driver的交互过程

    这篇文章详细分析了V4L2用户空间和kernel层driver的交互过程,目的只有一个: 更清晰的理解V4L2视频驱动程序的系统结构,驱动编程方法,为以后开发视频驱动打好基础 既然从用户层出发探究驱动 ...

  3. User Mode Driver Management 介绍(二)

    (接上一篇) 3> 调用User Mode Driver Host API来将Driver Load到内存 CeFsIoControl()实际上是一个对文件系统驱动FSD进行操作的函数,需要传入 ...

  4. I2C driver编写指导二:编写i2c client driver指南

    原文地址::http://blog.csdn.net/guoshaobei/archive/2010/06/08/5656001.aspx 译者:郭少悲 日期:2010/06/08 源文:linux- ...

  5. Android WiFi从app到driver详解

    分三大部分: (1)    Wifi模块相关文件的解析 (2)    Wpa_supplicant解析 (3)    Wifi的启动流程(有代码供参考分析) 一,Wifi模块相关文件解析 1)     ...

  6. wpa_supplicant与kernel的接口

    2019独角兽企业重金招聘Python工程师标准>>> 1. 接口定义实现wpa_drivers wpa_drivers的定义如下: [cpp] view plaincopy str ...

  7. wpa_supplicant 源码分析 --conf 配置文件

    原文:wpa_supplicant源码分析--conf配置文件 | Winddoing's Notes 解析 wpa_supplicant 的配置文件,一般叫做 wpa_supplicant.conf ...

  8. wpa_supplicant软件架构分析

    wpa_supplicant软件架构分析 1. 启动命令 wpa supplicant 在启动时,启动命令可以带有很多参数,目前我们的启动命令如下: wpa_supplicant /system/bi ...

  9. WiFi Direct 在wpa_supplicant中的流程一(初始化P2P)

    P2P在wpa_supplicant中的初始化流程 WIFI-Driect在WPA_S中的初始化流程: 注册action wpas_p2p_init() 代码段1 wpas_p2p_init() 代码 ...

  10. Selenium3 Python WebDriver API源码探析(10):动作链(ActionChains):鼠标事件和键盘事件

    鼠标.键盘事件是我们利用Selenium操控浏览器的重要交互手段,主要由selenium\webdriver\common\action_chains.py中的ActionChains类实现.该类通过 ...

最新文章

  1. 如何使用eclipse打开已有工程
  2. 你知道从浏览器发送请求给SpringBoot后端时,是如何准确找到哪个接口的?(下篇)学废了吗?
  3. android studio设置内存
  4. 【Java TreeMap】测试TreeMap的使用、Comparabe自定义类的自定义排序方式
  5. t3软件怎么生成报表_临沂用友畅捷通T3财务通软件财税一体化
  6. python内置函数分类_Python 69个内置函数分类总结
  7. js设计一个带开关的时钟_数电题:三个按键一个灯
  8. 发年终奖了,创了新高
  9. 用jquery动态添加form表单
  10. 20145226夏艺华 JAVA预备作业1
  11. python获取交易软件数据_几行Python代码,轻松获取美股阿里巴巴的交易数据
  12. 【vijos1790】拓扑编号
  13. mysql同步一段时间后失败_mysql 主从同步失败后
  14. 【渝粤题库】陕西师范大学165101社会学 作业(高起专)
  15. 66.Systemd 命令
  16. C++--第16课 - 继承中的构造与析构
  17. 【软件工程】第一章 软件工程概述 考试重点 复习记录
  18. Java多线程系列--“JUC锁”03之 公平锁(一) (r)
  19. STM32 Roadshow 更新 | 生态伙伴演讲定档
  20. Android微博平台设计,基于Android平台的微博系统设计与开发

热门文章

  1. 数学史思维导图_趣谈数学历史:数学发展简史思维导图——中国、外国数学发展...
  2. 关于单链表结构体定义结点时 LNode *LinkList的理解
  3. 基于zynq的千兆网udp项目_AC6102开发板千兆以太网UDP传输实验2
  4. Dell计算机装Win8,dell win8重装系统教程详解
  5. 人类HUMANKIND怎么攻城?攻城战准备与打法教程
  6. 51单片机制作计算机1602显示,51单片机对LCD1602液晶显示器的控制
  7. c语言中isupper用法,C 库函数 isupper() 使用方法及示例
  8. 无人机飞行控制逻辑以及不稳定原因分析
  9. Python学习笔记——python基础 2. 高级变量类型(列表、元祖、字典)
  10. 自动刷新网页代码(可多个网页)