58d3d233bba9299442c9c3b3db3a96d3d13457bd
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 AT_SETUP([ofproto-dpif - resubmit])
4 OVS_VSWITCHD_START
5 AT_DATA([flows.txt], [dnl
6 table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
7 table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
8 table=0 in_port=3 priority=2000 icmp actions=output(20)
9 table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
10 table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
11 table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
12 ])
13 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
14 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])
15 AT_CHECK([tail -1 stdout], [0],
16   [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
17 ])
18 OVS_VSWITCHD_STOP
19 AT_CLEANUP
20
21 AT_SETUP([ofproto-dpif - registers])
22 OVS_VSWITCHD_START
23 AT_DATA([flows.txt], [dnl
24 in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
25 in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
26 in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11
27 in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
28 in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
29 in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
30 in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
31 in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
32 in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
33 in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
34 in_port=9,reg0=0xdeadbeef  actions=output:20
35 in_port=10,reg1=0xdeadbeef actions=output:21
36 in_port=11,reg2=0xeef22dea actions=output:22
37 ])
38 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
39 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])
40 AT_CHECK([tail -1 stdout], [0],
41   [Datapath actions: 20,21,22
42 ])
43 OVS_VSWITCHD_STOP
44 AT_CLEANUP
45
46 AT_SETUP([ofproto-dpif - output])
47 OVS_VSWITCHD_START
48 AT_DATA([flows.txt], [dnl
49 in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
50 in_port=2 actions=output:9
51 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
52 in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
53 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
54 in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
55 in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
56 ])
57 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
58 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])
59 AT_CHECK([tail -1 stdout], [0],
60   [Datapath actions: 9,55,10,55,66,11,77,88
61 ])
62 OVS_VSWITCHD_STOP
63 AT_CLEANUP
64
65 AT_SETUP([ofproto-dpif - DSCP])
66 dnl This test assumes port p1 is allocated OpenFlow port number 1.
67 OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy])
68 AT_DATA([flows.txt], [dnl
69 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
70 ])
71 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
72 AT_CHECK([ovs-vsctl -- \
73         set Port p1 qos=@newqos --\
74         --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\
75         --id=@q1 create Queue dscp=1 --\
76         --id=@q2 create Queue dscp=2], [0], [ignore])
77 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])
78 AT_CHECK([tail -1 stdout], [0],
79   [Datapath actions: dnl
80 0,dnl
81 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
82 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(priority(2)),1,dnl
83 1,dnl
84 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl
85 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(priority(0)),1,dnl
86 set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl
87 0
88 ])
89 OVS_VSWITCHD_STOP
90 AT_CLEANUP
91
92 AT_SETUP([ofproto-dpif - output/flood flags])
93 dnl This test assumes that OpenFlow port numbers are allocated in order
94 dnl starting from one.  It does not necessarily require that they are allocated
95 dnl in the same order that they are named in the database.  Just that the
96 dnl following command guarantees OpenFlow port 65534, and ports 1-7 exist in
97 dnl the bridge.
98 OVS_VSWITCHD_START([dnl
99         add-port br0 p1 -- set Interface p1 type=dummy --\
100         add-port br0 p2 -- set Interface p2 type=dummy --\
101         add-port br0 p3 -- set Interface p3 type=dummy --\
102         add-port br0 p4 -- set Interface p4 type=dummy --\
103         add-port br0 p5 -- set Interface p5 type=dummy --\
104         add-port br0 p6 -- set Interface p6 type=dummy --\
105         add-port br0 p7 -- set Interface p7 type=dummy ])
106
107 AT_DATA([flows.txt], [dnl
108 in_port=1 actions=flood
109 in_port=2 actions=all
110 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
111 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
112 ])
113 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
114 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
115 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
116
117 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])
118 AT_CHECK([tail -1 stdout \
119 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
120 0
121 2
122 3
123 4
124 7
125 ])
126
127 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])
128 AT_CHECK([tail -1 stdout \
129 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
130 0
131 1
132 3
133 4
134 6
135 7
136 ])
137
138 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])
139 AT_CHECK([tail -1 stdout], [0],
140   [Datapath actions: 0,1,2,4,6,7
141 ])
142
143 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])
144 AT_CHECK([tail -1 stdout], [0],
145   [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
146 ])
147 OVS_VSWITCHD_STOP
148 AT_CLEANUP
149
150 AT_SETUP([ofproto-dpif - set_tunnel])
151 OVS_VSWITCHD_START
152 AT_DATA([flows.txt], [dnl
153 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
154 in_port=1 actions=set_tunnel:1,output:1
155 in_port=2 actions=set_tunnel:1,output:2
156 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
157 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
158 in_port=5 actions=set_tunnel:5
159 ])
160 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
161 AT_CHECK([ovs-appctl ofproto/trace br0 'tun_id(0x1),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])
162 AT_CHECK([tail -1 stdout], [0],
163   [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
164 ])
165 OVS_VSWITCHD_STOP
166 AT_CLEANUP
167
168 AT_SETUP([ofproto-dpif - VLAN handling])
169 OVS_VSWITCHD_START(
170   [set Bridge br0 fail-mode=standalone -- \
171    add-port br0 p1                                  trunks=10,12 -- \
172    add-port br0 p2                           tag=10              -- \
173    add-port br0 p3                           tag=12              \
174                    other-config:priority-tags=true               -- \
175    add-port br0 p4                           tag=12              -- \
176    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
177    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
178    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
179    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
180                    other-config:priority-tags=true               -- \
181    set Interface p1 type=dummy -- \
182    set Interface p2 type=dummy -- \
183    set Interface p3 type=dummy -- \
184    set Interface p4 type=dummy -- \
185    set Interface p5 type=dummy -- \
186    set Interface p6 type=dummy -- \
187    set Interface p7 type=dummy -- \
188    set Interface p8 type=dummy --])
189
190 AT_CHECK(
191   [ovs-vsctl \
192         -- get Interface p1 ofport \
193         -- get Interface p2 ofport \
194         -- get Interface p3 ofport \
195         -- get Interface p4 ofport \
196         -- get Interface p5 ofport \
197         -- get Interface p6 ofport \
198         -- get Interface p7 ofport \
199         -- get Interface p8 ofport],
200   [0], [stdout])
201 set `cat stdout`
202 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
203
204 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
205 dnl PCP (used if the VID isn't "none") and the expected set of datapath
206 dnl actions.
207 for tuple in \
208         "br0 none 0 drop" \
209         "br0 0    0 drop" \
210         "br0 0    1 drop" \
211         "br0 10   0 p1,p5,p6,p7,p8,pop_vlan,p2" \
212         "br0 10   1 p1,p5,p6,p7,p8,pop_vlan,p2" \
213         "br0 11   0 p5,p7" \
214         "br0 11   1 p5,p7" \
215         "br0 12   0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
216         "br0 12   1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
217         "p1  none 0 drop" \
218         "p1  0    0 drop" \
219         "p1  0    1 drop" \
220         "p1  10   0 br0,p5,p6,p7,p8,pop_vlan,p2" \
221         "p1  10   1 br0,p5,p6,p7,p8,pop_vlan,p2" \
222         "p1  11   0 drop" \
223         "p1  11   1 drop" \
224         "p1  12   0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
225         "p1  12   1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
226         "p2  none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
227         "p2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
228         "p2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
229         "p2  10   0 drop" \
230         "p2  10   1 drop" \
231         "p2  11   0 drop" \
232         "p2  11   1 drop" \
233         "p2  12   0 drop" \
234         "p2  12   1 drop" \
235         "p3  none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
236         "p3  0    0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
237         "p3  0    1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
238         "p3  10   0 drop" \
239         "p3  10   1 drop" \
240         "p3  11   0 drop" \
241         "p3  11   1 drop" \
242         "p3  12   0 drop" \
243         "p3  12   1 drop" \
244         "p4  none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
245         "p4  0    0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
246         "p4  0    1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
247         "p4  10   0 drop" \
248         "p4  10   1 drop" \
249         "p4  11   0 drop" \
250         "p4  11   1 drop" \
251         "p4  12   0 drop" \
252         "p4  12   1 drop" \
253         "p5  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
254         "p5  0    0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
255         "p5  0    1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
256         "p5  10   0 br0,p1,p6,p7,p8,pop_vlan,p2" \
257         "p5  10   1 br0,p1,p6,p7,p8,pop_vlan,p2" \
258         "p5  11   0 br0,p7" \
259         "p5  11   1 br0,p7" \
260         "p5  12   0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
261         "p5  12   1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
262         "p6  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
263         "p6  0    0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
264         "p6  0    1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
265         "p6  10   0 br0,p1,p5,p7,p8,pop_vlan,p2" \
266         "p6  10   1 br0,p1,p5,p7,p8,pop_vlan,p2" \
267         "p6  11   0 drop" \
268         "p6  11   1 drop" \
269         "p6  12   0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
270         "p6  12   1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
271         "p7  none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
272         "p7  0    0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
273         "p7  0    1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
274         "p7  10   0 br0,p1,p5,p6,p8,pop_vlan,p2" \
275         "p7  10   1 br0,p1,p5,p6,p8,pop_vlan,p2" \
276         "p7  11   0 br0,p5" \
277         "p7  11   1 br0,p5" \
278         "p7  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
279         "p7  12   1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \
280         "p8  none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
281         "p8  0    0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
282         "p8  0    1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
283         "p8  10   0 br0,p1,p5,p6,p7,pop_vlan,p2" \
284         "p8  10   1 br0,p1,p5,p6,p7,pop_vlan,p2" \
285         "p8  11   0 drop" \
286         "p8  11   1 drop" \
287         "p8  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
288         "p8  12   1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3"
289 do
290   set $tuple
291   in_port=$1
292   vlan=$2
293   pcp=$3
294   expected=$4
295
296   eval n_in_port=\$$in_port
297   if test $vlan = none; then
298     flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
299   else
300     flow="in_port($n_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))"
301   fi
302
303   echo "----------------------------------------------------------------------"
304   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
305
306   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
307   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
308
309   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [stdout])
310   mv stdout expout
311   AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [expout])
312 done
313
314 OVS_VSWITCHD_STOP
315 AT_CLEANUP
316
317 AT_SETUP([ofproto-dpif - fragment handling])
318 OVS_VSWITCHD_START
319 AT_DATA([flows.txt], [dnl
320 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
321 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
322 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
323 priority=50 tcp ip_frag=no              actions=output:4
324 priority=50 tcp ip_frag=first           actions=output:5
325 priority=50 tcp ip_frag=later           actions=output:6
326 ])
327 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
328
329 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"
330 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
331 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
332 later_flow="$base_flow,frag=later)"
333
334     # mode    no  first  later
335 for tuple in \
336     'normal    1     5      6' \
337     'drop      1  drop   drop' \
338     'nx-match  1     2      6'
339 do
340   set $tuple
341   mode=$1
342   no=$2
343   first=$3
344   later=$4
345
346   AT_CHECK([ovs-ofctl set-frags br0 $mode])
347   for type in no first later; do
348     eval flow=\$${type}_flow exp_output=\$$type
349     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
350     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
351 ])
352   done
353 done
354 OVS_VSWITCHD_STOP
355 AT_CLEANUP
356
357 AT_SETUP([ofproto-dpif - exit])
358 OVS_VSWITCHD_START
359 AT_DATA([flows.txt], [dnl
360 in_port=1 actions=output:10,exit,output:11
361 in_port=2 actions=output:12,resubmit:1,output:12
362 in_port=3 actions=output:13,resubmit:2,output:14
363 ])
364 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
365 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])
366 AT_CHECK([tail -1 stdout], [0],
367   [Datapath actions: 10
368 ])
369 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])
370 AT_CHECK([tail -1 stdout], [0],
371   [Datapath actions: 12,10
372 ])
373 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])
374 AT_CHECK([tail -1 stdout], [0],
375   [Datapath actions: 13,12,10
376 ])
377 OVS_VSWITCHD_STOP
378 AT_CLEANUP
379
380
381 AT_SETUP([ofproto-dpif - mirroring, select_all])
382 OVS_VSWITCHD_START(
383        [add-port br0 p1 -- set Interface p1 type=dummy --\
384         add-port br0 p2 -- set Interface p2 type=dummy --\
385         add-port br0 p3 -- set Interface p3 type=dummy --\
386         set Bridge br0 mirrors=@m --\
387         --id=@p3 get Port p3 --\
388         --id=@m create Mirror name=mymirror \
389         select_all=true output_port=@p3], [<0>
390 ])
391
392 AT_CHECK(
393   [ovs-vsctl \
394         -- get Interface p1 ofport \
395         -- get Interface p2 ofport \
396         -- get Interface p3 ofport],
397   [0], [stdout])
398 set `cat stdout`
399 p1=$1 p2=$2 p3=$3
400
401 AT_DATA([flows.txt], [dnl
402 in_port=1 actions=output:2
403 in_port=2 actions=output:1
404 ])
405 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
406
407 flow="in_port($p1),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)"
408 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
409 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
410   [Datapath actions: $p2,$p3
411 ])
412
413 flow="in_port($p2),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)"
414 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
415 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
416   [Datapath actions: $p1,$p3
417 ])
418
419 OVS_VSWITCHD_STOP
420 AT_CLEANUP
421
422
423 AT_SETUP([ofproto-dpif - mirroring, select_src])
424 OVS_VSWITCHD_START(
425        [add-port br0 p1 -- set Interface p1 type=dummy --\
426         add-port br0 p2 -- set Interface p2 type=dummy --\
427         add-port br0 p3 -- set Interface p3 type=dummy --\
428         set Bridge br0 mirrors=@m --\
429         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
430         --id=@m create Mirror name=mymirror \
431         select_src_port=@p1 output_port=@p3], [<0>
432 ])
433
434 AT_CHECK(
435   [ovs-vsctl \
436         -- get Interface p1 ofport \
437         -- get Interface p2 ofport \
438         -- get Interface p3 ofport],
439   [0], [stdout])
440 set `cat stdout`
441 p1=$1 p2=$2 p3=$3
442
443 AT_DATA([flows.txt], [dnl
444 in_port=1 actions=output:2
445 in_port=2 actions=output:1
446 ])
447 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
448
449 flow="in_port($p1),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)"
450 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
451 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
452   [Datapath actions: $p2,$p3
453 ])
454
455 flow="in_port($p2),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)"
456 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
457 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
458   [Datapath actions: $p1
459 ])
460 OVS_VSWITCHD_STOP
461 AT_CLEANUP
462
463 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
464 OVS_VSWITCHD_START(
465        [add-port br0 p1 -- set Interface p1 type=dummy --\
466         add-port br0 p2 -- set Interface p2 type=dummy --\
467         set Bridge br0 mirrors=@m --\
468         --id=@p2 get Port p2 --\
469         --id=@m create Mirror name=mymirror \
470         select_all=true output_port=@p2], [<0>
471 ])
472
473 AT_CHECK(
474   [ovs-vsctl \
475         -- get Interface p1 ofport \
476         -- get Interface p2 ofport],
477   [0], [stdout])
478 set `cat stdout`
479 p1=$1 p2=$2
480
481 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
482
483 # "in_port" defaults to OFPP_NONE if it's not specified.
484 flow="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)"
485 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
486 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
487   [Datapath actions: $p1,$p2
488 ])
489
490 OVS_VSWITCHD_STOP
491 AT_CLEANUP
492
493
494 AT_SETUP([ofproto-dpif - mirroring, select_dst])
495 OVS_VSWITCHD_START(
496        [add-port br0 p1 -- set Interface p1 type=dummy --\
497         add-port br0 p2 -- set Interface p2 type=dummy --\
498         add-port br0 p3 -- set Interface p3 type=dummy --\
499         set Bridge br0 mirrors=@m --\
500         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
501         --id=@m create Mirror name=mymirror \
502         select_dst_port=@p2 output_port=@p3], [<0>
503 ])
504
505 AT_CHECK(
506   [ovs-vsctl \
507         -- get Interface p1 ofport \
508         -- get Interface p2 ofport \
509         -- get Interface p3 ofport],
510   [0], [stdout])
511 set `cat stdout`
512 p1=$1 p2=$2 p3=$3
513
514 AT_DATA([flows.txt], [dnl
515 in_port=1 actions=output:2
516 in_port=2 actions=output:1
517 ])
518 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
519
520 flow="in_port($p1),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)"
521 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
522 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
523   [Datapath actions: $p2,$p3
524 ])
525
526 flow="in_port($p2),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)"
527 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
528 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
529   [Datapath actions: $p1
530 ])
531
532 OVS_VSWITCHD_STOP
533 AT_CLEANUP
534
535
536 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
537 OVS_VSWITCHD_START(
538        [add-port br0 p1 -- set Interface p1 type=dummy --\
539         add-port br0 p2 -- set Interface p2 type=dummy --\
540         add-port br0 p3 -- set Interface p3 type=dummy --\
541         set Bridge br0 mirrors=@m --\
542         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
543         --id=@m create Mirror name=mymirror \
544         select_all=true select_vlan=11 output_port=@p3], [<0>
545 ])
546
547 AT_CHECK(
548   [ovs-vsctl \
549         -- get Interface p1 ofport \
550         -- get Interface p2 ofport \
551         -- get Interface p3 ofport],
552   [0], [stdout])
553 set `cat stdout`
554 p1=$1 p2=$2 p3=$3
555
556 AT_DATA([flows.txt], [dnl
557 in_port=1, actions=output:2
558 ])
559 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
560
561 flow="in_port($p1),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)"
562 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
563 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
564   [Datapath actions: $p2
565 ])
566
567 flow="in_port($p1),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))"
568 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
569 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
570   [Datapath actions: $p2
571 ])
572
573 flow="in_port($p1),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))"
574 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
575 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
576   [Datapath actions: $p2,$p3
577 ])
578
579 OVS_VSWITCHD_STOP
580 AT_CLEANUP
581
582
583 AT_SETUP([ofproto-dpif - mirroring, output_port])
584 OVS_VSWITCHD_START(
585        [add-port br0 p1 -- set Interface p1 type=dummy --\
586         add-port br0 p2 -- set Interface p2 type=dummy --\
587         add-port br0 p3 -- set Interface p3 type=dummy --\
588         set Bridge br0 mirrors=@m --\
589         --id=@p3 get Port p3 --\
590         --id=@m create Mirror name=mymirror \
591         select_all=true output_port=@p3], [<0>
592 ])
593
594 AT_CHECK(
595   [ovs-vsctl \
596         -- get Interface p1 ofport \
597         -- get Interface p2 ofport \
598         -- get Interface p3 ofport],
599   [0], [stdout])
600 set `cat stdout`
601 p1=$1 p2=$2 p3=$3
602
603 AT_DATA([flows.txt], [dnl
604 in_port=1 actions=mod_vlan_vid:17,output:2
605 in_port=2 actions=output:1
606 ])
607 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
608
609 flow="in_port($p1),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)"
610 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
611 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
612   [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
613 ])
614
615 flow="in_port($p2),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)"
616 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
617 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
618   [Datapath actions: $p1,$p3
619 ])
620
621 OVS_VSWITCHD_STOP
622 AT_CLEANUP
623
624 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
625 OVS_VSWITCHD_START(
626        [add-port br0 p1 -- set Interface p1 type=dummy --\
627         add-port br0 p2 -- set Interface p2 type=dummy --\
628         set Bridge br0 mirrors=@m --\
629         --id=@m create Mirror name=mymirror \
630         select_all=true output_vlan=12], [<0>
631 ])
632
633 AT_CHECK(
634   [ovs-vsctl \
635         -- get Interface p1 ofport \
636         -- get Interface p2 ofport],
637   [0], [stdout])
638 set `cat stdout`
639 br0=0 p1=$1 p2=$2
640
641 AT_DATA([flows.txt], [dnl
642 in_port=1 actions=output:2
643 in_port=2 actions=mod_vlan_vid:17,output:1
644 ])
645 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
646
647 flow="in_port($p1),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)"
648 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
649 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
650
651 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
652 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
653 mv stdout expout
654 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
655
656 flow="in_port($p2),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)"
657 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
658 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
659
660 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
661 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
662 mv stdout expout
663 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
664
665 OVS_VSWITCHD_STOP
666 AT_CLEANUP
667
668 m4_define([OFPROTO_TRACE],
669   [flow="$2"
670    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
671    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
672    expected="$4"
673    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
674      [0], [stdout])
675    mv stdout expout
676    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
677      [0], [expout])])
678
679 AT_SETUP([ofproto-dpif - MAC learning])
680 OVS_VSWITCHD_START(
681   [set bridge br0 fail-mode=standalone -- \
682    add-port br0 p1 -- set Interface p1 type=dummy -- \
683    add-port br0 p2 -- set Interface p2 type=dummy -- \
684    add-port br0 p3 -- set Interface p3 type=dummy])
685
686 AT_CHECK(
687   [ovs-vsctl \
688         -- get Interface p1 ofport \
689         -- get Interface p2 ofport \
690         -- get Interface p3 ofport],
691   [0], [stdout])
692 set `cat stdout`
693 br0=0 p1=$1 p2=$2 p3=$3
694 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)'
695
696 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
697 OFPROTO_TRACE(
698   [br0],
699   [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
700   [-generate],
701   [$br0,$p1,$p2],
702   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
703
704 # Check for the MAC learning entry.
705 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
706  port  VLAN  MAC                Age
707     $p3     0  50:54:00:00:00:05    ?
708 ])
709
710 # Trace a packet arrival destined for the learned MAC.
711 # (This will also learn a MAC.)
712 OFPROTO_TRACE(
713   [br0],
714   [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
715   [-generate],
716   [$p3],
717   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
718
719 # Check for both MAC learning entries.
720 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
721  port  VLAN  MAC                Age
722     $p3     0  50:54:00:00:00:05    ?
723     $p1     0  50:54:00:00:00:06    ?
724 ])
725
726 # Trace a packet arrival that updates the first learned MAC entry.
727 OFPROTO_TRACE(
728   [br0],
729   [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
730   [-generate],
731   [$br0,$p1,$p3],
732   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
733
734 # Check that the MAC learning entry was updated.
735 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
736  port  VLAN  MAC                Age
737     $p1     0  50:54:00:00:00:06    ?
738     $p2     0  50:54:00:00:00:05    ?
739 ])
740
741 # Add another bridge.
742 AT_CHECK(
743   [ovs-vsctl \
744      -- add-br br1 \
745      -- set bridge br1 datapath-type=dummy \
746      -- add-port br1 p4 -- set interface p4 type=dummy \
747      -- add-port br1 p5 -- set interface p5 type=dummy])
748 AT_CHECK(
749   [ovs-vsctl \
750         -- get Interface p4 ofport \
751         -- get Interface p5 ofport],
752   [0], [stdout])
753 set `cat stdout`
754 br1=0 p4=$1 p5=$2
755
756 # Trace some packet arrivals in br1 to create MAC learning entries there too.
757 OFPROTO_TRACE(
758   [br1],
759   [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
760   [-generate],
761   [$br1,$p5],
762   [br1=$br1 p4=$p4 p5=$p5])
763 OFPROTO_TRACE(
764   [br1],
765   [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
766   [-generate],
767   [$br1,$p4],
768   [br1=$br1 p4=$p4 p5=$p5])
769
770 # Check that the MAC learning entries were added.
771 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
772  port  VLAN  MAC                Age
773     $p4     0  50:54:00:00:00:06    ?
774     $p5     0  50:54:00:00:00:07    ?
775 ])
776
777 # Delete port p1 and see that its MAC learning entry disappeared, and
778 # that the MAC learning entry for the same MAC was also deleted from br1.
779 AT_CHECK([ovs-vsctl del-port p1])
780 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
781  port  VLAN  MAC                Age
782     $p2     0  50:54:00:00:00:05    ?
783 ])
784 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
785  port  VLAN  MAC                Age
786     $p5     0  50:54:00:00:00:07    ?
787 ])
788
789 OVS_VSWITCHD_STOP
790 AT_CLEANUP
791
792 dnl Test that basic NetFlow reports flow statistics correctly:
793 dnl - The initial packet of a flow are correctly accounted.
794 dnl - Later packets within a flow are correctly accounted.
795 dnl - Flow actions changing (in this case, due to MAC learning)
796 dnl   cause a record to be sent.
797 AT_SETUP([ofproto-dpif - NetFlow flow expiration])
798
799 AT_SKIP_IF([test "x$RANDOM" = x])
800 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
801
802 OVS_VSWITCHD_START(
803   [set Bridge br0 fail-mode=standalone -- \
804    add-port br0 p1 -- set Interface p1 type=dummy -- \
805    add-port br0 p2 -- set Interface p2 type=dummy -- \
806    set Bridge br0 netflow=@nf -- \
807    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
808      engine_id=1 engine_type=2 active_timeout=30 \
809      add-id-to-interface=false], [<0>
810 ])
811
812 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
813
814 for delay in 1000 30000; do
815     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)'
816     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)'
817
818     ovs-appctl time/warp $delay
819 done
820
821 OVS_VSWITCHD_STOP
822 ovs-appctl -t test-netflow exit
823
824 AT_CHECK([[sed -e 's/, uptime [0-9]*//
825 s/, now [0-9.]*//
826 s/time \([0-9]*\)\.\.\.\1\b/time <moment>/
827 s/time [0-9]*\.\.\.[0-9]*/time <range>/
828 ' netflow.log]], [0],
829   [header: v5, seq 0, engine 2,1
830 rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
831
832 header: v5, seq 1, engine 2,1
833 rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time <range>
834 rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time <moment>
835 ])
836 AT_CLEANUP
837
838 dnl Test that basic NetFlow reports active expirations correctly.
839 AT_SETUP([ofproto-dpif - NetFlow active expiration])
840
841 AT_SKIP_IF([test "x$RANDOM" = x])
842 NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)`
843
844 OVS_VSWITCHD_START(
845   [set Bridge br0 fail-mode=standalone -- \
846    add-port br0 p1 -- set Interface p1 type=dummy -- \
847    add-port br0 p2 -- set Interface p2 type=dummy -- \
848    set Bridge br0 netflow=@nf -- \
849    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
850      engine_id=1 engine_type=2 active_timeout=10 \
851      add-id-to-interface=false], [<0>
852 ])
853
854 AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
855
856 n=1
857 while test $n -le 60; do
858     n=`expr $n + 1`
859
860     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)'
861     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)'
862
863     ovs-appctl time/warp 1000
864 done
865
866 ovs-appctl time/warp 10000
867
868 OVS_VSWITCHD_STOP
869 ovs-appctl -t test-netflow exit
870
871 # Count the number of reported packets:
872 # - From source to destination before MAC learning kicks in (just one).
873 # - From source to destination after that.
874 # - From destination to source.
875 n_learn=0
876 n_in=0
877 n_out=0
878 n_other=0
879 n_recs=0
880 none=0
881 while read line; do
882     pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'`
883     case $pkts in
884          [[0-9]]*) ;;
885          *) continue ;;
886     esac
887
888     case $line in
889         "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
890             counter=n_learn
891             ;;
892         "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*)
893             counter=n_in
894             ;;
895         "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*)
896             counter=n_out
897             ;;
898         *)
899             counter=n_other
900             ;;
901     esac
902     eval $counter=\`expr \$$counter + \$pkts\`
903     n_recs=`expr $n_recs + 1`
904 done < netflow.log
905
906 # There should be exactly 1 MAC learning packet,
907 # exactly 59 other packets in that direction,
908 # and exactly 60 packets in the other direction.
909 AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0
910 ])
911
912 # There should be 1 expiration for MAC learning,
913 # at least 5 active and a final expiration in one direction,
914 # and at least 5 active and a final expiration in the other direction.
915 echo $n_recs
916 AT_CHECK([test $n_recs -ge 13])
917
918 AT_CLEANUP