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