upcall: Remove datapath flows when setting n-threads.
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 # Strips out uninteresting parts of flow output, as well as parts
4 # that vary from one run to another (e.g., timing and bond actions).
5 m4_define([STRIP_USED], [[sed '
6     s/used:[0-9]*\.[0-9]*/used:0.0/
7 ' | sort]])
8 m4_define([STRIP_XOUT], [[sed '
9     s/used:[0-9]*\.[0-9]*/used:0.0/
10     s/actions:.*/actions: <del>/
11     s/packets:[0-9]*/packets:0/
12     s/bytes:[0-9]*/bytes:0/
13 ' | sort]])
14
15 AT_SETUP([ofproto-dpif - dummy interface])
16 # Create br0 with interfaces p1 and p7
17 #    and br1 with interfaces p2 and p8
18 # with p1 and p2 connected via unix domain socket
19 OVS_VSWITCHD_START(
20   [add-port br0 p1 -- set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p0.sock ofport_request=1 -- \
21    add-port br0 p7 -- set interface p7 ofport_request=7 type=dummy -- \
22    add-br br1 -- \
23    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
24    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
25                   fail-mode=secure -- \
26    add-port br1 p2 -- set interface p2 type=dummy options:stream=unix:$OVS_RUNDIR/p0.sock ofport_request=2 -- \
27    add-port br1 p8 -- set interface p8 ofport_request=8 type=dummy --])
28
29 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
30 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
31 ovs-appctl time/stop
32 ovs-appctl time/warp 5000
33 AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(7),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)'])
34 AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3,dst=10.0.0.4,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
35 ovs-appctl time/warp 100
36 sleep 1  # wait for forwarders process packets
37
38 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
39 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3/0.0.0.0,dst=10.0.0.4/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
40 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
41 ])
42
43 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_XOUT], [0], [dnl
44 skb_priority(0),in_port(2),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
45 skb_priority(0),in_port(8),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.3/0.0.0.0,dst=10.0.0.4/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
46 ])
47 OVS_VSWITCHD_STOP
48 AT_CLEANUP
49
50 AT_SETUP([ofproto-dpif - resubmit])
51 OVS_VSWITCHD_START
52 ADD_OF_PORTS([br0], [1], [10], [11], [12], [13], [14], [15],
53                     [16], [17], [18], [19], [20], [21])
54 AT_DATA([flows.txt], [dnl
55 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
56 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
57 table=0 in_port=3 priority=2000 icmp actions=output(20)
58 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
59 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
60 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
61 ])
62 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
63 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
64 AT_CHECK([tail -1 stdout], [0],
65   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
66 ])
67 OVS_VSWITCHD_STOP
68 AT_CLEANUP
69
70 AT_SETUP([ofproto-dpif - goto table])
71 OVS_VSWITCHD_START
72 ADD_OF_PORTS([br0], [1], [10], [11])
73 echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt
74 for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt
75 echo "table=64 actions=output(11)" >> flows.txt
76 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
77 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
78 AT_CHECK([tail -1 stdout], [0],
79   [Datapath actions: 10,11
80 ])
81 OVS_VSWITCHD_STOP
82 AT_CLEANUP
83
84 AT_SETUP([ofproto-dpif - write actions])
85 OVS_VSWITCHD_START
86 ADD_OF_PORTS([br0], [1], [10], [11], [12], [13])
87 AT_DATA([flows.txt], [dnl
88 table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
89 table=1 ip actions=write_actions(output(13)),goto_table(2)
90 table=2 ip actions=set_field:192.168.3.91->ip_src,output(11)
91 ])
92 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
93 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
94 AT_CHECK([tail -1 stdout], [0],
95   [Datapath actions: 10,set(ipv4(src=192.168.3.91,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11,set(ipv4(src=192.168.3.90,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),13
96 ])
97 OVS_VSWITCHD_STOP
98 AT_CLEANUP
99
100 AT_SETUP([ofproto-dpif - clear actions])
101 OVS_VSWITCHD_START
102 ADD_OF_PORTS([br0], [1], [10], [11], [12])
103 AT_DATA([flows.txt], [dnl
104 table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip_src,output(12)),goto_table(1)
105 table=1 ip actions=set_field:192.168.3.91->ip_src,output(11),clear_actions
106 ])
107 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
108 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
109 AT_CHECK([tail -1 stdout], [0],
110   [Datapath actions: 10,set(ipv4(src=192.168.3.91,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11
111 ])
112 OVS_VSWITCHD_STOP
113 AT_CLEANUP
114
115 AT_SETUP([ofproto-dpif - group chaining not supported])
116 OVS_VSWITCHD_START
117 ADD_OF_PORTS([br0], [1], [10], [11])
118 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,group:123,bucket=output:11'],
119   [1], [], [stderr])
120 AT_CHECK([STRIP_XIDS stderr | sed 1q], [0],
121   [OFPT_ERROR (OF1.2): OFPGMFC_CHAINING_UNSUPPORTED
122 ])
123 OVS_VSWITCHD_STOP
124 AT_CLEANUP
125
126 AT_SETUP([ofproto-dpif - all group in action list])
127 OVS_VSWITCHD_START
128 ADD_OF_PORTS([br0], [1], [10], [11])
129 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
130 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
131 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
132 AT_CHECK([tail -1 stdout], [0],
133   [Datapath actions: set(ipv4(src=192.168.3.90,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),10,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11
134 ])
135 OVS_VSWITCHD_STOP
136 AT_CLEANUP
137
138 AT_SETUP([ofproto-dpif - indirect group in action list])
139 OVS_VSWITCHD_START
140 ADD_OF_PORTS([br0], [1], [10])
141 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
142 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234'])
143 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
144 AT_CHECK([tail -1 stdout], [0],
145   [Datapath actions: 10
146 ])
147 OVS_VSWITCHD_STOP
148 AT_CLEANUP
149
150 AT_SETUP([ofproto-dpif - all group in action set])
151 OVS_VSWITCHD_START
152 ADD_OF_PORTS([br0], [1], [10], [11])
153 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11'])
154 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
155 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
156 AT_CHECK([tail -1 stdout], [0],
157   [Datapath actions: set(ipv4(src=192.168.3.90,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),10,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no)),11
158 ])
159 OVS_VSWITCHD_STOP
160 AT_CLEANUP
161
162 AT_SETUP([ofproto-dpif - indirect group in action set])
163 OVS_VSWITCHD_START
164 ADD_OF_PORTS([br0], [1], [10])
165 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10])
166 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
167 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
168 AT_CHECK([tail -1 stdout], [0],
169   [Datapath actions: 10
170 ])
171 OVS_VSWITCHD_STOP
172 AT_CLEANUP
173
174 AT_SETUP([ofproto-dpif - select group])
175 OVS_VSWITCHD_START
176 ADD_OF_PORTS([br0], [1], [10], [11])
177 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11'])
178 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
179
180 # Try a bunch of different flows and make sure that they get distributed
181 # at least somewhat.
182 for d in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
183     AT_CHECK([ovs-appctl ofproto/trace br0 "in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:0$d,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0"], [0], [stdout])
184     tail -1 stdout >> results
185 done
186 sort results | uniq -c
187 AT_CHECK([sort results | uniq], [0],
188   [Datapath actions: 10
189 Datapath actions: 11
190 ])
191 OVS_VSWITCHD_STOP
192 AT_CLEANUP
193
194 AT_SETUP([ofproto-dpif - select group with watch port])
195 OVS_VSWITCHD_START
196 ADD_OF_PORTS([br0], [1], [10], [11])
197 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=watch_port:10,output:10,bucket=output:11'])
198 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
199 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
200 AT_CHECK([tail -1 stdout], [0],
201   [Datapath actions: 11
202 ])
203 OVS_VSWITCHD_STOP
204 AT_CLEANUP
205
206 AT_SETUP([ofproto-dpif - select group with weight])
207 OVS_VSWITCHD_START
208 ADD_OF_PORTS([br0], [1], [10], [11], [12])
209 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=select,bucket=output:10,bucket=output:11,weight=2000,bucket=output:12,weight=0'])
210 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
211 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
212 AT_CHECK([tail -1 stdout], [0],
213   [Datapath actions: 11
214 ])
215 OVS_VSWITCHD_STOP
216 AT_CLEANUP
217
218 AT_SETUP([ofproto-dpif - fast failover group])
219 OVS_VSWITCHD_START
220 ADD_OF_PORTS([br0], [1], [10], [11])
221 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=ff,bucket=watch_port:10,output:10,bucket=watch_port:11,output:11'])
222 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)'])
223 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=1,nw_tos=0,nw_ttl=128,icmp_type=8,icmp_code=0'], [0], [stdout])
224 AT_CHECK([tail -1 stdout], [0],
225   [Datapath actions: drop
226 ])
227 OVS_VSWITCHD_STOP
228 AT_CLEANUP
229
230 AT_SETUP([ofproto-dpif - registers])
231 OVS_VSWITCHD_START
232 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
233 AT_DATA([flows.txt], [dnl
234 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
235 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
236 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
237 in_port=93                 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
238
239 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
240 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
241 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
242 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
243 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
244 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
245 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
246 in_port=9,reg0=0xdeadbeef  actions=output:20
247 in_port=10,reg1=0xdeadbeef actions=output:21
248 in_port=11,reg2=0xeef22dea actions=output:22
249
250 dnl Sanilty check all registers
251 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
252 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
253 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
254 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
255
256 ])
257 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
258 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
259 AT_CHECK([tail -1 stdout], [0],
260   [Datapath actions: 20,21,22,33
261 ])
262 OVS_VSWITCHD_STOP
263 AT_CLEANUP
264
265 AT_SETUP([ofproto-dpif - push-pop])
266 OVS_VSWITCHD_START
267 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
268 AT_DATA([flows.txt], [dnl
269 in_port=90           actions=load:20->NXM_NX_REG0[[0..7]],load:21->NXM_NX_REG1[[0..7]],load:22->NXM_NX_REG2[[0..7]], load:33->NXM_NX_REG3[[0..7]], push:NXM_NX_REG0[[]], push:NXM_NX_REG1[[0..7]],push:NXM_NX_REG2[[0..15]], push:NXM_NX_REG3[[]], resubmit:2, resubmit:3, resubmit:4, resubmit:5
270 in_port=2            actions=pop:NXM_NX_REG0[[0..7]],output:NXM_NX_REG0[[]]
271 in_port=3            actions=pop:NXM_NX_REG1[[0..7]],output:NXM_NX_REG1[[]]
272 in_port=4            actions=pop:NXM_NX_REG2[[0..15]],output:NXM_NX_REG2[[]]
273 in_port=5            actions=pop:NXM_NX_REG3[[]],output:NXM_NX_REG3[[]]
274
275 ])
276 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
277 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
278 AT_CHECK([tail -1 stdout], [0],
279   [Datapath actions: 33,22,21,20
280 ])
281 OVS_VSWITCHD_STOP
282 AT_CLEANUP
283
284 AT_SETUP([ofproto-dpif - output])
285 OVS_VSWITCHD_START
286 ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
287 AT_DATA([flows.txt], [dnl
288 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7,resubmit:8
289 in_port=2 actions=output:9
290 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
291 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
292 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
293 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
294 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
295 in_port=8 actions=1,9,load:9->NXM_OF_IN_PORT[[]],1,9
296 ])
297 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
298 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
299 AT_CHECK([tail -1 stdout], [0],
300   [Datapath actions: 9,55,10,55,66,11,77,88,9,1
301 ])
302 OVS_VSWITCHD_STOP
303 AT_CLEANUP
304
305 AT_SETUP([ofproto-dpif - dec_ttl])
306 OVS_VSWITCHD_START
307 ADD_OF_PORTS([br0], [1], [2], [3], [4])
308 AT_DATA([flows.txt], [dnl
309 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
310 table=1 in_port=1 action=dec_ttl,output:3
311 ])
312 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
313 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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=111,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
314 AT_CHECK([tail -3 stdout], [0],
315   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=1,frag=no)),2,4
316 This flow is handled by the userspace slow path because it:
317         - Sends "packet-in" messages to the OpenFlow controller.
318 ])
319 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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=111,tos=0,ttl=3,frag=no)'], [0], [stdout])
320 AT_CHECK([tail -1 stdout], [0],
321   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=2,frag=no)),2,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=1,frag=no)),3,4
322 ])
323 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'], [0], [stdout])
324 AT_CHECK([tail -1 stdout], [0],
325   [Datapath actions: set(ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=127,frag=no)),2,set(ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=126,frag=no)),3,4
326 ])
327
328 AT_CAPTURE_FILE([ofctl_monitor.log])
329 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
330 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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=111,tos=0,ttl=2,frag=no)' -generate], [0], [stdout])
331 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
332 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
333 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=34 in_port=1 (via invalid_ttl) data_len=34 (unbuffered)
334 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=111,nw_tos=0,nw_ecn=0,nw_ttl=1
335 ])
336 OVS_VSWITCHD_STOP
337 AT_CLEANUP
338
339
340 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
341 OVS_VSWITCHD_START
342 ADD_OF_PORTS([br0], [1], [2])
343
344 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
345
346 # "in_port" defaults to OFPP_NONE if it's not specified.
347 flow="icmp,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,icmp_type=8,icmp_code=0"
348 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
349 AT_CHECK([tail -1 stdout | sed 's/Datapath actions: //' | tr "," "\n" | sort -n], [0], [dnl
350 1
351 2
352 100
353 ])
354
355 OVS_VSWITCHD_STOP
356 AT_CLEANUP
357
358 AT_SETUP([ofproto-dpif - DSCP])
359 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
360 ADD_OF_PORTS([br0], [9])
361 AT_DATA([flows.txt], [dnl
362 actions=output:LOCAL,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:LOCAL
363 ])
364 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
365 AT_CHECK([ovs-vsctl -- \
366         set Port p1 qos=@newqos --\
367         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
368         --id=@q1 create Queue dscp=1 --\
369         --id=@q2 create Queue dscp=2], [0], [ignore])
370 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
371 AT_CHECK([tail -1 stdout], [0],
372   [Datapath actions: dnl
373 100,dnl
374 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(skb_priority(0x1)),1,dnl
375 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(skb_priority(0x2)),1,dnl
376 1,dnl
377 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(skb_priority(0x1)),1,dnl
378 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(skb_priority(0)),1,dnl
379 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
380 100
381 ])
382 OVS_VSWITCHD_STOP
383 AT_CLEANUP
384
385 AT_SETUP([ofproto-dpif - output/flood flags])
386 OVS_VSWITCHD_START
387 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
388
389 AT_DATA([flows.txt], [dnl
390 in_port=local actions=local,flood
391 in_port=1 actions=flood
392 in_port=2 actions=all
393 in_port=3 actions=output:LOCAL,output:1,output:2,output:3,output:4,output:5,output:6,output:7
394 in_port=4 actions=enqueue:LOCAL:1,enqueue:1:1,enqueue:2:1,enqueue:3:2,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1
395 ])
396 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
397 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
398 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
399
400 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(100),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
401 AT_CHECK([tail -1 stdout \
402 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
403 1
404 2
405 3
406 4
407 7
408 ])
409
410 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
411 AT_CHECK([tail -1 stdout \
412 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
413 100
414 2
415 3
416 4
417 7
418 ])
419
420 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
421 AT_CHECK([tail -1 stdout \
422 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
423 1
424 100
425 3
426 4
427 6
428 7
429 ])
430
431 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
432 AT_CHECK([tail -1 stdout], [0],
433   [Datapath actions: 100,1,2,4,6,7
434 ])
435
436 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
437 AT_CHECK([tail -1 stdout], [0],
438   [Datapath actions: set(skb_priority(0x1)),100,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),6,7
439 ])
440 OVS_VSWITCHD_STOP
441 AT_CLEANUP
442
443 AT_SETUP([ofproto-dpif - controller])
444 OVS_VSWITCHD_START([dnl
445    add-port br0 p1 -- set Interface p1 type=dummy
446 ])
447 ON_EXIT([kill `cat ovs-ofctl.pid`])
448
449 AT_CAPTURE_FILE([ofctl_monitor.log])
450 AT_DATA([flows.txt], [dnl
451 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
452 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
453 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
454
455 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
456 cookie=0x4 table=2 in_port=81 actions=load:2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,controller,resubmit(82,3)
457 cookie=0x5 table=3 in_port=82 actions=load:3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,controller,resubmit(83,4)
458 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
459 cookie=0x7 table=5 in_port=84 actions=load:5->NXM_NX_REG4[[]],load:6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,controller,resubmit(85,6)
460 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
461 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
462 cookie=0xa dl_src=40:44:44:44:44:41 actions=mod_vlan_vid:99,mod_vlan_pcp:1,controller
463 cookie=0xa dl_src=40:44:44:44:44:42 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
464 cookie=0xa dl_src=41:44:44:44:44:42 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],pop_mpls:0x0800,controller
465 cookie=0xa dl_src=40:44:44:44:44:43 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
466 cookie=0xa dl_src=40:44:44:44:44:44 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],controller
467 cookie=0xa dl_src=40:44:44:44:44:45 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,controller
468 cookie=0xa dl_src=40:44:44:44:44:46 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),controller
469 cookie=0xa dl_src=40:44:44:44:44:47 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,set_mpls_ttl(10),controller
470 cookie=0xa dl_src=40:44:44:44:44:48 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],load:3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),dec_mpls_ttl,controller
471 cookie=0xb dl_src=50:55:55:55:55:55 dl_type=0x8847 actions=load:1000->OXM_OF_MPLS_LABEL[[]],controller
472 cookie=0xd dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,controller
473 cookie=0xc dl_src=70:77:77:77:77:77 actions=push_mpls:0x8848,load:1000->OXM_OF_MPLS_LABEL[[]],load:7->OXM_OF_MPLS_TC[[]],controller
474 cookie=0xd dl_src=80:88:88:88:88:88 arp actions=load:2->OXM_OF_ARP_OP[[]],controller,load:0xc0a88001->OXM_OF_ARP_SPA[[]],controller,load:0x404444444441->OXM_OF_ARP_THA[[]],load:0x01010101->OXM_OF_ARP_SPA[[]],load:0x02020202->OXM_OF_ARP_TPA[[]],controller
475 ])
476 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
477
478 dnl Flow miss.
479 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
480
481 for i in 1 2 3 ; do
482     ovs-appctl netdev-dummy/receive p1 '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=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9),tcp_flags(0x010)'
483 done
484 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
485 ovs-appctl -t ovs-ofctl exit
486
487 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
488 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
489 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9,tcp_flags=0x010 tcp_csum:0
490 dnl
491 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
492 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9,tcp_flags=0x010 tcp_csum:0
493 dnl
494 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
495 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=9,tcp_flags=0x010 tcp_csum:0
496 ])
497
498 dnl Singleton controller action.
499 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
500
501 for i in 1 2 3 ; do
502     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=10:11:11:11:11:11,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=64,frag=no),tcp(src=8,dst=10),tcp_flags(0x002)'
503 done
504 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
505 ovs-appctl -t ovs-ofctl exit
506
507 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
508 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
509 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x002 tcp_csum:0
510 dnl
511 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
512 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x002 tcp_csum:0
513 dnl
514 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
515 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=10:11:11:11:11:11,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x002 tcp_csum:0
516 ])
517
518 dnl Modified controller action.
519 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
520
521 for i in 1 2 3 ; do
522     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=30:33:33:33:33:33,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=64,frag=no),tcp(src=8,dst=10),tcp_flags(0x001)'
523 done
524 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
525 ovs-appctl -t ovs-ofctl exit
526
527 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
528 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
529 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x001 tcp_csum:0
530 dnl
531 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
532 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x001 tcp_csum:0
533 dnl
534 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
535 tcp,metadata=0,in_port=0,dl_vlan=15,dl_vlan_pcp=0,dl_src=30:33:33:33:33:33,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=10,tcp_flags=0x001 tcp_csum:0
536 ])
537
538 dnl Modified VLAN controller action.
539 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
540
541 for i in 1 2 3; do
542     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:41,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
543 done
544 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
545 ovs-appctl -t ovs-ofctl exit
546
547 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
548 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
549 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
550 dnl
551 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
552 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
553 dnl
554 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
555 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
556 ])
557
558 dnl Modified MPLS controller action.
559 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
560
561 for i in 1 2 3; do
562     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:42,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
563 done
564 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
565 ovs-appctl -t ovs-ofctl exit
566
567 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
568 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
569 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
570 dnl
571 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
572 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
573 dnl
574 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
575 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:42,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
576 ])
577
578 dnl Modified MPLS controller action.
579 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
580
581 for i in 1 2 3; do
582     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=41:44:44:44:44:42,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
583 done
584 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
585 ovs-appctl -t ovs-ofctl exit
586
587 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
588 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
589 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
590 dnl
591 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
592 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
593 dnl
594 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
595 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
596 ])
597
598 dnl Modified MPLS controller action.
599 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
600
601 dnl in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x8847),mpls(label=100,tc=3,ttl=64,bos=1)
602
603 for i in 1 2 3; do
604     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:43,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'
605 done
606
607 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
608 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
609 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
610 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0,mpls_lse1=46912
611 dnl
612 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
613 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0,mpls_lse1=46912
614 dnl
615 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
616 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:43,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=0,mpls_lse1=46912
617 ])
618
619 dnl Modified MPLS controller action.
620 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
621
622 for i in 1 2 3; do
623     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:44,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=99,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no))'
624 done
625 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
626 ovs-appctl -t ovs-ofctl exit
627
628 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
629 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
630 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
631 dnl
632 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
633 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
634 dnl
635 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
636 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=7,dl_src=40:44:44:44:44:44,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=64,mpls_bos=1
637 ])
638
639 dnl Modified MPLS controller action.
640 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
641
642 for i in 1 2 3; do
643     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:45,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
644 done
645 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
646 ovs-appctl -t ovs-ofctl exit
647
648 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
649 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
650 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
651 dnl
652 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
653 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
654 dnl
655 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
656 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:45,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=63,mpls_bos=1
657 ])
658
659 dnl Modified MPLS controller action.
660 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
661
662 for i in 1 2 3; do
663     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:46,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
664 done
665 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
666 ovs-appctl -t ovs-ofctl exit
667
668 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
669 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
670 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
671 dnl
672 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
673 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
674 dnl
675 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
676 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:46,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
677 ])
678
679 dnl Modified MPLS controller action.
680 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
681
682 for i in 1 2 3; do
683     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:47,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
684 done
685 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
686 ovs-appctl -t ovs-ofctl exit
687
688 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
689 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
690 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
691 dnl
692 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
693 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
694 dnl
695 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
696 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:47,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=10,mpls_bos=1
697 ])
698
699 dnl Modified MPLS controller action.
700 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
701
702 for i in 1 2 3; do
703     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:44:48,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=16,tos=0,ttl=64,frag=no)'
704 done
705 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
706 ovs-appctl -t ovs-ofctl exit
707
708 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
709 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
710 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
711 dnl
712 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
713 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
714 dnl
715 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
716 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:44:48,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=3,mpls_ttl=9,mpls_bos=1
717 ])
718
719 dnl Modified MPLS actions.
720 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
721
722 for i in 1 2 3; do
723     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:55:55:55:55:55,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=100,tc=7,ttl=64,bos=1)'
724 done
725 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
726 ovs-appctl -t ovs-ofctl exit
727
728 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
729 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
730 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
731 dnl
732 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
733 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
734 dnl
735 NXT_PACKET_IN (xid=0x0): cookie=0xb total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
736 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:55:55:55:55:55,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=64,mpls_bos=1
737 ])
738
739 dnl Modified MPLS ipv6 controller action.
740 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
741
742 for i in 1 2 3; do
743     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=70:77:77:77:77:77,dst=50:54:00:00:00:07),eth_type(0x86dd),ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'
744 done
745 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
746 ovs-appctl -t ovs-ofctl exit
747
748 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
749 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
750 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=128,mpls_bos=1
751 dnl
752 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
753 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=128,mpls_bos=1
754 dnl
755 NXT_PACKET_IN (xid=0x0): cookie=0xc total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
756 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=70:77:77:77:77:77,dl_dst=50:54:00:00:00:07,mpls_label=1000,mpls_tc=7,mpls_ttl=128,mpls_bos=1
757 ])
758
759
760 dnl Modified MPLS pop action.
761 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
762 dnl 60:66:66:66:66:66 > 50:54:00:00:00:07, ethertype MPLS multicast (0x8847), length 66: MPLS (label 20, exp 0, ttl 32)
763 dnl             (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44)
764
765 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
766
767 for i in 1 2 3; do
768     ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 60 66 66 66 66 66 88 47 00 01 41 20 45 00 00 2c 00 00 00 00 40 06 3b 78 c0 a8 00 01 c0 a8 00 02 00 50 00 00 00 00 00 2a 00 00 00 2a 50 00 27 10 77 44 00 00 48 4f 47 45'
769 done
770 #for i in 2 3; do
771 #    ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=60:66:66:66:66:66,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=10,tc=3,ttl=100,bos=1)'
772 #done
773 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
774 ovs-appctl -t ovs-ofctl exit
775
776 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
777 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
778 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=80,tp_dst=0,tcp_flags=0x000 tcp_csum:7744
779 dnl
780 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
781 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=80,tp_dst=0,tcp_flags=0x000 tcp_csum:7744
782 dnl
783 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered)
784 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=60:66:66:66:66:66,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=80,tp_dst=0,tcp_flags=0x000 tcp_csum:7744
785 ])
786
787 dnl Checksum TCP.
788 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
789
790 for i in 1 ; do
791     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=20:22:22:22:22:22,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=64,frag=no),tcp(src=8,dst=11),tcp_flags(0x001)'
792 done
793 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
794 ovs-appctl -t ovs-ofctl exit
795
796 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
797 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
798 tcp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
799 dnl
800 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
801 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
802 dnl
803 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
804 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
805 dnl
806 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
807 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:0
808 dnl
809 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
810 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:1a03
811 dnl
812 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
813 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=8,tp_dst=11,tcp_flags=0x001 tcp_csum:3205
814 dnl
815 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
816 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=11,tcp_flags=0x001 tcp_csum:31b8
817 dnl
818 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
819 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86,tcp_flags=0x001 tcp_csum:316d
820 dnl
821 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
822 tcp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=85,tp_dst=86,tcp_flags=0x001 tcp_csum:316d
823 ])
824
825 dnl Checksum UDP.
826 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
827
828 for i in 1 ; do
829     ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 20 22 22 22 22 22 08 00 45 00 00 1C 00 00 00 00 00 11 00 00 C0 A8 00 01 C0 A8 00 02 00 08 00 0B 00 00 12 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
830 done
831 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18])
832 ovs-appctl -t ovs-ofctl exit
833
834 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
835 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
836 udp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
837 dnl
838 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
839 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
840 dnl
841 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=64 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=64 (unbuffered)
842 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
843 dnl
844 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=64 (unbuffered)
845 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:1234
846 dnl
847 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=64 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=64 (unbuffered)
848 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:2c37
849 dnl
850 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
851 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=8,tp_dst=11 udp_csum:4439
852 dnl
853 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
854 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=11 udp_csum:43ec
855 dnl
856 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
857 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
858 dnl
859 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=64 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=64 (unbuffered)
860 udp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 udp_csum:43a1
861 ])
862
863 dnl Modified ARP controller action.
864 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
865
866 for i in 1 2 3; do
867     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=80:88:88:88:88:88,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
868 done
869
870 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 9])
871 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
872 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
873 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
874 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
875 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
876 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
877 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
878 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
879 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
880 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
881 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
882 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
883 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
884 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
885 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
886 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
887 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
888 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
889 NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
890 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
891 ])
892
893 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
894
895 dnl Checksum SCTP.
896 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
897
898 for i in 1 ; do
899     ovs-appctl netdev-dummy/receive p1 '50 54 00 00 00 07 20 22 22 22 22 22 08 00 45 00 00 24 00 00 00 00 00 84 00 00 C0 A8 00 01 C0 A8 00 02 04 58 08 af 00 00 00 00 d9 d7 91 57 01 00 00 34 cf 28 ec 4e 00 01 40 00 00 0a ff ff b7 53 24 19 00 05 00 08 7f 00 00 01 00 05 00 08 c0 a8 02 07 00 0c 00 06 00 05 00 00 80 00 00 04 c0 00 00 04'
900 done
901
902 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 9])
903 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
904 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
905 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=98 in_port=1 (via action) data_len=98 (unbuffered)
906 sctp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
907 dnl
908 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=102 in_port=1 reg0=0x1 (via action) data_len=102 (unbuffered)
909 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=20:22:22:22:22:22,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
910 dnl
911 NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x4 total_len=102 in_port=1 reg0=0x1 reg1=0x2 (via action) data_len=102 (unbuffered)
912 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
913 dnl
914 NXT_PACKET_IN (xid=0x0): table_id=3 cookie=0x5 total_len=102 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 (via action) data_len=102 (unbuffered)
915 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
916 dnl
917 NXT_PACKET_IN (xid=0x0): table_id=4 cookie=0x6 total_len=102 in_port=1 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 (via action) data_len=102 (unbuffered)
918 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=192.168.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
919 dnl
920 NXT_PACKET_IN (xid=0x0): table_id=5 cookie=0x7 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
921 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1112,tp_dst=2223 sctp_csum:d9d79157
922 dnl
923 NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x8 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
924 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=2223 sctp_csum:7f12662e
925 dnl
926 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
927 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 sctp_csum:a7e86f67
928 dnl
929 NXT_PACKET_IN (xid=0x0): table_id=7 cookie=0x9 total_len=102 in_port=1 tun_id=0x6 reg0=0x1 reg1=0x2 reg2=0x3 reg3=0x4 reg4=0x5 (via action) data_len=102 (unbuffered)
930 sctp,metadata=0,in_port=0,dl_vlan=80,dl_vlan_pcp=0,dl_src=80:81:81:81:81:81,dl_dst=82:82:82:82:82:82,nw_src=83.83.83.83,nw_dst=84.84.84.84,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=85,tp_dst=86 sctp_csum:a7e86f67
931 ])
932
933 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
934  cookie=0x1, n_packets=3, n_bytes=218, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
935  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
936  cookie=0x3, table=1, n_packets=3, n_bytes=218, in_port=80 actions=load:0x1->NXM_NX_REG0[[]],mod_vlan_vid:80,CONTROLLER:65535,resubmit(81,2)
937  cookie=0x4, table=2, n_packets=3, n_bytes=218, in_port=81 actions=load:0x2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,CONTROLLER:65535,resubmit(82,3)
938  cookie=0x5, table=3, n_packets=3, n_bytes=218, in_port=82 actions=load:0x3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,CONTROLLER:65535,resubmit(83,4)
939  cookie=0x6, table=4, n_packets=3, n_bytes=218, in_port=83 actions=load:0x4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,CONTROLLER:65535,resubmit(84,5)
940  cookie=0x7, table=5, n_packets=3, n_bytes=218, in_port=84 actions=load:0x5->NXM_NX_REG4[[]],load:0x6->NXM_NX_TUN_ID[[]],mod_nw_dst:84.84.84.84,CONTROLLER:65535,resubmit(85,6)
941  cookie=0x8, table=6, n_packets=3, n_bytes=218, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
942  cookie=0x9, table=7, n_packets=3, n_bytes=218, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
943  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:41 actions=mod_vlan_vid:99,mod_vlan_pcp:1,CONTROLLER:65535
944  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:42 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
945  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:43 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
946  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:44 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
947  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:45 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,CONTROLLER:65535
948  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:46 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),CONTROLLER:65535
949  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:47 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],dec_mpls_ttl,set_mpls_ttl(10),CONTROLLER:65535
950  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:44:48 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],set_mpls_ttl(10),dec_mpls_ttl,CONTROLLER:65535
951  cookie=0xa, n_packets=3, n_bytes=180, dl_src=41:44:44:44:44:42 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],load:0x3->OXM_OF_MPLS_TC[[]],pop_mpls:0x0800,CONTROLLER:65535
952  cookie=0xb, n_packets=3, n_bytes=180, mpls,dl_src=50:55:55:55:55:55 actions=load:0x3e8->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
953  cookie=0xc, n_packets=3, n_bytes=180, dl_src=70:77:77:77:77:77 actions=push_mpls:0x8848,load:0x3e8->OXM_OF_MPLS_LABEL[[]],load:0x7->OXM_OF_MPLS_TC[[]],CONTROLLER:65535
954  cookie=0xd, n_packets=3, n_bytes=180, arp,dl_src=80:88:88:88:88:88 actions=load:0x2->NXM_OF_ARP_OP[[]],CONTROLLER:65535,load:0xc0a88001->NXM_OF_ARP_SPA[[]],CONTROLLER:65535,load:0x404444444441->NXM_NX_ARP_THA[[]],load:0x1010101->NXM_OF_ARP_SPA[[]],load:0x2020202->NXM_OF_ARP_TPA[[]],CONTROLLER:65535
955  cookie=0xd, n_packets=3, n_bytes=186, dl_src=60:66:66:66:66:66 actions=pop_mpls:0x0800,CONTROLLER:65535
956  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
957 NXST_FLOW reply:
958 ])
959
960 OVS_VSWITCHD_STOP
961 AT_CLEANUP
962
963 AT_SETUP([ofproto-dpif - ARP modification slow-path])
964 OVS_VSWITCHD_START
965 ADD_OF_PORTS([br0], [1], [2])
966
967 ovs-vsctl -- set Interface p2 type=dummy options:pcap=p2.pcap
968 ovs-ofctl add-flow br0 'in_port=1,arp actions=load:2->OXM_OF_ARP_OP[[]],2,load:0xc0a88001->OXM_OF_ARP_SPA[[]],2,load:0x404444444441->OXM_OF_ARP_THA[[]],2'
969
970 # Input some packets that should follow the arp modification slow-path.
971 for i in 1 2 3; do
972     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=80:88:88:88:88:88,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
973 done
974 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
975
976 # Check the packets that were output.
977 AT_CHECK([ovs-ofctl parse-pcap p2.pcap], [0], [dnl
978 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
979 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
980 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
981 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
982 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
983 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
984 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
985 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00
986 arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
987 ])
988
989 OVS_VSWITCHD_STOP
990 AT_CLEANUP
991
992 AT_SETUP([ofproto-dpif - VLAN handling])
993 OVS_VSWITCHD_START(
994   [set Bridge br0 fail-mode=standalone -- \
995    add-port br0 p1                                  trunks=10,12 -- \
996    add-port br0 p2                           tag=10              -- \
997    add-port br0 p3                           tag=12              \
998                    other-config:priority-tags=true               -- \
999    add-port br0 p4                           tag=12              -- \
1000    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
1001    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
1002    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
1003    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
1004                    other-config:priority-tags=true               -- \
1005    set Interface p1 type=dummy -- \
1006    set Interface p2 type=dummy -- \
1007    set Interface p3 type=dummy -- \
1008    set Interface p4 type=dummy -- \
1009    set Interface p5 type=dummy -- \
1010    set Interface p6 type=dummy -- \
1011    set Interface p7 type=dummy -- \
1012    set Interface p8 type=dummy --])
1013
1014 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
1015 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
1016 dnl actions.
1017 for tuple in \
1018         "100 none 0 drop" \
1019         "100 0    0 drop" \
1020         "100 0    1 drop" \
1021         "100 10   0 1,5,6,7,8,pop_vlan,2" \
1022         "100 10   1 1,5,6,7,8,pop_vlan,2" \
1023         "100 11   0 5,7" \
1024         "100 11   1 5,7" \
1025         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
1026         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1027         "1  none 0 drop" \
1028         "1  0    0 drop" \
1029         "1  0    1 drop" \
1030         "1  10   0 5,6,7,8,100,pop_vlan,2" \
1031         "1  10   1 5,6,7,8,100,pop_vlan,2" \
1032         "1  11   0 drop" \
1033         "1  11   1 drop" \
1034         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
1035         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1036         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
1037         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
1038         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
1039         "2  10   0 drop" \
1040         "2  10   1 drop" \
1041         "2  11   0 drop" \
1042         "2  11   1 drop" \
1043         "2  12   0 drop" \
1044         "2  12   1 drop" \
1045         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1046         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1047         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1048         "3  10   0 drop" \
1049         "3  10   1 drop" \
1050         "3  11   0 drop" \
1051         "3  11   1 drop" \
1052         "3  12   0 drop" \
1053         "3  12   1 drop" \
1054         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1055         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1056         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1057         "4  10   0 drop" \
1058         "4  10   1 drop" \
1059         "4  11   0 drop" \
1060         "4  11   1 drop" \
1061         "4  12   0 drop" \
1062         "4  12   1 drop" \
1063         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1064         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1065         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
1066         "5  10   0 1,6,7,8,100,pop_vlan,2" \
1067         "5  10   1 1,6,7,8,100,pop_vlan,2" \
1068         "5  11   0 7,100" \
1069         "5  11   1 7,100" \
1070         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
1071         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1072         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1073         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1074         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
1075         "6  10   0 1,5,7,8,100,pop_vlan,2" \
1076         "6  10   1 1,5,7,8,100,pop_vlan,2" \
1077         "6  11   0 drop" \
1078         "6  11   1 drop" \
1079         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
1080         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1081         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1082         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1083         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
1084         "7  10   0 1,5,6,8,100,pop_vlan,2" \
1085         "7  10   1 1,5,6,8,100,pop_vlan,2" \
1086         "7  11   0 5,100" \
1087         "7  11   1 5,100" \
1088         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
1089         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
1090         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1091         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1092         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1093         "8  10   0 1,5,6,7,100,pop_vlan,2" \
1094         "8  10   1 1,5,6,7,100,pop_vlan,2" \
1095         "8  11   0 drop" \
1096         "8  11   1 drop" \
1097         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
1098         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
1099 do
1100   set $tuple
1101   in_port=$1
1102   vlan=$2
1103   pcp=$3
1104   expected=$4
1105
1106   if test $vlan = none; then
1107     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
1108   else
1109     flow="in_port($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))"
1110   fi
1111
1112   echo "----------------------------------------------------------------------"
1113   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
1114
1115   AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1116   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1117
1118   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1119   mv stdout expout
1120   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1121 done
1122
1123 OVS_VSWITCHD_STOP
1124 AT_CLEANUP
1125
1126 AT_SETUP([ofproto-dpif - MPLS handling])
1127 OVS_VSWITCHD_START([dnl
1128    add-port br0 p1 -- set Interface p1 type=dummy
1129 ])
1130 ON_EXIT([kill `cat ovs-ofctl.pid`])
1131
1132 AT_CAPTURE_FILE([ofctl_monitor.log])
1133 AT_DATA([flows.txt], [dnl
1134 dl_src=40:44:44:44:00:00 actions=push_mpls:0x8847,controller
1135 dl_src=40:44:44:44:00:01,mpls actions=push_mpls:0x8847,controller
1136 dl_src=40:44:44:44:00:02,mpls actions=push_mpls:0x8848,controller
1137 ])
1138 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 add-flows br0 flows.txt])
1139
1140 dnl In this test, we push an MPLS tag to an ethernet packet.
1141 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1142
1143 for i in 1 2 3; do
1144     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:00:00,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=64,frag=no)'
1145 done
1146 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1147
1148 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1149 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1150 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:00,dl_dst=50:54:00:00:00:07,mpls_label=0,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1151 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1152 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1153 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1154 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1155 dnl
1156 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1157 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:00,dl_dst=50:54:00:00:00:07,mpls_label=0,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1158 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1159 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1160 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1161 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1162 dnl
1163 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1164 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:00,dl_dst=50:54:00:00:00:07,mpls_label=0,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1165 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1166 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1167 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1168 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1169 ])
1170
1171 dnl In this test, we push an MPLS tag to an MPLS packet. The LSE should be
1172 dnl copied exactly, except for the BOS bit.
1173 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1174
1175 for i in 1 2 3; do
1176     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:00:01,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=10,tc=0,ttl=64,bos=1)'
1177 done
1178 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1179
1180 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1181 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1182 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:01,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=0,mpls_lse1=41280
1183 00000000  50 54 00 00 00 07 40 44-44 44 00 01 88 47 00 00
1184 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1185 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1186 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1187 dnl
1188 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1189 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:01,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=0,mpls_lse1=41280
1190 00000000  50 54 00 00 00 07 40 44-44 44 00 01 88 47 00 00
1191 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1192 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1193 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1194 dnl
1195 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1196 mpls,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:01,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=0,mpls_lse1=41280
1197 00000000  50 54 00 00 00 07 40 44-44 44 00 01 88 47 00 00
1198 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1199 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1200 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1201 ])
1202
1203 dnl In this test, we push an MPLS tag to an MPLS packet. The LSE should be
1204 dnl copied exactly, except for the BOS bit. The ethertype should be updated
1205 dnl to the MPLS ethertype of the MPLS push action which differs to that
1206 dnl of the input packet.
1207 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1208
1209 for i in 1 2 3; do
1210     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:00:02,dst=50:54:00:00:00:07),eth_type(0x8847),mpls(label=10,tc=0,ttl=64,bos=1)'
1211 done
1212 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1213
1214 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1215 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1216 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:02,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=0,mpls_lse1=41280
1217 00000000  50 54 00 00 00 07 40 44-44 44 00 02 88 48 00 00
1218 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1219 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1220 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1221 dnl
1222 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1223 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:02,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=0,mpls_lse1=41280
1224 00000000  50 54 00 00 00 07 40 44-44 44 00 02 88 48 00 00
1225 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1226 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1227 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1228 dnl
1229 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1230 mplsm,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=40:44:44:44:00:02,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=0,mpls_lse1=41280
1231 00000000  50 54 00 00 00 07 40 44-44 44 00 02 88 48 00 00
1232 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1233 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1234 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1235 ])
1236
1237 OVS_VSWITCHD_STOP
1238 AT_CLEANUP
1239
1240 AT_SETUP([ofproto-dpif - VLAN+MPLS handling])
1241 OVS_VSWITCHD_START([dnl
1242    add-port br0 p1 -- set Interface p1 type=dummy
1243 ])
1244 ON_EXIT([kill `cat ovs-ofctl.pid`])
1245
1246 AT_CAPTURE_FILE([ofctl_monitor.log])
1247 AT_DATA([flows.txt], [dnl
1248 cookie=0xa dl_src=40:44:44:44:54:50 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,set_vlan_vid:99,set_vlan_pcp:1,controller
1249 cookie=0xa dl_src=40:44:44:44:54:51 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,set_vlan_vid:99,set_vlan_pcp:1,controller
1250 cookie=0xa dl_src=40:44:44:44:54:52 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,load:99->OXM_OF_VLAN_VID[[]],set_vlan_pcp:1,controller
1251 cookie=0xa dl_src=40:44:44:44:54:53 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,load:99->OXM_OF_VLAN_VID[[]],set_vlan_pcp:1,controller
1252 cookie=0xa dl_src=40:44:44:44:54:54 actions=push_vlan:0x8100,set_vlan_vid:99,set_vlan_pcp:1,push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],controller
1253 cookie=0xa dl_src=40:44:44:44:54:55 actions=push_vlan:0x8100,set_vlan_vid:99,set_vlan_pcp:1,push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],controller
1254 cookie=0xa dl_src=40:44:44:44:54:56 actions=push_vlan:0x8100,load:99->OXM_OF_VLAN_VID[[]],set_vlan_pcp:1,push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],controller
1255 cookie=0xa dl_src=40:44:44:44:54:57 actions=push_vlan:0x8100,load:99->OXM_OF_VLAN_VID[[]],set_vlan_pcp:1,push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],controller
1256 cookie=0xa dl_src=40:44:44:44:54:58,vlan_tci=0x1000/0x1000 actions=load:99->OXM_OF_VLAN_VID[[]],set_vlan_pcp:1,push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],controller
1257 cookie=0xa dl_src=40:44:44:44:54:59,vlan_tci=0x1000/0x1000 actions=push_mpls:0x8847,load:10->OXM_OF_MPLS_LABEL[[]],set_vlan_pcp:1,load:99->OXM_OF_VLAN_VID[[]],controller
1258 ])
1259 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 add-flows br0 flows.txt])
1260
1261 dnl Modified MPLS controller action.
1262 dnl In this test, we push the MPLS tag before pushing a VLAN tag, so we see
1263 dnl both of these in the final flow
1264 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1265
1266 for i in 1 2 3; do
1267     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:50,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=64,frag=no)'
1268 done
1269 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1270
1271 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1272 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1273 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:50,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1274 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1275 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1276 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1277 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1278 00000040  00 00 00 00
1279 dnl
1280 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1281 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:50,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1282 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1283 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1284 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1285 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1286 00000040  00 00 00 00
1287 dnl
1288 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1289 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:50,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1290 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1291 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1292 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1293 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1294 00000040  00 00 00 00
1295 ])
1296
1297 dnl Modified MPLS controller action.
1298 dnl In this test, the input packet in vlan-tagged, which should be stripped
1299 dnl before we push the MPLS and VLAN tags.
1300 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1301
1302 for i in 1 2 3; do
1303     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:51,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=88,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no))'
1304 done
1305 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1306 ovs-appctl -t ovs-ofctl exit
1307
1308 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1309 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1310 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:51,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1311 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1312 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1313 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1314 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1315 dnl
1316 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1317 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:51,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1318 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1319 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1320 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1321 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1322 dnl
1323 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1324 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:51,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1325 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1326 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1327 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1328 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1329 ])
1330
1331 dnl Modified MPLS controller action.
1332 dnl In this test, we push the MPLS tag before pushing a VLAN tag, so we see
1333 dnl both of these in the final flow
1334 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1335
1336 for i in 1 2 3; do
1337     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:52,dst=52:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no)'
1338 done
1339 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1340
1341 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1342 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1343 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:52,dl_dst=52:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1344 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1345 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1346 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1347 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1348 00000040  00 00 00 00
1349 dnl
1350 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1351 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:52,dl_dst=52:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1352 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1353 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1354 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1355 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1356 00000040  00 00 00 00
1357 dnl
1358 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1359 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:52,dl_dst=52:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1360 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1361 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1362 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1363 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1364 00000040  00 00 00 00
1365 ])
1366
1367 dnl Modified MPLS controller action.
1368 dnl In this test, the input packet in vlan-tagged, which should be stripped
1369 dnl before we push the MPLS and VLAN tags.
1370 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1371
1372 for i in 1 2 3; do
1373     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:53,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=88,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no))'
1374 done
1375 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1376 ovs-appctl -t ovs-ofctl exit
1377
1378 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1379 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1380 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:53,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1381 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1382 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1383 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1384 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1385 dnl
1386 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1387 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:53,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1388 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1389 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1390 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1391 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1392 dnl
1393 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1394 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:53,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1395 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1396 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1397 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1398 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1399 ])
1400
1401 dnl Modified MPLS controller action.
1402 dnl In this test, we push the VLAN tag before pushing a MPLS tag, but these
1403 dnl actions are reordered, so we see both of these in the final flow.
1404 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1405
1406 for i in 1 2 3; do
1407     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:54,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=64,frag=no)'
1408 done
1409 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1410 ovs-appctl -t ovs-ofctl exit
1411
1412 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1413 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1414 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:54,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1415 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1416 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1417 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1418 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1419 00000040  00 00 00 00
1420 dnl
1421 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1422 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:54,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1423 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1424 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1425 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1426 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1427 00000040  00 00 00 00
1428 dnl
1429 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1430 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:54,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1431 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1432 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1433 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1434 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1435 00000040  00 00 00 00
1436 ])
1437
1438 dnl Modified MPLS controller action.
1439 dnl In this test, the input packet in vlan-tagged, which should be stripped
1440 dnl before we push the MPLS and VLAN tags.
1441 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1442
1443 for i in 1 2 3; do
1444     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:55,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=88,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no))'
1445 done
1446 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1447 ovs-appctl -t ovs-ofctl exit
1448
1449 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1450 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1451 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:55,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1452 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1453 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1454 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1455 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1456 dnl
1457 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1458 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:55,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1459 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1460 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1461 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1462 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1463 dnl
1464 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1465 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:55,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1466 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1467 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1468 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1469 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1470 ])
1471
1472 dnl Modified MPLS controller action.
1473 dnl In this test, we push the VLAN tag before pushing a MPLS tag, but these
1474 dnl actions are reordered, so we see both of these in the final flow.
1475 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1476
1477 for i in 1 2 3; do
1478     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:56,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=64,frag=no)'
1479 done
1480 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1481 ovs-appctl -t ovs-ofctl exit
1482
1483 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1484 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1485 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:56,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1486 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1487 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1488 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1489 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1490 00000040  00 00 00 00
1491 dnl
1492 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1493 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:56,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1494 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1495 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1496 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1497 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1498 00000040  00 00 00 00
1499 dnl
1500 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1501 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:56,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1502 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1503 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1504 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1505 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1506 00000040  00 00 00 00
1507 ])
1508
1509 dnl Modified MPLS controller action.
1510 dnl In this test, the input packet in vlan-tagged, which should be stripped
1511 dnl before we push the MPLS and VLAN tags.
1512 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 -m 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
1513
1514 for i in 1 2 3; do
1515     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:57,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=88,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no))'
1516 done
1517 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1518 ovs-appctl -t ovs-ofctl exit
1519
1520 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1521 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1522 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:57,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1523 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1524 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1525 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1526 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1527 dnl
1528 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1529 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:57,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1530 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1531 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1532 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1533 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1534 dnl
1535 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1536 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:57,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1537 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1538 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1539 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1540 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1541 ])
1542
1543 dnl Modified MPLS controller action.
1544 dnl In this test, the input packet in vlan-tagged, which should be stripped
1545 dnl before we push the MPLS and VLAN tags.
1546 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1547
1548 for i in 1 2 3; do
1549     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:58,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=88,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no))'
1550 done
1551 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1552 ovs-appctl -t ovs-ofctl exit
1553
1554 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1555 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1556 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:58,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1557 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1558 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1559 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1560 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1561 dnl
1562 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1563 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:58,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1564 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1565 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1566 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1567 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1568 dnl
1569 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1570 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:58,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1571 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1572 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1573 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1574 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1575 ])
1576
1577 dnl Modified MPLS controller action.
1578 dnl In this test, the input packet in vlan-tagged, which should be modified
1579 dnl before we push MPLS and VLAN tags.
1580 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1581
1582 for i in 1 2 3; do
1583     ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=40:44:44:44:54:59,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=88,pcp=7),encap(eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no))'
1584 done
1585 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1586 ovs-appctl -t ovs-ofctl exit
1587
1588 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1589 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1590 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:59,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1591 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1592 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1593 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1594 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1595 dnl
1596 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1597 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:59,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1598 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1599 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1600 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1601 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1602 dnl
1603 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1604 mpls,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:54:59,dl_dst=50:54:00:00:00:07,mpls_label=10,mpls_tc=0,mpls_ttl=64,mpls_bos=1
1605 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1606 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1607 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1608 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1609 ])
1610
1611 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
1612 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1613  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:50 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,set_field:4195->vlan_vid,set_field:1->vlan_pcp,CONTROLLER:65535
1614  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:51 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,set_field:4195->vlan_vid,set_field:1->vlan_pcp,CONTROLLER:65535
1615  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:52 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,load:0x63->OXM_OF_VLAN_VID[[]],set_field:1->vlan_pcp,CONTROLLER:65535
1616  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:53 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],push_vlan:0x8100,load:0x63->OXM_OF_VLAN_VID[[]],set_field:1->vlan_pcp,CONTROLLER:65535
1617  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:54 actions=push_vlan:0x8100,set_field:4195->vlan_vid,set_field:1->vlan_pcp,push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
1618  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:55 actions=push_vlan:0x8100,set_field:4195->vlan_vid,set_field:1->vlan_pcp,push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
1619  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:56 actions=push_vlan:0x8100,load:0x63->OXM_OF_VLAN_VID[[]],set_field:1->vlan_pcp,push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
1620  cookie=0xa, n_packets=3, n_bytes=180, dl_src=40:44:44:44:54:57 actions=push_vlan:0x8100,load:0x63->OXM_OF_VLAN_VID[[]],set_field:1->vlan_pcp,push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
1621  cookie=0xa, n_packets=3, n_bytes=180, vlan_tci=0x1000/0x1000,dl_src=40:44:44:44:54:58 actions=load:0x63->OXM_OF_VLAN_VID[[]],set_field:1->vlan_pcp,push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],CONTROLLER:65535
1622  cookie=0xa, n_packets=3, n_bytes=180, vlan_tci=0x1000/0x1000,dl_src=40:44:44:44:54:59 actions=push_mpls:0x8847,load:0xa->OXM_OF_MPLS_LABEL[[]],set_field:1->vlan_pcp,load:0x63->OXM_OF_VLAN_VID[[]],CONTROLLER:65535
1623 OFPST_FLOW reply (OF1.2):
1624 ])
1625
1626 OVS_VSWITCHD_STOP
1627 AT_CLEANUP
1628
1629 AT_SETUP([ofproto-dpif - fragment handling])
1630 OVS_VSWITCHD_START
1631 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
1632 AT_DATA([flows.txt], [dnl
1633 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
1634 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
1635 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
1636 priority=50 tcp ip_frag=no              actions=output:4
1637 priority=50 tcp ip_frag=first           actions=output:5
1638 priority=50 tcp ip_frag=later           actions=output:6
1639 ])
1640 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
1641
1642 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"
1643 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
1644 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
1645 later_flow="$base_flow,frag=later)"
1646
1647     # mode    no  first  later
1648 for tuple in \
1649     'normal    1     5      6' \
1650     'drop      1  drop   drop' \
1651     'nx-match  1     2      6'
1652 do
1653   set $tuple
1654   mode=$1
1655   no=$2
1656   first=$3
1657   later=$4
1658
1659   AT_CHECK([ovs-ofctl set-frags br0 $mode])
1660   for type in no first later; do
1661     eval flow=\$${type}_flow exp_output=\$$type
1662     printf "\n%s\n" "----$mode $type-----"
1663     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1664     : > expout
1665     if test $mode = drop && test $type != no; then
1666         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
1667     fi
1668     echo "Datapath actions: $exp_output" >> expout
1669     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
1670   done
1671 done
1672 OVS_VSWITCHD_STOP
1673 AT_CLEANUP
1674
1675 AT_SETUP([ofproto-dpif - exit])
1676 OVS_VSWITCHD_START
1677 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
1678 AT_DATA([flows.txt], [dnl
1679 in_port=1 actions=output:10,exit,output:11
1680 in_port=2 actions=output:12,resubmit:1,output:12
1681 in_port=3 actions=output:13,resubmit:2,output:14
1682 ])
1683 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1684 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
1685 AT_CHECK([tail -1 stdout], [0],
1686   [Datapath actions: 10
1687 ])
1688 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
1689 AT_CHECK([tail -1 stdout], [0],
1690   [Datapath actions: 12,10
1691 ])
1692 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy '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])
1693 AT_CHECK([tail -1 stdout], [0],
1694   [Datapath actions: 13,12,10
1695 ])
1696 OVS_VSWITCHD_STOP
1697 AT_CLEANUP
1698
1699
1700 AT_SETUP([ofproto-dpif - mirroring, select_all])
1701 OVS_VSWITCHD_START
1702 ADD_OF_PORTS([br0], 1, 2, 3)
1703 ovs-vsctl \
1704         set Bridge br0 mirrors=@m --\
1705         --id=@p3 get Port p3 --\
1706         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1707
1708 AT_DATA([flows.txt], [dnl
1709 in_port=1 actions=output:2
1710 in_port=2 actions=output:1
1711 ])
1712 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1713
1714 flow="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)"
1715 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1716 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1717   [Datapath actions: 2,3
1718 ])
1719
1720 flow="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)"
1721 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1722 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1723   [Datapath actions: 1,3
1724 ])
1725
1726 OVS_VSWITCHD_STOP
1727 AT_CLEANUP
1728
1729
1730 AT_SETUP([ofproto-dpif - mirroring, select_src])
1731 OVS_VSWITCHD_START
1732 ADD_OF_PORTS([br0], 1, 2, 3)
1733 ovs-vsctl \
1734         set Bridge br0 mirrors=@m --\
1735         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
1736         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
1737
1738 AT_DATA([flows.txt], [dnl
1739 in_port=1 actions=output:2
1740 in_port=2 actions=output:1
1741 ])
1742 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1743
1744 flow="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)"
1745 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1746 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1747   [Datapath actions: 2,3
1748 ])
1749
1750 flow="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)"
1751 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1752 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1753   [Datapath actions: 1
1754 ])
1755 OVS_VSWITCHD_STOP
1756 AT_CLEANUP
1757
1758 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
1759 OVS_VSWITCHD_START
1760 ADD_OF_PORTS([br0], 1, 2)
1761 ovs-vsctl \
1762         set Bridge br0 mirrors=@m --\
1763         --id=@p2 get Port p2 --\
1764         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
1765
1766 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
1767
1768 # "in_port" defaults to OFPP_NONE if it's not specified.
1769 flow="icmp,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_ttl=128,icmp_type=8,icmp_code=0"
1770 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1771 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1772   [Datapath actions: 1,2
1773 ])
1774
1775 OVS_VSWITCHD_STOP
1776 AT_CLEANUP
1777
1778
1779 AT_SETUP([ofproto-dpif - mirroring, select_dst])
1780 OVS_VSWITCHD_START
1781 ADD_OF_PORTS([br0], 1, 2, 3)
1782 ovs-vsctl \
1783         set Bridge br0 mirrors=@m --\
1784         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1785         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
1786
1787 AT_DATA([flows.txt], [dnl
1788 in_port=1 actions=output:2
1789 in_port=2 actions=output:1
1790 ])
1791 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1792
1793 flow="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)"
1794 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1795 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1796   [Datapath actions: 2,3
1797 ])
1798
1799 flow="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)"
1800 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1801 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1802   [Datapath actions: 1
1803 ])
1804
1805 OVS_VSWITCHD_STOP
1806 AT_CLEANUP
1807
1808
1809 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
1810 OVS_VSWITCHD_START
1811 ADD_OF_PORTS([br0], 1, 2, 3)
1812 ovs-vsctl \
1813         set Bridge br0 mirrors=@m --\
1814         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1815         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
1816
1817 AT_DATA([flows.txt], [dnl
1818 in_port=1, actions=output:2
1819 ])
1820 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1821
1822 flow="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)"
1823 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1824 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1825   [Datapath actions: 2
1826 ])
1827
1828 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=10,pcp=0),encap(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))"
1829 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1830 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1831   [Datapath actions: 2
1832 ])
1833
1834 flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x8100),vlan(vid=11,pcp=0),encap(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))"
1835 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1836 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1837   [Datapath actions: 2,3
1838 ])
1839
1840 OVS_VSWITCHD_STOP
1841 AT_CLEANUP
1842
1843
1844 AT_SETUP([ofproto-dpif - mirroring, output_port])
1845 OVS_VSWITCHD_START
1846 ADD_OF_PORTS([br0], 1, 2, 3)
1847 ovs-vsctl \
1848         set Bridge br0 mirrors=@m --\
1849         --id=@p3 get Port p3 --\
1850         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1851
1852 AT_DATA([flows.txt], [dnl
1853 in_port=1 actions=mod_vlan_vid:17,output:2
1854 in_port=2 actions=output:1
1855 ])
1856 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1857
1858 flow="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)"
1859 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1860 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1861   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1862 ])
1863
1864 flow="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)"
1865 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1866 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1867   [Datapath actions: 1,3
1868 ])
1869
1870 OVS_VSWITCHD_STOP
1871 AT_CLEANUP
1872
1873 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1874 OVS_VSWITCHD_START
1875 ADD_OF_PORTS([br0], 1, 2)
1876 ovs-vsctl \
1877         set Bridge br0 mirrors=@m --\
1878         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1879
1880 AT_DATA([flows.txt], [dnl
1881 in_port=1 actions=output:2
1882 in_port=2 actions=mod_vlan_vid:17,output:1
1883 ])
1884 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1885
1886 flow="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)"
1887 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1888 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1889
1890 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1891 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1892 mv stdout expout
1893 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1894
1895 flow="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)"
1896 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1897 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1898
1899 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1900 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1901 mv stdout expout
1902 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1903
1904 OVS_VSWITCHD_STOP
1905 AT_CLEANUP
1906
1907 # Two testcases below are for the ofproto/trace command
1908 # The first one tests all correct syntax:
1909 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1910 # ofproto/trace br_name br_flow [-generate|packet]
1911 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1912 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1913 ADD_OF_PORTS([br0], 1, 2, 3)
1914
1915 AT_DATA([flows.txt], [dnl
1916 in_port=1 actions=output:2
1917 in_port=2 actions=output:1
1918 ])
1919 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1920
1921 odp_flow="in_port(p1)"
1922 br_flow="in_port=1"
1923 # Test command: ofproto/trace odp_flow with in_port as a name.
1924 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1925 AT_CHECK([tail -1 stdout], [0], [dnl
1926 Datapath actions: 2
1927 ])
1928
1929 odp_flow="in_port(1)"
1930 # Test command: ofproto/trace odp_flow
1931 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1932 AT_CHECK([tail -1 stdout], [0], [dnl
1933 Datapath actions: 2
1934 ])
1935
1936 # Test command: ofproto/trace dp_name odp_flow
1937 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1938 AT_CHECK([tail -1 stdout], [0], [dnl
1939 Datapath actions: 2
1940 ])
1941 # Test commmand: ofproto/trace br_name br_flow
1942 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1943 AT_CHECK([tail -1 stdout], [0], [dnl
1944 Datapath actions: 2
1945 ])
1946
1947 # Delete the inserted flows
1948 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1949 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1950
1951 # This section beflow tests the [-generate] option
1952 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1953 br_flow="arp,metadata=0,in_port=3,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=ff:ff:ff:ff:ff:ff"
1954
1955 # Test command: ofproto/trace odp_flow
1956 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1957 # Check for no MAC learning entry
1958 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1959  port  VLAN  MAC                Age
1960 ])
1961
1962 # Test command: ofproto/trace br_name br_flow
1963 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1964 # Check for no MAC learning entry
1965 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1966  port  VLAN  MAC                Age
1967 ])
1968
1969 # Test command: ofproto/trace odp_flow -generate
1970 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1971 # Check for the MAC learning entry
1972 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1973  port  VLAN  MAC                Age
1974     3     0  50:54:00:00:00:05    ?
1975 ])
1976
1977 # Test command: ofproto/trace dp_name odp_flow -generate
1978 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1979   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1980   -generate], [0], [stdout])
1981 # Check for both MAC learning entries
1982 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1983  port  VLAN  MAC                Age
1984     3     0  50:54:00:00:00:05    ?
1985     1     0  50:54:00:00:00:06    ?
1986 ])
1987
1988 # Test command: ofproto/trace br_name br_flow -generate
1989 AT_CHECK([ovs-appctl ofproto/trace br0 \
1990   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1991   -generate], [0], [stdout])
1992 # Check for both MAC learning entries.
1993 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1994  port  VLAN  MAC                Age
1995     3     0  50:54:00:00:00:05    ?
1996     1     0  50:54:00:00:00:06    ?
1997     2     0  50:54:00:00:00:07    ?
1998 ])
1999
2000 # This section beflow tests the [packet] option
2001 # The ovs-tcpundump of packets between port1 and port2
2002 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
2003 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
2004
2005 # Construct the MAC learning table
2006 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
2007   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
2008   -generate], [0], [stdout])
2009
2010 # Construct the MAC learning table
2011 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
2012   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
2013   -generate], [0], [stdout])
2014
2015 # Test command: ofproto/trace odp_flow packet
2016 AT_CHECK([ovs-appctl ofproto/trace \
2017   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
2018 AT_CHECK([tail -1 stdout], [0], [dnl
2019 Datapath actions: 2
2020 ])
2021 AT_CHECK([head -n 2 stdout], [0], [dnl
2022 Bridge: br0
2023 Flow: pkt_mark=0x2,skb_priority=0x1,arp,metadata=0,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
2024 ])
2025
2026 # Test command: ofproto/trace dp_name odp_flow packet
2027 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
2028   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
2029 AT_CHECK([tail -1 stdout], [0], [dnl
2030 Datapath actions: 2
2031 ])
2032 AT_CHECK([head -n 2 stdout], [0], [dnl
2033 Bridge: br0
2034 Flow: pkt_mark=0x2,skb_priority=0x1,arp,metadata=0,in_port=1,vlan_tci=0x0000,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
2035 ])
2036
2037 # Test command: ofproto/trace br_name br_flow packet
2038 AT_CHECK([ovs-appctl ofproto/trace br0 \
2039   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
2040 AT_CHECK([tail -1 stdout], [0], [dnl
2041 Datapath actions: 1
2042 ])
2043 AT_CHECK([head -n 2 stdout], [0], [dnl
2044 Bridge: br0
2045 Flow: pkt_mark=0x1,skb_priority=0x2,arp,metadata=0,in_port=2,vlan_tci=0x0000,dl_src=50:54:00:00:00:02,dl_dst=50:54:00:00:00:01,arp_spa=0.0.0.0,arp_tpa=0.0.0.0,arp_sha=00:00:00:00:00:00,arp_tha=00:00:00:00:00:00
2046 ])
2047
2048 OVS_VSWITCHD_STOP
2049 AT_CLEANUP
2050
2051 # The second test tests the corner cases
2052 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
2053 OVS_VSWITCHD_START
2054 ADD_OF_PORTS([br0], 1, 2)
2055
2056 # Define flows
2057 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
2058 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
2059 # Define options
2060 generate="-generate"
2061 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
2062
2063 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
2064 m4_foreach(
2065 [option],
2066 [[],
2067 ["$generate"],
2068 ["$pkt"]],
2069 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
2070   [2], [], [stderr])
2071 AT_CHECK([tail -2 stderr], [0], [dnl
2072 Cannot find the datapath
2073 ovs-appctl: ovs-vswitchd: server returned an error
2074 ])])
2075
2076 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
2077 m4_foreach(
2078 [option],
2079 [[],
2080 ["$generate"],
2081 ["$pkt"]],
2082 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
2083   [2], [], [stderr])
2084 AT_CHECK([tail -2 stderr], [0], [dnl
2085 Cannot find the datapath
2086 ovs-appctl: ovs-vswitchd: server returned an error
2087 ])])
2088
2089 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
2090 m4_foreach(
2091 [option],
2092 [[],
2093 ["$generate"],
2094 ["$pkt"]],
2095 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
2096   [2], [], [stderr])
2097 AT_CHECK([tail -2 stderr], [0], [dnl
2098 Cannot find the datapath
2099 ovs-appctl: ovs-vswitchd: server returned an error
2100 ])])
2101
2102 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
2103 m4_foreach(
2104 [option],
2105 [[],
2106 ["$generate"],
2107 ["$pkt"]],
2108 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
2109   [2], [], [stderr])
2110 AT_CHECK([tail -2 stderr], [0], [dnl
2111 Cannot find the datapath
2112 ovs-appctl: ovs-vswitchd: server returned an error
2113 ])])
2114
2115 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
2116 m4_foreach(
2117 [option],
2118 [[],
2119 ["$generate"],
2120 ["$pkt"]],
2121 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
2122   [2], [], [stderr])
2123 AT_CHECK([tail -2 stderr], [0], [dnl
2124 Unknown bridge name
2125 ovs-appctl: ovs-vswitchd: server returned an error
2126 ])])
2127
2128 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
2129 m4_foreach(
2130 [option],
2131 [[],
2132 ["$generate"],
2133 ["$pkt"]],
2134 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
2135   [2], [], [stderr])
2136 AT_CHECK([tail -2 stderr], [0], [dnl
2137 Must specify bridge name
2138 ovs-appctl: ovs-vswitchd: server returned an error
2139 ])])
2140
2141 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
2142 AT_CHECK([ovs-appctl ofproto/trace \
2143   ovs-dummy "$odp_flow" garbage_option],
2144   [2], [stdout],[stderr])
2145 AT_CHECK([tail -2 stderr], [0], [dnl
2146 Trailing garbage in packet data
2147 ovs-appctl: ovs-vswitchd: server returned an error
2148 ])
2149
2150 # Test incorrect command: ofproto/trace with 4 arguments
2151 AT_CHECK([ovs-appctl ofproto/trace \
2152   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
2153 AT_CHECK([tail -2 stderr], [0], [dnl
2154 "ofproto/trace" command takes at most 3 arguments
2155 ovs-appctl: ovs-vswitchd: server returned an error
2156 ])
2157
2158 # Test incorrect command: ofproto/trace with 0 argument
2159 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
2160 AT_CHECK([tail -2 stderr], [0], [dnl
2161 "ofproto/trace" command requires at least 1 arguments
2162 ovs-appctl: ovs-vswitchd: server returned an error
2163 ])
2164
2165 OVS_VSWITCHD_STOP
2166 AT_CLEANUP
2167
2168 AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
2169 OVS_VSWITCHD_START
2170 ADD_OF_PORTS([br0], 1, 2, 3)
2171
2172 AT_DATA([flows.txt], [dnl
2173 in_port=1 actions=output:2
2174 in_port=2 actions=output:1
2175 ])
2176 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2177
2178 AT_CHECK([ovs-appctl ofproto/trace-packet-out br0 in_port=1 'mod_vlan_vid:123,resubmit(,0)'], [0], [stdout])
2179 AT_CHECK([tail -1 stdout], [0], [dnl
2180 Datapath actions: push_vlan(vid=123,pcp=0),2
2181 ])
2182
2183 OVS_VSWITCHD_STOP
2184 AT_CLEANUP
2185
2186
2187 m4_define([OFPROTO_TRACE],
2188   [flow="$2"
2189    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
2190    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
2191    expected="$4"
2192    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
2193      [0], [stdout])
2194    mv stdout expout
2195    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
2196      [0], [expout])])
2197
2198 AT_SETUP([ofproto-dpif - MAC learning])
2199 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
2200 ADD_OF_PORTS([br0], 1, 2, 3)
2201
2202 arp='eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
2203
2204 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
2205 OFPROTO_TRACE(
2206   [ovs-dummy],
2207   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
2208   [-generate],
2209   [1,2,100])
2210
2211 # Check for the MAC learning entry.
2212 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2213  port  VLAN  MAC                Age
2214     3     0  50:54:00:00:00:05    ?
2215 ])
2216
2217 # Trace a packet arrival destined for the learned MAC.
2218 # (This will also learn a MAC.)
2219 OFPROTO_TRACE(
2220   [ovs-dummy],
2221   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
2222   [-generate],
2223   [3])
2224
2225 # Check for both MAC learning entries.
2226 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2227  port  VLAN  MAC                Age
2228     3     0  50:54:00:00:00:05    ?
2229     1     0  50:54:00:00:00:06    ?
2230 ])
2231
2232 # Trace a packet arrival that updates the first learned MAC entry.
2233 OFPROTO_TRACE(
2234   [ovs-dummy],
2235   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
2236   [-generate],
2237   [1,3,100])
2238
2239 # Check that the MAC learning entry was updated.
2240 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2241  port  VLAN  MAC                Age
2242     1     0  50:54:00:00:00:06    ?
2243     2     0  50:54:00:00:00:05    ?
2244 ])
2245
2246 # Add another bridge.
2247 AT_CHECK(
2248   [ovs-vsctl \
2249      -- add-br br1 \
2250      -- set bridge br1 datapath-type=dummy])
2251 ADD_OF_PORTS([br1], 4, 5)
2252
2253 # Trace some packet arrivals in br1 to create MAC learning entries there too.
2254 OFPROTO_TRACE(
2255   [ovs-dummy],
2256   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
2257   [-generate],
2258   [5,101])
2259 OFPROTO_TRACE(
2260   [ovs-dummy],
2261   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
2262   [-generate],
2263   [4,101])
2264
2265 # Check that the MAC learning entries were added.
2266 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2267  port  VLAN  MAC                Age
2268     4     0  50:54:00:00:00:06    ?
2269     5     0  50:54:00:00:00:07    ?
2270 ])
2271
2272 # Delete port p1 and see that its MAC learning entry disappeared, and
2273 # that the MAC learning entry for the same MAC was also deleted from br1.
2274 AT_CHECK([ovs-vsctl del-port p1])
2275 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2276  port  VLAN  MAC                Age
2277     2     0  50:54:00:00:00:05    ?
2278 ])
2279 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2280  port  VLAN  MAC                Age
2281     5     0  50:54:00:00:00:07    ?
2282 ])
2283
2284 OVS_VSWITCHD_STOP
2285 AT_CLEANUP
2286
2287 AT_SETUP([ofproto-dpif - MAC table overflow])
2288 OVS_VSWITCHD_START(
2289   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
2290 ADD_OF_PORTS([br0], 1, 2, 3)
2291
2292 arp='eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
2293
2294 AT_CHECK([ovs-appctl time/stop])
2295
2296 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
2297 for i in 0 1 2 3 4 5 6 7 8 9; do
2298     OFPROTO_TRACE(
2299       [ovs-dummy],
2300       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
2301       [-generate],
2302       [1,2,100])
2303     ovs-appctl time/warp 1000
2304 done
2305
2306 # Check for the MAC learning entries.
2307 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
2308   [0], [dnl
2309     3     0  50:54:00:00:00:00
2310     3     0  50:54:00:00:00:01
2311     3     0  50:54:00:00:00:02
2312     3     0  50:54:00:00:00:03
2313     3     0  50:54:00:00:00:04
2314     3     0  50:54:00:00:00:05
2315     3     0  50:54:00:00:00:06
2316     3     0  50:54:00:00:00:07
2317     3     0  50:54:00:00:00:08
2318     3     0  50:54:00:00:00:09
2319  port  VLAN  MAC                Age
2320 ])
2321
2322 # Trace another ARP packet on another MAC.
2323 OFPROTO_TRACE(
2324   [ovs-dummy],
2325   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
2326   [-generate],
2327   [1,2,100])
2328
2329 # Check that the new one chased the oldest one out of the table.
2330 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
2331   [0], [dnl
2332     3     0  50:54:00:00:00:01    ?
2333     3     0  50:54:00:00:00:02    ?
2334     3     0  50:54:00:00:00:03    ?
2335     3     0  50:54:00:00:00:04    ?
2336     3     0  50:54:00:00:00:05    ?
2337     3     0  50:54:00:00:00:06    ?
2338     3     0  50:54:00:00:00:07    ?
2339     3     0  50:54:00:00:00:08    ?
2340     3     0  50:54:00:00:00:09    ?
2341     3     0  50:54:00:00:00:10    ?
2342  port  VLAN  MAC                Age
2343 ])
2344 OVS_VSWITCHD_STOP
2345 AT_CLEANUP
2346
2347 # CHECK_SFLOW_SAMPLING_PACKET(LOOPBACK_ADDR, ADDR_WITHOUT_BRACKETS)
2348 #
2349 # Test that sFlow samples packets correctly using IPv4/IPv6 sFlow collector
2350 #
2351 # IP_VERSION_TYPE is used in AT_SETUP
2352 m4_define([CHECK_SFLOW_SAMPLING_PACKET],
2353   [AT_SETUP([ofproto-dpif - sFlow packet sampling - $2 collector])
2354   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2355
2356   ON_EXIT([kill `cat test-sflow.pid`])
2357   AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:$1 > sflow.log], [0], [], [ignore])
2358   AT_CAPTURE_FILE([sflow.log])
2359   SFLOW_PORT=`parse_listening_port < test-sflow.log`
2360   ovs-appctl time/stop
2361
2362   ADD_OF_PORTS([br0], 1, 2)
2363   ovs-vsctl \
2364      set Interface br0 options:ifindex=1002 -- \
2365      set Interface p1 options:ifindex=1004 -- \
2366      set Interface p2 options:ifindex=1003 -- \
2367      set Bridge br0 sflow=@sf -- \
2368      --id=@sf create sflow targets=\"$1:$SFLOW_PORT\" \
2369        header=128 sampling=1 polling=1 agent=lo
2370
2371   dnl open with ARP packets to seed the bridge-learning.  The output
2372   dnl ifIndex numbers should be reported predictably after that.
2373   dnl Since we set sampling=1 we should see all of these packets
2374   dnl reported. Sorting the output by data-source and seqNo makes
2375   dnl it deterministic. Ensuring that we send at least two packets
2376   dnl into each port means we get to check the seq nos are
2377   dnl incrementing correctly.
2378   dnl because packets from different ports can be handled by separate
2379   dnl threads, put some sleeps
2380
2381   ovs-appctl netdev-dummy/receive p1 'in_port(2),eth(src=50:54:00:00:00:05,dst=FF:FF:FF:FF:FF:FF),eth_type(0x0806),arp(sip=192.168.0.2,tip=192.168.0.1,op=1,sha=50:54:00:00:00:05,tha=00:00:00:00:00:00)'
2382   sleep 1
2383   ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=FF:FF:FF:FF:FF:FF),eth_type(0x0806),arp(sip=192.168.0.1,tip=192.168.0.2,op=1,sha=50:54:00:00:00:07,tha=00:00:00:00:00:00)'
2384   sleep 1
2385   ovs-appctl netdev-dummy/receive p1 '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=64,frag=no),icmp(type=8,code=0)'
2386   sleep 1
2387   ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'
2388   ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x86dd),ipv6(src=fe80::1,dst=fe80::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'
2389
2390   dnl sleep long enough to get more than one counter sample
2391   dnl from each datasource so we can check sequence numbers
2392   for i in `seq 1 30`; do
2393       ovs-appctl time/warp 100
2394   done
2395   OVS_VSWITCHD_STOP
2396   ovs-appctl -t test-sflow exit
2397
2398   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
2399         /g']], [0], [dnl
2400 HEADER
2401         dgramSeqNo=1
2402         ds=127.0.0.1>2:1000
2403         fsSeqNo=1
2404         in_vlan=0
2405         in_priority=0
2406         out_vlan=0
2407         out_priority=0
2408         meanSkip=1
2409         samplePool=1
2410         dropEvents=0
2411         in_ifindex=1004
2412         in_format=0
2413         out_ifindex=2
2414         out_format=2
2415         hdr_prot=1
2416         pkt_len=64
2417         stripped=4
2418         hdr_len=60
2419         hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-05-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-05-C0-A8-00-02-00-00-00-00-00-00-C0-A8-00-01-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
2420 HEADER
2421         dgramSeqNo=1
2422         ds=127.0.0.1>2:1000
2423         fsSeqNo=2
2424         in_vlan=0
2425         in_priority=0
2426         out_vlan=0
2427         out_priority=0
2428         meanSkip=1
2429         samplePool=2
2430         dropEvents=0
2431         in_ifindex=1003
2432         in_format=0
2433         out_ifindex=2
2434         out_format=2
2435         hdr_prot=1
2436         pkt_len=64
2437         stripped=4
2438         hdr_len=60
2439         hdr=FF-FF-FF-FF-FF-FF-50-54-00-00-00-07-08-06-00-01-08-00-06-04-00-01-50-54-00-00-00-07-C0-A8-00-01-00-00-00-00-00-00-C0-A8-00-02-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
2440 HEADER
2441         dgramSeqNo=1
2442         ds=127.0.0.1>2:1000
2443         fsSeqNo=3
2444         in_vlan=0
2445         in_priority=0
2446         out_vlan=0
2447         out_priority=0
2448         meanSkip=1
2449         samplePool=3
2450         dropEvents=0
2451         in_ifindex=1004
2452         in_format=0
2453         out_ifindex=1003
2454         out_format=0
2455         hdr_prot=1
2456         pkt_len=64
2457         stripped=4
2458         hdr_len=60
2459         hdr=50-54-00-00-00-07-50-54-00-00-00-05-08-00-45-00-00-1C-00-00-00-00-40-01-F9-8D-C0-A8-00-01-C0-A8-00-02-08-00-F7-FF-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
2460 HEADER
2461         dgramSeqNo=1
2462         ds=127.0.0.1>2:1000
2463         fsSeqNo=4
2464         in_vlan=0
2465         in_priority=0
2466         out_vlan=0
2467         out_priority=0
2468         meanSkip=1
2469         samplePool=4
2470         dropEvents=0
2471         in_ifindex=1003
2472         in_format=0
2473         out_ifindex=1004
2474         out_format=0
2475         hdr_prot=1
2476         pkt_len=64
2477         stripped=4
2478         hdr_len=60
2479         hdr=50-54-00-00-00-05-50-54-00-00-00-07-08-00-45-00-00-1C-00-00-00-00-40-01-F9-8D-C0-A8-00-02-C0-A8-00-01-00-00-FF-FF-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
2480 HEADER
2481         dgramSeqNo=1
2482         ds=127.0.0.1>2:1000
2483         fsSeqNo=5
2484         in_vlan=0
2485         in_priority=0
2486         out_vlan=0
2487         out_priority=0
2488         meanSkip=1
2489         samplePool=5
2490         dropEvents=0
2491         in_ifindex=1003
2492         in_format=0
2493         out_ifindex=1004
2494         out_format=0
2495         hdr_prot=1
2496         pkt_len=64
2497         stripped=4
2498         hdr_len=60
2499         hdr=50-54-00-00-00-05-50-54-00-00-00-07-86-DD-67-00-00-00-00-00-0A-80-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-01-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-02-00-00-00-00-00-00
2500 ])
2501
2502   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
2503         /g']], [0], [dnl
2504 IFCOUNTERS
2505         dgramSeqNo=2
2506         ds=127.0.0.1>0:1002
2507         csSeqNo=1
2508         ifindex=1002
2509         type=6
2510         ifspeed=100000000
2511         direction=0
2512         status=3
2513         in_octets=0
2514         in_unicasts=0
2515         in_multicasts=0
2516         in_broadcasts=4294967295
2517         in_discards=0
2518         in_errors=0
2519         in_unknownprotos=4294967295
2520         out_octets=120
2521         out_unicasts=2
2522         out_multicasts=4294967295
2523         out_broadcasts=4294967295
2524         out_discards=0
2525         out_errors=0
2526         promiscuous=0
2527 IFCOUNTERS
2528         dgramSeqNo=2
2529         ds=127.0.0.1>0:1003
2530         csSeqNo=1
2531         ifindex=1003
2532         type=6
2533         ifspeed=100000000
2534         direction=0
2535         status=0
2536         in_octets=138
2537         in_unicasts=3
2538         in_multicasts=0
2539         in_broadcasts=4294967295
2540         in_discards=0
2541         in_errors=0
2542         in_unknownprotos=4294967295
2543         out_octets=120
2544         out_unicasts=2
2545         out_multicasts=4294967295
2546         out_broadcasts=4294967295
2547         out_discards=0
2548         out_errors=0
2549         promiscuous=0
2550 IFCOUNTERS
2551         dgramSeqNo=2
2552         ds=127.0.0.1>0:1004
2553         csSeqNo=1
2554         ifindex=1004
2555         type=6
2556         ifspeed=100000000
2557         direction=0
2558         status=0
2559         in_octets=84
2560         in_unicasts=2
2561         in_multicasts=0
2562         in_broadcasts=4294967295
2563         in_discards=0
2564         in_errors=0
2565         in_unknownprotos=4294967295
2566         out_octets=180
2567         out_unicasts=3
2568         out_multicasts=4294967295
2569         out_broadcasts=4294967295
2570         out_discards=0
2571         out_errors=0
2572         promiscuous=0
2573 IFCOUNTERS
2574         dgramSeqNo=3
2575         ds=127.0.0.1>0:1002
2576         csSeqNo=2
2577         ifindex=1002
2578         type=6
2579         ifspeed=100000000
2580         direction=0
2581         status=3
2582         in_octets=0
2583         in_unicasts=0
2584         in_multicasts=0
2585         in_broadcasts=4294967295
2586         in_discards=0
2587         in_errors=0
2588         in_unknownprotos=4294967295
2589         out_octets=120
2590         out_unicasts=2
2591         out_multicasts=4294967295
2592         out_broadcasts=4294967295
2593         out_discards=0
2594         out_errors=0
2595         promiscuous=0
2596 IFCOUNTERS
2597         dgramSeqNo=3
2598         ds=127.0.0.1>0:1003
2599         csSeqNo=2
2600         ifindex=1003
2601         type=6
2602         ifspeed=100000000
2603         direction=0
2604         status=0
2605         in_octets=138
2606         in_unicasts=3
2607         in_multicasts=0
2608         in_broadcasts=4294967295
2609         in_discards=0
2610         in_errors=0
2611         in_unknownprotos=4294967295
2612         out_octets=120
2613         out_unicasts=2
2614         out_multicasts=4294967295
2615         out_broadcasts=4294967295
2616         out_discards=0
2617         out_errors=0
2618         promiscuous=0
2619 IFCOUNTERS
2620         dgramSeqNo=3
2621         ds=127.0.0.1>0:1004
2622         csSeqNo=2
2623         ifindex=1004
2624         type=6
2625         ifspeed=100000000
2626         direction=0
2627         status=0
2628         in_octets=84
2629         in_unicasts=2
2630         in_multicasts=0
2631         in_broadcasts=4294967295
2632         in_discards=0
2633         in_errors=0
2634         in_unknownprotos=4294967295
2635         out_octets=180
2636         out_unicasts=3
2637         out_multicasts=4294967295
2638         out_broadcasts=4294967295
2639         out_discards=0
2640         out_errors=0
2641         promiscuous=0
2642 ])
2643   AT_CLEANUP])
2644
2645 CHECK_SFLOW_SAMPLING_PACKET([127.0.0.1], [IPv4])
2646 CHECK_SFLOW_SAMPLING_PACKET([[[::1]]], [IPv6])
2647
2648 # CHECK_NETFLOW_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2649 #
2650 # Test that basic NetFlow reports flow statistics correctly:
2651 # The initial packet of a flow are correctly accounted.
2652 # Later packets within a flow are correctly accounted.
2653 # Flow actions changing (in this case, due to MAC learning)
2654 # cause a record to be sent.
2655 #
2656 # IP_VERSION_TYPE is used in AT_SETUP
2657 m4_define([CHECK_NETFLOW_EXPIRATION],
2658   [AT_SETUP([ofproto-dpif - NetFlow flow expiration - $2 collector])
2659   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2660   ADD_OF_PORTS([br0], 1, 2)
2661
2662   ovs-appctl time/stop
2663   ON_EXIT([kill `cat test-netflow.pid`])
2664   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2665   AT_CAPTURE_FILE([netflow.log])
2666   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2667
2668   ovs-vsctl \
2669      set Bridge br0 netflow=@nf -- \
2670      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2671        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2672
2673   for delay in 1000 30000; do
2674       ovs-appctl netdev-dummy/receive p1 '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=64,frag=no),icmp(type=8,code=0)'
2675       ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'
2676
2677       ovs-appctl time/warp $delay
2678   done
2679
2680   ovs-appctl time/warp 6000
2681   sleep 1
2682   OVS_VSWITCHD_STOP
2683   ovs-appctl -t test-netflow exit
2684
2685   AT_CHECK([test `grep "192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0" netflow.log | wc -l` -eq 1])
2686
2687   AT_CHECK([test `grep "192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0" netflow.log | wc -l` -eq 1])
2688
2689   combined=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0" netflow.log | wc -l`
2690   separate=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 1 pkts, 60 bytes, ICMP 0:0" netflow.log | wc -l`
2691   AT_CHECK([test $separate = 2 || test $combined = 1], [0])
2692
2693   AT_CLEANUP])
2694
2695 CHECK_NETFLOW_EXPIRATION([127.0.0.1], [IPv4])
2696 CHECK_NETFLOW_EXPIRATION([[[::1]]], [IPv6])
2697
2698 # CHECK_NETFLOW_ACTIVE_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2699 #
2700 # Test that basic NetFlow reports active expirations correctly.
2701 #
2702 # IP_VERSION_TYPE is used in AT_SETUP
2703 m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
2704   [AT_SETUP([ofproto-dpif - NetFlow active expiration - $2 collector])
2705
2706   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2707   ADD_OF_PORTS([br0], 1, 2)
2708
2709   ON_EXIT([kill `cat test-netflow.pid`])
2710   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2711   AT_CAPTURE_FILE([netflow.log])
2712   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2713
2714   ovs-vsctl \
2715      set Bridge br0 netflow=@nf -- \
2716      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2717        engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
2718
2719   AT_CHECK([ovs-appctl time/stop])
2720   n=1
2721   while test $n -le 60; do
2722       n=`expr $n + 1`
2723
2724       ovs-appctl netdev-dummy/receive p1 '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=6,tos=0,ttl=64,frag=no),tcp(src=1234,dst=80)'
2725       ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
2726
2727       ovs-appctl time/warp 1000
2728   done
2729
2730   ovs-appctl time/warp 10000
2731
2732   sleep 1
2733   OVS_VSWITCHD_STOP
2734   ovs-appctl -t test-netflow exit
2735
2736   # Count the number of reported packets:
2737   # - From source to destination before MAC learning kicks in (just one).
2738   # - From source to destination after that.
2739   # - From destination to source.
2740   n_learn=0
2741   n_in=0
2742   n_out=0
2743   n_other=0
2744   n_recs=0
2745   none=0
2746   while read line; do
2747       pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
2748       case $pkts in
2749            [[0-9]]*) ;;
2750        *) continue ;;
2751       esac
2752
2753       case $line in
2754           "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2755               counter=n_learn
2756           ;;
2757       "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2758           counter=n_in
2759           ;;
2760       "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
2761           counter=n_out
2762           ;;
2763       *)
2764           counter=n_other
2765           ;;
2766       esac
2767       eval $counter=\`expr \$$counter + \$pkts\`
2768       n_recs=`expr $n_recs + 1`
2769   done < netflow.log
2770
2771   # There should be exactly 1 MAC learning packet,
2772   # exactly 59 other packets in that direction,
2773   # and exactly 60 packets in the other direction.
2774   AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
2775 ])
2776
2777   AT_CLEANUP])
2778
2779 CHECK_NETFLOW_ACTIVE_EXPIRATION([127.0.0.1], [IPv4])
2780 CHECK_NETFLOW_ACTIVE_EXPIRATION([[[::1]]], [IPv6])
2781
2782 AT_SETUP([ofproto-dpif - flow stats])
2783 OVS_VSWITCHD_START
2784 AT_CHECK([ovs-ofctl add-flow br0 "ip,actions=NORMAL"])
2785 AT_CHECK([ovs-ofctl add-flow br0 "icmp,actions=NORMAL"])
2786
2787 ovs-appctl time/stop
2788
2789 for i in `seq 1 10`; do
2790     ovs-appctl netdev-dummy/receive br0 'in_port(0),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no)'
2791 done
2792
2793 ovs-appctl time/warp 1000
2794
2795 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2796 AT_CHECK([STRIP_XIDS stdout | sed -n 's/duration=[[0-9]]*\.[[0-9]]*s/duration=0.0s/p'], [0], [dnl
2797  cookie=0x0, duration=0.0s, table=0, n_packets=10, n_bytes=600, idle_age=1, ip actions=NORMAL
2798  cookie=0x0, duration=0.0s, table=0, n_packets=0, n_bytes=0, idle_age=1, icmp actions=NORMAL
2799 ])
2800 OVS_VSWITCHD_STOP
2801 AT_CLEANUP
2802
2803 AT_SETUP([ofproto-dpif - flow stats, set-n-threads])
2804 OVS_VSWITCHD_START
2805 AT_CHECK([ovs-ofctl add-flow br0 "ip,actions=NORMAL"])
2806 AT_CHECK([ovs-ofctl add-flow br0 "icmp,actions=NORMAL"])
2807
2808 ovs-appctl time/stop
2809
2810 for i in `seq 1 10`; do
2811     ovs-appctl netdev-dummy/receive br0 'in_port(0),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no)'
2812 done
2813
2814 ovs-appctl time/warp 100
2815 AT_CHECK([ovs-vsctl set Open_vSwitch . other-config:n-revalidator-threads=2])
2816 ovs-appctl time/warp 1000
2817
2818 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2819 AT_CHECK([STRIP_XIDS stdout | sed -n 's/duration=[[0-9]]*\.[[0-9]]*s/duration=0.0s/p'], [0], [dnl
2820  cookie=0x0, duration=0.0s, table=0, n_packets=10, n_bytes=600, idle_age=1, ip actions=NORMAL
2821  cookie=0x0, duration=0.0s, table=0, n_packets=0, n_bytes=0, idle_age=1, icmp actions=NORMAL
2822 ])
2823 OVS_VSWITCHD_STOP
2824 AT_CLEANUP
2825
2826 AT_SETUP([idle_age and hard_age increase over time])
2827 OVS_VSWITCHD_START
2828
2829 # get_ages DURATION HARD IDLE
2830 #
2831 # Fetch the flow duration, hard age, and idle age into the variables
2832 # whose names are given as arguments.  Rounds DURATION down to the
2833 # nearest integer.  If hard_age doesn't appear in the output, sets
2834 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
2835 # to 0.
2836 get_ages () {
2837     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2838
2839     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
2840     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
2841     AS_VAR_COPY([$1], [duration])
2842
2843     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
2844     if test X"$hard" = X; then
2845         hard=none
2846     else
2847         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
2848     fi
2849     AS_VAR_COPY([$2], [hard])
2850
2851     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
2852     if test X"$idle" = X; then
2853         idle=0
2854     else
2855         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
2856     fi
2857     AS_VAR_COPY([$3], [idle])
2858 }
2859
2860 # Add a flow and get its initial hard and idle age.
2861 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
2862 get_ages duration1 hard1 idle1
2863
2864 ovs-appctl time/stop
2865 # Warp time forward by 10 seconds, then modify the flow's actions.
2866 ovs-appctl time/warp 10000
2867 get_ages duration2 hard2 idle2
2868 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
2869
2870 # Warp time forward by 10 seconds.
2871 ovs-appctl time/warp 10000
2872 get_ages duration3 hard3 idle3
2873
2874 # Warp time forward 10 more seconds, then pass some packets through the flow,
2875 # then warp forward a few more times because idle times are only updated
2876 # occasionally.
2877 ovs-appctl time/warp 10000
2878 ovs-appctl netdev-dummy/receive br0 'in_port(0),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)'
2879 ovs-appctl time/warp 1000
2880 ovs-appctl time/warp 1000
2881 ovs-appctl time/warp 1000
2882 get_ages duration4 hard4 idle4
2883
2884 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
2885 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
2886 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
2887
2888 # Duration should increase steadily over time.
2889 AT_CHECK([test $duration1 -lt $duration2])
2890 AT_CHECK([test $duration2 -lt $duration3])
2891 AT_CHECK([test $duration3 -lt $duration4])
2892
2893 # Hard age should be "none" initially because it's the same as flow_duration,
2894 # then it should increase.
2895 AT_CHECK([test $hard1 = none])
2896 AT_CHECK([test $hard2 = none])
2897 AT_CHECK([test $hard3 != none])
2898 AT_CHECK([test $hard4 != none])
2899 AT_CHECK([test $hard3 -lt $hard4])
2900
2901 # Idle age should increase from 1 to 2 to 3, then decrease.
2902 AT_CHECK([test $idle1 -lt $idle2])
2903 AT_CHECK([test $idle2 -lt $idle3])
2904 AT_CHECK([test $idle3 -gt $idle4])
2905
2906 # Check some invariant relationships.
2907 AT_CHECK([test $duration1 = $idle1])
2908 AT_CHECK([test $duration2 = $idle2])
2909 AT_CHECK([test $duration3 = $idle3])
2910 AT_CHECK([test $idle3 -gt $hard3])
2911 AT_CHECK([test $idle4 -lt $hard4])
2912 AT_CHECK([test $hard4 -lt $duration4])
2913
2914 OVS_VSWITCHD_STOP
2915 AT_CLEANUP
2916
2917 AT_SETUP([ofproto-dpif - fin_timeout])
2918 OVS_VSWITCHD_START
2919 AT_DATA([flows.txt], [dnl
2920 in_port=1 actions=output:2
2921 in_port=2 actions=mod_vlan_vid:17,output:1
2922 ])
2923 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2924 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2925 [NXST_FLOW reply:
2926  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2927 ])
2928
2929 ovs-appctl time/stop
2930 # Check that a TCP SYN packet does not change the timeout.  (Because
2931 # flow stats updates are mainly what implements the fin_timeout
2932 # feature, we warp forward a couple of times to ensure that flow stats
2933 # run before re-checking the flow table.)
2934 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2935 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2936 warped
2937 ])
2938 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2939 [NXST_FLOW reply:
2940  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2941 ])
2942 # Check that a TCP FIN packet does change the timeout.
2943 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2944 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2945 warped
2946 ])
2947 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2948 [NXST_FLOW reply:
2949  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2950 ])
2951 OVS_VSWITCHD_STOP
2952 AT_CLEANUP
2953
2954 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2955 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2956 ADD_OF_PORTS([br0], [1], [2])
2957 ADD_OF_PORTS([br1], [3])
2958
2959 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2960 dummy@br0
2961 dummy@br1
2962 ])
2963 OVS_VSWITCHD_STOP
2964 AT_CLEANUP
2965
2966 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2967 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2968 ADD_OF_PORTS([br0], [1], [2])
2969 ADD_OF_PORTS([br1], [3])
2970
2971 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2972 dummy@ovs-dummy: hit:0 missed:0
2973         br0:
2974                 br0 65534/100: (dummy)
2975                 p1 1/1: (dummy)
2976                 p2 2/2: (dummy)
2977         br1:
2978                 br1 65534/101: (dummy)
2979                 p3 3/3: (dummy)
2980 ])
2981 OVS_VSWITCHD_STOP
2982 AT_CLEANUP
2983
2984 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2985 OVS_VSWITCHD_START([add-br br1 -- \
2986                     set bridge br1 datapath-type=dummy fail-mode=secure])
2987 ADD_OF_PORTS([br0], [1], [2])
2988 ADD_OF_PORTS([br1], [3])
2989
2990 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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=64,frag=no),icmp(type=8,code=0)'])
2991 AT_CHECK([ovs-appctl netdev-dummy/receive p2 'in_port(2),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'])
2992 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),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)'])
2993
2994 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2995 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2996 skb_priority(0),in_port(2),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
2997 ])
2998
2999 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
3000 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
3001 ])
3002
3003 AT_CHECK([ovs-appctl dpif/dump-flows -m br0 | sort | STRIP_USED], [0], [dnl
3004 skb_priority(0),skb_mark(0/0),in_port(p1),eth(src=50:54:00:00:00:05/00:00:00:00:00:00,dst=50:54:00:00:00:07/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0,code=0/0), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
3005 skb_priority(0),skb_mark(0/0),in_port(p2),eth(src=50:54:00:00:00:07/00:00:00:00:00:00,dst=50:54:00:00:00:05/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=0/0,code=0/0), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
3006 ])
3007
3008 AT_CHECK([ovs-appctl dpif/dump-flows -m br1 | sort | STRIP_USED], [0], [dnl
3009 skb_priority(0),skb_mark(0/0),in_port(p3),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0,code=0/0), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
3010 ])
3011
3012 OVS_VSWITCHD_STOP
3013 AT_CLEANUP
3014
3015 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a userspace action])
3016 OVS_VSWITCHD_START([dnl
3017    add-port br0 p1 -- set Interface p1 type=dummy
3018 ])
3019 ON_EXIT([kill `cat ovs-ofctl.pid`])
3020
3021 AT_CAPTURE_FILE([ofctl_monitor.log])
3022 AT_DATA([flows.txt], [dnl
3023 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
3024 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
3025 ])
3026 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3027
3028 dnl Packet is sent to userspace because a MPLS push or pop action is applied to
3029 dnl a packet with 2 MPLS LSEs but dpif-netdev can't handle any labels.
3030 dnl
3031 dnl The input is a frame with two MPLS labels which tcpdump -vve shows as:
3032 dnl 60:66:66:66:66:00 > 50:54:00:00:00:07, ethertype MPLS unicast (0x8847), length 74: MPLS (label 20, exp 0, ttl 32)
3033 dnl         (label 20, exp 0, [S], ttl 32)
3034 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
3035 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
3036
3037 for dl_src in 00 01; do
3038     AT_CHECK([ovs-appctl netdev-dummy/receive p1 "505400000007 6066666666$dl_src 8847 00014020 00014120 45 00 00 2c 00 00 00 00 40 06 3b 78 c0 a8 00 01 c0 a8 00 02 00 50 00 00 00 00 00 2a 00 00 00 2a 50 00 27 10 77 44 00 00 48 4f 47 45"])
3039
3040     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
3041 skb_priority(0),in_port(1),eth(src=60:66:66:66:66:$dl_src/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:07/00:00:00:00:00:00),eth_type(0x8847),mpls(lse0=0x14020,lse1=0x14120), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
3042 ])
3043 done
3044
3045 OVS_VSWITCHD_STOP
3046 AT_CLEANUP
3047
3048
3049 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a drop])
3050 OVS_VSWITCHD_START([dnl
3051    add-port br0 p1 -- set Interface p1 type=dummy
3052 ])
3053 ON_EXIT([kill `cat ovs-ofctl.pid`])
3054
3055 AT_CAPTURE_FILE([ofctl_monitor.log])
3056 AT_DATA([flows.txt], [dnl
3057 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
3058 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
3059 ])
3060 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3061
3062 dnl Packet is dropped because an MPLS PUSH action is applied to a packet with
3063 dnl 4 MPLS LSEs but ovs-vswtichd can only handle up to 3 MPLS LSEs and thus
3064 dnl can't determine the resulting MPLS label after MPLS push/pop actions.
3065 dnl
3066 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
3067 dnl 60:66:66:66:66:01 > 50:54:00:00:00:07, ethertype MPLS unicast (0x8847), length 74: MPLS (label 20, exp 0, ttl 32)
3068 dnl         (label 20, exp 0, ttl 32)
3069 dnl         (label 20, exp 0, ttl 32)
3070 dnl         (label 20, exp 0, [S], ttl 32)
3071 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
3072 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
3073
3074 for dl_src in 00 01; do
3075     AT_CHECK([ovs-appctl netdev-dummy/receive p1 "505400000007 6066666666$dl_src 8847 00014020 00014120 45 00 00 2c 00 00 00 00 40 06 3b 78 c0 a8 00 01 c0 a8 00 02 00 50 00 00 00 00 00 2a 00 00 00 2a 50 00 27 10 77 44 00 00 48 4f 47 45"])
3076
3077     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
3078 skb_priority(0),in_port(1),eth(src=60:66:66:66:66:$dl_src/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:07/00:00:00:00:00:00),eth_type(0x8847),mpls(lse0=0x14020,lse1=0x14120), packets:0, bytes:0, used:never, actions:userspace(pid=0,slow_path(controller))
3079 ])
3080 done
3081
3082 OVS_VSWITCHD_STOP
3083 AT_CLEANUP
3084
3085 AT_SETUP([ofproto-dpif - patch ports])
3086 OVS_VSWITCHD_START([add-br br1 \
3087 -- set bridge br1 datapath-type=dummy fail-mode=secure \
3088 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
3089 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
3090
3091 ADD_OF_PORTS([br0], [2])
3092 ADD_OF_PORTS([br1], [3])
3093
3094 AT_CHECK([ovs-appctl time/stop])
3095
3096 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
3097 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
3098
3099 for i in $(seq 1 10); do
3100     ovs-appctl netdev-dummy/receive br0 'in_port(100),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=64,frag=no),icmp(type=8,code=0)'
3101 done
3102
3103 for i in $(seq 1 5); do
3104     ovs-appctl netdev-dummy/receive br1 'in_port(101),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
3105 done
3106
3107 AT_CHECK([ovs-appctl time/warp 500], [0],
3108 [warped
3109 ])
3110
3111 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
3112 dummy@ovs-dummy: hit:13 missed:2
3113         br0:
3114                 br0 65534/100: (dummy)
3115                 p2 2/2: (dummy)
3116                 pbr0 1/none: (patch: peer=pbr1)
3117         br1:
3118                 br1 65534/101: (dummy)
3119                 p3 3/3: (dummy)
3120                 pbr1 1/none: (patch: peer=pbr0)
3121 ])
3122
3123 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3124 skb_priority(0),in_port(100),eth_type(0x0800),ipv4(src=192.168.0.1/0.0.0.0,dst=192.168.0.2/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:9, bytes:540, used:0.0s, actions:101,3,2
3125 ]),
3126 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
3127 skb_priority(0),in_port(101),eth_type(0x0800),ipv4(src=192.168.0.2/0.0.0.0,dst=192.168.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:4, bytes:240, used:0.0s, actions:100,2,3
3128 ])
3129
3130 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
3131 OFPST_PORT reply (xid=0x4): 1 ports
3132   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
3133            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
3134 ])
3135
3136 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
3137 OFPST_PORT reply (xid=0x4): 1 ports
3138   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
3139            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
3140 ])
3141
3142 OVS_VSWITCHD_STOP
3143 AT_CLEANUP
3144
3145 AT_SETUP([ofproto-dpif - port duration])
3146 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
3147 ADD_OF_PORTS([br0], 1, 2)
3148
3149 ovs-appctl time/stop
3150 ovs-appctl time/warp 10000
3151
3152 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
3153 AT_CHECK([sed -n 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/p' stdout], [0],
3154 [dnl
3155            duration=?s
3156            duration=?s
3157            duration=?s
3158 ])
3159 OVS_VSWITCHD_STOP
3160 AT_CLEANUP
3161
3162 dnl ----------------------------------------------------------------------
3163 AT_BANNER([ofproto-dpif -- megaflows])
3164
3165 AT_SETUP([ofproto-dpif megaflow - port classification])
3166 OVS_VSWITCHD_START
3167 ADD_OF_PORTS([br0], [1], [2])
3168 AT_DATA([flows.txt], [dnl
3169 table=0 in_port=1 actions=output(2)
3170 ])
3171 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3172 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3173 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3174 sleep 1
3175 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3176 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
3177 ])
3178 OVS_VSWITCHD_STOP
3179 AT_CLEANUP
3180
3181 AT_SETUP([ofproto-dpif megaflow - L2 classification])
3182 OVS_VSWITCHD_START
3183 ADD_OF_PORTS([br0], [1], [2])
3184 AT_DATA([flows.txt], [dnl
3185 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
3186 ])
3187 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3188 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3189 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3190 sleep 1
3191 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3192 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3193 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3194 ])
3195 OVS_VSWITCHD_STOP
3196 AT_CLEANUP
3197
3198 AT_SETUP([ofproto-dpif megaflow - L3 classification])
3199 OVS_VSWITCHD_START
3200 ADD_OF_PORTS([br0], [1], [2])
3201 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
3202 AT_DATA([flows.txt], [dnl
3203 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
3204 ])
3205 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3206 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3207 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3208 sleep 1
3209 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3210 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.252,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3211 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3212 ])
3213 OVS_VSWITCHD_STOP
3214 AT_CLEANUP
3215
3216 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
3217 OVS_VSWITCHD_START
3218 ADD_OF_PORTS([br0], [1], [2])
3219 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=ipv6_dst,ipv6_src], [0], [ignore], [])
3220 AT_DATA([flows.txt], [dnl
3221 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
3222 ])
3223 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3224 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:1:2:3:4:5,dst=fe80::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'])
3225 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:5:4:3:2:1,dst=2001:db8:3c4d:1:2:3:4:1,label=0,proto=99,tclass=0x70,hlimit=64,frag=no)'])
3226 sleep 1
3227 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3228 skb_priority(0),in_port(1),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:1:2:3:4:5/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff,dst=fe80::2/::,label=0/0,proto=10/0,tclass=0x70/0,hlimit=128/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3229 skb_priority(0),in_port(1),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:5:4:3:2:1/ffff:ffff:ffff:fffc::,dst=2001:db8:3c4d:1:2:3:4:1/::,label=0/0,proto=99/0,tclass=0x70/0,hlimit=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3230 ])
3231 OVS_VSWITCHD_STOP
3232 AT_CLEANUP
3233
3234 AT_SETUP([ofproto-dpif megaflow - L4 classification])
3235 OVS_VSWITCHD_START
3236 ADD_OF_PORTS([br0], [1], [2])
3237 AT_DATA([flows.txt], [dnl
3238 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
3239 ])
3240 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3241 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3242 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3243 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3244 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0xff,code=0/0), packets:0, bytes:0, used:0.0s, actions: <del>
3245 ])
3246 OVS_VSWITCHD_STOP
3247 AT_CLEANUP
3248
3249 AT_SETUP([ofproto-dpif megaflow - normal])
3250 OVS_VSWITCHD_START
3251 ADD_OF_PORTS([br0], [1], [2])
3252 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3253 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3254 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3255 sleep 1
3256 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3257 skb_priority(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/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3258 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3259 ])
3260 OVS_VSWITCHD_STOP
3261 AT_CLEANUP
3262
3263 AT_SETUP([ofproto-dpif megaflow - mpls])
3264 OVS_VSWITCHD_START
3265 ADD_OF_PORTS([br0], [1], [2])
3266 AT_DATA([flows.txt], [dnl
3267 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
3268 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
3269 ])
3270 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3271 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'])
3272 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1)'])
3273 sleep 1
3274 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3275 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1), packets:0, bytes:0, used:never, actions: <del>
3276 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1), packets:0, bytes:0, used:never, actions: <del>
3277 ])
3278 OVS_VSWITCHD_STOP
3279 AT_CLEANUP
3280
3281 # CHECK_MEGAFLOW_NETFLOW(LOOPBACK_ADDR, IP_VERSION_TYPE)
3282 #
3283 # IP_VERSION_TYPE is used in AT_SETUP
3284 m4_define([CHECK_MEGAFLOW_NETFLOW],
3285   [AT_SETUP([ofproto-dpif megaflow - netflow - $2 collector])
3286   OVS_VSWITCHD_START
3287   ADD_OF_PORTS([br0], [1], [2])
3288
3289   dnl NetFlow configuration disables wildcarding relevant fields
3290   ON_EXIT([kill `cat test-netflow.pid`])
3291   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
3292   AT_CAPTURE_FILE([netflow.log])
3293   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
3294   ovs-vsctl \
3295      set Bridge br0 netflow=@nf -- \
3296      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
3297        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
3298
3299   AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3300   AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3301   AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3302   sleep 1
3303   AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3304 skb_priority(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/255.255.255.255,dst=10.0.0.1/255.255.255.255,proto=1/0xff,tos=0/0xfc,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
3305 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/255.255.255.255,proto=1/0xff,tos=0/0xfc,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
3306 ])
3307   OVS_VSWITCHD_STOP
3308   AT_CLEANUP])
3309
3310 CHECK_MEGAFLOW_NETFLOW([127.0.0.1], [IPv4])
3311 CHECK_MEGAFLOW_NETFLOW([[[::1]]], [IPv6])
3312
3313 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
3314 OVS_VSWITCHD_START(
3315   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
3316    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
3317    set interface p2 type=dummy ofport_request=2 -- \
3318    set interface p3 type=dummy ofport_request=3])
3319 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3320 ])
3321
3322 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3323 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3324 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3325 sleep 1
3326 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3327 skb_priority(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/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3328 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3329 ])
3330 OVS_VSWITCHD_STOP
3331 AT_CLEANUP
3332
3333 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
3334 OVS_VSWITCHD_START(
3335   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
3336    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
3337    set interface p2 type=dummy ofport_request=2 -- \
3338    set interface p3 type=dummy ofport_request=3])
3339 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3340 ])
3341
3342 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3343 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3344 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3345 sleep 1
3346 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3347 skb_priority(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/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3348 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3349 ])
3350 OVS_VSWITCHD_STOP
3351 AT_CLEANUP
3352
3353 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
3354 # Create bond0 on br0 with interfaces p0 and p1
3355 #    and bond1 on br1 with interfaces p2 and p3
3356 # with p0 patched to p2 and p1 patched to p3.
3357 OVS_VSWITCHD_START(
3358   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
3359                             other-config:lacp-time=fast \
3360                             other-config:bond-rebalance-interval=0 -- \
3361    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
3362    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
3363    add-br br1 -- \
3364    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
3365    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
3366                   fail-mode=secure -- \
3367    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
3368                             other-config:lacp-time=fast \
3369                             other-config:bond-rebalance-interval=0 -- \
3370    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
3371    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
3372
3373 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3374 ])
3375 ADD_OF_PORTS([br0], [7])
3376 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3377 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
3378 ovs-appctl time/stop
3379 ovs-appctl time/warp 5000
3380 AT_CHECK([ovs-appctl netdev-dummy/receive p7 '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)'])
3381 AT_CHECK([ovs-appctl netdev-dummy/receive p7 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3382 sleep 1
3383 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3384 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
3385 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:never, actions: <del>
3386 ])
3387 OVS_VSWITCHD_STOP
3388 AT_CLEANUP
3389
3390 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
3391 OVS_VSWITCHD_START
3392 ADD_OF_PORTS([br0], [1], [2])
3393 AT_DATA([flows.txt], [dnl
3394 table=0 in_port=1,ip actions=resubmit(90)
3395 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
3396 ])
3397 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3398 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3399 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3400 sleep 1
3401 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3402 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3403 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3404 ])
3405 OVS_VSWITCHD_STOP
3406 AT_CLEANUP
3407
3408 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
3409 OVS_VSWITCHD_START
3410 ADD_OF_PORTS([br0], [1], [2])
3411 AT_DATA([flows.txt], [dnl
3412 table=0 in_port=1,ip actions=resubmit(,1)
3413 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
3414 ])
3415 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3416 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3417 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=
3418 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3419 sleep 1
3420 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3421 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3422 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3423 ])
3424 OVS_VSWITCHD_STOP
3425 AT_CLEANUP
3426
3427 AT_SETUP([ofproto-dpif megaflow - goto_table action])
3428 OVS_VSWITCHD_START
3429 ADD_OF_PORTS([br0], [1], [2])
3430 AT_DATA([flows.txt], [dnl
3431 table=0 in_port=1,ip actions=goto_table(1)
3432 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
3433 ])
3434 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
3435 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3436 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3437 sleep 1
3438 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3439 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3440 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3441 ])
3442 OVS_VSWITCHD_STOP
3443 AT_CLEANUP
3444
3445 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
3446 OVS_VSWITCHD_START
3447 ADD_OF_PORTS([br0], [1], [2], [3])
3448 ovs-vsctl \
3449         set Bridge br0 mirrors=@m --\
3450         --id=@p3 get Port p3 --\
3451         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
3452
3453 AT_DATA([flows.txt], [dnl
3454 in_port=1 actions=output:2
3455 ])
3456 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3457 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3458 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3459 sleep 1
3460 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3461 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
3462 ])
3463 OVS_VSWITCHD_STOP
3464 AT_CLEANUP
3465
3466 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
3467 OVS_VSWITCHD_START
3468 ADD_OF_PORTS([br0], [1], [2], [3])
3469 ovs-vsctl \
3470         set Bridge br0 mirrors=@m --\
3471         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
3472         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
3473
3474 AT_DATA([flows.txt], [dnl
3475 in_port=1 actions=output:2
3476 ])
3477 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3478 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x8100),vlan(vid=11,pcp=7),encap(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))'])
3479 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3480 sleep 1
3481 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3482 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3483 skb_priority(0),in_port(1),eth_type(0x8100),vlan(vid=11/0xfff,pcp=7/0x0,cfi=1/1),encap(eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff)), packets:0, bytes:0, used:never, actions: <del>
3484 ])
3485 OVS_VSWITCHD_STOP
3486 AT_CLEANUP
3487
3488 AT_SETUP([ofproto-dpif megaflow - move action])
3489 OVS_VSWITCHD_START
3490 ADD_OF_PORTS([br0], [1], [2])
3491 AT_DATA([flows.txt], [dnl
3492 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
3493 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
3494 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
3495 ])
3496 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3497 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3498 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3499 sleep 1
3500 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3501 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3502 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3503 ])
3504 OVS_VSWITCHD_STOP
3505 AT_CLEANUP
3506
3507 AT_SETUP([ofproto-dpif megaflow - push action])
3508 OVS_VSWITCHD_START
3509 ADD_OF_PORTS([br0], [1], [2])
3510 AT_DATA([flows.txt], [dnl
3511 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
3512 ])
3513 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3514 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3515 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3516 sleep 1
3517 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3518 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3519 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3520 ])
3521 OVS_VSWITCHD_STOP
3522 AT_CLEANUP
3523
3524 AT_SETUP([ofproto-dpif megaflow - learning])
3525 OVS_VSWITCHD_START
3526 ADD_OF_PORTS([br0], [1], [2])
3527 AT_DATA([flows.txt], [dnl
3528 table=0 in_port=1 actions=load:2->NXM_NX_REG0[[0..15]],learn(table=1,priority=65535,NXM_OF_ETH_SRC[[]],NXM_OF_VLAN_TCI[[0..11]],output:NXM_NX_REG0[[0..15]]),output:2
3529 ])
3530 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3531 ovs-appctl time/stop
3532 # We send each packet twice because the first packet in each flow causes the
3533 # flow table to change and thus revalidations, which (depending on timing)
3534 # can keep a megaflow from being installed.  The revalidations are done by
3535 # the second iteration, allowing the flows to be installed.
3536 for i in 1 2; do
3537     AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3538     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3539     ovs-appctl time/warp 100
3540 done
3541 sleep 1
3542 dnl The original flow is missing due to a revalidation.
3543 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3544 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
3545 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
3546 ])
3547 OVS_VSWITCHD_STOP
3548 AT_CLEANUP
3549
3550 AT_SETUP([ofproto-dpif megaflow - tunnels])
3551 OVS_VSWITCHD_START(
3552   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
3553 AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=gre \
3554      options:remote_ip=1.1.1.1 ofport_request=2 options:key=flow])
3555 AT_CHECK([ovs-vsctl add-port br0 p3 -- set Interface p3 type=dummy \
3556           ofport_request=3])
3557 AT_CHECK([ovs-vsctl add-port br0 p4 -- set Interface p4 type=gre \
3558      options:remote_ip=1.1.1.2 options:tos=inherit options:ttl=inherit \
3559      ofport_request=4 options:key=flow])
3560 AT_DATA([flows.txt], [dnl
3561 in_port=1,actions=output(2)
3562 in_port=3,actions=output(4)
3563 ])
3564 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3565 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
3566 dnl will cause the packet to be dropped.
3567 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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=0xfd,ttl=128,frag=no),icmp(type=8,code=0)'])
3568 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0x1,ttl=64,frag=no),icmp(type=8,code=0)'])
3569 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),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=0xfd,ttl=128,frag=no),icmp(type=8,code=0)'])
3570 AT_CHECK([ovs-appctl netdev-dummy/receive p3 'in_port(3),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0x1,ttl=64,frag=no),icmp(type=8,code=0)'])
3571 sleep 1
3572 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3573 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0xfd/0x3,ttl=128/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
3574 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0xfd/0xff,ttl=128/0xff,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3575 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0x1/0xff,ttl=64/0xff,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3576 ])
3577 OVS_VSWITCHD_STOP
3578 AT_CLEANUP
3579
3580 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
3581 OVS_VSWITCHD_START
3582 ADD_OF_PORTS([br0], [1], [2])
3583 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
3584 AT_DATA([flows.txt], [dnl
3585 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
3586 ])
3587 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3588 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3589 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3590 sleep 1
3591 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3592 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.252,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions: <del>
3593 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no), packets:0, bytes:0, used:never, actions: <del>
3594 ])
3595 OVS_VSWITCHD_STOP
3596 AT_CLEANUP
3597
3598 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
3599 OVS_VSWITCHD_START
3600 ADD_OF_PORTS([br0], [1], [2])
3601 AT_DATA([flows.txt], [dnl
3602 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
3603 ])
3604 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3605 AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3606 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3607 sleep 1
3608 dnl The megaflows do not match the same fields, since the first packet
3609 dnl is essentially a no-op.  (The new destination MAC is the same as the
3610 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
3611 dnl so that a packet that doesn't need its MAC address changed doesn't
3612 dnl hide one that does.  Since the first entry doesn't need to change,
3613 dnl only the destination MAC address is matched (as decided by
3614 dnl ofproto-dpif).  The second entry actually updates the destination
3615 dnl MAC, so both the source and destination MAC addresses are
3616 dnl un-wildcarded, since the ODP commit functions update both the source
3617 dnl and destination MAC addresses.
3618 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3619 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/ff:ff:ff:ff:ff:ff),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:2
3620 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:never, actions:set(eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a)),2
3621 ])
3622 OVS_VSWITCHD_STOP
3623 AT_CLEANUP
3624
3625 AT_SETUP([ofproto-dpif megaflow - disabled])
3626 OVS_VSWITCHD_START
3627 ADD_OF_PORTS([br0], [1], [2])
3628 AT_DATA([flows.txt], [dnl
3629 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
3630 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
3631 ])
3632 AT_CHECK([ovs-appctl upcall/disable-megaflows], [0], [megaflows disabled
3633 ], [])
3634 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
3635 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3636 for i in 1 2 3 4; do
3637     AT_CHECK([ovs-appctl netdev-dummy/receive p1 '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)'])
3638     AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3639 done
3640 sleep 1
3641 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3642 skb_priority(0),skb_mark(0),in_port(1/0xffff),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), packets:3, bytes:180, used:0.0s, actions:2
3643 skb_priority(0),skb_mark(0),in_port(1/0xffff),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:drop
3644 ])
3645 OVS_VSWITCHD_STOP
3646 AT_CLEANUP
3647
3648 AT_SETUP([ofproto-dpif - datapath port number change])
3649 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
3650 ADD_OF_PORTS([br0], 1)
3651
3652 # Trace a flow that should output to p1.
3653 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3654   [0], [stdout])
3655 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
3656 ])
3657
3658 # Change p1's port number to 5.
3659 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
3660
3661 # Trace a flow that should output to p1 in its new location.
3662 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3663   [0], [stdout])
3664 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
3665 ])
3666 OVS_VSWITCHD_STOP
3667 AT_CLEANUP
3668
3669 # Tests the bundling with various bfd and cfm configurations.
3670 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
3671 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
3672                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
3673                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
3674                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
3675                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
3676                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
3677                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
3678                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
3679                     set Interface p0 cfm_mpid=1 -- \
3680                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
3681
3682 ovs-appctl time/stop
3683 # advance the clock to stablize everything.
3684 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3685 # cfm/show should show 'recv' fault.
3686 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3687         fault: recv
3688 ])
3689 # bfd/show should show 'up'.
3690 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3691         Local Session State: up
3692         Remote Session State: up
3693         Local Session State: up
3694         Remote Session State: up
3695 ])
3696 # bond/show should show 'may-enable: true' for all slaves.
3697 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3698         may_enable: true
3699         may_enable: true
3700         may_enable: true
3701         may_enable: true
3702 ])
3703
3704 # now disable the bfd on p1.
3705 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
3706 # advance the clock to stablize everything.
3707 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3708 # cfm/show should show 'recv' fault.
3709 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3710         fault: recv
3711 ])
3712 # bfd/show should show 'down'.
3713 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3714         Local Session State: down
3715         Remote Session State: down
3716 ])
3717 # bond/show should show 'may-enable: false' for p0.
3718 AT_CHECK([ovs-appctl bond/show br0bond | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3719         may_enable: false
3720         may_enable: true
3721 ])
3722
3723 # now enable the bfd on p1 and disable bfd on p0.
3724 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
3725 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
3726 # advance the clock to stablize everything.
3727 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3728 # cfm/show should show 'recv' fault.
3729 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3730         fault: recv
3731 ])
3732 # bfd/show should show 'down'.
3733 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3734         Local Session State: down
3735         Remote Session State: down
3736 ])
3737 # bond/show should show 'may-enable: false' for p0 and p1.
3738 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3739         may_enable: false
3740         may_enable: true
3741         may_enable: false
3742         may_enable: true
3743 ])
3744
3745 OVS_VSWITCHD_STOP
3746 AT_CLEANUP
3747
3748 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 1])
3749 OVS_VSWITCHD_START([add-port br0 p0 -- set interface p0 type=gre options:remote_ip=1.2.3.4])
3750
3751 # enable bfd on p0.
3752 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3753 # check log.
3754 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3755 monitor thread created
3756 ])
3757 # disable bfd on p0.
3758 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3759 # check log.
3760 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3761 monitor thread terminated
3762 ])
3763 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3764
3765 # enable cfm on p0.
3766 AT_CHECK([ovs-vsctl set interface p0 cfm_mpid=10])
3767 # check log.
3768 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3769 monitor thread created
3770 ])
3771 # disable cfm on p0.
3772 AT_CHECK([ovs-vsctl remove interface p0 cfm_mpid 10])
3773 # check log.
3774 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3775 monitor thread terminated
3776 ])
3777 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3778
3779 # enable both bfd and cfm on p0.
3780 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true cfm_mpid=10])
3781 # check log.
3782 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3783 monitor thread created
3784 ])
3785 # disable bfd on p0.
3786 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3787 # check log, there should not be the log of thread terminated.
3788 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3789 ])
3790 # reenable bfd on p0.
3791 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3792 # check log, should still be on log of thread created.
3793 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3794 monitor thread created
3795 ])
3796 # disable bfd and cfm together.
3797 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false -- remove interface p0 cfm_mpid 10])
3798 # check log.
3799 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3800 monitor thread terminated
3801 ])
3802
3803 OVS_VSWITCHD_STOP
3804 AT_CLEANUP
3805
3806 # this test helps avoid the deadlock between the main thread and monitor thread.
3807 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 2])
3808 OVS_VSWITCHD_START
3809
3810 for i in `seq 1 199`
3811 do
3812     AT_CHECK([ovs-vsctl add-port br0 p$i -- set interface p$i type=gre options:remote_ip=1.2.3.4 options:key=$i bfd:enable=true])
3813 done
3814
3815 OVS_VSWITCHD_STOP
3816 AT_CLEANUP
3817 \f
3818 AT_BANNER([ofproto-dpif - flow translation resource limits])
3819
3820 AT_SETUP([ofproto-dpif - infinite resubmit])
3821 OVS_VSWITCHD_START
3822 AT_CHECK([ovs-ofctl add-flow br0 actions=resubmit:1,resubmit:2,output:3])
3823 AT_CHECK([ovs-appctl ofproto/trace br0 'eth_dst=ff:ff:ff:ff:ff:ff'],
3824   [0], [stdout])
3825 AT_CHECK([tail -1 stdout], [0], [Datapath actions: drop
3826 ])
3827 AT_CHECK([grep -c 'resubmit actions recursed over 64 times' ovs-vswitchd.log],
3828   [0], [1
3829 ])
3830 OVS_VSWITCHD_STOP(["/resubmit actions recursed/d"])
3831 AT_CLEANUP
3832
3833 AT_SETUP([ofproto-dpif - exponential resubmit chain])
3834 OVS_VSWITCHD_START
3835 ADD_OF_PORTS([br0], 1)
3836 (for i in `seq 1 64`; do
3837      j=`expr $i + 1`
3838      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3839  done
3840  echo "in_port=65, actions=local") > flows
3841  AT_CHECK([ovs-ofctl add-flows br0 flows])
3842 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3843 AT_CHECK([grep -c 'over 4096 resubmit actions' ovs-vswitchd.log], [0], [1
3844 ])
3845 OVS_VSWITCHD_STOP(["/over.*resubmit actions/d"])
3846 AT_CLEANUP
3847
3848 AT_SETUP([ofproto-dpif - too many output actions])
3849 OVS_VSWITCHD_START
3850 ADD_OF_PORTS([br0], 1)
3851 (for i in `seq 1 12`; do
3852      j=`expr $i + 1`
3853      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3854  done
3855  echo "in_port=13, actions=local,local,local,local,local,local,local,local") > flows
3856 AT_CHECK([ovs-ofctl add-flows br0 flows])
3857 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3858 AT_CHECK([grep -c -e '- Uses action(s) not supported by datapath' stdout],
3859   [0], [1
3860 ])
3861 AT_CHECK([grep -c 'resubmits yielded over 64 kB of actions' ovs-vswitchd.log], [0], [1
3862 ])
3863 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of actions/d"])
3864 AT_CLEANUP
3865
3866 AT_SETUP([ofproto-dpif - stack too deep])
3867 OVS_VSWITCHD_START
3868 ADD_OF_PORTS([br0], 1)
3869 (for i in `seq 1 12`; do
3870      j=`expr $i + 1`
3871      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3872  done
3873  push="push:NXM_NX_REG0[[]]"
3874  echo "in_port=13, actions=$push,$push,$push,$push,$push,$push,$push,$push") > flows
3875  AT_CHECK([ovs-ofctl add-flows br0 flows])
3876 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3877 AT_CHECK([grep -c 'resubmits yielded over 64 kB of stack' ovs-vswitchd.log], [0], [1
3878 ])
3879 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of stack/d"])
3880 AT_CLEANUP