
OpenHarmony HDF WIFI 之 FlowControl 原创 精华
Flow Contrl
WIFI驱动可以选择是否使用Flow Control来缓存网络数据的收发。
以下是Flow Control的定义,可以看到有两个线程分别负责处理收发数据的逻辑,有对应的两个信号量来完成线程的同步,以及由进程状态的变量,还有由netbuf组成的两个收发队列,这些是FlowControl模块使用到的数据。
然后还提供给开发者接口来操作FlowControl模块,例如FlowControlInterface,其定义在下面。根据g_fcInterface给我们提供的接口,可以知道开发者使用FlowControl模块主要就是向指定队列发送netbuf就完事了。当然还有最重要的,使用RegisterFlowControlOp注册一个FlowControlOp结构体。
FlowControlOp由驱动开发者根据具体的wifi芯片实现,负责操作wifi 芯片的逻辑。
一、创建FlowControlModule
创建FlowContriol模块很简单,就是初始化所有成员变量。
1.1、收发线程
在创建flowcontrol 线程中可以看到两个线程的优先级是最高的,因为网络数据需要及时处理,否则会导致队列溢出。
两个线程使用同一套代码,根据参数dir来判断是接收还是发送。
1.2、队列
我们知道无论什么类型的网络数据,最终都要进入队列,因为该模块的队列比较多,我们先看看有队列是什么以及有哪些队列:
FlowControlQueue定义如下,其本质是在NetBufQueue的基础上,增加一些变量来给FlowControl管理。
FlowControlQueueID是用于表示一个队列组所拥有的所有类型的队列,一个队列组包含了9个不同等级(类型)的队列,这些队列是有优先级的。例如其定义:
在全局变量中,就有如下四个队列组,其意义见代码注释
所以,收发线程的作用就是负责把队列中的netbuf送到他们该去的地方。发送的netbuf就应该传递给网口驱动,而接收到的netbuf就该传递给协议栈。
FlowControlTxTreadProcess和FlowControlRxTreadProcess最后会调用SendFlowControlQueue来入队,最终调用txDataPacket或rxDataPacket来发送接受数据。
二、FlowControlInterface
既然我们了解了FlowControl模块的线程的主要作用,即将数据入队。那么是由谁来发起(同步)线程的运行呢?这就需要使用到FlowControlInterface,开发者调用FlowControlInterface的接口来实现对队列的操作。我们重点关注sendBuffToFCM()和schedFCM()
2.1、schedFCM
将netbuf推进到指定队列:
一般驱动程序在调用SendBuffToFCM()后,还要调用SchedTransfer()来同步线程,使线程即使的处理队列中的netbuf
