debian: Fix log rotation.
[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=local actions=local,flood
109 in_port=1 actions=flood
110 in_port=2 actions=all
111 in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7
112 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
113 ])
114 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
115 AT_CHECK([ovs-ofctl mod-port br0 5 noforward])
116 AT_CHECK([ovs-ofctl mod-port br0 6 noflood])
117
118 AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(0),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout])
119 AT_CHECK([tail -1 stdout \
120 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
121 1
122 2
123 3
124 4
125 7
126 ])
127
128 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])
129 AT_CHECK([tail -1 stdout \
130 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
131 0
132 2
133 3
134 4
135 7
136 ])
137
138 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])
139 AT_CHECK([tail -1 stdout \
140 | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl
141 0
142 1
143 3
144 4
145 6
146 7
147 ])
148
149 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])
150 AT_CHECK([tail -1 stdout], [0],
151   [Datapath actions: 0,1,2,4,6,7
152 ])
153
154 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])
155 AT_CHECK([tail -1 stdout], [0],
156   [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7
157 ])
158 OVS_VSWITCHD_STOP
159 AT_CLEANUP
160
161 AT_SETUP([ofproto-dpif - set_tunnel])
162 OVS_VSWITCHD_START
163 AT_DATA([flows.txt], [dnl
164 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
165 in_port=1 actions=set_tunnel:1,output:1
166 in_port=2 actions=set_tunnel:1,output:2
167 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
168 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
169 in_port=5 actions=set_tunnel:5
170 ])
171 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
172 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])
173 AT_CHECK([tail -1 stdout], [0],
174   [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
175 ])
176 OVS_VSWITCHD_STOP
177 AT_CLEANUP
178
179 AT_SETUP([ofproto-dpif - VLAN handling])
180 OVS_VSWITCHD_START(
181   [set Bridge br0 fail-mode=standalone -- \
182    add-port br0 p1                                  trunks=10,12 -- \
183    add-port br0 p2                           tag=10              -- \
184    add-port br0 p3                           tag=12              \
185                    other-config:priority-tags=true               -- \
186    add-port br0 p4                           tag=12              -- \
187    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
188    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
189    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
190    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
191                    other-config:priority-tags=true               -- \
192    set Interface p1 type=dummy -- \
193    set Interface p2 type=dummy -- \
194    set Interface p3 type=dummy -- \
195    set Interface p4 type=dummy -- \
196    set Interface p5 type=dummy -- \
197    set Interface p6 type=dummy -- \
198    set Interface p7 type=dummy -- \
199    set Interface p8 type=dummy --])
200
201 AT_CHECK(
202   [ovs-vsctl \
203         -- get Interface p1 ofport \
204         -- get Interface p2 ofport \
205         -- get Interface p3 ofport \
206         -- get Interface p4 ofport \
207         -- get Interface p5 ofport \
208         -- get Interface p6 ofport \
209         -- get Interface p7 ofport \
210         -- get Interface p8 ofport],
211   [0], [stdout])
212 set `cat stdout`
213 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
214
215 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
216 dnl PCP (used if the VID isn't "none") and the expected set of datapath
217 dnl actions.
218 for tuple in \
219         "br0 none 0 drop" \
220         "br0 0    0 drop" \
221         "br0 0    1 drop" \
222         "br0 10   0 p1,p5,p6,p7,p8,pop_vlan,p2" \
223         "br0 10   1 p1,p5,p6,p7,p8,pop_vlan,p2" \
224         "br0 11   0 p5,p7" \
225         "br0 11   1 p5,p7" \
226         "br0 12   0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
227         "br0 12   1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
228         "p1  none 0 drop" \
229         "p1  0    0 drop" \
230         "p1  0    1 drop" \
231         "p1  10   0 br0,p5,p6,p7,p8,pop_vlan,p2" \
232         "p1  10   1 br0,p5,p6,p7,p8,pop_vlan,p2" \
233         "p1  11   0 drop" \
234         "p1  11   1 drop" \
235         "p1  12   0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
236         "p1  12   1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
237         "p2  none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
238         "p2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
239         "p2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
240         "p2  10   0 drop" \
241         "p2  10   1 drop" \
242         "p2  11   0 drop" \
243         "p2  11   1 drop" \
244         "p2  12   0 drop" \
245         "p2  12   1 drop" \
246         "p3  none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
247         "p3  0    0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
248         "p3  0    1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
249         "p3  10   0 drop" \
250         "p3  10   1 drop" \
251         "p3  11   0 drop" \
252         "p3  11   1 drop" \
253         "p3  12   0 drop" \
254         "p3  12   1 drop" \
255         "p4  none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
256         "p4  0    0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
257         "p4  0    1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
258         "p4  10   0 drop" \
259         "p4  10   1 drop" \
260         "p4  11   0 drop" \
261         "p4  11   1 drop" \
262         "p4  12   0 drop" \
263         "p4  12   1 drop" \
264         "p5  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
265         "p5  0    0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
266         "p5  0    1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
267         "p5  10   0 br0,p1,p6,p7,p8,pop_vlan,p2" \
268         "p5  10   1 br0,p1,p6,p7,p8,pop_vlan,p2" \
269         "p5  11   0 br0,p7" \
270         "p5  11   1 br0,p7" \
271         "p5  12   0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
272         "p5  12   1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
273         "p6  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
274         "p6  0    0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
275         "p6  0    1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
276         "p6  10   0 br0,p1,p5,p7,p8,pop_vlan,p2" \
277         "p6  10   1 br0,p1,p5,p7,p8,pop_vlan,p2" \
278         "p6  11   0 drop" \
279         "p6  11   1 drop" \
280         "p6  12   0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
281         "p6  12   1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \
282         "p7  none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
283         "p7  0    0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
284         "p7  0    1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
285         "p7  10   0 br0,p1,p5,p6,p8,pop_vlan,p2" \
286         "p7  10   1 br0,p1,p5,p6,p8,pop_vlan,p2" \
287         "p7  11   0 br0,p5" \
288         "p7  11   1 br0,p5" \
289         "p7  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
290         "p7  12   1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \
291         "p8  none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
292         "p8  0    0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
293         "p8  0    1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
294         "p8  10   0 br0,p1,p5,p6,p7,pop_vlan,p2" \
295         "p8  10   1 br0,p1,p5,p6,p7,pop_vlan,p2" \
296         "p8  11   0 drop" \
297         "p8  11   1 drop" \
298         "p8  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
299         "p8  12   1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3"
300 do
301   set $tuple
302   in_port=$1
303   vlan=$2
304   pcp=$3
305   expected=$4
306
307   eval n_in_port=\$$in_port
308   if test $vlan = none; then
309     flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
310   else
311     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))"
312   fi
313
314   echo "----------------------------------------------------------------------"
315   echo "in_port=$in_port vlan=$vlan pcp=$pcp"
316
317   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
318   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
319
320   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])
321   mv stdout expout
322   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])
323 done
324
325 OVS_VSWITCHD_STOP
326 AT_CLEANUP
327
328 AT_SETUP([ofproto-dpif - fragment handling])
329 OVS_VSWITCHD_START
330 AT_DATA([flows.txt], [dnl
331 priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
332 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
333 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
334 priority=50 tcp ip_frag=no              actions=output:4
335 priority=50 tcp ip_frag=first           actions=output:5
336 priority=50 tcp ip_frag=later           actions=output:6
337 ])
338 AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])
339
340 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"
341 no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
342 first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
343 later_flow="$base_flow,frag=later)"
344
345     # mode    no  first  later
346 for tuple in \
347     'normal    1     5      6' \
348     'drop      1  drop   drop' \
349     'nx-match  1     2      6'
350 do
351   set $tuple
352   mode=$1
353   no=$2
354   first=$3
355   later=$4
356
357   AT_CHECK([ovs-ofctl set-frags br0 $mode])
358   for type in no first later; do
359     eval flow=\$${type}_flow exp_output=\$$type
360     AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
361     AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
362 ])
363   done
364 done
365 OVS_VSWITCHD_STOP
366 AT_CLEANUP
367
368 AT_SETUP([ofproto-dpif - exit])
369 OVS_VSWITCHD_START
370 AT_DATA([flows.txt], [dnl
371 in_port=1 actions=output:10,exit,output:11
372 in_port=2 actions=output:12,resubmit:1,output:12
373 in_port=3 actions=output:13,resubmit:2,output:14
374 ])
375 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
376 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])
377 AT_CHECK([tail -1 stdout], [0],
378   [Datapath actions: 10
379 ])
380 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])
381 AT_CHECK([tail -1 stdout], [0],
382   [Datapath actions: 12,10
383 ])
384 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])
385 AT_CHECK([tail -1 stdout], [0],
386   [Datapath actions: 13,12,10
387 ])
388 OVS_VSWITCHD_STOP
389 AT_CLEANUP
390
391
392 AT_SETUP([ofproto-dpif - mirroring, select_all])
393 OVS_VSWITCHD_START
394 AT_CHECK([ovs-vsctl \
395         add-port br0 p1 -- set Interface p1 type=dummy --\
396         add-port br0 p2 -- set Interface p2 type=dummy --\
397         add-port br0 p3 -- set Interface p3 type=dummy --\
398         set Bridge br0 mirrors=@m --\
399         --id=@p3 get Port p3 --\
400         --id=@m create Mirror name=mymirror \
401         select_all=true output_port=@p3 ], [0], [stdout])
402 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
403 <0>
404 ])
405
406 AT_CHECK(
407   [ovs-vsctl \
408         -- get Interface p1 ofport \
409         -- get Interface p2 ofport \
410         -- get Interface p3 ofport],
411   [0], [stdout])
412 set `cat stdout`
413 p1=$1 p2=$2 p3=$3
414
415 AT_DATA([flows.txt], [dnl
416 in_port=1 actions=output:2
417 in_port=2 actions=output:1
418 ])
419 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
420
421 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)"
422 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
423 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
424   [Datapath actions: $p2,$p3
425 ])
426
427 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)"
428 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
429 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
430   [Datapath actions: $p1,$p3
431 ])
432
433 OVS_VSWITCHD_STOP
434 AT_CLEANUP
435
436
437 AT_SETUP([ofproto-dpif - mirroring, select_src])
438 OVS_VSWITCHD_START
439 AT_CHECK([ovs-vsctl \
440         add-port br0 p1 -- set Interface p1 type=dummy --\
441         add-port br0 p2 -- set Interface p2 type=dummy --\
442         add-port br0 p3 -- set Interface p3 type=dummy --\
443         set Bridge br0 mirrors=@m --\
444         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
445         --id=@m create Mirror name=mymirror \
446         select_src_port=@p1 output_port=@p3 ], [0], [stdout])
447 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
448 <0>
449 ])
450
451 AT_CHECK(
452   [ovs-vsctl \
453         -- get Interface p1 ofport \
454         -- get Interface p2 ofport \
455         -- get Interface p3 ofport],
456   [0], [stdout])
457 set `cat stdout`
458 p1=$1 p2=$2 p3=$3
459
460 AT_DATA([flows.txt], [dnl
461 in_port=1 actions=output:2
462 in_port=2 actions=output:1
463 ])
464 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
465
466 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)"
467 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
468 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
469   [Datapath actions: $p2,$p3
470 ])
471
472 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)"
473 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
474 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
475   [Datapath actions: $p1
476 ])
477 OVS_VSWITCHD_STOP
478 AT_CLEANUP
479
480 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
481 OVS_VSWITCHD_START
482 AT_CHECK([ovs-vsctl \
483         add-port br0 p1 -- set Interface p1 type=dummy --\
484         add-port br0 p2 -- set Interface p2 type=dummy --\
485         set Bridge br0 mirrors=@m --\
486         --id=@p2 get Port p2 --\
487         --id=@m create Mirror name=mymirror \
488         select_all=true output_port=@p2 ], [0], [stdout])
489 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
490 <0>
491 ])
492
493 AT_CHECK(
494   [ovs-vsctl \
495         -- get Interface p1 ofport \
496         -- get Interface p2 ofport],
497   [0], [stdout])
498 set `cat stdout`
499 p1=$1 p2=$2
500
501 AT_CHECK([ovs-ofctl add-flow br0 action=output:1])
502
503 # "in_port" defaults to OFPP_NONE if it's not specified.
504 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)"
505 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
506 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
507   [Datapath actions: $p1,$p2
508 ])
509
510 OVS_VSWITCHD_STOP
511 AT_CLEANUP
512
513
514 AT_SETUP([ofproto-dpif - mirroring, select_dst])
515 OVS_VSWITCHD_START
516 AT_CHECK([ovs-vsctl \
517         add-port br0 p1 -- set Interface p1 type=dummy --\
518         add-port br0 p2 -- set Interface p2 type=dummy --\
519         add-port br0 p3 -- set Interface p3 type=dummy --\
520         set Bridge br0 mirrors=@m --\
521         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
522         --id=@m create Mirror name=mymirror \
523         select_dst_port=@p2 output_port=@p3 ], [0], [stdout])
524 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
525 <0>
526 ])
527
528 AT_CHECK(
529   [ovs-vsctl \
530         -- get Interface p1 ofport \
531         -- get Interface p2 ofport \
532         -- get Interface p3 ofport],
533   [0], [stdout])
534 set `cat stdout`
535 p1=$1 p2=$2 p3=$3
536
537 AT_DATA([flows.txt], [dnl
538 in_port=1 actions=output:2
539 in_port=2 actions=output:1
540 ])
541 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
542
543 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)"
544 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
545 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
546   [Datapath actions: $p2,$p3
547 ])
548
549 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)"
550 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
551 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
552   [Datapath actions: $p1
553 ])
554
555 OVS_VSWITCHD_STOP
556 AT_CLEANUP
557
558
559 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
560 OVS_VSWITCHD_START
561 AT_CHECK([ovs-vsctl \
562         add-port br0 p1 -- set Interface p1 type=dummy --\
563         add-port br0 p2 -- set Interface p2 type=dummy --\
564         add-port br0 p3 -- set Interface p3 type=dummy --\
565         set Bridge br0 mirrors=@m --\
566         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
567         --id=@m create Mirror name=mymirror \
568         select_all=true select_vlan=11 output_port=@p3 ], [0], [stdout])
569 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
570 <0>
571 ])
572
573 AT_CHECK(
574   [ovs-vsctl \
575         -- get Interface p1 ofport \
576         -- get Interface p2 ofport \
577         -- get Interface p3 ofport],
578   [0], [stdout])
579 set `cat stdout`
580 p1=$1 p2=$2 p3=$3
581
582 AT_DATA([flows.txt], [dnl
583 in_port=1, actions=output:2
584 ])
585 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
586
587 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)"
588 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
589 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
590   [Datapath actions: $p2
591 ])
592
593 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))"
594 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
595 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
596   [Datapath actions: $p2
597 ])
598
599 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))"
600 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
601 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
602   [Datapath actions: $p2,$p3
603 ])
604
605 OVS_VSWITCHD_STOP
606 AT_CLEANUP
607
608
609 AT_SETUP([ofproto-dpif - mirroring, output_port])
610 OVS_VSWITCHD_START
611 AT_CHECK([ovs-vsctl \
612         add-port br0 p1 -- set Interface p1 type=dummy --\
613         add-port br0 p2 -- set Interface p2 type=dummy --\
614         add-port br0 p3 -- set Interface p3 type=dummy --\
615         set Bridge br0 mirrors=@m --\
616         --id=@p3 get Port p3 --\
617         --id=@m create Mirror name=mymirror \
618         select_all=true output_port=@p3 ], [0], [stdout])
619 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
620 <0>
621 ])
622
623 AT_CHECK(
624   [ovs-vsctl \
625         -- get Interface p1 ofport \
626         -- get Interface p2 ofport \
627         -- get Interface p3 ofport],
628   [0], [stdout])
629 set `cat stdout`
630 p1=$1 p2=$2 p3=$3
631
632 AT_DATA([flows.txt], [dnl
633 in_port=1 actions=mod_vlan_vid:17,output:2
634 in_port=2 actions=output:1
635 ])
636 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
637
638 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)"
639 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
640 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
641   [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
642 ])
643
644 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)"
645 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
646 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
647   [Datapath actions: $p1,$p3
648 ])
649
650 OVS_VSWITCHD_STOP
651 AT_CLEANUP
652
653
654 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
655 OVS_VSWITCHD_START
656 AT_CHECK([ovs-vsctl \
657         add-port br0 p1 -- set Interface p1 type=dummy --\
658         add-port br0 p2 -- set Interface p2 type=dummy --\
659         set Bridge br0 mirrors=@m --\
660         --id=@m create Mirror name=mymirror \
661         select_all=true output_vlan=12 ], [0], [stdout])
662 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
663 <0>
664 ])
665
666 AT_CHECK(
667   [ovs-vsctl \
668         -- get Interface p1 ofport \
669         -- get Interface p2 ofport],
670   [0], [stdout])
671 set `cat stdout`
672 br0=0 p1=$1 p2=$2
673
674 AT_DATA([flows.txt], [dnl
675 in_port=1 actions=output:2
676 in_port=2 actions=mod_vlan_vid:17,output:1
677 ])
678 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
679
680 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)"
681 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
682 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
683
684 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
685 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
686 mv stdout expout
687 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
688
689 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)"
690 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
691 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
692
693 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
694 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
695 mv stdout expout
696 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
697
698 OVS_VSWITCHD_STOP
699 AT_CLEANUP
700
701 m4_define([OFPROTO_TRACE],
702   [flow="$2"
703    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
704    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
705    expected="$4"
706    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
707      [0], [stdout])
708    mv stdout expout
709    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
710      [0], [expout])])
711
712 AT_SETUP([ofproto-dpif - MAC learning])
713 OVS_VSWITCHD_START(
714   [set bridge br0 fail-mode=standalone -- \
715    add-port br0 p1 -- set Interface p1 type=dummy -- \
716    add-port br0 p2 -- set Interface p2 type=dummy -- \
717    add-port br0 p3 -- set Interface p3 type=dummy])
718
719 AT_CHECK(
720   [ovs-vsctl \
721         -- get Interface p1 ofport \
722         -- get Interface p2 ofport \
723         -- get Interface p3 ofport],
724   [0], [stdout])
725 set `cat stdout`
726 br0=0 p1=$1 p2=$2 p3=$3
727 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)'
728
729 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
730 OFPROTO_TRACE(
731   [br0],
732   [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
733   [-generate],
734   [$br0,$p1,$p2],
735   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
736
737 # Check for the MAC learning entry.
738 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
739  port  VLAN  MAC                Age
740     $p3     0  50:54:00:00:00:05    ?
741 ])
742
743 # Trace a packet arrival destined for the learned MAC.
744 # (This will also learn a MAC.)
745 OFPROTO_TRACE(
746   [br0],
747   [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
748   [-generate],
749   [$p3],
750   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
751
752 # Check for both MAC learning entries.
753 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
754  port  VLAN  MAC                Age
755     $p3     0  50:54:00:00:00:05    ?
756     $p1     0  50:54:00:00:00:06    ?
757 ])
758
759 # Trace a packet arrival that updates the first learned MAC entry.
760 OFPROTO_TRACE(
761   [br0],
762   [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
763   [-generate],
764   [$br0,$p1,$p3],
765   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
766
767 # Check that the MAC learning entry was updated.
768 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
769  port  VLAN  MAC                Age
770     $p1     0  50:54:00:00:00:06    ?
771     $p2     0  50:54:00:00:00:05    ?
772 ])
773
774 # Add another bridge.
775 AT_CHECK(
776   [ovs-vsctl \
777      -- add-br br1 \
778      -- set bridge br1 datapath-type=dummy \
779      -- add-port br1 p4 -- set interface p4 type=dummy \
780      -- add-port br1 p5 -- set interface p5 type=dummy])
781 AT_CHECK(
782   [ovs-vsctl \
783         -- get Interface p4 ofport \
784         -- get Interface p5 ofport],
785   [0], [stdout])
786 set `cat stdout`
787 br1=0 p4=$1 p5=$2
788
789 # Trace some packet arrivals in br1 to create MAC learning entries there too.
790 OFPROTO_TRACE(
791   [br1],
792   [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
793   [-generate],
794   [$br1,$p5],
795   [br1=$br1 p4=$p4 p5=$p5])
796 OFPROTO_TRACE(
797   [br1],
798   [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
799   [-generate],
800   [$br1,$p4],
801   [br1=$br1 p4=$p4 p5=$p5])
802
803 # Check that the MAC learning entries were added.
804 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
805  port  VLAN  MAC                Age
806     $p4     0  50:54:00:00:00:06    ?
807     $p5     0  50:54:00:00:00:07    ?
808 ])
809
810 # Delete port p1 and see that its MAC learning entry disappeared, and
811 # that the MAC learning entry for the same MAC was also deleted from br1.
812 AT_CHECK([ovs-vsctl del-port p1])
813 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
814  port  VLAN  MAC                Age
815     $p2     0  50:54:00:00:00:05    ?
816 ])
817 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
818  port  VLAN  MAC                Age
819     $p5     0  50:54:00:00:00:07    ?
820 ])
821
822 OVS_VSWITCHD_STOP
823 AT_CLEANUP