单独拿出来,分析以下上层应用与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. 浅谈React、Vue 部分异步

    React中的setState setState为什么需要异步? 无法限制何时使用异步,多次连续使用setState 防止多次渲染,异步rendering不仅仅是性能上的优化,而且这可能是react组 ...

  2. youku客户端

    文件结构 config import os IP_PORT = ('127.0.0.1',8080) BASE_DIR = os.path.dirname(os.path.dirname(__file ...

  3. Vue路由钩子 afterEach beforeEach区别

    ​ vue-router作为vue里面最基础的服务,学习一段时间,对遇到的需求进行一些总结 使用vue-cli作为开发前提 vue-router已经配置好了 路由写法 routes: [ { path ...

  4. JS 原型总结

    参考: (从内存角度)简单类型与复杂类型及原型链

  5. mongodb数据的导出和导入

    mongo导出表说明: root@827995de7c7f:/# mongoexport --help Usage: mongoexport <options> Export data f ...

  6. day 29 socketserver ftp功能的简单讲解

    1.上传下载的简单示例 server: import socket import struct import json   server =socket.socket() server.bind((' ...

  7. Java核心技术36讲----------谈谈final、finally、finalize有什么不同

    一.final 1.final修饰方法时,需要注意的点: #final修饰方法时,之前的第二个原因是效率.但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升.在最近的Java版本中,不需要使用 ...

  8. ruby 正则表达式Regexp

    ruby正则表达式在线编辑器:rubular 一般规则: /a/匹配字符a.      /\?/匹配特殊字符?.特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), + ...

  9. 高斯消元c++(非常暴力)

    暴力方法(已更新): #include<iostream> using namespace std; const int maxn = 1000; int n; double a[maxn ...

  10. postgresql 日期类型处理实践

    ---- 日期+1 select date '2018-01-14' + integer '1'; 结果: 2018-01-15 ---- 日期+1 后 转 20180101 日期字符串 select ...