ofproto-dpif.at: Avoid races in MPLS tests
[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 sleep 1
1147 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1148
1149 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1150 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1151 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
1152 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1153 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1154 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1155 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1156 dnl
1157 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1158 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
1159 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1160 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1161 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1162 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1163 dnl
1164 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1165 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
1166 00000000  50 54 00 00 00 07 40 44-44 44 00 00 88 47 00 00
1167 00000010  01 40 45 00 00 28 00 00-00 00 40 06 f9 7c c0 a8
1168 00000020  00 01 c0 a8 00 02 00 00-00 00 00 00 00 00 00 00
1169 00000030  00 00 50 00 00 00 00 00-00 00 00 00 00 00 00 00
1170 ])
1171
1172 dnl In this test, we push an MPLS tag to an MPLS packet. The LSE should be
1173 dnl copied exactly, except for the BOS bit.
1174 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1175
1176 for i in 1 2 3; do
1177     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)'
1178 done
1179 sleep 1
1180 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1181
1182 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1183 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1184 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
1185 00000000  50 54 00 00 00 07 40 44-44 44 00 01 88 47 00 00
1186 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1187 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1188 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1189 dnl
1190 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1191 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
1192 00000000  50 54 00 00 00 07 40 44-44 44 00 01 88 47 00 00
1193 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1194 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1195 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1196 dnl
1197 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1198 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
1199 00000000  50 54 00 00 00 07 40 44-44 44 00 01 88 47 00 00
1200 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1201 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1202 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1203 ])
1204
1205 dnl In this test, we push an MPLS tag to an MPLS packet. The LSE should be
1206 dnl copied exactly, except for the BOS bit. The ethertype should be updated
1207 dnl to the MPLS ethertype of the MPLS push action which differs to that
1208 dnl of the input packet.
1209 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1210
1211 for i in 1 2 3; do
1212     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)'
1213 done
1214 sleep 1
1215 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1216
1217 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1218 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1219 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
1220 00000000  50 54 00 00 00 07 40 44-44 44 00 02 88 48 00 00
1221 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1222 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1223 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1224 dnl
1225 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1226 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
1227 00000000  50 54 00 00 00 07 40 44-44 44 00 02 88 48 00 00
1228 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1229 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1230 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1231 dnl
1232 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1233 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
1234 00000000  50 54 00 00 00 07 40 44-44 44 00 02 88 48 00 00
1235 00000010  a0 40 00 00 a1 40 00 00-00 00 00 00 00 00 00 00
1236 00000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1237 00000030  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1238 ])
1239
1240 OVS_VSWITCHD_STOP
1241 AT_CLEANUP
1242
1243 AT_SETUP([ofproto-dpif - VLAN+MPLS handling])
1244 OVS_VSWITCHD_START([dnl
1245    add-port br0 p1 -- set Interface p1 type=dummy
1246 ])
1247 ON_EXIT([kill `cat ovs-ofctl.pid`])
1248
1249 AT_CAPTURE_FILE([ofctl_monitor.log])
1250 AT_DATA([flows.txt], [dnl
1251 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
1252 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
1253 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
1254 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
1255 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
1256 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
1257 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
1258 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
1259 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
1260 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
1261 ])
1262 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 add-flows br0 flows.txt])
1263
1264 dnl Modified MPLS controller action.
1265 dnl In this test, we push the MPLS tag before pushing a VLAN tag, so we see
1266 dnl both of these in the final flow
1267 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1268
1269 for i in 1 2 3; do
1270     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)'
1271 done
1272 sleep 1
1273 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1274
1275 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1276 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1277 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
1278 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1279 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1280 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1281 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1282 00000040  00 00 00 00
1283 dnl
1284 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1285 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
1286 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1287 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1288 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1289 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1290 00000040  00 00 00 00
1291 dnl
1292 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1293 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
1294 00000000  50 54 00 00 00 07 40 44-44 44 54 50 81 00 20 63
1295 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1296 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1297 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1298 00000040  00 00 00 00
1299 ])
1300
1301 dnl Modified MPLS controller action.
1302 dnl In this test, the input packet in vlan-tagged, which should be stripped
1303 dnl before we push the MPLS and VLAN tags.
1304 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1305
1306 for i in 1 2 3; do
1307     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))'
1308 done
1309 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1310 ovs-appctl -t ovs-ofctl exit
1311
1312 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1313 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1314 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
1315 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1316 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1317 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1318 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1319 dnl
1320 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1321 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
1322 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1323 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1324 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1325 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1326 dnl
1327 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1328 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
1329 00000000  50 54 00 00 00 07 40 44-44 44 54 51 81 00 20 63
1330 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1331 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1332 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1333 ])
1334
1335 dnl Modified MPLS controller action.
1336 dnl In this test, we push the MPLS tag before pushing a VLAN tag, so we see
1337 dnl both of these in the final flow
1338 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1339
1340 for i in 1 2 3; do
1341     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)'
1342 done
1343 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
1344
1345 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1346 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1347 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
1348 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1349 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1350 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1351 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1352 00000040  00 00 00 00
1353 dnl
1354 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1355 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
1356 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1357 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1358 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1359 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1360 00000040  00 00 00 00
1361 dnl
1362 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1363 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
1364 00000000  52 54 00 00 00 07 40 44-44 44 54 52 81 00 20 63
1365 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1366 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1367 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1368 00000040  00 00 00 00
1369 ])
1370
1371 dnl Modified MPLS controller action.
1372 dnl In this test, the input packet in vlan-tagged, which should be stripped
1373 dnl before we push the MPLS and VLAN tags.
1374 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1375
1376 for i in 1 2 3; do
1377     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))'
1378 done
1379 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1380 ovs-appctl -t ovs-ofctl exit
1381
1382 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1383 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1384 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
1385 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1386 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1387 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1388 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1389 dnl
1390 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1391 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
1392 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1393 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1394 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1395 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1396 dnl
1397 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1398 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
1399 00000000  50 54 00 00 00 07 40 44-44 44 54 53 81 00 20 63
1400 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1401 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1402 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1403 ])
1404
1405 dnl Modified MPLS controller action.
1406 dnl In this test, we push the VLAN tag before pushing a MPLS tag, but these
1407 dnl actions are reordered, so we see both of these in the final flow.
1408 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1409
1410 for i in 1 2 3; do
1411     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)'
1412 done
1413 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1414 ovs-appctl -t ovs-ofctl exit
1415
1416 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1417 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1418 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
1419 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1420 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1421 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1422 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1423 00000040  00 00 00 00
1424 dnl
1425 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1426 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
1427 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1428 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1429 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1430 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1431 00000040  00 00 00 00
1432 dnl
1433 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1434 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
1435 00000000  50 54 00 00 00 07 40 44-44 44 54 54 81 00 20 63
1436 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1437 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1438 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1439 00000040  00 00 00 00
1440 ])
1441
1442 dnl Modified MPLS controller action.
1443 dnl In this test, the input packet in vlan-tagged, which should be stripped
1444 dnl before we push the MPLS and VLAN tags.
1445 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1446
1447 for i in 1 2 3; do
1448     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))'
1449 done
1450 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1451 ovs-appctl -t ovs-ofctl exit
1452
1453 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1454 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1455 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
1456 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1457 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1458 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1459 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1460 dnl
1461 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1462 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
1463 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1464 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1465 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1466 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1467 dnl
1468 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1469 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
1470 00000000  50 54 00 00 00 07 40 44-44 44 54 55 81 00 20 63
1471 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1472 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1473 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1474 ])
1475
1476 dnl Modified MPLS controller action.
1477 dnl In this test, we push the VLAN tag before pushing a MPLS tag, but these
1478 dnl actions are reordered, so we see both of these in the final flow.
1479 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1480
1481 for i in 1 2 3; do
1482     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)'
1483 done
1484 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1485 ovs-appctl -t ovs-ofctl exit
1486
1487 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1488 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1489 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
1490 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1491 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1492 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1493 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1494 00000040  00 00 00 00
1495 dnl
1496 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1497 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
1498 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1499 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1500 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1501 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1502 00000040  00 00 00 00
1503 dnl
1504 OFPT_PACKET_IN (OF1.2): total_len=68 in_port=1 (via action) data_len=68 (unbuffered)
1505 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
1506 00000000  50 54 00 00 00 07 40 44-44 44 54 56 81 00 20 63
1507 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1508 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1509 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1510 00000040  00 00 00 00
1511 ])
1512
1513 dnl Modified MPLS controller action.
1514 dnl In this test, the input packet in vlan-tagged, which should be stripped
1515 dnl before we push the MPLS and VLAN tags.
1516 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 -m 65534 -P nxm --detach --pidfile 2> ofctl_monitor.log])
1517
1518 for i in 1 2 3; do
1519     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))'
1520 done
1521 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1522 ovs-appctl -t ovs-ofctl exit
1523
1524 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1525 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1526 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
1527 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1528 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1529 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1530 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1531 dnl
1532 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1533 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
1534 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1535 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1536 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1537 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1538 dnl
1539 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1540 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
1541 00000000  50 54 00 00 00 07 40 44-44 44 54 57 81 00 20 63
1542 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1543 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1544 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1545 ])
1546
1547 dnl Modified MPLS controller action.
1548 dnl In this test, the input packet in vlan-tagged, which should be stripped
1549 dnl before we push the MPLS and VLAN tags.
1550 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1551
1552 for i in 1 2 3; do
1553     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))'
1554 done
1555 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1556 ovs-appctl -t ovs-ofctl exit
1557
1558 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1559 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1560 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
1561 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1562 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1563 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1564 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1565 dnl
1566 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1567 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
1568 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1569 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1570 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1571 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1572 dnl
1573 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1574 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
1575 00000000  50 54 00 00 00 07 40 44-44 44 54 58 81 00 20 63
1576 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1577 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1578 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1579 ])
1580
1581 dnl Modified MPLS controller action.
1582 dnl In this test, the input packet in vlan-tagged, which should be modified
1583 dnl before we push MPLS and VLAN tags.
1584 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 monitor br0 65534 -m -P nxm --detach --pidfile 2> ofctl_monitor.log])
1585
1586 for i in 1 2 3; do
1587     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))'
1588 done
1589 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6])
1590 ovs-appctl -t ovs-ofctl exit
1591
1592 AT_CHECK([cat ofctl_monitor.log | ofctl_strip], [0], [dnl
1593 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1594 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
1595 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1596 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1597 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1598 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1599 dnl
1600 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1601 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
1602 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1603 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1604 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1605 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1606 dnl
1607 OFPT_PACKET_IN (OF1.2): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
1608 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
1609 00000000  50 54 00 00 00 07 40 44-44 44 54 59 81 00 20 63
1610 00000010  88 47 00 00 a1 40 45 00-00 28 00 00 00 00 40 06
1611 00000020  f9 7c c0 a8 00 01 c0 a8-00 02 00 00 00 00 00 00
1612 00000030  00 00 00 00 00 00 50 00-00 00 00 00 00 00 00 00
1613 ])
1614
1615 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
1616 AT_CHECK([ovs-ofctl --protocols=OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0], [dnl
1617  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
1618  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
1619  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
1620  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
1621  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
1622  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
1623  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
1624  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
1625  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
1626  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
1627 OFPST_FLOW reply (OF1.2):
1628 ])
1629
1630 OVS_VSWITCHD_STOP
1631 AT_CLEANUP
1632
1633 AT_SETUP([ofproto-dpif - fragment handling])
1634 OVS_VSWITCHD_START
1635 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
1636 AT_DATA([flows.txt], [dnl
1637 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
1638 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
1639 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
1640 priority=50 tcp ip_frag=no              actions=output:4
1641 priority=50 tcp ip_frag=first           actions=output:5
1642 priority=50 tcp ip_frag=later           actions=output:6
1643 ])
1644 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
1645
1646 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"
1647 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
1648 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
1649 later_flow="$base_flow,frag=later)"
1650
1651     # mode    no  first  later
1652 for tuple in \
1653     'normal    1     5      6' \
1654     'drop      1  drop   drop' \
1655     'nx-match  1     2      6'
1656 do
1657   set $tuple
1658   mode=$1
1659   no=$2
1660   first=$3
1661   later=$4
1662
1663   AT_CHECK([ovs-ofctl set-frags br0 $mode])
1664   for type in no first later; do
1665     eval flow=\$${type}_flow exp_output=\$$type
1666     printf "\n%s\n" "----$mode $type-----"
1667     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1668     : > expout
1669     if test $mode = drop && test $type != no; then
1670         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
1671     fi
1672     echo "Datapath actions: $exp_output" >> expout
1673     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
1674   done
1675 done
1676 OVS_VSWITCHD_STOP
1677 AT_CLEANUP
1678
1679 AT_SETUP([ofproto-dpif - exit])
1680 OVS_VSWITCHD_START
1681 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
1682 AT_DATA([flows.txt], [dnl
1683 in_port=1 actions=output:10,exit,output:11
1684 in_port=2 actions=output:12,resubmit:1,output:12
1685 in_port=3 actions=output:13,resubmit:2,output:14
1686 ])
1687 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1688 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])
1689 AT_CHECK([tail -1 stdout], [0],
1690   [Datapath actions: 10
1691 ])
1692 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])
1693 AT_CHECK([tail -1 stdout], [0],
1694   [Datapath actions: 12,10
1695 ])
1696 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])
1697 AT_CHECK([tail -1 stdout], [0],
1698   [Datapath actions: 13,12,10
1699 ])
1700 OVS_VSWITCHD_STOP
1701 AT_CLEANUP
1702
1703
1704 AT_SETUP([ofproto-dpif - mirroring, select_all])
1705 OVS_VSWITCHD_START
1706 ADD_OF_PORTS([br0], 1, 2, 3)
1707 ovs-vsctl \
1708         set Bridge br0 mirrors=@m --\
1709         --id=@p3 get Port p3 --\
1710         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1711
1712 AT_DATA([flows.txt], [dnl
1713 in_port=1 actions=output:2
1714 in_port=2 actions=output:1
1715 ])
1716 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1717
1718 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)"
1719 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1720 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1721   [Datapath actions: 2,3
1722 ])
1723
1724 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)"
1725 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1726 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1727   [Datapath actions: 1,3
1728 ])
1729
1730 OVS_VSWITCHD_STOP
1731 AT_CLEANUP
1732
1733
1734 AT_SETUP([ofproto-dpif - mirroring, select_src])
1735 OVS_VSWITCHD_START
1736 ADD_OF_PORTS([br0], 1, 2, 3)
1737 ovs-vsctl \
1738         set Bridge br0 mirrors=@m --\
1739         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
1740         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
1741
1742 AT_DATA([flows.txt], [dnl
1743 in_port=1 actions=output:2
1744 in_port=2 actions=output:1
1745 ])
1746 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1747
1748 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)"
1749 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1750 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1751   [Datapath actions: 2,3
1752 ])
1753
1754 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)"
1755 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1756 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1757   [Datapath actions: 1
1758 ])
1759 OVS_VSWITCHD_STOP
1760 AT_CLEANUP
1761
1762 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
1763 OVS_VSWITCHD_START
1764 ADD_OF_PORTS([br0], 1, 2)
1765 ovs-vsctl \
1766         set Bridge br0 mirrors=@m --\
1767         --id=@p2 get Port p2 --\
1768         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
1769
1770 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
1771
1772 # "in_port" defaults to OFPP_NONE if it's not specified.
1773 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"
1774 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1775 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1776   [Datapath actions: 1,2
1777 ])
1778
1779 OVS_VSWITCHD_STOP
1780 AT_CLEANUP
1781
1782
1783 AT_SETUP([ofproto-dpif - mirroring, select_dst])
1784 OVS_VSWITCHD_START
1785 ADD_OF_PORTS([br0], 1, 2, 3)
1786 ovs-vsctl \
1787         set Bridge br0 mirrors=@m --\
1788         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1789         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
1790
1791 AT_DATA([flows.txt], [dnl
1792 in_port=1 actions=output:2
1793 in_port=2 actions=output:1
1794 ])
1795 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1796
1797 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)"
1798 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1799 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1800   [Datapath actions: 2,3
1801 ])
1802
1803 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)"
1804 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1805 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1806   [Datapath actions: 1
1807 ])
1808
1809 OVS_VSWITCHD_STOP
1810 AT_CLEANUP
1811
1812
1813 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
1814 OVS_VSWITCHD_START
1815 ADD_OF_PORTS([br0], 1, 2, 3)
1816 ovs-vsctl \
1817         set Bridge br0 mirrors=@m --\
1818         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1819         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
1820
1821 AT_DATA([flows.txt], [dnl
1822 in_port=1, actions=output:2
1823 ])
1824 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1825
1826 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)"
1827 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1828 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1829   [Datapath actions: 2
1830 ])
1831
1832 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))"
1833 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1834 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1835   [Datapath actions: 2
1836 ])
1837
1838 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))"
1839 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1840 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1841   [Datapath actions: 2,3
1842 ])
1843
1844 OVS_VSWITCHD_STOP
1845 AT_CLEANUP
1846
1847
1848 AT_SETUP([ofproto-dpif - mirroring, output_port])
1849 OVS_VSWITCHD_START
1850 ADD_OF_PORTS([br0], 1, 2, 3)
1851 ovs-vsctl \
1852         set Bridge br0 mirrors=@m --\
1853         --id=@p3 get Port p3 --\
1854         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1855
1856 AT_DATA([flows.txt], [dnl
1857 in_port=1 actions=mod_vlan_vid:17,output:2
1858 in_port=2 actions=output:1
1859 ])
1860 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1861
1862 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)"
1863 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1864 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1865   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1866 ])
1867
1868 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)"
1869 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1870 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1871   [Datapath actions: 1,3
1872 ])
1873
1874 OVS_VSWITCHD_STOP
1875 AT_CLEANUP
1876
1877 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1878 OVS_VSWITCHD_START
1879 ADD_OF_PORTS([br0], 1, 2)
1880 ovs-vsctl \
1881         set Bridge br0 mirrors=@m --\
1882         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1883
1884 AT_DATA([flows.txt], [dnl
1885 in_port=1 actions=output:2
1886 in_port=2 actions=mod_vlan_vid:17,output:1
1887 ])
1888 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1889
1890 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)"
1891 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1892 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1893
1894 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1895 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1896 mv stdout expout
1897 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1898
1899 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)"
1900 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1901 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1902
1903 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1904 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1905 mv stdout expout
1906 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1907
1908 OVS_VSWITCHD_STOP
1909 AT_CLEANUP
1910
1911 # Two testcases below are for the ofproto/trace command
1912 # The first one tests all correct syntax:
1913 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1914 # ofproto/trace br_name br_flow [-generate|packet]
1915 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1916 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1917 ADD_OF_PORTS([br0], 1, 2, 3)
1918
1919 AT_DATA([flows.txt], [dnl
1920 in_port=1 actions=output:2
1921 in_port=2 actions=output:1
1922 ])
1923 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1924
1925 odp_flow="in_port(p1)"
1926 br_flow="in_port=1"
1927 # Test command: ofproto/trace odp_flow with in_port as a name.
1928 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1929 AT_CHECK([tail -1 stdout], [0], [dnl
1930 Datapath actions: 2
1931 ])
1932
1933 odp_flow="in_port(1)"
1934 # Test command: ofproto/trace odp_flow
1935 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1936 AT_CHECK([tail -1 stdout], [0], [dnl
1937 Datapath actions: 2
1938 ])
1939
1940 # Test command: ofproto/trace dp_name odp_flow
1941 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1942 AT_CHECK([tail -1 stdout], [0], [dnl
1943 Datapath actions: 2
1944 ])
1945 # Test commmand: ofproto/trace br_name br_flow
1946 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1947 AT_CHECK([tail -1 stdout], [0], [dnl
1948 Datapath actions: 2
1949 ])
1950
1951 # Delete the inserted flows
1952 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1953 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1954
1955 # This section beflow tests the [-generate] option
1956 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1957 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"
1958
1959 # Test command: ofproto/trace odp_flow
1960 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1961 # Check for no MAC learning entry
1962 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1963  port  VLAN  MAC                Age
1964 ])
1965
1966 # Test command: ofproto/trace br_name br_flow
1967 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1968 # Check for no MAC learning entry
1969 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1970  port  VLAN  MAC                Age
1971 ])
1972
1973 # Test command: ofproto/trace odp_flow -generate
1974 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1975 # Check for the MAC learning entry
1976 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1977  port  VLAN  MAC                Age
1978     3     0  50:54:00:00:00:05    ?
1979 ])
1980
1981 # Test command: ofproto/trace dp_name odp_flow -generate
1982 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1983   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1984   -generate], [0], [stdout])
1985 # Check for both MAC learning entries
1986 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1987  port  VLAN  MAC                Age
1988     3     0  50:54:00:00:00:05    ?
1989     1     0  50:54:00:00:00:06    ?
1990 ])
1991
1992 # Test command: ofproto/trace br_name br_flow -generate
1993 AT_CHECK([ovs-appctl ofproto/trace br0 \
1994   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1995   -generate], [0], [stdout])
1996 # Check for both MAC learning entries.
1997 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1998  port  VLAN  MAC                Age
1999     3     0  50:54:00:00:00:05    ?
2000     1     0  50:54:00:00:00:06    ?
2001     2     0  50:54:00:00:00:07    ?
2002 ])
2003
2004 # This section beflow tests the [packet] option
2005 # The ovs-tcpundump of packets between port1 and port2
2006 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
2007 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
2008
2009 # Construct the MAC learning table
2010 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
2011   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
2012   -generate], [0], [stdout])
2013
2014 # Construct the MAC learning table
2015 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
2016   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
2017   -generate], [0], [stdout])
2018
2019 # Test command: ofproto/trace odp_flow packet
2020 AT_CHECK([ovs-appctl ofproto/trace \
2021   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
2022 AT_CHECK([tail -1 stdout], [0], [dnl
2023 Datapath actions: 2
2024 ])
2025 AT_CHECK([head -n 2 stdout], [0], [dnl
2026 Bridge: br0
2027 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
2028 ])
2029
2030 # Test command: ofproto/trace dp_name odp_flow packet
2031 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
2032   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
2033 AT_CHECK([tail -1 stdout], [0], [dnl
2034 Datapath actions: 2
2035 ])
2036 AT_CHECK([head -n 2 stdout], [0], [dnl
2037 Bridge: br0
2038 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
2039 ])
2040
2041 # Test command: ofproto/trace br_name br_flow packet
2042 AT_CHECK([ovs-appctl ofproto/trace br0 \
2043   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
2044 AT_CHECK([tail -1 stdout], [0], [dnl
2045 Datapath actions: 1
2046 ])
2047 AT_CHECK([head -n 2 stdout], [0], [dnl
2048 Bridge: br0
2049 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
2050 ])
2051
2052 OVS_VSWITCHD_STOP
2053 AT_CLEANUP
2054
2055 # The second test tests the corner cases
2056 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
2057 OVS_VSWITCHD_START
2058 ADD_OF_PORTS([br0], 1, 2)
2059
2060 # Define flows
2061 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
2062 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
2063 # Define options
2064 generate="-generate"
2065 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
2066
2067 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
2068 m4_foreach(
2069 [option],
2070 [[],
2071 ["$generate"],
2072 ["$pkt"]],
2073 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
2074   [2], [], [stderr])
2075 AT_CHECK([tail -2 stderr], [0], [dnl
2076 Cannot find the datapath
2077 ovs-appctl: ovs-vswitchd: server returned an error
2078 ])])
2079
2080 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
2081 m4_foreach(
2082 [option],
2083 [[],
2084 ["$generate"],
2085 ["$pkt"]],
2086 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
2087   [2], [], [stderr])
2088 AT_CHECK([tail -2 stderr], [0], [dnl
2089 Cannot find the datapath
2090 ovs-appctl: ovs-vswitchd: server returned an error
2091 ])])
2092
2093 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
2094 m4_foreach(
2095 [option],
2096 [[],
2097 ["$generate"],
2098 ["$pkt"]],
2099 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
2100   [2], [], [stderr])
2101 AT_CHECK([tail -2 stderr], [0], [dnl
2102 Cannot find the datapath
2103 ovs-appctl: ovs-vswitchd: server returned an error
2104 ])])
2105
2106 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
2107 m4_foreach(
2108 [option],
2109 [[],
2110 ["$generate"],
2111 ["$pkt"]],
2112 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
2113   [2], [], [stderr])
2114 AT_CHECK([tail -2 stderr], [0], [dnl
2115 Cannot find the datapath
2116 ovs-appctl: ovs-vswitchd: server returned an error
2117 ])])
2118
2119 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
2120 m4_foreach(
2121 [option],
2122 [[],
2123 ["$generate"],
2124 ["$pkt"]],
2125 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
2126   [2], [], [stderr])
2127 AT_CHECK([tail -2 stderr], [0], [dnl
2128 Unknown bridge name
2129 ovs-appctl: ovs-vswitchd: server returned an error
2130 ])])
2131
2132 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
2133 m4_foreach(
2134 [option],
2135 [[],
2136 ["$generate"],
2137 ["$pkt"]],
2138 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
2139   [2], [], [stderr])
2140 AT_CHECK([tail -2 stderr], [0], [dnl
2141 Must specify bridge name
2142 ovs-appctl: ovs-vswitchd: server returned an error
2143 ])])
2144
2145 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
2146 AT_CHECK([ovs-appctl ofproto/trace \
2147   ovs-dummy "$odp_flow" garbage_option],
2148   [2], [stdout],[stderr])
2149 AT_CHECK([tail -2 stderr], [0], [dnl
2150 Trailing garbage in packet data
2151 ovs-appctl: ovs-vswitchd: server returned an error
2152 ])
2153
2154 # Test incorrect command: ofproto/trace with 4 arguments
2155 AT_CHECK([ovs-appctl ofproto/trace \
2156   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
2157 AT_CHECK([tail -2 stderr], [0], [dnl
2158 "ofproto/trace" command takes at most 3 arguments
2159 ovs-appctl: ovs-vswitchd: server returned an error
2160 ])
2161
2162 # Test incorrect command: ofproto/trace with 0 argument
2163 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
2164 AT_CHECK([tail -2 stderr], [0], [dnl
2165 "ofproto/trace" command requires at least 1 arguments
2166 ovs-appctl: ovs-vswitchd: server returned an error
2167 ])
2168
2169 OVS_VSWITCHD_STOP
2170 AT_CLEANUP
2171
2172 AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
2173 OVS_VSWITCHD_START
2174 ADD_OF_PORTS([br0], 1, 2, 3)
2175
2176 AT_DATA([flows.txt], [dnl
2177 in_port=1 actions=output:2
2178 in_port=2 actions=output:1
2179 ])
2180 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2181
2182 AT_CHECK([ovs-appctl ofproto/trace-packet-out br0 in_port=1 'mod_vlan_vid:123,resubmit(,0)'], [0], [stdout])
2183 AT_CHECK([tail -1 stdout], [0], [dnl
2184 Datapath actions: push_vlan(vid=123,pcp=0),2
2185 ])
2186
2187 OVS_VSWITCHD_STOP
2188 AT_CLEANUP
2189
2190
2191 m4_define([OFPROTO_TRACE],
2192   [flow="$2"
2193    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
2194    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
2195    expected="$4"
2196    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
2197      [0], [stdout])
2198    mv stdout expout
2199    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
2200      [0], [expout])])
2201
2202 AT_SETUP([ofproto-dpif - MAC learning])
2203 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
2204 ADD_OF_PORTS([br0], 1, 2, 3)
2205
2206 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)'
2207
2208 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
2209 OFPROTO_TRACE(
2210   [ovs-dummy],
2211   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
2212   [-generate],
2213   [1,2,100])
2214
2215 # Check for the MAC learning entry.
2216 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2217  port  VLAN  MAC                Age
2218     3     0  50:54:00:00:00:05    ?
2219 ])
2220
2221 # Trace a packet arrival destined for the learned MAC.
2222 # (This will also learn a MAC.)
2223 OFPROTO_TRACE(
2224   [ovs-dummy],
2225   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
2226   [-generate],
2227   [3])
2228
2229 # Check for both MAC learning entries.
2230 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2231  port  VLAN  MAC                Age
2232     3     0  50:54:00:00:00:05    ?
2233     1     0  50:54:00:00:00:06    ?
2234 ])
2235
2236 # Trace a packet arrival that updates the first learned MAC entry.
2237 OFPROTO_TRACE(
2238   [ovs-dummy],
2239   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
2240   [-generate],
2241   [1,3,100])
2242
2243 # Check that the MAC learning entry was updated.
2244 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2245  port  VLAN  MAC                Age
2246     1     0  50:54:00:00:00:06    ?
2247     2     0  50:54:00:00:00:05    ?
2248 ])
2249
2250 # Add another bridge.
2251 AT_CHECK(
2252   [ovs-vsctl \
2253      -- add-br br1 \
2254      -- set bridge br1 datapath-type=dummy])
2255 ADD_OF_PORTS([br1], 4, 5)
2256
2257 # Trace some packet arrivals in br1 to create MAC learning entries there too.
2258 OFPROTO_TRACE(
2259   [ovs-dummy],
2260   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
2261   [-generate],
2262   [5,101])
2263 OFPROTO_TRACE(
2264   [ovs-dummy],
2265   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
2266   [-generate],
2267   [4,101])
2268
2269 # Check that the MAC learning entries were added.
2270 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2271  port  VLAN  MAC                Age
2272     4     0  50:54:00:00:00:06    ?
2273     5     0  50:54:00:00:00:07    ?
2274 ])
2275
2276 # Delete port p1 and see that its MAC learning entry disappeared, and
2277 # that the MAC learning entry for the same MAC was also deleted from br1.
2278 AT_CHECK([ovs-vsctl del-port p1])
2279 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2280  port  VLAN  MAC                Age
2281     2     0  50:54:00:00:00:05    ?
2282 ])
2283 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
2284  port  VLAN  MAC                Age
2285     5     0  50:54:00:00:00:07    ?
2286 ])
2287
2288 OVS_VSWITCHD_STOP
2289 AT_CLEANUP
2290
2291 AT_SETUP([ofproto-dpif - MAC table overflow])
2292 OVS_VSWITCHD_START(
2293   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
2294 ADD_OF_PORTS([br0], 1, 2, 3)
2295
2296 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)'
2297
2298 AT_CHECK([ovs-appctl time/stop])
2299
2300 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
2301 for i in 0 1 2 3 4 5 6 7 8 9; do
2302     OFPROTO_TRACE(
2303       [ovs-dummy],
2304       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
2305       [-generate],
2306       [1,2,100])
2307     ovs-appctl time/warp 1000
2308 done
2309
2310 # Check for the MAC learning entries.
2311 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
2312   [0], [dnl
2313     3     0  50:54:00:00:00:00
2314     3     0  50:54:00:00:00:01
2315     3     0  50:54:00:00:00:02
2316     3     0  50:54:00:00:00:03
2317     3     0  50:54:00:00:00:04
2318     3     0  50:54:00:00:00:05
2319     3     0  50:54:00:00:00:06
2320     3     0  50:54:00:00:00:07
2321     3     0  50:54:00:00:00:08
2322     3     0  50:54:00:00:00:09
2323  port  VLAN  MAC                Age
2324 ])
2325
2326 # Trace another ARP packet on another MAC.
2327 OFPROTO_TRACE(
2328   [ovs-dummy],
2329   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
2330   [-generate],
2331   [1,2,100])
2332
2333 # Check that the new one chased the oldest one out of the table.
2334 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
2335   [0], [dnl
2336     3     0  50:54:00:00:00:01    ?
2337     3     0  50:54:00:00:00:02    ?
2338     3     0  50:54:00:00:00:03    ?
2339     3     0  50:54:00:00:00:04    ?
2340     3     0  50:54:00:00:00:05    ?
2341     3     0  50:54:00:00:00:06    ?
2342     3     0  50:54:00:00:00:07    ?
2343     3     0  50:54:00:00:00:08    ?
2344     3     0  50:54:00:00:00:09    ?
2345     3     0  50:54:00:00:00:10    ?
2346  port  VLAN  MAC                Age
2347 ])
2348 OVS_VSWITCHD_STOP
2349 AT_CLEANUP
2350
2351 # CHECK_SFLOW_SAMPLING_PACKET(LOOPBACK_ADDR, ADDR_WITHOUT_BRACKETS)
2352 #
2353 # Test that sFlow samples packets correctly using IPv4/IPv6 sFlow collector
2354 #
2355 # IP_VERSION_TYPE is used in AT_SETUP
2356 m4_define([CHECK_SFLOW_SAMPLING_PACKET],
2357   [AT_SETUP([ofproto-dpif - sFlow packet sampling - $2 collector])
2358   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2359
2360   ON_EXIT([kill `cat test-sflow.pid`])
2361   AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:$1 > sflow.log], [0], [], [ignore])
2362   AT_CAPTURE_FILE([sflow.log])
2363   SFLOW_PORT=`parse_listening_port < test-sflow.log`
2364   ovs-appctl time/stop
2365
2366   ADD_OF_PORTS([br0], 1, 2)
2367   ovs-vsctl \
2368      set Interface br0 options:ifindex=1002 -- \
2369      set Interface p1 options:ifindex=1004 -- \
2370      set Interface p2 options:ifindex=1003 -- \
2371      set Bridge br0 sflow=@sf -- \
2372      --id=@sf create sflow targets=\"$1:$SFLOW_PORT\" \
2373        header=128 sampling=1 polling=1 agent=$LOOPBACK_INTERFACE
2374
2375   dnl open with ARP packets to seed the bridge-learning.  The output
2376   dnl ifIndex numbers should be reported predictably after that.
2377   dnl Since we set sampling=1 we should see all of these packets
2378   dnl reported. Sorting the output by data-source and seqNo makes
2379   dnl it deterministic. Ensuring that we send at least two packets
2380   dnl into each port means we get to check the seq nos are
2381   dnl incrementing correctly.
2382   dnl because packets from different ports can be handled by separate
2383   dnl threads, put some sleeps
2384
2385   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)'
2386   sleep 1
2387   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)'
2388   sleep 1
2389   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)'
2390   sleep 1
2391   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)'
2392   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)'
2393
2394   dnl sleep long enough to get more than one counter sample
2395   dnl from each datasource so we can check sequence numbers
2396   for i in `seq 1 30`; do
2397       ovs-appctl time/warp 100
2398   done
2399   OVS_VSWITCHD_STOP
2400   ovs-appctl -t test-sflow exit
2401
2402   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
2403         /g']], [0], [dnl
2404 HEADER
2405         dgramSeqNo=1
2406         ds=127.0.0.1>2:1000
2407         fsSeqNo=1
2408         in_vlan=0
2409         in_priority=0
2410         out_vlan=0
2411         out_priority=0
2412         meanSkip=1
2413         samplePool=1
2414         dropEvents=0
2415         in_ifindex=1004
2416         in_format=0
2417         out_ifindex=2
2418         out_format=2
2419         hdr_prot=1
2420         pkt_len=64
2421         stripped=4
2422         hdr_len=60
2423         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
2424 HEADER
2425         dgramSeqNo=1
2426         ds=127.0.0.1>2:1000
2427         fsSeqNo=2
2428         in_vlan=0
2429         in_priority=0
2430         out_vlan=0
2431         out_priority=0
2432         meanSkip=1
2433         samplePool=2
2434         dropEvents=0
2435         in_ifindex=1003
2436         in_format=0
2437         out_ifindex=2
2438         out_format=2
2439         hdr_prot=1
2440         pkt_len=64
2441         stripped=4
2442         hdr_len=60
2443         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
2444 HEADER
2445         dgramSeqNo=1
2446         ds=127.0.0.1>2:1000
2447         fsSeqNo=3
2448         in_vlan=0
2449         in_priority=0
2450         out_vlan=0
2451         out_priority=0
2452         meanSkip=1
2453         samplePool=3
2454         dropEvents=0
2455         in_ifindex=1004
2456         in_format=0
2457         out_ifindex=1003
2458         out_format=0
2459         hdr_prot=1
2460         pkt_len=64
2461         stripped=4
2462         hdr_len=60
2463         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
2464 HEADER
2465         dgramSeqNo=1
2466         ds=127.0.0.1>2:1000
2467         fsSeqNo=4
2468         in_vlan=0
2469         in_priority=0
2470         out_vlan=0
2471         out_priority=0
2472         meanSkip=1
2473         samplePool=4
2474         dropEvents=0
2475         in_ifindex=1003
2476         in_format=0
2477         out_ifindex=1004
2478         out_format=0
2479         hdr_prot=1
2480         pkt_len=64
2481         stripped=4
2482         hdr_len=60
2483         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
2484 HEADER
2485         dgramSeqNo=1
2486         ds=127.0.0.1>2:1000
2487         fsSeqNo=5
2488         in_vlan=0
2489         in_priority=0
2490         out_vlan=0
2491         out_priority=0
2492         meanSkip=1
2493         samplePool=5
2494         dropEvents=0
2495         in_ifindex=1003
2496         in_format=0
2497         out_ifindex=1004
2498         out_format=0
2499         hdr_prot=1
2500         pkt_len=64
2501         stripped=4
2502         hdr_len=60
2503         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
2504 ])
2505
2506   AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
2507         /g']], [0], [dnl
2508 IFCOUNTERS
2509         dgramSeqNo=2
2510         ds=127.0.0.1>0:1002
2511         csSeqNo=1
2512         ifindex=1002
2513         type=6
2514         ifspeed=100000000
2515         direction=0
2516         status=3
2517         in_octets=0
2518         in_unicasts=0
2519         in_multicasts=0
2520         in_broadcasts=4294967295
2521         in_discards=0
2522         in_errors=0
2523         in_unknownprotos=4294967295
2524         out_octets=120
2525         out_unicasts=2
2526         out_multicasts=4294967295
2527         out_broadcasts=4294967295
2528         out_discards=0
2529         out_errors=0
2530         promiscuous=0
2531 IFCOUNTERS
2532         dgramSeqNo=2
2533         ds=127.0.0.1>0:1003
2534         csSeqNo=1
2535         ifindex=1003
2536         type=6
2537         ifspeed=100000000
2538         direction=0
2539         status=0
2540         in_octets=138
2541         in_unicasts=3
2542         in_multicasts=0
2543         in_broadcasts=4294967295
2544         in_discards=0
2545         in_errors=0
2546         in_unknownprotos=4294967295
2547         out_octets=120
2548         out_unicasts=2
2549         out_multicasts=4294967295
2550         out_broadcasts=4294967295
2551         out_discards=0
2552         out_errors=0
2553         promiscuous=0
2554 IFCOUNTERS
2555         dgramSeqNo=2
2556         ds=127.0.0.1>0:1004
2557         csSeqNo=1
2558         ifindex=1004
2559         type=6
2560         ifspeed=100000000
2561         direction=0
2562         status=0
2563         in_octets=84
2564         in_unicasts=2
2565         in_multicasts=0
2566         in_broadcasts=4294967295
2567         in_discards=0
2568         in_errors=0
2569         in_unknownprotos=4294967295
2570         out_octets=180
2571         out_unicasts=3
2572         out_multicasts=4294967295
2573         out_broadcasts=4294967295
2574         out_discards=0
2575         out_errors=0
2576         promiscuous=0
2577 IFCOUNTERS
2578         dgramSeqNo=3
2579         ds=127.0.0.1>0:1002
2580         csSeqNo=2
2581         ifindex=1002
2582         type=6
2583         ifspeed=100000000
2584         direction=0
2585         status=3
2586         in_octets=0
2587         in_unicasts=0
2588         in_multicasts=0
2589         in_broadcasts=4294967295
2590         in_discards=0
2591         in_errors=0
2592         in_unknownprotos=4294967295
2593         out_octets=120
2594         out_unicasts=2
2595         out_multicasts=4294967295
2596         out_broadcasts=4294967295
2597         out_discards=0
2598         out_errors=0
2599         promiscuous=0
2600 IFCOUNTERS
2601         dgramSeqNo=3
2602         ds=127.0.0.1>0:1003
2603         csSeqNo=2
2604         ifindex=1003
2605         type=6
2606         ifspeed=100000000
2607         direction=0
2608         status=0
2609         in_octets=138
2610         in_unicasts=3
2611         in_multicasts=0
2612         in_broadcasts=4294967295
2613         in_discards=0
2614         in_errors=0
2615         in_unknownprotos=4294967295
2616         out_octets=120
2617         out_unicasts=2
2618         out_multicasts=4294967295
2619         out_broadcasts=4294967295
2620         out_discards=0
2621         out_errors=0
2622         promiscuous=0
2623 IFCOUNTERS
2624         dgramSeqNo=3
2625         ds=127.0.0.1>0:1004
2626         csSeqNo=2
2627         ifindex=1004
2628         type=6
2629         ifspeed=100000000
2630         direction=0
2631         status=0
2632         in_octets=84
2633         in_unicasts=2
2634         in_multicasts=0
2635         in_broadcasts=4294967295
2636         in_discards=0
2637         in_errors=0
2638         in_unknownprotos=4294967295
2639         out_octets=180
2640         out_unicasts=3
2641         out_multicasts=4294967295
2642         out_broadcasts=4294967295
2643         out_discards=0
2644         out_errors=0
2645         promiscuous=0
2646 ])
2647   AT_CLEANUP])
2648
2649 CHECK_SFLOW_SAMPLING_PACKET([127.0.0.1], [IPv4])
2650 CHECK_SFLOW_SAMPLING_PACKET([[[::1]]], [IPv6])
2651
2652 # CHECK_NETFLOW_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2653 #
2654 # Test that basic NetFlow reports flow statistics correctly:
2655 # The initial packet of a flow are correctly accounted.
2656 # Later packets within a flow are correctly accounted.
2657 # Flow actions changing (in this case, due to MAC learning)
2658 # cause a record to be sent.
2659 #
2660 # IP_VERSION_TYPE is used in AT_SETUP
2661 m4_define([CHECK_NETFLOW_EXPIRATION],
2662   [AT_SETUP([ofproto-dpif - NetFlow flow expiration - $2 collector])
2663   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2664   ADD_OF_PORTS([br0], 1, 2)
2665
2666   ovs-appctl time/stop
2667   ON_EXIT([kill `cat test-netflow.pid`])
2668   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2669   AT_CAPTURE_FILE([netflow.log])
2670   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2671
2672   ovs-vsctl \
2673      set Bridge br0 netflow=@nf -- \
2674      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2675        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2676
2677   for delay in 1000 30000; do
2678       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)'
2679       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)'
2680
2681       ovs-appctl time/warp $delay
2682   done
2683
2684   ovs-appctl time/warp 6000
2685   sleep 1
2686   OVS_VSWITCHD_STOP
2687   ovs-appctl -t test-netflow exit
2688
2689   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])
2690
2691   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])
2692
2693   combined=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0" netflow.log | wc -l`
2694   separate=`grep "192.168.0.2 > 192.168.0.1, if 2 > 1, 1 pkts, 60 bytes, ICMP 0:0" netflow.log | wc -l`
2695   AT_CHECK([test $separate = 2 || test $combined = 1], [0])
2696
2697   AT_CLEANUP])
2698
2699 CHECK_NETFLOW_EXPIRATION([127.0.0.1], [IPv4])
2700 CHECK_NETFLOW_EXPIRATION([[[::1]]], [IPv6])
2701
2702 # CHECK_NETFLOW_ACTIVE_EXPIRATION(LOOPBACK_ADDR, IP_VERSION_TYPE)
2703 #
2704 # Test that basic NetFlow reports active expirations correctly.
2705 #
2706 # IP_VERSION_TYPE is used in AT_SETUP
2707 m4_define([CHECK_NETFLOW_ACTIVE_EXPIRATION],
2708   [AT_SETUP([ofproto-dpif - NetFlow active expiration - $2 collector])
2709
2710   OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2711   ADD_OF_PORTS([br0], 1, 2)
2712
2713   ON_EXIT([kill `cat test-netflow.pid`])
2714   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
2715   AT_CAPTURE_FILE([netflow.log])
2716   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2717
2718   ovs-vsctl \
2719      set Bridge br0 netflow=@nf -- \
2720      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
2721        engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
2722
2723   AT_CHECK([ovs-appctl time/stop])
2724   n=1
2725   while test $n -le 60; do
2726       n=`expr $n + 1`
2727
2728       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)'
2729       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)'
2730
2731       ovs-appctl time/warp 1000
2732   done
2733
2734   ovs-appctl time/warp 10000
2735
2736   sleep 1
2737   OVS_VSWITCHD_STOP
2738   ovs-appctl -t test-netflow exit
2739
2740   # Count the number of reported packets:
2741   # - From source to destination before MAC learning kicks in (just one).
2742   # - From source to destination after that.
2743   # - From destination to source.
2744   n_learn=0
2745   n_in=0
2746   n_out=0
2747   n_other=0
2748   n_recs=0
2749   none=0
2750   while read line; do
2751       pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
2752       case $pkts in
2753            [[0-9]]*) ;;
2754        *) continue ;;
2755       esac
2756
2757       case $line in
2758           "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2759               counter=n_learn
2760           ;;
2761       "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2762           counter=n_in
2763           ;;
2764       "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
2765           counter=n_out
2766           ;;
2767       *)
2768           counter=n_other
2769           ;;
2770       esac
2771       eval $counter=\`expr \$$counter + \$pkts\`
2772       n_recs=`expr $n_recs + 1`
2773   done < netflow.log
2774
2775   # There should be exactly 1 MAC learning packet,
2776   # exactly 59 other packets in that direction,
2777   # and exactly 60 packets in the other direction.
2778   AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
2779 ])
2780
2781   AT_CLEANUP])
2782
2783 CHECK_NETFLOW_ACTIVE_EXPIRATION([127.0.0.1], [IPv4])
2784 CHECK_NETFLOW_ACTIVE_EXPIRATION([[[::1]]], [IPv6])
2785
2786 AT_SETUP([ofproto-dpif - flow stats])
2787 OVS_VSWITCHD_START
2788 AT_CHECK([ovs-ofctl add-flow br0 "ip,actions=NORMAL"])
2789 AT_CHECK([ovs-ofctl add-flow br0 "icmp,actions=NORMAL"])
2790
2791 ovs-appctl time/stop
2792
2793 for i in `seq 1 10`; do
2794     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)'
2795 done
2796
2797 ovs-appctl time/warp 1000
2798
2799 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2800 AT_CHECK([STRIP_XIDS stdout | sed -n 's/duration=[[0-9]]*\.[[0-9]]*s/duration=0.0s/p' | sort], [0], [dnl
2801  cookie=0x0, duration=0.0s, table=0, n_packets=0, n_bytes=0, idle_age=1, icmp actions=NORMAL
2802  cookie=0x0, duration=0.0s, table=0, n_packets=10, n_bytes=600, idle_age=1, ip actions=NORMAL
2803 ])
2804 OVS_VSWITCHD_STOP
2805 AT_CLEANUP
2806
2807 AT_SETUP([ofproto-dpif - flow stats, set-n-threads])
2808 OVS_VSWITCHD_START
2809 AT_CHECK([ovs-ofctl add-flow br0 "ip,actions=NORMAL"])
2810 AT_CHECK([ovs-ofctl add-flow br0 "icmp,actions=NORMAL"])
2811
2812 ovs-appctl time/stop
2813
2814 for i in `seq 1 10`; do
2815     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)'
2816 done
2817
2818 ovs-appctl time/warp 100
2819 AT_CHECK([ovs-vsctl set Open_vSwitch . other-config:n-revalidator-threads=2])
2820 ovs-appctl time/warp 1000
2821
2822 AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2823 AT_CHECK([STRIP_XIDS stdout | sed -n 's/duration=[[0-9]]*\.[[0-9]]*s/duration=0.0s/p' | sort], [0], [dnl
2824  cookie=0x0, duration=0.0s, table=0, n_packets=0, n_bytes=0, idle_age=1, icmp actions=NORMAL
2825  cookie=0x0, duration=0.0s, table=0, n_packets=10, n_bytes=600, idle_age=1, ip actions=NORMAL
2826 ])
2827 OVS_VSWITCHD_STOP
2828 AT_CLEANUP
2829
2830 AT_SETUP([idle_age and hard_age increase over time])
2831 OVS_VSWITCHD_START
2832
2833 # get_ages DURATION HARD IDLE
2834 #
2835 # Fetch the flow duration, hard age, and idle age into the variables
2836 # whose names are given as arguments.  Rounds DURATION down to the
2837 # nearest integer.  If hard_age doesn't appear in the output, sets
2838 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
2839 # to 0.
2840 get_ages () {
2841     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2842
2843     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
2844     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
2845     AS_VAR_COPY([$1], [duration])
2846
2847     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
2848     if test X"$hard" = X; then
2849         hard=none
2850     else
2851         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
2852     fi
2853     AS_VAR_COPY([$2], [hard])
2854
2855     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
2856     if test X"$idle" = X; then
2857         idle=0
2858     else
2859         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
2860     fi
2861     AS_VAR_COPY([$3], [idle])
2862 }
2863
2864 # Add a flow and get its initial hard and idle age.
2865 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
2866 get_ages duration1 hard1 idle1
2867
2868 ovs-appctl time/stop
2869 # Warp time forward by 10 seconds, then modify the flow's actions.
2870 ovs-appctl time/warp 10000
2871 get_ages duration2 hard2 idle2
2872 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
2873
2874 # Warp time forward by 10 seconds.
2875 ovs-appctl time/warp 10000
2876 get_ages duration3 hard3 idle3
2877
2878 # Warp time forward 10 more seconds, then pass some packets through the flow,
2879 # then warp forward a few more times because idle times are only updated
2880 # occasionally.
2881 ovs-appctl time/warp 10000
2882 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)'
2883 ovs-appctl time/warp 1000
2884 ovs-appctl time/warp 1000
2885 ovs-appctl time/warp 1000
2886 get_ages duration4 hard4 idle4
2887
2888 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
2889 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
2890 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
2891
2892 # Duration should increase steadily over time.
2893 AT_CHECK([test $duration1 -lt $duration2])
2894 AT_CHECK([test $duration2 -lt $duration3])
2895 AT_CHECK([test $duration3 -lt $duration4])
2896
2897 # Hard age should be "none" initially because it's the same as flow_duration,
2898 # then it should increase.
2899 AT_CHECK([test $hard1 = none])
2900 AT_CHECK([test $hard2 = none])
2901 AT_CHECK([test $hard3 != none])
2902 AT_CHECK([test $hard4 != none])
2903 AT_CHECK([test $hard3 -lt $hard4])
2904
2905 # Idle age should increase from 1 to 2 to 3, then decrease.
2906 AT_CHECK([test $idle1 -lt $idle2])
2907 AT_CHECK([test $idle2 -lt $idle3])
2908 AT_CHECK([test $idle3 -gt $idle4])
2909
2910 # Check some invariant relationships.
2911 AT_CHECK([test $duration1 = $idle1])
2912 AT_CHECK([test $duration2 = $idle2])
2913 AT_CHECK([test $duration3 = $idle3])
2914 AT_CHECK([test $idle3 -gt $hard3])
2915 AT_CHECK([test $idle4 -lt $hard4])
2916 AT_CHECK([test $hard4 -lt $duration4])
2917
2918 OVS_VSWITCHD_STOP
2919 AT_CLEANUP
2920
2921 AT_SETUP([ofproto-dpif - fin_timeout])
2922 OVS_VSWITCHD_START
2923 AT_DATA([flows.txt], [dnl
2924 in_port=1 actions=output:2
2925 in_port=2 actions=mod_vlan_vid:17,output:1
2926 ])
2927 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2928 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2929 [NXST_FLOW reply:
2930  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2931 ])
2932
2933 ovs-appctl time/stop
2934 # Check that a TCP SYN packet does not change the timeout.  (Because
2935 # flow stats updates are mainly what implements the fin_timeout
2936 # feature, we warp forward a couple of times to ensure that flow stats
2937 # run before re-checking the flow table.)
2938 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2939 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2940 warped
2941 ])
2942 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2943 [NXST_FLOW reply:
2944  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2945 ])
2946 # Check that a TCP FIN packet does change the timeout.
2947 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2948 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2949 warped
2950 ])
2951 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2952 [NXST_FLOW reply:
2953  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2954 ])
2955 OVS_VSWITCHD_STOP
2956 AT_CLEANUP
2957
2958 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2959 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2960 ADD_OF_PORTS([br0], [1], [2])
2961 ADD_OF_PORTS([br1], [3])
2962
2963 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2964 dummy@br0
2965 dummy@br1
2966 ])
2967 OVS_VSWITCHD_STOP
2968 AT_CLEANUP
2969
2970 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2971 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2972 ADD_OF_PORTS([br0], [1], [2])
2973 ADD_OF_PORTS([br1], [3])
2974
2975 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2976 dummy@ovs-dummy: hit:0 missed:0
2977         br0:
2978                 br0 65534/100: (dummy)
2979                 p1 1/1: (dummy)
2980                 p2 2/2: (dummy)
2981         br1:
2982                 br1 65534/101: (dummy)
2983                 p3 3/3: (dummy)
2984 ])
2985 OVS_VSWITCHD_STOP
2986 AT_CLEANUP
2987
2988 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2989 OVS_VSWITCHD_START([add-br br1 -- \
2990                     set bridge br1 datapath-type=dummy fail-mode=secure])
2991 ADD_OF_PORTS([br0], [1], [2])
2992 ADD_OF_PORTS([br1], [3])
2993
2994 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)'])
2995 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)'])
2996 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)'])
2997
2998 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2999 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))
3000 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))
3001 ])
3002
3003 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
3004 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))
3005 ])
3006
3007 AT_CHECK([ovs-appctl dpif/dump-flows -m br0 | sort | STRIP_USED], [0], [dnl
3008 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))
3009 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))
3010 ])
3011
3012 AT_CHECK([ovs-appctl dpif/dump-flows -m br1 | sort | STRIP_USED], [0], [dnl
3013 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))
3014 ])
3015
3016 OVS_VSWITCHD_STOP
3017 AT_CLEANUP
3018
3019 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a userspace action])
3020 OVS_VSWITCHD_START([dnl
3021    add-port br0 p1 -- set Interface p1 type=dummy
3022 ])
3023 ON_EXIT([kill `cat ovs-ofctl.pid`])
3024
3025 AT_CAPTURE_FILE([ofctl_monitor.log])
3026 AT_DATA([flows.txt], [dnl
3027 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
3028 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
3029 ])
3030 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3031
3032 dnl Packet is sent to userspace because a MPLS push or pop action is applied to
3033 dnl a packet with 2 MPLS LSEs but dpif-netdev can't handle any labels.
3034 dnl
3035 dnl The input is a frame with two MPLS labels which tcpdump -vve shows as:
3036 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)
3037 dnl         (label 20, exp 0, [S], ttl 32)
3038 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
3039 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
3040
3041 for dl_src in 00 01; do
3042     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"])
3043
3044     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
3045 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))
3046 ])
3047 done
3048
3049 OVS_VSWITCHD_STOP
3050 AT_CLEANUP
3051
3052
3053 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows - MPLS actions that result in a drop])
3054 OVS_VSWITCHD_START([dnl
3055    add-port br0 p1 -- set Interface p1 type=dummy
3056 ])
3057 ON_EXIT([kill `cat ovs-ofctl.pid`])
3058
3059 AT_CAPTURE_FILE([ofctl_monitor.log])
3060 AT_DATA([flows.txt], [dnl
3061 dl_src=60:66:66:66:66:00 actions=push_mpls:0x8847,controller
3062 dl_src=60:66:66:66:66:01 actions=pop_mpls:0x8849,controller
3063 ])
3064 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3065
3066 dnl Packet is dropped because an MPLS PUSH action is applied to a packet with
3067 dnl 4 MPLS LSEs but ovs-vswtichd can only handle up to 3 MPLS LSEs and thus
3068 dnl can't determine the resulting MPLS label after MPLS push/pop actions.
3069 dnl
3070 dnl The input is a frame with two MPLS headers which tcpdump -vve shows as:
3071 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)
3072 dnl         (label 20, exp 0, ttl 32)
3073 dnl         (label 20, exp 0, ttl 32)
3074 dnl         (label 20, exp 0, [S], ttl 32)
3075 dnl         (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto TCP (6), length 44, bad cksum 3b78 (->f978)!)
3076 dnl     192.168.0.1.80 > 192.168.0.2.0: Flags [none], cksum 0x7744 (correct), seq 42:46, win 10000, length 4
3077
3078 for dl_src in 00 01; do
3079     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"])
3080
3081     AT_CHECK_UNQUOTED([ovs-appctl dpif/dump-flows br0 | grep ":$dl_src/" | STRIP_USED], [0], [dnl
3082 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))
3083 ])
3084 done
3085
3086 OVS_VSWITCHD_STOP
3087 AT_CLEANUP
3088
3089 AT_SETUP([ofproto-dpif - patch ports])
3090 OVS_VSWITCHD_START([add-br br1 \
3091 -- set bridge br1 datapath-type=dummy fail-mode=secure \
3092 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
3093 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
3094
3095 ADD_OF_PORTS([br0], [2])
3096 ADD_OF_PORTS([br1], [3])
3097
3098 AT_CHECK([ovs-appctl time/stop])
3099
3100 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
3101 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
3102
3103 for i in $(seq 1 10); do
3104     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)'
3105     if [[ $i -eq 1 ]]; then
3106         sleep 1
3107     fi
3108 done
3109
3110 for i in $(seq 1 5); do
3111     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)'
3112     if [[ $i -eq 1 ]]; then
3113         sleep 1
3114     fi
3115 done
3116
3117 AT_CHECK([ovs-appctl time/warp 500], [0],
3118 [warped
3119 ])
3120
3121 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
3122 dummy@ovs-dummy: hit:13 missed:2
3123         br0:
3124                 br0 65534/100: (dummy)
3125                 p2 2/2: (dummy)
3126                 pbr0 1/none: (patch: peer=pbr1)
3127         br1:
3128                 br1 65534/101: (dummy)
3129                 p3 3/3: (dummy)
3130                 pbr1 1/none: (patch: peer=pbr0)
3131 ])
3132
3133 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3134 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
3135 ]),
3136 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
3137 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
3138 ])
3139
3140 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
3141 OFPST_PORT reply (xid=0x4): 1 ports
3142   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
3143            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
3144 ])
3145
3146 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
3147 OFPST_PORT reply (xid=0x4): 1 ports
3148   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
3149            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
3150 ])
3151
3152 OVS_VSWITCHD_STOP
3153 AT_CLEANUP
3154
3155 AT_SETUP([ofproto-dpif - port duration])
3156 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
3157 ADD_OF_PORTS([br0], 1, 2)
3158
3159 ovs-appctl time/stop
3160 ovs-appctl time/warp 10000
3161
3162 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
3163 AT_CHECK([sed -n 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/p' stdout], [0],
3164 [dnl
3165            duration=?s
3166            duration=?s
3167            duration=?s
3168 ])
3169 OVS_VSWITCHD_STOP
3170 AT_CLEANUP
3171
3172 dnl ----------------------------------------------------------------------
3173 AT_BANNER([ofproto-dpif -- megaflows])
3174
3175 AT_SETUP([ofproto-dpif megaflow - port classification])
3176 OVS_VSWITCHD_START
3177 ADD_OF_PORTS([br0], [1], [2])
3178 AT_DATA([flows.txt], [dnl
3179 table=0 in_port=1 actions=output(2)
3180 ])
3181 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3182 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)'])
3183 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)'])
3184 sleep 1
3185 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3186 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>
3187 ])
3188 OVS_VSWITCHD_STOP
3189 AT_CLEANUP
3190
3191 AT_SETUP([ofproto-dpif megaflow - L2 classification])
3192 OVS_VSWITCHD_START
3193 ADD_OF_PORTS([br0], [1], [2])
3194 AT_DATA([flows.txt], [dnl
3195 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
3196 ])
3197 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3198 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)'])
3199 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)'])
3200 sleep 1
3201 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3202 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>
3203 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>
3204 ])
3205 OVS_VSWITCHD_STOP
3206 AT_CLEANUP
3207
3208 AT_SETUP([ofproto-dpif megaflow - L3 classification])
3209 OVS_VSWITCHD_START
3210 ADD_OF_PORTS([br0], [1], [2])
3211 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], [])
3212 AT_DATA([flows.txt], [dnl
3213 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
3214 ])
3215 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3216 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)'])
3217 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)'])
3218 sleep 1
3219 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3220 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>
3221 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>
3222 ])
3223 OVS_VSWITCHD_STOP
3224 AT_CLEANUP
3225
3226 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
3227 OVS_VSWITCHD_START
3228 ADD_OF_PORTS([br0], [1], [2])
3229 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], [])
3230 AT_DATA([flows.txt], [dnl
3231 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
3232 ])
3233 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3234 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)'])
3235 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)'])
3236 sleep 1
3237 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3238 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>
3239 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>
3240 ])
3241 OVS_VSWITCHD_STOP
3242 AT_CLEANUP
3243
3244 AT_SETUP([ofproto-dpif megaflow - L4 classification])
3245 OVS_VSWITCHD_START
3246 ADD_OF_PORTS([br0], [1], [2])
3247 AT_DATA([flows.txt], [dnl
3248 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
3249 ])
3250 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3251 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)'])
3252 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)'])
3253 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3254 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>
3255 ])
3256 OVS_VSWITCHD_STOP
3257 AT_CLEANUP
3258
3259 AT_SETUP([ofproto-dpif megaflow - normal])
3260 OVS_VSWITCHD_START
3261 ADD_OF_PORTS([br0], [1], [2])
3262 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3263 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)'])
3264 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)'])
3265 sleep 1
3266 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3267 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>
3268 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>
3269 ])
3270 OVS_VSWITCHD_STOP
3271 AT_CLEANUP
3272
3273 AT_SETUP([ofproto-dpif megaflow - mpls])
3274 OVS_VSWITCHD_START
3275 ADD_OF_PORTS([br0], [1], [2])
3276 AT_DATA([flows.txt], [dnl
3277 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
3278 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
3279 ])
3280 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3281 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)'])
3282 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)'])
3283 sleep 1
3284 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3285 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>
3286 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>
3287 ])
3288 OVS_VSWITCHD_STOP
3289 AT_CLEANUP
3290
3291 # CHECK_MEGAFLOW_NETFLOW(LOOPBACK_ADDR, IP_VERSION_TYPE)
3292 #
3293 # IP_VERSION_TYPE is used in AT_SETUP
3294 m4_define([CHECK_MEGAFLOW_NETFLOW],
3295   [AT_SETUP([ofproto-dpif megaflow - netflow - $2 collector])
3296   OVS_VSWITCHD_START
3297   ADD_OF_PORTS([br0], [1], [2])
3298
3299   dnl NetFlow configuration disables wildcarding relevant fields
3300   ON_EXIT([kill `cat test-netflow.pid`])
3301   AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:$1 > netflow.log], [0], [], [ignore])
3302   AT_CAPTURE_FILE([netflow.log])
3303   NETFLOW_PORT=`parse_listening_port < test-netflow.log`
3304   ovs-vsctl \
3305      set Bridge br0 netflow=@nf -- \
3306      --id=@nf create NetFlow targets=\"$1:$NETFLOW_PORT\" \
3307        engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
3308
3309   AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3310   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)'])
3311   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)'])
3312   sleep 1
3313   AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3314 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>
3315 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>
3316 ])
3317   OVS_VSWITCHD_STOP
3318   AT_CLEANUP])
3319
3320 CHECK_MEGAFLOW_NETFLOW([127.0.0.1], [IPv4])
3321 CHECK_MEGAFLOW_NETFLOW([[[::1]]], [IPv6])
3322
3323 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
3324 OVS_VSWITCHD_START(
3325   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
3326    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
3327    set interface p2 type=dummy ofport_request=2 -- \
3328    set interface p3 type=dummy ofport_request=3])
3329 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3330 ])
3331
3332 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3333 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)'])
3334 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)'])
3335 sleep 1
3336 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3337 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>
3338 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>
3339 ])
3340 OVS_VSWITCHD_STOP
3341 AT_CLEANUP
3342
3343 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
3344 OVS_VSWITCHD_START(
3345   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
3346    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
3347    set interface p2 type=dummy ofport_request=2 -- \
3348    set interface p3 type=dummy ofport_request=3])
3349 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3350 ])
3351
3352 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3353 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)'])
3354 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)'])
3355 sleep 1
3356 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3357 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>
3358 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>
3359 ])
3360 OVS_VSWITCHD_STOP
3361 AT_CLEANUP
3362
3363 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
3364 # Create bond0 on br0 with interfaces p0 and p1
3365 #    and bond1 on br1 with interfaces p2 and p3
3366 # with p0 patched to p2 and p1 patched to p3.
3367 OVS_VSWITCHD_START(
3368   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
3369                             other-config:lacp-time=fast \
3370                             other-config:bond-rebalance-interval=0 -- \
3371    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
3372    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
3373    add-br br1 -- \
3374    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
3375    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
3376                   fail-mode=secure -- \
3377    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
3378                             other-config:lacp-time=fast \
3379                             other-config:bond-rebalance-interval=0 -- \
3380    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
3381    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
3382
3383 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
3384 ])
3385 ADD_OF_PORTS([br0], [7])
3386 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
3387 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
3388 ovs-appctl time/stop
3389 ovs-appctl time/warp 5000
3390 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)'])
3391 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)'])
3392 sleep 1
3393 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3394 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>
3395 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>
3396 ])
3397 OVS_VSWITCHD_STOP
3398 AT_CLEANUP
3399
3400 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
3401 OVS_VSWITCHD_START
3402 ADD_OF_PORTS([br0], [1], [2])
3403 AT_DATA([flows.txt], [dnl
3404 table=0 in_port=1,ip actions=resubmit(90)
3405 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
3406 ])
3407 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3408 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)'])
3409 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)'])
3410 sleep 1
3411 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3412 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>
3413 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>
3414 ])
3415 OVS_VSWITCHD_STOP
3416 AT_CLEANUP
3417
3418 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
3419 OVS_VSWITCHD_START
3420 ADD_OF_PORTS([br0], [1], [2])
3421 AT_DATA([flows.txt], [dnl
3422 table=0 in_port=1,ip actions=resubmit(,1)
3423 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
3424 ])
3425 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3426 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)'])
3427 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=
3428 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
3429 sleep 1
3430 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3431 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>
3432 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>
3433 ])
3434 OVS_VSWITCHD_STOP
3435 AT_CLEANUP
3436
3437 AT_SETUP([ofproto-dpif megaflow - goto_table action])
3438 OVS_VSWITCHD_START
3439 ADD_OF_PORTS([br0], [1], [2])
3440 AT_DATA([flows.txt], [dnl
3441 table=0 in_port=1,ip actions=goto_table(1)
3442 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
3443 ])
3444 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
3445 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)'])
3446 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)'])
3447 sleep 1
3448 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3449 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>
3450 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>
3451 ])
3452 OVS_VSWITCHD_STOP
3453 AT_CLEANUP
3454
3455 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
3456 OVS_VSWITCHD_START
3457 ADD_OF_PORTS([br0], [1], [2], [3])
3458 ovs-vsctl \
3459         set Bridge br0 mirrors=@m --\
3460         --id=@p3 get Port p3 --\
3461         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
3462
3463 AT_DATA([flows.txt], [dnl
3464 in_port=1 actions=output:2
3465 ])
3466 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3467 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)'])
3468 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)'])
3469 sleep 1
3470 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3471 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>
3472 ])
3473 OVS_VSWITCHD_STOP
3474 AT_CLEANUP
3475
3476 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
3477 OVS_VSWITCHD_START
3478 ADD_OF_PORTS([br0], [1], [2], [3])
3479 ovs-vsctl \
3480         set Bridge br0 mirrors=@m --\
3481         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
3482         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
3483
3484 AT_DATA([flows.txt], [dnl
3485 in_port=1 actions=output:2
3486 ])
3487 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3488 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))'])
3489 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)'])
3490 sleep 1
3491 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3492 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>
3493 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>
3494 ])
3495 OVS_VSWITCHD_STOP
3496 AT_CLEANUP
3497
3498 AT_SETUP([ofproto-dpif megaflow - move action])
3499 OVS_VSWITCHD_START
3500 ADD_OF_PORTS([br0], [1], [2])
3501 AT_DATA([flows.txt], [dnl
3502 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
3503 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
3504 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
3505 ])
3506 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3507 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)'])
3508 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)'])
3509 sleep 1
3510 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3511 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>
3512 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>
3513 ])
3514 OVS_VSWITCHD_STOP
3515 AT_CLEANUP
3516
3517 AT_SETUP([ofproto-dpif megaflow - push action])
3518 OVS_VSWITCHD_START
3519 ADD_OF_PORTS([br0], [1], [2])
3520 AT_DATA([flows.txt], [dnl
3521 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
3522 ])
3523 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3524 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)'])
3525 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)'])
3526 sleep 1
3527 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3528 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>
3529 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>
3530 ])
3531 OVS_VSWITCHD_STOP
3532 AT_CLEANUP
3533
3534 AT_SETUP([ofproto-dpif megaflow - learning])
3535 OVS_VSWITCHD_START
3536 ADD_OF_PORTS([br0], [1], [2])
3537 AT_DATA([flows.txt], [dnl
3538 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
3539 ])
3540 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3541 ovs-appctl time/stop
3542 # We send each packet twice because the first packet in each flow causes the
3543 # flow table to change and thus revalidations, which (depending on timing)
3544 # can keep a megaflow from being installed.  The revalidations are done by
3545 # the second iteration, allowing the flows to be installed.
3546 for i in 1 2; do
3547     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)'])
3548     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)'])
3549     ovs-appctl time/warp 100
3550 done
3551 sleep 1
3552 dnl The original flow is missing due to a revalidation.
3553 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3554 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>
3555 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>
3556 ])
3557 OVS_VSWITCHD_STOP
3558 AT_CLEANUP
3559
3560 AT_SETUP([ofproto-dpif megaflow - tunnels])
3561 OVS_VSWITCHD_START(
3562   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
3563 AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=gre \
3564      options:remote_ip=1.1.1.1 ofport_request=2 options:key=flow])
3565 AT_CHECK([ovs-vsctl add-port br0 p3 -- set Interface p3 type=dummy \
3566           ofport_request=3])
3567 AT_CHECK([ovs-vsctl add-port br0 p4 -- set Interface p4 type=gre \
3568      options:remote_ip=1.1.1.2 options:tos=inherit options:ttl=inherit \
3569      ofport_request=4 options:key=flow])
3570 AT_DATA([flows.txt], [dnl
3571 in_port=1,actions=output(2)
3572 in_port=3,actions=output(4)
3573 ])
3574 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3575 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
3576 dnl will cause the packet to be dropped.
3577 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)'])
3578 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)'])
3579 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)'])
3580 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)'])
3581 sleep 1
3582 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3583 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>
3584 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>
3585 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>
3586 ])
3587 OVS_VSWITCHD_STOP
3588 AT_CLEANUP
3589
3590 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
3591 OVS_VSWITCHD_START
3592 ADD_OF_PORTS([br0], [1], [2])
3593 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], [])
3594 AT_DATA([flows.txt], [dnl
3595 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
3596 ])
3597 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3598 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)'])
3599 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)'])
3600 sleep 1
3601 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
3602 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>
3603 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>
3604 ])
3605 OVS_VSWITCHD_STOP
3606 AT_CLEANUP
3607
3608 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
3609 OVS_VSWITCHD_START
3610 ADD_OF_PORTS([br0], [1], [2])
3611 AT_DATA([flows.txt], [dnl
3612 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
3613 ])
3614 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3615 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)'])
3616 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)'])
3617 sleep 1
3618 dnl The megaflows do not match the same fields, since the first packet
3619 dnl is essentially a no-op.  (The new destination MAC is the same as the
3620 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
3621 dnl so that a packet that doesn't need its MAC address changed doesn't
3622 dnl hide one that does.  Since the first entry doesn't need to change,
3623 dnl only the destination MAC address is matched (as decided by
3624 dnl ofproto-dpif).  The second entry actually updates the destination
3625 dnl MAC, so both the source and destination MAC addresses are
3626 dnl un-wildcarded, since the ODP commit functions update both the source
3627 dnl and destination MAC addresses.
3628 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3629 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
3630 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
3631 ])
3632 OVS_VSWITCHD_STOP
3633 AT_CLEANUP
3634
3635 AT_SETUP([ofproto-dpif megaflow - disabled])
3636 OVS_VSWITCHD_START
3637 ADD_OF_PORTS([br0], [1], [2])
3638 AT_DATA([flows.txt], [dnl
3639 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
3640 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
3641 ])
3642 AT_CHECK([ovs-appctl upcall/disable-megaflows], [0], [megaflows disabled
3643 ], [])
3644 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
3645 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3646 for i in 1 2 3 4; do
3647     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)'])
3648     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)'])
3649 done
3650 sleep 1
3651 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
3652 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
3653 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
3654 ])
3655 OVS_VSWITCHD_STOP
3656 AT_CLEANUP
3657
3658 AT_SETUP([ofproto-dpif - datapath port number change])
3659 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
3660 ADD_OF_PORTS([br0], 1)
3661
3662 # Trace a flow that should output to p1.
3663 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3664   [0], [stdout])
3665 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
3666 ])
3667
3668 # Change p1's port number to 5.
3669 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
3670
3671 # Trace a flow that should output to p1 in its new location.
3672 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3673   [0], [stdout])
3674 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
3675 ])
3676 OVS_VSWITCHD_STOP
3677 AT_CLEANUP
3678
3679 # Tests the bundling with various bfd and cfm configurations.
3680 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
3681 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
3682                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
3683                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
3684                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
3685                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
3686                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
3687                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
3688                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
3689                     set Interface p0 cfm_mpid=1 -- \
3690                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
3691
3692 ovs-appctl time/stop
3693 # advance the clock to stablize everything.
3694 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3695 # cfm/show should show 'recv' fault.
3696 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3697         fault: recv
3698 ])
3699 # bfd/show should show 'up'.
3700 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3701         Local Session State: up
3702         Remote Session State: up
3703         Local Session State: up
3704         Remote Session State: up
3705 ])
3706 # bond/show should show 'may-enable: true' for all slaves.
3707 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3708         may_enable: true
3709         may_enable: true
3710         may_enable: true
3711         may_enable: true
3712 ])
3713
3714 # now disable the bfd on p1.
3715 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
3716 # advance the clock to stablize everything.
3717 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3718 # cfm/show should show 'recv' fault.
3719 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3720         fault: recv
3721 ])
3722 # bfd/show should show 'down'.
3723 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3724         Local Session State: down
3725         Remote Session State: down
3726 ])
3727 # bond/show should show 'may-enable: false' for p0.
3728 AT_CHECK([ovs-appctl bond/show br0bond | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3729         may_enable: false
3730         may_enable: true
3731 ])
3732
3733 # now enable the bfd on p1 and disable bfd on p0.
3734 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
3735 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
3736 # advance the clock to stablize everything.
3737 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3738 # cfm/show should show 'recv' fault.
3739 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3740         fault: recv
3741 ])
3742 # bfd/show should show 'down'.
3743 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3744         Local Session State: down
3745         Remote Session State: down
3746 ])
3747 # bond/show should show 'may-enable: false' for p0 and p1.
3748 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3749         may_enable: false
3750         may_enable: true
3751         may_enable: false
3752         may_enable: true
3753 ])
3754
3755 OVS_VSWITCHD_STOP
3756 AT_CLEANUP
3757
3758 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 1])
3759 OVS_VSWITCHD_START([add-port br0 p0 -- set interface p0 type=gre options:remote_ip=1.2.3.4])
3760
3761 # enable bfd on p0.
3762 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3763 # check log.
3764 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3765 monitor thread created
3766 ])
3767 # disable bfd on p0.
3768 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3769 # check log.
3770 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3771 monitor thread terminated
3772 ])
3773 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3774
3775 # enable cfm on p0.
3776 AT_CHECK([ovs-vsctl set interface p0 cfm_mpid=10])
3777 # check log.
3778 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3779 monitor thread created
3780 ])
3781 # disable cfm on p0.
3782 AT_CHECK([ovs-vsctl remove interface p0 cfm_mpid 10])
3783 # check log.
3784 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3785 monitor thread terminated
3786 ])
3787 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3788
3789 # enable both bfd and cfm on p0.
3790 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true cfm_mpid=10])
3791 # check log.
3792 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3793 monitor thread created
3794 ])
3795 # disable bfd on p0.
3796 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3797 # check log, there should not be the log of thread terminated.
3798 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3799 ])
3800 # reenable bfd on p0.
3801 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3802 # check log, should still be on log of thread created.
3803 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3804 monitor thread created
3805 ])
3806 # disable bfd and cfm together.
3807 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false -- remove interface p0 cfm_mpid 10])
3808 # check log.
3809 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3810 monitor thread terminated
3811 ])
3812
3813 OVS_VSWITCHD_STOP
3814 AT_CLEANUP
3815
3816 # this test helps avoid the deadlock between the main thread and monitor thread.
3817 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 2])
3818 OVS_VSWITCHD_START
3819
3820 for i in `seq 1 199`
3821 do
3822     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])
3823 done
3824
3825 OVS_VSWITCHD_STOP
3826 AT_CLEANUP
3827 \f
3828 AT_BANNER([ofproto-dpif - flow translation resource limits])
3829
3830 AT_SETUP([ofproto-dpif - infinite resubmit])
3831 OVS_VSWITCHD_START
3832 AT_CHECK([ovs-ofctl add-flow br0 actions=resubmit:1,resubmit:2,output:3])
3833 AT_CHECK([ovs-appctl ofproto/trace br0 'eth_dst=ff:ff:ff:ff:ff:ff'],
3834   [0], [stdout])
3835 AT_CHECK([tail -1 stdout], [0], [Datapath actions: drop
3836 ])
3837 AT_CHECK([grep -c 'resubmit actions recursed over 64 times' ovs-vswitchd.log],
3838   [0], [1
3839 ])
3840 OVS_VSWITCHD_STOP(["/resubmit actions recursed/d"])
3841 AT_CLEANUP
3842
3843 AT_SETUP([ofproto-dpif - exponential resubmit chain])
3844 OVS_VSWITCHD_START
3845 ADD_OF_PORTS([br0], 1)
3846 (for i in `seq 1 64`; do
3847      j=`expr $i + 1`
3848      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3849  done
3850  echo "in_port=65, actions=local") > flows
3851  AT_CHECK([ovs-ofctl add-flows br0 flows])
3852 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3853 AT_CHECK([grep -c 'over 4096 resubmit actions' ovs-vswitchd.log], [0], [1
3854 ])
3855 OVS_VSWITCHD_STOP(["/over.*resubmit actions/d"])
3856 AT_CLEANUP
3857
3858 AT_SETUP([ofproto-dpif - too many output actions])
3859 OVS_VSWITCHD_START
3860 ADD_OF_PORTS([br0], 1)
3861 (for i in `seq 1 12`; do
3862      j=`expr $i + 1`
3863      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3864  done
3865  echo "in_port=13, actions=local,local,local,local,local,local,local,local") > flows
3866 AT_CHECK([ovs-ofctl add-flows br0 flows])
3867 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3868 AT_CHECK([grep -c -e '- Uses action(s) not supported by datapath' stdout],
3869   [0], [1
3870 ])
3871 AT_CHECK([grep -c 'resubmits yielded over 64 kB of actions' ovs-vswitchd.log], [0], [1
3872 ])
3873 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of actions/d"])
3874 AT_CLEANUP
3875
3876 AT_SETUP([ofproto-dpif - stack too deep])
3877 OVS_VSWITCHD_START
3878 ADD_OF_PORTS([br0], 1)
3879 (for i in `seq 1 12`; do
3880      j=`expr $i + 1`
3881      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3882  done
3883  push="push:NXM_NX_REG0[[]]"
3884  echo "in_port=13, actions=$push,$push,$push,$push,$push,$push,$push,$push") > flows
3885  AT_CHECK([ovs-ofctl add-flows br0 flows])
3886 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3887 AT_CHECK([grep -c 'resubmits yielded over 64 kB of stack' ovs-vswitchd.log], [0], [1
3888 ])
3889 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of stack/d"])
3890 AT_CLEANUP