声明:此文档只做学习交流使用,请勿用作其他商业用途
author:朝阳_tony
E-mail : linzhaolover@gmail.com
Create Date: 2013-5-3 14:24:00 Friday
Last Change: 2013-7-29 10:25:19 Monday
转载请注明出处:http://blog.csdn.net/linzhaolove
此文请结合intel dpdk源码去阅读,源码可以去http://dpdk.org/dev 网页中下载;更多官方文档请访问http://dpdk.org
1、程序的作用
l2fwd 应该是 网络的L2 数据的转发功能;L2是数据链路层,以mac的地址作为区分数据源和目标地址;而这个l2fwd就时将网卡的数据进行转发;
2、程序的运行方法
$> ./build/l2fwd [EAL options] -- -p PORTMASK [-q NQ] -T PERIOD
EAL options:
-c COREMASK: A hexadecimal bitmask of cores to run on
-n NUM : Number of memory channels
-p PORTMASK : A hexadecimal bitmask of the ports to configure
-q NQ: A number of queues (=ports) per lcore (default is 1)
-T PERIOD: statistics will be refreshed each PERIOD seconds (0 to disable, 10 default, 86400 maximum)
Example:
$> ./build/l2fwd -c f -n 2 -- -q 1 -p 0x3
参数讲解:
-c f 指分配4个core给dpdk程序,这个参数是主参数,必须设定;
-n 2 指内存通道数
-- 由于程序有主次参数之分,主参数是在指所有实例程序都可以用的参数;次参数,是指每个实例程序自身拥有的参数, -- 之后的为次参数;
-p 0x3 设置dpdk起点的端口数,也是以16进制的源码作为标志位, 0x3是指 后两位为1,也就是起点两个端口;
-q 1 是只每个端口所拥有的的发送和接收队列是多几个,默认是1个,也就是收在一个队列中收,发在一个队列中发;
-T 在执行程序的时候,会有一些统计数据打印到屏幕上,这个的 参数是设定多长时间统计一次,显示到屏幕,模式是10秒钟一次;
3、程序的实现架构
待续……
4、程序的调用关系
待续……
5、程序的测试方法
我目前使用的是linux 自带的发包工具pktgen ;网上有很多pktgen发包工具的教程,这我就不讲它的使用了;
首先要挂载pktgen;
$ > modprobe pktgen
编写自己的pktgen 脚本;
#!/bin/sh
# pktgen.conf -- Sample configuration for send on two devices on a UP system
#modprobe pktgen
#modprobe pktgen
function pgset() {
local result
echo $1 > $PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
function pg() {
echo inject > $PGDEV
cat $PGDEV
}
# On UP systems only one thread exists -- so just add devices
# We use eth1, eth2
echo "Adding devices to run".
PGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all"
pgset "add_device eth1"
pgset "max_before_softirq 10000"
#pgset "add_device eth1"
# Configure the individual devices
echo "Configuring devices"
PGDEV=/proc/net/pktgen/eth1
#pgset "delay 0"
pgset "clone_skb 1000000"
pgset "pkt_size 60"
#pgset "min_pkt_size 60"
#pgset "max_pkt_size 60"
#pgset "min_pkt_size 92"
#pgset "max_pkt_size 92"
pgset "src_mac e4:1f:13:68:a7:06"
pgset "dst_mac e4:1f:13:68:a7:04"
pgset "count 10000000"
# Time to run
PGDEV=/proc/net/pktgen/pgctrl
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"
cat /proc/net/pktgen/eth1
我的eth1 是BCM5709 网卡, 我的intel网卡是82576 ,当运行起 l2fwd测试程序后,程序就会自动隐藏intel网卡应有的端口号,这时我只能看到我的eth1,因此我也只能通过我偶的eth1去发送数据包 ;
打印输出我偶的测试结果;
cat /proc/net/pktgen/eth1
# ./pktgen.sh
Adding devices to run.
Configuring devices
Running... ctrl^C to stop
Done
Params: count 10000000 min_pkt_size: 60 max_pkt_size: 60
frags: 0 delay: 0 clone_skb: 1000000 ifname: eth1
flows: 0 flowlen: 0
queue_map_min: 0 queue_map_max: 0
dst_min: dst_max:
src_min: src_max:
src_mac: e4:1f:13:68:a7:06 dst_mac: 00:16:31:ff:d0:74
udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9
src_mac_count: 0 dst_mac_count: 0
Flags:
Current:
pkts-sofar: 10000000 errors: 0
started: 79696343012us stopped: 79707271930us idle: 2185875us
seq_num: 10000001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0
cur_saddr: 0x7d03a8c0 cur_daddr: 0x0
cur_udp_dst: 9 cur_udp_src: 9
cur_queue_map: 0
flows: 0
Result: OK: 10928918(c8743042+d2185875) usec, 10000000 (60byte,0frags)
915003pps 439Mb/sec (439201440bps) errors: 0
915003pps 439Mb/sec
是pktgen的测试结果,前面是包的转发率,后面是数据的吞吐率;由于我只能拿到pktgen端的测试数据,所以没有办法有效的衡量l2fwd的性能,l2fwd似乎也没有有效的输出结果信息;我不知道该怎样弄才好;
待续。。。。。。
技术水平有待提高,如果文章有错误的地方希望读者指正,相互交流,互相学习;O(∩_∩)O~