一种基于Linux系统的LTE用户面高效UDP数据发送优化方法

阅读: 评论:0

著录项
  • CN201410197509.X
  • 20140512
  • CN103945456A
  • 20140723
  • 武汉邮电科学研究院
  • 陈辉;蔡鑫
  • H04W28/06
  • H04W28/06

  • 湖北省武汉市洪山区邮科院路88号
  • 湖北(42)
  • 武汉科皓知识产权代理事务所(特殊普通合伙)
  • 赵丽影
摘要
本发明提出了一种基于Linux系统的LTE用户面UDP数据发送优化方法,其目的是在用户面上行数据处理过程中,减少系统调用,硬件资源调度以及拷贝。本发明利用硬件资源批量申请方式减少硬件资源调度,利用内核空间-用户空间内存映射技术避免内存拷贝、socket中间层调用,IP协议栈处理,利用环形缓冲队列技术减少系统调用,从而显著的提高用户面上行数据处理的性能。
权利要求

1.一种基于Linux系统的LTE用户面UDP数据发送优化方法,其特征在于:通过利用网卡硬件资源批量申请方式减少网卡硬件资源调度,利用内核空间-用户空间内存映射技术避免内存拷贝、socket中间层处理、IP协议栈处理,利用环形缓冲队列技术减少系统调用,从而提高用户面UDP数据发送的性能;包括初始化过程和数据发送过程两部分内容,具体步骤如下:

初始化过程包括以下子步骤,

步骤1.1,linux内核初始化时,预留一块物理上连续的内存,将内存块切分为1024个大小相等,2112字节的格子,以满足以太网标准MTU要求,将每个格子的物理地址和大小通知给DPAA模块的缓冲区管理BMAN单元;

步骤1.2,在用户态发包程序和linux内核之间建立一个环形缓冲中间层,在环形缓冲层初始化时,预留一块物理上连续的内存,将内存块切分为256个大小相等的格子,用来存储UDP数据包的地址偏移和长度,预留内存的头结构中再保存控制环形缓冲层的读写指针,完成用户态发包程序和内核之间的同步,环形缓冲区的大小定义为256块; 

步骤1.3,向linux内核DPAA模块批量申请256个BMAN单元,将已经申请的BMAN资源用于存储数据包的偏移存储到环形缓冲区的256个节点上,能通过环形缓冲区节点到BMAN硬件资源存放数据包的偏移地址;

步骤1.4,用户态发包程序初始化时,将步骤1.1和步骤1.2中分配的内核内存,映射到用户空间;

步骤1.5,创建内核态的UDP发送线程,并初始化为睡眠状态;

数据发送过程包括以下子步骤,

步骤2.1,用户态发包程序收到一个UDP待发数据时通过映射到用户空间的环形缓冲层的写指针到可写的环形缓冲节点,将UDP payload信息、IP头信息和MAC头信息按照IP数据包的格式填充到对应的BMAN节点空间,并将写指针指向下一个缓冲节点;

步骤2.2,用户态程序填充完IP数据包后,根据内核的UDP发送线程状态来决定是否调用ioctl去唤醒内核的UDP发送线程,如果发送线程已经处于running状态,就无需系统调用去唤醒发送线程;

步骤2.3,UDP发送线程被唤醒后,设置发送线程的当前状态为running,检查环形缓冲区内是否有数据包缓存,如果存在数据包被缓存,就调用硬件层接口将数据包发送出去;然后设置线程当前状态为sleep,并马上进入休眠状态;

步骤2.4,硬件层接口收到此数据包后,由于数据包已经存储到BMAN硬件资源所对应的buffer中,无需拷贝,直接放到QMAN中发送出去,发送完成后,再次向内核DPAA模块批量申请8个BMAN buf,填充到刚刚发送完成的唤醒缓冲节点中。

2.根据权利要求1所述的基于Linux系统的LTE用户面UDP数据发送优化方法,其特征在于:在用户态发包处理程序中,通过组装MAC、VLAN、IP和UDP头部信息,将UDP报文中的数据部分,组装成完成的IP数据包,直接填充到硬件层BMAN中,省去了内核socket中间层和IP协议栈的处理。

3.根据权利要求1所述的基于Linux系统的LTE用户面UDP数据发送优化方法,其特征在于:在环形缓冲区的每个单元格中对单元格的读写分别由用户态发包程序和内核UDP线程来操作,无需加锁即实现数据缓冲。

4.根据权利要求1所述的基于Linux系统的LTE用户面UDP数据发送优化方法,其特征在于:所述步骤1.3中,为避免拷贝,预先对网卡存放数据的内存批量申请,在用户态填充完整的数据包到此内存,无需再次拷贝就可以使用硬件层接口发送数据包。

说明书
技术领域

本发明涉及无线通信技术领域,尤其是涉及一种基于Linux系统的LTE用户面UDP数据发送优化方法。 

随着无线通信技术的进步,无线网络设备的不断升级改造,对于LTE(3GPP长期演进技术)用户面数据处理要求越来越高。 LTE用户面上行数据主要是承载于UDP(用户数据报协议)之上的GTPU(隧道协议)业务,对于GTPU下行报文,传统的处理方式是利用UDP socket发包;用户构造好GTPU报文后通过udp socket系统调用到Linux内核,Linux内核再经过网络协议栈的层层处理,最后转给硬件层将报文发出去。从UDP报文的转发流程来看,涉及到GTPU报文的组装,用户态到内核态的系统调用和内存拷贝,socket中间层、IP协议栈的处理,网卡硬件层的处理。

传统方法的弊端包括:

拷贝过多:每个UDP报文,从用户态socket到linux内核,需要从用户空间拷贝到内核空间。

系统调用过多:每发一个UDP包,都要经过一次socket send,都有一次系统调用,即内核态和用户态上下文切换的过程。

硬件资源申请过多:linux IP协议栈每处理完一个报文后都会申请一次硬件资源去发送UDP报文。

本发明针对背景技术存在的问题,提出了一种基于Linux系统的LTE用户面UDP数据发送优化方法,其目的是在LTE用户面上行UDP数据处理过程中,减少系统调用、拷贝及频繁申请硬件资源的问题。

本发明的技术方案为一种基于Linux系统的LTE用户面UDP数据发送优化方法,利用批量申请硬件资源技术减少硬件资源的频繁申请,利用内核空间-用户空间内存映射技术避免内存拷贝,利用环形缓冲技术减少内核态和用户态的上下文切换,从而显著的提高LTE用户面UDP数据发送的性能;包括初始化过程和数据发送过程两部分内容,具体步骤如下:

初始化过程包括以下子步骤,

步骤1.1,linux内核初始化时,预留一块物理上连续的内存,将内存块切分为1024 大小相等,2112字节的格子(满足以太网标准MTU(最大传输单元)要求,并且64字节的奇数倍以保证高效的利用CPU的L2 cache),将每个格子的物理地址和大小通知给硬件的BMAN单元(缓冲区管理单元)。

步骤1.2,在用户态发包程序和linux内核之间建立一个环形缓冲中间层,环形缓冲层初始化时,预留另一块物理上连续的内存,将内存块切分为256大小相等的格子,用来存储UDP数据包的地址偏移和长度,预留内存的头结构中再保存控制环形缓冲层的读写指针,完成用户态发包程序(生产者)和内核(消费者)之间的同步,环形缓冲区的大小定义为256块,2的幂有利于提高读写指针操作的效率。

步骤1.3,向linux内核DPAA模块批量申请256个BMAN单元,将已经申请的BMAN资源用于存储数据包的偏移存储到环形缓冲区的256个节点上,能通过环形缓冲层节点到存放数据包的BMAN单元所在的内存偏移地址。

步骤1.4,用户态发包程序初始化时,将步骤1.1和步骤1.2中分配的内核内存,映射到用户空间。

步骤1.5,创建内核态的UDP发送线程,并初始化为睡眠状态;

数据传输过程包括以下子步骤:

步骤2.1,用户态程序收到一个UDP待发数据时通过映射到用户空间的环形缓冲的写指针到可写的环形缓冲节点,将UDP payload信息、IP头信息和MAC头信息按照IP数据包的格式填充到对应的BMAN节点空间,并将写指针指向下一个缓冲节点。

步骤2.2,用户态程序填充完IP数据包后,根据内核的UDP发送线程状态来决定是否调用ioctl去唤醒内核的UDP发送线程,如果发送线程已经处于running状态,就无需系统调用去唤醒发送线程。

步骤2.3,UDP发送线程被唤醒后,设置发送线程的当前状态为running,检查环形缓冲区内是否有数据包缓存,如果存在数据包被缓存,就调用硬件层接口将数据包发送出去。然后设置线程当前状态为sleep,并马上进入休眠状态。

步骤2.4,硬件层接口(即:与硬件芯片配套提供的如何使用硬件的接口)收到此数据包后,由于数据包已经存储到BMAN单元所对应的buffer中,无需拷贝,直接放到QMAN中发送出去,发送完成后,再次向内核DPAA模块批量申请8个BMAN buffer,填充到刚刚发送完成的环形缓冲节点中。

本发明对比传统的UDP数据发送技术有以下创新点:

1.        硬件资源批量申请,发送UDP数据包完成后,一次性申请8个BMAN buf资源,避免了每次发包都申请1个BMAN资源,申请BMAN资源的总时间消耗降为原来的1/8。

2.        利用唤醒缓冲技术,完成单生产者和单消费者的同步,避免频繁的系统调用。通过内核UDP发送线程这个消费者的工作状态来判断用户发送程序这个生产者是否需要系统调用来唤醒消费者。

3.        利用内核-用户空间内存映射技术,将BMAN单元存放数据包的内存映射到用户空间,避免内存拷贝。

4.        避免内核socket中间层、IP协议栈的处理。

图1 为本发明实施例中BMAN缓冲区的结构图;

图2 为本发明中环形缓冲区的操作原理示意图;

图3 为本发明中BMAN缓冲区与环形缓冲区的交互图;

图4 为本发明中UDP数据包发送流程图。

本发明主要针对LTE用户面UDP数据处理的优化,适用但并不限于LTE,本方案同样适用于其它需要在嵌入式Linux系统中实现高效UDP数据包发送的系统。该方案能满足无线通信建设中高速数据传输的需求,有效减少系统资源的占用,本设计充分利用内存映射技术、数据发送线程化技术和无锁的唤醒缓冲技术等一系列前沿技术,能有效减少硬件资源调度、减少进程上下文切换以及完全避免了数据拷贝。

以下结合附图和实施例详细说明本发明技术方案。

初始化过程如下:

步骤1.1,内核初始化时,预留一块物理上连续的内存作为BMAN单元的包缓存空间, 后面发包调度BMAN单元时就会使用前面已经预留的内存作为BMAN单元发包所需要用的空间。如图1所示,将内存块切分为1024个大小相等,每个大小为2112字节的单元格,2112字节为64字节的奇数倍,这个大小的选择可以容纳1500字节的标准MTU,并允许硬件添加一些附件信息,且能均匀利用PowerPC4080的两个三级缓存,初始化完成后,将每个格子的物理地址和大小通知给DPAA模块的BMAN单元。,在内核的DTS文件中,将LTE与核心网相连的FMAN对应端口绑定到已建立的BMAN空间,后面数据发送时就可以通过BMAN空间直接向FMAN传送数据。

步骤1.2,内核初始化完成,在用户态发包程序和linux内核之间建立一个环形缓冲中间层,环形缓冲层初始化时,预留另一块物理上连续的内存,将内存块切分为256大小相等的单元格,用来存储UDP数据包的地址偏移和长度,预留内存的头结构中再保存控制环形缓冲层的读写指针,完成用户态发包程序(生产者)和内核(消费者)之间的同步,环形缓冲区的同步操作示意图见图2,利用环形缓冲层,在用户态只操作写指针,内核态只操作读指针,将不再需要传统的互斥锁结构,进一步提高了效率。环形缓冲层还需要提供内存映射函数的实现,做为桥梁完成BMAN单元所使用的空间内存与用户空间虚拟地址空间之间的映射,作为用户态发包程序和硬件之间的中间层,这样用户空间就能够直接操作内核空间的环形缓冲区地址和存放数据包的BMAN buffer地址。省去了linux内核IP协议栈的处理流程。

步骤1.3,驱动模块初始化时,通过io操作, 向linux内核DPAA模块批量申请256个BMAN单元,将已经申请的BMAN单元用于存储数据包内存的偏移量存储到环形缓冲区的256个节点上,能通过遍历环形缓冲层节点到BMAN单元存放数据包的内存偏移地址,进而可以存储数据包到BMAN单元所使用的内存中。

步骤1.4,用户态发包程序初始化时,将内核空间申请的BMAN缓冲区和环形缓冲区所在的连续物理地址空间映射到用户空间,即从内核空间的一段地址映射到用户空间的一段地址,用户态操作这一段虚拟地址,实际上就是操作的BMAN缓冲区,从而能避免网络数据从用户态到内核态的拷贝。

步骤1.5,创建内核态的UDP发送线程,并初始化为睡眠状态;等待用户态填充数据唤醒内核态的UDP发送线程进行数据发送。

使用过程:

步骤2.1,LTE收到空口来的用户数据后,经过LTE L2模块将PDCP数据处理封装成UDP数据,用户态发包程序收到一个UDP待发数据时,通过映射到用户空间的环形缓冲的写指针到可写的环形缓冲节点,,如图4所示,如果有空闲节点,就填充到写指针指向的缓冲区节点,节点中存放BMAN的地址偏移,可以到对应的BMAN地址以及BMAN内部存放数据包的基址,填充的数据包要是一个完成的IP数据包,将UDP payload信息、IP头信息和MAC头信息按照IP数据包的格式填充到对应的BMAN节点空间,其中mac地址、ip地址都需要在初始化时就配置好,填充时直接使用。填充完毕后将写指针指向下一个缓冲节点等待下一个数据包到达。如果没有空闲节点,即环形缓冲写满时,比如用户态程序瞬时发送了很多UDP数据包,而此时内核的UDP线程还来不及被唤醒,环形缓冲层就有可能被瞬时填满,无法继续填充数据包。本发明采用内核通知机制和信号量同步,增加一个用户态等待标志位,缓冲区填满时用户态程序阻塞,设置标志位为阻塞,等待UDP线程发送阻塞结束的信号。而UDP线程被唤醒后发送完所有数据包,发现用户态程序在阻塞状态,就给出一个解阻塞的信号,用户态发包程序收到后就可以继续往环形缓冲层填充新报文。

步骤2.2,填充完整个数据包后,判断内核UDP发送线程是否处于running状态,如果已经处于running状态就无需继续处理,直接返回,能够节省一次系统调用。如果发送线程处于sleep状态就需要通过系统调用唤醒此线程。由环形缓冲区被多个任务操作,存在唤醒丢失的问题,比如当send thread将睡未睡之际,CPU切换到用户态程序,执行唤醒线程动作,发现UDP线程处于running状态,不做唤醒动作而直接返回,CPU此时在轮询到UDP线程运行时未进行任何报文发送就直接休眠,此次唤醒操作就丢失。本解决方案针对此问题,增加UDP线程运行的标志位,用户态发包程序每次填充UDP报文后,判断缓冲里面有数据并且是处于sleep状态,就系统调用唤醒线程,即使唤醒丢失一次,下次发包还能够继续唤醒线程。

步骤2.3,UDP发送线程被唤醒后,设置发送线程的当前状态为running,根据读写指针判断环形缓冲区中是否存放有数据,如果存在数据包被缓存,就调用硬件层接口(是芯片配套提供的接口,专用用来发送数据包)将数据包发送出去。线程会在此次运行过程中发送完所有数据包,进入再次休眠等待下次被唤醒。

步骤2.4,由于存放数据包的内存即是硬件层中BMAN的内存,所以硬件层接口收到此数据包后,、可以直接调用硬件层接口发包而省略从skb拷贝到BMAN单元所用内存的动作。当前数据包发送完成后,此数据包所使用的BMAN Buf会被硬件自动释放,因此需要在连续8个数据发送后再次向DPAA模块批量申请8个BMAN buf,填充到刚刚发送完成的唤醒缓冲节点中。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

本文发布于:2023-04-15 04:08:00,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/87038.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图