vswitch: Implement dscp column of the Queue table.
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 AT_SETUP([ofproto-dpif - resubmit])
4 OVS_VSWITCHD_START
5 AT_DATA([flows.txt], [dnl
6 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
7 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
8 table=0 in_port=3 priority=2000 icmp actions=output(20)
9 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
10 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
11 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
12 ])
13 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
14 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
15 AT_CHECK([tail -1 stdout], [0],
16   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
17 ])
18 OVS_VSWITCHD_STOP
19 AT_CLEANUP
20
21 AT_SETUP([ofproto-dpif - registers])
22 OVS_VSWITCHD_START
23 AT_DATA([flows.txt], [dnl
24 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
25 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
26 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11
27 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
28 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
29 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
30 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
31 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
32 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
33 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
34 in_port=9,reg0=0xdeadbeef  actions=output:20
35 in_port=10,reg1=0xdeadbeef actions=output:21
36 in_port=11,reg2=0xeef22dea actions=output:22
37 ])
38 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
39 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
40 AT_CHECK([tail -1 stdout], [0],
41   [Datapath actions: 20,21,22
42 ])
43 OVS_VSWITCHD_STOP
44 AT_CLEANUP
45
46 AT_SETUP([ofproto-dpif - output])
47 OVS_VSWITCHD_START
48 AT_DATA([flows.txt], [dnl
49 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
50 in_port=2 actions=output:9
51 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
52 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
53 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
54 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
55 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
56 ])
57 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
58 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
59 AT_CHECK([tail -1 stdout], [0],
60   [Datapath actions: 9,55,10,55,66,11,77,88
61 ])
62 OVS_VSWITCHD_STOP
63 AT_CLEANUP
64
65 AT_SETUP([ofproto-dpif - DSCP])
66 dnl This test assumes port p1 is allocated OpenFlow port number 1.
67 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
68 AT_DATA([flows.txt], [dnl
69 actions=output:65534,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:65534
70 ])
71 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
72 AT_CHECK([ovs-vsctl -- \
73         set Port p1 qos=@newqos --\
74         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
75         --id=@q1 create Queue dscp=1 --\
76         --id=@q2 create Queue dscp=2], [0], [ignore])
77 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(9),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
78 AT_CHECK([tail -1 stdout], [0],
79   [Datapath actions: dnl
80 0,dnl
81 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
82 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(priority(2)),1,dnl
83 1,dnl
84 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
85 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(priority(0)),1,dnl
86 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
87 0
88 ])
89 OVS_VSWITCHD_STOP
90 AT_CLEANUP
91
92 AT_SETUP([ofproto-dpif - output/flood flags])
93 dnl This test assumes that OpenFlow port numbers are allocated in order
94 dnl starting from one.  It does not necessarily require that they are allocated
95 dnl in the same order that they are named in the database.  Just that the
96 dnl following command guarantees OpenFlow port 65534, and ports 1-7 exist in
97 dnl the bridge.
98 OVS_VSWITCHD_START([dnl
99         add-port br0 p1 -- set Interface p1 type=dummy --\
100         add-port br0 p2 -- set Interface p2 type=dummy --\
101         add-port br0 p3 -- set Interface p3 type=dummy --\
102         add-port br0 p4 -- set Interface p4 type=dummy --\
103         add-port br0 p5 -- set Interface p5 type=dummy --\
104         add-port br0 p6 -- set Interface p6 type=dummy --\
105         add-port br0 p7 -- set Interface p7 type=dummy ])
106
107 AT_DATA([flows.txt], [dnl
108 in_port=1 actions=flood
109 in_port=2 actions=all
110 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
111 in_port=4 actions=enqueue:65534:1,enqueue:1:1,enqueue:2:1,enqueue:3:2,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1
112 ])
113 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
114 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
115 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
116
117 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
118 AT_CHECK([tail -1 stdout \
119 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
120 0
121 2
122 3
123 4
124 7
125 ])
126
127 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
128 AT_CHECK([tail -1 stdout \
129 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
130 0
131 1
132 3
133 4
134 6
135 7
136 ])
137
138 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
139 AT_CHECK([tail -1 stdout], [0],
140   [Datapath actions: 0,1,2,4,6,7
141 ])
142
143 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
144 AT_CHECK([tail -1 stdout], [0],
145   [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
146 ])
147 OVS_VSWITCHD_STOP
148 AT_CLEANUP
149
150 AT_SETUP([ofproto-dpif - set_tunnel])
151 OVS_VSWITCHD_START
152 AT_DATA([flows.txt], [dnl
153 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
154 in_port=1 actions=set_tunnel:1,output:1
155 in_port=2 actions=set_tunnel:1,output:2
156 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
157 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
158 in_port=5 actions=set_tunnel:5
159 ])
160 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
161 AT_CHECK([ovs-appctl ofproto/trace br0 'tun_id(0x1),in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
162 AT_CHECK([tail -1 stdout], [0],
163   [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
164 ])
165 OVS_VSWITCHD_STOP
166 AT_CLEANUP
167
168 AT_SETUP([ofproto-dpif - VLAN handling])
169 OVS_VSWITCHD_START(
170   [set Bridge br0 fail-mode=standalone -- \
171    add-port br0 p1                                  trunks=10,12 -- \
172    add-port br0 p2                           tag=10              -- \
173    add-port br0 p3                           tag=12              \
174                    other-config:priority-tags=true               -- \
175    add-port br0 p4                           tag=12              -- \
176    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
177    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
178    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
179    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
180                    other-config:priority-tags=true               -- \
181    set Interface p1 type=dummy -- \
182    set Interface p2 type=dummy -- \
183    set Interface p3 type=dummy -- \
184    set Interface p4 type=dummy -- \
185    set Interface p5 type=dummy -- \
186    set Interface p6 type=dummy -- \
187    set Interface p7 type=dummy -- \
188    set Interface p8 type=dummy --])
189
190 AT_CHECK(
191   [ovs-vsctl \
192         -- get Interface p1 ofport \
193         -- get Interface p2 ofport \
194         -- get Interface p3 ofport \
195         -- get Interface p4 ofport \
196         -- get Interface p5 ofport \
197         -- get Interface p6 ofport \
198         -- get Interface p7 ofport \
199         -- get Interface p8 ofport],
200   [0], [stdout])
201 set `cat stdout`
202 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
203
204 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
205 dnl PCP (used if the VID isn't "none") and the expected set of datapath
206 dnl actions.
207 for tuple in \
208         "br0 none 0 drop" \
209         "br0 0    0 drop" \
210         "br0 0    1 drop" \
211         "br0 10   0 p1,p5,p6,p7,p8,pop_vlan,p2" \
212         "br0 10   1 p1,p5,p6,p7,p8,pop_vlan,p2" \
213         "br0 11   0 p5,p7" \
214         "br0 11   1 p5,p7" \
215         "br0 12   0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
216         "br0 12   1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
217         "p1  none 0 drop" \
218         "p1  0    0 drop" \
219         "p1  0    1 drop" \
220         "p1  10   0 br0,p5,p6,p7,p8,pop_vlan,p2" \
221         "p1  10   1 br0,p5,p6,p7,p8,pop_vlan,p2" \
222         "p1  11   0 drop" \
223         "p1  11   1 drop" \
224         "p1  12   0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
225         "p1  12   1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
226         "p2  none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
227         "p2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
228         "p2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
229         "p2  10   0 drop" \
230         "p2  10   1 drop" \
231         "p2  11   0 drop" \
232         "p2  11   1 drop" \
233         "p2  12   0 drop" \
234         "p2  12   1 drop" \
235         "p3  none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
236         "p3  0    0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
237         "p3  0    1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
238         "p3  10   0 drop" \
239         "p3  10   1 drop" \
240         "p3  11   0 drop" \
241         "p3  11   1 drop" \
242         "p3  12   0 drop" \
243         "p3  12   1 drop" \
244         "p4  none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
245         "p4  0    0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
246         "p4  0    1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
247         "p4  10   0 drop" \
248         "p4  10   1 drop" \
249         "p4  11   0 drop" \
250         "p4  11   1 drop" \
251         "p4  12   0 drop" \
252         "p4  12   1 drop" \
253         "p5  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
254         "p5  0    0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
255         "p5  0    1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
256         "p5  10   0 br0,p1,p6,p7,p8,pop_vlan,p2" \
257         "p5  10   1 br0,p1,p6,p7,p8,pop_vlan,p2" \
258         "p5  11   0 br0,p7" \
259         "p5  11   1 br0,p7" \
260         "p5  12   0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
261         "p5  12   1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
262         "p6  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
263         "p6  0    0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
264         "p6  0    1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
265         "p6  10   0 br0,p1,p5,p7,p8,pop_vlan,p2" \
266         "p6  10   1 br0,p1,p5,p7,p8,pop_vlan,p2" \
267         "p6  11   0 drop" \
268         "p6  11   1 drop" \
269         "p6  12   0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
270         "p6  12   1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
271         "p7  none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
272         "p7  0    0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
273         "p7  0    1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
274         "p7  10   0 br0,p1,p5,p6,p8,pop_vlan,p2" \
275         "p7  10   1 br0,p1,p5,p6,p8,pop_vlan,p2" \
276         "p7  11   0 br0,p5" \
277         "p7  11   1 br0,p5" \
278         "p7  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
279         "p7  12   1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \
280         "p8  none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
281         "p8  0    0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
282         "p8  0    1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
283         "p8  10   0 br0,p1,p5,p6,p7,pop_vlan,p2" \
284         "p8  10   1 br0,p1,p5,p6,p7,pop_vlan,p2" \
285         "p8  11   0 drop" \
286         "p8  11   1 drop" \
287         "p8  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
288         "p8  12   1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3"
289 do
290   set $tuple
291   in_port=$1
292   vlan=$2
293   pcp=$3
294   expected=$4
295
296   eval n_in_port=\$$in_port
297   if test $vlan = none; then
298     flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
299   else
300     flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0x8100),vlan(vid=$vlan,pcp=$pcp),encap(eth_type(0xabcd))"
301   fi
302
303   echo "----------------------------------------------------------------------"
304   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
305
306   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
307   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
308
309   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [stdout])
310   mv stdout expout
311   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [expout])
312 done
313
314 OVS_VSWITCHD_STOP
315 AT_CLEANUP
316
317 AT_SETUP([ofproto-dpif - fragment handling])
318 OVS_VSWITCHD_START
319 AT_DATA([flows.txt], [dnl
320 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
321 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
322 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
323 priority=50 tcp ip_frag=no              actions=output:4
324 priority=50 tcp ip_frag=first           actions=output:5
325 priority=50 tcp ip_frag=later           actions=output:6
326 ])
327 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
328
329 base_flow="in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=128"
330 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
331 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
332 later_flow="$base_flow,frag=later)"
333
334     # mode    no  first  later
335 for tuple in \
336     'normal    1     5      6' \
337     'drop      1  drop   drop' \
338     'nx-match  1     2      6'
339 do
340   set $tuple
341   mode=$1
342   no=$2
343   first=$3
344   later=$4
345
346   AT_CHECK([ovs-ofctl set-frags br0 $mode])
347   for type in no first later; do
348     eval flow=\$${type}_flow exp_output=\$$type
349     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
350     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
351 ])
352   done
353 done
354 OVS_VSWITCHD_STOP
355 AT_CLEANUP
356
357 AT_SETUP([ofproto-dpif - exit])
358 OVS_VSWITCHD_START
359 AT_DATA([flows.txt], [dnl
360 in_port=1 actions=output:10,exit,output:11
361 in_port=2 actions=output:12,resubmit:1,output:12
362 in_port=3 actions=output:13,resubmit:2,output:14
363 ])
364 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
365 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
366 AT_CHECK([tail -1 stdout], [0],
367   [Datapath actions: 10
368 ])
369 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
370 AT_CHECK([tail -1 stdout], [0],
371   [Datapath actions: 12,10
372 ])
373 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
374 AT_CHECK([tail -1 stdout], [0],
375   [Datapath actions: 13,12,10
376 ])
377 OVS_VSWITCHD_STOP
378 AT_CLEANUP