ofproto-dpif: Remove avg_subfacet_life.
[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=111,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=111,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=111,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=111,tos=0,ttl=2,frag=no)),2,set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=1,frag=no)),3,4
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=111,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=34 in_port=1 (via invalid_ttl) data_len=34 (unbuffered)
276 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=111,nw_tos=0,nw_ecn=0,nw_ttl=1
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[[]],load:0x01010101->OXM_OF_ARP_SPA[[]],load:0x02020202->OXM_OF_ARP_TPA[[]],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=16,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 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
492 dnl
493 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
494 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
495 dnl
496 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
497 ip,metadata=0,in_port=0,dl_vlan=99,dl_vlan_pcp=1,dl_src=40:44:44:44:44:41,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
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=16,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=16,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 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
532 dnl
533 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
534 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
535 dnl
536 NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
537 ip,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=41:44:44:44:44:42,dl_dst=50:54:00:00:00:07,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=16,nw_tos=0,nw_ecn=0,nw_ttl=64
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=16,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=16,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=16,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=16,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=16,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=128,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=128,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=128,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=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
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=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
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=1.1.1.1,arp_tpa=2.2.2.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41
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[[]],load:0x1010101->NXM_OF_ARP_SPA[[]],load:0x2020202->NXM_OF_ARP_TPA[[]],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 OVS_VSWITCHD_STOP
930 AT_CLEANUP
931
932 AT_SETUP([ofproto-dpif - VLAN handling])
933 OVS_VSWITCHD_START(
934   [set Bridge br0 fail-mode=standalone -- \
935    add-port br0 p1                                  trunks=10,12 -- \
936    add-port br0 p2                           tag=10              -- \
937    add-port br0 p3                           tag=12              \
938                    other-config:priority-tags=true               -- \
939    add-port br0 p4                           tag=12              -- \
940    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
941    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
942    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
943    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
944                    other-config:priority-tags=true               -- \
945    set Interface p1 type=dummy -- \
946    set Interface p2 type=dummy -- \
947    set Interface p3 type=dummy -- \
948    set Interface p4 type=dummy -- \
949    set Interface p5 type=dummy -- \
950    set Interface p6 type=dummy -- \
951    set Interface p7 type=dummy -- \
952    set Interface p8 type=dummy --])
953
954 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
955 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
956 dnl actions.
957 for tuple in \
958         "100 none 0 drop" \
959         "100 0    0 drop" \
960         "100 0    1 drop" \
961         "100 10   0 1,5,6,7,8,pop_vlan,2" \
962         "100 10   1 1,5,6,7,8,pop_vlan,2" \
963         "100 11   0 5,7" \
964         "100 11   1 5,7" \
965         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
966         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
967         "1  none 0 drop" \
968         "1  0    0 drop" \
969         "1  0    1 drop" \
970         "1  10   0 5,6,7,8,100,pop_vlan,2" \
971         "1  10   1 5,6,7,8,100,pop_vlan,2" \
972         "1  11   0 drop" \
973         "1  11   1 drop" \
974         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
975         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
976         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
977         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
978         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
979         "2  10   0 drop" \
980         "2  10   1 drop" \
981         "2  11   0 drop" \
982         "2  11   1 drop" \
983         "2  12   0 drop" \
984         "2  12   1 drop" \
985         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
986         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
987         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
988         "3  10   0 drop" \
989         "3  10   1 drop" \
990         "3  11   0 drop" \
991         "3  11   1 drop" \
992         "3  12   0 drop" \
993         "3  12   1 drop" \
994         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
995         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
996         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
997         "4  10   0 drop" \
998         "4  10   1 drop" \
999         "4  11   0 drop" \
1000         "4  11   1 drop" \
1001         "4  12   0 drop" \
1002         "4  12   1 drop" \
1003         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1004         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
1005         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
1006         "5  10   0 1,6,7,8,100,pop_vlan,2" \
1007         "5  10   1 1,6,7,8,100,pop_vlan,2" \
1008         "5  11   0 7,100" \
1009         "5  11   1 7,100" \
1010         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
1011         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1012         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1013         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
1014         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
1015         "6  10   0 1,5,7,8,100,pop_vlan,2" \
1016         "6  10   1 1,5,7,8,100,pop_vlan,2" \
1017         "6  11   0 drop" \
1018         "6  11   1 drop" \
1019         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
1020         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
1021         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1022         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
1023         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
1024         "7  10   0 1,5,6,8,100,pop_vlan,2" \
1025         "7  10   1 1,5,6,8,100,pop_vlan,2" \
1026         "7  11   0 5,100" \
1027         "7  11   1 5,100" \
1028         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
1029         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
1030         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1031         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
1032         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
1033         "8  10   0 1,5,6,7,100,pop_vlan,2" \
1034         "8  10   1 1,5,6,7,100,pop_vlan,2" \
1035         "8  11   0 drop" \
1036         "8  11   1 drop" \
1037         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
1038         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
1039 do
1040   set $tuple
1041   in_port=$1
1042   vlan=$2
1043   pcp=$3
1044   expected=$4
1045
1046   if test $vlan = none; then
1047     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
1048   else
1049     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))"
1050   fi
1051
1052   echo "----------------------------------------------------------------------"
1053   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
1054
1055   AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1056   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1057
1058   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1059   mv stdout expout
1060   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1061 done
1062
1063 OVS_VSWITCHD_STOP
1064 AT_CLEANUP
1065
1066 AT_SETUP([ofproto-dpif - fragment handling])
1067 OVS_VSWITCHD_START
1068 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
1069 AT_DATA([flows.txt], [dnl
1070 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
1071 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
1072 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
1073 priority=50 tcp ip_frag=no              actions=output:4
1074 priority=50 tcp ip_frag=first           actions=output:5
1075 priority=50 tcp ip_frag=later           actions=output:6
1076 ])
1077 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
1078
1079 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"
1080 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
1081 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
1082 later_flow="$base_flow,frag=later)"
1083
1084     # mode    no  first  later
1085 for tuple in \
1086     'normal    1     5      6' \
1087     'drop      1  drop   drop' \
1088     'nx-match  1     2      6'
1089 do
1090   set $tuple
1091   mode=$1
1092   no=$2
1093   first=$3
1094   later=$4
1095
1096   AT_CHECK([ovs-ofctl set-frags br0 $mode])
1097   for type in no first later; do
1098     eval flow=\$${type}_flow exp_output=\$$type
1099     printf "\n%s\n" "----$mode $type-----"
1100     AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1101     : > expout
1102     if test $mode = drop && test $type != no; then
1103         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
1104     fi
1105     echo "Datapath actions: $exp_output" >> expout
1106     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
1107   done
1108 done
1109 OVS_VSWITCHD_STOP
1110 AT_CLEANUP
1111
1112 AT_SETUP([ofproto-dpif - exit])
1113 OVS_VSWITCHD_START
1114 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
1115 AT_DATA([flows.txt], [dnl
1116 in_port=1 actions=output:10,exit,output:11
1117 in_port=2 actions=output:12,resubmit:1,output:12
1118 in_port=3 actions=output:13,resubmit:2,output:14
1119 ])
1120 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1121 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])
1122 AT_CHECK([tail -1 stdout], [0],
1123   [Datapath actions: 10
1124 ])
1125 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])
1126 AT_CHECK([tail -1 stdout], [0],
1127   [Datapath actions: 12,10
1128 ])
1129 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])
1130 AT_CHECK([tail -1 stdout], [0],
1131   [Datapath actions: 13,12,10
1132 ])
1133 OVS_VSWITCHD_STOP
1134 AT_CLEANUP
1135
1136
1137 AT_SETUP([ofproto-dpif - mirroring, select_all])
1138 OVS_VSWITCHD_START
1139 ADD_OF_PORTS([br0], 1, 2, 3)
1140 ovs-vsctl \
1141         set Bridge br0 mirrors=@m --\
1142         --id=@p3 get Port p3 --\
1143         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1144
1145 AT_DATA([flows.txt], [dnl
1146 in_port=1 actions=output:2
1147 in_port=2 actions=output:1
1148 ])
1149 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1150
1151 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)"
1152 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1153 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1154   [Datapath actions: 2,3
1155 ])
1156
1157 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)"
1158 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1159 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1160   [Datapath actions: 1,3
1161 ])
1162
1163 OVS_VSWITCHD_STOP
1164 AT_CLEANUP
1165
1166
1167 AT_SETUP([ofproto-dpif - mirroring, select_src])
1168 OVS_VSWITCHD_START
1169 ADD_OF_PORTS([br0], 1, 2, 3)
1170 ovs-vsctl \
1171         set Bridge br0 mirrors=@m --\
1172         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
1173         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
1174
1175 AT_DATA([flows.txt], [dnl
1176 in_port=1 actions=output:2
1177 in_port=2 actions=output:1
1178 ])
1179 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1180
1181 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)"
1182 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1183 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1184   [Datapath actions: 2,3
1185 ])
1186
1187 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)"
1188 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1189 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1190   [Datapath actions: 1
1191 ])
1192 OVS_VSWITCHD_STOP
1193 AT_CLEANUP
1194
1195 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
1196 OVS_VSWITCHD_START
1197 ADD_OF_PORTS([br0], 1, 2)
1198 ovs-vsctl \
1199         set Bridge br0 mirrors=@m --\
1200         --id=@p2 get Port p2 --\
1201         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
1202
1203 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
1204
1205 # "in_port" defaults to OFPP_NONE if it's not specified.
1206 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"
1207 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
1208 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1209   [Datapath actions: 1,2
1210 ])
1211
1212 OVS_VSWITCHD_STOP
1213 AT_CLEANUP
1214
1215
1216 AT_SETUP([ofproto-dpif - mirroring, select_dst])
1217 OVS_VSWITCHD_START
1218 ADD_OF_PORTS([br0], 1, 2, 3)
1219 ovs-vsctl \
1220         set Bridge br0 mirrors=@m --\
1221         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1222         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
1223
1224 AT_DATA([flows.txt], [dnl
1225 in_port=1 actions=output:2
1226 in_port=2 actions=output:1
1227 ])
1228 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1229
1230 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)"
1231 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1232 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1233   [Datapath actions: 2,3
1234 ])
1235
1236 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)"
1237 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1238 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1239   [Datapath actions: 1
1240 ])
1241
1242 OVS_VSWITCHD_STOP
1243 AT_CLEANUP
1244
1245
1246 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
1247 OVS_VSWITCHD_START
1248 ADD_OF_PORTS([br0], 1, 2, 3)
1249 ovs-vsctl \
1250         set Bridge br0 mirrors=@m --\
1251         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
1252         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
1253
1254 AT_DATA([flows.txt], [dnl
1255 in_port=1, actions=output:2
1256 ])
1257 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1258
1259 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)"
1260 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1261 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1262   [Datapath actions: 2
1263 ])
1264
1265 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))"
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=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))"
1272 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1273 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1274   [Datapath actions: 2,3
1275 ])
1276
1277 OVS_VSWITCHD_STOP
1278 AT_CLEANUP
1279
1280
1281 AT_SETUP([ofproto-dpif - mirroring, output_port])
1282 OVS_VSWITCHD_START
1283 ADD_OF_PORTS([br0], 1, 2, 3)
1284 ovs-vsctl \
1285         set Bridge br0 mirrors=@m --\
1286         --id=@p3 get Port p3 --\
1287         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
1288
1289 AT_DATA([flows.txt], [dnl
1290 in_port=1 actions=mod_vlan_vid:17,output:2
1291 in_port=2 actions=output:1
1292 ])
1293 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1294
1295 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)"
1296 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1297 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1298   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
1299 ])
1300
1301 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)"
1302 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1303 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
1304   [Datapath actions: 1,3
1305 ])
1306
1307 OVS_VSWITCHD_STOP
1308 AT_CLEANUP
1309
1310 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
1311 OVS_VSWITCHD_START
1312 ADD_OF_PORTS([br0], 1, 2)
1313 ovs-vsctl \
1314         set Bridge br0 mirrors=@m --\
1315         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
1316
1317 AT_DATA([flows.txt], [dnl
1318 in_port=1 actions=output:2
1319 in_port=2 actions=mod_vlan_vid:17,output:1
1320 ])
1321 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1322
1323 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)"
1324 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1325 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1326
1327 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
1328 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1329 mv stdout expout
1330 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1331
1332 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)"
1333 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow"], [0], [stdout])
1334 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1335
1336 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
1337 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
1338 mv stdout expout
1339 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
1340
1341 OVS_VSWITCHD_STOP
1342 AT_CLEANUP
1343
1344 # Two testcases below are for the ofproto/trace command
1345 # The first one tests all correct syntax:
1346 # ofproto/trace [dp_name] odp_flow [-generate|packet]
1347 # ofproto/trace br_name br_flow [-generate|packet]
1348 AT_SETUP([ofproto-dpif - ofproto/trace command 1])
1349 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1350 ADD_OF_PORTS([br0], 1, 2, 3)
1351
1352 AT_DATA([flows.txt], [dnl
1353 in_port=1 actions=output:2
1354 in_port=2 actions=output:1
1355 ])
1356 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1357
1358 odp_flow="in_port(p1)"
1359 br_flow="in_port=1"
1360 # Test command: ofproto/trace odp_flow with in_port as a name.
1361 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1362 AT_CHECK([tail -1 stdout], [0], [dnl
1363 Datapath actions: 2
1364 ])
1365
1366 odp_flow="in_port(1)"
1367 # Test command: ofproto/trace odp_flow
1368 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1369 AT_CHECK([tail -1 stdout], [0], [dnl
1370 Datapath actions: 2
1371 ])
1372
1373 # Test command: ofproto/trace dp_name odp_flow
1374 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$odp_flow"], [0], [stdout])
1375 AT_CHECK([tail -1 stdout], [0], [dnl
1376 Datapath actions: 2
1377 ])
1378 # Test commmand: ofproto/trace br_name br_flow
1379 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1380 AT_CHECK([tail -1 stdout], [0], [dnl
1381 Datapath actions: 2
1382 ])
1383
1384 # Delete the inserted flows
1385 AT_CHECK([ovs-ofctl del-flows br0 "in_port=1"], [0], [stdout])
1386 AT_CHECK([ovs-ofctl del-flows br0 "in_port=2"], [0], [stdout])
1387
1388 # This section beflow tests the [-generate] option
1389 odp_flow="in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff)"
1390 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"
1391
1392 # Test command: ofproto/trace odp_flow
1393 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow"], [0], [stdout])
1394 # Check for no MAC learning entry
1395 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1396  port  VLAN  MAC                Age
1397 ])
1398
1399 # Test command: ofproto/trace br_name br_flow
1400 AT_CHECK([ovs-appctl ofproto/trace br0 "$br_flow"], [0], [stdout])
1401 # Check for no MAC learning entry
1402 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1403  port  VLAN  MAC                Age
1404 ])
1405
1406 # Test command: ofproto/trace odp_flow -generate
1407 AT_CHECK([ovs-appctl ofproto/trace "$odp_flow" -generate], [0], [stdout])
1408 # Check for the MAC learning entry
1409 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1410  port  VLAN  MAC                Age
1411     3     0  50:54:00:00:00:05    ?
1412 ])
1413
1414 # Test command: ofproto/trace dp_name odp_flow -generate
1415 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1416   "in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05)" \
1417   -generate], [0], [stdout])
1418 # Check for both MAC learning entries
1419 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1420  port  VLAN  MAC                Age
1421     3     0  50:54:00:00:00:05    ?
1422     1     0  50:54:00:00:00:06    ?
1423 ])
1424
1425 # Test command: ofproto/trace br_name br_flow -generate
1426 AT_CHECK([ovs-appctl ofproto/trace br0 \
1427   "in_port=2,dl_src=50:54:00:00:00:07,dl_dst=50:54:00:00:00:06" \
1428   -generate], [0], [stdout])
1429 # Check for both MAC learning entries.
1430 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1431  port  VLAN  MAC                Age
1432     3     0  50:54:00:00:00:05    ?
1433     1     0  50:54:00:00:00:06    ?
1434     2     0  50:54:00:00:00:07    ?
1435 ])
1436
1437 # This section beflow tests the [packet] option
1438 # The ovs-tcpundump of packets between port1 and port2
1439 pkt1to2="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1440 pkt2to1="50540000000150540000000208064500001C000100004001F98CC0A80002C0A800010800F7FF00000000"
1441
1442 # Construct the MAC learning table
1443 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1444   "in_port(1),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff)" \
1445   -generate], [0], [stdout])
1446
1447 # Construct the MAC learning table
1448 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1449   "in_port(2),eth(src=50:54:00:00:00:02,dst=ff:ff:ff:ff:ff:ff)" \
1450   -generate], [0], [stdout])
1451
1452 # Test command: ofproto/trace odp_flow packet
1453 AT_CHECK([ovs-appctl ofproto/trace \
1454   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1455 AT_CHECK([tail -1 stdout], [0], [dnl
1456 Datapath actions: 2
1457 ])
1458 AT_CHECK([head -n 2 stdout], [0], [dnl
1459 Bridge: br0
1460 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
1461 ])
1462
1463 # Test command: ofproto/trace dp_name odp_flow packet
1464 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy \
1465   "in_port(1),skb_priority(1),skb_mark(2)" "$pkt1to2"], [0], [stdout])
1466 AT_CHECK([tail -1 stdout], [0], [dnl
1467 Datapath actions: 2
1468 ])
1469 AT_CHECK([head -n 2 stdout], [0], [dnl
1470 Bridge: br0
1471 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
1472 ])
1473
1474 # Test command: ofproto/trace br_name br_flow packet
1475 AT_CHECK([ovs-appctl ofproto/trace br0 \
1476   "in_port=2,skb_priority=2,pkt_mark=1" "$pkt2to1"], [0], [stdout],[stderr])
1477 AT_CHECK([tail -1 stdout], [0], [dnl
1478 Datapath actions: 1
1479 ])
1480 AT_CHECK([head -n 2 stdout], [0], [dnl
1481 Bridge: br0
1482 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
1483 ])
1484
1485 OVS_VSWITCHD_STOP
1486 AT_CLEANUP
1487
1488 # The second test tests the corner cases
1489 AT_SETUP([ofproto-dpif - ofproto/trace command 2])
1490 OVS_VSWITCHD_START
1491 ADD_OF_PORTS([br0], 1, 2)
1492
1493 # Define flows
1494 odp_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02)"
1495 br_flow="in_port=1,dl_src=50:54:00:00:00:01,dl_dst=50:54:00:00:00:02"
1496 # Define options
1497 generate="-generate"
1498 pkt="50540000000250540000000108064500001C000100004001F98CC0A80001C0A800020800F7FF00000000"
1499
1500 # Test incorrect command: ofproto/trace wrong_name odp_flow [-generate|packet]
1501 m4_foreach(
1502 [option],
1503 [[],
1504 ["$generate"],
1505 ["$pkt"]],
1506 [AT_CHECK([ovs-appctl ofproto/trace wrong_name "$odp_flow" option],
1507   [2], [], [stderr])
1508 AT_CHECK([tail -2 stderr], [0], [dnl
1509 Cannot find the datapath
1510 ovs-appctl: ovs-vswitchd: server returned an error
1511 ])])
1512
1513 # Test incorrect command: ofproto/trace empty_string odp_flow [-generate|packet]
1514 m4_foreach(
1515 [option],
1516 [[],
1517 ["$generate"],
1518 ["$pkt"]],
1519 [AT_CHECK([ovs-appctl ofproto/trace "" "$odp_flow" option],
1520   [2], [], [stderr])
1521 AT_CHECK([tail -2 stderr], [0], [dnl
1522 Cannot find the datapath
1523 ovs-appctl: ovs-vswitchd: server returned an error
1524 ])])
1525
1526 # Test incorrect command: ofproto/trace nonexist_dp_name odp_flow [-generate|packet]
1527 m4_foreach(
1528 [option],
1529 [[],
1530 ["$generate"],
1531 ["$pkt"]],
1532 [AT_CHECK([ovs-appctl ofproto/trace ovs-system "$odp_flow" option],
1533   [2], [], [stderr])
1534 AT_CHECK([tail -2 stderr], [0], [dnl
1535 Cannot find the datapath
1536 ovs-appctl: ovs-vswitchd: server returned an error
1537 ])])
1538
1539 # Test incorrect command: ofproto/trace br_name odp_flow [-generate|packet]
1540 m4_foreach(
1541 [option],
1542 [[],
1543 ["$generate"],
1544 ["$pkt"]],
1545 [AT_CHECK([ovs-appctl ofproto/trace br0 "$odp_flow" option],
1546   [2], [], [stderr])
1547 AT_CHECK([tail -2 stderr], [0], [dnl
1548 Cannot find the datapath
1549 ovs-appctl: ovs-vswitchd: server returned an error
1550 ])])
1551
1552 # Test incorrect command: ofproto/trace dp_name br_flow [-generate|packet]
1553 m4_foreach(
1554 [option],
1555 [[],
1556 ["$generate"],
1557 ["$pkt"]],
1558 [AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$br_flow" option],
1559   [2], [], [stderr])
1560 AT_CHECK([tail -2 stderr], [0], [dnl
1561 Unknown bridge name
1562 ovs-appctl: ovs-vswitchd: server returned an error
1563 ])])
1564
1565 # Test incorrect command: ofproto/trace br_flow [-generate|packet]
1566 m4_foreach(
1567 [option],
1568 [[],
1569 ["$generate"],
1570 ["$pkt"]],
1571 [AT_CHECK([ovs-appctl ofproto/trace "$br_flow" option],
1572   [2], [], [stderr])
1573 AT_CHECK([tail -2 stderr], [0], [dnl
1574 Must specify bridge name
1575 ovs-appctl: ovs-vswitchd: server returned an error
1576 ])])
1577
1578 # Test incorrect command: ofproto/trace dp_name odp_flow garbage_option
1579 AT_CHECK([ovs-appctl ofproto/trace \
1580   ovs-dummy "$odp_flow" garbage_option],
1581   [2], [stdout],[stderr])
1582 AT_CHECK([tail -2 stderr], [0], [dnl
1583 Trailing garbage in packet data
1584 ovs-appctl: ovs-vswitchd: server returned an error
1585 ])
1586
1587 # Test incorrect command: ofproto/trace with 4 arguments
1588 AT_CHECK([ovs-appctl ofproto/trace \
1589   arg1, arg2, arg3, arg4], [2], [stdout],[stderr])
1590 AT_CHECK([tail -2 stderr], [0], [dnl
1591 "ofproto/trace" command takes at most 3 arguments
1592 ovs-appctl: ovs-vswitchd: server returned an error
1593 ])
1594
1595 # Test incorrect command: ofproto/trace with 0 argument
1596 AT_CHECK([ovs-appctl ofproto/trace ], [2], [stdout],[stderr])
1597 AT_CHECK([tail -2 stderr], [0], [dnl
1598 "ofproto/trace" command requires at least 1 arguments
1599 ovs-appctl: ovs-vswitchd: server returned an error
1600 ])
1601
1602 OVS_VSWITCHD_STOP
1603 AT_CLEANUP
1604
1605 AT_SETUP([ofproto-dpif - ofproto/trace-packet-out])
1606 OVS_VSWITCHD_START
1607 ADD_OF_PORTS([br0], 1, 2, 3)
1608
1609 AT_DATA([flows.txt], [dnl
1610 in_port=1 actions=output:2
1611 in_port=2 actions=output:1
1612 ])
1613 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1614
1615 AT_CHECK([ovs-appctl ofproto/trace-packet-out br0 in_port=1 'mod_vlan_vid:123,resubmit(,0)'], [0], [stdout])
1616 AT_CHECK([tail -1 stdout], [0], [dnl
1617 Datapath actions: push_vlan(vid=123,pcp=0),2
1618 ])
1619
1620 OVS_VSWITCHD_STOP
1621 AT_CLEANUP
1622
1623
1624 m4_define([OFPROTO_TRACE],
1625   [flow="$2"
1626    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
1627    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
1628    expected="$4"
1629    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
1630      [0], [stdout])
1631    mv stdout expout
1632    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
1633      [0], [expout])])
1634
1635 AT_SETUP([ofproto-dpif - MAC learning])
1636 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
1637 ADD_OF_PORTS([br0], 1, 2, 3)
1638
1639 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)'
1640
1641 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
1642 OFPROTO_TRACE(
1643   [ovs-dummy],
1644   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1645   [-generate],
1646   [1,2,100])
1647
1648 # Check for the MAC learning entry.
1649 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1650  port  VLAN  MAC                Age
1651     3     0  50:54:00:00:00:05    ?
1652 ])
1653
1654 # Trace a packet arrival destined for the learned MAC.
1655 # (This will also learn a MAC.)
1656 OFPROTO_TRACE(
1657   [ovs-dummy],
1658   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
1659   [-generate],
1660   [3])
1661
1662 # Check for both MAC learning entries.
1663 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1664  port  VLAN  MAC                Age
1665     3     0  50:54:00:00:00:05    ?
1666     1     0  50:54:00:00:00:06    ?
1667 ])
1668
1669 # Trace a packet arrival that updates the first learned MAC entry.
1670 OFPROTO_TRACE(
1671   [ovs-dummy],
1672   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
1673   [-generate],
1674   [1,3,100])
1675
1676 # Check that the MAC learning entry was updated.
1677 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1678  port  VLAN  MAC                Age
1679     1     0  50:54:00:00:00:06    ?
1680     2     0  50:54:00:00:00:05    ?
1681 ])
1682
1683 # Add another bridge.
1684 AT_CHECK(
1685   [ovs-vsctl \
1686      -- add-br br1 \
1687      -- set bridge br1 datapath-type=dummy])
1688 ADD_OF_PORTS([br1], 4, 5)
1689
1690 # Trace some packet arrivals in br1 to create MAC learning entries there too.
1691 OFPROTO_TRACE(
1692   [ovs-dummy],
1693   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
1694   [-generate],
1695   [5,101])
1696 OFPROTO_TRACE(
1697   [ovs-dummy],
1698   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
1699   [-generate],
1700   [4,101])
1701
1702 # Check that the MAC learning entries were added.
1703 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1704  port  VLAN  MAC                Age
1705     4     0  50:54:00:00:00:06    ?
1706     5     0  50:54:00:00:00:07    ?
1707 ])
1708
1709 # Delete port p1 and see that its MAC learning entry disappeared, and
1710 # that the MAC learning entry for the same MAC was also deleted from br1.
1711 AT_CHECK([ovs-vsctl del-port p1])
1712 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1713  port  VLAN  MAC                Age
1714     2     0  50:54:00:00:00:05    ?
1715 ])
1716 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
1717  port  VLAN  MAC                Age
1718     5     0  50:54:00:00:00:07    ?
1719 ])
1720
1721 OVS_VSWITCHD_STOP
1722 AT_CLEANUP
1723
1724 AT_SETUP([ofproto-dpif - MAC table overflow])
1725 OVS_VSWITCHD_START(
1726   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10])
1727 ADD_OF_PORTS([br0], 1, 2, 3)
1728
1729 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)'
1730
1731 AT_CHECK([ovs-appctl time/stop])
1732
1733 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
1734 for i in 0 1 2 3 4 5 6 7 8 9; do
1735     OFPROTO_TRACE(
1736       [ovs-dummy],
1737       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
1738       [-generate],
1739       [1,2,100])
1740     ovs-appctl time/warp 1000
1741 done
1742
1743 # Check for the MAC learning entries.
1744 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
1745   [0], [dnl
1746     3     0  50:54:00:00:00:00
1747     3     0  50:54:00:00:00:01
1748     3     0  50:54:00:00:00:02
1749     3     0  50:54:00:00:00:03
1750     3     0  50:54:00:00:00:04
1751     3     0  50:54:00:00:00:05
1752     3     0  50:54:00:00:00:06
1753     3     0  50:54:00:00:00:07
1754     3     0  50:54:00:00:00:08
1755     3     0  50:54:00:00:00:09
1756  port  VLAN  MAC                Age
1757 ])
1758
1759 # Trace another ARP packet on another MAC.
1760 OFPROTO_TRACE(
1761   [ovs-dummy],
1762   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
1763   [-generate],
1764   [1,2,100])
1765
1766 # Check that the new one chased the oldest one out of the table.
1767 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
1768   [0], [dnl
1769     3     0  50:54:00:00:00:01    ?
1770     3     0  50:54:00:00:00:02    ?
1771     3     0  50:54:00:00:00:03    ?
1772     3     0  50:54:00:00:00:04    ?
1773     3     0  50:54:00:00:00:05    ?
1774     3     0  50:54:00:00:00:06    ?
1775     3     0  50:54:00:00:00:07    ?
1776     3     0  50:54:00:00:00:08    ?
1777     3     0  50:54:00:00:00:09    ?
1778     3     0  50:54:00:00:00:10    ?
1779  port  VLAN  MAC                Age
1780 ])
1781 OVS_VSWITCHD_STOP
1782 AT_CLEANUP
1783
1784 dnl Test that sFlow samples packets correctly.
1785 AT_SETUP([ofproto-dpif - sFlow packet sampling])
1786 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1787
1788 ON_EXIT([kill `cat test-sflow.pid`])
1789 AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > sflow.log], [0], [], [ignore])
1790 AT_CAPTURE_FILE([sflow.log])
1791 SFLOW_PORT=`parse_listening_port < test-sflow.log`
1792
1793 ovs-appctl time/stop
1794
1795 ADD_OF_PORTS([br0], 1, 2)
1796 ovs-vsctl \
1797    set Interface br0 options:ifindex=1002 -- \
1798    set Interface p1 options:ifindex=1004 -- \
1799    set Interface p2 options:ifindex=1003 -- \
1800    set Bridge br0 sflow=@sf -- \
1801    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
1802      header=128 sampling=1 polling=1
1803
1804 dnl open with ARP packets to seed the bridge-learning.  The output
1805 dnl ifIndex numbers should be reported predictably after that.
1806 dnl Since we set sampling=1 we should see all of these packets
1807 dnl reported. Sorting the output by data-source and seqNo makes
1808 dnl it deterministic. Ensuring that we send at least two packets
1809 dnl into each port means we get to check the seq nos are
1810 dnl incrementing correctly.
1811
1812 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)'
1813 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)'
1814 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)'
1815 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)'
1816 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)'
1817
1818 dnl sleep long enough to get more than one counter sample
1819 dnl from each datasource so we can check sequence numbers
1820 for i in `seq 1 30`; do
1821     ovs-appctl time/warp 100
1822 done
1823 OVS_VSWITCHD_STOP
1824 ovs-appctl -t test-sflow exit
1825
1826 AT_CHECK([[sort sflow.log | $EGREP 'HEADER|ERROR' | sed 's/ /\
1827         /g']], [0], [dnl
1828 HEADER
1829         dgramSeqNo=1
1830         ds=127.0.0.1>2:1000
1831         fsSeqNo=1
1832         in_vlan=0
1833         in_priority=0
1834         out_vlan=0
1835         out_priority=0
1836         meanSkip=1
1837         samplePool=1
1838         dropEvents=0
1839         in_ifindex=1004
1840         in_format=0
1841         out_ifindex=2
1842         out_format=2
1843         hdr_prot=1
1844         pkt_len=64
1845         stripped=4
1846         hdr_len=60
1847         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
1848 HEADER
1849         dgramSeqNo=1
1850         ds=127.0.0.1>2:1000
1851         fsSeqNo=2
1852         in_vlan=0
1853         in_priority=0
1854         out_vlan=0
1855         out_priority=0
1856         meanSkip=1
1857         samplePool=2
1858         dropEvents=0
1859         in_ifindex=1003
1860         in_format=0
1861         out_ifindex=2
1862         out_format=2
1863         hdr_prot=1
1864         pkt_len=64
1865         stripped=4
1866         hdr_len=60
1867         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
1868 HEADER
1869         dgramSeqNo=1
1870         ds=127.0.0.1>2:1000
1871         fsSeqNo=3
1872         in_vlan=0
1873         in_priority=0
1874         out_vlan=0
1875         out_priority=0
1876         meanSkip=1
1877         samplePool=3
1878         dropEvents=0
1879         in_ifindex=1004
1880         in_format=0
1881         out_ifindex=1003
1882         out_format=0
1883         hdr_prot=1
1884         pkt_len=64
1885         stripped=4
1886         hdr_len=60
1887         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
1888 HEADER
1889         dgramSeqNo=1
1890         ds=127.0.0.1>2:1000
1891         fsSeqNo=4
1892         in_vlan=0
1893         in_priority=0
1894         out_vlan=0
1895         out_priority=0
1896         meanSkip=1
1897         samplePool=4
1898         dropEvents=0
1899         in_ifindex=1003
1900         in_format=0
1901         out_ifindex=1004
1902         out_format=0
1903         hdr_prot=1
1904         pkt_len=64
1905         stripped=4
1906         hdr_len=60
1907         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
1908 HEADER
1909         dgramSeqNo=1
1910         ds=127.0.0.1>2:1000
1911         fsSeqNo=5
1912         in_vlan=0
1913         in_priority=0
1914         out_vlan=0
1915         out_priority=0
1916         meanSkip=1
1917         samplePool=5
1918         dropEvents=0
1919         in_ifindex=1003
1920         in_format=0
1921         out_ifindex=1004
1922         out_format=0
1923         hdr_prot=1
1924         pkt_len=64
1925         stripped=4
1926         hdr_len=60
1927         hdr=50-54-00-00-00-05-50-54-00-00-00-07-86-DD-67-00-00-00-00-00-0A-80-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-01-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-02-00-00-00-00-00-00
1928 ])
1929
1930 AT_CHECK([[sort sflow.log | $EGREP 'IFCOUNTERS|ERROR' | head -6 | sed 's/ /\
1931         /g']], [0], [dnl
1932 IFCOUNTERS
1933         dgramSeqNo=2
1934         ds=127.0.0.1>0:1002
1935         csSeqNo=1
1936         ifindex=1002
1937         type=6
1938         ifspeed=100000000
1939         direction=0
1940         status=3
1941         in_octets=0
1942         in_unicasts=0
1943         in_multicasts=0
1944         in_broadcasts=4294967295
1945         in_discards=0
1946         in_errors=0
1947         in_unknownprotos=4294967295
1948         out_octets=120
1949         out_unicasts=2
1950         out_multicasts=4294967295
1951         out_broadcasts=4294967295
1952         out_discards=0
1953         out_errors=0
1954         promiscuous=0
1955 IFCOUNTERS
1956         dgramSeqNo=2
1957         ds=127.0.0.1>0:1003
1958         csSeqNo=1
1959         ifindex=1003
1960         type=6
1961         ifspeed=100000000
1962         direction=0
1963         status=0
1964         in_octets=138
1965         in_unicasts=3
1966         in_multicasts=0
1967         in_broadcasts=4294967295
1968         in_discards=0
1969         in_errors=0
1970         in_unknownprotos=4294967295
1971         out_octets=120
1972         out_unicasts=2
1973         out_multicasts=4294967295
1974         out_broadcasts=4294967295
1975         out_discards=0
1976         out_errors=0
1977         promiscuous=0
1978 IFCOUNTERS
1979         dgramSeqNo=2
1980         ds=127.0.0.1>0:1004
1981         csSeqNo=1
1982         ifindex=1004
1983         type=6
1984         ifspeed=100000000
1985         direction=0
1986         status=0
1987         in_octets=84
1988         in_unicasts=2
1989         in_multicasts=0
1990         in_broadcasts=4294967295
1991         in_discards=0
1992         in_errors=0
1993         in_unknownprotos=4294967295
1994         out_octets=180
1995         out_unicasts=3
1996         out_multicasts=4294967295
1997         out_broadcasts=4294967295
1998         out_discards=0
1999         out_errors=0
2000         promiscuous=0
2001 IFCOUNTERS
2002         dgramSeqNo=3
2003         ds=127.0.0.1>0:1002
2004         csSeqNo=2
2005         ifindex=1002
2006         type=6
2007         ifspeed=100000000
2008         direction=0
2009         status=3
2010         in_octets=0
2011         in_unicasts=0
2012         in_multicasts=0
2013         in_broadcasts=4294967295
2014         in_discards=0
2015         in_errors=0
2016         in_unknownprotos=4294967295
2017         out_octets=120
2018         out_unicasts=2
2019         out_multicasts=4294967295
2020         out_broadcasts=4294967295
2021         out_discards=0
2022         out_errors=0
2023         promiscuous=0
2024 IFCOUNTERS
2025         dgramSeqNo=3
2026         ds=127.0.0.1>0:1003
2027         csSeqNo=2
2028         ifindex=1003
2029         type=6
2030         ifspeed=100000000
2031         direction=0
2032         status=0
2033         in_octets=138
2034         in_unicasts=3
2035         in_multicasts=0
2036         in_broadcasts=4294967295
2037         in_discards=0
2038         in_errors=0
2039         in_unknownprotos=4294967295
2040         out_octets=120
2041         out_unicasts=2
2042         out_multicasts=4294967295
2043         out_broadcasts=4294967295
2044         out_discards=0
2045         out_errors=0
2046         promiscuous=0
2047 IFCOUNTERS
2048         dgramSeqNo=3
2049         ds=127.0.0.1>0:1004
2050         csSeqNo=2
2051         ifindex=1004
2052         type=6
2053         ifspeed=100000000
2054         direction=0
2055         status=0
2056         in_octets=84
2057         in_unicasts=2
2058         in_multicasts=0
2059         in_broadcasts=4294967295
2060         in_discards=0
2061         in_errors=0
2062         in_unknownprotos=4294967295
2063         out_octets=180
2064         out_unicasts=3
2065         out_multicasts=4294967295
2066         out_broadcasts=4294967295
2067         out_discards=0
2068         out_errors=0
2069         promiscuous=0
2070 ])
2071 AT_CLEANUP
2072
2073
2074
2075 dnl Test that basic NetFlow reports flow statistics correctly:
2076 dnl - The initial packet of a flow are correctly accounted.
2077 dnl - Later packets within a flow are correctly accounted.
2078 dnl - Flow actions changing (in this case, due to MAC learning)
2079 dnl   cause a record to be sent.
2080 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
2081
2082 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2083 ADD_OF_PORTS([br0], 1, 2)
2084
2085 ovs-appctl time/stop
2086 ON_EXIT([kill `cat test-netflow.pid`])
2087 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2088 AT_CAPTURE_FILE([netflow.log])
2089 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2090
2091 ovs-vsctl \
2092    set Bridge br0 netflow=@nf -- \
2093    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2094      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2095
2096 for delay in 1000 30000; do
2097     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)'
2098     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)'
2099
2100     ovs-appctl time/warp $delay
2101 done
2102
2103 sleep 1
2104 OVS_VSWITCHD_STOP
2105 ovs-appctl -t test-netflow exit
2106
2107 AT_CHECK([[sed -e 's/, uptime [0-9]*//
2108 s/, now [0-9.]*//
2109 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
2110 s/time [0-9]*\.\.\.[0-9]*/time <range>/
2111 ' netflow.log | sort]], [0],
2112   [
2113 header: v5, seq 0, engine 2,1
2114 header: v5, seq 1, engine 2,1
2115 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
2116 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
2117 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
2118 ])
2119 AT_CLEANUP
2120
2121 dnl Test that basic NetFlow reports active expirations correctly.
2122 AT_SETUP([ofproto-dpif - NetFlow active expiration])
2123
2124 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2125 ADD_OF_PORTS([br0], 1, 2)
2126
2127 ON_EXIT([kill `cat test-netflow.pid`])
2128 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2129 AT_CAPTURE_FILE([netflow.log])
2130 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2131
2132 ovs-vsctl \
2133    set Bridge br0 netflow=@nf -- \
2134    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2135      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
2136
2137 AT_CHECK([ovs-appctl time/stop])
2138 n=1
2139 while test $n -le 60; do
2140     n=`expr $n + 1`
2141
2142     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)'
2143     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)'
2144
2145     ovs-appctl time/warp 1000
2146 done
2147
2148 ovs-appctl time/warp 10000
2149
2150 sleep 1
2151 OVS_VSWITCHD_STOP
2152 ovs-appctl -t test-netflow exit
2153
2154 # Count the number of reported packets:
2155 # - From source to destination before MAC learning kicks in (just one).
2156 # - From source to destination after that.
2157 # - From destination to source.
2158 n_learn=0
2159 n_in=0
2160 n_out=0
2161 n_other=0
2162 n_recs=0
2163 none=0
2164 while read line; do
2165     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
2166     case $pkts in
2167          [[0-9]]*) ;;
2168          *) continue ;;
2169     esac
2170
2171     case $line in
2172         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2173             counter=n_learn
2174             ;;
2175         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
2176             counter=n_in
2177             ;;
2178         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
2179             counter=n_out
2180             ;;
2181         *)
2182             counter=n_other
2183             ;;
2184     esac
2185     eval $counter=\`expr \$$counter + \$pkts\`
2186     n_recs=`expr $n_recs + 1`
2187 done < netflow.log
2188
2189 # There should be exactly 1 MAC learning packet,
2190 # exactly 59 other packets in that direction,
2191 # and exactly 60 packets in the other direction.
2192 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
2193 ])
2194
2195 # There should be 1 expiration for MAC learning,
2196 # at least 5 active and a final expiration in one direction,
2197 # and at least 5 active and a final expiration in the other direction.
2198 echo $n_recs
2199 AT_CHECK([test $n_recs -ge 13])
2200
2201 AT_CLEANUP
2202
2203 AT_SETUP([idle_age and hard_age increase over time])
2204 OVS_VSWITCHD_START
2205
2206 # get_ages DURATION HARD IDLE
2207 #
2208 # Fetch the flow duration, hard age, and idle age into the variables
2209 # whose names are given as arguments.  Rounds DURATION down to the
2210 # nearest integer.  If hard_age doesn't appear in the output, sets
2211 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
2212 # to 0.
2213 get_ages () {
2214     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
2215
2216     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
2217     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
2218     AS_VAR_COPY([$1], [duration])
2219
2220     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
2221     if test X"$hard" = X; then
2222         hard=none
2223     else
2224         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
2225     fi
2226     AS_VAR_COPY([$2], [hard])
2227
2228     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
2229     if test X"$idle" = X; then
2230         idle=0
2231     else
2232         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
2233     fi
2234     AS_VAR_COPY([$3], [idle])
2235 }
2236
2237 # Add a flow and get its initial hard and idle age.
2238 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
2239 get_ages duration1 hard1 idle1
2240
2241 ovs-appctl time/stop
2242 # Warp time forward by 10 seconds, then modify the flow's actions.
2243 ovs-appctl time/warp 10000
2244 get_ages duration2 hard2 idle2
2245 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
2246
2247 # Warp time forward by 10 seconds.
2248 ovs-appctl time/warp 10000
2249 get_ages duration3 hard3 idle3
2250
2251 # Warp time forward 10 more seconds, then pass some packets through the flow,
2252 # then warp forward a few more times because idle times are only updated
2253 # occasionally.
2254 ovs-appctl time/warp 10000
2255 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)'
2256 ovs-appctl time/warp 1000
2257 ovs-appctl time/warp 1000
2258 ovs-appctl time/warp 1000
2259 get_ages duration4 hard4 idle4
2260
2261 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
2262 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
2263 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
2264
2265 # Duration should increase steadily over time.
2266 AT_CHECK([test $duration1 -lt $duration2])
2267 AT_CHECK([test $duration2 -lt $duration3])
2268 AT_CHECK([test $duration3 -lt $duration4])
2269
2270 # Hard age should be "none" initially because it's the same as flow_duration,
2271 # then it should increase.
2272 AT_CHECK([test $hard1 = none])
2273 AT_CHECK([test $hard2 = none])
2274 AT_CHECK([test $hard3 != none])
2275 AT_CHECK([test $hard4 != none])
2276 AT_CHECK([test $hard3 -lt $hard4])
2277
2278 # Idle age should increase from 1 to 2 to 3, then decrease.
2279 AT_CHECK([test $idle1 -lt $idle2])
2280 AT_CHECK([test $idle2 -lt $idle3])
2281 AT_CHECK([test $idle3 -gt $idle4])
2282
2283 # Check some invariant relationships.
2284 AT_CHECK([test $duration1 = $idle1])
2285 AT_CHECK([test $duration2 = $idle2])
2286 AT_CHECK([test $duration3 = $idle3])
2287 AT_CHECK([test $idle3 -gt $hard3])
2288 AT_CHECK([test $idle4 -lt $hard4])
2289 AT_CHECK([test $hard4 -lt $duration4])
2290
2291 OVS_VSWITCHD_STOP
2292 AT_CLEANUP
2293
2294 AT_SETUP([ofproto-dpif - fin_timeout])
2295 OVS_VSWITCHD_START
2296 AT_DATA([flows.txt], [dnl
2297 in_port=1 actions=output:2
2298 in_port=2 actions=mod_vlan_vid:17,output:1
2299 ])
2300 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
2301 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2302 [NXST_FLOW reply:
2303  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2304 ])
2305
2306 ovs-appctl time/stop
2307 # Check that a TCP SYN packet does not change the timeout.  (Because
2308 # flow stats updates are mainly what implements the fin_timeout
2309 # feature, we warp forward a couple of times to ensure that flow stats
2310 # run before re-checking the flow table.)
2311 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307])
2312 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2313 warped
2314 ])
2315 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2316 [NXST_FLOW reply:
2317  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
2318 ])
2319 # Check that a TCP FIN packet does change the timeout.
2320 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588])
2321 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2322 warped
2323 ])
2324 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
2325 [NXST_FLOW reply:
2326  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
2327 ])
2328 OVS_VSWITCHD_STOP
2329 AT_CLEANUP
2330
2331 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
2332 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2333 ADD_OF_PORTS([br0], [1], [2])
2334 ADD_OF_PORTS([br1], [3])
2335
2336 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
2337 dummy@br0
2338 dummy@br1
2339 ])
2340 OVS_VSWITCHD_STOP
2341 AT_CLEANUP
2342
2343 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
2344 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
2345 ADD_OF_PORTS([br0], [1], [2])
2346 ADD_OF_PORTS([br1], [3])
2347
2348 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2349 dummy@ovs-dummy: hit:0 missed:0
2350         flows: cur: 0, avg: 0, max: 0
2351         br0: hit:0 missed:0
2352                 br0 65534/100: (dummy)
2353                 p1 1/1: (dummy)
2354                 p2 2/2: (dummy)
2355         br1: hit:0 missed:0
2356                 br1 65534/101: (dummy)
2357                 p3 3/3: (dummy)
2358 ])
2359 OVS_VSWITCHD_STOP
2360 AT_CLEANUP
2361
2362 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
2363 OVS_VSWITCHD_START([add-br br1 -- \
2364                     set bridge br1 datapath-type=dummy fail-mode=secure])
2365 ADD_OF_PORTS([br0], [1], [2])
2366 ADD_OF_PORTS([br1], [3])
2367
2368 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)'])
2369 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)'])
2370 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)'])
2371
2372 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2373 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))
2374 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))
2375 ])
2376
2377 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2378 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))
2379 ])
2380
2381 OVS_VSWITCHD_STOP
2382 AT_CLEANUP
2383
2384 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
2385 OVS_VSWITCHD_START([add-br br1 -- \
2386                     set bridge br1 datapath-type=dummy fail-mode=secure])
2387 ADD_OF_PORTS([br0], [1], [2])
2388 ADD_OF_PORTS([br1], [3])
2389
2390 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)'])
2391 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)'])
2392 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)'])
2393
2394 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2395 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))
2396 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))
2397 ])
2398
2399 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2400 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))
2401 ])
2402
2403 AT_CHECK([ovs-appctl dpif/del-flows br0])
2404 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
2405 ])
2406
2407 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
2408 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))
2409 ])
2410
2411 OVS_VSWITCHD_STOP
2412 AT_CLEANUP
2413
2414 AT_SETUP([ofproto-dpif - patch ports])
2415 OVS_VSWITCHD_START([add-br br1 \
2416 -- set bridge br1 datapath-type=dummy fail-mode=secure \
2417 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
2418 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
2419
2420 ADD_OF_PORTS([br0], [2])
2421 ADD_OF_PORTS([br1], [3])
2422
2423 AT_CHECK([ovs-appctl time/stop])
2424
2425 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2426 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
2427
2428 for i in $(seq 1 10); do
2429     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)'
2430 done
2431
2432 for i in $(seq 1 5); do
2433     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)'
2434 done
2435
2436 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
2437 warped
2438 ])
2439
2440 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
2441 dummy@ovs-dummy: hit:13 missed:2
2442         flows: cur: 2, avg: 1, max: 2
2443         br0: hit:9 missed:1
2444                 br0 65534/100: (dummy)
2445                 p2 2/2: (dummy)
2446                 pbr0 1/none: (patch: peer=pbr1)
2447         br1: hit:4 missed:1
2448                 br1 65534/101: (dummy)
2449                 p3 3/3: (dummy)
2450                 pbr1 1/none: (patch: peer=pbr0)
2451 ])
2452
2453 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2454 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
2455 ]),
2456 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
2457 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
2458 ])
2459
2460 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
2461 OFPST_PORT reply (xid=0x4): 1 ports
2462   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
2463            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
2464 ])
2465
2466 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
2467 OFPST_PORT reply (xid=0x4): 1 ports
2468   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
2469            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
2470 ])
2471
2472 OVS_VSWITCHD_STOP
2473 AT_CLEANUP
2474
2475 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
2476 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
2477 ADD_OF_PORTS([br0], 1, 2)
2478
2479 AT_CHECK([ovs-appctl time/stop])
2480 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
2481
2482 for i in $(seq 1 61); do
2483     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)'
2484     ovs-appctl time/warp 10000
2485     ovs-appctl time/warp 50000
2486 done
2487
2488 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
2489 ])
2490
2491 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
2492 dummy@ovs-dummy: hit:0 missed:61
2493         flows: cur: 0, avg: 0, max: 1
2494         br0: hit:0 missed:61
2495                 br0 65534/100: (dummy)
2496                 p1 1/1: (dummy)
2497                 p2 2/2: (dummy)
2498 ])
2499
2500 OVS_VSWITCHD_STOP
2501 AT_CLEANUP
2502
2503 AT_SETUP([ofproto-dpif - port duration])
2504 OVS_VSWITCHD_START([set Bridge br0 protocols=OpenFlow13])
2505 ADD_OF_PORTS([br0], 1, 2)
2506
2507 ovs-appctl time/stop
2508 ovs-appctl time/warp 10000
2509
2510 AT_CHECK([ovs-ofctl -O openflow13 dump-ports br0], [0], [stdout])
2511 AT_CHECK([sed 's/=[[0-9]][[0-9]]\(\.[[0-9]][[0-9]]*\)\{0,1\}s/=?s/' stdout], [0],
2512 [dnl
2513 OFPST_PORT reply (OF1.3) (xid=0x2): 3 ports
2514   port  1: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2515            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2516            duration=?s
2517   port  2: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2518            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2519            duration=?s
2520   port LOCAL: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
2521            tx pkts=0, bytes=0, drop=0, errs=0, coll=0
2522            duration=?s
2523 ])
2524 OVS_VSWITCHD_STOP
2525 AT_CLEANUP
2526
2527 dnl ----------------------------------------------------------------------
2528 AT_BANNER([ofproto-dpif -- megaflows])
2529
2530 # Strips out uninteresting parts of megaflow output, as well as parts
2531 # that vary from one run to another (e.g., timing and bond actions).
2532 m4_define([STRIP_USED], [[sed '
2533     s/used:[0-9]*\.[0-9]*/used:0.0/
2534 ' | sort]])
2535 m4_define([STRIP_XOUT], [[sed '
2536     s/used:[0-9]*\.[0-9]*/used:0.0/
2537     s/actions:.*/actions: <del>/
2538     s/packets:[0-9]*/packets:0/
2539     s/bytes:[0-9]*/bytes:0/
2540 ' | sort]])
2541
2542 AT_SETUP([ofproto-dpif megaflow - port classification])
2543 OVS_VSWITCHD_START
2544 ADD_OF_PORTS([br0], [1], [2])
2545 AT_DATA([flows.txt], [dnl
2546 table=0 in_port=1 actions=output(2)
2547 ])
2548 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2549 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)'])
2550 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)'])
2551 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2552 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2553 ])
2554 OVS_VSWITCHD_STOP
2555 AT_CLEANUP
2556
2557 AT_SETUP([ofproto-dpif megaflow - L2 classification])
2558 OVS_VSWITCHD_START
2559 ADD_OF_PORTS([br0], [1], [2])
2560 AT_DATA([flows.txt], [dnl
2561 table=0 in_port=1,dl_src=50:54:00:00:00:09 actions=output(2)
2562 ])
2563 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2564 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)'])
2565 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)'])
2566 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2567 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2568 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2569 ])
2570 OVS_VSWITCHD_STOP
2571 AT_CLEANUP
2572
2573 AT_SETUP([ofproto-dpif megaflow - L3 classification])
2574 OVS_VSWITCHD_START
2575 ADD_OF_PORTS([br0], [1], [2])
2576 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
2577 AT_DATA([flows.txt], [dnl
2578 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=output(2)
2579 ])
2580 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2581 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)'])
2582 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)'])
2583 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2584 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.252,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2585 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2586 ])
2587 OVS_VSWITCHD_STOP
2588 AT_CLEANUP
2589
2590 AT_SETUP([ofproto-dpif megaflow - IPv6 classification])
2591 OVS_VSWITCHD_START
2592 ADD_OF_PORTS([br0], [1], [2])
2593 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=ipv6_dst,ipv6_src], [0], [ignore], [])
2594 AT_DATA([flows.txt], [dnl
2595 table=0 in_port=1,ipv6,ipv6_src=2001:db8:3c4d:1:2:3:4:5 actions=output(2)
2596 ])
2597 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2598 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:1:2:3:4:5,dst=fe80::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)'])
2599 AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:5:4:3:2:1,dst=2001:db8:3c4d:1:2:3:4:1,label=0,proto=99,tclass=0x70,hlimit=64,frag=no)'])
2600 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2601 skb_priority(0),in_port(1),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:1:2:3:4:5/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff,dst=fe80::2/::,label=0/0,proto=10/0,tclass=0x70/0,hlimit=128/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2602 skb_priority(0),in_port(1),eth_type(0x86dd),ipv6(src=2001:db8:3c4d:5:4:3:2:1/ffff:ffff:ffff:fffc::,dst=2001:db8:3c4d:1:2:3:4:1/::,label=0/0,proto=99/0,tclass=0x70/0,hlimit=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2603 ])
2604 OVS_VSWITCHD_STOP
2605 AT_CLEANUP
2606
2607 AT_SETUP([ofproto-dpif megaflow - L4 classification])
2608 OVS_VSWITCHD_START
2609 ADD_OF_PORTS([br0], [1], [2])
2610 AT_DATA([flows.txt], [dnl
2611 table=0 in_port=1,icmp,icmp_type=8 actions=output(2)
2612 ])
2613 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2614 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)'])
2615 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)'])
2616 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2617 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8/0xff,code=0/0), packets:0, bytes:0, used:0.0s, actions: <del>
2618 ])
2619 OVS_VSWITCHD_STOP
2620 AT_CLEANUP
2621
2622 AT_SETUP([ofproto-dpif megaflow - normal])
2623 OVS_VSWITCHD_START
2624 ADD_OF_PORTS([br0], [1], [2])
2625 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2626 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)'])
2627 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)'])
2628 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2629 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2630 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2631 ])
2632 OVS_VSWITCHD_STOP
2633 AT_CLEANUP
2634
2635 AT_SETUP([ofproto-dpif megaflow - mpls])
2636 OVS_VSWITCHD_START
2637 ADD_OF_PORTS([br0], [1], [2])
2638 AT_DATA([flows.txt], [dnl
2639 table=0 dl_src=50:54:00:00:00:09 actions=push_mpls:0x8847,2
2640 table=0 dl_src=50:54:00:00:00:0b actions=pop_mpls:0x0800,2
2641 ])
2642 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2643 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)'])
2644 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)'])
2645 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2646 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1), packets:0, bytes:0, used:0.0s, actions: <del>
2647 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x8847),mpls(label=11,tc=3,ttl=64,bos=1), packets:0, bytes:0, used:0.0s, actions: <del>
2648 ])
2649 OVS_VSWITCHD_STOP
2650 AT_CLEANUP
2651
2652 AT_SETUP([ofproto-dpif megaflow - netflow])
2653 OVS_VSWITCHD_START
2654 ADD_OF_PORTS([br0], [1], [2])
2655
2656 dnl NetFlow configuration disables wildcarding relevant fields
2657 ON_EXIT([kill `cat test-netflow.pid`])
2658 AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 > netflow.log], [0], [], [ignore])
2659 AT_CAPTURE_FILE([netflow.log])
2660 NETFLOW_PORT=`parse_listening_port < test-netflow.log`
2661 ovs-vsctl \
2662    set Bridge br0 netflow=@nf -- \
2663    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
2664      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
2665
2666 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2667 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)'])
2668 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)'])
2669 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2670 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/255.255.255.255,proto=1/0xff,tos=0/0xfc,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions: <del>
2671 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/255.255.255.255,proto=1/0xff,tos=0/0xfc,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions: <del>
2672 ])
2673 OVS_VSWITCHD_STOP
2674 AT_CLEANUP
2675
2676 AT_SETUP([ofproto-dpif megaflow - normal, active-backup bonding])
2677 OVS_VSWITCHD_START(
2678   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2679    add-bond br0 bond0 p2 p3 bond_mode=active-backup -- \
2680    set interface p2 type=dummy ofport_request=2 -- \
2681    set interface p3 type=dummy ofport_request=3])
2682 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2683 ])
2684
2685 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2686 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)'])
2687 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)'])
2688 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2689 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2690 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2691 ])
2692 OVS_VSWITCHD_STOP
2693 AT_CLEANUP
2694
2695 AT_SETUP([ofproto-dpif megaflow - normal, balance-slb bonding])
2696 OVS_VSWITCHD_START(
2697   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
2698    add-bond br0 bond0 p2 p3 bond_mode=balance-slb -- \
2699    set interface p2 type=dummy ofport_request=2 -- \
2700    set interface p3 type=dummy ofport_request=3])
2701 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2702 ])
2703
2704 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2705 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)'])
2706 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)'])
2707 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2708 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2709 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2710 ])
2711 OVS_VSWITCHD_STOP
2712 AT_CLEANUP
2713
2714 AT_SETUP([ofproto-dpif megaflow - normal, balance-tcp bonding])
2715 # Create bond0 on br0 with interfaces p0 and p1
2716 #    and bond1 on br1 with interfaces p2 and p3
2717 # with p0 patched to p2 and p1 patched to p3.
2718 OVS_VSWITCHD_START(
2719   [add-bond br0 bond0 p0 p1 bond_mode=balance-tcp lacp=active \
2720                             other-config:lacp-time=fast \
2721                             other-config:bond-rebalance-interval=0 -- \
2722    set interface p0 type=patch options:peer=p2 ofport_request=1 -- \
2723    set interface p1 type=patch options:peer=p3 ofport_request=2 -- \
2724    add-br br1 -- \
2725    set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- \
2726    set bridge br1 datapath-type=dummy other-config:datapath-id=1234 \
2727                   fail-mode=secure -- \
2728    add-bond br1 bond1 p2 p3 bond_mode=balance-tcp lacp=active \
2729                             other-config:lacp-time=fast \
2730                             other-config:bond-rebalance-interval=0 -- \
2731    set interface p2 type=patch options:peer=p0 ofport_request=3 -- \
2732    set interface p3 type=patch options:peer=p1 ofport_request=4 --])
2733
2734 AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
2735 ])
2736 ADD_OF_PORTS([br0], [7])
2737 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
2738 AT_CHECK([ovs-ofctl add-flow br1 action=normal])
2739 ovs-appctl time/stop
2740 ovs-appctl time/warp 5000
2741 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)'])
2742 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)'])
2743
2744 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2745 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions: <del>
2746 skb_priority(0),in_port(7),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/255.255.255.255,proto=1/0xff,tos=0/0,ttl=64/0,frag=no/0xff),icmp(type=8,code=0), packets:0, bytes:0, used:0.0s, actions: <del>
2747 ])
2748 OVS_VSWITCHD_STOP
2749 AT_CLEANUP
2750
2751 AT_SETUP([ofproto-dpif megaflow - resubmit port action])
2752 OVS_VSWITCHD_START
2753 ADD_OF_PORTS([br0], [1], [2])
2754 AT_DATA([flows.txt], [dnl
2755 table=0 in_port=1,ip actions=resubmit(90)
2756 table=0 in_port=90,dl_src=50:54:00:00:00:09 actions=output(2)
2757 ])
2758 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2759 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)'])
2760 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)'])
2761 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2762 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2763 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2764 ])
2765 OVS_VSWITCHD_STOP
2766 AT_CLEANUP
2767
2768 AT_SETUP([ofproto-dpif megaflow - resubmit table action])
2769 OVS_VSWITCHD_START
2770 ADD_OF_PORTS([br0], [1], [2])
2771 AT_DATA([flows.txt], [dnl
2772 table=0 in_port=1,ip actions=resubmit(,1)
2773 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2774 ])
2775 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2776 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)'])
2777 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=
2778 1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
2779 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2780 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2781 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2782 ])
2783 OVS_VSWITCHD_STOP
2784 AT_CLEANUP
2785
2786 AT_SETUP([ofproto-dpif megaflow - goto_table action])
2787 OVS_VSWITCHD_START
2788 ADD_OF_PORTS([br0], [1], [2])
2789 AT_DATA([flows.txt], [dnl
2790 table=0 in_port=1,ip actions=goto_table(1)
2791 table=1 dl_src=50:54:00:00:00:09 actions=output(2)
2792 ])
2793 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt])
2794 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)'])
2795 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)'])
2796 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2797 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2798 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2799 ])
2800 OVS_VSWITCHD_STOP
2801 AT_CLEANUP
2802
2803 AT_SETUP([ofproto-dpif megaflow - mirroring, select_all])
2804 OVS_VSWITCHD_START
2805 ADD_OF_PORTS([br0], [1], [2], [3])
2806 ovs-vsctl \
2807         set Bridge br0 mirrors=@m --\
2808         --id=@p3 get Port p3 --\
2809         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
2810
2811 AT_DATA([flows.txt], [dnl
2812 in_port=1 actions=output:2
2813 ])
2814 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2815 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)'])
2816 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)'])
2817 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2818 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2819 ])
2820 OVS_VSWITCHD_STOP
2821 AT_CLEANUP
2822
2823 AT_SETUP([ofproto-dpif megaflow - mirroring, select_vlan])
2824 OVS_VSWITCHD_START
2825 ADD_OF_PORTS([br0], [1], [2], [3])
2826 ovs-vsctl \
2827         set Bridge br0 mirrors=@m --\
2828         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
2829         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
2830
2831 AT_DATA([flows.txt], [dnl
2832 in_port=1 actions=output:2
2833 ])
2834 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2835 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))'])
2836 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)'])
2837 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2838 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2839 skb_priority(0),in_port(1),eth_type(0x8100),vlan(vid=11/0xfff,pcp=7/0x0,cfi=1/1),encap(eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff)), packets:0, bytes:0, used:0.0s, actions: <del>
2840 ])
2841 OVS_VSWITCHD_STOP
2842 AT_CLEANUP
2843
2844 AT_SETUP([ofproto-dpif megaflow - move action])
2845 OVS_VSWITCHD_START
2846 ADD_OF_PORTS([br0], [1], [2])
2847 AT_DATA([flows.txt], [dnl
2848 table=0 in_port=1 ip,actions=move:NXM_OF_IP_SRC[[]]->NXM_NX_REG0[[]],resubmit(90)
2849 table=0 in_port=90 ip,actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]],resubmit(91)
2850 table=0 in_port=91 reg0=0x0a000002,actions=output(2)
2851 ])
2852 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2853 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)'])
2854 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)'])
2855 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2856 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2857 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2858 ])
2859 OVS_VSWITCHD_STOP
2860 AT_CLEANUP
2861
2862 AT_SETUP([ofproto-dpif megaflow - push action])
2863 OVS_VSWITCHD_START
2864 ADD_OF_PORTS([br0], [1], [2])
2865 AT_DATA([flows.txt], [dnl
2866 table=0 in_port=1 ip,actions=push:NXM_OF_IP_SRC[[]],output(2)
2867 ])
2868 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2869 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)'])
2870 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)'])
2871 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2872 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.255,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2873 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4/255.255.255.255,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2874 ])
2875 OVS_VSWITCHD_STOP
2876 AT_CLEANUP
2877
2878 AT_SETUP([ofproto-dpif megaflow - learning])
2879 OVS_VSWITCHD_START
2880 ADD_OF_PORTS([br0], [1], [2])
2881 AT_DATA([flows.txt], [dnl
2882 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
2883 ])
2884 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2885 ovs-appctl time/stop
2886 # We send each packet twice because the first packet in each flow causes the
2887 # flow table to change and thus revalidations, which (depending on timing)
2888 # can keep a megaflow from being installed.  The revalidations are done by
2889 # the second iteration, allowing the flows to be installed.
2890 for i in 1 2; do
2891     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)'])
2892     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)'])
2893     ovs-appctl time/warp 100
2894 done
2895 dnl The original flow is missing due to a revalidation.
2896 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2897 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0a/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2898 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b/ff:ff:ff:ff:ff:ff,dst=50:54:00:00:00:0c/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2899 ])
2900 OVS_VSWITCHD_STOP
2901 AT_CLEANUP
2902
2903 AT_SETUP([ofproto-dpif megaflow - tunnels])
2904 OVS_VSWITCHD_START(
2905   [add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1])
2906 AT_CHECK([ovs-vsctl add-port br0 p2 -- set Interface p2 type=gre \
2907      options:remote_ip=1.1.1.1 ofport_request=2 options:key=flow])
2908 AT_CHECK([ovs-vsctl add-port br0 p3 -- set Interface p3 type=dummy \
2909           ofport_request=3])
2910 AT_CHECK([ovs-vsctl add-port br0 p4 -- set Interface p4 type=gre \
2911      options:remote_ip=1.1.1.2 options:tos=inherit options:ttl=inherit \
2912      ofport_request=4 options:key=flow])
2913 AT_DATA([flows.txt], [dnl
2914 in_port=1,actions=output(2)
2915 in_port=3,actions=output(4)
2916 ])
2917 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2918 dnl ECN bits are always copied out, but don't use 0x3 (CE), since that
2919 dnl will cause the packet to be dropped.
2920 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)'])
2921 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)'])
2922 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)'])
2923 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)'])
2924 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2925 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0xfd/0x3,ttl=128/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2926 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0xfd/0xff,ttl=128/0xff,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2927 skb_priority(0),in_port(3),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0x1/0xff,ttl=64/0xff,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2928 ])
2929 OVS_VSWITCHD_STOP
2930 AT_CLEANUP
2931
2932 AT_SETUP([ofproto-dpif megaflow - dec_ttl])
2933 OVS_VSWITCHD_START
2934 ADD_OF_PORTS([br0], [1], [2])
2935 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0 prefixes=nw_dst,nw_src], [0], [ignore], [])
2936 AT_DATA([flows.txt], [dnl
2937 table=0 in_port=1,icmp,nw_src=10.0.0.4 actions=dec_ttl,output(2)
2938 ])
2939 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2940 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)'])
2941 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)'])
2942 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_XOUT], [0], [dnl
2943 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.2/255.255.255.252,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions: <del>
2944 skb_priority(0),in_port(1),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no), packets:0, bytes:0, used:0.0s, actions: <del>
2945 ])
2946 OVS_VSWITCHD_STOP
2947 AT_CLEANUP
2948
2949 AT_SETUP([ofproto-dpif megaflow - set dl_dst])
2950 OVS_VSWITCHD_START
2951 ADD_OF_PORTS([br0], [1], [2])
2952 AT_DATA([flows.txt], [dnl
2953 table=0 in_port=1 actions=mod_dl_dst(50:54:00:00:00:0a),output(2)
2954 ])
2955 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2956 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)'])
2957 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)'])
2958 dnl The megaflows do not match the same fields, since the first packet
2959 dnl is essentially a no-op.  (The new destination MAC is the same as the
2960 dnl original.) The ofproto-dpif library un-wildcards the destination MAC
2961 dnl so that a packet that doesn't need its MAC address changed doesn't
2962 dnl hide one that does.  Since the first entry doesn't need to change,
2963 dnl only the destination MAC address is matched (as decided by
2964 dnl ofproto-dpif).  The second entry actually updates the destination
2965 dnl MAC, so both the source and destination MAC addresses are
2966 dnl un-wildcarded, since the ODP commit functions update both the source
2967 dnl and destination MAC addresses.
2968 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2969 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:09/00:00:00:00:00:00,dst=50:54:00:00:00:0a/ff:ff:ff:ff:ff:ff),eth_type(0x0800),ipv4(src=10.0.0.2/0.0.0.0,dst=10.0.0.1/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:2
2970 skb_priority(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4/0.0.0.0,dst=10.0.0.3/0.0.0.0,proto=1/0,tos=0/0,ttl=64/0,frag=no/0xff), packets:0, bytes:0, used:0.0s, actions:set(eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0a)),2
2971 ])
2972 OVS_VSWITCHD_STOP
2973 AT_CLEANUP
2974
2975 AT_SETUP([ofproto-dpif megaflow - disabled])
2976 OVS_VSWITCHD_START
2977 ADD_OF_PORTS([br0], [1], [2])
2978 AT_DATA([flows.txt], [dnl
2979 table=0 in_port=1,ip,nw_dst=10.0.0.1 actions=output(2)
2980 table=0 in_port=1,ip,nw_dst=10.0.0.3 actions=drop
2981 ])
2982 AT_CHECK([ovs-appctl dpif/disable-megaflows], [0], [megaflows disabled
2983 ], [])
2984 AT_CHECK([ovs-appctl vlog/set dpif_netdev:dbg], [0], [], [])
2985 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2986 for i in 1 2 3 4; do
2987     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)'])
2988     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)'])
2989 done
2990 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
2991 skb_priority(0),skb_mark(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:2
2992 skb_priority(0),skb_mark(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:drop
2993 ])
2994 OVS_VSWITCHD_STOP
2995 AT_CLEANUP
2996
2997 AT_SETUP([ofproto-dpif - datapath port number change])
2998 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
2999 ADD_OF_PORTS([br0], 1)
3000
3001 # Trace a flow that should output to p1.
3002 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3003   [0], [stdout])
3004 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 1
3005 ])
3006
3007 # Change p1's port number to 5.
3008 AT_CHECK([ovs-appctl dpif-dummy/change-port-number ovs-dummy p1 5])
3009
3010 # Trace a flow that should output to p1 in its new location.
3011 AT_CHECK([ovs-appctl ofproto/trace br0 in_port=LOCAL,dl_src=10:20:30:40:50:60],
3012   [0], [stdout])
3013 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 5
3014 ])
3015 OVS_VSWITCHD_STOP
3016 AT_CLEANUP
3017
3018 # Tests the bundling with various bfd and cfm configurations.
3019 AT_SETUP([ofproto - bundle with variable bfd/cfm config])
3020 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy -- \
3021                     add-bond br0 br0bond p0 p2 bond-mode=active-backup -- \
3022                     add-bond br1 br1bond p1 p3 bond-mode=active-backup -- \
3023                     set Interface p1 type=patch options:peer=p0 ofport_request=2 -- \
3024                     set Interface p3 type=patch options:peer=p2 ofport_request=4 -- \
3025                     set Interface p0 type=patch options:peer=p1 ofport_request=1 -- \
3026                     set Interface p2 type=patch options:peer=p3 ofport_request=3 -- \
3027                     set Interface p0 bfd:enable=true bfd:min_tx=300 bfd:min_rx=300 -- \
3028                     set Interface p0 cfm_mpid=1 -- \
3029                     set Interface p1 bfd:enable=true bfd:min_tx=500 bfd:min_rx=500])
3030
3031 ovs-appctl time/stop
3032 # advance the clock to stablize everything.
3033 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3034 # cfm/show should show 'recv' fault.
3035 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3036         fault: recv
3037 ])
3038 # bfd/show should show 'up'.
3039 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3040         Local Session State: up
3041         Remote Session State: up
3042         Local Session State: up
3043         Remote Session State: up
3044 ])
3045 # bond/show should show 'may-enable: true' for all slaves.
3046 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3047         may_enable: true
3048         may_enable: true
3049         may_enable: true
3050         may_enable: true
3051 ])
3052
3053 # now disable the bfd on p1.
3054 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=false])
3055 # advance the clock to stablize everything.
3056 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3057 # cfm/show should show 'recv' fault.
3058 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3059         fault: recv
3060 ])
3061 # bfd/show should show 'down'.
3062 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3063         Local Session State: down
3064         Remote Session State: down
3065 ])
3066 # bond/show should show 'may-enable: false' for p0.
3067 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3068         may_enable: false
3069         may_enable: true
3070         may_enable: true
3071         may_enable: true
3072 ])
3073
3074 # now enable the bfd on p1 and disable bfd on p0.
3075 AT_CHECK([ovs-vsctl set Interface p1 bfd:enable=true])
3076 AT_CHECK([ovs-vsctl set Interface p0 bfd:enable=false])
3077 # advance the clock to stablize everything.
3078 for i in `seq 0 49`; do ovs-appctl time/warp 100; done
3079 # cfm/show should show 'recv' fault.
3080 AT_CHECK([ovs-appctl cfm/show | sed -n '/^.*fault:.*/p'], [0], [dnl
3081         fault: recv
3082 ])
3083 # bfd/show should show 'down'.
3084 AT_CHECK([ovs-appctl bfd/show | sed -n '/^.*Session State:.*/p'], [0], [dnl
3085         Local Session State: down
3086         Remote Session State: down
3087 ])
3088 # bond/show should show 'may-enable: false' for p0 and p1.
3089 AT_CHECK([ovs-appctl bond/show | sed -n '/^.*may_enable:.*/p'], [0], [dnl
3090         may_enable: false
3091         may_enable: true
3092         may_enable: false
3093         may_enable: true
3094 ])
3095
3096 OVS_VSWITCHD_STOP
3097 AT_CLEANUP
3098
3099 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 1])
3100 OVS_VSWITCHD_START([add-port br0 p0 -- set interface p0 type=gre options:remote_ip=1.2.3.4])
3101
3102 # enable bfd on p0.
3103 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3104 # check log.
3105 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3106 monitor thread created
3107 ])
3108 # disable bfd on p0.
3109 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3110 # check log.
3111 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3112 monitor thread terminated
3113 ])
3114 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3115
3116 # enable cfm on p0.
3117 AT_CHECK([ovs-vsctl set interface p0 cfm_mpid=10])
3118 # check log.
3119 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3120 monitor thread created
3121 ])
3122 # disable cfm on p0.
3123 AT_CHECK([ovs-vsctl remove interface p0 cfm_mpid 10])
3124 # check log.
3125 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3126 monitor thread terminated
3127 ])
3128 AT_CHECK([cat ovs-vswitchd.log | sed -e '/^.*ofproto_dpif_monitor.*$/d' > ovs-vswitchd.log])
3129
3130 # enable both bfd and cfm on p0.
3131 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true cfm_mpid=10])
3132 # check log.
3133 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3134 monitor thread created
3135 ])
3136 # disable bfd on p0.
3137 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false])
3138 # check log, there should not be the log of thread terminated.
3139 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3140 ])
3141 # reenable bfd on p0.
3142 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=true])
3143 # check log, should still be on log of thread created.
3144 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* created\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3145 monitor thread created
3146 ])
3147 # disable bfd and cfm together.
3148 AT_CHECK([ovs-vsctl set interface p0 bfd:enable=false -- remove interface p0 cfm_mpid 10])
3149 # check log.
3150 AT_CHECK([sed -n "s/^.*|ofproto_dpif_monitor(monitor)|INFO|\(.* terminated\)$/\1/p" ovs-vswitchd.log], [0], [dnl
3151 monitor thread terminated
3152 ])
3153
3154 OVS_VSWITCHD_STOP
3155 AT_CLEANUP
3156
3157 # this test helps avoid the deadlock between the main thread and monitor thread.
3158 AT_SETUP([ofproto-dpif - ofproto-dpif-monitor 2])
3159 OVS_VSWITCHD_START
3160
3161 for i in `seq 1 199`
3162 do
3163     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])
3164 done
3165
3166 OVS_VSWITCHD_STOP
3167 AT_CLEANUP
3168 \f
3169 AT_BANNER([ofproto-dpif - flow translation resource limits])
3170
3171 AT_SETUP([ofproto-dpif - infinite resubmit])
3172 OVS_VSWITCHD_START
3173 AT_CHECK([ovs-ofctl add-flow br0 actions=resubmit:1,resubmit:2,output:3])
3174 AT_CHECK([ovs-appctl ofproto/trace br0 'eth_dst=ff:ff:ff:ff:ff:ff'],
3175   [0], [stdout])
3176 AT_CHECK([tail -1 stdout], [0], [Datapath actions: drop
3177 ])
3178 AT_CHECK([grep -c 'resubmit actions recursed over 64 times' ovs-vswitchd.log],
3179   [0], [1
3180 ])
3181 OVS_VSWITCHD_STOP(["/resubmit actions recursed/d"])
3182 AT_CLEANUP
3183
3184 AT_SETUP([ofproto-dpif - exponential resubmit chain])
3185 OVS_VSWITCHD_START
3186 ADD_OF_PORTS([br0], 1)
3187 (for i in `seq 1 64`; do
3188      j=`expr $i + 1`
3189      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3190  done
3191  echo "in_port=65, actions=local") > flows
3192  AT_CHECK([ovs-ofctl add-flows br0 flows])
3193 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3194 AT_CHECK([grep -c 'over 4096 resubmit actions' ovs-vswitchd.log], [0], [1
3195 ])
3196 OVS_VSWITCHD_STOP(["/over.*resubmit actions/d"])
3197 AT_CLEANUP
3198
3199 AT_SETUP([ofproto-dpif - too many output actions])
3200 OVS_VSWITCHD_START
3201 ADD_OF_PORTS([br0], 1)
3202 (for i in `seq 1 12`; do
3203      j=`expr $i + 1`
3204      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3205  done
3206  echo "in_port=13, actions=local,local,local,local,local,local,local,local") > flows
3207 AT_CHECK([ovs-ofctl add-flows br0 flows])
3208 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3209 AT_CHECK([grep -c -e '- Uses action(s) not supported by datapath' stdout],
3210   [0], [1
3211 ])
3212 AT_CHECK([grep -c 'resubmits yielded over 64 kB of actions' ovs-vswitchd.log], [0], [1
3213 ])
3214 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of actions/d"])
3215 AT_CLEANUP
3216
3217 AT_SETUP([ofproto-dpif - stack too deep])
3218 OVS_VSWITCHD_START
3219 ADD_OF_PORTS([br0], 1)
3220 (for i in `seq 1 12`; do
3221      j=`expr $i + 1`
3222      echo "in_port=$i, actions=resubmit:$j, resubmit:$j, local"
3223  done
3224  push="push:NXM_NX_REG0[[]]"
3225  echo "in_port=13, actions=$push,$push,$push,$push,$push,$push,$push,$push") > flows
3226  AT_CHECK([ovs-ofctl add-flows br0 flows])
3227 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1'], [0], [stdout])
3228 AT_CHECK([grep -c 'resubmits yielded over 64 kB of stack' ovs-vswitchd.log], [0], [1
3229 ])
3230 OVS_VSWITCHD_STOP(["/resubmits yielded over 64 kB of stack/d"])
3231 AT_CLEANUP