tests: Add expected output parameter to OVS_VSWITCHD_START.
[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
464 AT_SETUP([ofproto-dpif - mirroring, select_dst])
465 OVS_VSWITCHD_START(
466        [add-port br0 p1 -- set Interface p1 type=dummy --\
467         add-port br0 p2 -- set Interface p2 type=dummy --\
468         add-port br0 p3 -- set Interface p3 type=dummy --\
469         set Bridge br0 mirrors=@m --\
470         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
471         --id=@m create Mirror name=mymirror \
472         select_dst_port=@p2 output_port=@p3], [<0>
473 ])
474
475 AT_CHECK(
476   [ovs-vsctl \
477         -- get Interface p1 ofport \
478         -- get Interface p2 ofport \
479         -- get Interface p3 ofport],
480   [0], [stdout])
481 set `cat stdout`
482 p1=$1 p2=$2 p3=$3
483
484 AT_DATA([flows.txt], [dnl
485 in_port=1 actions=output:2
486 in_port=2 actions=output:1
487 ])
488 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
489
490 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)"
491 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
492 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
493   [Datapath actions: $p2,$p3
494 ])
495
496 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)"
497 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
498 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
499   [Datapath actions: $p1
500 ])
501
502 OVS_VSWITCHD_STOP
503 AT_CLEANUP
504
505
506 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
507 OVS_VSWITCHD_START(
508        [add-port br0 p1 -- set Interface p1 type=dummy --\
509         add-port br0 p2 -- set Interface p2 type=dummy --\
510         add-port br0 p3 -- set Interface p3 type=dummy --\
511         set Bridge br0 mirrors=@m --\
512         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
513         --id=@m create Mirror name=mymirror \
514         select_all=true select_vlan=11 output_port=@p3], [<0>
515 ])
516
517 AT_CHECK(
518   [ovs-vsctl \
519         -- get Interface p1 ofport \
520         -- get Interface p2 ofport \
521         -- get Interface p3 ofport],
522   [0], [stdout])
523 set `cat stdout`
524 p1=$1 p2=$2 p3=$3
525
526 AT_DATA([flows.txt], [dnl
527 in_port=1, actions=output:2
528 ])
529 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
530
531 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)"
532 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
533 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
534   [Datapath actions: $p2
535 ])
536
537 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))"
538 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
539 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
540   [Datapath actions: $p2
541 ])
542
543 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))"
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 OVS_VSWITCHD_STOP
550 AT_CLEANUP
551
552
553 AT_SETUP([ofproto-dpif - mirroring, output_port])
554 OVS_VSWITCHD_START(
555        [add-port br0 p1 -- set Interface p1 type=dummy --\
556         add-port br0 p2 -- set Interface p2 type=dummy --\
557         add-port br0 p3 -- set Interface p3 type=dummy --\
558         set Bridge br0 mirrors=@m --\
559         --id=@p3 get Port p3 --\
560         --id=@m create Mirror name=mymirror \
561         select_all=true output_port=@p3], [<0>
562 ])
563
564 AT_CHECK(
565   [ovs-vsctl \
566         -- get Interface p1 ofport \
567         -- get Interface p2 ofport \
568         -- get Interface p3 ofport],
569   [0], [stdout])
570 set `cat stdout`
571 p1=$1 p2=$2 p3=$3
572
573 AT_DATA([flows.txt], [dnl
574 in_port=1 actions=mod_vlan_vid:17,output:2
575 in_port=2 actions=output:1
576 ])
577 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
578
579 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)"
580 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
581 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
582   [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
583 ])
584
585 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)"
586 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
587 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
588   [Datapath actions: $p1,$p3
589 ])
590
591 OVS_VSWITCHD_STOP
592 AT_CLEANUP
593
594 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
595 OVS_VSWITCHD_START(
596        [add-port br0 p1 -- set Interface p1 type=dummy --\
597         add-port br0 p2 -- set Interface p2 type=dummy --\
598         set Bridge br0 mirrors=@m --\
599         --id=@m create Mirror name=mymirror \
600         select_all=true output_vlan=12], [<0>
601 ])
602
603 AT_CHECK(
604   [ovs-vsctl \
605         -- get Interface p1 ofport \
606         -- get Interface p2 ofport],
607   [0], [stdout])
608 set `cat stdout`
609 br0=0 p1=$1 p2=$2
610
611 AT_DATA([flows.txt], [dnl
612 in_port=1 actions=output:2
613 in_port=2 actions=mod_vlan_vid:17,output:1
614 ])
615 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
616
617 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)"
618 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
619 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
620
621 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
622 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
623 mv stdout expout
624 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
625
626 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)"
627 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
628 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
629
630 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
631 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
632 mv stdout expout
633 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
634
635 OVS_VSWITCHD_STOP
636 AT_CLEANUP
637
638 m4_define([OFPROTO_TRACE],
639   [flow="$2"
640    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
641    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
642    expected="$4"
643    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
644      [0], [stdout])
645    mv stdout expout
646    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
647      [0], [expout])])
648
649 AT_SETUP([ofproto-dpif - MAC learning])
650 OVS_VSWITCHD_START(
651   [set bridge br0 fail-mode=standalone -- \
652    add-port br0 p1 -- set Interface p1 type=dummy -- \
653    add-port br0 p2 -- set Interface p2 type=dummy -- \
654    add-port br0 p3 -- set Interface p3 type=dummy])
655
656 AT_CHECK(
657   [ovs-vsctl \
658         -- get Interface p1 ofport \
659         -- get Interface p2 ofport \
660         -- get Interface p3 ofport],
661   [0], [stdout])
662 set `cat stdout`
663 br0=0 p1=$1 p2=$2 p3=$3
664 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)'
665
666 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
667 OFPROTO_TRACE(
668   [br0],
669   [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
670   [-generate],
671   [$br0,$p1,$p2],
672   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
673
674 # Check for the MAC learning entry.
675 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
676  port  VLAN  MAC                Age
677     $p3     0  50:54:00:00:00:05    ?
678 ])
679
680 # Trace a packet arrival destined for the learned MAC.
681 # (This will also learn a MAC.)
682 OFPROTO_TRACE(
683   [br0],
684   [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
685   [-generate],
686   [$p3],
687   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
688
689 # Check for both MAC learning entries.
690 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
691  port  VLAN  MAC                Age
692     $p3     0  50:54:00:00:00:05    ?
693     $p1     0  50:54:00:00:00:06    ?
694 ])
695
696 # Trace a packet arrival that updates the first learned MAC entry.
697 OFPROTO_TRACE(
698   [br0],
699   [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
700   [-generate],
701   [$br0,$p1,$p3],
702   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
703
704 # Check that the MAC learning entry was updated.
705 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
706  port  VLAN  MAC                Age
707     $p1     0  50:54:00:00:00:06    ?
708     $p2     0  50:54:00:00:00:05    ?
709 ])
710
711 # Add another bridge.
712 AT_CHECK(
713   [ovs-vsctl \
714      -- add-br br1 \
715      -- set bridge br1 datapath-type=dummy \
716      -- add-port br1 p4 -- set interface p4 type=dummy \
717      -- add-port br1 p5 -- set interface p5 type=dummy])
718 AT_CHECK(
719   [ovs-vsctl \
720         -- get Interface p4 ofport \
721         -- get Interface p5 ofport],
722   [0], [stdout])
723 set `cat stdout`
724 br1=0 p4=$1 p5=$2
725
726 # Trace some packet arrivals in br1 to create MAC learning entries there too.
727 OFPROTO_TRACE(
728   [br1],
729   [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
730   [-generate],
731   [$br1,$p5],
732   [br1=$br1 p4=$p4 p5=$p5])
733 OFPROTO_TRACE(
734   [br1],
735   [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
736   [-generate],
737   [$br1,$p4],
738   [br1=$br1 p4=$p4 p5=$p5])
739
740 # Check that the MAC learning entries were added.
741 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
742  port  VLAN  MAC                Age
743     $p4     0  50:54:00:00:00:06    ?
744     $p5     0  50:54:00:00:00:07    ?
745 ])
746
747 # Delete port p1 and see that its MAC learning entry disappeared, and
748 # that the MAC learning entry for the same MAC was also deleted from br1.
749 AT_CHECK([ovs-vsctl del-port p1])
750 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
751  port  VLAN  MAC                Age
752     $p2     0  50:54:00:00:00:05    ?
753 ])
754 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
755  port  VLAN  MAC                Age
756     $p5     0  50:54:00:00:00:07    ?
757 ])
758
759 OVS_VSWITCHD_STOP
760 AT_CLEANUP