test-lockfile: Provide better diagnostics on failure.
[sliver-openvswitch.git] / tests / ofproto-dpif.at
1 AT_BANNER([ofproto-dpif])
2
3 AT_SETUP([ofproto-dpif - resubmit])
4 OFPROTO_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 -t test-openflowd 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),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 OFPROTO_STOP
19 AT_CLEANUP
20
21 AT_SETUP([ofproto-dpif - registers])
22 OFPROTO_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 -t test-openflowd 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),icmp(type=8,code=0)'], [0], [stdout])
40 AT_CHECK([tail -1 stdout], [0],
41   [Datapath actions: 20,21,22
42 ])
43 OFPROTO_STOP
44 AT_CLEANUP
45
46 AT_SETUP([ofproto-dpif - output])
47 OFPROTO_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 -t test-openflowd 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),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 OFPROTO_STOP
63 AT_CLEANUP
64
65 AT_SETUP([ofproto-dpif - set_tunnel])
66 OFPROTO_START
67 AT_DATA([flows.txt], [dnl
68 in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
69 in_port=1 actions=set_tunnel:1,output:1
70 in_port=2 actions=set_tunnel:1,output:2
71 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
72 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
73 in_port=5 actions=set_tunnel:5
74 ])
75 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
76 AT_CHECK([ovs-appctl -t test-openflowd 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),icmp(type=8,code=0)'], [0], [stdout])
77 AT_CHECK([tail -1 stdout], [0],
78   [Datapath actions: set_tunnel(0x1),1,2,set_tunnel(0x3),3,4
79 ])
80 OFPROTO_STOP
81 AT_CLEANUP
82
83 AT_SETUP([ofproto-dpif - VLAN handling])
84 OVS_VSWITCHD_START(
85   [add-port br0 p1                                  trunks=10,12 -- \
86    add-port br0 p2                           tag=10              -- \
87    add-port br0 p3                           tag=12              -- \
88    add-port br0 p4                           tag=12              -- \
89    add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
90    add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
91    add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
92    add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 -- \
93    set Interface p1 type=dummy -- \
94    set Interface p2 type=dummy -- \
95    set Interface p3 type=dummy -- \
96    set Interface p4 type=dummy -- \
97    set Interface p5 type=dummy -- \
98    set Interface p6 type=dummy -- \
99    set Interface p7 type=dummy -- \
100    set Interface p8 type=dummy --])
101
102 AT_CHECK(
103   [ovs-vsctl \
104         -- get Interface p1 ofport \
105         -- get Interface p2 ofport \
106         -- get Interface p3 ofport \
107         -- get Interface p4 ofport \
108         -- get Interface p5 ofport \
109         -- get Interface p6 ofport \
110         -- get Interface p7 ofport \
111         -- get Interface p8 ofport],
112   [0], [stdout])
113 set `cat stdout`
114 br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8
115
116 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
117 dnl PCP (used if the VID isn't "none") and the expected set of datapath
118 dnl actions.
119 dnl
120 dnl XXX Some of these actually output an 802.1Q header to an access port
121 dnl (see for example the actions for in_port=p3, vlan=0) to qualify the
122 dnl packet with a priority.  That should be configurable.
123 for tuple in \
124         "br0 none 0 drop" \
125         "br0 0    0 drop" \
126         "br0 0    1 drop" \
127         "br0 10   0 p1,p5,p6,p7,p8,pop_vlan,p2" \
128         "br0 10   1 p1,p5,p6,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
129         "br0 11   0 p5,p7" \
130         "br0 11   1 p5,p7" \
131         "br0 12   0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \
132         "br0 12   1 p1,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
133         "p1  none 0 drop" \
134         "p1  0    0 drop" \
135         "p1  0    1 drop" \
136         "p1  10   0 br0,p5,p6,p7,p8,pop_vlan,p2" \
137         "p1  10   1 br0,p5,p6,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
138         "p1  11   0 drop" \
139         "p1  11   1 drop" \
140         "p1  12   0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \
141         "p1  12   1 br0,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
142         "p2  none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
143         "p2  0    0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \
144         "p2  0    1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \
145         "p2  10   0 drop" \
146         "p2  10   1 drop" \
147         "p2  11   0 drop" \
148         "p2  11   1 drop" \
149         "p2  12   0 drop" \
150         "p2  12   1 drop" \
151         "p3  none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
152         "p3  0    0 p4,p7,p8,pop_vlan,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
153         "p3  0    1 p4,p7,p8,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
154         "p3  10   0 drop" \
155         "p3  10   1 drop" \
156         "p3  11   0 drop" \
157         "p3  11   1 drop" \
158         "p3  12   0 drop" \
159         "p3  12   1 drop" \
160         "p4  none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
161         "p4  0    0 p3,p7,p8,pop_vlan,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
162         "p4  0    1 p3,p7,p8,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
163         "p4  10   0 drop" \
164         "p4  10   1 drop" \
165         "p4  11   0 drop" \
166         "p4  11   1 drop" \
167         "p4  12   0 drop" \
168         "p4  12   1 drop" \
169         "p5  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
170         "p5  0    0 p2,pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \
171         "p5  0    1 p2,pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \
172         "p5  10   0 br0,p1,p6,p7,p8,pop_vlan,p2" \
173         "p5  10   1 br0,p1,p6,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
174         "p5  11   0 br0,p7" \
175         "p5  11   1 br0,p7" \
176         "p5  12   0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \
177         "p5  12   1 br0,p1,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
178         "p6  none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
179         "p6  0    0 p2,pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \
180         "p6  0    1 p2,pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \
181         "p6  10   0 br0,p1,p5,p7,p8,pop_vlan,p2" \
182         "p6  10   1 br0,p1,p5,p7,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
183         "p6  11   0 drop" \
184         "p6  11   1 drop" \
185         "p6  12   0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \
186         "p6  12   1 br0,p1,p5,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7,p8" \
187         "p7  none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
188         "p7  0    0 p3,p4,p8,pop_vlan,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
189         "p7  0    1 p3,p4,p8,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
190         "p7  10   0 br0,p1,p5,p6,p8,pop_vlan,p2" \
191         "p7  10   1 br0,p1,p5,p6,p8,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
192         "p7  11   0 br0,p5" \
193         "p7  11   1 br0,p5" \
194         "p7  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \
195         "p7  12   1 br0,p1,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p8" \
196         "p8  none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
197         "p8  0    0 p3,p4,p7,pop_vlan,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \
198         "p8  0    1 p3,p4,p7,pop_vlan,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \
199         "p8  10   0 br0,p1,p5,p6,p7,pop_vlan,p2" \
200         "p8  10   1 br0,p1,p5,p6,p7,pop_vlan,push_vlan(vid=0,pcp=1),p2" \
201         "p8  11   0 drop" \
202         "p8  11   1 drop" \
203         "p8  12   0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \
204         "p8  12   1 br0,p1,p5,p6,pop_vlan,push_vlan(vid=0,pcp=1),p3,p4,p7"
205 do
206   set $tuple
207   in_port=$1
208   vlan=$2
209   pcp=$3
210   expected=$4
211
212   eval n_in_port=\$$in_port
213   if test $vlan = none; then
214     flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
215   else
216     flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),vlan(vid=$vlan,pcp=$pcp),eth_type(0xabcd)"
217   fi
218
219   AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
220   actual=`tail -1 stdout | sed 's/Datapath actions: //'`
221
222   AT_CHECK([echo "in_port=$in_port vlan=$vlan"
223             $PERL $srcdir/compare-odp-actions.pl "$expected" "$actual" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [ignore])
224 done
225
226 OVS_VSWITCHD_STOP
227 AT_CLEANUP