【wpa_supplicant】driver如何告诉supplicant自己做的一些事情以及结果
按之前计划的,这期我们来看 driver如何告诉supplicant自己(被要求)做的一些事情以及结果
老样子,adb logcat -c /adb logcat -s wpa_supplicant
会发现如下的类似打印
06-24 11:58:41.768 31436 31436 D wpa_supplicant: nl80211: Drv Event 33 (NL80211_CMD_TRIGGER_SCAN) received for wlan0
于是我们定位了 driver与supplicant通信的关键一环
还记得之前 wpa_supplicant 初始化过程中调用的 nl80211_global_init 吗
nl80211_global_init //上述的 global_initglobal->netlink = netlink_init(cfg);wpa_driver_nl80211_init_nl_global(global)//这里涉及到 netlink 的使用,没必要深究nl80211_register_eloop_read(&global->nl_event, wpa_driver_nl80211_event_receive, global->nl_cb, 0);eloop_register_read_sock(nl_socket_get_fd(*handle), wpa_driver_nl80211_event_receive, global->nl_cb, *handle); // 所以我们知道通过netlink报过来的事件都由 wpa_driver_nl80211_event_receive 处理global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
这里其实描述的有些错误
在 nl80211_register_eloop_read 之前有一行
nl_cb_set(global->nl_cb, NL_CB_VALID, NL_CB_CUSTOM, process_global_event, global);
目前看不大懂,但大致能猜到这是设置 netlink80211 报上来事件时会调用的回调函数
int process_global_event(struct nl_msg *msg, void *arg)dl_list_for_each_safe(drv, tmp, &global->interfaces, struct wpa_driver_nl80211_data, list) {for (bss = drv->first_bss; bss; bss = bss->next) {do_process_drv_event(bss, gnlh->cmd, tb);return NL_SKIP;}}
遍历每个 interface 的每个bss,处理nl80211报上来的事件
static void do_process_drv_event(struct i802_bss *bss, int cmd, struct nlattr **tb) {wpa_printf(MSG_DEBUG, "nl80211: Drv Event %d (%s) received for %s", cmd, nl80211_command_to_string(cmd), bss->ifname);switch(cmd) {case NL80211_CMD_TRIGGER_SCAN:wpa_supplicant_event(drv->ctx, EVENT_SCAN_STARTED, NULL);break;case ###:mlme_event_###(###);break;case ###:nl80211_###(###);break;default:wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event (cmd=%d)", cmd);break;}
}
对各种case的处理看起来有3类,实际最后的处理都是 wpa_supplicant_event
wpa_supplicant_event 是一个800多行的函数,里面按 event_type 对各种事件做处理,事件相关的数据都放在wpa_event_data中传入
do_process_drv_event 一定要做的事情就是 按事先沟通好的格式从 struct nlattr **tb 这个二维数组中取出数据,以便下一步处理
以 NL80211_CMD_NEW_SCAN_RESULTS 为例我们看下 wpa_supplicant_event 的处理
case EVENT_SCAN_RESULTS:if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {wpa_s->scan_res_handler = NULL;wpa_s->own_scan_running = 0;wpa_s->radio->external_scan_req_interface = NULL;wpa_s->last_scan_req = NORMAL_SCAN_REQ;break;}if (!(data && data->scan_info.external_scan) &&os_reltime_initialized(&wpa_s->scan_start_time)) {struct os_reltime now, diff;os_get_reltime(&now);os_reltime_sub(&now, &wpa_s->scan_start_time, &diff);wpa_s->scan_start_time.sec = 0;wpa_s->scan_start_time.usec = 0;wpa_dbg(wpa_s, MSG_DEBUG, "Scan completed in %ld.%06ld seconds",diff.sec, diff.usec);}if (wpa_supplicant_event_scan_results(wpa_s, data))break; /* interface may have been removed */if (!(data && data->scan_info.external_scan))wpa_s->own_scan_running = 0;if (data && data->scan_info.nl_scan_event)wpa_s->radio->external_scan_req_interface = NULL;radio_work_check_next(wpa_s);break;
可以看出 wpa_supplicant_event 会根据事件类型调用 更多 wpa_supplicant_event_ 前缀的api
就看到这里吧。
有一点感悟是 supplicant 的架构设计很严苛,牢记每一层 api 的前缀可以帮助读者很快掌握每个函数应该做到的事情
例如,supplicant通报fwk事件的api大部分都有 wpas_notify 前缀,再比如这期我们看到的 wpa_supplicant_event 则是supplicant自己内部的处理,nl80211的一些ops都是 nl80211_ 前缀
【wpa_supplicant】driver如何告诉supplicant自己做的一些事情以及结果相关推荐
- 反思拖延症:持续告诉自己立即做立即做;面对困难时要持续坚持;面对困顿时要转变方法
自己存在拖延症,不好,应该怎么解决: 1.不断的告诉自己立即做,立即做,立即做,立即做,立即做:不能几分钟后开始做,因为几分钟之后你不会去做的: 2.注意力持续在线,坚持坚持,困难总会过去 3.碰到困 ...
- 大数据告诉你怎么做征信
大数据告诉你怎么做征信 2016-11-01 02:38 | 新庄里 近年来国内个人信贷市场迅速发展,传统金融机构.P2P.电商.小额贷款公司等纷纷将目光投向个人消费领域,随着越来越多的金融业务互联网 ...
- 【转】做正确的事情,等着被开除(Do the right thing, Wait to get fired)
原作者博客:https://brendansterne.com/2013/07/11/do-the-right-thing-wait-to-get-fired/ 下面是中文翻译: 我偶然在< T ...
- 单元测试试图告诉我们关于 Activity 的什么事情:第二部分
本文讲的是单元测试试图告诉我们关于 Activity 的什么事情:第二部分, Activity 和?Fragment,可能是因为一些奇怪的历史巧合,从 Android 推出之时起就被视为构建 Andr ...
- 双十一大促技术只做两件事情?来看看阿里巴巴的技术之道
作为国内互联网技术的典型代表,阿里巴巴的技术一直备受关注 编者按:本文来自微信公众号"InfoQ"(ID:infoqchina),36氪经授权发布. 支付宝的高可用与容灾架构演进 ...
- 面试题,你做了哪些事情来提升自己的沟通能力?
面试中,面试官可能会问你的优点是什么?很多人可能回答说:沟通能力,一般来说对话也就到此为止了,但有些面试官会追问一句,你做过哪些事情来提高自己的沟通能力呢?这个时候很多人就傻眼了,不知该如何回答,我们 ...
- 转载:做正确的事情,等着被开除(Do the right thing, Wait to get fired)
做正确的事情,等着被开除(Do the right thing, Wait to get fired) http://www.vaikan.com/do-the-right-thing-wait-to ...
- QQ20岁:20年版本迭代只做一件事情!
公众号作者BLUES(兰军):致力于教育+互联网行业产品打造,梅沙科技创始人,原迅雷产品总监,腾讯.YY语音高级产品经理,公众号ID:bluemidou,写了600多篇原创文章,欢迎留言交流. === ...
- 发人深省--周鸿祎:少功利多学习 做力所能及的事情
http://news.cyzone.cn/news/2011/09/19/216218.html [创业邦讯]9月18日消息,首届"新新创业达人"全国校园巡讲活动全面启动,本次活 ...
- 深度分享|姚劲波:创业要趁早,要做未来的事情!
今天,投投想和你分享一篇姚劲波先生总结自己创业多年来的心得感受.用58到家CEO陈小华的话说,老姚把很多不可能变成了可能.投投在做这篇文章的过程中,整个人都陷进去了,因为本文包含了太多姚劲波先生在创业 ...
最新文章
- PyTorch基础与简单应用:构建卷积神经网络实现MNIST手写数字分类
- 基于深度学习的文本数据特征提取方法之Glove和FastText
- 想成为软件架构师,你的举止够优雅吗?
- Spring+SpringMVC项目搭建
- 12/7个人站立会议
- bootcss echarts_数据可视化插件使用(Echarts)
- 【Java多线程】sleep与yield的辨析
- CentOS7 防火墙规则 (firewalld)
- JavaScript的排序问题
- Facebook开源了两个无监督翻译模型,只用单语就能训练双语
- 蓝天采集系统的安装和遇到的问题及解决方案
- 连接数据库时出错 : The server time zone value is unrecognized or represents more than one time z
- Flask项目实战——6—(前台用户模型、前台登录注册、图形验证码、手机短信验证码、添加表单验证短信验证码请求)
- TensorFlow学习笔记——深层神经网络
- excel数字不能累加_如何修复不累加的Excel编号
- 18.多级页表与快表
- A-Frame WebVR试玩报告
- 期权——risk neutral price
- NVIDIA官网下载历史版本方法
- 【干货】统计学 × 数据分析 · 上