Merge "DRAFT: update yardstick generic test cases dashboard"
[yardstick.git] / yardstick / benchmark / scenarios / networking / pktgen_dpdk_benchmark.bash
1 ##############################################################################
2 # Copyright (c) 2017 Nokia and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9 #!/bin/sh
10
11 set -e
12
13 # Commandline arguments
14 SRC_IP=$1         # source IP address
15 DST_IP=$2         # destination IP address
16 DST_MAC=$3        # destination MAC address
17 NUM_PORTS=$4      # number of source ports
18 PKT_SIZE=$5       # packet size
19 DURATION=$6       # test duration (seconds)
20 RATE=$7           # packet rate in percentage for 10G NIC
21
22 MAX_RATE=100
23
24 # Configuration
25 UDP_SRC_MIN=1000                               # UDP source port min
26 UDP_SRC_MAX=$(( UDP_SRC_MIN + NUM_PORTS - 1 )) # UDP source port max
27 UDP_DST_MIN=1000                               # UDP destination port min
28 UDP_DST_MAX=$(( UDP_DST_MIN + NUM_PORTS ))     # UDP destination port max
29
30 load_modules()
31 {
32     if ! lsmod | grep "uio" &> /dev/null; then
33         modprobe uio
34     fi
35
36     if ! lsmod | grep "igb_uio" &> /dev/null; then
37         insmod /dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
38     fi
39
40     if ! lsmod | grep "rte_kni" &> /dev/null; then
41         insmod /dpdk/x86_64-native-linuxapp-gcc/kmod/rte_kni.ko
42     fi
43 }
44
45 change_permissions()
46 {
47     chmod 777 /sys/bus/pci/drivers/virtio-pci/*
48     chmod 777 /sys/bus/pci/drivers/igb_uio/*
49 }
50
51 add_interface_to_dpdk(){
52     interfaces=$(lspci |grep Eth |tail -n +2 |awk '{print $1}')
53     /dpdk/usertools/dpdk-devbind.py --bind=igb_uio $interfaces &> /dev/null
54 }
55
56 create_pktgen_config_lua()
57 {
58     lua_file="/home/ubuntu/pktgen_tput.lua"
59     touch $lua_file
60     chmod 777 $lua_file
61
62     cat << EOF > "/home/ubuntu/pktgen_tput.lua"
63 package.path = package.path ..";?.lua;test/?.lua;app/?.lua;"
64
65  -- require "Pktgen";
66 function pktgen_config()
67
68   pktgen.screen("off");
69
70   pktgen.set_ipaddr("0", "src", "$SRC_IP/24");
71   pktgen.set_ipaddr("0", "dst", "$DST_IP");
72   pktgen.set_mac("0", "$DST_MAC");
73   pktgen.set("all", "sport", $UDP_SRC_MIN);
74   pktgen.set("all", "dport", $UDP_DST_MIN);
75   pktgen.set("all", "size", $PKT_SIZE);
76   pktgen.set("all", "rate", $RATE);
77   pktgen.set_type("all", "ipv4");
78   pktgen.set_proto("all", "udp");
79
80   pktgen.src_ip("0", "start", "$SRC_IP");
81   pktgen.src_ip("0", "inc", "0.0.0.0");
82   pktgen.src_ip("0", "min", "$SRC_IP");
83   pktgen.src_ip("0", "max", "$SRC_IP");
84   pktgen.dst_ip("0", "start", "$DST_IP");
85   pktgen.dst_ip("0", "inc", "0.0.0.0");
86   pktgen.dst_ip("0", "min", "$DST_IP");
87   pktgen.dst_ip("0", "max", "$DST_IP");
88
89   pktgen.dst_mac("0", "start", "$DST_MAC");
90
91   pktgen.src_port("all", "start", $UDP_SRC_MIN);
92   pktgen.src_port("all", "inc", 1);
93   pktgen.src_port("all", "min", $UDP_SRC_MIN);
94   pktgen.src_port("all", "max", $UDP_SRC_MAX);
95   pktgen.dst_port("all", "start", $UDP_DST_MIN);
96   pktgen.dst_port("all", "inc", 1);
97   pktgen.dst_port("all", "min", $UDP_DST_MIN);
98   pktgen.dst_port("all", "max", $UDP_DST_MAX);
99
100   pktgen.pkt_size("all", "start", $PKT_SIZE);
101   pktgen.pkt_size("all", "inc",0);
102   pktgen.pkt_size("all", "min", $PKT_SIZE);
103   pktgen.pkt_size("all", "max", $PKT_SIZE);
104   pktgen.ip_proto("all", "udp");
105   pktgen.set_range("all", "on");
106
107   pktgen.start("all");
108   pktgen.sleep($DURATION)
109   pktgen.stop("all");
110   pktgen.sleep(1)
111
112   prints("opackets", pktgen.portStats("all", "port")[0].opackets);
113   prints("oerrors", pktgen.portStats("all", "port")[0].oerrors);
114
115   end
116
117 pktgen_config()
118 EOF
119 }
120
121
122 create_expect_file()
123 {
124     expect_file="/home/ubuntu/pktgen_tput.exp"
125     touch $expect_file
126     chmod 777 $expect_file
127
128     cat << 'EOF' > "/home/ubuntu/pktgen_tput.exp"
129 #!/usr/bin/expect
130
131 set blacklist  [lindex $argv 0]
132 spawn ./app/app/x86_64-native-linuxapp-gcc/pktgen -c 0x0f -n 4 -b $blacklist -- -P -m "{2-3}.0" -f /home/ubuntu/pktgen_tput.lua
133 expect "Pktgen"
134 send "on\n"
135 expect "Pktgen"
136 send "page main\n"
137 expect "Pktgen"
138 sleep 1
139 send "quit\n"
140 expect "#"
141
142 EOF
143
144 }
145
146 run_pktgen()
147 {
148     blacklist=$(lspci |grep Eth |awk '{print $1}'|head -1)
149     cd /pktgen-dpdk
150     result_log="/home/ubuntu/result.log"
151     touch $result_log
152     sudo expect /home/ubuntu/pktgen_tput.exp $blacklist > $result_log 2>&1
153 }
154
155 # write the result to stdout in json format
156 output_json()
157 {
158     sent=0
159     result_pps=0
160     errors=0
161
162     sent=$(cat ~/result.log -vT | grep "Tx Pkts" | tail -1 | awk '{match($0,/\[18;20H +[0-9]+/)} {print substr($0,RSTART,RLENGTH)}' | awk '{if ($2 != 0) print $2}')
163     result_pps=$(( sent / DURATION ))
164     errors=$(cat ~/result.log -vT |grep "Errors Rx/Tx" | tail -1 | awk '{match($0,/\[16;20H +[0-9]+\/+[0-9]+/)} {print substr($0,RSTART,RLENGTH)}' | cut -d '/' -f2)
165
166     flows=$(( NUM_PORTS * (NUM_PORTS + 1) ))
167
168     echo '{ "packets_sent"':${sent} , '"packets_per_second"':${result_pps}, '"flows"':${flows}, '"errors"':${errors} '}'
169 }
170
171 main()
172 {
173     if ip a | grep eth2 >/dev/null 2>&1; then
174         ip link set eth2 down
175     fi
176
177     if ip a | grep eth1 >/dev/null 2>&1; then
178         ip link set eth1 down
179         load_modules
180         change_permissions
181         add_interface_to_dpdk
182     fi
183
184     if [ $RATE -gt $MAX_RATE ]; then
185         RATE=$MAX_RATE
186     fi
187
188     create_pktgen_config_lua
189     create_expect_file
190
191     run_pktgen
192
193     output_json
194 }
195
196 main