本文首发于: LHM’s notes欢迎关注我的新博客

一入wifi深似海~

用户态(wpas)适配

首先找到如下目录,是开源wpas代码,由于之前看了点wpas的具体实现代码,知道在linux系统中wpas与内核打交道是通过两种标准接口,要么是nl80211接口,要么是wext(Wireless Extensions无线拓展接口); 由于当前内核系统更换,那么nl80211和wext自然是不适用了。因此猜想鸿蒙在wpas上有做适配,先到wpas源码上瞧了瞧,果然发现有新增文件。

/home/hmos/sourceCode/third_party/wpa_supplicant/wpa_supplicant-2.9/src/drivers

下面这个是鸿蒙框架下的wpa_driver_ops结构体,是继nl80211和wext之后的又一套新标准。由于上层只是调用指定的方法,如 get_ssid 、scan2等等,而对其具体实现不会关注,因此在整个鸿蒙适配wpas代码的过程中,只需要将这个g_wifiDriverOps对象的方法通过HDF框架实现即可,说实话,我对nl80211里面又臭又长的代码已经忍了很久了,希望这个不要让我失望:)

如上图所示,左边是wpas使用nl80211标准接口,右边是wpas使用鸿蒙wifi 接口;两者在上层业务面的改动基本不大,只是和内核交互的接口区域需要适配鸿蒙LiteOS。如下是接口部分的代码:

接下来我们以扫描业务为例子,分析鸿蒙wifi接口与内核态的交互过程。

扫描流程分析

首先看WifiWpaScan2内部实现

static int32_t WifiWpaScan2(void *priv, struct wpa_driver_scan_params *params)
{WifiScan *scan = NULL;WifiDriverData *drv = NULL;int32_t timeout;int32_t ret;if ((priv == NULL) || (params == NULL) || (params->num_ssids > WPAS_MAX_SCAN_SSIDS)) {return -EFAIL;}drv = (WifiDriverData *)priv;scan = (WifiScan *)os_zalloc(sizeof(WifiScan));if (scan == NULL) {return -EFAIL;}// 以下四个函数都是参数赋值,将param中的参数赋值到scan结构体中if ((WifiWpaScanProcessSsid(params, scan) != SUCC) || (WifiWpaScanProcessBssid(params, scan) != SUCC) ||(WifiWpaScanProcessExtraIes(params, scan) != SUCC) || (WifiWpaScanProcessFreq(params, scan) != SUCC)) {WifiWpaScanFree(&scan);return -EFAIL;}// scan结构体继续被填充scan->fastConnectFlag = WPA_FLAG_OFF;scan->prefixSsidScanFlag = WPA_FLAG_OFF;// 将填充好的scan 消息结构体发送给内核ret = WifiWpaCmdScan(drv->iface, scan);WifiWpaScanFree(&scan);timeout = SCAN_TIME_OUT;//在事件调度中注册超时处理机制eloop_cancel_timeout(WifiWpaScanTimeout, drv, drv->ctx);eloop_register_timeout(timeout, 0, WifiWpaScanTimeout, drv, drv->ctx);return ret;
}

可以看到WifiWpaScan2只是一个结构体的填充并将该消息通过WifiWpaCmdScan去发送,具体发送流程进入看下:

int32_t WifiWpaCmdScan(const char *ifname, WifiScan *scan)
{int32_t ret;if (ifname == NULL || scan == NULL) {return -EFAIL;}struct HdfSBuf *data = HdfSBufObtainDefaultSize();if (data == NULL) {return -EFAIL;}bool isSerializeFailed = false;isSerializeFailed = isSerializeFailed || !HdfSbufWriteString(data, ifname);if (scan->bssid == NULL) {isSerializeFailed = isSerializeFailed || !HdfSbufWriteBuffer(data, scan->bssid, 0);} else {isSerializeFailed = isSerializeFailed || !HdfSbufWriteBuffer(data, scan->bssid, ETH_ADDR_LEN);}isSerializeFailed =isSerializeFailed || !HdfSbufWriteBuffer(data, scan->ssids, sizeof(scan->ssids[0]) * scan->numSsids);isSerializeFailed = isSerializeFailed || !HdfSbufWriteBuffer(data, scan->extraIes, scan->extraIesLen);isSerializeFailed =isSerializeFailed || !HdfSbufWriteBuffer(data, scan->freqs, sizeof(scan->freqs[0]) * scan->numFreqs);isSerializeFailed = isSerializeFailed || !HdfSbufWriteUint8(data, scan->prefixSsidScanFlag);isSerializeFailed = isSerializeFailed || !HdfSbufWriteUint8(data, scan->fastConnectFlag);if (isSerializeFailed) {wpa_printf(MSG_ERROR, "Serialize failed!");ret = -EFAIL;} else {ret = WifiWpaCmdBlockSyncSend(WIFI_WPA_CMD_SCAN, data, NULL);}HdfSBufRecycle(data);return ret;
}

看过鸿蒙驱动开发实战那章的对这个代码一定不会陌生,由于鸿蒙dispatch服务的参数类型是固定的,是struct HdfSBuf *类型,因此这里将发送数据通过HdfSbufWriteBuffer重新又拷贝到了struct HdfSBuf *指针里面, 并通过WifiWpaCmdBlockSyncSend进行发送,打开进入

int32_t WifiWpaCmdBlockSyncSend(const uint32_t cmd, struct HdfSBuf *reqData, struct HdfSBuf *respData)
{if (reqData == NULL) {HDF_LOGE("%s params is NULL", __func__);return HDF_FAILURE;}if (g_wifiService == NULL || g_wifiService->dispatcher == NULL || g_wifiService->dispatcher->Dispatch == NULL) {HDF_LOGE("%s:bad remote service found!", __func__);return HDF_FAILURE;}int32_t ret = g_wifiService->dispatcher->Dispatch(&g_wifiService->object, cmd, reqData, respData);HDF_LOGI("%s: cmd=%d, ret=%d", __func__, cmd, ret);return ret;
}

可以看到通信手法正是上面两章讲到的HDF service机制。

总结:

除了扫描流程、还有认证流程、关联流程,这些都是接下来去看的内容。目前对内核通信的机制基本有了了解,下面需要关注的有两点。

1、业务:消息中填充的每个数据,代表了什么含义;各个业务之间又是如何关联起来的。

2、驱动实现:消息发送到了内核,内核如何去处理,这驱动具体实现又和wifi芯片相关,也需要去了解。

鸿蒙适配wifi驱动(1)相关推荐

  1. 李俊刚:我是如何在OpenHarmony完成ap6275s WiFi驱动的HDF适配工作的?

    编者按:在 OpenHarmony 生态发展过程中,涌现了大批优秀的代码贡献者,本专题旨在表彰贡献.分享经验,文中内容来自嘉宾访谈,不代表 OpenHarmony 工作委员会观点. 李俊刚 深圳开鸿数 ...

  2. 移植MT76x8 私有WIFI驱动V4.1.0.0到Openwrt 18.06所遇到的坑

    Openwrt系统,路由或者IOT网关方面,市面上能供个人或者小团队甚至小企业 ,可玩性高的也就MT76xx系列路由芯片了,其中很大一部分原因主要在于MTK的WIFI驱动管控不是很严格,相对较容易获取 ...

  3. wifi模块服务器项目心得,一次关于WiFi 驱动移植的总结复盘

    1 简介 WiFi 是什么?能用来做什么? 都 2021 年了,相信您对 WiFi 一定不陌生了. 可以参考这里的百度百科释义:[百度百科 - WiFi(https://baike.baidu.com ...

  4. 图文讲解 WiFi 驱动移植过程,很肝~

    关注.星标公众号,直达精彩内容 来源:嵌入式基础学习 作者:小二 本篇文章打算对WiFi 驱动移植文章进行一次系统性的总结.复盘,分享一下自己的思考过程,遇到的问题等. 希望对您有点帮助??????? ...

  5. RV1109+hi3861L hichannel SD卡槽wifi驱动移植

    移植平台:瑞芯微RV1109(kernel版本:4.19    SDK:RV1126_RV1109_LINUX_SDK_V1.8.0_20210224)   海思3861L(SDK:Hi3861V10 ...

  6. 树莓派2B安装TP-Link usb无线wifi驱动

    标题树莓派2B安装TP-Link usb无线wifi驱动 前言 买了好多年的树莓派2B,都没怎么玩,仅仅捣鼓过几次系统.最近因为有个初中弟娃,学习没多大兴趣,加之前几年也准备过一些材料,这次趁暑假和他 ...

  7. 我对 WiFi 驱动移植过程,做了一次总结复盘

    关注+星标公众号,不错过精彩内容 作转自 | 嵌入式基础学习 在今天分享一篇关于 WiFi 驱动的文章,希望对正在做 WiFi 驱动的同学有帮助. 1 简介 WiFi 是什么?能用来做什么? 都 20 ...

  8. 移植openharmony之添加wifi驱动

    最近在调试openharmony3.0小型系统的wifi模块,把过程记录下,防止以后忘记. 首先这是官方给的开发说明步骤: WLAN驱动基于HDF框架和PLATFORM框架开发,不区分OS和芯片平台, ...

  9. wifi linux 驱动分析,Linux 下wifi 驱动开发(二)—— WiFi模块浅析

    一.什么是wifi 模块百度百科上这样定义: Wi-Fi模块又名串口Wi-Fi模块,属于物联网传输层,功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块,内置无线网络协议IEEE8 ...

最新文章

  1. web安全编程——权限的分配和控制
  2. MySQL选择数据库(MySQL USE语句)
  3. 优秀的服务器托管服务商的必备要素
  4. SpringBoot+Junt+Mock测试方法
  5. 《那些年啊,那些事——一个程序员的奋斗史》——115
  6. ASP.NET MVC数据标记验证
  7. 编写让别人能够读懂的代码
  8. Codeforces Round #498 (Div. 3) - 赛后补题
  9. [探讨java深入的不变模式] java中String类的用法
  10. 第 5 章 结合javabean实现CRUD
  11. Java中this、super的用法(2)
  12. 测试两个主机之间的连通性_如何使用知行EDI系统模拟连通性测试?
  13. TBase环境部署过程及使用一
  14. 【雅思大作文考官范文】——第十一篇:'homework' essay
  15. Linux运行权限1009无标题,Linux权限管理练习
  16. matlab画入射系数和透射系数,反射系数和透射系数.ppt
  17. 电脑屏幕下方任务栏不显示了怎么处理 ?
  18. 服务器的种类以及各自的区别
  19. 软件设计师2017下半年
  20. PyCharm安装第三方库如Requests

热门文章

  1. lgv20刷twrp_摩托罗拉OneZoom去年作为MotoOne系列中的中档产品推出
  2. 边框样式、段落样式、背景样式
  3. Docker4.Docker容器运行、查看、启停、删除
  4. spring boot 实现自定义排序功能
  5. vi/vim 指定行的行首或行尾插入指定字符串
  6. java定义猴子类的题_【视频+图文】Java经典基础练习题(六):猴子吃桃子问题...
  7. 清除电脑内的PE系统
  8. 中国光纤光缆油膏市场预测及战略研究报告(2021版)
  9. 为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱
  10. 「Premiere中文教程」照片定格效果