一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种网络端口扩展和报文快速均衡处理方法与流程

2022-11-30 21:58:04 来源:中国专利 TAG:

1.本发明属于计算机网络领域,涉及一种网络端口扩展和报文快速均衡处理方法。


背景技术:

2.在服务器设备中存在大量不同的业务程序在同时运行,每个程序均需要独立的网口与外部服务进行网络报文交互,服务器原生网口设备一般较少而无法满足需求。对于这种应用场景可以通过带100g网口的fpga来扩展网口,利用fpga的qdma(队列直接存储器访问)功能、服务器的多核处理器和dpdk(数据平面开发套件)的优势,达到网络报文的并行、均衡和快速处理的效果,因此设计一套有效实用的基于dpdk与qdma的网络端口扩展和报文快速均衡处理方法是实现服务器网络端口资源需求的关键。


技术实现要素:

3.为了解决现有技术中存在的上述技术问题,本发明提出了一种网络端口扩展和报文快速均衡处理方法,其具体技术方案如下:一种网络端口扩展和报文快速均衡处理方法,包括以下步骤:骤一,在服务器端的虚拟网络端口模块创建虚拟网络端口,在fpga端的fpga-qdma模块创建物理功能队列,通过服务器端的dpdk-qdma模块连接虚拟网络端口模块和fpga-qdma模块,再分配一个物理功能队列与虚拟网络端口一一对应,扩展fpga端的网口;步骤二,在dpdk-qdma模块启动时创建无锁队列、内存池和线程,引导虚拟网络端口模块和fpga-qdma模块完成启动资源创建和分配;步骤三,所述服务器端和fpga端之间进行网络报文的收发时,通过dpdk-qdma模块将虚拟网络端口和与其分配对应的物理功能队列传输网络报文。
4.进一步的,所述步骤二中的在dpdk-qdma模块启动时创建无锁队列、内存池和线程,具体包括以下子步骤:(2.1)初始化环境变量,获取fpga-qdma模块支持的物理功能pf数量n,根据用户配置文件获取需创建的虚拟网络端口数量k,计算得到为每个物理功能pf分配的队列pf_queue数量m=k/n;(2.2)创建虚拟网络端口模块需要的无锁队列和内存池,具体包括:(2.2.1)创建k个虚拟网络端口存储发送报文的内存池mbuf_pool_tx_vn[1—k],每个内存池包含p个rte_mbuf内存;(2.2.2)创建k个虚拟网络端口发送报文的无锁队列vn_port_tx_q[1—k],队列深度为p;(2.2.3)创建k个虚拟网络端口向dpdk-qdma模块发送报文的无锁队列vn_dpdk_tx_q[1—k],队列深度为p;(2.2.4)创建k个虚拟网络端口从dpdk-qdma模块接收报文的无锁队列vn_dpdk_rx_q[1—k],队列深度为p;
(2.3)创建dpdk-qdma模块需要的内存池和线程,具体包括:(2.3.1)创建n个dpdk-qdma模块存储接收报文的内存池mbuf_pool_rx_pf[1—n],每个内存池包含(m
×
p)个rte_mbuf内存;(2.3.2)创建n个转发fpga-qdma模块报文至虚拟网络端口模块的线程qdma_ingress_pthread,绑定在cpu[1—n]上运行;(2.3.3)创建n个转发虚拟网络端口模块报文至fpga-qdma模块的线程qdma_egress_pthread,绑定在cpu[(n 1)—2n]上运行;(2.4)向虚拟网络端口模块发送命令并获取信息,后创建收发报文内核线程,具体包括:(2.4.1)通知虚拟网络端口模块创建k个虚拟网络端口,并获得虚拟网络端口mac地址和混杂模式;(2.4.2)将无锁队列vn_port_tx_q[1—k]、vn_dpdk_tx_q[1—k]、vn_dpdk_rx_q[1—k]和存储发送报文的内存池mbuf_pool_tx_vn[1—k]的物理地址发送至虚拟网络端口模块;(2.4.3)通知虚拟网络端口模块创建从dpdk-qdma模块接收报文内核线程和向dpdk-qdma模块发送报文内核线程;(2.5)向fpga-qdma模块发送信息,具体包括:(2.5.1)将每个物理功能pf分配的队列pf_queue发送至fpga-qdma模块;(2.5.2)将k个虚拟网络端口的mac地址和混杂模式发送至fpga-qdma模块。
[0005]
进一步的,所述步骤二中的引导虚拟网络端口模块完成启动资源创建和分配,具体包括以下子步骤:(3.1)创建k个虚拟网络端口,为各个端口分配mac地址和设置混杂模式,将所有端口的mac地址和混杂模式发送至dpdk-qdma模块;(3.2)保存无锁队列vn_port_tx_q[1—k]、vn_dpdk_tx_q[1—k]、vn_dpdk_rx_q[1—k]和存储发送报文的内存池mbuf_pool_tx_vn[1—k]的物理地址;(3.3)创建n个从dpdk-qdma模块接收报文的内核线程rx_from_dpdk_kthread,绑定在cpu[(2n 1)—3n]运行;(3.4)创建向dpdk-qdma模块发送报文的内核线程tx_to_dpdk_balance_kthread,绑定在cpu[3n 1]运行。
[0006]
进一步的,所述步骤二中的引导fpga-qdma模块完成启动资源创建和分配,具体包括以下子步骤:(4.1)创建k个队列pf_queue[1—k],每个物理功能pf分配m个队列;(4.2)根据虚拟网络端口是否开启混杂模式,创建两个列表vn_promisc_list和vn_normal_list,分别存储开启混杂功能和未开启混杂功能虚拟网络端口信息,保存mac地址与虚拟网络端口的对应关系,同时保存虚拟网络端口与物理功能队列的对应关系。
[0007]
进一步的,所述步骤三具体为:fpga-qdma模块接收100g网口的网络报文,根据报文类型、混杂模式以及目的mac地址,指定网络报文相对应的发送物理功能队列,并在dpdk-qdma模块运行线程qdma_ingress_pthread,在虚拟网络端口运行线程rx_from_dpdk_kthread,通过发送物理功能队
列将网络报文发送至与该队列相对应的虚拟网络端口;虚拟网络端口接收到网络报文,并在虚拟网络端口模块运行线程tx_to_dpdk_balance_kthread,在dpdk-qdma模块运行线程qdma_egress_pthread,将网络报文通过该虚拟网络端口对应的物理功能队列发送至fpga-qdma模块,最终通过100g网口发送出去;其中,当某个虚拟网络端口所对应的物理功能队列处于拥塞时,则通过虚拟网络端口模块和fpga-qdma模块将网络报文分配到空闲物理功能队列进行传输。
[0008]
进一步的,所述的fpga-qdma模块接收100g网口的网络报文,根据报文类型、混杂模式以及目的mac地址,指定网络报文相对应的发送物理功能队列,具体包括以下子步骤:(5.1.1)fpga端通过100g网口接收外部网络报文;(5.1.2)判断网络报文是否为广播包,是则执行(5.1.3),否则执行(5.1.4);(5.1.3)将为广播包的网络报文复制成k个网络报文,依次给这k个网络报文指定报文对应的发送物理功能队列pf_queue_send;(5.1.4)计算获得列表vn_promisc_list个数promisc_nums,复制promisc_nums个报文,根据列表vn_promisc_list的虚拟网络端口号依次给报文指定对应的发送物理功能队列pf_queue_send;(5.1.5)轮询列表vn_normal_list,找到mac地址与报文相同的虚拟网络端口号,指定报文对应的发送物理功能队列pf_queue_send;(5.1.6)判断网络报文对应的发送物理功能队列pf_queue_send是否已满,是则执行(5.1.7),否则执行(5.1.10);(5.1.7)定义临时变量数组qdma_to_dpdk_q_pkgs[1—k]和qdma_to_dpdk_pf_pkgs[1—n],计算pf_queue[1—k]每个队列的待读取报文数,分别保存至数组qdma_to_dpdk_q_pkgs,根据数组qdma_to_dpdk_q_pkgs计算pf[1—n]每个物理功能的待读取报文数,分别保存至数组qdma_to_dpdk_pf_pkgs;(5.1.8)定义临时变量a和b,在qdma_to_dpdk_pf_pkgs[1—n]找到最小值,索引记作a,在qdma_to_dpdk_q_pkgs[(32a-31)—32a]找到最小值,索引记作b,判断pf_queue[b]是否已满,是则丢弃报文,否则执行(5.1.9);(5.1.9)修改网络报文发送物理功能队列pf_queue_send=pf_queue[b],报文增加vlan字段,并填充对应的虚拟网络端口号;(5.1.10)依次将报文发送至指定对应的发送物理功能队列pf_queue_send。
[0009]
进一步的,所述的在dpdk-qdma模块运行线程qdma_ingress_pthread,具体包括以下子步骤:(5.2.1)定义临时变量i、j、c和可存储p个rte_mbuf内存地址的链表pkts_burst_rx_l,轮询pf[i]的队列集pf_queue[((i-1)m 1)—im],获取当前轮询到的队列pf_queue[j],读取pf_queue[j]的报文数c,判断读取的报文数c是否在[1—p]范围内,是则执行(5.2.2),否则执行(5.2.1);(5.2.2)从mbuf_pool_rx_pn[i]内存池申请c个rte_mbuf内存,获取队列pf_queue[j]的网络报文,将报文依次保存至rte_mbuf内存,并将rte_mbuf内存地址插入到链表pkts_burst_rx_l,判断数组pkts_burst_rx是否为空,是则执行(5.2.1),否则执行(5.2.3);
(5.2.3)循环获取链表pkts_burst_rx_l的可读元素rte_mbuf内存,判断是否读取完毕,是则执行(5.2.1),否则执行(5.2.4);(5.2.4)判断无锁队列vn_dpdk_rx_q[j]是否已满,是则丢弃rte_mbuf内存中的报文,执行(5.2.3),否则执行(5.2.5);(5.2.5)获取无锁队列vn_dpdk_rx_q[j]的空闲元素vn_from_dpdk_item,将rte_mbuf内存的地址赋值给vn_from_dpdk_item,并插入到无锁队列vn_dpdk_rx_q[j],执行(5.2.3)。
[0010]
进一步的,所述的在虚拟网络端口运行线程rx_from_dpdk_kthread,通过发送物理功能队列将网络报文发送至与该队列相对应的虚拟网络端口,具体包括以下子步骤:(5.4.1)定义临时变量i和j,轮询无锁队列集vn_dpdk_rx_q[((i-1)m 1)—im],获得当前轮询到的无锁队列vn_dpdk_rx_q[j],判断vn_dpdk_rx_q[j]是否为空,是则执行(5.4.1),否则执行(5.4.2);(5.4.2)定义单次读取vn_dpdk_rx_q单个队列的元素数量阈值,循环获取vn_dpdk_rx_q[j]的可读元素dpdk_rx_item,判断vn_dpdk_rx_q[j]是否读取完毕或者读取元素数量达到所定义阈值,是则停止循环执行(5.4.1),否则执行(5.4.3);(5.4.3)定义临时变量vn_port,判断dpdk_rx_item的rte_mbuf内存的报文是否包含vlan字段,是则从vlan获取虚拟网络端口号赋值给vn_port并将vlan字段从报文中删除,否则vn_port=j,执行(5.4.4);(5.4.4)申请一个sk_buff内存,将rte_mbuf内存的报文拷贝至sk_buff内存,调用netif_rx_ni函数将sk_buff内存发送至虚拟网络端口vn_port,释放rte_mbuf内存,将dpdk_rx_item从vn_dpdk_rx_q[j]删除,执行(5.4.2)。
[0011]
进一步的,所述虚拟网络端口接收到网络报文,将网络报文插入无锁队列中,具体包括以下子步骤:(6.1.1)定义临时变量i,在内存池mbuf_pool_tx_vn[i]中申请一个rte_mbuf内存;(6.1.2)判断虚拟网络端口i相应的无锁队列vn_port_tx_q[i]是否已满,是则丢弃网络报文,否则执行(6.1.3);(6.1.3)获得无锁队列vn_port_tx_q[i]的空闲元素vn_tx_item,将sk_buff内存中的网络报文拷贝到rte_mbuf内存,将rte_mbuf内存地址赋值给vn_tx_item,将vn_tx_item插入到vn_port_tx_q[i]队列,释放sk_buff内存。
[0012]
进一步的,所述在虚拟网络端口模块运行线程tx_to_dpdk_balance_kthread,在dpdk-qdma模块运行线程qdma_egress_pthread,将网络报文通过该虚拟网络端口对应的物理功能队列发送至fpga-qdma模块,最终通过100g网口发送出去,具体包括以下子步骤:(6.3.1)定义临时变量i,循环轮询无锁队列集vn_port_tx_q[1—k],获得当前轮询到的无锁队列vn_port_tx_q[i],判断vn_port_tx_q[i]是否为空,是则执行(6.3.1),否则执行(6.3.2);(6.3.2)设置向dpdk-qdma模块发送报文无锁队列:vn_dpdk_tx_q_cur=vn_dpdk_tx_q[i];(6.3.3)定义单次读取vn_port_tx_q单个队列的元素数量阈值,循环获取vn_
port_tx_q[i]的可读元素vn_tx_item,判断vn_port_tx_q[i]是否读取完毕或者读取元素数量达到所定阈值,是则停止循环执行(6.3.1),否则执行(6.3.4);(6.3.4)判断vn_dpdk_tx_q_cur是否满,是则执行(6.3.5),否则执行(6.3.8);(6.3.5)定义临时变量数组vn_to_dpdk_q_single_pkgs[1—k],计算vn_dpdk_tx_q[1—k]每个队列的待发送报文数,分别保存至数组vn_to_dpdk_q_single_pkgs;(6.3.6)定义临时变量数组vn_to_dpdk_q_muster_pkgs[1—n],将vn_dpdk_tx_q[1—k]分成4组,每组每个队列,分别为vn_dpdk_tx_q[1—m],
…ꢀ
,vn_dpdk_tx_q[((n-1)m 1)—nm],根据数组vn_to_dpdk_q_single_pkgs计算每组的待发送报文数,分别保存至数组vn_to_dpdk_q_muster_pkgs;(6.3.7)定义临时变量a和b,在vn_to_dpdk_q_muster_pkgs[1—n]找到最小值,索引记作a,在vn_dpdk_tx_q[((a-1)m 1)—am]找到最小值,索引记作b,判断vn_dpdk_tx_q[b]是否已满,是则丢弃报文,执行(6.3.3),否则vn_dpdk_tx_q_cur=vn_dpdk_tx_q[b],执行(6.3.8);(6.3.8)获得vn_dpdk_tx_q_cur空闲元素dpdk_tx_item,将vn_tx_item的rte_mbuf内存地址赋值给dpdk_tx_item,将dpdk_tx_item插入到vn_dpdk_tx_q_cur,将vn_tx_item从删除vn_port_tx_q[i],执行(6.3.3);(6.4.1)再定义临时变量i和j,轮询无锁队列集vn_dpdk_tx_q[((i-1)m 1)—im],获得当前轮询到的无锁队列vn_dpdk_tx_q[j],判断vn_dpdk_tx_q[j]是否为空,是则执行(6.4.1),否则执行(6.4.2);(6.4.2)定义临时变量可存储p个rte_mbuf内存地址的链表pkts_burst_tx_l,定义单次读取vn_dpdk_tx_q单个队列的元素数量阈值为p,循环获取vn_dpdk_tx_q[j]的可读元素dpdk_tx_item,判断vn_dpdk_tx_q[j]是否读取完毕或者读取元素数量达到p,是则停止循环执行(6.4.1),否则将dpdk_tx_item的rte_mbuf内存地址插入到pkts_burst_tx_l,并将dpdk_tx_item从vn_dpdk_tx_q[j]删除,执行(6.4.3);(6.4.3)调用rte_eth_tx_burst函数将链表pkts_burst_tx_l中的报文发送至fpga-qdma模块的pf[i]的pf_queue[j]队列,rte_eth_tx_burst函数释放链表pkts_burst_tx_l中的rte_mbuf内存,执行(6.4.1);(6.5)fpga-qdma模块报文发送功能轮询pf[1—n]的pf_queue[1—k]队列,依次获取报文,发送至100g网口。
[0013]
与现有技术相比,本发明具有如下有益效果:1、本发明通过fpga-qdma模块的一个物理功能队列对应虚拟网络端口模块的一个虚拟网络端口,将fpga的100g网口扩展成k个网络端口,实现网络端口扩展的功能,有效降低成本;2、本发明利用服务器端多线程、无锁队列、零拷贝和cpu绑核技术,fpga端的qdma多物理功能多队列的特性,实现报文的并行快速处理;3、虚拟网络端口分配固定的物理功能队列传输网络报文,某个虚拟网络端口处于网络拥塞时将网络报文分配到空闲队列传输,实现网络报文的快速均衡传输,同时大幅减少网络报文拥塞时的丢包率。
附图说明
[0014]
图1为本发明总体架构图;图2为本发明的一种网络端口扩展和报文快速均衡处理方法的主要流程图;图3为本发明的fpga-qdma模块接收外部网络报文发送至相对应的物理功能队列的流程图;图4为本发明的在dpdk-qdma模块转发fpga-qdma模块报文至虚拟网络端口模块的流程图;图5为本发明的在虚拟网络端口模块转发dpdk-qdma模块报文至虚拟网络端口内核的流程图;图6为本发明的虚拟网络端口发送网络报文并插入无锁队列的流程图;图7为本发明的在虚拟网络端口模块转发虚拟网络端口报文至dpdk-qdma模块的流程图;图8为本发明的在dpdk-qdma模块转发虚拟网络端口模块报文至fpga-qdma模块的流程图。
具体实施方式
[0015]
为了使本发明的目的、技术方案和技术效果更加清楚明白,以下结合说明书附图和实施例,对本发明作进一步详细说明。
[0016]
如图1所示为本发明的总体架构,由服务器端和fpga端通过pcie总线连接组成,其中,在所述服务器端的内核层运行有虚拟网络端口模块,应用层运行有dpdk-qdma模块;在所述fpga端运行有fpga-qdma模块。
[0017]
所述服务器端的cpu至少为16核处理器,其中将cpu[1~13]核设置为孤立状态防止被系统其他服务进程或线程使用。
[0018]
如图2所示,本发明的基于dpdk与qdma的网络端口扩展和报文快速均衡处理方法,具体包括以下步骤:步骤一,在服务器端的虚拟网络端口模块创建k个虚拟网络端口,在fpga端的fpga-qdma模块创建k个物理功能队列,通过服务器端的dpdk-qdma模块连接虚拟网络端口模块和fpga-qdma模块,再分配物理功能队列与虚拟网络端口一一对应,扩展fpga端的100g网口,将fpga端的100g网口扩展成k个网络端口,实现网络端口扩展,本实施例中k取128,步骤二,在dpdk-qdma模块启动时创建无锁队列、内存池和线程,引导虚拟网络端口模块和fpga-qdma模块完成启动资源创建和分配,具体步骤内容如下:所述在dpdk-qdma模块启动时创建无锁队列、内存池和线程,具体包括以下子步骤:(2.1)调用函数rte_eal_init完成环境变量初始化,获取fpga-qdma模块支持的物理功能pf数量n,本实施方式为n取4,根据用户配置文件获取需创建的虚拟网络端口数量128,计算得到为每个pf分配的队列pf_queue数量m,m=128/4=32;(2.2)创建虚拟网络端口模块需要的内存池和无锁队列,具体步骤如下:(2.2.1)创建128个虚拟网络端口存储发送报文的内存池mbuf_pool_tx_vn[1—128],每个内存池包含p=4096个rte_mbuf内存;
(2.2.2)创建128个虚拟网络端口发送报文的无锁队列vn_port_tx_q[1—128],队列深度为p=4096;(2.2.3)创建128个虚拟网络端口向dpdk-qdma模块发送报文的无锁队列vn_dpdk_tx_q[1—128],队列深度为p=4096;(2.2.4)创建128个虚拟网络端口从dpdk-qdma模块接收报文的无锁队列vn_dpdk_rx_q[1—128],队列深度为p=4096。
[0019]
(2.3)创建dpdk-qdma模块需要的内存池和线程,具体步骤如下:(2.3.1)创建4个dpdk-qdma模块存储接收报文的内存池mbuf_pool_rx_pf[1—4],每个内存池包含131072(32x4096)个rte_mbuf内存;(2.3.2)创建4个转发fpga-qdma模块报文至虚拟网络端口模块的线程qdma_ingress_pthread,绑定在cpu[1—4]上运行;(2.3.3)创建4个转发虚拟网络端口模块报文至fpga-qdma模块的线程qdma_egress_pthread,绑定在cpu[5—8]上运行。
[0020]
(2.4)向虚拟网络端口模块发送命令和获取信息,具体步骤如下:(2.4.1)通知虚拟网络端口模块创建128个虚拟网络端口,并获得虚拟网络端口mac地址和混杂模式;(2.4.2)将无锁队列vn_port_tx_q[1—128]、vn_dpdk_tx_q[1—128]、vn_dpdk_rx_q[1—128]和存储发送报文的内存池mbuf_pool_tx_vn[1—128]的物理地址发送至虚拟网络端口模块;(2.4.3)通知虚拟网络端口模块创建从dpdk-qdma模块接收报文内核线程和向dpdk-qdma模块发送报文内核线程。
[0021]
(2.5)向fpga-qdma模块发送信息,具体步骤如下:(2.5.1)将每个物理功能pf分配的队列pf_queue发送至fpga-qdma模块;(2.5.2)将k个虚拟网络端口的mac地址和混杂模式发送至fpga-qdma模块。
[0022]
步骤(2)的虚拟网络端口模块完成启动资源创建和分配具体步骤如下:(3.1)创建128个虚拟网络端口,为各个端口分配mac地址和设置混杂模式,将所有端口的mac地址和混杂模式发送至dpdk-qdma模块;(3.2)保存无锁队列vn_port_tx_q[1—128]、vn_dpdk_tx_q[1—128]、vn_dpdk_rx_q[1—128]和存储发送报文的内存池mbuf_pool_tx_vn[1—128]的物理地址;(3.3)创建4个从dpdk-qdma模块接收报文的内核线程rx_from_dpdk_kthread,绑定在cpu[9—12]运行;(3.4)创建向dpdk-qdma模块发送报文的内核线程tx_to_dkdk_balance_kthread,绑定在cpu[13]运行;步骤(2)的fpga-qdma模块完成启动资源创建和分配具体步骤如下:(4.1)创建128个队列pf_queue[1—128],每个物理功能pf分配32个队列,对应关系:pf[1]—》pf_queue[1—32], pf[2]—》pf_queue[33—64], pf[3]—》pf_queue[65—96], pf[4]—》pf_queue[97—128];(4.2)根据虚拟网络端口是否开启混杂模式,创建两个列表vn_promisc_list和vn_normal_list,分别存储开启混杂功能和未开启混杂功能虚拟网络端口信息,保存mac地
址与虚拟网络端口的对应关系,同时保存虚拟网络端口与物理功能队列的对应关系。
[0023]
步骤三,所述服务器端和fpga端之间进行网络报文的收发时,将dpdk-qdma模块作为网络报文传输的桥梁,通过dpdk-qdma模块将虚拟网络端口和与其分配对应的物理功能队列传输网络报文。
[0024]
具体为:fpga-qdma模块接收从100g网口输入的外部网络报文,根据报文类型、混杂模式以及目的mac地址,指定报文相对应的发送物理功能队列,并在dpdk-qdma模块运行线程qdma_ingress_pthread,在虚拟网络端口运行线程rx_from_dpdk_kthread,通过该队列将报文发送至相对应的虚拟网络端口;所述虚拟网络端口接收到网络报文,并在虚拟网络端口模块运行线程tx_to_dpdk_balance_kthread,在dpdk-qdma模块运行线程qdma_egress_pthread,将网络报文通过该虚拟网络端口对应的物理功能队列发送至fpga-qdma模块,最终通过100g网口发送出去;其中,当某个虚拟网络端口所对应的物理功能队列处于拥塞时,则通过虚拟网络端口模块和fpga-qdma模块将网络报文分配到空闲物理功能队列传输,实现网络报文的快速均衡传输。
[0025]
其中的网络报文接收流程,具体步骤如下:(5.1)fpga-qdma模块的网络报文接收功能:接收外部网络报文发送至相对应的物理功能队列,即fpga-qdma模块接收100g网口的网络报文,根据报文类型、混杂模式以及目的mac地址,指定网络报文相对应的发送物理功能队列,如图3所示,具体步骤如下:(5.1.1)fpga端通过100g网口接收外部网络报文;(5.1.2)判断网络报文是否为广播包,是则执行(5.1.3),否则执行(5.1.4);(5.1.3)将为广播包的网络报文复制成128个网络报文,依次给这128个网络报文指定报文对应的发送物理功能队列pf_queue_send;(5.1.4)计算获得列表vn_promisc_list个数promisc_nums,复制promisc_nums个报文,根据列表vn_promisc_list的虚拟网络端口号依次给报文指定对应的发送物理功能队列pf_queue_send;(5.1.5)轮询列表vn_normal_list,找到mac地址与报文相同的虚拟网络端口号,指定报文对应的发送物理功能队列pf_queue_send;(5.1.6)判断网络报文对应的发送物理功能队列pf_queue_send是否已满,是则执行(5.1.7),否则执行(5.1.10);(5.1.7)定义临时变量数组qdma_to_dpdk_q_pkgs[1—128]和qdma_to_dpdk_pf_pkgs[1—4],计算pf_queue[1—128]每个队列的待读取报文数,分别保存至数组qdma_to_dpdk_q_pkgs,根据数组qdma_to_dpdk_q_pkgs计算pf[1—4]每个物理功能的待读取报文数,分别保存至数组qdma_to_dpdk_pf_pkgs;(5.1.8)定义临时变量a和b,在qdma_to_dpdk_pf_pkgs[1—4]找到最小值,索引记作a,在qdma_to_dpdk_q_pkgs[(32a-31)—32a]找到最小值,索引记作b,判断pf_queue[b]是否已满,是则丢弃报文,否则执行(5.1.9);(5.1.9)修改网络报文发送队列pf_queue_send=pf_queue[b],报文增加vlan字
段,并填充对应的虚拟网络端口号;(5.1.10)依次将报文发送至指定对应的发送物理功能队列pf_queue_send。
[0026]
(5.2)在dpdk-qdma模块,运行线程qdma_ingress_pthread,转发fpga-qdma模块报文至虚拟网络端口模块,如图4所示,具体步骤如下:(5.2.1)定义临时变量i、j、c和可存储4096个rte_mbuf内存地址的链表pkts_burst_rx_l,轮询pf[i]的队列集pf_queue[(32i-31)—32i],获取当前轮询到的队列pf_queue[j],读取pf_queue[j]的报文数c,判断读取的报文数c是否在[1—4096]范围内,是则执行(5.2.2),否则执行(5.2.1);(5.2.2)从mbuf_pool_rx_pn[i]内存池申请c个rte_mbuf内存,调用rte_eth_rx_burst函数获取队列pf_queue[j]的网络报文,将报文依次保存至rte_mbuf内存,并将rte_mbuf内存地址插入到链表pkts_burst_rx_l,判断数组pkts_burst_rx是否为空,是则执行(5.2.1),否则执行(5.2.3);(5.2.3)循环获取链表pkts_burst_rx_l的可读元素rte_mbuf内存,判断是否读取完毕,是则执行(5.2.1),否则执行(5.2.4);(5.2.4)判断无锁队列vn_dpdk_rx_q[j]是否已满,是则丢弃rte_mbuf内存中的报文,执行(5.2.3),否则执行(5.2.5);(5.2.5)获取无锁队列vn_dpdk_rx_q[j]的空闲元素vn_from_dpdk_item,将rte_mbuf内存的地址赋值给vn_from_dpdk_item,并插入到无锁队列vn_dpdk_rx_q[j],执行(5.2.3)。
[0027]
(5.3)dpdk-qdma模块同时运行4个功能等价的qdma_ingress_pthread线程;(5.4)在虚拟网络端口模块,运行线程rx_from_dpdk_kthread,转发dpdk-qdma模块报文至虚拟网络端口内核,即通过发送物理功能队列将网络报文发送至与该队列相对应的虚拟网络端口,如图5所示,具体步骤如下:(5.4.1)定义临时变量i和j,轮询无锁队列集vn_dpdk_rx_q[(32i-31)—32i],获得当前轮询到的无锁队列vn_dpdk_rx_q[j],判断vn_dpdk_rx_q[j]是否为空,是则执行(5.4.1),否则执行(5.4.2);(5.4.2)定义单次读取vn_dpdk_rx_q单个队列的元素数量阈值为4096,循环获取vn_dpdk_rx_q[j]的可读元素dpdk_rx_item,判断vn_dpdk_rx_q[j]是否读取完毕或者读取元素数量达到4096,是则停止循环执行(5.4.1),否则执行(5.4.3);(5.4.3)定义临时变量vn_port,判断dpdk_rx_item的rte_mbuf内存的报文是否包含vlan字段,是则从vlan获取虚拟网络端口号赋值给vn_port并将vlan字段从报文中删除,否则vn_port=j,执行(5.4.4);(5.4.4)申请一个sk_buff内存,将rte_mbuf内存的报文拷贝至sk_buff内存,调用netif_rx_ni函数将sk_buff内存发送至虚拟网络端口vn_port,释放rte_mbuf内存,将dpdk_rx_item从vn_dpdk_rx_q[j]删除,执行(5.4.2)。
[0028]
(5.5)虚拟网络端口模块同时运行4个功能等价的rx_from_dpdk_kthread内核线程。
[0029]
所述网络报文发送流程,具体步骤如下:(6.1)定义临时变量i,虚拟网络端口i发送网络报文,将网络报文插入无锁队列
vn_port_tx_q[i],如图6所示,具体步骤如下:(6.1.1)在内存池mbuf_pool_tx_vn[i]中申请一个rte_mbuf内存;(6.1.2)判断虚拟网络端口i相应的无锁队列vn_port_tx_q[i]是否已满,是则丢弃网络报文,否则执行(6.1.3);(6.1.3)获得无锁队列vn_port_tx_q[i]的空闲元素vn_tx_item,将sk_buff内存中的网络报文拷贝到rte_mbuf内存,将rte_mbuf内存地址赋值给vn_tx_item,将vn_tx_item插入到vn_port_tx_q[i]队列,释放sk_buff内存。
[0030]
(6.2)所述的虚拟网络端口模块支持128个功能等价的虚拟网络端口同时发送报文;(6.3)在虚拟网络端口模块,运行线程tx_to_dpdk_balance_kthread,转发虚拟网络端口报文至dpdk-qdma模块内核,如图7所示,具体步骤如下:(6.3.1)定义临时变量i,循环轮询无锁队列集vn_port_tx_q[1—k],获得当前轮询到的无锁队列vn_port_tx_q[i],判断vn_port_tx_q[i]是否为空,是则执行(6.3.1),否则执行(6.3.2);(6.3.2)设置向dpdk-qdma模块发送报文无锁队列:vn_dpdk_tx_q_cur=vn_dpdk_tx_q[i];(6.3.3)定义单次读取vn_port_tx_q单个队列的元素数量阈值为4096,循环获取vn_port_tx_q[i]的可读元素vn_tx_item,判断vn_port_tx_q[i]是否读取完毕或者读取元素数量达到4096,是则停止循环执行(6.3.1),否则执行(6.3.4);(6.3.4)判断vn_dpdk_tx_q_cur是否满,是则执行(6.3.5),否则执行(6.3.8);(6.3.5)定义临时变量数组vn_to_dpdk_q_single_pkgs[1—128],计算vn_dpdk_tx_q[1—k]每个队列的待发送报文数,分别保存至数组vn_to_dpdk_q_single_pkgs;(6.3.6)定义临时变量数组vn_to_dpdk_q_muster_pkgs[1—4],将vn_dpdk_tx_q[1—k]分成4组,每组每个队列,分别为vn_dpdk_tx_q[1—32],vn_dpdk_tx_q[33—64] ,vn_dpdk_tx_q[65—96],vn_dpdk_tx_q[97—128],根据数组vn_to_dpdk_q_single_pkgs计算每组的待发送报文数,分别保存至数组vn_to_dpdk_q_muster_pkgs;(6.3.7)定义临时变量a和b,在vn_to_dpdk_q_muster_pkgs[1—4]找到最小值,索引记作a,在vn_dpdk_tx_q[(32a-31)—32a]找到最小值,索引记作b,判断vn_dpdk_tx_q[b]是否已满,是则丢弃报文,执行(6.3.3),否则vn_dpdk_tx_q_cur=vn_dpdk_tx_q[b],执行(6.3.8);(6.3.8)获得vn_dpdk_tx_q_cur空闲元素dpdk_tx_item,将vn_tx_item的rte_mbuf内存地址赋值给dpdk_tx_item,将dpdk_tx_item插入到vn_dpdk_tx_q_cur,将vn_tx_item从删除vn_port_tx_q[i],执行(6.3.3)。
[0031]
(6.4)在dpdk-qdma模块运行线程qdma_egress_pthread,转发虚拟网络端口模块报文至fpga-qdma模块,如图8所示,具体步骤如下:(6.4.1)定义临时变量i和j,轮询无锁队列集vn_dpdk_tx_q[(32i-31)—32i],获得当前轮询到的无锁队列vn_dpdk_tx_q[j],判断vn_dpdk_tx_q[j]是否为空,是则执行(6.4.1),否则执行(6.4.2);(6.4.2)定义临时变量可存储4096个rte_mbuf内存地址的链表pkts_burst_tx_l,
定义单次读取vn_dpdk_tx_q单个队列的元素数量阈值为4096,循环获取vn_dpdk_tx_q[j]的可读元素dpdk_tx_item,判断vn_dpdk_tx_q[j]是否读取完毕或者读取元素数量达到4096,是则停止循环执行(6.4.1),否则将dpdk_tx_item的rte_mbuf内存地址插入到pkts_burst_tx_l,并将dpdk_tx_item从vn_dpdk_tx_q[j]删除,执行(6.4.3);(6.4.3)调用rte_eth_tx_burst函数将链表pkts_burst_tx_l中的报文发送至fpga-qdma模块的pf[i]的pf_queue[j]队列,rte_eth_tx_burst函数释放链表pkts_burst_tx_l中的rte_mbuf内存,执行(6.4.1)。
[0032]
所述dpdk-qdma模块同时运行4个功能等价的qdma_egress_pthread线程。
[0033]
(6.5)所述fpga-qdma模块报文发送功能轮询pf[1—4]的pf_queue[1—128]队列,依次获取报文后发送至100g网口。
[0034]
以上所述,仅为本发明的优选实施案例,并非对本发明做任何形式上的限制。虽然前文对本发明的实施过程进行了详细说明,对于熟悉本领域的人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行同等替换。凡在本发明精神和原则之内所做修改、同等替换等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献