mirroring: Don't require the "normal" action to perform mirroring.
[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 AT_CHECK([ovs-vsctl \
384         add-port br0 p1 -- set Interface p1 type=dummy --\
385         add-port br0 p2 -- set Interface p2 type=dummy --\
386         add-port br0 p3 -- set Interface p3 type=dummy --\
387         set Bridge br0 mirrors=@m --\
388         --id=@p3 get Port p3 --\
389         --id=@m create Mirror name=mymirror \
390         select_all=true output_port=@p3 ], [0], [stdout])
391 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
392 <0>
393 ])
394
395 AT_CHECK(
396   [ovs-vsctl \
397         -- get Interface p1 ofport \
398         -- get Interface p2 ofport \
399         -- get Interface p3 ofport],
400   [0], [stdout])
401 set `cat stdout`
402 p1=$1 p2=$2 p3=$3
403
404 AT_DATA([flows.txt], [dnl
405 in_port=1 actions=output:2
406 in_port=2 actions=output:1
407 ])
408 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
409
410 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)"
411 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
412 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
413   [Datapath actions: $p2,$p3
414 ])
415
416 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)"
417 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
418 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
419   [Datapath actions: $p1,$p3
420 ])
421
422 OVS_VSWITCHD_STOP
423 AT_CLEANUP
424
425
426 AT_SETUP([ofproto-dpif - mirroring, select_src])
427 OVS_VSWITCHD_START
428 AT_CHECK([ovs-vsctl \
429         add-port br0 p1 -- set Interface p1 type=dummy --\
430         add-port br0 p2 -- set Interface p2 type=dummy --\
431         add-port br0 p3 -- set Interface p3 type=dummy --\
432         set Bridge br0 mirrors=@m --\
433         --id=@p1 get Port p1 -- --id=@p3 get Port p3 --\
434         --id=@m create Mirror name=mymirror \
435         select_src_port=@p1 output_port=@p3 ], [0], [stdout])
436 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
437 <0>
438 ])
439
440 AT_CHECK(
441   [ovs-vsctl \
442         -- get Interface p1 ofport \
443         -- get Interface p2 ofport \
444         -- get Interface p3 ofport],
445   [0], [stdout])
446 set `cat stdout`
447 p1=$1 p2=$2 p3=$3
448
449 AT_DATA([flows.txt], [dnl
450 in_port=1 actions=output:2
451 in_port=2 actions=output:1
452 ])
453 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
454
455 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)"
456 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
457 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
458   [Datapath actions: $p2,$p3
459 ])
460
461 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)"
462 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
463 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
464   [Datapath actions: $p1
465 ])
466 OVS_VSWITCHD_STOP
467 AT_CLEANUP
468
469
470 AT_SETUP([ofproto-dpif - mirroring, select_dst])
471 OVS_VSWITCHD_START
472 AT_CHECK([ovs-vsctl \
473         add-port br0 p1 -- set Interface p1 type=dummy --\
474         add-port br0 p2 -- set Interface p2 type=dummy --\
475         add-port br0 p3 -- set Interface p3 type=dummy --\
476         set Bridge br0 mirrors=@m --\
477         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
478         --id=@m create Mirror name=mymirror \
479         select_dst_port=@p2 output_port=@p3 ], [0], [stdout])
480 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
481 <0>
482 ])
483
484 AT_CHECK(
485   [ovs-vsctl \
486         -- get Interface p1 ofport \
487         -- get Interface p2 ofport \
488         -- get Interface p3 ofport],
489   [0], [stdout])
490 set `cat stdout`
491 p1=$1 p2=$2 p3=$3
492
493 AT_DATA([flows.txt], [dnl
494 in_port=1 actions=output:2
495 in_port=2 actions=output:1
496 ])
497 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
498
499 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)"
500 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
501 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
502   [Datapath actions: $p2,$p3
503 ])
504
505 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)"
506 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
507 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
508   [Datapath actions: $p1
509 ])
510
511 OVS_VSWITCHD_STOP
512 AT_CLEANUP
513
514
515 AT_SETUP([ofproto-dpif - mirroring, select_vlan])
516 OVS_VSWITCHD_START
517 AT_CHECK([ovs-vsctl \
518         add-port br0 p1 -- set Interface p1 type=dummy --\
519         add-port br0 p2 -- set Interface p2 type=dummy --\
520         add-port br0 p3 -- set Interface p3 type=dummy --\
521         set Bridge br0 mirrors=@m --\
522         --id=@p2 get Port p2 -- --id=@p3 get Port p3 --\
523         --id=@m create Mirror name=mymirror \
524         select_all=true select_vlan=11 output_port=@p3 ], [0], [stdout])
525 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
526 <0>
527 ])
528
529 AT_CHECK(
530   [ovs-vsctl \
531         -- get Interface p1 ofport \
532         -- get Interface p2 ofport \
533         -- get Interface p3 ofport],
534   [0], [stdout])
535 set `cat stdout`
536 p1=$1 p2=$2 p3=$3
537
538 AT_DATA([flows.txt], [dnl
539 in_port=1, actions=output:2
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
547 ])
548
549 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))"
550 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
551 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
552   [Datapath actions: $p2
553 ])
554
555 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))"
556 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
557 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
558   [Datapath actions: $p2,$p3
559 ])
560
561 OVS_VSWITCHD_STOP
562 AT_CLEANUP
563
564
565 AT_SETUP([ofproto-dpif - mirroring, output_port])
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=@p3 get Port p3 --\
573         --id=@m create Mirror name=mymirror \
574         select_all=true 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 AT_DATA([flows.txt], [dnl
589 in_port=1 actions=mod_vlan_vid:17,output:2
590 in_port=2 actions=output:1
591 ])
592 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
593
594 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)"
595 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
596 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
597   [Datapath actions: push_vlan(vid=17,pcp=0),$p2,pop_vlan,$p3
598 ])
599
600 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)"
601 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
602 AT_CHECK_UNQUOTED([tail -1 stdout], [0],
603   [Datapath actions: $p1,$p3
604 ])
605
606 OVS_VSWITCHD_STOP
607 AT_CLEANUP
608
609
610 AT_SETUP([ofproto-dpif - mirroring, output_vlan])
611 OVS_VSWITCHD_START
612 AT_CHECK([ovs-vsctl \
613         add-port br0 p1 -- set Interface p1 type=dummy --\
614         add-port br0 p2 -- set Interface p2 type=dummy --\
615         set Bridge br0 mirrors=@m --\
616         --id=@m create Mirror name=mymirror \
617         select_all=true output_vlan=12 ], [0], [stdout])
618 AT_CHECK([perl $srcdir/uuidfilt.pl stdout], [0], [dnl
619 <0>
620 ])
621
622 AT_CHECK(
623   [ovs-vsctl \
624         -- get Interface p1 ofport \
625         -- get Interface p2 ofport],
626   [0], [stdout])
627 set `cat stdout`
628 br0=0 p1=$1 p2=$2
629
630 AT_DATA([flows.txt], [dnl
631 in_port=1 actions=output:2
632 in_port=2 actions=mod_vlan_vid:17,output:1
633 ])
634 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
635
636 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)"
637 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
638 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
639
640 expected="$p2,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
641 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
642 mv stdout expout
643 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
644
645 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)"
646 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
647 actual=`tail -1 stdout | sed 's/Datapath actions: //'`
648
649 expected="push_vlan(vid=17,pcp=0),$p1,pop_vlan,push_vlan(vid=12,pcp=0),$br0,$p1,$p2"
650 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout])
651 mv stdout expout
652 AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout])
653
654 OVS_VSWITCHD_STOP
655 AT_CLEANUP