单独拿出来,分析以下上层应用与wpa_supplicant   wpa_supplicant与kernel 的socket交互。

关联上层应用与wpa_supplicant的socket的创建、连接流程分析

[-->./wpa_supplicant/ctrl_iface_unix.c]

1.wpa_supplicant初始化时,在wpa_supplicant_ctrl_iface_init方法中,会通过priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0); 创建了一个socket,然后bind到指定的地址中的路径(/data/misc/wifi/sockets/p2p0)。

这之后,便会把socket的fd保存到eloop_run中发rfds中了。由select监听变化。

2.然后在打开wifi之后,应用层会去连接wpa_supplicant,在wifi.c:: wifi_connect_to_supplicant--->wifi_connect_on_socket_path方法中,会创建ctrl_conn与monitor_conn来和wpa_supplicant交互,它们各自通过wpa_ctrl_open方法创建了一个socket(它们的目的端地址路径都是/data/misc/wifi/sockets/p2p0,可在wifi_connect_to_supplicant方法中打log查看)。然后,通过bind、connect方法与wpa_supplicant初始化时创建的priv->sock建立了连接。

ps:之前已经讨论过monitor_conn的作用是监听wpa_supplicant传递过来的消息。为什么呢,其实是因为通过wpa_ctrl_attach(monitor_conn[index])语句,将monitor_conn中的socket信息(包括源端地址)保存到wpa_supplicant的某个链表结构中,这样wpa_supplicant就能通过socket发送消息给上层应用了。

贴出部分log:

//wpa_supplicant初始化时,创建的socket关联的路径
D/wpa_supplicant(): cb---addr.sun_path is wpa_/data/misc/wifi/sockets
D/wpa_supplicant(): cb---addr.sun_path is /data/misc/wifi/sockets/p2p0
D/wpa_supplicant(): cb---addr.sun_path is wpa_wlan0
//创建ctrl_conn和monitor_conn时,socket关联的源端、目的端地址
I/wpa_ctrl(): cb---fd is , ctrl->local.sun_path is /data/misc/wifi/sockets/wpa_ctrl_595-, ctrl->dest.sun_path is /data/misc/wifi/sockets/p2p0
I/wpa_ctrl(): cb---fd is , ctrl->local.sun_path is /data/misc/wifi/sockets/wpa_ctrl_595-, ctrl->dest.sun_path is /data/misc/wifi/sockets/p2p0

关联kernel与wpa_supplicant的socket的创建流程分析        ---可参考” wpa_supplicant与kernel交互"

因为在”保存驱动接口”,select_driver方法中调用了global_init方法(会根据用户态的结构体wpa_driver_nl80211_ops中查找对应方法,即nl80211_global_init)。

在nl80211_global_init方法中,有两条关键语句:

//(1) 初始化netlink,并注册事件接收函数
global->netlink = netlink_init(cfg); //(2) 此global->ioctl_sock用作为ioctl命令的fd
global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, );

(1)netlink_init方法中创建了一个socket,并添加到eloop_run方法中的rfds中。用于从kernel态发送事件给用户态

netlink->sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
......
eloop_register_read_sock(netlink->sock, netlink_receive, netlink,NULL); 

(2)该socket用于从用户态发送请求给kernel态

上层应用与wpa_supplicant,wpa_supplicant与kernel 相关socket创建交互分析的更多相关文章

  1. Linux kernel 之 socket 创建过程分析

    重要结构体 struct socket 结构体 // 普通的 BSD 标准 socket 结构体 // socket_state: socket 状态, 连接?不连接? // type: socket ...

  2. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  3. List 接口以及实现类和相关类源码分析

    List 接口以及实现类和相关类源码分析 List接口分析 接口描述 用户可以对列表进行随机的读取(get),插入(add),删除(remove),修改(set),也可批量增加(addAll),删除( ...

  4. Linux Kernel ‘/net/socket.c’本地信息泄露漏洞

    漏洞名称: Linux Kernel ‘/net/socket.c’本地信息泄露漏洞 CNNVD编号: CNNVD-201312-037 发布时间: 2013-12-04 更新时间: 2013-12- ...

  5. wxWidgets的安装编译、相关配置、问题分析处理

    wxWidgets的安装编译.相关配置.问题分析处理 一.介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张) wxWidgets是一个开源的跨平台的C++构架库(framewo ...

  6. Android Camera 通过V4L2与kernel driver的完整交互过程

    http://blog.chinaunix.net/uid-26215986-id-3552456.html 原文地址:Android Camera 通过V4L2与kernel driver的完整交互 ...

  7. Mysql基础(一):Mysql初识、基本指令、数据库密码相关、创建用户及授权

    来源:https://www.cnblogs.com/liubing8/p/11432534.html 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 ...

  8. 数据库01 /Mysql初识、基本指令、数据库密码相关、创建用户及授权

    数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 2. 数据库管理系统/DBMS ...

  9. kvm三个kernel相关的调优

    今天在杭州参加淘宝嘉年华技术沙龙,主题是虚拟化和云计算,三个讲演: 淘宝网子团分享淘宝kvm技术的使用 华为的杨晓伟介绍虚拟化技术 阿里云郑永升介绍弹性云计算技术 其中KVM 调优,三点值得关注的: ...

随机推荐

  1. node的安装和配置

    一 . 直接安装node 1. http://nodejs.cn/download/ 根据自己的电脑选择适合的安装包 2.安装 , 无脑下一步 , 可以选择安装路径 , 但是一定要记住 . 3.命令行 ...

  2. 常用的JavaScript设计模式(一)Constructor(构造器)模式

    在es6中,新增了一个语法糖--class,可以说是为JavaScript引入了类的概念.而在传统的JavaScript中,则是通过构造器生成实例对象的. JavaScript支持特殊的constru ...

  3. Docker学习——gitlab部署

    Gitlab 下载镜像 docker pull hub.c.163.com/gutenye/gitlab-ce:latest 查看镜像 docker images 启动容器 宿主机和docker的端口 ...

  4. MapReduce序列化及分区的java代码示例

    概述 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, ...

  5. 第8章 ZooKeeper操作

    目录 8.1 集群环境搭建 1.上传ZooKeeper安装文件 2.编写配置文件 3.拷贝ZooKeeper安装信息到其它节点 4.修改其它节点配置 5.启动ZooKeeper 6.查看启动状态 7. ...

  6. 反射vs简单工厂模式

    interface Computer { void printpc(); } class lenovo implements Computer { @Override public void prin ...

  7. 笔记-python-float(‘inf’)

    笔记-python-float(‘inf’) 看算法时发现了flaot(‘inf’). Python中可以用如下方式表示正负无穷: float("inf"), float(&quo ...

  8. Java 高级应用编程 第一章 工具类

    一.Java API Java API简介 1.API (Application Programming Interface) 应用程序接口 2.Java中的API,就是JDK提供的各种功能的Java ...

  9. WPF ResourceDictionary 主题资源替换

    原文:WPF ResourceDictionary 主题资源替换 当我们需要在程序中替换主题,更换另一套背景.颜色.样式时,如何在不修改资源Key值,直接替换呢? 问题&疑问 1. Key值冲 ...

  10. Java:break和continue关键字的作用

    二者的作用和区别 1. break:直接跳出当前循环体(while.for.do while)或程序块(switch).其中switch case执行时,一定会先进行匹配,匹配成功返回当前case的值 ...