一种基于DPDK的报文处理方法及计算机设备与流程

文档序号:15615175发布日期:2018-10-09 21:11阅读:213来源:国知局
本申请涉及计算机
技术领域
:,尤其涉及一种基于dpdk的报文处理方法及计算机设备。
背景技术
::随着高速数据转发的需要,数据面开发套件(dataplandevelopkit,dpdk)技术应运而生。dpdk技术是英特尔(intel)公司开发的基于数据面的报文处理框架,dpdk可以支持数据的快速转发,是x86平台报文快速处理的库和驱动集,大多数情况下工作在linux用户态空间,被广泛应用于二层或三层转发功能的开发。为了配合linux用户态空间使用dpdk的方式进行数据的快速转发,在linux内核态空间需要能够实现高速的从网卡收发数据。现有技术中的一种可选方案是,采用支持轮询模式驱动(poolmodedriver,pmd)的网卡,如intel82599和mellanoxcx-3系列网卡,但这种方式需要为网卡提供专用的pmd驱动,由于pmd驱动不具有通用性,需要针对不同的网卡单独开发提供,开发工作量大,周期长。另一种可选的方案是在linux内核态空间使用普通驱动的网卡收发报文,之后通过原始套接字(rawsocket)的方式将报文送到linux用户态空间进行转发处理。但使用rawsocket方式时,如果用户态空间需要调用内核态空间资源则需要通过应用程序接口切换到内核态,当资源调用完毕时还要由内核态切换回用户态,也即需要在用户态空间和内核态空间之间进行切换和系统调用,收发效率低,使得网卡收发数据成为高速数据转发的瓶颈点。技术实现要素:本申请实施例提供一种基于dpdk的报文处理的方法及计算机设备,以解决现有技术中在用户态采用dpdk方式时需要内核态支持特定驱动的网卡带来的网卡通用性问题或者采用普通驱动的网卡带来的内核态空间收发报文效率较低的问题。为达到上述目的,本申请实施例采用如下技术方案:第一方面,本申请实施例提供一种应用于计算机设备的报文处理方法,该计算设备包括操作系统,该操作系统包括用户态空间和内核态空间。其中,用户态空间中设置有dpdk收发接口(或者说,dpdk收发接口运行在用户态空间),该报文处理方法包括:dpdk收发接口通过队列与内核态空间进行报文传输,其中,此处所指的报文可以为向网卡发送的报文,也可以为从网卡接收的报文。本申请提供的上述报文处理方法,通过在位于用户态空间的dpdk收发接口和内核态空间之间设置队列并利用设置的队列实现收发报文,避免了用户态和内核态之间的切换和系统调用,能够提高报文的收发效率。另外,本申请无需修改网卡的驱动,具有通用性,也即无需采用特定驱动的网卡,使用普通驱动的网卡便能够实现内核态空间和用户态空间之间进行报文的高速收发。在一种实现方式中,内核态空间设置有网卡收发模块(或者说,网卡收发模块运行在内核态空间),所述队列创建于dpdk收发接口和网卡收发模块之间。相应的,dpdk收发接口通过队列与运行在内核态空间的网卡收发模块进行报文传输。其中,dpdk收发接口和网卡收发模块之间通过队列进行报文传输时,所传输的为报文所在的缓存区的地址,dpdk收发接口或网卡收发模块可根据队列传输的地址获取该地址中存储的报文。此外,dpdk收发接口和网卡收发模块之间通过队列进行报文传输为双向传输。该双向传输包括:由dpdk收发接口通过队列向网卡收发模块传输要向网卡发送的报文以及由网卡收发模块通过队列向dpdk收发接口传输从网卡接收的报文。这两个方向的报文传输使用的队列可以共用也可以是独立的。每个传输方向的队列可以有多个。在一种可能的设计中,当传输的报文为向网卡发送的报文时,该实现过程具体为:dpdk收发接口利用第一队列将第一缓存区的地址发送至网卡收发模块,其中,该第一缓存区位于用户态空间的第一缓存区资源池中,第一缓存区存储有向网卡发送的报文。网卡收发模块根据第一缓存区的地址,获取第一缓存区中存储的报文;将第一缓存区中存储的报文存入第二缓存区,该第二缓存区用于存储内核态空间的报文;向网卡发送第二缓存区的地址以便于网卡根据第二缓存区的地址从第二缓存区中获取报文。此外,在网卡收发模块根据第一缓存区的地址,获取第一缓存区中存储的报文之前,该方法还包括:网卡收发模块采用轮询的方式从第一队列中获取第一缓存区的地址。与采用中断方式相比,本申请中,网卡收发模块采用轮询的方式从第一队列中获取第一缓存区的地址,能够提高网卡收发模块获取第一缓存区的地址的速度。为了支持网卡收发模块采用轮询的方式从第一队列中获取第一缓存区在用户态空间的地址,网卡收发模块创建发送线程,该发送线程用于使得网卡收发模块采用轮询的方式从第一队列中获取第一缓存区在用户态空间的地址。由于对于存储地址,用户态空间和内核态空间有不同的地址设定和识别规则,网卡收发模块通过第一队列接收到的第一缓存区的地址为第一缓存区在用户态空间的地址,而网卡收发模块位于内核态,因此,在第一方面的一种可能设计中,网卡收发模块在根据第一缓存区的地址,获取第一缓存区中存储的报文的具体实现中,网卡收发模块根据预设转换规则将第一缓存区在用户态空间的地址进行地址转换,得到第一缓存区在内核态空间的地址;并根据第一缓存区在内核态空间的地址将第一缓存区中的报文存入第二缓存区。其中,本申请所指的所述预设转换规则用于表示用户态空间地址和内核态空间地址的转换关系。在一种可能的设计中,所述队列还包括第二队列,则在网卡收发模块根据第一缓存区的地址,获取第一缓存区中存储的报文之后,本申请实施例提供的方法还包括:网卡收发模块利用第二队列将未承载报文的第一缓存区(已经“卸载”了报文的第一缓存区)的地址发送至dpdk收发接口;dpdk收发接口从第二队列中获取未承载有报文的第一缓存区的地址;并将未承载有报文的第一缓存区的地址发送至第一缓存区资源池。其中,第一缓存区资源池用于管理第一缓存区的状态,则第一缓存区资源池收到所述未承载有报文的第一缓存区的地址后将该第一缓存区的状态由已承载报文修改为未承载报文,进而该未承载报文的第一缓存区可以用于下一次承载报文。在第一方面的一种可能设计中,所述队列还包括第三队列,则当计算机设备通过网卡接收外部网络发来的报文时,dpdk收发接口和网卡收发模块之间利用队列传输报文,具体包括:网卡收发模块获取位于第二缓存区中的报文,其中,第二缓存区存储有从网卡接收的报文。网卡收发模块将第二缓存区中的报文缓存入未承载报文的第一缓存区,其中,第一缓存区用于存储用户态空间的报文;并利用第三队列向dpdk收发接口发送第一缓存区的地址;dpdk收发接口从第三队列中获取第一缓存区的地址,并根据第一缓存区的地址,获取第一缓存区中存储的报文。其中,本申请所指的第三队列的数量为一个或多个。当第三队列的数量为多个时,多个第三队列采用并行的方式从网卡接收报文。此外,当前文所述的第一队列处于“空闲”状态时,也即第一队列未传输第一缓存区的地址时,第三队列可以为前文所述的第一队列。第三队列也可以为与第一队列互相独立的队列。在第一方面的一种可能设计中,dpdk收发接口采用轮询的方式从第三队列中获取第一缓存区的地址。与采用中断的方式相比,采用轮询的方式能够提高dpdk收发接口获取第一缓存区的地址的速度。在第一方面的一种可能设计中,所述队列包括第四队列,则前文所述的未承载有报文的第一缓存区的地址可通过如下方法获取:dpdk收发接口从第一缓存区资源池获取“空闲”的第一缓存区,也即未承载报文的第一缓存区的地址并利用该第四队列将未承载报文的第一缓存区的地址发送至网卡收发模块;网卡收发模块从第四队列中获取未承载报文的第一缓存区的地址。其中,网卡收发模块在从第四队列中获取未承载报文的第一缓存区的地址时可采用轮询的方式,与采用中断的方式相比,采用轮询的方式能够提高网卡收发模块获取未承载报文的第一缓存区的地址的速度。同样,由于对于存储地址,用户态空间和内核态空间有不同的地址设定和识别规则,因此,在第一方面的一种可能设计中,在将报文存入未承载报文的第一缓存区中时,网卡收发模块根据预设转换规则将未承载报文的第一缓存区在用户态空间的地址进行地址转换,得到未承载报文的第一缓存区在内核态空间的地址;根据第一缓存区在内核态空间的地址将第二缓存区中的报文存入所述未承载有报文的第一缓存区。在第一方面的一种可能设计中,为了支持网卡收发模块利用第三队列向dpdk收发接口发送第一缓存区的地址,本申请提供的方法还包括:网卡收发模块调用网卡接收处理函数,如网卡回调(networkinterfacecardhook,nichook)函数,该网卡接收处理函数用于使得网卡收发模块利用第三队列向dpdk收发接口发送第一缓存区的地址。第二方面,本申请提供一种计算机设备,该计算机设备安装有操作系统,操作系统包括用户态空间和内核态空间,用户态空间设置数据面开发套件dpdk收发接口,内核态空间设置网卡收发模块,该计算机设备还包括:设置单元,用于在dpdk收发接口和网卡收发模块之间创建队列;网卡收发模块,用于从网卡接收报文并通过队列将报文发送到dpdk收发接口或通过队列接收dpdk收发接口发送的报文并将报文发送到网卡。在一种可能的设计中,所述队列包括第一队列;所述dpdk收发接口,用于利用所述第一队列将第一缓存区的地址发送至所述网卡收发模块,所述第一缓存区位于所述用户态空间的第一缓存区资源池中,所述第一缓存区存储有向网卡发送的报文;所述网卡收发模块,用于根据所述第一缓存区的地址,获取所述第一缓存区中存储的报文;将所述第一缓存区中存储的报文存入第二缓存区,所述第二缓存区用于存储所述内核态空间的报文;向网卡发送第二缓存区的地址以便于所述网卡根据所述第二缓存区的地址从所述第二缓存区中获取报文。在一种可能的设计中,网卡收发模块,还用于采用轮询的方式从第一队列中获取所述第一缓存区的地址。在一种可能的设计中,队列还包括第二队列;所述网卡收发模块,还用于利用所述第二队列将未承载有报文的第一缓存区的地址发送至所述dpdk收发接口;所述dpdk收发接口,还用于从所述第二队列中获取所述未承载有报文的第一缓存区的地址;并将所述未承载有报文的第一缓存区的地址发送至第一缓存区资源池。在一种可能的设计中,网卡收发模块,还用于创建发送线程,所述发送线程用于使得所述网卡收发模块采用轮询的方式从所述第一队列中获取所述第一缓存区在用户态空间的地址。在一种可能的设计中,所述队列包括第三队列;网卡收发模块,还用于获取位于第二缓存区中的报文,所述第二缓存区存储有从网卡接收的报文;并将所述第二缓存区中的报文缓存入未承载报文的第一缓存区,所述第一缓存区用于存储用户态空间的报文;以及利用所述第三队列向所述dpdk收发接口发送所述第一缓存区的地址;所述dpdk收发接口,还用于从所述第三队列中获取所述第一缓存区的地址,并根据所述第一缓存区的地址,获取所述第一缓存区中存储的报文。在一种可能的设计中,dpdk收发接口,还用于采用轮询的方式从所述第三队列中获取所述第一缓存区的地址。在一种可能的设计中,队列包括第四队列;dpdk收发接口,还用于从第一缓存区资源池获取所述未承载报文的第一缓存区的地址,并利用所述第四队列向所述网卡收发模块发送所述未承载报文的第一缓存区的地址;网卡收发模块,还用于从第四队列中获取所述未承载报文的第一缓存区的地址。在一种可能的设计中,网卡收发模块,还用于采用轮询的方式从第四队列中获取未承载报文的第一缓存区的地址。在一种可能的设计中,网卡收发模块,还用于调用网卡接收处理函数,所述网卡接收处理函数用于使得所述网卡收发模块利用所述第三队列向所述dpdk收发接口发送所述第一缓存区的地址。在一种可能的设计中,第一缓存区为内存缓存区mbuf,第二缓存区为套接字缓存区skb。第三方面,本申请提供一种计算机设备,包括:处理器、存储器、网卡和总线,处理器、存储器和网卡通过总线互相连接,其中,存储器用于存储程序代码;处理器用于根据存储器存储的程序代码执行上述方面所述的方法。第四方面,本申请提供一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述方面所述的方法。第五方面,本申请提供一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述方面所述的方法。本申请提供的上述报文处理方法,通过在位于用户态空间的dpdk收发接口和位于内核态空间的网卡收发模块之间设置队列并利用设置的队列实现收发报文,避免了用户态和内核态之间的切换和系统调用,能够提高报文的收发效率。另外,本申请无需修改网卡的驱动,具有通用性,也即无需采用特定驱动的网卡,使用普通驱动的网卡便能够实现内核态空间和用户态空间之间进行报文的高速收发。附图说明图1为本申请实施例提供的计算机设备的结构示意图;图2为本申请实施例提供的一种linux操作系统的结构示意图;图3为本申请实施例提供的一种报文处理方法的流程示意图;图4为本申请实施例提供的一种向网卡发送报文的方法的流程示意图;图5为本申请实施例提供的另一种向网卡发送报文的方法的流程示意图;图6为本申请实施例提供的一种向网卡发送报文的过程示意图;图7为本申请实施例提供的一种从网卡接收报文的方法的流程示意图;图8为本申请实施例提供的另一种从网卡接收报文的方法的流程示意图;图9为本申请实施例提供的一种从网卡接收报文的具体过程示意图;图10为本申请实施例提供的一种报文处理方法的具体过程示意图;图11为本申请实施例提供的一种计算机设备的结构示意图。具体实施方式本申请实施例中,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本申请的描述中,除非另有说明,“多个”的含义是两个或两个以上。本申请实施例提供了一种计算机设备10,如图1所示,包括:处理器101、存储器102、网卡103和总线104,且处理器101、存储器102和网卡103通过总线104互相通信。存储器102中存储有:操作系统(operatingsystem,os)105和应用程序106。其中,处理器101,为计算机设备的运算核心(core)和控制核心(controlunit),其主要是解释计算机指令以及处理计算机软件中的数据。本申请实施例所指的处理器101,可以是一个处理器,也可以是多个处理元件的统称。例如,该处理器101可以是中央处理器(centralprocessingunit,简称cpu),也可以是特定集成电路(applicationspecificintegratedcircuit,简称asic),或者是被配置成实施本申请实施例的一个或多个集成电路,例如:一个或多个微处理器(digitalsignalprocessor,简称dsp),或,一个或者多个现场可编程门阵列(fieldprogrammablegatearray,简称fpga)。存储器102,主要用于计算机设备存储程序和各种数据。其可以是一个存储装置,也可以是多个存储元件的统称,且用于存储可执行程序代码等。且存储器102可以包括随机存储器(randomaccessmemory,ram),也可以包括非易失性存储器(non-volatilememory),例如磁盘存储器,闪存(flash)等。网卡103,为网络接口卡(networkinterfacecard,nic)的简称,为主要工作在链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。总线104,为计算机设备各种功能部件之间传送信息的公共通信干线,由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。总线为处理器、内存、输入、输出设备传递信息的公用通道,计算机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。本申请实施例所指的总线可以是工业标准体系结构(industrystandardarchitecture,isa)总线、外部设备互连(peripheralcomponent,pci)总线或扩展工业标准体系结构(extendedindustrystandardarchitecture,eisa)总线等。该总线104可以分为地址总线、数据总线、控制总线等。为便于表示,图1中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。存储器102中存储有操作系统105和应用程序106。其中,操作系统105是一台计算机设备必不可少的系统软件,是整个计算机设备的灵魂。常见的操作系统包括windows操作系统、linux操作系统等。应用程序106,包括操作系统自带的应用程序以及用户自定义的应用程序。可以理解的是,虽然图1中未示出其他应用程序和硬件,但计算机设备的具体实现中可能还包括其他硬件或应用程序,如显示接口卡(graphicscard)、声卡、光驱、硬盘、显示器、键盘、鼠标、音响、手写板、话筒、摄像头等输入输出设备。计算机设备中各个硬件的作用以及具体实现可参考现有技术,本申请不再赘述。本申请实施例提供的报文处理方法可应用于上述安装了操作系统的计算机设备。以操作系统为linux操作系统为例,linux操作系统是一个基于可移植操作系统接口(portableoperatingsysteminterface,posix)和unix操作系统的多用户、多任务、支持多线程的操作系统,具备开放性、多用户、多任务、良好的用户界面、设备独立性、稳定性、良好的移植性、可靠的系统安全等特性,并以高效性和灵活性著称。为了提高资源管理的可扩展性和灵活性,方便用户对资源的调用和集中式关系,如图2所示,所述linux操作系统从逻辑上将linux操作系统可以划分为用户态空间(user-space)和内核态空间(kernel-space)。其中,用户态空间为上层应用程序的活动空间,用于存放用户程序的代码和数据。内核态空间为操作系统的活动空间,用于存放操作系统或内核的代码和数据。通常,位于用户态空间的用户程序或进程能访问的计算机设备的硬件资源有限,其仅能访问部分硬件设备;而位于内核态的系统程序拥有访问计算机设备的所有硬件设备的权限,能够访问计算机设备的所有硬件设备。此外,用户态空间的应用程序无法直接访问硬件设备,可以通过系统调用、库函数、shell脚本的方式与内核态交互以及访问硬件设备。需要说明的是,关于内核态空间和用户态空间的作用和区别不限于本申请所述的上述内容,具体可参考现有技术,本申请不再赘述。为了适应数据高速转发的需要,现有的一种方案为在linux操作系统中引入了dpdk技术,dpdk技术是英特尔(intel)公司开发的基于数据面的报文处理框架,可以支持数据的快速转发,是x86平台报文快速处理的库和驱动集,大多数情况下工作在linux用户态空间,被广泛应用于二层或三层转发功能的开发。如图2所示,本申请示出了位于linux用户态空间的dpdk收发接口。为了适应linux系统中dpdk技术的应用,如图2所示,本申请实施例在内核态空间设置网卡收发模块。如图3所示,该方法包括:步骤101、在dpdk收发接口和网卡收发模块之间设置队列。其中,dpdk收发接口位于用户态空间,包括dpdk接收接口和dpdk发送接口,dpdk收发接口提供了一个抽象的接口,屏蔽了底层的实现差异,调用该接口能够在用户态空间完成数据包的接收和发送。网卡收发模块位于内核态空间,网卡收发模块可以在linux系统初始化时创建,也可以在用户态空间需要向网卡发送报文或从网卡接收报文时创建;创建网卡收发模块后,网卡收发模块能够在使用某个网卡进行用户态空间报文转发时创建与该网卡对应的发送线程以及注册该网卡对应的接收处理函数。其中,发送线程用于触发网卡收发模块调用接口并采用轮询的方式利用已创建的队列以向网卡发送报文;网卡接收处理函数用于触发网卡收发模块采用中断的方式从网卡接收报文,其中该网卡接收处理函数可以为nichook函数。队列该队列包括发送队列和接收队列,且发送队列用于向网卡发送报文,接收队列用于从网卡接收报文。发送队列和接收队列的数量可以为一个或多个,当其数量为多个时,各个发送队列之间并行向网卡发送报文;各个接收队列之间并行从网卡接收报文。需要说明的是,本申请所指的队列可在网卡收发模块在初始化的时候创建的,也可能是linux系统初始化的时候创建,后续则可直接利用该已创建好的队列收发报文。步骤102、dpdk收发接口和网卡收发模块之间利用队列传输报文。其中,传输的报文可以为向网卡发送的报文或从网卡接收报文。本申请提供的上述报文处理方法,通过在位于用户态空间的dpdk收发接口和位于内核态空间的网卡收发模块之间设置队列并利用设置的队列收发报文,避免了用户态和内核态之前的切换和系统调用,能够提高报文的收发效率。另外,本申请无需修改网卡的驱动,具有通用性,也即无需采用特定驱动的网卡,使用普通驱动的网卡便能够实现内核态空间和用户态空间之间进行报文的高速收发。可选的,当计算机设备需要通过网卡向其他设备或网络发送数据时,如位于用户态空间的某个应用程序需要通过网卡向其他设备或网络发送数据时,则该应用程序将待发送报文存入第一缓存区中,并驱动dpdk收发接口利用已创建的发送队列向网卡收发模块发送报文,如图4所示,该实现过程具体包括:步骤201、dpdk收发接口利用第一队列将第一缓存区的地址发送至网卡收发模块。其中,第一队列用于发送存储有报文的第一缓存区的地址。第一队列的数量可以为一个或多个。当第一队列的数量为多个时,多个第一队列之间采用并行的方式向网卡发送第一缓存区的地址。用户态空间和内核态空间中分别定义了用于存储报文的内存结构,具体的,第一缓存区为用户态空间的内存结构,用于保存用户态空间的数据。如该第一缓存区可以为存储缓存(memorybuffer,mbuf)。本步骤所指的第一缓存区中存储有要向网卡发送的报文。第二缓存区为内核态空间的数据结构,用于保存内核态空间的报文,如该第二缓存区可以为套接字缓存区(socketbuffer,skb)。第一缓存区和第二缓存区的数量可以为多个,第一缓存区位于用户态空间的第一缓存区资源池中,第一缓存区资源池用于管理第一缓存区的状态,如是否处于空闲状态。由于向网卡发送的报文位于用户态空间,因此该报文位于第一缓存区中;而网卡位于内核态空间,因此,网卡收发模块在收到第一缓存区的地址后,通过执行下述步骤202至步骤204,将第一缓存区中的报文存储到第二缓存区后再将第二缓存区的地址告知网卡以便于网卡从第二缓存区中获取报文。步骤202、网卡收发模块根据第一缓存区的地址,获取第一缓存区中存储的报文。由于对于存储地址,用户态空间和内核态空间有不同的地址设定和识别规则,网卡收发模块通过第一队列接收到的第一缓存区的地址为第一缓存区在用户态空间的地址,而网卡收发模块位于内核态,因此,在本步骤的具体实现中,网卡收发模块根据预设转换规则将第一缓存区在用户态空间的地址进行地址转换,得到第一缓存区在内核态空间的地址;并根据第一缓存区在内核态空间的地址将第一缓存区中的报文存入第二缓存区。其中,本申请所指的预设转换规则用于表示用户态空间地址和内核态空间地址的转换关系。步骤203、网卡收发模块将第一缓存区中存储的报文存入第二缓存区。步骤204、网卡收发模块向网卡发送第二缓存区的地址。步骤205、网卡根据第二缓存区的地址从第二缓存区中获取报文。示例性的,以第一缓存区为mbuf,第二缓存区为skb为例,当计算机设备通过网卡向外部网络发送报文时,如计算机设备中位于用户态空间的应用程序(application,app)需要通过网卡向其他设备发送报文时,则应用程序将待发送报文存入空闲mbuf中并驱动dpdk收发接口通过队列向网卡收发模块发送待发送报文所在的mbuf的地址,进而网卡收发模块根据队列发送的mbuf地址,获取mbuf地址中存储的报文,并将该报文存入skb中,将skb的地址发送至网卡,进而网卡从skb中获取报文。可选的,为了提高网卡收发模块从第一队列中获取第一缓存区的地址的速度,网卡收发模块可以采用轮询的方式从第一队列中获取第一缓存区的地址。与采用中断的方式相比,采用轮询的方式能够提高网卡收发模块从第一队列中获取第一缓存区的地址的速度。当网卡收发模块根据第一队列发送的第一缓存区的地址,获取第一缓存区中的报文之后,“卸载”了报文的第一缓存区为空闲缓存区,还需要将这些空闲缓存“及时返还”至第一缓存区资源池以便于第一缓存区资源池及时更改这些第一缓存区的状态。因此,可选的,在步骤202“网卡收发模块根据第一缓存区的地址,获取第一缓存区中存储的报文”之后,本申请提供的方法,如图5所示,还包括:步骤301、网卡收发模块利用第二队列将未承载有报文的第一缓存区的地址发送至dpdk收发接口。其中,本步骤所指的未承载报文的第一缓存区为已经“卸载”了报文的第一缓存区。步骤302、dpdk收发接口从第二队列中获取未承载有报文的第一缓存区的地址;并将未承载有报文的第一缓存区的地址发送至第一缓存区资源池。需要说明的时,步骤301和步骤302均执行在步骤202之后,但本申请并不限定这两个步骤和步骤203、204、205之间的顺序。为了支持网卡收发模块采用轮询的方式从第一队列中获取第一缓存区在用户态空间的地址,网卡收发模块创建发送线程,该发送线程用于使得网卡收发模块采用轮询的方式从第一队列中获取第一缓存区在用户态空间的地址。为了更清楚的说明本申请实施例提供的报文处理方法在向网卡发送报文的具体应用,以第一缓存区为mbuf,第二缓存区为skb为例,如图6所示,本申请实施例示出了利用第一队列和第二队列向网卡发送报文的具体实现过程:在位于用户态空间的dpdk收发接口和位于内核态空间的网卡收发模块之间设置有第一队列和第二队列,网卡收发模块创建发送线程。则当存在需要向网卡发送报文的应用程序时,应用程序将待发送报文存储在mbuf中,并驱动dpdk收发接口(主要是dpdk发送接口)通过第一队列向网卡收发模块发送存储有要向网卡发送的报文的mbuf的地址;网卡收发模块在发送线程的驱动下从第一队列中获取存储有报文mbuf的地址,并从该存储有报文的mbuf中取出报文后,将报文装载至skb后向网卡告知skb的地址,网卡根据该skb的地址获取skb中的报文并将报文传输至外部网络。此外,网卡收发模块利用第二队列将取出报文后的空闲mbuf的地址发送至dpdk收发接口,由dpdk收发接口将未承载报文的空闲mbuf地址返还至位于用户态空间的mbuf资源池以便于mbuf资源池将这些mbuf的状态修改为空闲状态。当计算机设备需要通过网卡接收其他设备或网络发送的数据时,网卡收发模块和dpdk收发接口之间利用已建立的队列传输从网卡接收的报文,如图7所示,具体包括:步骤401、网卡收发模块获取位于第二缓存区中的报文。其中,由于网卡位于内核态空间,因此,网卡从其他设备或外部网络接收的报文位于第二缓存区中。步骤402、网卡收发模块将报文缓存入未承载报文的第一缓存区。其中,第一缓存区用于存储用户态空间的报文。在本步骤的具体实现过程中,由于从网卡接收的报文位于内核态空间定义的数据结构中,也即第二缓存区中;而dpdk收发接口位于用户态空间,因此,网卡收发模块需要先获取第二缓存区中的报文并将获取的报文存储在未承载报文的第一缓存区中。因此,在本步骤中,网卡收发模块将位于第二缓存区中的报文拷贝至未承载有报文的第一缓存区。其中,由于用户态空间和内核态空间分别定义了不同的内存地址标识和识别方法,因此,网卡收发模块在将第二缓存区中的报文拷贝至第一缓存区中时,网卡收发模块还要根据预设转换规则将第一缓存区在用户态空间的地址进行地址转换,得到第一缓存区在内核态空间的地址;然后网卡收发模块根据第一缓存区在内核态空间的地址将第二缓存区中的报文存入所述未承载有报文的第一缓存区中。其中,预设转换规则用于表示用户态空间地址和内核态空间地址的转换关系。步骤403、网卡收发模块利用第三队列向dpdk收发接口发送存储有报文的第一缓存区的地址。步骤404、dpdk收发接口从第三队列中获取第一缓存区的地址,并根据第一缓存区的地址,获取第一缓存区中存储的报文。其中,在本步骤的具体实现中,dpdk收发接口采用轮询的方式从第三队列中获取承载有报文的第一缓存区的地址。此外,步骤401中所指的“未承载报文的第一缓存区”位于用户态空间的第一缓存区资源池中,则在执行步骤401之前,网卡收发模块需要先获取“未承载报文的第一缓存区”。因此,在执行步骤401之前,如图8所示,所述方法还包括:步骤501、dpdk收发接口从第一缓存区资源池获取未承载报文的第一缓存区的地址。步骤502、dpdk收发接口利用第四队列向网卡收发模块发送未承载报文的第一缓存区。步骤503、网卡收发模块从第四队列中获取未承载报文的第一缓存区的地址。在本步骤的具体实现中,为了提高网卡收发模块从第四队列中获取未承载报文的第一缓存区的地址的速度,网卡收发模块采用轮询的方式从第四队列中获取未承载报文的第一缓存区。可选的,为了支持网卡收发模块利用第三队列向dpdk收发接口发送第一缓存区的地址,本申请提供的方法还包括:网卡收发模块调用网卡接收处理函数,如nichook函数,该网卡接收处理函数用于使得网卡收发模块利用第三队列向dpdk收发接口发送第一缓存区的地址。为了更清楚的说明本申请实施例提供的报文处理方法在从网卡接收报文的具体实现,在位于用户态空间的dpdk收发接口的位于内核态空间的网卡收发模块之间设置有第三队列和第四队列,网卡收发模块注册网卡接收处理函数;以第一缓存区为mbuf,第二缓存区为skb为例,如图9所示,本申请实施例示出了利用第三队列和第四队列从网卡接收报文的具体实现过程:dpdk收发接口(主要是指dpdk接收接口)从mbuf资源池中获取未承载报文的空闲mbuf的地址,并利用第四队列将未承载报文的空闲mbuf的地址不断地发送至位于内核态空间的网卡收发模块。则当网卡收到其他设备或外部网络发送的报文时,触发网卡收发模块调用所述网卡接收处理函数,以使得网卡收发模块将skb中存储的从网卡接收的报文装载至从第四队列获取的空闲mbuf的地址,然后通过第三队列向dpdk收发接口发送存储有报文的mbuf的地址;dpdk收发接口从第三队列中获取存储有报文的mbuf的地址,并根据该mbuf的地址获取报文,并将“卸载”报文后的空闲mbuf返还至用于存储mbuf的mbuf资源池中以便于mbuf资源池修改mbuf的状态。实际应用中,在向网卡发送报文或从网卡接收报文时,其对应的队列通常为多个;且向网卡发送报文和从网卡接收报文的过程通常在计算机设备中为同时存在的,因此,为了反映实际情况,如图10所示,本申请实施例提供了计算机设备进行报文处理的完整过程。其中,dpdk收发接口利用多个第一队列并行向网卡发送存储有报文的mbuf的地址;网卡收发模块从mbuf中获取报文后利用第二队列向dpdk收发接口返还未承载报文的空闲mbuf的地址,并由dpdk收发接口将空闲mbuf返还至mbuf资源池。dpdk收发接口从mbuf资源池中获取未承载报文的空闲mbuf的地址,并利用第四队列将未承载报文的空闲mbuf的地址发送至网卡收发模块。网卡收发模块在获取网卡接收的报文后将报文存储在从第四队列获取的空闲mbuf中,并利用多个第三队列向dpdk收发接口告知承载了报文的mbuf的地址,进而dpdk收发接口可根据mbuf的地址获取mbuf中存储的报文。可以理解的是,上述计算机设备为了实现上述功能,其包含了执行各个功能相应的硬件结构和/或软件模块。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。本申请实施例可以根据上述方法示例对计算机设备进行功能模块的划分,例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。需要说明的是,本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。图11示出了上述实施例中所涉及的计算机设备的一种可能的结构示意图,计算机设备10安装有操作系统,计算机设备包括:设置单元11、dpdk收发接口12和网卡收发模块13。设置单元11用于支持计算机设备在dpdk收发接口12和网卡收发模块13之间设置队列。dpdk收发接口和网卡收发模块13用于利用设置单元11设置的队列执行图3中的过程102。dpdk收发接口还用于执行图4中的过程201、图5中的过程302、图7中的过程404以及图8中的501、502,网卡收发模块13还用于执行图4中的过程202、203、204、图5中的过程301、图7中的过程401、402、403以及图8中的503。其中,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何在本申请揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1