版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/lee244868149/article/details/42098527

这篇主要对hostapd这个程序做一个整体的梳理,自己也觉得前面说的都好乱,尽是一些代码的分析,过于细节了。

关于EAP状态机的转化,这里就不多说了,点击打开链接 这里可以下载原文档,知道的是自己不会比原文档写的还好的,所以就放弃了介绍状态机了。

先理解一下 struct hapd_interfaces interfaces 这个结构体对象, 这个结构体里面封装的是一个count成员和一个 struct hostapd_iface  **iface成员:

struct hapd_interfaces interfaces {

size_t  count;

struct hostapd_iface  **iface;   }

所以interfaces其实是对接口的封装,也许有多张无线网卡,那么就会有多个无线接口(注意区分空中接口),那么hostapd程序的interfaces就会封装多个 iface对象,并用count计数。比如我现在hostapd需要用两张网卡来创建两个接口,一个是2.4G、一个是5G的网络,那么调用hostapd 传入参数时,就需要传入两个配置文件,count将会获得值2,并且会创建两个结构体指针 iface[0]和iface[1] (  struct hostapd_iface  *iface[ ] ),用来分别存放两张网卡的各自操作和信息等。

下面只分析一张网卡(注意下面说的网卡都是指无线网卡)的整体过程,因为不同无线网卡的区别主要体现在驱动方面,所以hostapd程序来说,不同网卡之间的处理过程都差不多的(比较数据包格式和通信协议没差啊)。

main函数开始的for循环就不在重复了,主要注意的是-B选项和-e选项指定了 程序以后台进程运行和指定了entropy文件罢了。

下面将以3条线开始整理,分别是 hostapd_global_init()    hostapd_interfaces_init()   hostapd_global_run() , 关于出错处理时,需要注意一下这个进程的重新加载,判断reloading以后调用execvp()函数实现重载。

一、 hostapd_global_init()   实现安全方法的注册、eloop初始化、entropy文件的读取和处理、退出中断的注册

1. 注册方法 eap_server_register_methods()

首先调用各种方法对应的注册函数,定义struct eap_method *eap 对像,给这个对象申请空间后,给eap对象中的操作函数指针赋值,最后使用eap_server_method_register()将本方法添加进 method的链表中。

2. eloop初始化 eloop_init()

将struct eloop_data  eloop对象清空后,将eloop.timeout添加到双链表中,最后注册一个SIGSAVE中断,以在特定情况下终止进程。

3. entropy文件的读取和处理 random_init()

4.退出中断的注册  eloop_register_signal_terminate()

这里主要完成eloop.teminate = 1 ,当信号产生时, 这个变量置1,能够让后面的while循环退出,终止程序,第二个参数interfaces主要用来指定这个信号发送给哪张无线网卡(当前无线网卡)。

二、 hostapd_interfaces_init()    这个函数很关键,接下来慢慢细说!

struct hostapd_iface *iface  这个对象封装了对接口操作的各种函数以及对接口描述的各种参数。

iface = hostapd_init (config_fname);  注意着句话,函数的返回值赋值给了iface,而传入的参数是config_fname(配置文件路径及名称),我们可以猜想这句话就是要完成将配置文件中的内容读取出来,并存放到iface对象中。

1. 根据配置文件配置接口  hostapd_init()

为了具体一点,现在将代码列出来:

首先定义三个结构体对象,分别用来存放接口信息、接口配置信息和报文协议等信息——hostapd_iface、 hostapd_conf、 hostapd_data

hapd_iface->reload_config = hostapd_reload_config  需要刷新或者修改了配置文件需要重新加载的时候,调用这个函数

hapd_iface->config_read_cb = hostapd_config_read 先加载默认的配置,然后加载配置文件中的配置,存放到conf对象中

hapd_iface-> config_fname  存放配置文件的路径信息

hapd_iface->ctrl_iface_init = hostapd_ctrl_iface_init   这个函数很重要,主要对初始化套接字通信,包括调用socket和bind函数eloop_register_read_sock,实现套接字通信,这里调用了hostapd_ctrl_iface_receive(),里面有receivefrom和sendto函数实现通信。

hapd_iface->conf = conf 存放读取的配置信息

hapd->msg_ctx = hapd   这里存放各种要发送的信息,比如报文信息、协议信息等, 因为hapd是struct hostapd_data 结构体对象

接下来对bss进行初始化

2. 驱动程序初始化  hostapd_driver_init()

首先对启动可能用到的各种params进行初始化赋值,然后用hapd->driver_priv = hapd->driver-> hostapd_init( hapd, &params) 语句,用params中的参数对驱动进行初始化。

那么hostapd_init调用的是哪里的函数呢?这个路径的指定在初始化iface时,在iface->BSS[0] 中,hostapd_init将会调用 src/ driver / dirver_madwifi.c 中的 madwifi_init函数,具体驱动应用程序做了什么,就不拓展了。

hapd->driver->get_capa 需要留意一下。

3. 设置接口配置 hostapd_setup_interface()      "setup_interface"

使用的hostapd_data对象还是来自于 iface->bss[0]  ,首先使用hostapd_validate_bssid_configuration验证iface中的BSSID是否可用,调用hosta_get_hw_features获取硬件信息,最后调用hostapd_setup_interface_complete返回结果。

其实在上面那个函数中,是做了好多设置才返回的,比如通道、频率、硬件模式(hw_mode)、传输速率、RTS、帧、热拔插、WPS等等。

三、 hostapd_global_run()

1. tncs_global_init 初始化

2.os_daemonize()让本进行以守护进程运行

3.eloop_run()

将申请的标准输入、输出、出错文件描述符集,用select函数进行监听,调用eloop_process_pending_signals处理即将到来的中断信号,接下来进行超时处理。

还有关于驱动那一块还没有整理,先留着吧,说不定哪一天兴趣来了在看看,花这么多时间才弄清楚这个小小的hostapd,感觉有点不值,有时候问自己为什么要花时间去弄明白人家已经做好的东西呢,直接拿过来用不就好了吗,没办法,也许嵌入式开发就是这样吧,也许是性格使然。

hostapd wpa_supplicant madwifi详细分析(七)——hostapd整体梳理相关推荐

  1. hostapd wpa_supplicant madwifi详细分析(八)——wpa_supplicant的配置文件

    距离上一篇文章的更新已经将近半年了,这半年忙项目忙得几乎没有什么时间给自己积累一些东西,也没什么心思转到这边来写点东西,当一个项目放到自己身上的时候,发现并不像开发一个模块或一个功能那么简单,涉及方方 ...

  2. hostapd wpa_supplicant madwifi详细分析(九)——wps原理及实现 一

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/lee244868149/articl ...

  3. hostapd wpa_supplicant madwifi详细分析(十)——wps原理及实现 二

    前面对WPS交互过程有了大概的了解,现在了解一下WPS交互时帧的格式以及每个帧所携带的信息. WPS使用802.1x和EAP传输in-band注册协议的交互信息,这些信息里面都会携带大端排序的attr ...

  4. hostapd wpa_supplicant madwifi详细分析(十一)——wps原理及实现 三

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lee244868149/article ...

  5. Blueprint代码详细分析-Android10.0编译系统(七)

    摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  6. 新手向:从不同的角度来详细分析Redis

    最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...

  7. 乐鑫esp8266学习rtos3.0笔记第11篇:详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

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

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

  9. 七年级计算机教学质量分析,七年级年级组质量分析会

    撰稿:七年级教务处摄影:欧平编辑:李楠 一路奋斗一路歌 七年级A组期中质量分析会 4月25日下午,窗外春色满园,生机盎然,室内气氛热烈.七年级A.B组期中质量分析会正在热烈进行.会议A组部分由A组年级 ...

最新文章

  1. VS2013+OpenCV3.1.0配置教程
  2. Nature: 海洋病毒对环境基因组和潜在的生物地球化学影响
  3. 关于javascript的介绍
  4. ansible基本操作
  5. 一个权限管理模块的设计(转载)
  6. Java 多线程同步和异步详解
  7. [转载]基于数据挖掘技术入侵检测系统研究
  8. Java的clone()用法实例解析
  9. java数组求和递归,js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值...
  10. 113. 路径总和 II golang
  11. MySQL中innodb_page_cleaners详解
  12. 干货分享,我是怎么寻找暴利赚钱项目的
  13. atitit.attilax.com产品 软件项目通用框架类库总结
  14. 《麦肯锡方法》读书笔记10
  15. 关于短除法求两个数的最小公倍数的公式的解释
  16. python 智能识别 商品_python人工智能-图像识别
  17. 【js逆向】md5加密参数破解
  18. DbContext(String)+SqlQuery一起使用
  19. 信息项目管理师 高级软考 案例分析
  20. 2000-2017年全球人口密度数据下载LandScan

热门文章

  1. 虫洞 Wormhole
  2. 笔试记录 58同城 算法 20200921
  3. 移动支付模式再添新军:指纹支付
  4. java中的throw new Exception();和throw e;异常抛出
  5. 2020中兴软件测试面经
  6. Ubuntu 16.04 引导修复(boot-repair)
  7. Labelme使用——数据集标注详解
  8. python的占位符——%
  9. mysql下载完安装包怎么办_MySQL下载压缩包安装详细过程
  10. 您试图在此 Web 服务器上访问的 Web 应用程序当前不可用。