CN101217573A - 一种加速网卡报文捕获的方法 - Google Patents
一种加速网卡报文捕获的方法 Download PDFInfo
- Publication number
- CN101217573A CN101217573A CNA2007101441529A CN200710144152A CN101217573A CN 101217573 A CN101217573 A CN 101217573A CN A2007101441529 A CNA2007101441529 A CN A2007101441529A CN 200710144152 A CN200710144152 A CN 200710144152A CN 101217573 A CN101217573 A CN 101217573A
- Authority
- CN
- China
- Prior art keywords
- dev
- ether
- mem
- desc
- count
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
一种加速网卡报文捕获的方法,涉及一种网络网卡。提供一种加速网卡报文捕获的方法。1)修改接收缓冲环初始化函数;2)屏蔽中断;3)用户空间内存映射;(1)查看/proc/iomem取得网卡上寄存器的首地址和地址范围,通过内存映射函数mmap将网卡上寄存器的首地址映射到用户虚拟地址空间,达到在用户空间对网卡上的寄存器进行直接读写;(2)通过网卡物理首地址和网卡上寄存器的偏移地址获得网卡上特定寄存器的物理地址,将网卡上特定寄存器物理地址映射到用户虚拟地址空间;(3)用户空间内存映射建立过程和用户空间控制网卡初始化;(4)用户空间内存映射解除过程;4)用户空间接收处理过程;5)相关数据结构定义。
Description
技术领域
本发明涉及一种网络网卡,尤其是涉及一种加速网卡报文捕获的方法。
背景技术
有关网卡报文捕获已有一些相关的报道,国内在这方面处于领先的是哈尔滨工业大学的计算机网络与信息安全技术研究中心,有3篇代表文章:《RTLinux下基于半轮询驱动的用户级报文传输机制》、《基于半轮询驱动的网络入侵检测单元的设计与实现》和《零拷贝报文捕获平台的研究与实现》。前两篇的第一作者是田志宏,第三篇的第一作者是王佰玲。国外在这方面研究具有突出成就的代表人物是Luca Deri。主要有两篇代表文章:《Improving PassivePacket Capture:Beyond Device Polling》和《nCap:Wire-speed Packet Capture and Transmission》。
在提高网络报文流采集和处理方面,文章《RTLinux下基于半轮询驱动的用户级报文传输机制》和《基于半轮询驱动的网络入侵检测单元的设计与实现》提出了“半轮询驱动”概念。而实际上,2003年底发布的Linux内核2.4.236已经通过NAPI实现了类似概念。两者的共同点都是首先采用中断唤醒数据接收的服务程序,然后通过POLL方法来轮询网卡,其差别在于田志宏的“半轮询”概念需要确定网络报文的输入速率是否达到一个稳定状态,当达到稳定状态时,持续通过轮询的方式采集网卡接收到的网络报文,反之则恢复中断方式;而应用NAPI的Linux网卡驱动程序,如e100 PRO/100,则在轮询失败(失败表示网卡目前没有新的网络报文等待Linux内核接收)后,休眠一段很短时间(时间长度可定制),再对网卡轮询一次,若轮询成功(表示有新的网络报文到达),则保持在轮询模式,反之恢复中断方式。
田志宏基于他提出的“半轮询”概念,实现了“用户级报文传输机制UMPS”。而基于NAPI机制,Luca Deri在《Improving Passive Packet Capture:Beyond Device Polling》中,提出了一种新的被动网络报文捕获机制-网络套接字PF_RING,PF_RING和UMPS都在内核空间中申请一块物理上连续的地址空间作为缓冲区,把内核接收到的网络报文复制到该缓冲区中,利用地址映射,上层应用程序直接读取存放在内核空间的网络报文,网络报文无须从内核空间发送到用户空间,从而避免网络报文从内核空间传送到用户空间过程中的内存拷贝操作。
在结构上,王佰玲的HPPCP比Luca的PF_RING更优化,PF_RING保留传统网卡驱动程序中内核接收网络报文的模式,即,在每条网络报文到达后内核临时申请堆缓冲的模式。网路报文被存放到堆缓冲后,PF_RING把报文拷贝到上层应用程序通过地址映射能够直接访问的内核地址空间(RING);而HPPCP则让网卡直接把网络报文以DMA方式存储到上层应用程序通过地址映射能够直接访问的内核地址空间,比PF_RING少了在网络报文在内核空间的一次内存拷贝。
实现PF_RING之后,Luca在《nCap:Wire-speed Packet Capture and Transmission》中,提出了一个新的网络报文捕获/接收及传输方案-nCap。nCap实现了不需要内核干涉的网络报文接收和传输。在这个方案中,网卡的寄存器和内存被映射到上层应用程序所在的用户地址空间。运行在用户地址空间的网络报文处理程序以控制linux操作系统的“设备”的形式直接与物理网卡交互,在接收和发送报文的过程中,完全地旁路了内核。
在网络报文接收方面,物理网卡把报文送到上层应用程序通过地址映射可以直接访问的内核地址空间,不仅实现了“零拷贝”,而且由网卡通过DMA直接完成,不需要内核干涉;在报文传输方面,用户空间程序通过直接存取物理网卡控制寄存器的方式,指挥网卡发送报文。报文接收和传输过程中的延迟被降低到了同样硬件条件下可能达到的最低程度,接近“零延迟”。
通过nCap提供的应用接口,现有的网络报文实时处理程序只要经过简单的重新编译,就可以在性能上得到极大的提升。同时,新的应用程序可以完全在用户空间开发,不需要另外开发内核空间的支持组件。开发人员甚至不需要具备Linux内核知识,这极大地降低了基于PC的高速网络报文处理系统的技术门槛和开发成本。
DAG卡的生产厂家Endace公司于2005年底收购nCap,添加了DAG的某些核心功能后,于2006年3月推出了其最新的网卡加速软件enCap。在enCap销售发布公告中,Endace公司指出:enCap是一套高速报文捕获软件,它使一台市场上普通的PC变成一个高效且廉价的网络测量系统,成为一个很好的网络流分析平台。Endace声称:enCap的推出目的是针对更广泛的用户群进一步降低网络监视和安全方案的门槛。enCap每套售价499美元。
无论是nCap还是enCap,其市场价值都是非常可观的。由于它们的产生,市场上的普通PC才有可能成为高速网络实时报文处理系统的硬件平台。nCap和enCap解决了一个门槛问题。
目前,nCap和enCap的源代码都没有公开,技术细节是保密的。
发明内容
本发明的目的在于提供一种加速网卡报文捕获的方法。
本发明的技术方案是通过对千兆网卡驱动模块和网卡接收控制程序两个层次的改进,减少了数据包在内核和用户空间传递过程中的拷贝,缓存以及系统调用等开销,从而使得千兆网卡捕获报文达到线速。
本发明包括以下步骤:
1)修改接收缓冲环初始化函数
在int e1000_up(struct e1000_adapter*adapter)函数中将
for(i=0;i<adapter->num_rx_queues;i++){
struct e1000_rx_ring*ring=&adapter->rx_ring[i];
adapter->alloc_rx_buf(adapter,ring,
E1000_DESC_UNUSED(ring));
}
修改为:
for(i=0;i<adapter->num_rx_queues;i++){
struct e1000_rx_ring*ring=&adapter->rx_ring[i];
adapter->alloc_rx_buf(adapter,ring,
E1000_DESC_UNUSED(ring)+1);
}
本修改完成每个接收描述符结构(receive descriptor)对应一块内存缓冲区(MemoryBuffer),内存缓冲区存放接收到的网络数据包。
2)屏蔽中断
在int e1000_up(struct e1000_adapter*adapter)函数中加入disable_irq(adapter->pdev->irq),函数disable_irq是专门的中断屏蔽函数。
3)用户空间内存映射
(1)查看/proc/iomem取得网卡上寄存器的首地址和地址范围,通过内存映射函数mmap将网卡上寄存器的首地址映射到用户虚拟地址空间,达到在用户空间对网卡上的寄存器进行直接读写;
(2)通过网卡物理首地址和网卡上寄存器的偏移地址获得网卡上特定寄存器的物理地址,将网卡上特定寄存器物理地址映射到用户虚拟地址空间;
(3)用户空间内存映射建立过程和用户空间控制网卡初始化
void e1000_device_init(struct e1000_device*ether_dev,unsigned int addr)
{
int mem_fd;
unsigned char*mem;
unsigned int rdbal,tdbal;
unsigned int rctl,tctl,ctrl;
unsigned short rdh,rdt,tdh,tdt;
mem_fd=open(″/dev/mem″,O_RDWR);
ether dev->fd=mem_fd;
if(mem_fd==-1)
{
printf(″Cannot open/dev/mem\n″);
return;
}
mem=mmap(0,0x20000,PROT_READ|PROT_WRITE,MAP_SHARED,mem_fd,
addr);
ether_dev->write_register=mem
if(mem==MAP_FAILED)
{
printf(″Cannot mmap mem\n″);
return;
}
rdbal=*(unsigned int*)&mem[E1000_RDBAL;
ether_dev->rx_desc=nmap(0,4096,PROT_READ|PROT_WRITE,MAP_SHARED,
mem_fd,rdbal);
if(ether_dev->rx_desc==MAP_FAILED)
{
printf(“Cannot mmap ether_dev->rx_desc\n”);
return;
}
ether_dev->mem_skb=mmap(0,0x40000000,PROT_READ|PROT_WRITE,
MAP_SHARED,mem_fd,0x0);
if(ether_dev->mem_skb=MAP_FAILED)
{
printf(“Cannot mmap ether_dev->rx_desc\n”);
return;
}
ether_dev->count=256;
ether_dev->next_to_clean=0;
ether_dev->next to_use=255;
ether_dev->rdh=E1000_RDH;
ether_dev->rdt=E1000_RDT;
rctl=*(unsigned int*)&mem[E1000_RCTL];
*(unsigned int*)&mem[E1000_RCTL]=rctl &~E1000_RCTL_EN;
rdh=*(unsigned short*)&mem[E1000_RDH];
rdt=*(unsigned short*)&mem[E1000_RDT];
*(unsigned int*)&mem[E1000_RDLEN]=4096;
*(unsigned short*)&mem[E1000_RDH]=0;
*(unsigned short*)&mem[E1000_RDT]=254;
*(unsigned int*)&mem[E1000_RCTL]=rctl|E1000_RCTL_EN;
}
(4)用户空间内存映射解除过程
void e1000_device_exit(struct e1000_device*ether_dev)
{
munmap(ether_dev->write_register,0x20000);
munmap(ether_dev->mem_skb,0x4000000);
munmap(etherdev->rx_desc,4096);
close(ether_dev->fd);
}
4)用户空间接收处理过程
int e1000_clean_rx_irq(struct e1000_device*ether_dev,unsigned char*buf_in,int*length)
{
struct e1000_rx_desc*rx_desc;
unsigned int i,j;
int cleaned_count=0;
int count=0;
unsigned char tdt;
struct e1000_tx_desc*tx_desc;
i=ether_dev->next_to_clean;
rx_desc=E1000_RX_DESC(*ether_dev,i);
while(rx_desc->status & E1000_RXD_STAT_DD)
{
if(++i==ether_dev->count)i=0;
cleaned_count++;
*length=rx_desc->length+4+20;
rx_desc->status=0;
if((cleaned_count>=16))
{
e1000_alloc_rx_buffers(ether_dev,cleaned_count);
count+=cleaned_count;
cleaned_count=0;
}
rx_desc=E1000_RX_DESC(*ether_dev,i);
}
ether_dev->next_to_clean=i;
cleaned_count=E1000_DESC_UNUSED(ether_dev);
if(cleaned_count)
e1000_alloc_rx_buffers(ether_dev,cleaned_count);
count+=cleaned_coun;
return count;
}
void e1000_alloc_rx_buffers(struct e1000_device*ether_dev,int cleaned_count)
{
struct e1000_rx_desc*rx_desc;
unsigned int i;
i=ether_dev->next_to_use;
while(cleaned_count--)
{
if((++i==ether_dev->count))
i=0;
}
if((ether_dev->next_to_use!=i))
{
ether_dev->next_to_use=i;
if((i--==0))
i=(ether_dev->count-1);
*(unsigned short*)ðer_dev->write_register[ether_dev->rdt]=i;
}
}
5)相关数据结构定义
struct e1000_rx_desc{
u_int64_t buffer_addr;/*Address of the descriptor′s data buffer*/
u_int16_t length; /*Length of data DMAed into data buffer*/
u_int16_t csum; /*Packet checksum*/
u_int8_t status; /*Descriptor status*/
u_int8_t errors;; /*Descriptor Errors*/
u_int16_t special;
};
struct e1000_device
{
int fd;
struct e1000_rx_desc*rx_desc;
unsigned int next_to_use;
unsigned int next_to_clean;
u_int16_t rdh;
u_int16_t rdt;
unsigned int count;
unsigned char*write_register;
unsigned char*mem_skb;
}。
本发明主要是通过内存映射在用户空间直接对接收缓冲环进行操作,以达到只需要一次网卡和缓冲环之间的DMA传输就可以实现数据的接收过程。同时由于网卡的接收控制过程由内核空间转移到了用户空间,因此旁路了内核,减少了数据包在内核和用户空间传递过程中的拷贝、缓存和系统调用等的开销,使得采用轮询机制基本上达到了千兆网卡的线速,为更好地研究入侵检测系统提供了一个开发平台。
附图说明
图1为本发明实施例的接收原理图。
图2为本发明实施例的接收描述符队列环结构图。
图3为本发明实施例的测试网络拓扑图。
具体实施方式
以下实施例将结合附图对本发明作进一步的说明。
接收原理图(参见图1)相关术语介绍如下:
User Space:用户空间,
Application:用户空间应用程序,就是使用此技术得程序。
mmap:内存映射眼熟,在用户空间内存映射建立过程有调用此函数。
Kernel:内核空间。
DMA:(Direct Memory Access),即直接存储器存取,是一种快速传送数据的机制。
Network Adpater:网卡。
RDBAL,RDBAH,RDLEN,RDH,RDT,Memory Buffer,receive descirptor等在下面的网卡相关技术细节介绍中有解释说明。
网卡相关技术细节介绍如下,其中接收描述符结构参见表1。
表1接收描述符结构
在表1中,
Buffer Address指向内存缓冲区,就是用来存放接收到的网络数据包。
Errors表示一个错误的数据包被接收。
Status表示这个描述符是否已经被使用,也就是说是否网卡已经在Buffer Address所指内存缓冲区存放了数据包。
Packet Checksum表示对数据包的硬件冗余计算。
Length表示数据包的长度。
接收描述符结构(receive descriptor)主要用来对应一个接收到的网络数据包。
接收描述符队列环结构说明如下:
接收描述符队列环结构(参见图2)是由一定数量的接收描述符组合而成的一个环形队列结构。硬件控制这个环行队列结构,其中每个方框代表一个接收描述符,RDH和RDT分别为环的头索引和尾索引。当有数据包到的时候,硬件将数据包放在RDH对应的接收描述符Buffer Address所指地址中,同时根据具体情况修改Length,Packet Checksum,Status,Errors,Special字段。
接收描述符环所用到的寄存器说明如下:
RDBAL和RDBAH指示接收描述符环的起始地址,其中RDBAL指示低32位,RDBAH指示高32位。
RDLEN指示接收描述符环的长度。RDLEN=单个接收描述符结构的长度×接收描述符的个数。
RDH指示接收描述符环的头索引指针。
RDT指示接收描述符环的尾索引指针。
Memory Buffer指示用来存放接收到的数据包。
测试网络拓扑图如图3所示,其中:
发包机:Lenovo 1和Lenovo 2配置为P4 XEON 3.0G,512m内存,Intel 82541GI千兆电口网卡。
收包机:Dell 1配置为P4 2.4G,512m内存,Intel 82541GI千兆电口网卡。
交换机:Cisco switch为思科WS-C3750-48TS-S千兆交换机。
发包机和收包机的操作系统都是RHEL4.0,内核版本为2.6.16.19。
以下给出实验数据。
计算带宽的时候要加上InterframeGap,Pre&Postamble,Frame Header,Frame FCS,所以发包流量和收包流量的计算公式为:
(InterframeGap+Pre&Postamble+Frame Header+Frame FCS+IP Packet)×pps;
其中,InterframeGap为12字节,Pre&Postamble为8字节,Frame Header为14字节,Frame FCS为4字节,pps为packet per second,bps为bit per second就是每秒接收或发送的数据包,这里的数据包指IP数据包。接收数据参见表2。
表2接收数据表
数据包大小(bytes) | 轮询机制 | Libpcap | Sar | |||
收包速率(pps) | 收包流量(bps) | 收包速率(pps) | 收包流量(bps) | 收包速率(pps) | 收包流量(bps) | |
64 | 627,003 | 512 | 190,947 | 156 | 831,498 | 679 |
128 | 497,879 | 661 | 177,796 | 236 | 582,447 | 773 |
256 | 320,475 | 754 | 167,373 | 394 | 371,075 | 873 |
512 | 193,506 | 851 | 142,470 | 627 | 208,646 | 918 |
1024 | 105,109 | 894 | 95,322 | 810 | 97,268 | 826 |
1500 | 76,085 | 936 | 69,158 | 850 | 80,457 | 990 |
以下给出实验结果的分析。
1)Sar命令是用来对系统接收性能进行采样的系统命令,通过对Sar列进行分析,Sar命令并不能达到网卡的接收线速1Gbps。这是因为网卡的接收速度除了受网卡本身性能的影响外,还受计算机体系结构以及PCI总线频率等的影响。而Sar命令的结果基本上就是测试电脑在其体系结构下的接收线速,而Libpcap在1500字节情况下也只有线速的85%。
2)Libpcap是传统的数据包捕获平台,目前涉及到数据包捕获的程序都是基于此接口开发的。可以发现其接受性能相对Sar来说还有很大差距。尤其是在捕获小数据包的时候(64字节和128字节),其捕获性能只有线速的30%左右。
3)本发明在采用轮询机制的情况下,当捕获64字节数据包时,其捕获性能就可以达到线速的75%以上,而当捕获128字节以上数据包时,其捕获性能可以达到线速的85%以上,尤其是1500字节数据包,捕获性能可以达到线速的95%。
4)通过对实验数据进行分析,可以发现本发明相对于Libpcap平台接收性能有了非常大的提高。无论是在64字节数据包150%的性能提升,还是在1500字节数据包12%的的性能提升,都充分说明了本发明的优越性,而且本发明非常接近网卡的接收线速。
由此可见,本发明主要是通过内存映射在用户空间直接对接收缓冲环进行操作,以达到只需要一次网卡和缓冲环之间的DMA传输就可以实现数据的接收过程,同时网卡的接收控制过程由内核空间转移到了用户空间,因此旁路了内核,减少了数据包在内核和用户空间传递过程中的拷贝、缓存和系统调用等的开销,使得采用轮询机制基本上达到了千兆网卡的线速,为更好的研究入侵检测系统提供了一个开发平台。
本发明的测试主要是与Intel 8254x系列千兆网卡绑定,软件修改设计到两个层次,一个是在linux平台下的Intel 8254x系列千兆网卡驱动模块的修改,另一个是用户空间对网卡接收的控制程序。
Claims (7)
1.一种加速网卡报文捕获的方法,其特征在于包括以下步骤:
1)修改接收缓冲环初始化函数;
2)屏蔽中断;
3)用户空间内存映射:
(1)查看/proc/iomem取得网卡上寄存器的首地址和地址范围,通过内存映射函数mmap将网卡上寄存器的首地址映射到用户虚拟地址空间,达到在用户空间对网卡上的寄存器进行直接读写;
(2)通过网卡物理首地址和网卡上寄存器的偏移地址获得网卡上特定寄存器的物理地址,将网卡上特定寄存器物理地址映射到用户虚拟地址空间;
(3)用户空间内存映射建立过程和用户空间控制网卡初始化;
(4)用户空间内存映射解除过程;
4)用户空间接收处理过程;
5)相关数据结构定义。
2.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的修改接收缓冲环初始化函数是:
在int e1000_up(structe1000_adapter*adapter)函数中将
for(i=0;i<adapter->num_rx_queues;i++){
structe1000_rx_ring*ring=&adapter->rx_ring[i];
adapter->alloc_rx_buf(adapter,ring,
E1000_DESC_UNUSED(ring));
}
修改为:
for(i=0;i<adapter->num_rx_queues;i++){
struct e1000_rx_ring*ring=&adapter->rx_ring[i];
adapter->alloc_rx_buf(adapter,ring,
E1000_DESC_UNUSED(ring)+1);
}
本修改完成每个接收描述符结构(receive descriptor)对应一块内存缓冲区(MemoryBuffer),内存缓冲区存放接收到的网络数据包。
3.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的屏蔽中断是:
在int e1000_up(struct e1000_adapter*adapter)函数中加入disable_irq(adapter->pdev->irq),函数disable_irq是专门的中断屏蔽函数。
4.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的用户空间内存映射建立过程和用户空间控制网卡初始化是:
void e1000_device_init(struct e1000_device*ether_dev,unsigned int addr)
{
int mem_fd;
unsigned char*mem;
unsigned int rdbal,tdbal;
unsigned int rctl,tctl,ctrl;
unsigned short rdh,rdt,tdh,tdt;
mem fd=open(″/dev/mem″,O_RDWR);
ether dev->fd=mem_fd;
if(mem_fd==-1)
{
printf(″Cannot open/dev/mem\n″);
return;
}
mem=mmap(0,0x20000,PROT_READ|PROT_WRITE,MAP_SHARED,mem_fd,addr);
ether_dev->write_register=mem;
if(mem==MAP_FAILED)
{
printf(″Cannot mmap mem\n″);
return;
}
rdbal=* (unsigned int *)&mem[E1000_RDBAL;
ether_dev->rx_desc=mmap(0,4096,PROT_READ|PROT_WRITE,MAP_SHARED,
mem_fd,rdbal);
if(ether_dev->rx_desc==MAP_FAILED)
{
printf(“Cannot mmap ether_dev->rx_desc\n”);
return;
}
ether_dev->mem_skb=mmap(0,0x40000000,ROT_READ|PROT_WRITE,
MAP_SHARED, mem_fd,0x0);
if(ether_dev->mem_skb==MAP_FAILED)
{
printf(“Cannot mmap ether_dev->rx_desc\n”);
return;
}
ether_dev->count=256;
ether_dev->next_to_clean=0;
ether_dev->next_to_use=255;
ether_dev->rdh=E1000_RDH;
ether_dev->rdt=E1000_RDT;
rctl=*(unsigned int *)&mem[E1000_RCTL];
*(unsigned int *)&mem[E1000_RCTL]=rctl&~E1000_RCTL_EN;
rdh=*(unsigned short *)&mem[E1000_RDH];
rdt=*(unsigned short *)&mem[E1000_RDT];
*(unsigned int*)&mem[E1000_RDLEN]=4096;
*(unsigned short*)&mem[E1000_RDH]=0;
*(unsigned short*)&mem[E1000_RDT]=254;
*(unsigned int*)&mem[E1000_RCTL]=rctl|E1000_RCTL_EN;
}
5.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的用户空间内存映射解除过程是:
void e1000_device_exit(struct e1000_device*ether_dev)
{
munmap(ether_dev->write_register,0x20000);
munmap(ether_dev->mem_skb,0x4000000);
munmap(ether_dev->rx_desc,4096);
close(ether_dev->fd);
}
6.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的用户空间接收处理过程是:
int e1000_clean_rx_irq(struct e1000_device*ether_dev,unsigned char*buf_in,int*length)
{
struct e1000_rx_desc*rx_desc;
unsigned int i,j;
int cleaned_count=0;
int count=0;
unsigned char tdt;
struct e1000_tx_desc*tx_desc;
i=ether_dev->next_to_clean;
rx_desc=E1000_RX_DESC(*ether_dev,i);
while(rx_desc->status & E1000_RXD_STAT_DD)
{
if(++i==ether_dev->count)i=0;
cleaned_count++;
*length=rx_desc->length+4+20;
rx_desc->status=0;
if((cleaned_count>=16))
{
e1000_alloc_rx_buffers(ether_dev,cleaned_count);
count+=cleaned_count;
cleaned_count=0;
}
rx_desc=E1000_RX_DESC(*ether_dev,i);
}
ether_dev->next_to_clean=i;
cleaned_count=E1000_DESC_UNUSED(ether_dev);
if(cleaned_count)
e1000_alloc_rx_buffers(ether_dev,cleaned_count);
count+=cleaned_coun;
return count;
}
void e1000_alloc_rx_buffers(struct e1000_device *ether_dev,int cleaned_count)
{
struct e1000_rx_desc*rx_desc;
unsigned int i;
i=ether_dev->next_to_use;
while(cleaned_count--)
{
if((++i==ether_dev->count))
i=0;
}
if((ether_dev->next_to_use!=i))
{
ether_dev->next_to_use=i;
if ((i--==0))
i=(ether_dev->count-1) ;
*(unsigned short*)ðer_dev->write_register[ether_dev->rdt]=i;
}
}
7.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的相关数据结构定义是:
struct e1000_rx_desc{
u_int64_t buffer_addr;/*Address of the descriptor′s data buffer*/
u_int 16_t length;/*Length of data DMAed into data buffer*/
u_int16_t_csum;/*Packet checksum*/
u_int8_t status;/*Descriptor status*/
u_int8_t errors;;/*Descriptor Errors*/
u_int16_t special;
};
struct e1000_device
{
int fd;
struct e1000_rx_desc*rx_desc;
unsigned int next_to_use;
unsigned int next_to_clean ;
u_int16_t rdh;
u_int16_t rdt;
unsigned int count;
unsigned char*write_register;
unsigned char*mem_skb;
}。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2007101441529A CN101217573B (zh) | 2007-12-29 | 2007-12-29 | 一种加速网卡报文捕获的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2007101441529A CN101217573B (zh) | 2007-12-29 | 2007-12-29 | 一种加速网卡报文捕获的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101217573A true CN101217573A (zh) | 2008-07-09 |
CN101217573B CN101217573B (zh) | 2010-11-24 |
Family
ID=39623935
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2007101441529A Expired - Fee Related CN101217573B (zh) | 2007-12-29 | 2007-12-29 | 一种加速网卡报文捕获的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101217573B (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102541803A (zh) * | 2011-12-31 | 2012-07-04 | 曙光信息产业股份有限公司 | 数据发送方法和计算机 |
CN102681953A (zh) * | 2011-03-15 | 2012-09-19 | 联芯科技有限公司 | 直接存储器存取装置及其数据接收方法 |
CN103441951A (zh) * | 2013-08-19 | 2013-12-11 | 南京邮电大学 | 一种基于网卡驱动的数据包处理优化方法 |
CN103441941A (zh) * | 2013-08-13 | 2013-12-11 | 广东睿江科技有限公司 | 一种基于Linux的高性能数据报文捕获方法和装置 |
CN103885900A (zh) * | 2012-12-20 | 2014-06-25 | 北京华为数字技术有限公司 | 数据访问处理方法、PCIe设备和用户设备 |
CN103916316A (zh) * | 2014-04-11 | 2014-07-09 | 国家计算机网络与信息安全管理中心 | 网络数据包线速捕获方法 |
CN104166614A (zh) * | 2013-05-17 | 2014-11-26 | 腾讯科技(深圳)有限公司 | 一种移动设备的帧率探测方法和相关装置 |
CN106059955A (zh) * | 2016-04-14 | 2016-10-26 | 天津市德力电子仪器有限公司 | 一种基于soc dma的以太网实时抓包方法 |
CN106452979A (zh) * | 2016-12-06 | 2017-02-22 | 郑州云海信息技术有限公司 | 一种在线捕包方法及工具 |
CN108090003A (zh) * | 2017-11-20 | 2018-05-29 | 广东睿江云计算股份有限公司 | 一种基于零拷贝的提升web服务器性能的方法、系统 |
CN108123877A (zh) * | 2016-11-28 | 2018-06-05 | 网宿科技股份有限公司 | 实现非本地网络流量获取的方法、系统及装置 |
CN109857553A (zh) * | 2019-01-11 | 2019-06-07 | 华为技术有限公司 | 内存管理方法及装置 |
CN109951401A (zh) * | 2019-03-26 | 2019-06-28 | 北京翼辉信息技术有限公司 | 基于接收零拷贝的非丢包网卡接收数据的方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100438524C (zh) * | 2005-01-14 | 2008-11-26 | 清华大学 | 基于硬件支持的虚拟接口结构用户层网络通信系统 |
CN1848796A (zh) * | 2005-04-15 | 2006-10-18 | 上海艾泰科技有限公司 | 在实时通信系统中实现快速转发的方法 |
CN100477643C (zh) * | 2006-09-22 | 2009-04-08 | 中国科学院计算技术研究所 | 基于共享内存实现的数据包捕获方法 |
-
2007
- 2007-12-29 CN CN2007101441529A patent/CN101217573B/zh not_active Expired - Fee Related
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102681953A (zh) * | 2011-03-15 | 2012-09-19 | 联芯科技有限公司 | 直接存储器存取装置及其数据接收方法 |
CN102681953B (zh) * | 2011-03-15 | 2015-07-29 | 联芯科技有限公司 | 直接存储器存取装置及其数据接收方法 |
CN102541803A (zh) * | 2011-12-31 | 2012-07-04 | 曙光信息产业股份有限公司 | 数据发送方法和计算机 |
CN103885900B (zh) * | 2012-12-20 | 2017-03-08 | 北京华为数字技术有限公司 | 数据访问处理方法、PCIe设备和用户设备 |
CN103885900A (zh) * | 2012-12-20 | 2014-06-25 | 北京华为数字技术有限公司 | 数据访问处理方法、PCIe设备和用户设备 |
CN104166614A (zh) * | 2013-05-17 | 2014-11-26 | 腾讯科技(深圳)有限公司 | 一种移动设备的帧率探测方法和相关装置 |
CN104166614B (zh) * | 2013-05-17 | 2017-12-15 | 腾讯科技(深圳)有限公司 | 一种移动设备的帧率探测方法和相关装置 |
CN103441941A (zh) * | 2013-08-13 | 2013-12-11 | 广东睿江科技有限公司 | 一种基于Linux的高性能数据报文捕获方法和装置 |
CN103441951A (zh) * | 2013-08-19 | 2013-12-11 | 南京邮电大学 | 一种基于网卡驱动的数据包处理优化方法 |
CN103916316A (zh) * | 2014-04-11 | 2014-07-09 | 国家计算机网络与信息安全管理中心 | 网络数据包线速捕获方法 |
CN106059955A (zh) * | 2016-04-14 | 2016-10-26 | 天津市德力电子仪器有限公司 | 一种基于soc dma的以太网实时抓包方法 |
CN108123877A (zh) * | 2016-11-28 | 2018-06-05 | 网宿科技股份有限公司 | 实现非本地网络流量获取的方法、系统及装置 |
CN106452979A (zh) * | 2016-12-06 | 2017-02-22 | 郑州云海信息技术有限公司 | 一种在线捕包方法及工具 |
CN108090003A (zh) * | 2017-11-20 | 2018-05-29 | 广东睿江云计算股份有限公司 | 一种基于零拷贝的提升web服务器性能的方法、系统 |
CN109857553A (zh) * | 2019-01-11 | 2019-06-07 | 华为技术有限公司 | 内存管理方法及装置 |
CN109857553B (zh) * | 2019-01-11 | 2023-07-28 | 华为云计算技术有限公司 | 内存管理方法及装置 |
CN109951401A (zh) * | 2019-03-26 | 2019-06-28 | 北京翼辉信息技术有限公司 | 基于接收零拷贝的非丢包网卡接收数据的方法 |
CN109951401B (zh) * | 2019-03-26 | 2020-03-13 | 北京翼辉信息技术有限公司 | 基于接收零拷贝的非丢包网卡接收数据的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101217573B (zh) | 2010-11-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101217573B (zh) | 一种加速网卡报文捕获的方法 | |
US7653754B2 (en) | Method, system and protocol that enable unrestricted user-level access to a network interface adapter | |
Deri | nCap: Wire-speed packet capture and transmission | |
US7912082B2 (en) | Shared virtual network interface | |
US9444757B2 (en) | Dynamic configuration of processing modules in a network communications processor architecture | |
US6732307B1 (en) | Apparatus and method for storing trace information | |
CN102347896B (zh) | 一种基于以太网加载fpga和dsp的平台及其实现方法 | |
US7941569B2 (en) | Input/output tracing in a protocol offload system | |
US9639447B2 (en) | Trace data export to remote memory using remotely generated reads | |
CN104572574B (zh) | 基于千兆以太网视觉协议的以太网控制器ip核及方法 | |
US9684583B2 (en) | Trace data export to remote memory using memory mapped write transactions | |
EP3224958A1 (en) | Header parity error handling | |
CN104883335B (zh) | 一种全硬件tcp协议栈实现系统 | |
CN104506379A (zh) | 网络数据捕获方法和系统 | |
CN109412897B (zh) | 基于多核处理器及fpga的共享mac实现系统及方法 | |
US7992206B1 (en) | Pre-scanner for inspecting network traffic for computer viruses | |
CN107800663A (zh) | 流量离线文件的检测方法及装置 | |
US20230127722A1 (en) | Programmable transport protocol architecture | |
CN109889403A (zh) | 一种基于轮询机制的cdn网络流量检测方法 | |
Turner et al. | Integrating new capabilities into NetPIPE | |
US8214553B2 (en) | Virtualization of an input/output device for supporting multiple hosts and functions | |
US8117356B1 (en) | Direct memory access (DMA) transfer of network interface statistics | |
Marian | Operating systems abstractions for software packet processing in datacenters | |
US9288163B2 (en) | Low-latency packet receive method for networking devices | |
Saadé et al. | A system-level overview and comparison of three High-Speed Serial Links: USB 3.0, PCI Express 2.0 and LLI 1.0 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20101124 Termination date: 20121229 |