
OpenHarmony HDF WIFI之WLAN Message 原创 精华
Table of Contents
WLAN message
来自HDI client端的命令主要分三个类型:BaseCommands、APCommands、STACommands。
针对不同类型的CMD,也有三个服务来响应这些命令,分别是base feature、ap feature、sta feature。这三个feature定义在/drivers/framework/model/network/wifi/core/components下。
一、ServiceDef
驱动设计了一套message机制来响应来自HDI的命令,我们先把HDI的命令理解为message,才能使用这套机制,本文用于了解wlan message。
MessageDef:把HDI client命令理解成message,其成员MessageHandler是函数指针,指向处理命令的函数,pri是函数参数。
在wlan 驱动中定义了三个MessageDef数组,分别用于处理三种类型的HDI message。例如sta.c中定义了5个成员的数组,用于处理5个具体的sta命令。
同时还要注意到g_wifiStaFeatureCmds下方有一句宏定义:将该宏定义展开,可得到函数CreateServiceSTAService(),该函数创建了一个ServiceDef结构体,并调用InitService()函数
这里就引入了ServiceDef对象,他不仅包含MessageDef,还有ServiceId,以及messagesLength。整个驱动一共有三个ServiceDef,分别为三种类型的message提供服务响应。
二、RemoteService()
InitService()函数在sidecar.c中,其主要作用就是创建Service结构体,调用RegistLocalService()
RegistLocalService调用RegistServiceInner。主要完成RemoteService的创建。
这里一个新的重要的结构体 RemoteService,但我们先暂时按下不表,来看他是如何被创建的。
2.1、MessageNode
创建 RemoteService的方式是调用node->CreateRemoteService()函数,所以这个函数执行的前提是MessageNode先被创建出来,我们需要先知道MessageNode是如何被创建的,才能知道RemoteService被创建时的参数。
MessageNode的创建函数是CreateLocalNode(),定义在local_node.c中,这里我们仅需要关注CreateRemoteService函数指针的实现:CreateLocalNodeService()
2.2、LocalNodeService
CreateLocalNodeService()创建了RemoteService的超集LocalNodeService。这里实现了RemoteService中的许多函数,并把之前定义的ServiceDef,和dispatch赋值给LocalNodeService。(dispatch在后面介绍)
LocalNodeService 展开宏定义后,可见LocalNodeService 就是RemoteService再加上MessageDispatcher和ServiceDef。
所以本质上也是创建RemoteService。
到此我们创建了一个响应HDI层命令所需的结构体。
三、MessageDispatcher
其作用主要是缓存message,实现的方法是使用优先级队列来缓存message,在RunDispatcher线程中处理message。
RunDispatcher线程:
CreateLocalDispatcher用于创建MessageDispatcher,这里我们关注AppendMessage的实现:AppendToLocalDispatcher(),其本质就是将message推入指定的queue,然后在RunDispatcher线程中会弹出队列中的message,对message进行响应。
四、sidecar
创建完成以上结构体后,wifi驱动框架究竟如何来响应来自HDI层的命令呢?也就是说我们上面所做的一切为了什么?
在HDF_WIFI驱动的dispatch函数中,调用的是DispatchToMessage()函数,该函数定义在sidecar.c中。sidecar.c就是封装了上面的结构体,提供接口给HDF_WIFI驱动使用,起到连接中介的作用。要注意到,驱动的命令是以id+HdfSBuf的形式传递进来的,需要转换成我们之前一直提到的message,才能由message系统来处理。
HDI client下发的命令通过io-dispatch会传递到DispatchToMessage()函数:
DispatchToMessage首先创建message,获取之前创建的LocalNodeService结构体中的RemoteService,调用其SendMessage()函数
在创建LocalNodeService时我们已经指定了SendMessage()函数的实现:
SendMessage()根据message类型作不同的处理:
- sync:同步类消息需要马上传递处理
- async:异步类消息由RunDispatcher线程稍后处理
message类型还进一步可分为request和response,所有request类型message最终都会调用HandleRequestMessage()来响应请求:
对于所有的请求message,最终都会调用 LocalNodeService的ServiceDef中的MessageDef来处理。
response类型message最终调用HandleResponseMessage()
五、小结
WLAN Message定义了如何处理来自WIFI HDI层的命令,这些命令适用于控制WIFI 硬件的行为。
