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