pktgen: http://dpdk.org/browse/apps/pktgen-dpdk/refs/
git clone git://dpdk.org/apps/pktgen-dpdk
pktgen doc:http://pktgen-dpdk.readthedocs.io/en/latest/
OS:Linux D128 3.10.0-693.el7.x86_64
OS2: Linux D129 3.10.0-327.el7.x86_64
dpdk: dpdk-stable-18.02.1/
pktgen: pktgen-3.5.0/
為了讓彼此兼容,選了官網上最新的兩個版本。
可以用:
lua腳本
或 seq命令
指定包序列,但是不能指定seq,ack等,所以還是無法模擬一個tcp握手過程。
http://pktgen-dpdk.readthedocs.io/en/latest/commands.html#runtime-options-and-commands
http://pktgen-dpdk.readthedocs.io/en/latest/lua.html#lua
tcpreplay:
http://tcpreplay.appneta.com/wiki/overview.html
可以用netmap驅動做高流量。
----------------------------------- update @ 20180602 ---------------------
Pktgen Ver: 3.5.1 (DPDK 18.05.0-rc6)
不指定core和端口map時,不好用
[root@D129 pktgen]# ./app/x86_64-native-linuxapp-gcc/pktgen -l1,2,3 --master-lcore 1 -- -m 2.0
查看seq:
Pktgen:/> page seq
加載seq,lua腳本
Pktgen:/> script /root/tong.lua
可以看見如下更新:
/ <Sequence Page> Copyright (c) <2010-2017>, Intel Corporation Port: 0, Sequence Count: 2 of 16 GTPu Seq: Dst MAC Src MAC Dst IP Src IP Port S/D Protocol:VLAN CoS ToS Size TEID * 0: 00:11:44:55:66:77 00:11:12:34:56:78 1.1.1.1 0.0.0.0/0 9999/80 IPv4/TCP:0001 5 6 128 0 * 1: 00:11:12:34:56:78 00:11:44:55:66:77 2.2.2.2 0.0.0.0/0 80/9999 IPv4/TCP:0001 5 6 128 0
tong.lua
[root@D129 ~]# cat tong.lua -- Lua uses '--' as comment to end of line read the -- manual for more comment options. local seq_table_0 = { -- entries can be in any order ["eth_dst_addr"] = "0011:4455:6677", ["eth_src_addr"] = "0011:1234:5678", ["ip_dst_addr"] = "1.1.1.1", ["ip_src_addr"] = "2.2.2.2", -- the 16 is the size of the mask value ["sport"] = 9999, -- Standard port numbers ["dport"] = 80, -- Standard port numbers ["ethType"] = "ipv4", -- ipv4|ipv6|vlan ["ipProto"] = "tcp", -- udp|tcp|icmp ["vlanid"] = 1, -- 1 - 4095 ["pktSize"] = 128, -- 64 - 1518 ["teid"] = 3, ["cos"] = 5, ["tos"] = 6 }; pktgen.seqTable(0, "0", seq_table_0 ); local seq_table_1 = { -- entries can be in any order ["eth_dst_addr"] = "0011:1234:5678", ["eth_src_addr"] = "0011:4455:6677", ["ip_dst_addr"] = "2.2.2.2", ["ip_src_addr"] = "1.1.1.1", -- the 16 is the size of the mask value ["sport"] = 80, -- Standard port numbers ["dport"] = 9999, -- Standard port numbers ["ethType"] = "ipv4", -- ipv4|ipv6|vlan ["ipProto"] = "tcp", -- udp|tcp|icmp ["vlanid"] = 1, -- 1 - 4095 ["pktSize"] = 128, -- 64 - 1518 ["teid"] = 3, ["cos"] = 5, ["tos"] = 6 }; pktgen.seqTable(1, "0", seq_table_1 ); pktgen.set("0", "seq_cnt", 2);
發包:
Pktgen:/> page main Pktgen:/> start 0
正常情況下,能正常的發出了包。
20:55:57.233082 IP 0.0.0.0.9999 > 1.1.1.1.80: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP 20:55:57.233088 IP 0.0.0.0.9999 > 1.1.1.1.80: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP 20:55:57.233094 IP 0.0.0.0.9999 > 1.1.1.1.80: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP 20:55:57.233100 IP 0.0.0.0.80 > 2.2.2.2.9999: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP
目的IP,與預期不符。
--------------------- update @ 20180603 ----------------------
配置方法二:
創建文件cfg/tong.cfg
[root@D129 pktgen]# cat cfg/tong.cfg setup = { 'devices' : ['00:04.0'], 'opts' : ['-b igb_uio'] } run = { 'app_name': 'pktgen', 'app_path': [ './app/%(target)s/%(app_name)s', '%(sdk)s/%(target)s/app/%(app_name)s', ], 'dpdk' : ( '-l 1,2', '--master-lcore 1', '-w 00:04.0' ), 'app' : ( '-T', '-m 2.0', '-f workspace/tong.lua' ), }
使用 腳本啟動:
[root@D129 pktgen]# ./tools/dpdk-run.py tong
-------------------- update @ 2018-08-23 --------------
dpdk: git::v18.08
pktgen: git::vpktgen-3.5.2
1. make dpdk
2. make pktgen
3. run:
[root@T9 pktgen-dpdk.git]# ./tools/run.py tong
4. 使用pcap
修改配置文件:
[root@T9 pktgen-dpdk.git]# cat cfg/tong.cfg setup = { 'devices' : ['00:04.0'], 'opts' : ['-b igb_uio'] } run = { 'app_name': 'pktgen', 'app_path': [ './app/%(target)s/%(app_name)s', '%(sdk)s/%(target)s/app/%(app_name)s', ], 'dpdk' : ( '-l 1,2', '--master-lcore 1', '-w 00:04.0' ), 'app' : ( '-T', '-m 2.0', '-f tong.lua' # '-s 0:/root/80-client.pcap' ), 'misc': ( '-f', 'themes/black-yellow2.theme' ) }
這個時候,就可以把pcap中的包重放出來了.
5. random
執行命令:
Pktgen:/> enable 0 random Pktgen:/> set 0 rnd 1 26 111111111111xxxx
源IP被修改為了 255.255.255.xxx, xxx為隨機數.
查看輸出結果:
但是, 不能做基於流的修改....
------------------- update @ 2018-08-04 ----------------------
[tcpreplay] tcpreplay高級用法--使用tcpreplay-edit進行循環動態發包
即使netmap + tcpreplay-edit 也不能滿足需求. 因為 --unique-ip 參數的做法是源IP加一, 目的IP減一. 當時不能保證目的IP不變. 也不滿足我們的LB測試需求.
看來... 只能自己寫一個了...