PFring浅析

来自:https://www.cnblogs.com/lxgeek/p/3893790.html



1.背景

目前收包存在的问题:
第一:inpterrupt livelock, 当收到包的时候,网卡驱动程序就会产生一次中断。在大流量的情况下,操作系统将花费大量时间用于处理中断,而只有
少量的时间用于其他任务。
第二:将包从网卡移动到用户层花费的时间太久。
 
2.PF_RING的目标
1. 充分利用 device polling 机制 
2. 减少内核开销,开辟一条新的通道将收包从网卡传输到用户态
 
其架构图如下:
 
PF_RING实现功能如下:
1. 创建一种新的套接字类型 PF_RING, 用于将收包拷贝到一个环形缓冲区
2. 环形缓冲区和PF_RING套接字一同创建和销毁,各个缓冲区为套接字私有
3.如果一个网卡适配器被PF_RING套接字利用系统调用bind()绑定,这个网卡只能用于只读直到套接字销毁
4.对于PF_RING套接字,收包将会被拷贝到套接字缓冲区或被丢包
5.套接字缓冲区将会利用mmap功能
6.用户态程序通过mmap()系统调用访问套接字缓冲区
7.内核拷贝包到环形队列并移动写指针,用户态程序读包并移动读指针
8.新来的包将会覆盖原有包,因此不需要进行内存的分配和释放
9.套接字的缓冲区的长度和桶大小可被用户配置


以下为项目经验:

1.   进程安装环境

当前的进程在运行在cgsl V4.03.20

 

对应的网卡驱动必须是我们自己提供的,igb必须是4.1.2e1000e2.0.0.1。(数据不通大多数都是网卡驱动的原因)

 

PF_RING驱动安装方式:

PF_RING安装分两部分

1) 内核与库

 这些是随iEPC的安装程序一起装的,不需要特别处理

2) 驱动

这个需要在服务器上手工安装。在以后的版本会发布一个PF_RING的压缩包,上传到服务器,解压后./PF_RING/drivers/PF_RING_aware/intel

 

在这个目录会看到各中intel芯片的驱动,我们通过

ethtool  -i  eth0(网卡名) 查到自己的网卡类型,如上上图中的driversigb

 igb做例子。 到./PF_RING/drivers/PF_RING_aware/intel/igb/src执行命令

make

make install

rmmod  igb && insmod ./igb.ko

通过这3条命令就可以切换到新的PF_RING驱动版本.

注意: 最后一条命令我试过在ssh上一起执行是成功的,不用到服务器上去执行。但因为rmmod igb会断开网络,连续执行不一定能成功。 所以不偷懒的话,还是到服务器上去执行比较安全。

2.   测试网卡收包正确性

 目录:

/PF_RING/userland/examples

Make

./pfcount –i eth1

可以看网卡上的包一直在增加,说明运转正常。

安装

上传*.zip

Unzip *.zip

cd ./kernel

make

insmod pf_ring.ko transparent_mode=0

cd ../userland/

cd lib

make clean

./configure

make

make install

cd ../libpcap

make clean

./configure

make

make install

安装完成后需要pf_ring.ko复制到/zte/hss/libs下,并把insmod pf_ring.ko加入到启动项中。

/etc/rc.local 中加入以下语句。注意pf_ring.ko 必须是绝对路径

insmod  (路径)/pf_ring.ko transparent_mode=0

 

 

具体安装过程

编译安装内核

[root@CGSLOnPC pfring]# cd kernel/

[root@CGSLOnPC kernel]# ls

[root@CGSLOnPC kernel]# make

[root@CGSLOnPC kernel]# cat /etc/klinux-release

TAG_CGS_MAIN_V3_02_00_P3

[root@CGSLOnPC kernel]# pwd

/root/lyq/6120/pfring/kernel

[root@CGSLOnPC kernel]# ls

linux  Makefile  Module.markers  Module.symvers  pf_ring.c  pf_ring.ko  pf_ring.mod.c  pf_ring.mod.o  pf_ring.o  plugins  README

//============insmod pf_ring.ko

[root@CGSLOnPC kernel]# make install

mkdir -p /lib/modules/2.6.18-164.el5/kernel/net/pf_ring

cp *.ko /lib/modules/2.6.18-164.el5/kernel/net/pf_ring

cp linux/pf_ring.h /usr/include/linux

/sbin/depmod 2.6.18-164.el5

编译安装网卡驱动

[root@CGSLOnPC pfring]# cd drivers/

[root@CGSLOnPC drivers]# ls

DNA  Makefile  PF_RING_aware  README.drivers

[root@CGSLOnPC drivers]# cd PF_RING_aware/

[root@CGSLOnPC PF_RING_aware]# ls

2.6.x  broadcom  chelsio  intel  Makefile  README

[root@CGSLOnPC PF_RING_aware]# cd intel/

[root@CGSLOnPC intel]# ls

e1000  e1000e  igb  ixgbe  Makefile  README

[root@CGSLOnPC intel]# ethtool -i eth0

driver: e1000e

version: 1.0.2-k2

firmware-version: 0.4-3

bus-info: 0000:00:19.0

[root@CGSLOnPC intel]# ls

e1000  e1000e  igb  ixgbe  Makefile  README

[root@CGSLOnPC intel]# cd e1000e/

[root@CGSLOnPC e1000e]# ls

e1000e-2.0.0.1

//-----------实际使用的igb的驱动

[root@CGSLOnPC e1000e]# cd e1000e-2.0.0.1/

[root@CGSLOnPC e1000e-2.0.0.1]# ls

COPYING  e1000e.7  e1000e.spec  pci.updates  README  src  SUMS

[root@CGSLOnPC e1000e-2.0.0.1]# cd src

[root@CGSLOnPC src]# make

[root@CGSLOnPC src]# make install

[root@CGSLOnPC src]# ll

[root@CGSLOnPC src]# insmod e1000e.ko

编译安装lib

[root@CGSLOnPC lib]# chmod -R go+wrx ./

[root@CGSLOnPC lib]# ./configure

[root@CGSLOnPC lib]# make

[root@CGSLOnPC lib]# make install

编译安装libpcap

[root@CGSLOnPC libpcap]# chmod -R go+wrx ./

[root@CGSLOnPC libpcap]# ./configure

[root@CGSLOnPC libpcap]# make

[root@CGSLOnPC libpcap]# make install

编译安装libpcap-1.1.1-ring

[root@CGSLOnPC libpcap-1.1.1-ring]# ./configure

[root@CGSLOnPC libpcap-1.1.1-ring]# make

[root@CGSLOnPC libpcap-1.1.1-ring]# make install

库已经自动拷贝到/usr/local/lib

[root@CGSLOnPC PFringTest]# ls /usr/local/lib

libcares.a   libcares.so.2      libpcap.so        libpfring.a   libsbc-kcs.so  libsctp.so         lksctp-tools

libcares.la  libcares.so.2.1.0  libpcap.so.1      libpfring.so  libsctp.a      libsctp.so.1       pkgconfig

libcares.so  libpcap.a          libpcap.so.1.1.1  libsbc-kcs.a  libsctp.la     libsctp.so.1.0.11  valgrind

Makefile中新增链接库

LIBS    += -L../include/fbi/lib_linux64 -lfbclient -L/usr/local/lib/ -lpfring  -L/usr/local/lib/ -lpcap

[root@localhost src]# rmmod igb

[root@localhost lib]# cd /proc/net/pf_ring/

dev/          info          plugins_info  stats/     

[root@localhost kernel]# rmmod pf_ring.ko

[root@localhost kernel]# insmod pf_ring.ko

注意网卡必须配置了IP才能pfring

[root@localhost log]# ethtool -i eth1

driver: igb

version: 4.2.16

firmware-version: 1.63, 0x800009fb, 1.791.0

bus-info: 0000:03:00.0

//-------------不同网卡必须配置不同网段地址,否则对端ARP -a会发现两个网卡的mac会相同,导致无法正常通信

[root@localhost log]# ifconfig

eth0      Link encap:Ethernet  HWaddr 44:39:C4:52:65:93  

          inet addr:172.16.0.201  Bcast:172.16.255.255  Mask:255.255.0.0

          inet6 addr: fe80::4639:c4ff:fe52:6593/64 Scope:Link

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:88161328 errors:0 dropped:0 overruns:0 frame:0

          TX packets:2949088 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:12779067453 (11.9 GiB)  TX bytes:1436770981 (1.3 GiB)

          Interrupt:20 Memory:f7f00000-f7f20000

eth1      Link encap:Ethernet  HWaddr 00:1B:21:13:13:25  

          inet addr:17.16.0.203  Bcast:17.16.0.255  Mask:255.255.255.0

          inet6 addr: fe80::21b:21ff:fe13:1325/64 Scope:Link

          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1

          RX packets:84033962 errors:0 dropped:0 overruns:0 frame:0

          TX packets:519 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:10422366178 (9.7 GiB)  TX bytes:45590 (44.5 KiB)

lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:4946796 errors:0 dropped:0 overruns:0 frame:0

          TX packets:4946796 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:1016417750 (969.3 MiB)  TX bytes:1016417750 (969.3 MiB)

代码

1.IP得到网卡名

2.pfring_open,2500,PF_RING_DO_NOT_PARSE|PF_RING_DO_NOT_TIMESTAMP

3.pfring_set_direction,rx_only_direction

4.pfring_set_socket_mode,recv_only_mode

5.pfring_set_poll_duaration

6.pfring_enable_ring

7.pfing_loop,循环接收,在回调函数中进行处理,

8.回调函数中收到的是以太网包,含mac地址等。


猜你喜欢

转载自blog.csdn.net/lyq_csdn/article/details/80638737