按之前计划的,这期我们来看 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. 反思拖延症:持续告诉自己立即做立即做;面对困难时要持续坚持;面对困顿时要转变方法

    自己存在拖延症,不好,应该怎么解决: 1.不断的告诉自己立即做,立即做,立即做,立即做,立即做:不能几分钟后开始做,因为几分钟之后你不会去做的: 2.注意力持续在线,坚持坚持,困难总会过去 3.碰到困 ...

  2. 大数据告诉你怎么做征信

    大数据告诉你怎么做征信 2016-11-01 02:38 | 新庄里 近年来国内个人信贷市场迅速发展,传统金融机构.P2P.电商.小额贷款公司等纷纷将目光投向个人消费领域,随着越来越多的金融业务互联网 ...

  3. 【转】做正确的事情,等着被开除(Do the right thing, Wait to get fired)

    原作者博客:https://brendansterne.com/2013/07/11/do-the-right-thing-wait-to-get-fired/ 下面是中文翻译: 我偶然在< T ...

  4. 单元测试试图告诉我们关于 Activity 的什么事情:第二部分

    本文讲的是单元测试试图告诉我们关于 Activity 的什么事情:第二部分, Activity 和?Fragment,可能是因为一些奇怪的历史巧合,从 Android 推出之时起就被视为构建 Andr ...

  5. 双十一大促技术只做两件事情?来看看阿里巴巴的技术之道

    作为国内互联网技术的典型代表,阿里巴巴的技术一直备受关注 编者按:本文来自微信公众号"InfoQ"(ID:infoqchina),36氪经授权发布. 支付宝的高可用与容灾架构演进 ...

  6. 面试题,你做了哪些事情来提升自己的沟通能力?

    面试中,面试官可能会问你的优点是什么?很多人可能回答说:沟通能力,一般来说对话也就到此为止了,但有些面试官会追问一句,你做过哪些事情来提高自己的沟通能力呢?这个时候很多人就傻眼了,不知该如何回答,我们 ...

  7. 转载:做正确的事情,等着被开除(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 ...

  8. QQ20岁:20年版本迭代只做一件事情!

    公众号作者BLUES(兰军):致力于教育+互联网行业产品打造,梅沙科技创始人,原迅雷产品总监,腾讯.YY语音高级产品经理,公众号ID:bluemidou,写了600多篇原创文章,欢迎留言交流. === ...

  9. 发人深省--周鸿祎:少功利多学习 做力所能及的事情

    http://news.cyzone.cn/news/2011/09/19/216218.html [创业邦讯]9月18日消息,首届"新新创业达人"全国校园巡讲活动全面启动,本次活 ...

  10. 深度分享|姚劲波:创业要趁早,要做未来的事情!

    今天,投投想和你分享一篇姚劲波先生总结自己创业多年来的心得感受.用58到家CEO陈小华的话说,老姚把很多不可能变成了可能.投投在做这篇文章的过程中,整个人都陷进去了,因为本文包含了太多姚劲波先生在创业 ...

最新文章

  1. PyTorch基础与简单应用:构建卷积神经网络实现MNIST手写数字分类
  2. 基于深度学习的文本数据特征提取方法之Glove和FastText
  3. 想成为软件架构师,你的举止够优雅吗?
  4. Spring+SpringMVC项目搭建
  5. 12/7个人站立会议
  6. bootcss echarts_数据可视化插件使用(Echarts)
  7. 【Java多线程】sleep与yield的辨析
  8. CentOS7 防火墙规则 (firewalld)
  9. JavaScript的排序问题
  10. Facebook开源了两个无监督翻译模型,只用单语就能训练双语
  11. 蓝天采集系统的安装和遇到的问题及解决方案
  12. 连接数据库时出错 : The server time zone value is unrecognized or represents more than one time z
  13. Flask项目实战——6—(前台用户模型、前台登录注册、图形验证码、手机短信验证码、添加表单验证短信验证码请求)
  14. TensorFlow学习笔记——深层神经网络
  15. excel数字不能累加_如何修复不累加的Excel编号
  16. 18.多级页表与快表
  17. A-Frame WebVR试玩报告
  18. 期权——risk neutral price
  19. NVIDIA官网下载历史版本方法
  20. 【干货】统计学 × 数据分析 · 上

热门文章

  1. 基于混沌系统的文本加密算法研究(一)——混沌及混沌加密的基础知识
  2. xp关闭计算机共享,关闭Windows XP系统默认共享四种方法
  3. 顶级赛事!2021 CCF大数据与计算智能大赛强势来袭~
  4. Python 调用 kafka 构建完整实例分析与应用
  5. 前端关系图谱插件_前端拓扑图插件选型对比
  6. 戴尔DELLEMC服务器重装CentOS 7系统
  7. 麻辣香锅(Spicy Hot Pot)浏览器劫持病毒应急方法
  8. DM6437 720P调试问题记录
  9. 应用工具推荐phpStudy(小皮面板)
  10. K线形态识别—双K线之卖出型双日K线组合