ofproto-dpif: Add tests for VLAN handling.
[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 - trunks])
84 OVS_VSWITCHD_START(
85   [add-port br0 p1 trunks=10,12 -- set Interface p1 type=dummy -- \
86    add-port br0 p2 tag=10       -- set Interface p2 type=dummy -- \
87    add-port br0 p3 tag=12       -- set Interface p3 type=dummy -- \
88    add-port br0 p4 tag=12       -- set Interface p4 type=dummy])
89
90 AT_CHECK(
91   [ovs-vsctl \
92         -- get Interface p1 ofport \
93         -- get Interface p2 ofport \
94         -- get Interface p3 ofport \
95         -- get Interface p4 ofport],
96   [0], [stdout])
97 set `cat stdout`
98 br0=0 p1=$1 p2=$2 p3=$3 p4=$4
99
100 dnl Each of these specifies an in_port, a VLAN VID (or "none"), and one
101 dnl or more sets of valid datapath actions.  (The order of datapath
102 dnl actions is somewhat unpredictable, hence the ability to specify more
103 dnl than one set.)
104 for tuple in \
105         "$br0 none drop" \
106         "$br0 0 drop" \
107         "$br0 10 $p1,strip_vlan,$p2" \
108         "$br0 11 drop" \
109         "$br0 12 $p1,strip_vlan,$p3,$p4 $p1,strip_vlan,$p4,$p3" \
110         "$p1 none drop" \
111         "$p1 0 drop" \
112         "$p1 10 $br0,strip_vlan,$p2" \
113         "$p1 11 drop" \
114         "$p1 12 $br0,strip_vlan,$p4,$p3 $br0,strip_vlan,$p3,$p4" \
115         "$p2 none set_tci(vid=10,pcp=0),$br0,$p1 set_tci(vid=10,pcp=0),$p1,$br0" \
116         "$p2 0 set_tci(vid=10,pcp=1),$br0,$p1 set_tci(vid=10,pcp=1),$p1,$br0" \
117         "$p2 10 drop" \
118         "$p2 11 drop" \
119         "$p2 12 drop" \
120         "$p3 none $p4,set_tci(vid=12,pcp=0),$br0,$p1 $p4,set_tci(vid=12,pcp=0),$p1,$br0" \
121         "$p3 0 $p4,set_tci(vid=12,pcp=1),$br0,$p1 $p4,set_tci(vid=12,pcp=1),$p1,$br0" \
122         "$p3 10 drop" \
123         "$p3 11 drop" \
124         "$p3 12 drop" \
125         "$p4 none $p3,set_tci(vid=12,pcp=0),$br0,$p1 $p3,set_tci(vid=12,pcp=0),$p1,$br0" \
126         "$p4 0 $p3,set_tci(vid=12,pcp=1),$br0,$p1 $p3,set_tci(vid=12,pcp=1),$p1,$br0" \
127         "$p4 10 drop" \
128         "$p4 11 drop" \
129         "$p4 12 drop"
130 do
131   set $tuple
132   in_port=$1
133   vlan=$2
134   shift; shift
135
136   if test $vlan = none; then
137     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
138   else
139     flow="in_port($in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),vlan(vid=$vlan,pcp=1),eth_type(0xabcd)"
140   fi
141
142   AT_CHECK(
143     [echo "-- $tuple"
144      echo "-- br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4"
145      ovs-appctl ofproto/trace br0 "$flow"],
146     [0], [stdout])
147
148   actions=`tail -1 stdout | sed 's/Datapath actions: //'`
149   no_match=:
150   for pattern
151   do
152     if test X"$actions" = X"$pattern"; then
153       no_match=false
154     fi
155   done
156   AT_FAIL_IF([$no_match])
157 done
158
159 OVS_VSWITCHD_STOP
160 AT_CLEANUP