与接口无关的虚拟以太网通信部件及其实现通信的方法与流程

文档序号:17107840发布日期:2019-03-15 19:21阅读:227来源:国知局
与接口无关的虚拟以太网通信部件及其实现通信的方法与流程

本发明涉及通信技术领域,具体来讲是一种与接口无关的虚拟以太网通信部件及其实现通信的方法。



背景技术:

随着通信技术的逐步发展,网络设备的处理能力和数据传输能力越来越高,各种通信接口层出不穷,例如:I2C(Inter-Integrated Circuit,微控制器与外设连接接口)、SPI(Serial Peripheral Interface,串行外设接口)、UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器接口)、Ethernet(以太网接口),PCIe(PCI Express接口)等。

实现设备间通信时,由于各个通信接口的配置不尽相同,使得开发人员需要针对这些通信接口开发出相应的应用代码;同时,为了保证通信数据传输的可靠性和稳定性,需要自行设计相应的通信协议。这样,不但使得开发难度大、周期时间长、可维护性差,而且,当设备需要升级单盘或者升级通信接口时,以往的代码也无法复用,又需要重新开发代码,费时费力。



技术实现要素:

本发明的目的是为了克服上述背景技术的不足,提供一种与接口无关的虚拟以太网通信部件及其实现通信的方法,能在Linux内核下虚拟以太网接口,虚拟的以太网接口作为中间桥梁连接上层网络协议栈与物理接口,从而使得上层可利用Linux内核自带的网络协议栈进行通信,无需单独设计通信协议,不但降低了开发难度、缩短了开发周期,而且代码开发的可靠性、可维护性及可复用性高。

为达到以上目的,本发明采取的技术方案是:提供一种与接口无关的虚拟以太网通信部件,包括顺次相连的物理接口、物理接口驱动模块和虚拟以太网设备驱动模块;所述物理接口用于:提供物理通道进行数据收发;所述物理接口驱动模块用于:在Linux内核中控制所述物理接口按照标准定义的物理接口总线协议进行数据收发;所述虚拟以太网设备驱动模块用于:在Linux内核中注册为虚拟以太网设备;收发数据时,利用虚拟以太网设备虚拟出的以太网接口实现与上层网络协议栈、物理接口驱动模块的数据交互;

发送端的所述虚拟以太网设备驱动模块用于接收来自上层的网络协议栈的组包数据,当BD表的缓冲区状态不为满或不为未被清理状态,将该组包数据通过虚拟的以太网接口转发给物理接口驱动模块;还用于更新BD表缓冲区状态,将组包数据映射到DMA的内存地址写入BD表,将对应的包状态置为DIRTY;更新虚拟以太网设备的发包数量及时间;并触发接收端的接收中断,通知接收端接收数据;

发送端的所述物理接口驱动模块用于将组包数据地址映射到DMA内存空间,根据物理接口总线协议将DMA内存地址映射到接收端的物理接口空间。

在上述技术方案的基础上,所述虚拟以太网设备驱动模块进行数据交互的过程包括:将网络协议栈传来的数据通过虚拟的以太网接口转发给物理接口驱动模块,或者将物理接口驱动模块传来的数据通过虚拟的以太网接口转发给网络协议栈。

在上述技术方案的基础上,所述虚拟以太网设备驱动模块包括注册子模块、发送子模块和接收子模块,注册子模块分别与发送子模块、接收子模块相连;

所述注册子模块用于:在Linux内核中注册虚拟以太网设备,并将发送子模块、接收子模块注册为该虚拟以太网设备的发送、接收部件;初始化缓冲区描述符表(BD表);

所述发送子模块用于:接收来自上层的网络协议栈的组包数据,将该组包数据通过虚拟的以太网接口转发给物理接口驱动模块;对BD表进行更新,并触发接收端的接收中断,通知接收端接收数据;

所述接收子模块用于:当接收中断被触发,数据通过物理接口到达本地后,通过轮训当前BD表中各条包状态,将所有接收到的组包数据通过虚拟的以太网接口转发给上层的网络协议栈,并对BD表进行更新。

在上述技术方案的基础上,所述虚拟以太网设备驱动模块还包括包缓存清理子模块,所述包缓存清理子模块与发送子模块相连,用于定期对发送完成的发送数据包缓存进行清理。

在上述技术方案的基础上,所述物理接口为I2C接口、SPI接口、UART接口、Ethernet接口或PCIe接口。

本发明还提供一种基于上述虚拟以太网通信部件的实现通信的方法,包括以下步骤:

步骤S1:发送端的虚拟以太网设备驱动模块接收到上层的网络协议栈发来的组包数据后,当BD表的缓冲区状态不为满或不为未被清理状态,将该组包数据通过虚拟的以太网接口转发给物理接口驱动模块;物理接口驱动模块控制物理接口按照标准定义的物理接口总线协议将组包数据发送至接收端;

物理接口驱动模块将组包数据地址映射到DMA内存空间,根据物理接口总线协议将DMA内存地址映射到接收端的物理接口空间;

虚拟以太网设备驱动模块更新BD表缓冲区状态,将组包数据映射到DMA的内存地址写入BD表,将对应的包状态置为DIRTY;并触发接收端的接收中断,通知接收端接收数据;

物理接口按照物理接口总线协议将组包数据发送至接收端的物理接口;

步骤S2:接收端的物理接口驱动模块将物理接口接收到组包数据上传给虚拟以太网设备驱动模块;虚拟以太网设备驱动部件通过虚拟的以太网接口将组包数据转发给接收端的上层的网络协议栈。

在上述技术方案的基础上,步骤S1具体包括以下操作:发送端的虚拟以太网设备驱动模块接收从网络协议栈发来的组包数据,当BD表的缓冲区状态不为满或不为未被清理状态,则虚拟以太网设备驱动模块通过虚拟的以太网接口将组包数据转发给物理接口驱动模块;物理接口驱动模块将组包数据地址映射到DMA内存空间,根据物理接口总线协议将DMA内存地址映射到接收端的物理接口空间;虚拟以太网设备驱动模块更新BD表缓冲区状态,将组包数据映射到DMA的内存地址写入BD表,将对应的包状态置为DIRTY,并触发接收端的接收中断,通知接收端接收数据;物理接口按照物理接口总线协议将组包数据发送至接收端的物理接口。

在上述技术方案的基础上,所述虚拟以太网设备驱动模块触发接收端的接收中断时,若接收端的物理接口没有对应的接收中断,则使用空闲的中断资源作为虚拟以太网设备的接收中断。

在上述技术方案的基础上,步骤S2具体包括以下操作:

步骤S201:组包数据到达接收端的物理接口后,物理接口驱动模块将物理接口接收到组包数据上传给虚拟以太网设备驱动模块,转入步骤S202;步骤S202:虚拟以太网设备驱动模块读取当前BD表,判断当前BD表中的一条数据包的包状态是否为DIRTY,若是,转入步骤S203;若则,结束;步骤S203:虚拟以太网设备驱动模块创建上层的网络协议栈所需的skbuff,通过DMA数据传输通道将物理接口的端口的数据填入skbuff,转入步骤S204;步骤S204:虚拟以太网设备驱动模块将含有接收数据的skbuff通过虚拟的以太网接口转发给上层的网络协议栈,转入步骤S205;步骤S205:虚拟以太网设备驱动模块更新BD表缓冲区状态,将BD表中的组包数据的内存地址清零,并将包状态置为FREE,转入步骤S206;步骤S206:判断是否为BD表中最后一条数据包,若是,结束;否则,获取BD表中下一条数据包的包状态,返回步骤S202。

在上述技术方案的基础上,在步骤S2之后,还包括清理发送的数据包的操作:步骤S301:发送端的虚拟以太网设备驱动模块检查当前BD表中的一条数据包的包状态是否为FREE,若是,转入步骤S302;否则,结束;步骤S302:释放BD表中对应的发送数据包缓冲区,转入步骤S303;步骤S303:判断当前物理接口中进行发送的端口是否为“忙状态”,若是,转入步骤S304;若否,转入步骤S305;步骤S304:清除“忙状态”标志位,转入步骤S305;步骤S305:判断是否为BD表中最后一条数据包,若是,结束;否则,获取BD表中下一条数据包的包状态,检查下一个发送数据包缓冲区状态,返回步骤S301。

本发明的有益效果在于:

1、本发明采用通用的虚拟以太网接口的设计思路,在Linux网络通信架构下,通过在Linux内核中加入与通信物理接口无关的虚拟以太网通信部件。该虚拟以太网通信部件中设置有虚拟以太网设备驱动模块,虚拟以太网设备驱动模块能在Linux内核中注册为虚拟以太网设备;收发数据时,能利用虚拟以太网设备虚拟出的以太网接口实现与上层网络协议栈、物理接口驱动模块的数据交互。该虚拟的以太网接口作为中间桥梁连接上层网络协议栈与物理接口,从而使得上层可利用Linux内核的网络协议栈,采用通用的tcp/ip协议完成可靠地网络通信,无需单独设计通信协议,进而使得代码的开发难度低、开发周期短;并且,由于虚拟以太网通信部件与具体的物理通信接口无关(可适用于任何种类的物理接口),因此,开发代码的可复用性高、可维护性强。

2、本发明中,虚拟以太网设备驱动模块中还设置有包缓存清理子模块,该模块能定期对发送完成的发送数据包缓存进行清理,不仅提高了发送缓存区的利用率,还有效避免了出现因缓存区数据充斥而无法正常处理的情况,保障了通信可靠性。

附图说明

图1为本发明实施例中与接口无关的虚拟以太网通信部件的结构框图;

图2为本发明实施例中基于虚拟以太网通信部件实现通信的方法的流程图;

图3为步骤S1的具体流程图;

图4为步骤S2的具体流程图;

图5为清理发送的数据包的操作流程图;

图6为核心扣板P2020与子卡MPC8308之间通过虚拟以太网通信部件实现通信的架构示意图。

具体实施方式

下面结合附图及具体实施例对本发明作进一步的详细描述。

参见图1所示,本发明实施例提供一种与接口无关的虚拟以太网通信部件,包括通信使用的物理接口、物理接口驱动模块和虚拟以太网设备驱动模块,虚拟以太网设备驱动模块、物理接口驱动模块以及物理接口三者顺次相连。

其中,物理接口用于:提供物理通道进行数据收发。该物理接口可以是I2C、SPI、UART、Ethernet或PCIe等接口。

物理接口驱动模块用于:控制和驱动所述物理接口,在Linux内核中控制所述物理接口按照标准定义的物理接口总线协议进行数据收发。

虚拟以太网设备驱动模块用于:在Linux内核中注册为虚拟以太网设备;收发数据时,利用虚拟以太网设备虚拟出的以太网接口实现与上层网络协议栈、物理接口驱动模块的数据交互。可以理解的是,所述数据交互的过程包括:将网络协议栈传来的数据通过虚拟的以太网接口转发给物理接口驱动模块,或者将物理接口驱动模块传来的数据通过虚拟的以太网接口转发给网络协议栈。

进一步地,参见图1所示,所述虚拟以太网设备驱动模块包括注册子模块、发送子模块、接收子模块以及包缓存清理子模块,注册子模块分别与发送子模块、接收子模块相连,包缓存清理子模块与发送子模块相连;

其中,注册子模块用于:在Linux内核中注册虚拟以太网设备,并将发送子模块、接收子模块注册为该虚拟以太网设备的发送、接收部件;初始化缓冲区描述符表(以下简称BD表);

发送子模块用于:接收来自上层的网络协议栈的组包数据,将该组包数据通过虚拟的以太网接口转发给物理接口驱动模块;对BD表进行更新,并触发接收端的接收中断,通知接收端接收数据;

接收子模块用于:当接收中断被触发,数据通过物理接口到达本地后,通过轮训当前BD表中各条包状态,将所有接收到的组包数据通过虚拟的以太网接口转发给上层的网络协议栈,并对BD表进行更新;

包缓存清理子模块用于:定期对发送完成的发送数据包缓存进行清理。

参见图2所示,本发明实施例还提供一种基于上述虚拟以太网通信部件的实现通信的方法,包括以下步骤:

步骤S1、数据的发送:作为发送端的虚拟以太网设备驱动模块接收到上层的网络协议栈发来的组包数据后,将该组包数据通过虚拟的以太网接口转发给物理接口驱动模块;物理接口驱动模块控制物理接口按照标准定义的物理接口总线协议将组包数据发送至接收端;

步骤S2、数据的接收:作为接收端的物理接口驱动模块将物理接口接收到组包数据上传给虚拟以太网设备驱动模块;虚拟以太网设备驱动部件通过虚拟的以太网接口将组包数据转发给接收端的上层的网络协议栈。

实际操作时,参见图3所示,步骤S1具体包括以下操作:

步骤S101:作为发送端的虚拟以太网设备驱动模块接收从上层的网络协议栈发来的组包数据,转入步骤S102。

步骤S102:虚拟以太网设备驱动模块检测当前BD表的缓冲区状态,若缓冲区状态为满或未被清理,则返回“忙状态”,结束(即不进行数据的发送);否则,转入步骤S103。

步骤S103:虚拟以太网设备驱动模块通过虚拟的以太网接口将组包数据转发给物理接口驱动模块,转入步骤S104。

步骤S104:物理接口驱动模块将组包数据地址映射到DMA(Direct Memory Access,直接内存存取)内存空间,根据物理接口总线协议将DMA内存地址映射到接收端的物理接口空间,转入步骤S105。

步骤S105:虚拟以太网设备驱动模块更新BD表缓冲区状态,将组包数据映射到DMA的内存地址写入BD表,并将对应的包状态置为DIRTY;更新虚拟以太网设备的发包数量及时间;触发接收端的接收中断,通知接收端接收数据。可以理解的是,虚拟以太网设备驱动模块触发接收端的接收中断时,若接收端的物理接口没有对应的接收中断,则使用空闲的中断资源(如定时器中断)作为虚拟以太网设备的接收中断,即虚拟以太网设备驱动模块触发接收端空闲的中断资源。

步骤S106:物理接口按照物理接口总线协议将组包数据发送至接收端的物理接口。

参见图4所示,步骤S2具体包括以下操作:

步骤S201:组包数据到达接收端的物理接口后(接收端的接收中断被触发,表明组包数据已到达接收端的物理接口),物理接口驱动模块将物理接口接收到组包数据上传给虚拟以太网设备驱动模块,转入步骤S202;

步骤S202:虚拟以太网设备驱动模块读取当前BD表,判断当前BD表中的一条数据包的包状态是否为DIRTY,若是,转入步骤S203;若则,结束;

步骤S203:虚拟以太网设备驱动模块创建上层的网络协议栈所需的skbuff(Linux内核中的重要数据结构),通过DMA数据传输通道将物理接口的端口的数据填入skbuff,转入步骤S204;

步骤S204:虚拟以太网设备驱动模块将含有接收数据的skbuff通过虚拟的以太网接口转发给上层的网络协议栈,转入步骤S205;

步骤S205:虚拟以太网设备驱动模块更新BD表缓冲区状态,将BD表中的组包数据的内存地址清零,并将包状态置为FREE;更新虚拟以太网设备的收包数量及时间,转入步骤S206;

步骤S206:判断是否为BD表中最后一条数据包,若是,结束;否则,获取BD表中下一条数据包的包状态,返回步骤S202。

更进一步地,为了提高发送缓存区的利用率,避免出现因缓存区数据充斥而无法正常处理的情况。在步骤S2之后,还包括清理发送的数据包的操作,如图5所示:

步骤S301:发送端的虚拟以太网设备驱动模块检查当前BD表中的一条数据包的包状态是否为FREE,若是,转入步骤S302;否则,结束;

步骤S302:释放BD表中对应的发送数据包缓冲区,转入步骤S303;

步骤S303:判断当前物理接口中进行发送的端口是否为“忙状态”,若是,转入步骤S304;若否,转入步骤S305;

步骤S304:清除“忙状态”标志位,转入步骤S305;

步骤S305:判断是否为BD表中最后一条数据包,若是,结束;否则,获取BD表中下一条数据包的包状态,检查下一个发送数据包缓冲区状态,返回步骤S301。

为了更好地理解本发明的方法,下面以FreeScale平台的核心扣板P2020与子板MPC8308之间的通信为例对本发明做进一步说明。

本应用场景中,核心扣板P2020与子卡MPC8308的内部均设备有本发明的虚拟以太网通信部件。其中,核心扣板P2020与子卡MPC8308均采用Linux操作系统,两者的物理接口为PCIe接口,物理接口总线协议为PCIe协议,即在物理层通过PCIe接口相连,按照PCIe协议进行通信。

参见图6所示,在核心扣板P2020与子卡MPC8308中,虚拟以太网设备驱动模块位于Linux内核的网络协议栈和PCIe接口驱动模块(即物理接口驱动模块)之间。

发送数据时,核心扣板P2020或子卡MPC8308的虚拟以太网设备驱动模块接收来自网络协议栈的组包数据;该虚拟以太网设备驱动模块将该组包数据通过虚拟的以太网接口转发给本板卡内的PCIe接口驱动模块;本板卡内的PCIe接口驱动模块控制本板卡内的PCIe接口(即物理接口)按照PCIe协议,将组包数据包通过发送给对端的子卡MPC8308或核心扣板P2020。接收数据时,核心扣板P2020或子卡MPC8308的物理接口接收到数据包后,本板卡内的PCIe接口驱动模块将数据包上传给虚拟以太网设备驱动模块;虚拟以太网设备驱动部件通过虚拟的以太网接口将数据包转发给Linux内核的网络协议栈。通过上述通信方法,核心扣板P2020与子卡MPC8308之间能完成点对点通信,且实现通信时无需关心物理层的物理接口具体是哪种接口,通过虚拟以太网设备驱动模块虚拟出的以太网接口实现与上层网络协议栈、物理接口驱动模块的数据交互。该虚拟的以太网接口作为中间桥梁连接上层网络协议栈与物理接口,从而使得上层可利用Linux内核的网络协议栈,采用通用的tcp/ip协议完成可靠地网络通信,无需单独设计通信协议,进而使得代码的开发难度低、开发周期短;并且,由于虚拟以太网通信部件与具体的物理通信接口无关(可适用于任何种类的物理接口),因此,开发代码的可复用性高、可维护性强。

进一步地,对于上述子卡MPC8308来说,虚拟以太网设备驱动模块中的注册子模块在实现时,可采用Linux系统的网络设备驱动注册函数;虚拟以太网设备驱动模块加载时,调用上述注册函数在系统中注册一个以太网设备,用来接收和发送数据包。具体实现时,所述注册函数会分配以太网设备结构用来保存相关以太网设备信息,向操作系统注册以太网设备,提供当前以太网设备的一系列回调函数(主要是具体执行发送部件和接收部件功能的函数)给操作系统调用。

Linux操作系统加载以太网设备完成后,可以启动以太网设备。由于所述以太网设备是虚拟的,没有实际的硬件寄存器和中断,所以不存在“启动”这个动作。但是,没有中断就不知道何时可以接收对端以太网设备发来的数据包,本发明中使用空闲的中断资源(定时器中断)来作为虚拟以太网设备的接收中断。具体实施是在注册虚拟以太网设备时,对定时器进行初始化。当对端核心扣板P2020发送数据包时,主动触发子卡MPC8308定时器中断,当子卡MPC8308定时器中断被触发,表明数据已到达PCIe接口,开始准备接收数据。

具体实现接收子模块时,本实施例采用一个轮询函数,用来处理接收到的所有数据包。具体实施如步骤S2的详述部分。具体实现发送子模块时,可采用一个发送函数实现,操作系统会调用注册的回调函数来发送数据给虚拟以太网设备驱动模块。

另外,本实施例中,发送子模块发送完数据后需要释放协议栈的数据包缓存。由于以太网设备是虚拟的,没有实际的硬件寄存器和发送完成中断,也就无法知晓何时需对数据包缓存进行清理。本发明在虚拟以太网设备驱动模块中创建一个发送完成的内核线程,即包缓存清理子模块。该模块能定时轮询BD表数据包状态,一旦数据包状态是FREE,则对BD表中对应的数据包缓存进行释放。

对于上述核心扣板P2020来说,其中的虚拟以太网通信部件与子卡MPC8308大体相同,唯一区别在于P2020作为PCIe接口的主设备,不需要自行指定接收中断,在PCIe总线协议中存在PCIe接口的接收中断,可利用该中断提醒CPU准备接收数据。本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1