
OpenHarmony NetDev 原创 精华
NetDev
WIFI 芯片属于网络设备,自然也要归OpenHarmony的网络框架管理,本文用于了解 网络数据如何在协议栈和网络驱动之间传输。
网络设备的使用需要配合网络协议栈,OpenHarmony的网络协议栈有两种,一种是liteos-a内核使用的lwip协议栈,一种是标准系统linux内核网络协议栈。
本文以lwip协议栈为例来了解。
一、前提
网络数据的通路:(这里的网口驱动是具体wifi芯片的驱动程序,由厂商实现。)
发送数据:应用程序->lwip->网口驱动
接受数据:网口驱动->lwip->应用程序
二、NetDevice
openharmony使用NetDevice结构体来描述所有的网络设备(网口)
其中 NetDeviceInterFace 对象的作用是初始化、打开、关闭一个网络设备等以下功能,必须由驱动开发厂商根据具体的wifi芯片编写的驱动来实现其中的函数:
根据HdfWlanDevice 创建NetDevice:
三、NetBuf
NetBuf用于描述网络数据,以在网络协议栈和网络驱动之间传输数据。
四、适配器 NetDeviceImpl
这里有一个问题,就是openharmony使用NetDev来描述网口,用NetBuf来描述网口数据,但是在lwip协议栈中,有他自己的一套机制来描述网口和网络数据。
这里就存在一个适配(adapt)的问题,需要一个适配器(adapter)来适配这两套机制,使得数据能在这两者之间顺利传递。
NetDeviceImpl结构体应运而生,该部分的代码在bearpi_micro/drivers/adapter/khdf/liteos/network/src/net_device_adapter.c,net_device_adapter顾名思义就是把net_device适配到lwip的netif。同理netbuf_adapter.c实现的就是把netbuf适配到lwip的pbuf。
所以NetDeviceImpl 就是芯片驱动程序 和 lwip协议栈沟通的中介,其成员的作用很明显:
- NetDevice:可通过netDevice->NetDeviceInterFace 调用芯片驱动程序
- NetDeviceImplOp:提供给开发者的接口
- osPrivate:指向 lwip的netif对象
NetDeviceImplOp
NetDeviceImplOp结构体就是提供给开发者的接口,使得网口驱动程序能与lwip协议栈交互。在net_device_adapter.c中的g_liteNdImplOps就是NetDeviceImplOp。我们将通过这个结构体,看lwip协议栈如何收发数据。
五、netif
要使用lwip协议栈,就需要创建一个netif来描述所使用的wifi 网口。NetDeviceImplOp结构体提供给开发者创建netif的接口:
创建初始化lwip netif的接口:
- g_liteNdImplOps.init()
- g_liteNdImplOps.add()
创建netif的同时实现了netif的一些函数如drv_send、drv_set_hwaddr,这些函数需要调用芯片驱动。
网口发送数据到lwip
在网口的驱动程序收到数据后,需要传递给lwip协议栈,这时调用NetDeviceImplOp->reveive()函数来传递数据:
首先把netdev转换成netif,把netbuf转换成pbuf,再调用driverif_input()传递pbuf给lwip协议栈。
driverif_input()是由lwip提供的接口,定义如下:
网口从lwip接收数据
lwip协议栈的数据会传递到netif结构体,而我们在创建netif结构体时,设置了drv_send()等函数,lwip协议栈就会调用该函数,在这个函数中我们就需要实现netif和netdev,pbuf和netbuf的转换,调用NetDeviceInterFace 里的函数发送数据。
