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