ofproto-dpif: Do not dpif_port_del() patch ports in port_del().
[cascardo/ovs.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 - registers])
24 OVS_VSWITCHD_START
25 ADD_OF_PORTS([br0], [20], [21], [22], [33], [90])
26 AT_DATA([flows.txt], [dnl
27 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
28 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
29 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11,resubmit:93
30 in_port=93                 actions=resubmit:12,resubmit:13,resubmit:14,resubmit:15
31
32 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
33 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
34 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
35 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
36 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
37 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
38 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
39 in_port=9,reg0=0xdeadbeef  actions=output:20
40 in_port=10,reg1=0xdeadbeef actions=output:21
41 in_port=11,reg2=0xeef22dea actions=output:22
42
43 dnl Sanilty check all registers
44 in_port=12 actions=load:0x10->NXM_NX_REG0[[]],load:0x11->NXM_NX_REG1[[]],load:0x12->NXM_NX_REG2[[]]
45 in_port=13 actions=load:0x13->NXM_NX_REG3[[]],load:0x14->NXM_NX_REG4[[]],load:0x15->NXM_NX_REG5[[]]
46 in_port=14 actions=load:0x16->NXM_NX_REG6[[]],load:0x17->NXM_NX_REG7[[]]
47 in_port=15,reg0=0x10,reg1=0x11,reg2=0x12,reg3=0x13,reg4=0x14,reg5=0x15,reg6=0x16,reg7=0x17 actions=output:33
48 ])
49 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
50 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
51 AT_CHECK([tail -1 stdout], [0],
52   [Datapath actions: 20,21,22,33
53 ])
54 OVS_VSWITCHD_STOP
55 AT_CLEANUP
56
57 AT_SETUP([ofproto-dpif - output])
58 OVS_VSWITCHD_START
59 ADD_OF_PORTS([br0], [1], [9], [10], [11], [55], [66], [77], [88])
60 AT_DATA([flows.txt], [dnl
61 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
62 in_port=2 actions=output:9
63 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
64 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
65 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
66 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
67 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
68 ])
69 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
70 AT_CHECK([ovs-appctl ofproto/trace 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=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
71 AT_CHECK([tail -1 stdout], [0],
72   [Datapath actions: 9,55,10,55,66,11,77,88
73 ])
74 OVS_VSWITCHD_STOP
75 AT_CLEANUP
76
77 AT_SETUP([ofproto-dpif - dec_ttl])
78 OVS_VSWITCHD_START
79 ADD_OF_PORTS([br0], [1], [2], [3], [4])
80 AT_DATA([flows.txt], [dnl
81 table=0 in_port=1 action=dec_ttl,output:2,resubmit(1,1),output:4
82 table=1 in_port=1 action=dec_ttl,output:3
83 ])
84 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
85 AT_CHECK([ovs-appctl ofproto/trace 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=2,frag=no)' -generate], [0], [stdout])
86 AT_CHECK([tail -3 stdout], [0],
87   [Datapath actions: set(ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=1,frag=no)),2,4
88 This flow is handled by the userspace slow path because it:
89         - Sends "packet-in" messages to the OpenFlow controller.
90 ])
91 AT_CHECK([ovs-appctl ofproto/trace 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=3,frag=no)'], [0], [stdout])
92 AT_CHECK([tail -1 stdout], [0],
93   [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
94 ])
95 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
96 AT_CHECK([tail -1 stdout], [0],
97   [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
98 ])
99
100 AT_CAPTURE_FILE([ofctl_monitor.log])
101 AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
102 AT_CHECK([ovs-appctl ofproto/trace 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=2,frag=no)' -generate], [0], [stdout])
103 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
104 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
105 NXT_PACKET_IN (xid=0x0): table_id=1 total_len=42 in_port=1 (via invalid_ttl) data_len=42 (unbuffered)
106 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
107 ])
108 OVS_VSWITCHD_STOP
109 AT_CLEANUP
110
111
112 AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port])
113 OVS_VSWITCHD_START
114 ADD_OF_PORTS([br0], [1], [2])
115
116 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
117
118 # "in_port" defaults to OFPP_NONE if it's not specified.
119 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"
120 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
121 AT_CHECK([tail -1 stdout | sed 's/Datapath actions: //' | tr "," "\n" | sort -n], [0], [dnl
122 1
123 2
124 100
125 ])
126
127 OVS_VSWITCHD_STOP
128 AT_CLEANUP
129
130 AT_SETUP([ofproto-dpif - DSCP])
131 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
132 ADD_OF_PORTS([br0], [9])
133 AT_DATA([flows.txt], [dnl
134 actions=output:65534,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:65534
135 ])
136 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
137 AT_CHECK([ovs-vsctl -- \
138         set Port p1 qos=@newqos --\
139         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
140         --id=@q1 create Queue dscp=1 --\
141         --id=@q2 create Queue dscp=2], [0], [ignore])
142 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
143 AT_CHECK([tail -1 stdout], [0],
144   [Datapath actions: dnl
145 100,dnl
146 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
147 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
148 1,dnl
149 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
150 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
151 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
152 100
153 ])
154 OVS_VSWITCHD_STOP
155 AT_CLEANUP
156
157 AT_SETUP([ofproto-dpif - output/flood flags])
158 OVS_VSWITCHD_START
159 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [7])
160
161 AT_DATA([flows.txt], [dnl
162 in_port=local actions=local,flood
163 in_port=1 actions=flood
164 in_port=2 actions=all
165 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
166 in_port=4 actions=enqueue:65534:1,enqueue:1:1,enqueue:2:1,enqueue:3:2,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1
167 ])
168 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
169 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
170 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
171
172 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(100),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
173 AT_CHECK([tail -1 stdout \
174 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
175 1
176 2
177 3
178 4
179 7
180 ])
181
182 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
183 AT_CHECK([tail -1 stdout \
184 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
185 100
186 2
187 3
188 4
189 7
190 ])
191
192 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
193 AT_CHECK([tail -1 stdout \
194 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
195 1
196 100
197 3
198 4
199 6
200 7
201 ])
202
203 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
204 AT_CHECK([tail -1 stdout], [0],
205   [Datapath actions: 100,1,2,4,6,7
206 ])
207
208 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
209 AT_CHECK([tail -1 stdout], [0],
210   [Datapath actions: set(skb_priority(0x1)),100,1,2,set(skb_priority(0x2)),3,set(skb_priority(0x1)),6,7
211 ])
212 OVS_VSWITCHD_STOP
213 AT_CLEANUP
214
215 AT_SETUP([ofproto-dpif - controller])
216 OVS_VSWITCHD_START([dnl
217    add-port br0 p1 -- set Interface p1 type=dummy
218 ])
219
220 AT_CAPTURE_FILE([ofctl_monitor.log])
221 AT_DATA([flows.txt], [dnl
222 cookie=0x0 dl_src=10:11:11:11:11:11 actions=controller
223 cookie=0x1 dl_src=20:22:22:22:22:22 actions=controller,resubmit(80,1)
224 cookie=0x2 dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,controller
225
226 cookie=0x3 table=1 in_port=80 actions=load:1->NXM_NX_REG0[[]],mod_vlan_vid:80,controller,resubmit(81,2)
227 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)
228 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)
229 cookie=0x6 table=4 in_port=83 actions=load:4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,controller,resubmit(84,5)
230 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)
231 cookie=0x8 table=6 in_port=85 actions=mod_tp_src:85,controller,resubmit(86,7)
232 cookie=0x9 table=7 in_port=86 actions=mod_tp_dst:86,controller,controller
233 ])
234 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
235
236 dnl Flow miss.
237 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
238
239 for i in 1 2 3 ; do
240     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)'
241 done
242
243 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
244 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
245 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
246 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_csum:0
247 dnl
248 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
249 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_csum:0
250 dnl
251 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via no_match) data_len=60 (unbuffered)
252 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_csum:0
253 ])
254
255 dnl Singleton controller action.
256 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
257
258 for i in 1 2 3 ; do
259     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)'
260 done
261
262 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
263 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
264 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
265 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_csum:0
266 dnl
267 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
268 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_csum:0
269 dnl
270 OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
271 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_csum:0
272 ])
273
274 dnl Modified controller action.
275 AT_CHECK([ovs-ofctl monitor -P openflow10 br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
276
277 for i in 1 2 3 ; do
278     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)'
279 done
280
281 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
282 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
283 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
284 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_csum:0
285 dnl
286 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
287 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_csum:0
288 dnl
289 OFPT_PACKET_IN (xid=0x0): total_len=64 in_port=1 (via action) data_len=64 (unbuffered)
290 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_csum:0
291 ])
292
293 dnl Checksum TCP.
294 AT_CHECK([ovs-ofctl monitor br0 65534 -P nxm --detach --no-chdir --pidfile 2> ofctl_monitor.log])
295
296 for i in 1 ; do
297     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)'
298 done
299
300 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
301 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
302 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
303 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_csum:0
304 dnl
305 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
306 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_csum:0
307 dnl
308 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)
309 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_csum:0
310 dnl
311 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)
312 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_csum:0
313 dnl
314 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)
315 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_csum:1a03
316 dnl
317 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)
318 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_csum:3205
319 dnl
320 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)
321 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_csum:31b8
322 dnl
323 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)
324 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_csum:316d
325 dnl
326 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)
327 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_csum:316d
328 ])
329
330 dnl Checksum UDP.
331 AT_CHECK([ovs-ofctl monitor br0 65534 --detach --no-chdir --pidfile 2> ofctl_monitor.log])
332
333 for i in 1 ; do
334     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'
335 done
336
337 OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit])
338 AT_CHECK([cat ofctl_monitor.log], [0], [dnl
339 NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered)
340 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
341 dnl
342 NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x3 total_len=64 in_port=1 reg0=0x1 (via action) data_len=64 (unbuffered)
343 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
344 dnl
345 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)
346 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
347 dnl
348 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)
349 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
350 dnl
351 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)
352 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
353 dnl
354 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)
355 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
356 dnl
357 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)
358 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
359 dnl
360 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)
361 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
362 dnl
363 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)
364 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
365 ])
366
367 AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore])
368 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
369  cookie=0x1, n_packets=2, n_bytes=120, dl_src=20:22:22:22:22:22 actions=CONTROLLER:65535,resubmit(80,1)
370  cookie=0x2, n_packets=3, n_bytes=180, dl_src=30:33:33:33:33:33 actions=mod_vlan_vid:15,CONTROLLER:65535
371  cookie=0x3, table=1, n_packets=2, n_bytes=120, in_port=80 actions=load:0x1->NXM_NX_REG0[[]],mod_vlan_vid:80,CONTROLLER:65535,resubmit(81,2)
372  cookie=0x4, table=2, n_packets=2, n_bytes=120, in_port=81 actions=load:0x2->NXM_NX_REG1[[]],mod_dl_src:80:81:81:81:81:81,CONTROLLER:65535,resubmit(82,3)
373  cookie=0x5, table=3, n_packets=2, n_bytes=120, in_port=82 actions=load:0x3->NXM_NX_REG2[[]],mod_dl_dst:82:82:82:82:82:82,CONTROLLER:65535,resubmit(83,4)
374  cookie=0x6, table=4, n_packets=2, n_bytes=120, in_port=83 actions=load:0x4->NXM_NX_REG3[[]],mod_nw_src:83.83.83.83,CONTROLLER:65535,resubmit(84,5)
375  cookie=0x7, table=5, n_packets=2, n_bytes=120, 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)
376  cookie=0x8, table=6, n_packets=2, n_bytes=120, in_port=85 actions=mod_tp_src:85,CONTROLLER:65535,resubmit(86,7)
377  cookie=0x9, table=7, n_packets=2, n_bytes=120, in_port=86 actions=mod_tp_dst:86,CONTROLLER:65535,CONTROLLER:65535
378  n_packets=3, n_bytes=180, dl_src=10:11:11:11:11:11 actions=CONTROLLER:65535
379 NXST_FLOW reply:
380 ])
381
382 OVS_VSWITCHD_STOP
383 AT_CLEANUP
384
385 AT_SETUP([ofproto-dpif - VLAN handling])
386 OVS_VSWITCHD_START(
387   [set Bridge br0 fail-mode=standalone -- \
388    add-port br0 p1                                  trunks=10,12 -- \
389    add-port br0 p2                           tag=10              -- \
390    add-port br0 p3                           tag=12              \
391                    other-config:priority-tags=true               -- \
392    add-port br0 p4                           tag=12              -- \
393    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
394    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
395    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
396    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
397                    other-config:priority-tags=true               -- \
398    set Interface p1 type=dummy -- \
399    set Interface p2 type=dummy -- \
400    set Interface p3 type=dummy -- \
401    set Interface p4 type=dummy -- \
402    set Interface p5 type=dummy -- \
403    set Interface p6 type=dummy -- \
404    set Interface p7 type=dummy -- \
405    set Interface p8 type=dummy --])
406
407 dnl Each of these specifies an in_port by number, a VLAN VID (or "none"),
408 dnl a VLAN PCP (used if the VID isn't "none") and the expected set of datapath
409 dnl actions.
410 for tuple in \
411         "100 none 0 drop" \
412         "100 0    0 drop" \
413         "100 0    1 drop" \
414         "100 10   0 1,5,6,7,8,pop_vlan,2" \
415         "100 10   1 1,5,6,7,8,pop_vlan,2" \
416         "100 11   0 5,7" \
417         "100 11   1 5,7" \
418         "100 12   0 1,5,6,pop_vlan,3,4,7,8" \
419         "100 12   1 1,5,6,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
420         "1  none 0 drop" \
421         "1  0    0 drop" \
422         "1  0    1 drop" \
423         "1  10   0 5,6,7,8,100,pop_vlan,2" \
424         "1  10   1 5,6,7,8,100,pop_vlan,2" \
425         "1  11   0 drop" \
426         "1  11   1 drop" \
427         "1  12   0 5,6,100,pop_vlan,3,4,7,8" \
428         "1  12   1 5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
429         "2  none 0 push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
430         "2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),1,5,6,7,8,100" \
431         "2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),1,5,6,7,8,100" \
432         "2  10   0 drop" \
433         "2  10   1 drop" \
434         "2  11   0 drop" \
435         "2  11   1 drop" \
436         "2  12   0 drop" \
437         "2  12   1 drop" \
438         "3  none 0 4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
439         "3  0    0 pop_vlan,4,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
440         "3  0    1 8,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
441         "3  10   0 drop" \
442         "3  10   1 drop" \
443         "3  11   0 drop" \
444         "3  11   1 drop" \
445         "3  12   0 drop" \
446         "3  12   1 drop" \
447         "4  none 0 3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
448         "4  0    0 pop_vlan,3,7,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
449         "4  0    1 3,8,pop_vlan,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
450         "4  10   0 drop" \
451         "4  10   1 drop" \
452         "4  11   0 drop" \
453         "4  11   1 drop" \
454         "4  12   0 drop" \
455         "4  12   1 drop" \
456         "5  none 0 2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
457         "5  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,6,7,8,100" \
458         "5  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,6,7,8,100" \
459         "5  10   0 1,6,7,8,100,pop_vlan,2" \
460         "5  10   1 1,6,7,8,100,pop_vlan,2" \
461         "5  11   0 7,100" \
462         "5  11   1 7,100" \
463         "5  12   0 1,6,100,pop_vlan,3,4,7,8" \
464         "5  12   1 1,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
465         "6  none 0 2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
466         "6  0    0 pop_vlan,2,push_vlan(vid=10,pcp=0),1,5,7,8,100" \
467         "6  0    1 pop_vlan,2,push_vlan(vid=10,pcp=1),1,5,7,8,100" \
468         "6  10   0 1,5,7,8,100,pop_vlan,2" \
469         "6  10   1 1,5,7,8,100,pop_vlan,2" \
470         "6  11   0 drop" \
471         "6  11   1 drop" \
472         "6  12   0 1,5,100,pop_vlan,3,4,7,8" \
473         "6  12   1 1,5,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3,8" \
474         "7  none 0 3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
475         "7  0    0 pop_vlan,3,4,8,push_vlan(vid=12,pcp=0),1,5,6,100" \
476         "7  0    1 3,8,pop_vlan,4,push_vlan(vid=12,pcp=1),1,5,6,100" \
477         "7  10   0 1,5,6,8,100,pop_vlan,2" \
478         "7  10   1 1,5,6,8,100,pop_vlan,2" \
479         "7  11   0 5,100" \
480         "7  11   1 5,100" \
481         "7  12   0 1,5,6,100,pop_vlan,3,4,8" \
482         "7  12   1 1,5,6,100,pop_vlan,4,push_vlan(vid=0,pcp=1),3,8" \
483         "8  none 0 3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
484         "8  0    0 pop_vlan,3,4,7,push_vlan(vid=12,pcp=0),1,5,6,100" \
485         "8  0    1 3,pop_vlan,4,7,push_vlan(vid=12,pcp=1),1,5,6,100" \
486         "8  10   0 1,5,6,7,100,pop_vlan,2" \
487         "8  10   1 1,5,6,7,100,pop_vlan,2" \
488         "8  11   0 drop" \
489         "8  11   1 drop" \
490         "8  12   0 1,5,6,100,pop_vlan,3,4,7" \
491         "8  12   1 1,5,6,100,pop_vlan,4,7,push_vlan(vid=0,pcp=1),3"
492 do
493   set $tuple
494   in_port=$1
495   vlan=$2
496   pcp=$3
497   expected=$4
498
499   if test $vlan = none; then
500     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
501   else
502     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))"
503   fi
504
505   echo "----------------------------------------------------------------------"
506   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
507
508   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
509   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
510
511   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
512   mv stdout expout
513   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
514 done
515
516 OVS_VSWITCHD_STOP
517 AT_CLEANUP
518
519 AT_SETUP([ofproto-dpif - fragment handling])
520 OVS_VSWITCHD_START
521 ADD_OF_PORTS([br0], [1], [2], [3], [4], [5], [6], [90])
522 AT_DATA([flows.txt], [dnl
523 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
524 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
525 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
526 priority=50 tcp ip_frag=no              actions=output:4
527 priority=50 tcp ip_frag=first           actions=output:5
528 priority=50 tcp ip_frag=later           actions=output:6
529 ])
530 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
531
532 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"
533 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
534 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
535 later_flow="$base_flow,frag=later)"
536
537     # mode    no  first  later
538 for tuple in \
539     'normal    1     5      6' \
540     'drop      1  drop   drop' \
541     'nx-match  1     2      6'
542 do
543   set $tuple
544   mode=$1
545   no=$2
546   first=$3
547   later=$4
548
549   AT_CHECK([ovs-ofctl set-frags br0 $mode])
550   for type in no first later; do
551     eval flow=\$${type}_flow exp_output=\$$type
552     printf "\n%s\n" "----$mode $type-----"
553     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
554     : > expout
555     if test $mode = drop && test $type != no; then
556         echo 'Packets dropped because they are IP fragments and the fragment handling mode is "drop".' >> expout
557     fi
558     echo "Datapath actions: $exp_output" >> expout
559     AT_CHECK([grep 'IP fragments' stdout; tail -1 stdout], [0], [expout])
560   done
561 done
562 OVS_VSWITCHD_STOP
563 AT_CLEANUP
564
565 AT_SETUP([ofproto-dpif - exit])
566 OVS_VSWITCHD_START
567 ADD_OF_PORTS([br0], [1], [2], [3], [10], [11], [12], [13], [14])
568 AT_DATA([flows.txt], [dnl
569 in_port=1 actions=output:10,exit,output:11
570 in_port=2 actions=output:12,resubmit:1,output:12
571 in_port=3 actions=output:13,resubmit:2,output:14
572 ])
573 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
574 AT_CHECK([ovs-appctl ofproto/trace 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=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
575 AT_CHECK([tail -1 stdout], [0],
576   [Datapath actions: 10
577 ])
578 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
579 AT_CHECK([tail -1 stdout], [0],
580   [Datapath actions: 12,10
581 ])
582 AT_CHECK([ovs-appctl ofproto/trace br0 '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])
583 AT_CHECK([tail -1 stdout], [0],
584   [Datapath actions: 13,12,10
585 ])
586 OVS_VSWITCHD_STOP
587 AT_CLEANUP
588
589
590 AT_SETUP([ofproto-dpif - mirroring, select_all])
591 OVS_VSWITCHD_START
592 ADD_OF_PORTS([br0], 1, 2, 3)
593 ovs-vsctl \
594         set Bridge br0 mirrors=@m --\
595         --id=@p3 get Port p3 --\
596         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
597
598 AT_DATA([flows.txt], [dnl
599 in_port=1 actions=output:2
600 in_port=2 actions=output:1
601 ])
602 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
603
604 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)"
605 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
606 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
607   [Datapath actions: 2,3
608 ])
609
610 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)"
611 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
612 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
613   [Datapath actions: 1,3
614 ])
615
616 OVS_VSWITCHD_STOP
617 AT_CLEANUP
618
619
620 AT_SETUP([ofproto-dpif - mirroring, select_src])
621 OVS_VSWITCHD_START
622 ADD_OF_PORTS([br0], 1, 2, 3)
623 ovs-vsctl \
624         set Bridge br0 mirrors=@m --\
625         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
626         --id=@m create Mirror name=mymirror select_src_port=@p1 output_port=@p3
627
628 AT_DATA([flows.txt], [dnl
629 in_port=1 actions=output:2
630 in_port=2 actions=output:1
631 ])
632 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
633
634 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)"
635 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
636 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
637   [Datapath actions: 2,3
638 ])
639
640 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)"
641 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
642 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
643   [Datapath actions: 1
644 ])
645 OVS_VSWITCHD_STOP
646 AT_CLEANUP
647
648 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
649 OVS_VSWITCHD_START
650 ADD_OF_PORTS([br0], 1, 2)
651 ovs-vsctl \
652         set Bridge br0 mirrors=@m --\
653         --id=@p2 get Port p2 --\
654         --id=@m create Mirror name=mymirror select_all=true output_port=@p2
655
656 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
657
658 # "in_port" defaults to OFPP_NONE if it's not specified.
659 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"
660 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
661 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
662   [Datapath actions: 1,2
663 ])
664
665 OVS_VSWITCHD_STOP
666 AT_CLEANUP
667
668
669 AT_SETUP([ofproto-dpif - mirroring, select_dst])
670 OVS_VSWITCHD_START
671 ADD_OF_PORTS([br0], 1, 2, 3)
672 ovs-vsctl \
673         set Bridge br0 mirrors=@m --\
674         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
675         --id=@m create Mirror name=mymirror select_dst_port=@p2 output_port=@p3
676
677 AT_DATA([flows.txt], [dnl
678 in_port=1 actions=output:2
679 in_port=2 actions=output:1
680 ])
681 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
682
683 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)"
684 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
685 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
686   [Datapath actions: 2,3
687 ])
688
689 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)"
690 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
691 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
692   [Datapath actions: 1
693 ])
694
695 OVS_VSWITCHD_STOP
696 AT_CLEANUP
697
698
699 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
700 OVS_VSWITCHD_START
701 ADD_OF_PORTS([br0], 1, 2, 3)
702 ovs-vsctl \
703         set Bridge br0 mirrors=@m --\
704         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
705         --id=@m create Mirror name=mymirror select_all=true select_vlan=11 output_port=@p3
706
707 AT_DATA([flows.txt], [dnl
708 in_port=1, actions=output:2
709 ])
710 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
711
712 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)"
713 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
714 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
715   [Datapath actions: 2
716 ])
717
718 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))"
719 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
720 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
721   [Datapath actions: 2
722 ])
723
724 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))"
725 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
726 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
727   [Datapath actions: 2,3
728 ])
729
730 OVS_VSWITCHD_STOP
731 AT_CLEANUP
732
733
734 AT_SETUP([ofproto-dpif - mirroring, output_port])
735 OVS_VSWITCHD_START
736 ADD_OF_PORTS([br0], 1, 2, 3)
737 ovs-vsctl \
738         set Bridge br0 mirrors=@m --\
739         --id=@p3 get Port p3 --\
740         --id=@m create Mirror name=mymirror select_all=true output_port=@p3
741
742 AT_DATA([flows.txt], [dnl
743 in_port=1 actions=mod_vlan_vid:17,output:2
744 in_port=2 actions=output:1
745 ])
746 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
747
748 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)"
749 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
750 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
751   [Datapath actions: push_vlan(vid=17,pcp=0),2,pop_vlan,3
752 ])
753
754 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)"
755 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
756 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
757   [Datapath actions: 1,3
758 ])
759
760 OVS_VSWITCHD_STOP
761 AT_CLEANUP
762
763 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
764 OVS_VSWITCHD_START
765 ADD_OF_PORTS([br0], 1, 2)
766 ovs-vsctl \
767         set Bridge br0 mirrors=@m --\
768         --id=@m create Mirror name=mymirror select_all=true output_vlan=12
769
770 AT_DATA([flows.txt], [dnl
771 in_port=1 actions=output:2
772 in_port=2 actions=mod_vlan_vid:17,output:1
773 ])
774 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
775
776 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)"
777 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
778 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
779
780 expected="2,push_vlan(vid=12,pcp=0),1,2,100"
781 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
782 mv stdout expout
783 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
784
785 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)"
786 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
787 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
788
789 expected="push_vlan(vid=17,pcp=0),1,pop_vlan,push_vlan(vid=12,pcp=0),1,2,100"
790 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected"], [0], [stdout])
791 mv stdout expout
792 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual"], [0], [expout])
793
794 OVS_VSWITCHD_STOP
795 AT_CLEANUP
796
797 m4_define([OFPROTO_TRACE],
798   [flow="$2"
799    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
800    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
801    expected="$4"
802    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
803      [0], [stdout])
804    mv stdout expout
805    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
806      [0], [expout])])
807
808 AT_SETUP([ofproto-dpif - MAC learning])
809 OVS_VSWITCHD_START([set bridge br0 fail-mode=standalone])
810 ADD_OF_PORTS([br0], 1, 2, 3)
811
812 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)'
813
814 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
815 OFPROTO_TRACE(
816   [br0],
817   [in_port(3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
818   [-generate],
819   [1,2,100])
820
821 # Check for the MAC learning entry.
822 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
823  port  VLAN  MAC                Age
824     3     0  50:54:00:00:00:05    ?
825 ])
826
827 # Trace a packet arrival destined for the learned MAC.
828 # (This will also learn a MAC.)
829 OFPROTO_TRACE(
830   [br0],
831   [in_port(1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
832   [-generate],
833   [3])
834
835 # Check for both MAC learning entries.
836 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
837  port  VLAN  MAC                Age
838     3     0  50:54:00:00:00:05    ?
839     1     0  50:54:00:00:00:06    ?
840 ])
841
842 # Trace a packet arrival that updates the first learned MAC entry.
843 OFPROTO_TRACE(
844   [br0],
845   [in_port(2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
846   [-generate],
847   [1,3,100])
848
849 # Check that the MAC learning entry was updated.
850 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
851  port  VLAN  MAC                Age
852     1     0  50:54:00:00:00:06    ?
853     2     0  50:54:00:00:00:05    ?
854 ])
855
856 # Add another bridge.
857 AT_CHECK(
858   [ovs-vsctl \
859      -- add-br br1 \
860      -- set bridge br1 datapath-type=dummy \
861      -- add-port br1 p4 -- set interface p4 type=dummy \
862      -- add-port br1 p5 -- set interface p5 type=dummy])
863
864 # Trace some packet arrivals in br1 to create MAC learning entries there too.
865 OFPROTO_TRACE(
866   [br1],
867   [in_port(4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
868   [-generate],
869   [5,101])
870 OFPROTO_TRACE(
871   [br1],
872   [in_port(5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
873   [-generate],
874   [4,101])
875
876 # Check that the MAC learning entries were added.
877 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
878  port  VLAN  MAC                Age
879     4     0  50:54:00:00:00:06    ?
880     5     0  50:54:00:00:00:07    ?
881 ])
882
883 # Delete port p1 and see that its MAC learning entry disappeared, and
884 # that the MAC learning entry for the same MAC was also deleted from br1.
885 AT_CHECK([ovs-vsctl del-port p1])
886 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
887  port  VLAN  MAC                Age
888     2     0  50:54:00:00:00:05    ?
889 ])
890 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [dnl
891  port  VLAN  MAC                Age
892     5     0  50:54:00:00:00:07    ?
893 ])
894
895 OVS_VSWITCHD_STOP
896 AT_CLEANUP
897
898 AT_SETUP([ofproto-dpif - MAC table overflow])
899 OVS_VSWITCHD_START(
900   [set bridge br0 fail-mode=standalone other-config:mac-table-size=10 -- \
901    add-port br0 p1 -- set Interface p1 type=dummy -- \
902    add-port br0 p2 -- set Interface p2 type=dummy -- \
903    add-port br0 p3 -- set Interface p3 type=dummy])
904
905 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)'
906
907 AT_CHECK([ovs-appctl time/stop])
908
909 # Trace 10 ARP packets arriving on p3, to create MAC learning entries.
910 for i in 0 1 2 3 4 5 6 7 8 9; do
911     OFPROTO_TRACE(
912       [br0],
913       [in_port(3),eth(src=50:54:00:00:00:0$i,dst=ff:ff:ff:ff:ff:ff),$arp],
914       [-generate],
915       [1,2,100])
916     ovs-appctl time/warp 1000
917 done
918
919 # Check for the MAC learning entries.
920 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | sort],
921   [0], [dnl
922     3     0  50:54:00:00:00:00
923     3     0  50:54:00:00:00:01
924     3     0  50:54:00:00:00:02
925     3     0  50:54:00:00:00:03
926     3     0  50:54:00:00:00:04
927     3     0  50:54:00:00:00:05
928     3     0  50:54:00:00:00:06
929     3     0  50:54:00:00:00:07
930     3     0  50:54:00:00:00:08
931     3     0  50:54:00:00:00:09
932  port  VLAN  MAC                Age
933 ])
934
935 # Trace another ARP packet on another MAC.
936 OFPROTO_TRACE(
937   [br0],
938   [in_port(3),eth(src=50:54:00:00:00:10,dst=ff:ff:ff:ff:ff:ff),$arp],
939   [-generate],
940   [1,2,100])
941
942 # Check that the new one chased the oldest one out of the table.
943 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/' | sort],
944   [0], [dnl
945     3     0  50:54:00:00:00:01    ?
946     3     0  50:54:00:00:00:02    ?
947     3     0  50:54:00:00:00:03    ?
948     3     0  50:54:00:00:00:04    ?
949     3     0  50:54:00:00:00:05    ?
950     3     0  50:54:00:00:00:06    ?
951     3     0  50:54:00:00:00:07    ?
952     3     0  50:54:00:00:00:08    ?
953     3     0  50:54:00:00:00:09    ?
954     3     0  50:54:00:00:00:10    ?
955  port  VLAN  MAC                Age
956 ])
957 OVS_VSWITCHD_STOP
958 AT_CLEANUP
959
960 dnl Test that basic NetFlow reports flow statistics correctly:
961 dnl - The initial packet of a flow are correctly accounted.
962 dnl - Later packets within a flow are correctly accounted.
963 dnl - Flow actions changing (in this case, due to MAC learning)
964 dnl   cause a record to be sent.
965 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
966
967 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
968 NETFLOW_PORT=`cat stdout`
969
970 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
971 ADD_OF_PORTS([br0], 1, 2)
972 ovs-vsctl \
973    set Bridge br0 netflow=@nf -- \
974    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
975      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
976
977 ON_EXIT([kill `cat test-netflow.pid`])
978 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
979 AT_CAPTURE_FILE([netflow.log])
980
981 for delay in 1000 30000; do
982     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)'
983     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)'
984
985     ovs-appctl time/warp $delay
986 done
987
988 sleep 1
989 OVS_VSWITCHD_STOP
990 ovs-appctl -t test-netflow exit
991
992 AT_CHECK([[sed -e 's/, uptime [0-9]*//
993 s/, now [0-9.]*//
994 s/time \([0-9]*\)\.\.\.\1$/time <moment>/
995 s/time [0-9]*\.\.\.[0-9]*/time <range>/
996 ' netflow.log | sort]], [0],
997   [
998 header: v5, seq 0, engine 2,1
999 header: v5, seq 1, engine 2,1
1000 seq 0: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1001 seq 1: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
1002 seq 1: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
1003 ])
1004 AT_CLEANUP
1005
1006 dnl Test that basic NetFlow reports active expirations correctly.
1007 AT_SETUP([ofproto-dpif - NetFlow active expiration])
1008
1009 AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
1010 NETFLOW_PORT=`cat stdout`
1011
1012 OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
1013 ADD_OF_PORTS([br0], 1, 2)
1014 ovs-vsctl \
1015    set Bridge br0 netflow=@nf -- \
1016    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
1017      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
1018
1019 ON_EXIT([kill `test-netflow.pid`])
1020 AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
1021
1022 AT_CHECK([ovs-appctl time/stop])
1023 n=1
1024 while test $n -le 60; do
1025     n=`expr $n + 1`
1026
1027     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)'
1028     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)'
1029
1030     ovs-appctl time/warp 1000
1031 done
1032
1033 ovs-appctl time/warp 10000
1034
1035 sleep 1
1036 OVS_VSWITCHD_STOP
1037 ovs-appctl -t test-netflow exit
1038
1039 # Count the number of reported packets:
1040 # - From source to destination before MAC learning kicks in (just one).
1041 # - From source to destination after that.
1042 # - From destination to source.
1043 n_learn=0
1044 n_in=0
1045 n_out=0
1046 n_other=0
1047 n_recs=0
1048 none=0
1049 while read line; do
1050     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
1051     case $pkts in
1052          [[0-9]]*) ;;
1053          *) continue ;;
1054     esac
1055
1056     case $line in
1057         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1058             counter=n_learn
1059             ;;
1060         "seq "*": 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
1061             counter=n_in
1062             ;;
1063         "seq "*": 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
1064             counter=n_out
1065             ;;
1066         *)
1067             counter=n_other
1068             ;;
1069     esac
1070     eval $counter=\`expr \$$counter + \$pkts\`
1071     n_recs=`expr $n_recs + 1`
1072 done < netflow.log
1073
1074 # There should be exactly 1 MAC learning packet,
1075 # exactly 59 other packets in that direction,
1076 # and exactly 60 packets in the other direction.
1077 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
1078 ])
1079
1080 # There should be 1 expiration for MAC learning,
1081 # at least 5 active and a final expiration in one direction,
1082 # and at least 5 active and a final expiration in the other direction.
1083 echo $n_recs
1084 AT_CHECK([test $n_recs -ge 13])
1085
1086 AT_CLEANUP
1087
1088 AT_SETUP([idle_age and hard_age increase over time])
1089 OVS_VSWITCHD_START
1090
1091 # get_ages DURATION HARD IDLE
1092 #
1093 # Fetch the flow duration, hard age, and idle age into the variables
1094 # whose names are given as arguments.  Rounds DURATION down to the
1095 # nearest integer.  If hard_age doesn't appear in the output, sets
1096 # HARD to "none".  If idle_age doesn't appear in the output, sets IDLE
1097 # to 0.
1098 get_ages () {
1099     AT_CHECK([ovs-ofctl dump-flows br0], [0], [stdout])
1100
1101     duration=`sed -n 's/.*duration=\([[0-9]]*\)\(\.[[0-9]]*\)\{0,1\}s.*/\1/p' stdout`
1102     AT_CHECK([[expr X"$duration" : 'X[0-9][0-9]*$']], [0], [ignore])
1103     AS_VAR_COPY([$1], [duration])
1104
1105     hard=`sed -n 's/.*hard_age=\([[0-9]]*\),.*/\1/p' stdout`
1106     if test X"$hard" = X; then
1107         hard=none
1108     else
1109         AT_CHECK([[expr X"$hard" : 'X[0-9][0-9]*$']], [0], [ignore])
1110     fi
1111     AS_VAR_COPY([$2], [hard])
1112
1113     idle=`sed -n 's/.*idle_age=\([[0-9]]*\),.*/\1/p' stdout`
1114     if test X"$idle" = X; then
1115         idle=0
1116     else
1117         AT_CHECK([[expr X"$idle" : 'X[0-9][0-9]*$']], [0], [ignore])
1118     fi
1119     AS_VAR_COPY([$3], [idle])
1120 }
1121
1122 # Add a flow and get its initial hard and idle age.
1123 AT_CHECK([ovs-ofctl add-flow br0 hard_timeout=199,idle_timeout=188,actions=drop])
1124 get_ages duration1 hard1 idle1
1125
1126 # Warp time forward by 10 seconds, then modify the flow's actions.
1127 ovs-appctl time/warp 10000
1128 get_ages duration2 hard2 idle2
1129 AT_CHECK([ovs-ofctl mod-flows br0 actions=flood])
1130
1131 # Warp time forward by 10 seconds.
1132 ovs-appctl time/warp 10000
1133 get_ages duration3 hard3 idle3
1134
1135 # Warp time forward 10 more seconds, then pass some packets through the flow,
1136 # then warp forward a few more times because idle times are only updated
1137 # occasionally.
1138 ovs-appctl time/warp 10000
1139 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)'
1140 ovs-appctl time/warp 1000
1141 ovs-appctl time/warp 1000
1142 ovs-appctl time/warp 1000
1143 get_ages duration4 hard4 idle4
1144
1145 printf "duration: %4s => %4s => %4s => %4s\n" $duration1 $duration2 $duration3 $duration4
1146 printf "hard_age: %4s => %4s => %4s => %4s\n" $hard1 $hard2 $hard3 $hard4
1147 printf "idle_age: %4s => %4s => %4s => %4s\n" $idle1 $idle2 $idle3 $idle4
1148
1149 # Duration should increase steadily over time.
1150 AT_CHECK([test $duration1 -lt $duration2])
1151 AT_CHECK([test $duration2 -lt $duration3])
1152 AT_CHECK([test $duration3 -lt $duration4])
1153
1154 # Hard age should be "none" initially because it's the same as flow_duration,
1155 # then it should increase.
1156 AT_CHECK([test $hard1 = none])
1157 AT_CHECK([test $hard2 = none])
1158 AT_CHECK([test $hard3 != none])
1159 AT_CHECK([test $hard4 != none])
1160 AT_CHECK([test $hard3 -lt $hard4])
1161
1162 # Idle age should increase from 1 to 2 to 3, then decrease.
1163 AT_CHECK([test $idle1 -lt $idle2])
1164 AT_CHECK([test $idle2 -lt $idle3])
1165 AT_CHECK([test $idle3 -gt $idle4])
1166
1167 # Check some invariant relationships.
1168 AT_CHECK([test $duration1 = $idle1])
1169 AT_CHECK([test $duration2 = $idle2])
1170 AT_CHECK([test $duration3 = $idle3])
1171 AT_CHECK([test $idle3 -gt $hard3])
1172 AT_CHECK([test $idle4 -lt $hard4])
1173 AT_CHECK([test $hard4 -lt $duration4])
1174
1175 OVS_VSWITCHD_STOP
1176 AT_CLEANUP
1177
1178 AT_SETUP([ofproto-dpif - fin_timeout])
1179 OVS_VSWITCHD_START
1180 AT_DATA([flows.txt], [dnl
1181 in_port=1 actions=output:2
1182 in_port=2 actions=mod_vlan_vid:17,output:1
1183 ])
1184 AT_CHECK([ovs-ofctl add-flow br0 'idle_timeout=60,actions=fin_timeout(idle_timeout=5)'])
1185 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1186 [NXST_FLOW reply:
1187  idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1188 ])
1189 # Check that a TCP SYN packet does not change the timeout.  (Because
1190 # flow stats updates are mainly what implements the fin_timeout
1191 # feature, we warp forward a couple of times to ensure that flow stats
1192 # run before re-checking the flow table.)
1193 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f908004500003c2e2440004006465dac11370dac11370b828b0016751e267b00000000a00216d017360000020405b40402080a2d25085f0000000001030307], [0], [success
1194 ])
1195 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1196 warped
1197 ])
1198 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1199 [NXST_FLOW reply:
1200  n_packets=1, n_bytes=74, idle_timeout=60, actions=fin_timeout(idle_timeout=5)
1201 ])
1202 # Check that a TCP FIN packet does change the timeout.
1203 AT_CHECK([ovs-appctl netdev-dummy/receive br0 0021853763af0026b98cb0f90800451000342e3e40004006463bac11370dac11370b828b0016751e319dfc96399b801100717ae800000101080a2d250a9408579588], [0], [success
1204 ])
1205 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1206 warped
1207 ])
1208 AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0],
1209 [NXST_FLOW reply:
1210  n_packets=2, n_bytes=140, idle_timeout=5, actions=fin_timeout(idle_timeout=5)
1211 ])
1212 OVS_VSWITCHD_STOP
1213 AT_CLEANUP
1214
1215 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-dps])
1216 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1217 ADD_OF_PORTS([br0], [1], [2])
1218 ADD_OF_PORTS([br1], [3])
1219
1220 AT_CHECK([ovs-appctl dpif/dump-dps], [0], [dnl
1221 dummy@br0
1222 dummy@br1
1223 ])
1224 OVS_VSWITCHD_STOP
1225 AT_CLEANUP
1226
1227 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show])
1228 OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy])
1229 ADD_OF_PORTS([br0], [1], [2])
1230 ADD_OF_PORTS([br1], [3])
1231
1232 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1233 br0 (dummy@ovs-dummy):
1234         lookups: hit:0 missed:0
1235         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1236                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1237         br0 65534/100: (dummy)
1238         p1 1/1: (dummy)
1239         p2 2/2: (dummy)
1240 br1 (dummy@ovs-dummy):
1241         lookups: hit:0 missed:0
1242         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1243                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1244         br1 65534/101: (dummy)
1245         p3 3/3: (dummy)
1246 ])
1247
1248 AT_CHECK([ovs-appctl dpif/show br0], [0], [dnl
1249 br0 (dummy@ovs-dummy):
1250         lookups: hit:0 missed:0
1251         flows: cur: 0, avg: 0.000, max: 0, life span: 0(ms)
1252                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1253         br0 65534/100: (dummy)
1254         p1 1/1: (dummy)
1255         p2 2/2: (dummy)
1256 ])
1257 OVS_VSWITCHD_STOP
1258 AT_CLEANUP
1259
1260 AT_SETUP([ofproto-dpif - ovs-appctl dpif/dump-flows])
1261 OVS_VSWITCHD_START([add-br br1 -- \
1262                     set bridge br1 datapath-type=dummy fail-mode=secure])
1263 ADD_OF_PORTS([br0], [1], [2])
1264 ADD_OF_PORTS([br1], [3])
1265
1266 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)'], [0], [success
1267 ])
1268 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)'], [0], [success
1269 ])
1270 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)'], [0], [success
1271 ])
1272
1273 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1274 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1275 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1276 ])
1277
1278 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1279 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1280 ])
1281
1282 OVS_VSWITCHD_STOP
1283 AT_CLEANUP
1284
1285 AT_SETUP([ofproto-dpif - ovs-appctl dpif/del-flows])
1286 OVS_VSWITCHD_START([add-br br1 -- \
1287                     set bridge br1 datapath-type=dummy fail-mode=secure])
1288 ADD_OF_PORTS([br0], [1], [2])
1289 ADD_OF_PORTS([br1], [3])
1290
1291 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)'], [0], [success
1292 ])
1293 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)'], [0], [success
1294 ])
1295 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)'], [0], [success
1296 ])
1297
1298 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1299 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1300 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1301 ])
1302
1303 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1304 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1305 ])
1306
1307 AT_CHECK([ovs-appctl dpif/del-flows br0])
1308 AT_CHECK([ovs-appctl dpif/dump-flows br0 | sort | STRIP_USED], [0], [dnl
1309 ])
1310
1311 AT_CHECK([ovs-appctl dpif/dump-flows br1 | sort | STRIP_USED], [0], [dnl
1312 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), packets:0, bytes:0, used:0.0s, actions:userspace(pid=0,slow_path(controller))
1313 ])
1314
1315 OVS_VSWITCHD_STOP
1316 AT_CLEANUP
1317
1318 AT_SETUP([ofproto-dpif - patch ports])
1319 OVS_VSWITCHD_START([add-br br1 \
1320 -- set bridge br1 datapath-type=dummy fail-mode=secure \
1321 -- add-port br1 pbr1 -- set int pbr1 type=patch options:peer=pbr0 \
1322 -- add-port br0 pbr0 -- set int pbr0 type=patch options:peer=pbr1])
1323
1324 ADD_OF_PORTS([br0], [2])
1325 ADD_OF_PORTS([br1], [3])
1326
1327 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1328 AT_CHECK([ovs-ofctl add-flow br1 actions=LOCAL,output:1,output:3])
1329
1330 for i in $(seq 1 10); do
1331     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)'
1332 done
1333
1334 for i in $(seq 1 5); do
1335     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)'
1336 done
1337
1338 AT_CHECK([ovs-appctl time/warp 1000 && ovs-appctl time/warp 1000], [0], [warped
1339 warped
1340 ])
1341
1342 AT_CHECK([ovs-appctl dpif/show], [0], [dnl
1343 br0 (dummy@ovs-dummy):
1344         lookups: hit:9 missed:1
1345         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1346                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1347         br0 65534/100: (dummy)
1348         p2 2/2: (dummy)
1349         pbr0 1/none: (patch: peer=pbr1)
1350 br1 (dummy@ovs-dummy):
1351         lookups: hit:4 missed:1
1352         flows: cur: 1, avg: 1.000, max: 1, life span: 0(ms)
1353                 overall avg: add rate: 0.000/min, del rate: 0.000/min
1354         br1 65534/101: (dummy)
1355         p3 3/3: (dummy)
1356         pbr1 1/none: (patch: peer=pbr0)
1357 ])
1358
1359 AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl
1360 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), packets:9, bytes:540, used:0.0s, actions:101,3,2
1361 ]),
1362 AT_CHECK([ovs-appctl dpif/dump-flows br1 | STRIP_USED], [0], [dnl
1363 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), packets:4, bytes:240, used:0.0s, actions:100,2,3
1364 ])
1365
1366 AT_CHECK([ovs-ofctl dump-ports br0 pbr0], [0], [dnl
1367 OFPST_PORT reply (xid=0x4): 1 ports
1368   port  1: rx pkts=5, bytes=300, drop=0, errs=0, frame=0, over=0, crc=0
1369            tx pkts=10, bytes=600, drop=0, errs=0, coll=0
1370 ])
1371
1372 AT_CHECK([ovs-ofctl dump-ports br1 pbr1], [0], [dnl
1373 OFPST_PORT reply (xid=0x4): 1 ports
1374   port  1: rx pkts=10, bytes=600, drop=0, errs=0, frame=0, over=0, crc=0
1375            tx pkts=5, bytes=300, drop=0, errs=0, coll=0
1376 ])
1377
1378 OVS_VSWITCHD_STOP
1379 AT_CLEANUP
1380
1381 AT_SETUP([ofproto-dpif - ovs-appctl dpif/show rates])
1382 OVS_VSWITCHD_START([set Bridge br0 fail-mode=secure])
1383 ADD_OF_PORTS([br0], 1, 2)
1384
1385 AT_CHECK([ovs-ofctl add-flow br0 actions=LOCAL,output:1,output:2])
1386
1387 for i in $(seq 1 61); do
1388     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)'
1389     ovs-appctl time/warp 10000
1390     ovs-appctl time/warp 50000
1391 done
1392
1393 AT_CHECK([ovs-appctl time/warp 10000], [0], [warped
1394 ])
1395
1396 AT_CHECK([ovs-appctl dpif/show | sed 's/ 10[[0-9]]\{3\}(ms)$/ 10000(ms)/'], [0], [dnl
1397 br0 (dummy@ovs-dummy):
1398         lookups: hit:0 missed:61
1399         flows: cur: 0, avg: 1.000, max: 1, life span: 10000(ms)
1400                 hourly avg: add rate: 0.641/min, del rate: 0.641/min
1401                 overall avg: add rate: 1.000/min, del rate: 1.000/min
1402         br0 65534/100: (dummy)
1403         p1 1/1: (dummy)
1404         p2 2/2: (dummy)
1405 ])
1406
1407 OVS_VSWITCHD_STOP
1408 AT_CLEANUP