3 m4_divert_push([PREPARE_TESTS])
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
8 parse_pmd_rxq_show () {
9 awk '/pmd thread/ {numa=$4; core=substr($6, 1, length($6) - 1)} /^ port:/ {print $2, $4, numa, core}' | sort
12 # Given the output of `ovs-appctl dpif-netdev/pmd-rxq-show`,
13 # and with queues for each core on one line, prints the rxqs
14 # of the core on one line
15 # 'port:' port_name 'queue_id:' rxq_id rxq_id rxq_id rxq_id
16 parse_pmd_rxq_show_group () {
17 awk '/port:/ {print $1, $2, $3, $4, $13, $22, $31}'
20 # Given the output of `ovs-appctl dpctl/dump-flows`, prints a list of flows
21 # (one per line), with the pmd_id at the beginning of the line
23 flow_dump_prepend_pmd () {
24 awk '/flow-dump from non-dpdk/ {pmd_id=-1; next} /flow-dump from pmd/ {pmd_id=$7; next} {print pmd_id, $0}' | sort
27 m4_divert_pop([PREPARE_TESTS])
29 dnl CHECK_CPU_DISCOVERED([n_cpu])
31 dnl Waits until CPUs discovered and checks if number of discovered CPUs
32 dnl is greater or equal to 'n_cpu'. Without parameters checks that at
33 dnl least one CPU discovered.
34 m4_define([CHECK_CPU_DISCOVERED], [
35 PATTERN="Discovered [[0-9]]* NUMA nodes and [[0-9]]* CPU cores"
36 OVS_WAIT_UNTIL([grep "$PATTERN" ovs-vswitchd.log])
37 N_CPU=$(grep "$PATTERN" ovs-vswitchd.log | sed -e 's/.* \([[0-9]]*\) CPU cores/\1/')
39 then AT_CHECK([test "$N_CPU" -gt "0"])
40 else AT_SKIP_IF([test "$N_CPU" -lt "$1"])
44 dnl CHECK_PMD_THREADS_CREATED([n_threads], [numa_id], [+line])
46 dnl Whaits for creation of 'n_threads' or at least 1 thread if $1 not
47 dnl passed. Checking starts from line number 'line' in ovs-vswithd.log .
48 m4_define([CHECK_PMD_THREADS_CREATED], [
49 PATTERN="There are [[0-9]]* pmd threads on numa node $2"
51 if [[ -z "$line_st" ]]
55 OVS_WAIT_UNTIL([tail -n $line_st ovs-vswitchd.log | grep "$PATTERN"])
56 N_THREADS=$(tail -n $line_st ovs-vswitchd.log | grep "$PATTERN" | tail -1 | sed -e 's/.* \([[0-9]]*\) pmd .*/\1/')
58 then AT_CHECK([test "$N_THREADS" -gt 0])
59 else AT_CHECK([test "$N_THREADS" -eq "$1"])
63 m4_define([SED_NUMA_CORE_PATTERN], ["s/\(numa_id \)[[0-9]]*\( core_id \)[[0-9]]*:/\1<cleared>\2<cleared>:/"])
64 m4_define([DUMMY_NUMA], [--dummy-numa="0,0,0,0"])
66 AT_SETUP([PMD - creating a thread/add-port])
67 OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy-pmd], [], [], [DUMMY_NUMA])
69 CHECK_CPU_DISCOVERED()
70 CHECK_PMD_THREADS_CREATED()
72 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
73 pmd thread numa_id <cleared> core_id <cleared>:
75 port: p0 queue-id: 0 (enabled) pmd usage: NOT AVAIL
78 AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
79 dummy@ovs-dummy: hit:0 missed:0
81 br0 65534/100: (dummy-internal)
82 p0 1/1: (dummy-pmd: configured_rx_queues=1, configured_tx_queues=<cleared>, requested_rx_queues=1, requested_tx_queues=<cleared>)
88 AT_SETUP([PMD - multiqueue support])
89 OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy-pmd], [], [], [DUMMY_NUMA])
91 CHECK_CPU_DISCOVERED()
92 CHECK_PMD_THREADS_CREATED()
94 AT_CHECK([ovs-vsctl set interface p0 options:n_rxq=8])
96 AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
97 dummy@ovs-dummy: hit:0 missed:0
99 br0 65534/100: (dummy-internal)
100 p0 1/1: (dummy-pmd: configured_rx_queues=8, configured_tx_queues=<cleared>, requested_rx_queues=8, requested_tx_queues=<cleared>)
103 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
104 pmd thread numa_id <cleared> core_id <cleared>:
106 port: p0 queue-id: 0 (enabled) pmd usage: NOT AVAIL
107 port: p0 queue-id: 1 (enabled) pmd usage: NOT AVAIL
108 port: p0 queue-id: 2 (enabled) pmd usage: NOT AVAIL
109 port: p0 queue-id: 3 (enabled) pmd usage: NOT AVAIL
110 port: p0 queue-id: 4 (enabled) pmd usage: NOT AVAIL
111 port: p0 queue-id: 5 (enabled) pmd usage: NOT AVAIL
112 port: p0 queue-id: 6 (enabled) pmd usage: NOT AVAIL
113 port: p0 queue-id: 7 (enabled) pmd usage: NOT AVAIL
120 AT_SETUP([PMD - pmd-cpu-mask/distribution of rx queues])
121 OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy-pmd options:n_rxq=8],
122 [], [], [DUMMY_NUMA])
124 CHECK_CPU_DISCOVERED(2)
125 CHECK_PMD_THREADS_CREATED()
127 AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
128 dummy@ovs-dummy: hit:0 missed:0
130 br0 65534/100: (dummy-internal)
131 p0 1/1: (dummy-pmd: configured_rx_queues=8, configured_tx_queues=<cleared>, requested_rx_queues=8, requested_tx_queues=<cleared>)
134 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
135 pmd thread numa_id <cleared> core_id <cleared>:
137 port: p0 queue-id: 0 (enabled) pmd usage: NOT AVAIL
138 port: p0 queue-id: 1 (enabled) pmd usage: NOT AVAIL
139 port: p0 queue-id: 2 (enabled) pmd usage: NOT AVAIL
140 port: p0 queue-id: 3 (enabled) pmd usage: NOT AVAIL
141 port: p0 queue-id: 4 (enabled) pmd usage: NOT AVAIL
142 port: p0 queue-id: 5 (enabled) pmd usage: NOT AVAIL
143 port: p0 queue-id: 6 (enabled) pmd usage: NOT AVAIL
144 port: p0 queue-id: 7 (enabled) pmd usage: NOT AVAIL
147 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=cycles])
148 TMP=$(cat ovs-vswitchd.log | wc -l | tr -d [[:blank:]])
149 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x3])
150 CHECK_PMD_THREADS_CREATED([2], [], [+$TMP])
152 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | awk '/AVAIL$/ { printf("%s\t", $0); next } 1' | parse_pmd_rxq_show_group | sort], [0], [dnl
153 port: p0 queue-id: 0 3 4 7
154 port: p0 queue-id: 1 2 5 6
157 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=roundrobin])
158 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | awk '/AVAIL$/ { printf("%s\t", $0); next } 1' | parse_pmd_rxq_show_group | sort], [0], [dnl
159 port: p0 queue-id: 0 2 4 6
160 port: p0 queue-id: 1 3 5 7
163 TMP=$(cat ovs-vswitchd.log | wc -l | tr -d [[:blank:]])
164 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x1])
165 CHECK_PMD_THREADS_CREATED([1], [], [+$TMP])
167 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | sed SED_NUMA_CORE_PATTERN], [0], [dnl
168 pmd thread numa_id <cleared> core_id <cleared>:
170 port: p0 queue-id: 0 (enabled) pmd usage: NOT AVAIL
171 port: p0 queue-id: 1 (enabled) pmd usage: NOT AVAIL
172 port: p0 queue-id: 2 (enabled) pmd usage: NOT AVAIL
173 port: p0 queue-id: 3 (enabled) pmd usage: NOT AVAIL
174 port: p0 queue-id: 4 (enabled) pmd usage: NOT AVAIL
175 port: p0 queue-id: 5 (enabled) pmd usage: NOT AVAIL
176 port: p0 queue-id: 6 (enabled) pmd usage: NOT AVAIL
177 port: p0 queue-id: 7 (enabled) pmd usage: NOT AVAIL
184 AT_SETUP([PMD - stats])
185 OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 ofport_request=7 type=dummy-pmd options:n_rxq=4],
186 [], [], [DUMMY_NUMA])
188 CHECK_CPU_DISCOVERED()
189 CHECK_PMD_THREADS_CREATED()
191 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg])
192 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
193 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:emc-insert-inv-prob=1])
194 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:smc-enable=true])
198 AT_CHECK([ovs-appctl dpif/show | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
199 dummy@ovs-dummy: hit:0 missed:0
201 br0 65534/100: (dummy-internal)
202 p0 7/1: (dummy-pmd: configured_rx_queues=4, configured_tx_queues=<cleared>, requested_rx_queues=4, requested_tx_queues=<cleared>)
205 AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 9], [0], [dnl
206 pmd thread numa_id <cleared> core_id <cleared>:
208 packet recirculations: 0
209 avg. datapath passes per packet: 0.00
213 avg. subtable lookups per megaflow hit: 0.00
214 miss with success upcall: 0
215 miss with failed upcall: 0
219 ovs-appctl time/warp 100
223 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)"
224 AT_CHECK([ovs-appctl netdev-dummy/receive p0 $pkt])
227 ovs-appctl time/warp 100
229 AT_CHECK([grep -A 1 'miss upcall' ovs-vswitchd.log | tail -n 1], [0], [dnl
230 skb_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),packet_type(ns=0,id=0),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)
232 AT_CHECK([cat ovs-vswitchd.log | filter_flow_install | strip_xout], [0], [dnl
233 recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:77,dst=50:54:00:00:01:78),eth_type(0x0800),ipv4(frag=no), actions: <del>
236 AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 9], [0], [dnl
237 pmd thread numa_id <cleared> core_id <cleared>:
239 packet recirculations: 0
240 avg. datapath passes per packet: 1.00
244 avg. subtable lookups per megaflow hit: 0.00
245 miss with success upcall: 1
246 miss with failed upcall: 0
252 dnl Reconfigure the number of rx queues of a port, make sure that all the
253 dnl queues are polled by the datapath and try to send a couple of packets.
254 AT_SETUP([PMD - reconfigure n_rxq])
256 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=2 -- \
257 add-port br0 p2 -- set Interface p2 type=dummy-pmd ofport_request=2
258 ], [], [], [--dummy-numa 0])
259 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
261 AT_CHECK([ovs-ofctl add-flow br0 action=controller])
263 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
269 AT_CAPTURE_FILE([ofctl_monitor.log])
270 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
272 AT_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)'])
274 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
275 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
277 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
278 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
279 icmp,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:13fc
282 AT_CHECK([ovs-vsctl set interface p1 options:n_rxq=4])
284 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
292 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
294 AT_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)'])
296 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
297 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
299 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
300 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
301 icmp,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:13fc
304 dnl Check resetting to default number of rx queues after removal from the db.
305 AT_CHECK([ovs-vsctl remove interface p1 options n_rxq])
307 AT_CHECK([ovs-appctl dpif/show | grep p1 | sed 's/\(tx_queues=\)[[0-9]]*/\1<cleared>/g'], [0], [dnl
308 p1 1/1: (dummy-pmd: configured_rx_queues=1, configured_tx_queues=<cleared>, requested_rx_queues=1, requested_tx_queues=<cleared>)
314 dnl There was a bug where OVS failed to create a ukey and install a megaflow
315 dnl if a packet with the exact same flow was received by two different pmd
316 dnl threads. This is a regression test for that bug.
317 AT_SETUP([PMD - same flow multiple threads])
319 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=2 -- \
320 set Open_vSwitch . other_config:pmd-cpu-mask=3
321 ], [], [], [--dummy-numa 0,0])
322 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
324 AT_CHECK([ovs-ofctl add-flow br0 action=controller])
326 dnl Make sure that the queues are on different cores. There's no way to
327 dnl control which queue is on which thread, we just need to make sure that
328 dnl two threads (core_id) show up in pmd-rxq-show
329 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 4 -d ' ' | sort], [0], [dnl
334 AT_CAPTURE_FILE([ofctl_monitor.log])
335 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
337 AT_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 AT_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)'])
341 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 4])
342 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
344 dnl Make sure that both flows have been installed
345 AT_CHECK([ovs-appctl dpctl/dump-flows | flow_dump_prepend_pmd], [0], [dnl
346 0 recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,controller(reason=1,dont_send=0,continuation=0,recirc_id=1,rule_cookie=0,controller_id=0,max_len=65535))
347 1 recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,controller(reason=1,dont_send=0,continuation=0,recirc_id=1,rule_cookie=0,controller_id=0,max_len=65535))
350 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
351 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
352 icmp,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:13fc
353 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
354 icmp,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:13fc
360 AT_SETUP([PMD - change numa node])
362 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=2 -- \
363 add-port br0 p2 -- set Interface p2 type=dummy-pmd ofport_request=2 options:n_rxq=2 -- \
364 set Open_vSwitch . other_config:pmd-cpu-mask=3
365 ], [], [], [--dummy-numa 0,1])
366 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
368 AT_CHECK([ovs-ofctl add-flow br0 action=controller])
370 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
377 AT_CAPTURE_FILE([ofctl_monitor.log])
378 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
380 AT_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)'])
382 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
383 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
385 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
386 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
387 icmp,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:13fc
390 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
392 AT_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)'])
394 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
395 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
397 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
398 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=2 (via action) data_len=106 (unbuffered)
399 icmp,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:13fc
402 AT_CHECK([ovs-vsctl set Interface p2 options:numa_id=1])
404 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
411 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
413 AT_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)'])
415 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
416 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
418 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
419 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
420 icmp,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:13fc
423 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
425 AT_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)'])
427 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
428 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
430 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
431 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=2 (via action) data_len=106 (unbuffered)
432 icmp,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:13fc
438 AT_SETUP([PMD - non pmd device])
440 [add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=1 -- \
441 add-port br0 p2 -- set Interface p2 type=dummy ofport_request=2 -- \
442 set Interface br0 options:tx_pcap=br0.pcap -- \
443 set Open_vSwitch . other_config:pmd-cpu-mask=1
444 ], [], [], [--dummy-numa 0,0])
445 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
447 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL])
449 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
453 AT_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)'])
455 AT_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)'])
457 OVS_WAIT_UNTIL([test `ovs-pcap br0.pcap | wc -l` -ge 2])
459 AT_CHECK([ovs-pcap br0.pcap], [0], [dnl
460 50540000000a50540000000908004500005c000000004001669f0a0000020a000001080013fc00000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
461 50540000000a50540000000908004500005c000000004001669f0a0000020a000001080013fc00000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
464 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=2])
466 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
470 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
472 AT_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)'])
474 AT_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)'])
476 OVS_WAIT_UNTIL([test `ovs-pcap br0.pcap | wc -l` -ge 4])
478 AT_CHECK([ovs-pcap br0.pcap], [0], [dnl
479 50540000000a50540000000908004500005c000000004001669f0a0000020a000001080013fc00000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
480 50540000000a50540000000908004500005c000000004001669f0a0000020a000001080013fc00000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
481 50540000000a50540000000908004500005c000000004001669f0a0000020a000001080013fc00000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
482 50540000000a50540000000908004500005c000000004001669f0a0000020a000001080013fc00000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
488 AT_SETUP([PMD - add remove ports])
490 [], [], [], [--dummy-numa 0,0])
491 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
493 AT_CHECK([ovs-ofctl add-flow br0 actions=controller])
495 AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=1])
497 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
501 AT_CAPTURE_FILE([ofctl_monitor.log])
502 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
504 AT_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)'])
506 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
507 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
509 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
510 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
511 icmp,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:13fc
514 AT_CHECK([ovs-vsctl del-port br0 p1])
515 AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd ofport_request=1 options:n_rxq=1])
517 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
519 AT_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)'])
521 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
522 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
524 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
525 NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered)
526 icmp,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:13fc
532 AT_SETUP([PMD - rxq affinity])
534 [], [], [], [--dummy-numa 0,0,0,0,0,0,0,0,0])
535 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
537 AT_CHECK([ovs-ofctl add-flow br0 actions=controller])
539 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x1fe])
541 AT_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"])
543 dnl The rxqs should be on the requested cores.
544 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
551 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=6])
553 dnl We removed the cores requested by some queues from pmd-cpu-mask.
554 dnl Those queues will not be polled.
555 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
559 AT_CHECK([ovs-vsctl remove Interface p1 other_config pmd-rxq-affinity])
561 dnl We removed the rxq-affinity request. dpif-netdev should assign queues
562 dnl in a round robin fashion. We just make sure that every rxq is being
564 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 1,2 -d ' ' | sort], [0], [dnl
571 AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity='0:1'])
573 dnl We explicitly requested core 1 for queue 0. Core 1 becomes isolated and
574 dnl every other queue goes to core 2.
575 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
582 OVS_VSWITCHD_STOP(["/dpif_netdev|WARN|There is no PMD thread on core/d"])
585 AT_SETUP([PMD - rxq affinity - NUMA])
587 [], [], [], [--dummy-numa 0,0,0,1,1])
588 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
590 AT_CHECK([ovs-ofctl add-flow br0 actions=controller])
592 AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=7e])
594 AT_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"])
596 dnl The rxqs should be on the requested cores.
597 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
602 AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity="0:3,1:4"])
604 dnl We moved the queues to different numa node. Expecting threads on
605 dnl NUMA node 1 to be created.
606 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
611 AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity="0:3,1:1"])
613 dnl Queues splitted between NUMA nodes.
614 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
619 AT_CHECK([ovs-vsctl remove Interface p1 other_config pmd-rxq-affinity])
621 dnl We removed the rxq-affinity request. dpif-netdev should assign queues
622 dnl in a round robin fashion. We just make sure that every rxq is being
624 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 1,2 -d ' ' | sort], [0], [dnl
629 AT_CHECK([ovs-vsctl set Interface p1 other_config:pmd-rxq-affinity='0:3'])
631 dnl We explicitly requesting NUMA node 1 for queue 0.
632 dnl Queue 1 should be polled by thread from NUMA node 0.
633 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show | cut -f 1,2,3 -d ' '], [0], [dnl
641 AT_SETUP([PMD - monitor threads])
643 [], [], [], [--dummy-numa 0,0])
644 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
646 dnl The two devices are connected together externally using net.sock
647 AT_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])
648 AT_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])
650 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
655 dnl Enable bfd with a very aggressive interval. This will make the monitor very
656 dnl busy, and uncover race conditions with the main thread.
657 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true bfd:min_rx=1 bfd:min_tx=1])
658 AT_CHECK([ovs-vsctl set Interface p2 bfd:enable=true bfd:min_rx=1 bfd:min_tx=1])
660 AT_CHECK([ovs-vsctl --timeout=10 wait-until Interface p1 bfd_status:forwarding=true \
661 -- wait-until Interface p2 bfd_status:forwarding=true])
663 dnl Trigger reconfiguration of the datapath
664 AT_CHECK([ovs-vsctl set Interface p1 options:n_rxq=2])
665 AT_CHECK([ovs-vsctl set Interface p2 options:n_rxq=2])
667 dnl Make sure that reconfiguration succeded
668 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show | parse_pmd_rxq_show], [0], [dnl
678 AT_SETUP([PMD - dpctl])
680 [del-br br0], [], [], [--dummy-numa 0,0])
681 AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg])
683 AT_CHECK([ovs-appctl dpctl/add-dp dummy@dp0])
684 AT_CHECK([ovs-appctl dpctl/add-if dummy@dp0 p1,type=dummy-pmd])
685 AT_CHECK([ovs-appctl dpctl/add-if dummy@dp0 p2,type=dummy])
687 AT_CHECK([ovs-appctl dpif-netdev/pmd-rxq-show dp0 | parse_pmd_rxq_show], [0], [dnl
691 AT_CHECK([ovs-appctl dpctl/show dummy@dp0], [0], [dnl
693 lookups: hit:0 missed:0 lost:0
695 port 0: dp0 (dummy-internal)
696 port 1: p1 (dummy-pmd: configured_rx_queues=1, configured_tx_queues=1, requested_rx_queues=1, requested_tx_queues=1)
700 AT_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
703 AT_CHECK([ovs-appctl dpctl/dump-flows dummy@dp0 | sort], [0], [dnl
704 flow-dump from non-dpdk interfaces:
705 flow-dump from pmd on cpu core: 0
706 recirc_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
707 recirc_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
710 AT_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
713 AT_CHECK([ovs-appctl dpctl/dump-flows dummy@dp0], [0], [dnl
716 AT_CHECK([ovs-appctl dpctl/del-dp dummy@dp0], [0], [dnl