一种多PCIe通路网卡及上送报文的单网口网卡驱动方法转让专利

申请号 : CN202310309334.6

文献号 : CN116028426B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 朱敏王宇峰

申请人 : 无锡沐创集成电路设计有限公司

摘要 :

本申请涉及计算机网卡技术领域,公开了一种多PCIe通路网卡及上送报文的单网口网卡驱动方法。所述多PCIe通路网卡包括:多个PCIeIPCore,一端通过AHB总线分别与主时钟模块和MACIPCore电连接,另一端通过具备相同或不同PCIe通道的PCIe插槽与PHY模块电连接,用于配置多个PCIe通路。通过FPGA实现了网卡的相关功能,并将PCIe通路分成一个主PCIe通路和多个从属PCIe通路;解决了网口上行通路跟CPU交互的物理带宽瓶颈,提升了网口性能;可适用于更多不同类型的主机;解决了现有条件下网卡所支持的PCIe接口类型和PCIe接口个数受限制的问题。

权利要求 :

1.一种多PCIe通路网卡,其特征在于,包括:

多个PCIe IP Core,一端通过AHB总线分别与主时钟模块和MAC IP Core电连接,另一端通过具备不同PCIe通道的PCIe插槽与PHY模块电连接,用于配置多个PCIe通路;

其中,将所述多个PCIe通路中具备最小Device ID值的PCIe通路作为主PCIe通路,将所述多个PCIe通路中Device ID值大于最小Device ID值的PCIe通路标记为从属PCIe通路;或者根据指定的Device ID从所述多个PCIe通路中确定主PCIe通路;以及,将每个从属PCIe通路的队列个数均配置为所述主PCIe通路的队列个数,将所述主PCIe通路的队列个数和所有从属PCIe通路队列的配置个数之和作为硬件支持的收发包的队列个数。

2.一种上送报文的单网口网卡驱动方法,其特征在于,基于权利要求1所述的多PCIe通路网卡实现,所述方法包括:扫描多PCIe通路网卡的目标网卡设备;

确定所述目标网卡设备对应的驱动程序;

根据每个PCIe通路的Device ID或根据指定的Device ID确定主PCIe通路和从属PCIe通路,将所述主PCIe通路对应的网卡设备作为所述目标网卡设备并对所述目标网卡设备进行注册和初始化操作,以及对每个从属PCIe通路进行预设配置操作,以实现多PCIe通路只对应单网口的网卡设备来接收数据;其中,所述预设配置操作,包括:将所有从属PCIe通路对应的网卡设备信息保存在同一个预设数组变量中,以使在进行注册网卡设备扫描的过程中仅能扫描到所述主PCIe通路注册的网卡设备;

根据所述主PCIe通路和每个从属PCIe通路配置硬件支持的收发包队列信息;

同时对所述主PCIe通路的队列和每个从属PCIe通路的队列进行初始化,其中,对每个从属PCIe通路的队列进行初始化包括:获取每个从属PCIe通路映射的BAR空间地址,并从所述BAR空间地址中获取队列配置信息;

将所述队列配置信息分为第一预设类别字段和第二预设类别字段,其中,所述第一预设类别字段包括:接收描述符队列的尾指针寄存器地址、接收描述符队列的头指针寄存器地址、接收描述符队列的尾指针寄存器的当前值以及RX队列寄存器索引;

将所述第二预设类别字段中各字段的值设为所述各字段在所述主PCIe通路的队列中对应的值;

当启动所述主PCIe通路对应的网卡设备时,同时对每个PCIe通路连接的PHY模块进行复位和解复位操作。

3.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储的计算机程序,当被一个或多个处理器执行时,实现如权利要求2所述方法的步骤。

4.一种电子设备,其特征在于,包括存储器和一个或多个处理器,所述存储器上存储有计算机程序,所述存储器和所述一个或多个处理器之间互相通信连接,当所述计算机程序被所述一个或多个处理器执行时,执行如权利要求2所述方法的步骤。

说明书 :

一种多PCIe通路网卡及上送报文的单网口网卡驱动方法

技术领域

[0001] 本申请涉及计算机网卡技术领域,特别地涉及一种多PCIe通路网卡、上送报文的单网口网卡驱动方法、存储介质、计算机程序产品以及电子设备。

背景技术

[0002] 此处提供的背景技术描述的目的是总体地给出本申请的背景,本部分的陈述仅仅是提供了与本申请相关的背景,并不必然构成现有技术。
[0003] 随着当前应用的丰富多样及移动终端的普及,对网络及通信设备的性能要求越来越高。现实生活中,设备和系统中网络性能的高低直接影响着整个系统的稳定性和功能的完善性。
[0004] 传统的PCIe网卡普遍使用单网口通过单PCIe物理通路跟CPU连接的设计方式,请参考图1,图1为一种现有的网卡通过PCIe通路和CPU连接的结构示意图。当网口速率比较高时,一个网口跟CPU之间只有一个上行PCIe通路的物理带宽将成为网口性能提升的瓶颈。在这种情况下,对于上行数据包,由网口接收并通过PCIe上送到CPU的通路,受到的影响就会更加明显。

发明内容

[0005] 针对上述问题,本申请提出一种多PCIe通路网卡、上送报文的单网口网卡驱动方法、存储介质、计算机程序产品以及电子设备。本申请公开了一种基于DPDK实现通过一个主PCIe通路和多个从属PCIe通路进行上送单网口报文的处理方法。解决了单个网口和CPU之间的物理带宽瓶颈的问题,同时也可以在存在多个网口的情况下,为每个网口都可以通过多个PCIe通道上送报文至CPU的处理方法提供参考。
[0006] 本申请的第一个方面,提供了一种多PCIe通路网卡,所述网卡包括:
[0007] 多个PCIe IP Core,一端通过AHB总线分别与主时钟模块和MAC IP Core电连接,另一端通过具备相同或不同PCIe通道的PCIe插槽与PHY模块电连接,用于配置多个PCIe通路;
[0008] 其中,将所述多个PCIe通路中具备最小Device ID值的PCIe通路作为主PCIe通路,将所述多个PCIe通路中Device ID值大于最小Device ID值的PCIe通路标记为从属PCIe通路;以及,将每个从属PCIe通路的队列个数均配置为所述主PCIe通路的队列个数,将所述主PCIe通路的队列个数和所有从属PCIe通路队列的配置个数之和作为硬件支持的收发包的队列个数。
[0009] 本申请的第二个方面,提供了一种上送报文的单网口网卡驱动方法,基于如上所述的多PCIe通路网卡实现,所述方法包括:
[0010] 扫描多PCIe通路网卡的目标网卡设备;
[0011] 确定所述目标网卡设备对应的驱动程序;
[0012] 根据每个PCIe通路的Device ID确定主PCIe通路和从属PCIe通路,将所述主PCIe通路对应的网卡设备作为所述目标网卡设备并对所述目标网卡设备进行注册和初始化操作,以及对每个从属PCIe通路进行预设配置操作,以实现多PCIe通路只对应单网口的网卡设备来接收数据;其中,所述预设配置操作,包括:将所有从属PCIe通路对应的网卡设备信息保存在同一个预设数组变量中,以使在进行注册网卡设备扫描的过程中仅能扫描到所述主PCIe通路注册的网卡设备;
[0013] 根据所述主PCIe通路和每个从属PCIe通路配置硬件支持的收发包队列信息;
[0014] 同时对所述主PCIe通路的队列和每个从属PCIe通路的队列进行初始化,其中,对每个从属PCIe通路的队列进行初始化包括:
[0015] 获取每个从属PCIe通路映射的BAR空间地址,并从所述BAR空间地址中获取队列配置信息;
[0016] 将所述队列配置信息分为第一预设类别字段和第二预设类别字段,其中,所述第一预设类别字段包括:接收描述符队列的尾指针寄存器地址、接收描述符队列的头指针寄存器地址、接收描述符队列的尾指针寄存器的当前值以及RX队列寄存器索引;
[0017] 将所述第二预设类别字段中各字段的值设为所述各字段在所述主PCIe通路的队列中对应的值;
[0018] 当启动所述主PCIe通路对应的网卡设备时,同时对每个PCIe通路连接的PHY模块进行复位和解复位操作。
[0019] 进一步的,所述根据每个PCIe通路的Device ID确定主PCIe通路和从属PCIe通路,包括:
[0020] 将所述多个PCIe通路中具备最小Device ID值的PCIe通路作为主PCIe通路;
[0021] 将所述多个PCIe通路中Device ID值大于最小Device ID值的PCIe通路标记为从属PCIe通路。
[0022] 进一步的,所述根据所述主PCIe通路和每个从属PCIe通路配置硬件支持的收发包队列信息,包括:
[0023] 将每个从属PCIe通路的队列个数均配置为所述主PCIe通路的队列个数;
[0024] 将所述主PCIe通路的队列个数和所有从属PCIe通路队列的配置个数之和作为硬件支持的收发包的队列个数。
[0025] 本申请的第三个方面,提供了一种计算机程序产品,所述计算机程序产品包括计算机程序或指令,所述计算机程序或指令被处理器执行时实现如上所述方法的步骤。
[0026] 本申请的第四个方面,提供了一种计算机可读存储介质,该计算机可读存储介质存储的计算机程序,可被一个或多个处理器执行,用以实现如上所述方法的步骤。
[0027] 本申请的第五个方面,提供了一种电子设备,包括存储器和一个或多个处理器,所述存储器上存储有计算机程序,所述存储器和所述一个或多个处理器之间互相通信连接,该计算机程序被所述一个或多个处理器执行时,实现如上所述方法的步骤。
[0028] 与现有技术相比,本申请的技术方案具有以下优点或有益效果:
[0029] 本申请的技术方案解决了网口在将报文上送CPU时的物理带宽瓶颈场景。在硬件上通过FPGA实现了网卡的相关功能,并通过DPDK的软件接口和驱动程序对多个PCIe通路进行网络数据通信管理,以及将PCIe通路分成一个主PCIe通路和多个从属PCIe通路进行管理,PCIe与CPU通信时采用DMA的方式进行数据传输。解决了网口上行通路跟CPU交互的物理带宽瓶颈,提升了网口性能;从硬件结构上对PCIe通路进行了拓展,将一个PCIe通路扩展为了多个PCIe通路,并支持混合类型的多PCIe通路,可以使FPGA网卡适用于更多不同类型的主机;解决了现有条件下网卡所支持的PCIe接口类型和PCIe接口个数受限制的问题。

附图说明

[0030] 为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于所属领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0031] 另外还需要说明的是,为了便于描述,附图中仅示出了与有关本公开相关的部分。构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请中的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定,在附图中:
[0032] 图1为一种现有的网卡通过PCIe通路和CPU连接的结构示意图;
[0033] 图2为本申请实施例提供的一种单网口报文通过多PCIe通路上送数据的物理框架图;
[0034] 图3为本申请实施例提供的一种FPGA网卡内部的结构示意图;
[0035] 图4为本申请实施例提供的一种集成4种PCIe通路的FPGA网卡的结构示意图;
[0036] 图5为本申请实施例提供的一种上送报文的单网口网卡驱动方法的流程图;
[0037] 图6为本申请实施例提供的一种电子设备的连接框图。

具体实施方式

[0038] 以下将结合附图及实施例来详细说明本申请的实施方式,借此对本申请如何应用技术手段来解决技术问题,并达到相应技术效果的实现过程能充分理解并据以实施。本申请实施例以及实施例中的各个特征,在不相冲突的前提下可以相互结合,所形成的技术方案均在本申请的保护范围之内。
[0039] 以下,先对本申请实施例和/或现有技术中的部分技术用语进行解释说明,以便于所属领域技术人员理解本申请的技术方案:
[0040] MAC:媒体访问控制子层协议Media Access Control;该协议位于OSI七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息是否发生传输错误,如果没有错误,则去掉控制信息发送至LLC层,以太网MAC由IEEE‑802.3以太网标准定义;
[0041] MAC IP CORE:即MAC层协议的相关硬件电路的IP核(知识产权核或知识产权模块,Intellectual Property core);它通过MII接口与PHY物理层进行通信,可支持10/100/1000 Mb/s等多种带宽;
[0042] DPDK:数据面软件开发套件Data Plane Development Kit,简称DPDK;
[0043] PCI总线:外部设备互联(Peripheral Component Interconnect,简称PCI),CPU可以通过地址直接访问挂在PCI总线下的设备,使访问外设变得像内存一样简单;
[0044] DMA:直接内存访问(Direct Memory Access,简称DMA)是一些计算机总线架构提供的功能,它能使数据从附加设备(如磁盘驱动器、网卡等)直接发送到计算机主板的内存上;
[0045] PCIe:一种高速串行计算机扩展总线标准,英文全称peripheral component interconnect express简称PCIe;
[0046] BAR:基地址寄存器(Base Address Register,简称BAR),在PCIe配置空间里,0x10开始后面有6个32位的BAR寄存器,BAR寄存器中存储的数据是表示PCIe设备在PCIe地址空间中的基地址;
[0047] FPGA: 现场可编程逻辑门阵列(Field Programmable Gate Array,简称FPGA)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物,它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点;
[0048] FPGA卡:通过FPGA芯片实现标准网卡收发包功能并定制特定功能的卡;
[0049] PTP:属于通过网络同步时钟的一个协议,英文全称Precision Time Protocol简称PTP,IEEEl588的全称是“网络测量和控制系统的精密时钟同步协议标准”,PTP的典型应用领域是测量和控制系统、工业自动化、电力系统以及分布式运动控制系统,时间统一,是分布在不同位置的设备和系统协同工作的基础;
[0050] PHY模块:端口物理层(Port Physical Layer,简称PHY),属于一个操作OSI模型物理层的模块,可以发送和接收以太网的数据帧(frame);
[0051] RSS:是一种网络驱动程序技术,英文全称为Receive Side Scaling,可在多处理器系统中的多个CPU之间有效分配网络接收处理;
[0052] 五元组:5‑Tuple,计算机中的通信术语,通常是指一个报文的源IP地址,源端口,目的IP地址,目的端口和传输层协议;
[0053] 三元组:3‑Tuple,计算机中的通信术语,通常是指一个报文的源IP地址,目的IP地址和传输层协议;
[0054] HASH:哈希函数,可以将任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值;
[0055] PCIe通道:又称PCIe Lane,包括PCIe x1、PCIe x2、PCIe x4、PCIe x8、PCIe x16等,其中,x后面的数字表明PCIe 插槽有多少个通道(数据如何传入和传出PCIe 卡);比如:PCIe x1插槽有1个通道,可以以每个周期一位的速度移动数据;PCIe x2 插槽有2个通道,可以以每周期两位的速度移动数据(依此类推)。
[0056] PCIe通路:由一个PCIe插头连接PCIe插槽所组成的通路;其中,一个PCIe通路,可以有多条PCIe通道,具体的PCIe通道的数量,取决于PCIe通路的版本;PCIe通路也可以简写为PCIe,比如,2个PCIe默认指2个PCIe通路。
[0057] 实施例一
[0058] 本实施例提供一种多PCIe通路网卡。
[0059] 在本实施例中公开了一种将单个网口接收的报文通过两个或多个PCIe通路上送至CPU的网卡,以解决单个网口和CPU之间的物理带宽瓶颈的问题,同时也可以为多网口的情况下每个网口通过多个PCIe通路上送报文提供一种参考方案。
[0060] DPDK作为一种数据平面开发工具集,以其设计优势有效提升网络数据包的处理性能而被广泛应用到各种网络设备开发中,在本申请中采用DPDK作为网络数据包处理软件库。
[0061] 本实施例所公开的多PCIe通路网卡可以广泛应用于,对上行网路与PCIe通路带宽要求极高的网闸、网关和防火墙,以及通用服务器等技术领域。本实施例所公开的多PCIe通路网卡解决了网络接口卡一个接口只能通过一个PCIe通路上送、接口性能无法突破物理带宽瓶颈的问题。
[0062] 请参考图2,图2为本申请实施例提供的一种单网口报文通过多PCIe通路上送数据的物理框架图。一个FPGA卡出的接口,报文从外部物理链路到达FPGA后,FPGA内部通过对报文五元组(5‑Tuple),即(src_IP,dst_IP,src_port,dst_port,layer 4 protocol),进行hash等特定算法,将不同流的报文固定定向上送到不同PCIe上行队列进行处理。
[0063] 需要说明的是,在图2中只有PCIe‑1通路为实线箭头,其余的PCIe‑2到PCIe‑N均为虚线箭头。是因为只有PCIe‑1是通过DPDK实际注册成功的(图2中,PCIe‑1通路为主PCIe通路),而后续的PCIe通路(图2中,PCIe‑2到PCIe‑N均为从属PCIe通路),其信息复制自主PCIe通路。另外,本实施例所公开的多PCIe通路网卡还可以进一步推广,用于解决网卡支持PCIe接口的类型、个数受限的问题。
[0064] 请参考图3,图3为本申请实施例提供的一种FPGA网卡内部的结构示意图。从硬件结构上对PCIe通路进行了扩展,将原来的一个PCIe通路,扩展到N个PCIe通路;同时将原来的PCIe x1的通路类型,可以扩展成PCIe x4的通路类型,从而进一步增加了带宽。由于当前PCIe x4甚至x8、x16都已经得到了很广泛的应用,所以,也可以直接将PCIe通路类型扩展到PCIe x8或PCIe x16。
[0065] 进一步的,在此基础上还可以进一步扩展出多PCIe通路的网卡结构,比如不仅可扩展PCIe通路的个数,而且还可扩展PCIe通路的类型。即,其中的PCIe通路可以使用不同型号的PCIe接口,从而实现针对单个或多个不同PCIe接口的适配。
[0066] 作为一个示例,为了使网卡可以适用于多种场景,可以结合本申请的技术方案开发一种包含x1、x4、x8、x16这4种PCIe插头的FPGA网卡,具体请参考图4,图4为本申请实施例提供的一种集成4种PCIe通路的FPGA网卡的结构示意图。
[0067] 针对图4示出的网卡,在实际应用中可以适用于解决以下问题:
[0068] (1)某些主机只有一种类型的PCIe插槽难以与选用的网卡PCIe插口适配;
[0069] (2)某些主机同时支持两种或多种PCIe插槽,但是,我们希望从中选取一种性能最高的PCIe通路;
[0070] (3)使用两个或多个PCIe插槽,同时插入PCIe插头进行工作。
[0071] 另外,考虑到PCIe插槽和金手指的物理空间的限制,还可以将FPGA的PCIe接口增加延长线。
[0072] 需要说明的是,可以结合实际的应用场景,开发出当前场景最适合的FPGA网卡。比如,可以根据主机主板上的插槽个数、类型、顺序,来实现FPGA网卡上对应的PCIe插口,这样便可以很好地应用于各种个性化的定制场景中。
[0073] 通常情况下,PCIe设备有三个ID寄存器,且都是只读的;另外,还有一个类别编号。CPU读取到这些信息后,就可以根据实际需求为PCIe设备设定符合需要的配置内容,从而实现自动配置。其中,这些可读信息包括:
[0074] Vendor ID寄存器:设备供应商编号,由PCI特别兴趣小组(PCI SIG) 国际组织分配;
[0075] Device ID寄存器:特定设备编号,由设备供应商分配;
[0076] Revision ID寄存器:设备的特定版本号,由设备供应商分配;
[0077] Class Code:设备的功能类别编号。
[0078] 其中,Vendor ID代表PCI设备的生产厂商,而Device ID代表这个厂商所生产的具体设备。如Intel公司的基于82571EB芯片的系列网卡,其Vendor ID为0x8086,而Device ID为0x105E。
[0079] Revision ID寄存器记载PCI设备的版本号,这个寄存器的值由厂商分配,该寄存器可以被认为是Device ID寄存器的扩展。
[0080] Device ID和Vendor ID是区分不同设备的关键所在,在很多时候就是通过匹配他们来找到不同的设备驱动(Class Code有时也起到一定作用)。在本申请中也主要是通过读取Device ID和Vendor ID获得PCIe通路的设备信息和相关驱动程序。
[0081] 在本实施例中所公开的多PCIe通路网卡包括:多个PCIe IP Core(即图3和图4中的PCIe电路模块),一端通过AHB总线分别与主时钟模块和MAC IP Core(即图3和图4中的MAC电路模块)电连接,另一端通过具备相同或不同PCIe通道的PCIe插槽与PHY模块电连接,用于配置多个PCIe通路;
[0082] 其中,将所述多个PCIe通路中具备最小Device ID值的PCIe通路作为主PCIe通路,将所述多个PCIe通路中Device ID值大于最小Device ID值的PCIe通路标记为从属PCIe通路;以及,将每个从属PCIe通路的队列个数均配置为所述主PCIe通路的队列个数,将所述主PCIe通路的队列个数和所有从属PCIe通路队列的配置个数之和作为硬件支持的收发包的队列个数。
[0083] 在本申请中,将多PCIe通路分成了两种类别:主PCIe通路和从属PCIe通路。其中,每个PCIe通路的Vendor ID是一致的(表示同一生产厂商生产的设备),但是Device ID是不一致的(驱动程序不一样,即软件处理有区别)。
[0084] FPGA网卡设备在进行驱动程序加载、初始化时,Device ID最小的主PCIe通路的会被扫描并被注册为主PCIe通路,其余的PCIe通路则会被标记为从属PCIe通路;在软件层面,这两种类型的PCIe通路会按照不同的方法,进行注册、管理和使用。
[0085] 举例说明,在PCIe网卡完成硬件设计后Vendor ID和Device ID就已经是确定的了。比如,在有两个PCIe通路的情况下,两个PCIe通路的Vendor ID均为0x10ee,两个PCIe通路的Device ID分别为0x0141和0x0142;当软件扫描时,按照既定的规则将Device ID比较小(即,0x0141)的PCIe通路作为主PCIe通路,并将Device ID为0x0142的PCIe通路标记为从属PCIe通路;软件在启动进行初始化处理时会检测Device ID,Device ID为0x0141的PCIe通路按照主PCIe通路进行配置处理,Device ID为0x0142的PCIe通路按照从属PCIe通路进行配置处理。
[0086] 本实施例提供了一种基于DPDK实现的通过一个主PCIe通路和多个从属PCIe通路上送网络接口报文的网卡。从硬件结构上对PCIe通路进行了拓展,将一个PCIe通路扩展为了多个PCIe通路,并支持混合类型的多PCIe通路,可以使FPGA网卡适用于更多不同类型的主机。
[0087] 实施例二
[0088] 本实施例提供一种通过单网口上送报文的单网口网卡驱动方法,可以应用于/应用在实施例一所公开的多PCIe通路网卡中。图5为本申请实施例提供的一种上送报文的单网口网卡驱动方法的流程图,如图5所示,本实施例所公开的方法包括以下步骤:
[0089] 步骤510、扫描多PCIe通路网卡的目标网卡设备;
[0090] 步骤520、确定所述目标网卡设备对应的驱动程序;
[0091] 步骤530、根据每个PCIe通路的Device ID确定主PCIe通路和从属PCIe通路,将所述主PCIe通路对应的网卡设备作为所述目标网卡设备并对所述目标网卡设备进行注册和初始化操作,以及对每个从属PCIe通路进行预设配置操作,以实现多PCIe通路只对应单网口的网卡设备来接收数据;其中,所述预设配置操作,包括:将所有从属PCIe通路对应的网卡设备信息保存在同一个预设数组变量中,以使在进行注册网卡设备扫描的过程中仅能扫描到所述主PCIe通路注册的网卡设备;
[0092] 步骤540、根据所述主PCIe通路和每个从属PCIe通路配置硬件支持的收发包队列信息;
[0093] 步骤550、同时对所述主PCIe通路的队列和每个从属PCIe通路的队列进行初始化,其中,对每个从属PCIe通路的队列进行初始化包括:
[0094] 获取每个从属PCIe通路映射的BAR空间地址,并从所述BAR空间地址中获取队列配置信息;
[0095] 将所述队列配置信息分为第一预设类别字段和第二预设类别字段,其中,所述第一预设类别字段包括:接收描述符队列的尾指针寄存器地址、接收描述符队列的头指针寄存器地址、接收描述符队列的尾指针寄存器的当前值以及RX队列寄存器索引;
[0096] 将所述第二预设类别字段中各字段的值设为所述各字段在所述主PCIe通路的队列中对应的值;
[0097] 步骤560、当启动所述主PCIe通路对应的网卡设备时,同时对每个PCIe通路连接的PHY模块进行复位和解复位操作。
[0098] 可选的,现有DPDK网卡驱动处理的主要步骤包括:
[0099] (1)扫描设备:扫描PCIe设备;
[0100] (2)查找驱动:查找支持该PCIe设备的驱动程序;
[0101] (3)PCIe初始化:对该PCIe设备进行初始化处理,包括注册PCIe设备接口到系统;
[0102] (4)获取队列信息:获取硬件支持的收发包队列数等硬件信息;
[0103] (5)对队列初始化:根据获取到的硬件信息及上层配置对收发包队列初始化;
[0104] (6)启动设备:启动接口,使能接口收发包;
[0105] (7)转发报文:转发任务中处理收发队列中收发的报文。
[0106] 本实施例所公开的方法跟现有DPDK网卡驱动处理方法相比,对其中的几个步骤进行了修改与适配。
[0107] DPDK内部使用rte_eth_dev结构来表示抽象网卡接口,每一个接口需要分配一个rte_eth_device结构。DPDK内部创建了一个rte_eth_dev结构体数组rte_eth_devices,此数组作为全局变量,用于保存所有接口的信息。每个接口在数组中的下标,为该接口的port_id字段的值。
[0108] 其中,rte_eth_dev_type用于定义以太网设备类型的枚举类型,主要可包括三类:未知设备、PCI设备和非硬件设备,作为一个示例,一种可选的rte_eth_dev_type的定义如下:
[0109] /**
[0110] * The eth device type.
[0111] */
[0112] /** eth设备类型。*/
[0113] enum rte_eth_dev_type {
[0114] /** 未知设备类型*/
[0115] RTE_ETH_DEV_UNKNOWN,/**
[0116] /** PCI设备的物理功能和虚拟功能*/
[0117] RTE_ETH_DEV_PCI,
[0118] /**
[0119] /** 非硬件设备*/
[0120] RTE_ETH_DEV_VIRTUAL,/**
[0121] /** 此枚举的最大值*/
[0122] RTE_ETH_DEV_MAX /**
[0123] }。
[0124] rte_eth_dev用于表示一个以太网设备,作为一个示例,一种可选的rte_eth_dev的定义如下:
[0125] struct rte_eth_dev {
[0126] /** 指向PMD接收函数的指针。*/
[0127] eth_rx_burst_t rx_pkt_burst; /**
[0129] eth_tx_burst_t tx_pkt_burst; /**
[0131] struct rte_eth_dev_data *data;/**
[0132] /**此设备的驱动程序*/
[0133] const struct eth_driver *driver; /**
[0135] const struct eth_dev_ops *dev_ops; /**
[0137] struct rte_pci_device *pci_dev; /**
[0139] /** User application callbacks for NIC interrupts */
[0140] struct rte_eth_dev_cb_list link_intr_cbs;
[0141] /** 从rx_blust调用用户提供的函数,以在将接收到的数据包传递给用户之前对其进行后处理*/
[0142] /**
[0143] * User‑supplied functions called from rx_burst to post‑process[0144] * received packets before passing them to the user
[0145] */
[0146] struct rte_eth_rxtx_callback *post_rx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
[0147] /** 用户提供的函数从tx_burst调用,以在将接收到的数据包传递给驱动程序进行传输之前对其进行预处理。*/
[0148] /**
[0149] * User‑supplied functions called from tx_burst to pre‑process[0150] *  received packets before  passing them  to the driver for transmission.
[0151] */
[0152] struct rte_eth_rxtx_callback *pre_tx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
[0153] /** 表示端口已连接的标志*/
[0154] uint8_t attached; /**
[0155] /** 指示设备类型的标志*/
[0156] enum rte_eth_dev_type dev_type; /**
[0157] }。
[0158] 作为一个示例,一种可选的rte_eth_devices数组的定义如下:
[0159] struct rte_eth_dev rte_eth_devices[RTE_MAX_ETHPORTS];
[0160] RTE_MAX_ETHPORTS为DPDK支持的最大接口数目,对应config中的CONFIG_RTE_MAX_ETHPORTS配置,缺省值为32,当需要在超过32个接口的环境中使用DPDK时,需要修改此配置重新编译DPDK库及用户程序。
[0161] 在一些实施例中,所述根据每个PCIe通路的Device ID确定主PCIe通路和从属PCIe通路,包括:
[0162] 将所述多个PCIe通路中具备最小Device ID值的PCIe通路作为主PCIe通路;
[0163] 将所述多个PCIe通路中Device ID值大于最小Device ID值的PCIe通路标记为从属PCIe通路。
[0164] 可选的,当扫描到本发明的FPGA网卡设备后,然后就会对本FPGA网卡设备进行初始化。初始化时会逐一扫描网卡的PCIe通路,并根据PCIe通路的Device ID区分通路类型,然后分别进行处理:
[0165] 如果Device ID为主PCIe通路的Device ID值(比如Device ID为0x0401),将其按照主PCIe通路进行初始化和相应的处理;然后,按照正常流程对该主PCIe通路对应的网卡设备向上层注册及进行初始化处理;
[0166] 如果Device ID值不是主PCIe通路的Device ID值(比如Device ID为0x0402,或其他),将其按从属PCIe通路处理。
[0167] 在一些实施例中,所述预设配置操作,包括:
[0168] 将所有从属PCIe通路对应的网卡设备信息保存在同一个预设数组变量中,以使在进行注册网卡设备扫描的过程中仅能扫描到所述主PCIe通路注册的网卡设备。
[0169] 进一步的,由于从属PCIe通路不使用系统提供的接口数组rte_eth_devices来保存对应网口,因此,我们另外自定义了一个变量数组,以专门用来存放从属PCIe通路的网络接口:
[0170] struct rte_eth_dev rte_eth_secondary_devices[RTE_MAX_ETHPORTS]。
[0171] 对于这些从属PCIe通路,需要跟主PCIe通路做不一样的处理。作为一个示例,具体的处理方式包括:
[0172] 从属PCIe通路不向上层注册接口,只是将这些从属PCIe通路对应的网卡设备信息保存在自己定义的变量rte_eth_secondary_devices中。这样上层扫描注册的网口时,只能扫描到主PCIe通路注册的网卡设备,从而实现了多个PCIe通路只对应一个网口来接收数据的目的。
[0173] 在一些实施例中,所述根据所述主PCIe通路和每个从属PCIe通路配置硬件支持的收发包队列信息,包括:
[0174] 将每个从属PCIe通路的队列个数均配置为所述主PCIe通路的队列个数;
[0175] 将所述主PCIe通路的队列个数和所有从属PCIe通路队列的配置个数之和作为硬件支持的收发包的队列个数。
[0176] 作为一个示例,在“获取队列信息”时需要对接口驱动接收队列数量做适配,具体的处理方法包括:
[0177] 当上层获取到主PCIe通路注册的网卡设备时,会自动调用FPGA网卡驱动的DPDK接口dev_infos_get,来统一地获取网口硬件信息;
[0178] 在本实施例中还需要对DPDK接口dev_infos_get进行适配,设置从属PCIe通路和主PCIe通路具有同样数量的队列,方便统一管理;比如,主PCIe通路对应16个接收队列(即网卡可以申请支持的队、硬件队列,又称RX Ring),则另外的一个从属PCIe也应具有16个队列,2个PCIe通路共有16x2=32个队列,以此类推;
[0179] 由于只有主PCIe通路对上层进行了网口注册,所以整个FPGA网卡设备,在上层主机的DPDK驱动中只有一个网口,因此,其他从属PCIe通路对应的所有接收队列,也要挂在注册的这个网口上。如果使用2个PCIe通路,此处网口的接收队列数量,要对应地设置为16x2=32个;如果是使用3个PCIe通路,网口接收队列数量应设置为16x3=48个,以此类推。
[0180] 在一些实施例中,所述根据所述主PCIe通路和每个从属PCIe通路对硬件支持的收发包队列进行初始化,包括:
[0181] 同时对主PCIe通路的队列和每个从属PCIe通路的队列进行初始化。
[0182] 在一些实施例中,对每个从属PCIe通路的队列进行初始化,包括:
[0183] 获取每个从属PCIe通路映射的BAR空间地址,并从所述BAR空间地址中获取队列配置信息;
[0184] 将所述队列配置信息分为第一预设类别字段和第二预设类别字段,其中,所述第一预设类别字段包括:接收描述符队列的尾指针寄存器地址、接收描述符队列的头指针寄存器地址、接收描述符队列的尾指针寄存器的当前值以及RX队列寄存器索引;
[0185] 将所述第二预设类别字段中各字段的值设为所述各字段在所述主PCIe通路的队列中对应的值。
[0186] 在本实施例中,需要对从属PCIe通路的接收队列初始化做适配处理,具体的方法包括:
[0187] 在对主PCIe通路注册的网口执行rx_queue_setup、rx_init等操作初始化接收队列信息时,也对从属PCIe通路的接收队列进行初始化;
[0188] 从rte_eth_secondary_devices变量中获取各PCIe通路映射的BAR空间地址,然后从BAR空间获取队列相关信息,再将队列信息按类型分别进行以下设置:
[0189] (1)与硬件相关的信息,如自己独有的寄存器地址等,仍然按自己的信息存放(比如,队列描述符基址、队列描述符索引等寄存器的地址);
[0190] (2)其他的跟硬件无关的信息,比如对应网口在系统中的port_id,则设置的跟主PCIe通路的接收队列信息一样;
[0191] 需要说明的是,跟硬件相关的字段包括以下几个:
[0192] rdt_reg_addr:RDT(Receive Descriptor Tail)接收描述符队列的尾指针寄存器地址;
[0193] rdh_reg_addr:RDH(Receive Descriptor Head)接收描述符队列的头指针寄存器地址;
[0194] rx_tail:RDT(Receive Descriptor Tail)接收描述符队列的尾指针寄存器的当前值;
[0195] reg_idx:RX队列寄存器索引。
[0196] 举例说明,假设一个PCIe通路有16个接收队列,如果FPGA卡跟CPU之间有2个PCIe通路,则主PCIe通路注册的网口接收队列数量应该为16*2=32。其中前16个接收队列为主PCIe通路的队列(第一个PCIe通路的队列),之后的16个接收队列为从属PCIe通路的队列(第二个PCIe通路的队列)。因此,针对关于PCIe通路相关的硬件信息,比如队列描述符基址、队列描述符索引等,在前16个接收队列rxq(RX Queue,接收队列)中保存的都是主PCIe通路对应的寄存器地址,之后的16个接收队列rxq中保存的都是从属PCIe通路对应的寄存器地址。而且,由于后16个接收队列rxq中其他的软件相关的信息,设置的跟前16个接收队列rxq中的信息一样,这样当系统在处理后16个接收队列rxq从第二个PCIe收到的报文时,才能把报文当作第一个PCIe注册的网口收到的报文上送给上层处理。
[0197] 作为一个示例,在步骤560中具体的可以包括以下处理方式:
[0198] 第一个PCIe通路(主PCIe通路)注册的网口,在对其执行dev_start使网口up时,需要对该PCIe通路连接的FPGA PHY模块进行复位、解复位等操作;
[0199] 而第二个、第三个等从属PCIe通路由于没有向上层注册网口,所以上层无法通过对其网口执行up操作,因此,需要在第一个PCIe通路注册的网口执行dev_start使网口up时,同时也将第二个、第三个等从属PCIe通路的FPGA PHY模块也完成相应的复位、解复位操作。
[0200] 其中,复位:复位PHY,会使得它内部的主要控制、状态寄存器(Control and Status Registers,CSR寄存器)将恢复到默认值,并且PHY会重新开始自协商,重新连接外部接口,如果PHY的内部有固件Firmware,还会重新加载固件程序。
[0201] 解复位:PHY启动复位,会对PHY的主要器件进行加锁,直到PHY复位完成,可以正常工作,然后再执行一个PHY的解复位,去掉设备的相关锁操作,使PHY可以进入正常工作态。
[0202] 进一步的,基于注册生成的网络接口扫描接收队列处理硬件上送的报文,由于只有主PCIe通路正常注册了网络接口,所以只有主PCIe通路能被系统和用户感知到,从属PCIe通路的网卡设备的上行队列不会被系统主动接收处理。
[0203] 作为一个示例,下面根据本实施例所公开的方法给出一个完整的网络报文的处理流程:
[0204] 系统启动,默认配置参数为31个核进行收包,剩余1个核进行管理。绑定收包核到宿主机的2 32核,4G大页内存,设置dpdk_init为1(以DPDK方式收包),物理网卡的收包队~列,默认设置32个;
[0205] 通过物理网卡,将用户的流量导入到具体产品的上层应用模块;
[0206] 报文到达网卡,网卡的DMA模块通过提前设置的RSS,将报文HASH到物理网卡的32个队列上;
[0207] DPDK通过在物理网卡的32个队列上进行收包,并根据配置的规则进行流表匹配;
[0208] 流表匹配动作成功之后,报文将会转发到PCIe接收队列,系统针对该FPGA卡支持的分配方式,如基于三元组或五元组,可以将流量负载均衡到不同的PCIe通路上;
[0209] 报文在分流到不同的PCIe通路上之后,经过本实施例所公开的方法就可以把FPGA卡接口上的报文上送到上层应用模块进行不同的协议处理。
[0210] 需要说明的是,为了扩展本技术方案的应用范围,下面结合与下行流量共处的情形,进行详细的说明:
[0211] 在没有下行流量的应用场景中,由于不需要考虑多上行PCIe通路对下行流量的影响,可以直接实现本发明方案,属于本方案最理想的应用场景之一;
[0212] 针对下行只使用一个主PCIe通路的应用场景,跟普通的PCIe网卡并没有什么区别,不需要改动前文所述DPDK驱动程序,不需要对其中的下行模块做特殊处理,即可实现;
[0213] 针对下行使用多个PCIe通路的应用场景,由于PCIe通路、网口都是双向的,所以,理论上多PCIe通路也可以同时应用于下行通路,使下行通路的带宽也得到改善,同时使用多个PCIe通路,可以增加硬件的利用率,提高下行性能;在具体修改时,硬件不需要修改,只需要修改DPDK驱动程序即可;下行,也是采用多队列结构,上行队列为rxq(RX Queue),下行的队列为txq(TX Queue),与上行程序的修改一样,只需要将下行程序的队列和网口的对应关系存储正确,即可完成下行程序的适配。
[0214] 本实施例通过对网卡驱动中PCIe队列数量及队列初始化,完成对一个网络接口从多个PCIe通路上送的软件接收处理,从而提升了网络接口带宽。
[0215] 实施例三
[0216] 在前述实施例的基础上,本实施例提供一种计算机可读存储介质。该计算机可读存储介质中存储有计算机程序,该计算机程序被处理器执行时可以实现如前述方法实施例中的方法步骤,本实施例在此不再重复赘述。
[0217] 其中,计算机可读存储介质还可单独包括计算机程序、数据文件、数据结构等,或者包括其组合。计算机可读存储介质或计算机程序可被计算机软件领域的技术人员具体设计和理解,或计算机可读存储介质对计算机软件领域的技术人员而言可以是公知和可用的。计算机可读存储介质的示例包括:磁性介质,例如硬盘、软盘和磁带;光学介质,例如,CDROM盘和DVD;磁光介质,例如,光盘;和硬件装置,具体被配置以存储和执行计算机程序,例如,只读存储器(ROM)、随机存取存储器(RAM)、闪存;或服务器、app应用商城等。计算机程序的示例包括机器代码(例如,由编译器产生的代码)和包含高级代码的文件,可由计算机通过使用解释器来执行高级代码。所描述的硬件装置可被配置为用作一个或多个软件模块,以执行以上描述的操作和方法,反之亦然。另外,计算机可读存储介质可分布在联网的计算机系统中,可以分散的方式存储和执行程序代码或计算机程序。
[0218] 实施例四
[0219] 在前述实施例的基础上,本实施例提供一种计算机程序产品。该计算机程序产品包括计算机程序或指令,该计算机程序或指令被处理器执行时实现如前述方法实施例中方法的全部或部分步骤,本实施例在此不再重复赘述。
[0220] 进一步的,该计算机程序产品可以包括在运行程序时被配置为执行实施例的一个或多个计算机可执行组件;该该计算机程序产品还可包括有形地包含在及其可读介质上的计算机程序,所述计算机程序包含用于执行本公开实施方式中任一方法的程序代码。在这样的实施方式中,该计算机程序可以通过通信部分从网络上被下载和安装,和/或从可拆卸介质被安装。
[0221] 实施例五
[0222] 在前述实施例的基础上,本实施例提供一种电子设备。图6为本申请实施例提供的一种电子设备的连接框图,如图6所示,该电子设备600可以包括:一个或多个处理器601,存储器602,多媒体组件603,输入/输出(I/O)接口604,以及通信组件605。
[0223] 其中,一个或多个处理器601用于执行如前述方法实施例中的全部或部分步骤。存储器602用于存储各种类型的数据,这些数据例如可以包括电子设备中的任何应用程序或方法的指令,以及应用程序相关的数据。
[0224] 一个或多个处理器601可以是专用集成电路(Application Specific Integrated Circuit,简称ASIC)、数字信号处理器(Digital Signal Processor,简称DSP)、数字信号处理设备(Digital Signal Processing Device,简称DSPD)、可编程逻辑器件(Programmable Logic Device,简称PLD)、现场可编程门阵列(Field Programmable Gate Array,简称FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行如前述方法实施例中的方法。
[0225] 存储器602可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,例如静态随机存取存储器(Static Random Access Memory,简称SRAM),电可擦除可编程只读存储器(Electrically Erasable Programmable Read‑Only Memory,简称EEPROM),可擦除可编程只读存储器(Erasable Programmable Read‑Only Memory,简称EPROM),可编程只读存储器(Programmable Read‑Only Memory,简称PROM),只读存储器(Read‑Only Memory,简称ROM),磁存储器,快闪存储器,磁盘或光盘。
[0226] 多媒体组件603可以包括屏幕和音频组件,该屏幕可以是触摸屏,音频组件用于输出和/或输入音频信号。例如,音频组件可以包括一个麦克风,麦克风用于接收外部音频信号。所接收的音频信号可以被进一步存储在存储器或通过通信组件发送。音频组件还包括至少一个扬声器,用于输出音频信号。
[0227] I/O接口604为一个或多个处理器601和其他接口模块之间提供接口,上述其他接口模块可以是键盘,鼠标,按钮等。这些按钮可以是虚拟按钮或者实体按钮。
[0228] 通信组件605用于该电子设备600与其他设备之间进行有线或无线通信。有线通信包括通过网口、串口等进行通信;无线通信包括:Wi‑Fi、蓝牙、近场通信(Near Field Communication,简称NFC)、2G、3G、4G、5G,或它们中的一种或几种的组合。因此相应的该通信组件605可以包括:Wi‑Fi模块,蓝牙模块,NFC模块。
[0229] 综上,本申请提供了一种多PCIe通路网卡、上送报文的单网口网卡驱动方法、存储介质、计算机程序产品以及电子设备。所述多PCIe通路网卡从硬件结构上对PCIe通路进行了拓展,将一个PCIe通路扩展为了多个PCIe通路,并支持混合类型的多PCIe通路,可以使FPGA网卡适用于更多不同类型的主机。
[0230] 另外应该理解到,在本申请所提供的实施例中所揭露的方法或装置,也可以通过其它的方式实现。以上所描述的方法或装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的方法和装置的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、计算机程序段或计算机程序的一部分,模块、计算机程序段或计算机程序的一部分包含一个或多个用于实现规定的逻辑功能的计算机程序。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生,实际上也可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机程序的组合来实现。
[0231] 在本申请中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、装置或者设备中还存在另外的相同要素;如果有描述到“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系;在本申请的描述中,除非另有说明,术语“多个”、“多”的含义是指至少两个;如果有描述到服务器,需要说明的是,服务器可以是独立的物理服务器或终端,也可以是多个物理服务器构成的服务器集群,可以是能够提供云服务器、云数据库、云存储和CDN等基础云计算服务的云服务器;在本申请中如果有描述到智能终端或移动设备,需要说明的是,智能终端或移动设备可以是手机、平板电脑、智能手表、上网本、可穿戴电子设备、个人数字助理(Personal Digital Assistant,简称PDA)、增强现实技术设备(Augmented Reality,简称AR)、虚拟现实设备(Virtual Reality,简称VR)、智能电视、智能音响、个人计算机(Personal Computer,简称PC)等,但并不局限于此,本申请对智能终端或移动设备的具体形式不做特殊限定。
[0232] 最后需要说明的是,在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“一个示例”或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式进行结合。
[0233] 尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例都是示例性的,所述的内容只是为了便于理解本申请而采用的实施方式,并非用以限定本申请。任何本申请所属技术领域内的技术人员,在不脱离本申请所公开的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化,但本申请的保护范围,仍须以所附的权利要求书所界定的范围为准。