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