]> git.proxmox.com Git - mirror_ovs.git/blame - tests/pmd.at
ovn: Mention distributed NAT in NEWS
[mirror_ovs.git] / tests / pmd.at
CommitLineData
589dd1d5
IM
1AT_BANNER([PMD])
2
a12e2a88
DDP
3m4_divert_push([PREPARE_TESTS])
4
5# Given the output of `ovs-appctl dpif-netdev/pmd-rxq-show`, prints a list
6# of every rxq (one per line) in the form:
7# port_name rxq_id numa_id core_id
8parse_pmd_rxq_show () {
9 awk '/pmd/ {numa=$4; core=substr($6, 1, length($6) - 1)} /\t/{for (i=4; i<=NF; i++) print $2, $i, numa, core}' | sort
10}
11
12# Given the output of `ovs-appctl dpctl/dump-flows`, prints a list of flows
13# (one per line), with the pmd_id at the beginning of the line
14#
15flow_dump_prepend_pmd () {
16 awk '/flow-dump from non-dpdk/ {pmd_id=-1; next} /flow-dump from pmd/ {pmd_id=$7; next} {print pmd_id, $0}' | sort
17}
18
19m4_divert_pop([PREPARE_TESTS])
20
589dd1d5
IM
21dnl CHECK_CPU_DISCOVERED([n_cpu])
22dnl
23dnl Waits until CPUs discovered and checks if number of discovered CPUs
24dnl is greater or equal to 'n_cpu'. Without parameters checks that at
25dnl least one CPU discovered.
26m4_define([CHECK_CPU_DISCOVERED], [
27 PATTERN="Discovered [[0-9]]* NUMA nodes and [[0-9]]* CPU cores"
3a21992e
PB
28 OVS_WAIT_UNTIL([grep "$PATTERN" ovs-vswitchd.log])
29 N_CPU=$(grep "$PATTERN" ovs-vswitchd.log | sed -e 's/.* \([[0-9]]*\) CPU cores/\1/')
589dd1d5
IM
30 if [[ -z "$1" ]]
31 then AT_CHECK([test "$N_CPU" -gt "0"])
32 else AT_SKIP_IF([test "$N_CPU" -lt "$1"])
33 fi
34])
35
36dnl CHECK_PMD_THREADS_CREATED([n_threads], [numa_id], [+line])
37dnl
38dnl Whaits for creation of 'n_threads' or at least 1 thread if $1 not
39dnl passed. Checking starts from line number 'line' in ovs-vswithd.log .
40m4_define([CHECK_PMD_THREADS_CREATED], [
41 PATTERN="Created [[0-9]]* pmd threads on numa node $2"
42 line_st=$3
43 if [[ -z "$line_st" ]]
44 then
45 line_st="+0"
46 fi
47 OVS_WAIT_UNTIL([tail -n $line_st ovs-vswitchd.log | grep "$PATTERN"])
48 N_THREADS=$(tail -n $line_st ovs-vswitchd.log | grep "$PATTERN" | tail -1 | sed -e 's/.* \([[0-9]]*\) pmd .*/\1/')
49 if [[ -z "$1" ]]
50 then AT_CHECK([test "$N_THREADS" -gt 0])
51 else AT_CHECK([test "$N_THREADS" -eq "$1"])
52 fi
53])
54
55m4_define([SED_NUMA_CORE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id \)[[0-9]]*:/\1<cleared>\2<cleared>:/"])
b9584f21 56m4_define([DUMMY_NUMA], [--dummy-numa="0,0,0,0"])
589dd1d5
IM
57
58AT_SETUP([PMD - creating a thread/add-port])
59OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy-pmd], [], [], [DUMMY_NUMA])
60
61CHECK_CPU_DISCOVERED()
62CHECK_PMD_THREADS_CREATED()
63
64AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
65pmd thread numa_id <cleared> core_id <cleared>:
3eb67853 66 isolated : false
589dd1d5
IM
67 port: p0 queue-id: 0
68])
69
70AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
71dummy@ovs-dummy: hit:0 missed:0
72 br0:
e98d0cb3 73 br0 65534/100: (dummy-internal)
589dd1d5
IM
74 p0 1/1: (dummy-pmd: configured_rx_queues=1, configured_tx_queues=<cleared>, requested_rx_queues=1, requested_tx_queues=<cleared>)
75])
76
77OVS_VSWITCHD_STOP
78AT_CLEANUP
79
80AT_SETUP([PMD - multiqueue support])
81OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy-pmd], [], [], [DUMMY_NUMA])
82
83CHECK_CPU_DISCOVERED()
84CHECK_PMD_THREADS_CREATED()
85
86AT_CHECK([ovs-vsctl set interface p0 options:n_rxq=8])
87
88AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
89dummy@ovs-dummy: hit:0 missed:0
90 br0:
e98d0cb3 91 br0 65534/100: (dummy-internal)
589dd1d5
IM
92 p0 1/1: (dummy-pmd: configured_rx_queues=8, configured_tx_queues=<cleared>, requested_rx_queues=8, requested_tx_queues=<cleared>)
93])
94
95AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
96pmd thread numa_id <cleared> core_id <cleared>:
3eb67853 97 isolated : false
589dd1d5
IM
98 port: p0 queue-id: 0 1 2 3 4 5 6 7
99])
100
101OVS_VSWITCHD_STOP
102AT_CLEANUP
103
104
105AT_SETUP([PMD - pmd-cpu-mask/distribution of rx queues])
106OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy-pmd options:n_rxq=8],
107 [], [], [DUMMY_NUMA])
108
109CHECK_CPU_DISCOVERED(2)
110CHECK_PMD_THREADS_CREATED()
111
112AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
113dummy@ovs-dummy: hit:0 missed:0
114 br0:
e98d0cb3 115 br0 65534/100: (dummy-internal)
589dd1d5
IM
116 p0 1/1: (dummy-pmd: configured_rx_queues=8, configured_tx_queues=<cleared>, requested_rx_queues=8, requested_tx_queues=<cleared>)
117])
118
119AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
120pmd thread numa_id <cleared> core_id <cleared>:
3eb67853 121 isolated : false
589dd1d5
IM
122 port: p0 queue-id: 0 1 2 3 4 5 6 7
123])
124
125TMP=$(cat ovs-vswitchd.log | wc -l | tr -d [[:blank:]])
3fa215b1 126AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x3])
589dd1d5
IM
127CHECK_PMD_THREADS_CREATED([2], [], [+$TMP])
128
129AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
130pmd thread numa_id <cleared> core_id <cleared>:
3eb67853 131 isolated : false
589dd1d5
IM
132 port: p0 queue-id: 0 2 4 6
133pmd thread numa_id <cleared> core_id <cleared>:
3eb67853 134 isolated : false
589dd1d5
IM
135 port: p0 queue-id: 1 3 5 7
136])
137
138TMP=$(cat ovs-vswitchd.log | wc -l | tr -d [[:blank:]])
3fa215b1 139AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x1])
589dd1d5
IM
140CHECK_PMD_THREADS_CREATED([1], [], [+$TMP])
141
142AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
143pmd thread numa_id <cleared> core_id <cleared>:
3eb67853 144 isolated : false
589dd1d5
IM
145 port: p0 queue-id: 0 1 2 3 4 5 6 7
146])
147
148OVS_VSWITCHD_STOP
149AT_CLEANUP
150
151
152AT_SETUP([PMD - stats])
153OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 ofport_request=7 type=dummy-pmd options:n_rxq=4],
154 [], [], [DUMMY_NUMA])
155
156CHECK_CPU_DISCOVERED()
157CHECK_PMD_THREADS_CREATED()
158
159AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg])
160AT_CHECK([ovs-ofctl add-flow br0 action=normal])
161
162sleep 1
163
164AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
165dummy@ovs-dummy: hit:0 missed:0
166 br0:
e98d0cb3 167 br0 65534/100: (dummy-internal)
589dd1d5
IM
168 p0 7/1: (dummy-pmd: configured_rx_queues=4, configured_tx_queues=<cleared>, requested_rx_queues=4, requested_tx_queues=<cleared>)
169])
170
3453b4d6 171AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 5], [0], [dnl
589dd1d5
IM
172pmd thread numa_id <cleared> core_id <cleared>:
173 emc hits:0
174 megaflow hits:0
3453b4d6 175 avg. subtable lookups per hit:0.00
589dd1d5
IM
176 miss:0
177 lost:0
178])
179
180ovs-appctl time/stop
181ovs-appctl time/warp 100
182(
183for i in `seq 0 19`;
184 do
185 pkt="in_port(7),eth(src=50:54:00:00:00:77,dst=50:54:00:00:01:78),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)"
186 AT_CHECK([ovs-appctl netdev-dummy/receive p0 $pkt])
187 done
188)
189ovs-appctl time/warp 100
190
191AT_CHECK([grep -A 1 'miss upcall' ovs-vswitchd.log | tail -n 1], [0], [dnl
5cf3edb3 192skb_priority(0),skb_mark(0),ct_state(0),ct_zone(0),ct_mark(0),ct_label(0),recirc_id(0),dp_hash(0),in_port(1),eth(src=50:54:00:00:00:77,dst=50:54:00:00:01:78),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)
589dd1d5
IM
193])
194AT_CHECK([cat ovs-vswitchd.log | filter_flow_install | strip_xout], [0], [dnl
9044f2c1 195recirc_id(0),in_port(1),eth(src=50:54:00:00:00:77,dst=50:54:00:00:01:78),eth_type(0x0800),ipv4(frag=no), actions: <del>
589dd1d5
IM
196])
197
3453b4d6 198AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 5], [0], [dnl
589dd1d5
IM
199pmd thread numa_id <cleared> core_id <cleared>:
200 emc hits:19
201 megaflow hits:0
3453b4d6 202 avg. subtable lookups per hit:0.00
589dd1d5
IM
203 miss:1
204 lost:0
205])
206
207OVS_VSWITCHD_STOP
208AT_CLEANUP
a12e2a88
DDP
209
210dnl Reconfigure the number of rx queues of a port, make sure that all the
211dnl queues are polled by the datapath and try to send a couple of packets.
212AT_SETUP([PMD - reconfigure n_rxq])
213OVS_VSWITCHD_START(
214 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=2 -- \
215 add-port br0 p2 -- set Interface p2 type=dummy-pmd ofport_request=2
216], [], [], [--dummy-numa 0])
217AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
218
219AT_CHECK([ovs-ofctl add-flow br0 action=controller])
220
221AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
222p1 0 0 0
223p1 1 0 0
224p2 0 0 0
225])
226
227AT_CAPTURE_FILE([ofctl_monitor.log])
228AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
229
230AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
231
232OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
233OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
234
235AT_CHECK([cat ofctl_monitor.log], [0], [dnl
efe179e0 236NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88
DDP
237icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
238])
239
240AT_CHECK([ovs-vsctl set interface p1 options:n_rxq=4])
241
242AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
243p1 0 0 0
244p1 1 0 0
245p1 2 0 0
246p1 3 0 0
247p2 0 0 0
248])
249
250AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
251
252AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 3 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
253
254OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
255OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
256
257AT_CHECK([cat ofctl_monitor.log], [0], [dnl
efe179e0 258NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88
DDP
259icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
260])
261
2a21e757
IM
262dnl Check resetting to default number of rx queues after removal from the db.
263AT_CHECK([ovs-vsctl remove interface p1 options n_rxq])
264
265AT_CHECK([ovs-appctl dpif/show | grep p1 | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
266 p1 1/1: (dummy-pmd: configured_rx_queues=1, configured_tx_queues=<cleared>, requested_rx_queues=1, requested_tx_queues=<cleared>)
267])
268
a12e2a88
DDP
269OVS_VSWITCHD_STOP
270AT_CLEANUP
271
272dnl There was a bug where OVS failed to create a ukey and install a megaflow
273dnl if a packet with the exact same flow was received by two different pmd
274dnl threads. This is a regression test for that bug.
275AT_SETUP([PMD - same flow multiple threads])
276OVS_VSWITCHD_START(
277 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=2 -- \
278 set Open_vSwitch . other_config:pmd-cpu-mask=3
279], [], [], [--dummy-numa 0,0])
280AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
281
282AT_CHECK([ovs-ofctl add-flow br0 action=controller])
283
284dnl Make sure that the queues are on different cores. There's no way to
285dnl control which queue is on which thread, we just need to make sure that
286dnl two threads (core_id) show up in pmd-rxq-show
287AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 4 -d ' ' | sort], [0], [dnl
2880
2891
290])
291
292AT_CAPTURE_FILE([ofctl_monitor.log])
293AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
294
295AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
296
297AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
298
299OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
300OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
301
302dnl Make sure that both flows have been installed
303AT_CHECK([ovs-appctl dpctl/dump-flows | flow_dump_prepend_pmd], [0], [dnl
3040 recirc_id(0),in_port(1),eth_type(0x0800),ipv4(frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
3051 recirc_id(0),in_port(1),eth_type(0x0800),ipv4(frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
306])
307
308AT_CHECK([cat ofctl_monitor.log], [0], [dnl
efe179e0 309NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88 310icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
efe179e0 311NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88
DDP
312icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
313])
314
315OVS_VSWITCHD_STOP
316AT_CLEANUP
317
318AT_SETUP([PMD - change numa node])
319OVS_VSWITCHD_START(
320 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=2 -- \
321 add-port br0 p2 -- set Interface p2 type=dummy-pmd ofport_request=2 options:n_rxq=2 -- \
322 set Open_vSwitch . other_config:pmd-cpu-mask=3
323], [], [], [--dummy-numa 0,1])
324AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
325
326AT_CHECK([ovs-ofctl add-flow br0 action=controller])
327
328AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
329p1 0 0 0
330p1 1 0 0
331p2 0 0 0
332p2 1 0 0
333])
334
335AT_CAPTURE_FILE([ofctl_monitor.log])
336AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
337
338AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
339
340AT_CHECK([ovs-appctl netdev-dummy/receive p2 --qid 1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
341
342OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
343OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
344
345AT_CHECK([cat ofctl_monitor.log], [0], [dnl
efe179e0 346NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88 347icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
efe179e0 348NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=2 (via action) data_len=42 (unbuffered)
a12e2a88
DDP
349icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
350])
351
352AT_CHECK([ovs-vsctl set Interface p2 options:numa_id=1])
353
354AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
355p1 0 0 0
356p1 1 0 0
357p2 0 1 1
358p2 1 1 1
359])
360
361AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
362
363AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
364
365AT_CHECK([ovs-appctl netdev-dummy/receive p2 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
366
367OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
368OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
369
370AT_CHECK([cat ofctl_monitor.log], [0], [dnl
efe179e0 371NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88 372icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
efe179e0 373NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=2 (via action) data_len=42 (unbuffered)
a12e2a88
DDP
374icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
375])
376
377OVS_VSWITCHD_STOP
378AT_CLEANUP
379
380AT_SETUP([PMD - non pmd device])
381OVS_VSWITCHD_START(
382 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=1 -- \
383 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
384 set Interface br0 options:tx_pcap=br0.pcap -- \
385 set Open_vSwitch . other_config:pmd-cpu-mask=1
386], [], [], [--dummy-numa 0,0])
387AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
388
389AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL])
390
391AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
392p1 0 0 0
393])
394
395AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
396
397AT_CHECK([ovs-appctl netdev-dummy/receive p2 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
398
399OVS_WAIT_UNTIL([test `ovs-pcap br0.pcap | wc -l` -ge 2])
400
401AT_CHECK([ovs-pcap br0.pcap], [0], [dnl
efe179e0
DDP
40250540000000a50540000000908004500001c00000000400166df0a0000020a0000010800f7ff00000000
40350540000000a50540000000908004500001c00000000400166df0a0000020a0000010800f7ff00000000
a12e2a88
DDP
404])
405
406AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=2])
407
408AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
409p1 0 0 1
410])
411
412AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
413
414AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
415
416AT_CHECK([ovs-appctl netdev-dummy/receive p2 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
417
418OVS_WAIT_UNTIL([test `ovs-pcap br0.pcap | wc -l` -ge 4])
419
420AT_CHECK([ovs-pcap br0.pcap], [0], [dnl
efe179e0
DDP
42150540000000a50540000000908004500001c00000000400166df0a0000020a0000010800f7ff00000000
42250540000000a50540000000908004500001c00000000400166df0a0000020a0000010800f7ff00000000
42350540000000a50540000000908004500001c00000000400166df0a0000020a0000010800f7ff00000000
42450540000000a50540000000908004500001c00000000400166df0a0000020a0000010800f7ff00000000
a12e2a88
DDP
425])
426
427OVS_VSWITCHD_STOP
428AT_CLEANUP
429
430AT_SETUP([PMD - add remove ports])
431OVS_VSWITCHD_START(
432 [], [], [], [--dummy-numa 0,0])
433AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
434
435AT_CHECK([ovs-ofctl add-flow br0 actions=controller])
436
437AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=1])
438
439AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
440p1 0 0 0
441])
442
443AT_CAPTURE_FILE([ofctl_monitor.log])
444AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
445
446AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
447
448OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
449OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
450
451AT_CHECK([cat ofctl_monitor.log], [0], [dnl
efe179e0 452NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88
DDP
453icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
454])
455
456AT_CHECK([ovs-vsctl del-port br0 p1])
457AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=1])
458
459AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
460
461AT_CHECK([ovs-appctl netdev-dummy/receive p1 --qid 0 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
462
463OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
464OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
465
466AT_CHECK([cat ofctl_monitor.log], [0], [dnl
efe179e0 467NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
a12e2a88
DDP
468icmp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0 icmp_csum:f7ff
469])
470
471OVS_VSWITCHD_STOP
472AT_CLEANUP
5e512845
DDP
473
474AT_SETUP([PMD - rxq affinity])
475OVS_VSWITCHD_START(
476 [], [], [], [--dummy-numa 0,0,0,0,0,0,0,0,0])
477AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
478
479AT_CHECK([ovs-ofctl add-flow br0 actions=controller])
480
3fa215b1 481AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x1fe])
5e512845
DDP
482
483AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=4 other_config:pmd-rxq-affinity="0:3,1:7,2:2,3:8"])
484
485dnl The rxqs should be on the requested cores.
486AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
487p1 0 0 3
488p1 1 0 7
489p1 2 0 2
490p1 3 0 8
491])
492
493AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=6])
494
495dnl We removed the cores requested by some queues from pmd-cpu-mask.
496dnl Those queues will not be polled.
497AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
498p1 2 0 2
499])
500
501AT_CHECK([ovs-vsctl remove Interface p1 other_config pmd-rxq-affinity])
502
503dnl We removed the rxq-affinity request. dpif-netdev should assign queues
504dnl in a round robin fashion. We just make sure that every rxq is being
505dnl polled again.
506AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 1,2 -d ' ' | sort], [0], [dnl
507p1 0
508p1 1
509p1 2
510p1 3
511])
512
513AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity='0:1'])
514
515dnl We explicitly requested core 1 for queue 0. Core 1 becomes isolated and
516dnl every other queue goes to core 2.
517AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
518p1 0 0 1
519p1 1 0 2
520p1 2 0 2
521p1 3 0 2
522])
523
524OVS_VSWITCHD_STOP(["/dpif_netdev|WARN|There is no PMD thread on core/d"])
525AT_CLEANUP
546e57d4 526
5dd57e80
IM
527AT_SETUP([PMD - rxq affinity - NUMA])
528OVS_VSWITCHD_START(
529 [], [], [], [--dummy-numa 0,0,0,1,1])
530AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
531
532AT_CHECK([ovs-ofctl add-flow br0 actions=controller])
533
534AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=7e])
535
536AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=2 options:numa_id=0 other_config:pmd-rxq-affinity="0:1,1:2"])
537
538dnl The rxqs should be on the requested cores.
539AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
540p1 0 0 1
541p1 1 0 2
542])
543
544AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity="0:3,1:4"])
545
546dnl We moved the queues to different numa node. Expecting threads on
547dnl NUMA node 1 to be created.
548AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
549p1 0 1 3
550p1 1 1 4
551])
552
553AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity="0:3,1:1"])
554
555dnl Queues splitted between NUMA nodes.
556AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
557p1 0 1 3
558p1 1 0 1
559])
560
561AT_CHECK([ovs-vsctl remove Interface p1 other_config pmd-rxq-affinity])
562
563dnl We removed the rxq-affinity request. dpif-netdev should assign queues
564dnl in a round robin fashion. We just make sure that every rxq is being
565dnl polled again.
566AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 1,2 -d ' ' | sort], [0], [dnl
567p1 0
568p1 1
569])
570
571AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity='0:3'])
572
573dnl We explicitly requesting NUMA node 1 for queue 0.
574dnl Queue 1 should be polled by thread from NUMA node 0.
575AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 1,2,3 -d ' '], [0], [dnl
576p1 0 1
577p1 1 0
578])
579
580OVS_VSWITCHD_STOP
581AT_CLEANUP
582
546e57d4
DDP
583AT_SETUP([PMD - monitor threads])
584OVS_VSWITCHD_START(
585 [], [], [], [--dummy-numa 0,0])
586AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
587
588dnl The two devices are connected together externally using net.sock
589AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=1 options:pstream=punix:$OVS_RUNDIR/net.sock])
590AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=dummy-pmd ofport_request=2 options:n_rxq=1 options:stream=unix:$OVS_RUNDIR/net.sock])
591
592AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
593p1 0 0 0
594p2 0 0 0
595])
596
597dnl Enable bfd with a very aggressive interval. This will make the monitor very
598dnl busy, and uncover race conditions with the main thread.
599AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true bfd:min_rx=1 bfd:min_tx=1])
600AT_CHECK([ovs-vsctl set Interface p2 bfd:enable=true bfd:min_rx=1 bfd:min_tx=1])
601
602AT_CHECK([ovs-vsctl --timeout=10 wait-until Interface p1 bfd_status:forwarding=true \
603 -- wait-until Interface p2 bfd_status:forwarding=true])
604
605dnl Trigger reconfiguration of the datapath
606AT_CHECK([ovs-vsctl set Interface p1 options:n_rxq=2])
607AT_CHECK([ovs-vsctl set Interface p2 options:n_rxq=2])
608
609dnl Make sure that reconfiguration succeded
610AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
611p1 0 0 0
612p1 1 0 0
613p2 0 0 0
614p2 1 0 0
615])
616
e32971b8 617OVS_VSWITCHD_STOP
546e57d4 618AT_CLEANUP
f5d317a1
DDP
619
620AT_SETUP([PMD - dpctl])
621OVS_VSWITCHD_START(
622 [del-br br0], [], [], [--dummy-numa 0,0])
623AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
624
625AT_CHECK([ovs-appctl dpctl/add-dp dummy@dp0])
626AT_CHECK([ovs-appctl dpctl/add-if dummy@dp0 p1,type=dummy-pmd])
627AT_CHECK([ovs-appctl dpctl/add-if dummy@dp0 p2,type=dummy])
628
629AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show dp0 | parse_pmd_rxq_show], [0], [dnl
630p1 0 0 0
631])
632
633AT_CHECK([ovs-appctl dpctl/show dummy@dp0], [0], [dnl
634dummy@dp0:
635 lookups: hit:0 missed:0 lost:0
636 flows: 0
637 port 0: dp0 (dummy-internal)
638 port 1: p1 (dummy-pmd: configured_rx_queues=1, configured_tx_queues=1, requested_rx_queues=1, requested_tx_queues=1)
639 port 2: p2 (dummy)
640])
641
642AT_CHECK([ovs-appctl dpctl/add-flow dummy@dp0 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x1234)' 2], [0], [dnl
643])
644
645AT_CHECK([ovs-appctl dpctl/dump-flows dummy@dp0 | sort], [0], [dnl
646flow-dump from non-dpdk interfaces:
647flow-dump from pmd on cpu core: 0
648recirc_id(0),in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x1234), packets:0, bytes:0, used:never, actions:2
649recirc_id(0),in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x1234), packets:0, bytes:0, used:never, actions:2
650])
651
652AT_CHECK([ovs-appctl dpctl/del-flow dummy@dp0 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x1234)'], [0], [dnl
653])
654
655AT_CHECK([ovs-appctl dpctl/dump-flows dummy@dp0], [0], [dnl
656])
657
658AT_CHECK([ovs-appctl dpctl/del-dp dummy@dp0], [0], [dnl
659])
660
661OVS_VSWITCHD_STOP
662AT_CLEANUP