tests: Fix mirroring tests on big-endian architectures.
[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 cat > flows.txt <<EOF
416 in_port=$p1 actions=output:$p2
417 in_port=$p2 actions=output:$p1
418 EOF
419 AT
420 AT_CAPTURE_FILE([flows.txt])
421 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
422
423 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)"
424 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
425 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
426   [Datapath actions: $p2,$p3
427 ])
428
429 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)"
430 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
431 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
432   [Datapath actions: $p1,$p3
433 ])
434
435 OVS_VSWITCHD_STOP
436 AT_CLEANUP
437
438
439 AT_SETUP([ofproto-dpif - mirroring, select_src])
440 OVS_VSWITCHD_START
441 AT_CHECK([ovs-vsctl \
442         add-port br0 p1 -- set Interface p1 type=dummy --\
443         add-port br0 p2 -- set Interface p2 type=dummy --\
444         add-port br0 p3 -- set Interface p3 type=dummy --\
445         set Bridge br0 mirrors=@m --\
446         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
447         --id=@m create Mirror name=mymirror \
448         select_src_port=@p1 output_port=@p3 ], [0], [stdout])
449 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
450 <0>
451 ])
452
453 AT_CHECK(
454   [ovs-vsctl \
455         -- get Interface p1 ofport \
456         -- get Interface p2 ofport \
457         -- get Interface p3 ofport],
458   [0], [stdout])
459 set `cat stdout`
460 p1=$1 p2=$2 p3=$3
461
462 cat > flows.txt <<EOF
463 in_port=$p1 actions=output:$p2
464 in_port=$p2 actions=output:$p1
465 EOF
466 AT
467 AT_CAPTURE_FILE([flows.txt])
468 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
469
470 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)"
471 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
472 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
473   [Datapath actions: $p2,$p3
474 ])
475
476 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)"
477 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
478 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
479   [Datapath actions: $p1
480 ])
481 OVS_VSWITCHD_STOP
482 AT_CLEANUP
483
484 AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port])
485 OVS_VSWITCHD_START
486 AT_CHECK([ovs-vsctl \
487         add-port br0 p1 -- set Interface p1 type=dummy --\
488         add-port br0 p2 -- set Interface p2 type=dummy --\
489         set Bridge br0 mirrors=@m --\
490         --id=@p2 get Port p2 --\
491         --id=@m create Mirror name=mymirror \
492         select_all=true output_port=@p2 ], [0], [stdout])
493 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
494 <0>
495 ])
496
497 AT_CHECK(
498   [ovs-vsctl \
499         -- get Interface p1 ofport \
500         -- get Interface p2 ofport],
501   [0], [stdout])
502 set `cat stdout`
503 p1=$1 p2=$2
504
505 AT_CHECK([ovs-ofctl add-flow br0 action=output:$p1])
506
507 # "in_port" defaults to OFPP_NONE if it's not specified.
508 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)"
509 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
510 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
511   [Datapath actions: $p1,$p2
512 ])
513
514 OVS_VSWITCHD_STOP
515 AT_CLEANUP
516
517
518 AT_SETUP([ofproto-dpif - mirroring, select_dst])
519 OVS_VSWITCHD_START
520 AT_CHECK([ovs-vsctl \
521         add-port br0 p1 -- set Interface p1 type=dummy --\
522         add-port br0 p2 -- set Interface p2 type=dummy --\
523         add-port br0 p3 -- set Interface p3 type=dummy --\
524         set Bridge br0 mirrors=@m --\
525         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
526         --id=@m create Mirror name=mymirror \
527         select_dst_port=@p2 output_port=@p3 ], [0], [stdout])
528 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
529 <0>
530 ])
531
532 AT_CHECK(
533   [ovs-vsctl \
534         -- get Interface p1 ofport \
535         -- get Interface p2 ofport \
536         -- get Interface p3 ofport],
537   [0], [stdout])
538 set `cat stdout`
539 p1=$1 p2=$2 p3=$3
540
541 cat > flows.txt <<EOF
542 in_port=$p1 actions=output:$p2
543 in_port=$p2 actions=output:$p1
544 EOF
545 AT
546 AT_CAPTURE_FILE([flows.txt])
547 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
548
549 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)"
550 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
551 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
552   [Datapath actions: $p2,$p3
553 ])
554
555 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)"
556 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
557 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
558   [Datapath actions: $p1
559 ])
560
561 OVS_VSWITCHD_STOP
562 AT_CLEANUP
563
564
565 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
566 OVS_VSWITCHD_START
567 AT_CHECK([ovs-vsctl \
568         add-port br0 p1 -- set Interface p1 type=dummy --\
569         add-port br0 p2 -- set Interface p2 type=dummy --\
570         add-port br0 p3 -- set Interface p3 type=dummy --\
571         set Bridge br0 mirrors=@m --\
572         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
573         --id=@m create Mirror name=mymirror \
574         select_all=true select_vlan=11 output_port=@p3 ], [0], [stdout])
575 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
576 <0>
577 ])
578
579 AT_CHECK(
580   [ovs-vsctl \
581         -- get Interface p1 ofport \
582         -- get Interface p2 ofport \
583         -- get Interface p3 ofport],
584   [0], [stdout])
585 set `cat stdout`
586 p1=$1 p2=$2 p3=$3
587
588 cat > flows.txt <<EOF
589 in_port=$p1 actions=output:$p2
590 EOF
591 AT
592 AT_CAPTURE_FILE([flows.txt])
593 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
594
595 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)"
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=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))"
602 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
603 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
604   [Datapath actions: $p2
605 ])
606
607 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))"
608 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
609 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
610   [Datapath actions: $p2,$p3
611 ])
612
613 OVS_VSWITCHD_STOP
614 AT_CLEANUP
615
616
617 AT_SETUP([ofproto-dpif - mirroring, output_port])
618 OVS_VSWITCHD_START
619 AT_CHECK([ovs-vsctl \
620         add-port br0 p1 -- set Interface p1 type=dummy --\
621         add-port br0 p2 -- set Interface p2 type=dummy --\
622         add-port br0 p3 -- set Interface p3 type=dummy --\
623         set Bridge br0 mirrors=@m --\
624         --id=@p3 get Port p3 --\
625         --id=@m create Mirror name=mymirror \
626         select_all=true output_port=@p3 ], [0], [stdout])
627 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
628 <0>
629 ])
630
631 AT_CHECK(
632   [ovs-vsctl \
633         -- get Interface p1 ofport \
634         -- get Interface p2 ofport \
635         -- get Interface p3 ofport],
636   [0], [stdout])
637 set `cat stdout`
638 p1=$1 p2=$2 p3=$3
639
640 cat > flows.txt <<EOF
641 in_port=$p1 actions=mod_vlan_vid:17,output:$p2
642 in_port=$p2 actions=output:$p1
643 EOF
644 AT
645 AT_CAPTURE_FILE([flows.txt])
646 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
647
648 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)"
649 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
650 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
651   [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
652 ])
653
654 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)"
655 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
656 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
657   [Datapath actions: $p1,$p3
658 ])
659
660 OVS_VSWITCHD_STOP
661 AT_CLEANUP
662
663
664 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
665 OVS_VSWITCHD_START
666 AT_CHECK([ovs-vsctl \
667         add-port br0 p1 -- set Interface p1 type=dummy --\
668         add-port br0 p2 -- set Interface p2 type=dummy --\
669         set Bridge br0 mirrors=@m --\
670         --id=@m create Mirror name=mymirror \
671         select_all=true output_vlan=12 ], [0], [stdout])
672 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
673 <0>
674 ])
675
676 AT_CHECK(
677   [ovs-vsctl \
678         -- get Interface p1 ofport \
679         -- get Interface p2 ofport],
680   [0], [stdout])
681 set `cat stdout`
682 br0=0 p1=$1 p2=$2
683
684 cat > flows.txt <<EOF
685 in_port=$p1 actions=output:$p2
686 in_port=$p2 actions=mod_vlan_vid:17,output:$p1
687 EOF
688 AT
689 AT_CAPTURE_FILE([flows.txt])
690 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
691
692 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)"
693 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
694 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
695
696 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
697 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
698 mv stdout expout
699 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
700
701 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)"
702 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
703 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
704
705 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
706 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
707 mv stdout expout
708 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
709
710 OVS_VSWITCHD_STOP
711 AT_CLEANUP
712
713 m4_define([OFPROTO_TRACE],
714   [flow="$2"
715    AT_CHECK([ovs-appctl ofproto/trace $1 "$flow" $3], [0], [stdout])
716    actual=`tail -1 stdout | sed 's/Datapath actions: //'`
717    expected="$4"
718    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" $5],
719      [0], [stdout])
720    mv stdout expout
721    AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" $5],
722      [0], [expout])])
723
724 AT_SETUP([ofproto-dpif - MAC learning])
725 OVS_VSWITCHD_START(
726   [set bridge br0 fail-mode=standalone -- \
727    add-port br0 p1 -- set Interface p1 type=dummy -- \
728    add-port br0 p2 -- set Interface p2 type=dummy -- \
729    add-port br0 p3 -- set Interface p3 type=dummy])
730
731 AT_CHECK(
732   [ovs-vsctl \
733         -- get Interface p1 ofport \
734         -- get Interface p2 ofport \
735         -- get Interface p3 ofport],
736   [0], [stdout])
737 set `cat stdout`
738 br0=0 p1=$1 p2=$2 p3=$3
739 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)'
740
741 # Trace an ARP packet arriving on p3, to create a MAC learning entry.
742 OFPROTO_TRACE(
743   [br0],
744   [in_port($p3),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
745   [-generate],
746   [$br0,$p1,$p2],
747   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
748
749 # Check for the MAC learning entry.
750 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
751  port  VLAN  MAC                Age
752     $p3     0  50:54:00:00:00:05    ?
753 ])
754
755 # Trace a packet arrival destined for the learned MAC.
756 # (This will also learn a MAC.)
757 OFPROTO_TRACE(
758   [br0],
759   [in_port($p1),eth(src=50:54:00:00:00:06,dst=50:54:00:00:00:05),$arp],
760   [-generate],
761   [$p3],
762   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
763
764 # Check for both MAC learning entries.
765 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
766  port  VLAN  MAC                Age
767     $p3     0  50:54:00:00:00:05    ?
768     $p1     0  50:54:00:00:00:06    ?
769 ])
770
771 # Trace a packet arrival that updates the first learned MAC entry.
772 OFPROTO_TRACE(
773   [br0],
774   [in_port($p2),eth(src=50:54:00:00:00:05,dst=ff:ff:ff:ff:ff:ff),$arp],
775   [-generate],
776   [$br0,$p1,$p3],
777   [br0=$br0 p1=$p1 p2=$p2 p3=$p3])
778
779 # Check that the MAC learning entry was updated.
780 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
781  port  VLAN  MAC                Age
782     $p1     0  50:54:00:00:00:06    ?
783     $p2     0  50:54:00:00:00:05    ?
784 ])
785
786 # Add another bridge.
787 AT_CHECK(
788   [ovs-vsctl \
789      -- add-br br1 \
790      -- set bridge br1 datapath-type=dummy \
791      -- add-port br1 p4 -- set interface p4 type=dummy \
792      -- add-port br1 p5 -- set interface p5 type=dummy])
793 AT_CHECK(
794   [ovs-vsctl \
795         -- get Interface p4 ofport \
796         -- get Interface p5 ofport],
797   [0], [stdout])
798 set `cat stdout`
799 br1=0 p4=$1 p5=$2
800
801 # Trace some packet arrivals in br1 to create MAC learning entries there too.
802 OFPROTO_TRACE(
803   [br1],
804   [in_port($p4),eth(src=50:54:00:00:00:06,dst=ff:ff:ff:ff:ff:ff),$arp],
805   [-generate],
806   [$br1,$p5],
807   [br1=$br1 p4=$p4 p5=$p5])
808 OFPROTO_TRACE(
809   [br1],
810   [in_port($p5),eth(src=50:54:00:00:00:07,dst=ff:ff:ff:ff:ff:ff),$arp],
811   [-generate],
812   [$br1,$p4],
813   [br1=$br1 p4=$p4 p5=$p5])
814
815 # Check that the MAC learning entries were added.
816 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
817  port  VLAN  MAC                Age
818     $p4     0  50:54:00:00:00:06    ?
819     $p5     0  50:54:00:00:00:07    ?
820 ])
821
822 # Delete port p1 and see that its MAC learning entry disappeared, and
823 # that the MAC learning entry for the same MAC was also deleted from br1.
824 AT_CHECK([ovs-vsctl del-port p1])
825 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]$/?/'], [0], [dnl
826  port  VLAN  MAC                Age
827     $p2     0  50:54:00:00:00:05    ?
828 ])
829 AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl
830  port  VLAN  MAC                Age
831     $p5     0  50:54:00:00:00:07    ?
832 ])
833
834 OVS_VSWITCHD_STOP
835 AT_CLEANUP