aboutsummaryrefslogtreecommitdiff
path: root/tests/ofproto-dpif.at
blob: b97fc9b1c742b62b6628d03a951571720b3a5dbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
AT_BANNER([ofproto-dpif])

AT_SETUP([ofproto-dpif - resubmit])
OFPROTO_START
AT_DATA([flows.txt], [dnl
table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21)
table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18)
table=0 in_port=3 priority=2000 icmp actions=output(20)
table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15)
table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2)
table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2)
])
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
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,frag=no),icmp(type=8,code=0)'], [0], [stdout])
AT_CHECK([tail -1 stdout], [0],
  [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21
])
OFPROTO_STOP
AT_CLEANUP

AT_SETUP([ofproto-dpif - registers])
OFPROTO_START
AT_DATA([flows.txt], [dnl
in_port=90                 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91
in_port=91                 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92
in_port=92                 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11
in_port=2                  actions=load:0x000db000->NXM_NX_REG0[[]]
in_port=3                  actions=load:0xdea->NXM_NX_REG0[[20..31]]
in_port=4                  actions=load:0xeef->NXM_NX_REG0[[0..11]]
in_port=5                  actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]]
in_port=6                  actions=load:0x22222222->NXM_NX_REG2[[]]
in_port=7                  actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]]
in_port=8                  actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]]
in_port=9,reg0=0xdeadbeef  actions=output:20
in_port=10,reg1=0xdeadbeef actions=output:21
in_port=11,reg2=0xeef22dea actions=output:22
])
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
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,frag=no),icmp(type=8,code=0)'], [0], [stdout])
AT_CHECK([tail -1 stdout], [0],
  [Datapath actions: 20,21,22
])
OFPROTO_STOP
AT_CLEANUP

AT_SETUP([ofproto-dpif - output])
OFPROTO_START
AT_DATA([flows.txt], [dnl
in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7
in_port=2 actions=output:9
in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]]
in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11
in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]]
in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]]
in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]]
])
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
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,frag=no),icmp(type=8,code=0)'], [0], [stdout])
AT_CHECK([tail -1 stdout], [0],
  [Datapath actions: 9,55,10,55,66,11,77,88
])
OFPROTO_STOP
AT_CLEANUP

AT_SETUP([ofproto-dpif - set_tunnel])
OFPROTO_START
AT_DATA([flows.txt], [dnl
in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
in_port=1 actions=set_tunnel:1,output:1
in_port=2 actions=set_tunnel:1,output:2
in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3
in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4
in_port=5 actions=set_tunnel:5
])
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
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,frag=no),icmp(type=8,code=0)'], [0], [stdout])
AT_CHECK([tail -1 stdout], [0],
  [Datapath actions: set(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4
])
OFPROTO_STOP
AT_CLEANUP

AT_SETUP([ofproto-dpif - VLAN handling])
OVS_VSWITCHD_START(
  [add-port br0 p1                                  trunks=10,12 -- \
   add-port br0 p2                           tag=10              -- \
   add-port br0 p3                           tag=12              -- \
   add-port br0 p4                           tag=12              -- \
   add-port br0 p5 vlan_mode=native-tagged   tag=10              -- \
   add-port br0 p6 vlan_mode=native-tagged   tag=10 trunks=10,12 -- \
   add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
   add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 -- \
   set Interface p1 type=dummy -- \
   set Interface p2 type=dummy -- \
   set Interface p3 type=dummy -- \
   set Interface p4 type=dummy -- \
   set Interface p5 type=dummy -- \
   set Interface p6 type=dummy -- \
   set Interface p7 type=dummy -- \
   set Interface p8 type=dummy --])

AT_CHECK(
  [ovs-vsctl \
        -- get Interface p1 ofport \
        -- get Interface p2 ofport \
        -- get Interface p3 ofport \
        -- get Interface p4 ofport \
        -- get Interface p5 ofport \
        -- get Interface p6 ofport \
        -- get Interface p7 ofport \
        -- get Interface p8 ofport],
  [0], [stdout])
set `cat stdout`
br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8

dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN
dnl PCP (used if the VID isn't "none") and the expected set of datapath
dnl actions.
dnl
dnl XXX Some of these actually output an 802.1Q header to an access port
dnl (see for example the actions for in_port=p3, vlan=0) to qualify the
dnl packet with a priority.  That should be configurable.
for tuple in \
        "br0 none 0 drop" \
        "br0 0    0 drop" \
        "br0 0    1 drop" \
        "br0 10   0 p1,p5,p6,p7,p8,pop(vlan),p2" \
        "br0 10   1 p1,p5,p6,p7,p8,pop(vlan),push(vlan(vid=0,pcp=1)),p2" \
        "br0 11   0 p5,p7" \
        "br0 11   1 p5,p7" \
        "br0 12   0 p1,p5,p6,pop(vlan),p3,p4,p7,p8" \
        "br0 12   1 p1,p5,p6,pop(vlan),push(vlan(vid=0,pcp=1)),p3,p4,p7,p8" \
        "p1  none 0 drop" \
        "p1  0    0 drop" \
        "p1  0    1 drop" \
        "p1  10   0 br0,p5,p6,p7,p8,pop(vlan),p2" \
        "p1  10   1 br0,p5,p6,p7,p8,pop(vlan),push(vlan(vid=0,pcp=1)),p2" \
        "p1  11   0 drop" \
        "p1  11   1 drop" \
        "p1  12   0 br0,p5,p6,pop(vlan),p3,p4,p7,p8" \
        "p1  12   1 br0,p5,p6,pop(vlan),push(vlan(vid=0,pcp=1)),p3,p4,p7,p8" \
        "p2  none 0 push(vlan(vid=10,pcp=0)),br0,p1,p5,p6,p7,p8" \
        "p2  0    0 pop(vlan),push(vlan(vid=10,pcp=0)),br0,p1,p5,p6,p7,p8" \
        "p2  0    1 pop(vlan),push(vlan(vid=10,pcp=1)),br0,p1,p5,p6,p7,p8" \
        "p2  10   0 drop" \
        "p2  10   1 drop" \
        "p2  11   0 drop" \
        "p2  11   1 drop" \
        "p2  12   0 drop" \
        "p2  12   1 drop" \
        "p3  none 0 p4,p7,p8,push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p3  0    0 p4,p7,p8,pop(vlan),push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p3  0    1 p4,p7,p8,pop(vlan),push(vlan(vid=12,pcp=1)),br0,p1,p5,p6" \
        "p3  10   0 drop" \
        "p3  10   1 drop" \
        "p3  11   0 drop" \
        "p3  11   1 drop" \
        "p3  12   0 drop" \
        "p3  12   1 drop" \
        "p4  none 0 p3,p7,p8,push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p4  0    0 p3,p7,p8,pop(vlan),push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p4  0    1 p3,p7,p8,pop(vlan),push(vlan(vid=12,pcp=1)),br0,p1,p5,p6" \
        "p4  10   0 drop" \
        "p4  10   1 drop" \
        "p4  11   0 drop" \
        "p4  11   1 drop" \
        "p4  12   0 drop" \
        "p4  12   1 drop" \
        "p5  none 0 p2,push(vlan(vid=10,pcp=0)),br0,p1,p6,p7,p8" \
        "p5  0    0 p2,pop(vlan),push(vlan(vid=10,pcp=0)),br0,p1,p6,p7,p8" \
        "p5  0    1 p2,pop(vlan),push(vlan(vid=10,pcp=1)),br0,p1,p6,p7,p8" \
        "p5  10   0 br0,p1,p6,p7,p8,pop(vlan),p2" \
        "p5  10   1 br0,p1,p6,p7,p8,pop(vlan),push(vlan(vid=0,pcp=1)),p2" \
        "p5  11   0 br0,p7" \
        "p5  11   1 br0,p7" \
        "p5  12   0 br0,p1,p6,pop(vlan),p3,p4,p7,p8" \
        "p5  12   1 br0,p1,p6,pop(vlan),push(vlan(vid=0,pcp=1)),p3,p4,p7,p8" \
        "p6  none 0 p2,push(vlan(vid=10,pcp=0)),br0,p1,p5,p7,p8" \
        "p6  0    0 p2,pop(vlan),push(vlan(vid=10,pcp=0)),br0,p1,p5,p7,p8" \
        "p6  0    1 p2,pop(vlan),push(vlan(vid=10,pcp=1)),br0,p1,p5,p7,p8" \
        "p6  10   0 br0,p1,p5,p7,p8,pop(vlan),p2" \
        "p6  10   1 br0,p1,p5,p7,p8,pop(vlan),push(vlan(vid=0,pcp=1)),p2" \
        "p6  11   0 drop" \
        "p6  11   1 drop" \
        "p6  12   0 br0,p1,p5,pop(vlan),p3,p4,p7,p8" \
        "p6  12   1 br0,p1,p5,pop(vlan),push(vlan(vid=0,pcp=1)),p3,p4,p7,p8" \
        "p7  none 0 p3,p4,p8,push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p7  0    0 p3,p4,p8,pop(vlan),push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p7  0    1 p3,p4,p8,pop(vlan),push(vlan(vid=12,pcp=1)),br0,p1,p5,p6" \
        "p7  10   0 br0,p1,p5,p6,p8,pop(vlan),p2" \
        "p7  10   1 br0,p1,p5,p6,p8,pop(vlan),push(vlan(vid=0,pcp=1)),p2" \
        "p7  11   0 br0,p5" \
        "p7  11   1 br0,p5" \
        "p7  12   0 br0,p1,p5,p6,pop(vlan),p3,p4,p8" \
        "p7  12   1 br0,p1,p5,p6,pop(vlan),push(vlan(vid=0,pcp=1)),p3,p4,p8" \
        "p8  none 0 p3,p4,p7,push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p8  0    0 p3,p4,p7,pop(vlan),push(vlan(vid=12,pcp=0)),br0,p1,p5,p6" \
        "p8  0    1 p3,p4,p7,pop(vlan),push(vlan(vid=12,pcp=1)),br0,p1,p5,p6" \
        "p8  10   0 br0,p1,p5,p6,p7,pop(vlan),p2" \
        "p8  10   1 br0,p1,p5,p6,p7,pop(vlan),push(vlan(vid=0,pcp=1)),p2" \
        "p8  11   0 drop" \
        "p8  11   1 drop" \
        "p8  12   0 br0,p1,p5,p6,pop(vlan),p3,p4,p7" \
        "p8  12   1 br0,p1,p5,p6,pop(vlan),push(vlan(vid=0,pcp=1)),p3,p4,p7"
do
  set $tuple
  in_port=$1
  vlan=$2
  pcp=$3
  expected=$4

  eval n_in_port=\$$in_port
  if test $vlan = none; then
    flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)"
  else
    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)"
  fi

  AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout])
  actual=`tail -1 stdout | sed 's/Datapath actions: //'`

  AT_CHECK([echo "in_port=$in_port vlan=$vlan"
            $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])
done

OVS_VSWITCHD_STOP
AT_CLEANUP

AT_SETUP([ofproto-dpif - fragment handling])
OFPROTO_START
AT_DATA([flows.txt], [dnl
priority=75 tcp ip_frag=no    tp_dst=80 actions=output:1
priority=75 tcp ip_frag=first tp_dst=80 actions=output:2
priority=75 tcp ip_frag=later tp_dst=80 actions=output:3
priority=50 tcp ip_frag=no              actions=output:4
priority=50 tcp ip_frag=first           actions=output:5
priority=50 tcp ip_frag=later           actions=output:6
])
AT_CHECK([ovs-ofctl replace-flows br0 flows.txt])

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"
no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)"
first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)"
later_flow="$base_flow,frag=later)"

    # mode    no  first  later
for tuple in \
    'normal    1     5      6' \
    'drop      1  drop   drop' \
    'nx-match  1     2      6'
do
  set $tuple
  mode=$1
  no=$2
  first=$3
  later=$4

  AT_CHECK([ovs-ofctl set-frags br0 $mode])
  for type in no first later; do
    eval flow=\$${type}_flow exp_output=\$$type
    AT_CHECK([ovs-appctl -t test-openflowd ofproto/trace br0 "$flow"],
             [0], [stdout])
    AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output
])
  done
done
OFPROTO_STOP
AT_CLEANUP