netdev-dpdk: fix mbuf leaks
[cascardo/ovs.git] / tests / cfm.at
1 AT_BANNER([cfm])
2
3 m4_define([CFM_CHECK_EXTENDED], [
4 AT_CHECK([ovs-appctl cfm/show $1 | sed -e '/next CCM tx:/d' | sed -e '/next fault check:/d' | sed -e  '/recv since check:/d'],[0],
5 [dnl
6 ---- $1 ----
7 MPID $2: extended
8         average health: $3
9         opstate: $4
10         remote_opstate: $5
11         interval: $6
12 Remote MPID $7
13         opstate: $8
14 ])
15 ])
16
17 m4_define([CFM_CHECK_EXTENDED_FAULT], [
18 AT_CHECK([ovs-appctl cfm/show $1 | sed -e '/next CCM tx:/d' | sed -e '/next fault check:/d' | sed -e  '/recv since check:/d'],[0],
19 [dnl
20 ---- $1 ----
21 MPID $2: extended
22         fault: $3
23         average health: $4
24         opstate: $5
25         remote_opstate: $6
26         interval: $7
27 ])
28 ])
29
30 m4_define([CFM_VSCTL_LIST_IFACE], [
31 AT_CHECK([ovs-vsctl list interface $1 | sed -n '/$2 /p'],[0],
32 [dnl
33 $3
34 ])
35 ])
36
37 m4_define([CFM_CHECK_DB], [
38 CFM_VSCTL_LIST_IFACE([$1], [cfm_fault], [cfm_fault           : $2])
39 CFM_VSCTL_LIST_IFACE([$1], [cfm_fault_status], [cfm_fault_status    : [[$3]]])
40 CFM_VSCTL_LIST_IFACE([$1], [cfm_flap_count], [cfm_flap_count      : $4])
41 CFM_VSCTL_LIST_IFACE([$1], [cfm_health], [cfm_health          : [[$5]]])
42 CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_mpids], [cfm_remote_mpids    : [[$6]]])
43 CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_opstate], [cfm_remote_opstate  : $7])
44 ])
45
46 # These two tests check the update of cfm status at different scenarios.
47
48 # Test cfm status update at startup and removal.
49 AT_SETUP([cfm - check update ovsdb 1])
50 OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=gre \
51                     options:remote_ip=1.2.3.4 -- \
52                     set Interface p0 other_config:cfm_interval=300 other_config:cfm_extended=true])
53
54 ovs-appctl time/stop
55
56 AT_CHECK([ovs-vsctl set Interface p0 cfm_mpid=1])
57 # at beginning, since the first fault check timeout is not reached
58 # cfm_fault should be false.
59 for i in `seq 0 4`; do
60     ovs-appctl time/warp 100
61     CFM_CHECK_DB([p0], [false], [], [0], [], [], [up])
62 done
63
64 # advance clock to pass the fault check timeout and check cfm
65 # status update in OVSDB.
66 ovs-appctl time/warp 1500 100
67 CFM_CHECK_DB([p0], [true], [recv], [1], [], [], [up])
68
69 # remove the cfm on p0 and status should be all empty.
70 AT_CHECK([ovs-vsctl remove int p0 cfm_mpid 1])
71 ovs-appctl time/warp 500 100
72 CFM_CHECK_DB([p0], [[[]]], [], [[[]]], [], [], [[[]]])
73
74 OVS_VSWITCHD_STOP
75 AT_CLEANUP
76
77 # Test cfm status update in normal case.
78 AT_SETUP([cfm - check update ovsdb 2])
79 #Create 2 bridges connected by patch ports and enable cfm
80 OVS_VSWITCHD_START([add-br br1 -- \
81                     set bridge br1 datapath-type=dummy \
82                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
83                     add-port br1 p1 -- set Interface p1 type=patch \
84                     options:peer=p0 -- \
85                     add-port br0 p0 -- set Interface p0 type=patch \
86                     options:peer=p1 -- \
87                     set Interface p0 other_config:cfm_interval=300 other_config:cfm_extended=true -- \
88                     set Interface p1 other_config:cfm_interval=300 other_config:cfm_extended=true])
89
90 ovs-appctl time/stop
91
92 AT_CHECK([ovs-vsctl set Interface p0 cfm_mpid=1])
93 # check cfm status update in OVSDB.
94 ovs-appctl time/warp 1500 100
95 CFM_CHECK_DB([p0], [true], [recv], [1], [], [], [up])
96
97 # turn cfm on p1 on, cfm status of p0 and p1 should all go up.
98 AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2])
99 ovs-appctl time/warp 1500 100
100 CFM_CHECK_DB([p0], [false], [], [2], [], [2], [up])
101 CFM_CHECK_DB([p1], [false], [], [0], [], [1], [up])
102
103 # turn cfm on p1 off, cfm status of p0 should go down again.
104 AT_CHECK([ovs-vsctl remove int p1 cfm_mpid 2])
105 ovs-appctl time/warp 1500 100
106 CFM_CHECK_DB([p0], [true], [recv], [3], [], [], [up])
107
108 OVS_VSWITCHD_STOP
109 AT_CLEANUP
110
111 # test cfm under demand mode.
112 AT_SETUP([cfm - demand mode])
113 #Create 2 bridges connected by patch ports and enable cfm
114 OVS_VSWITCHD_START([add-br br1 -- \
115                     set bridge br1 datapath-type=dummy \
116                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
117                     add-port br1 p1 -- set Interface p1 type=patch \
118                     options:peer=p0 -- \
119                     add-port br0 p0 -- set Interface p0 type=patch \
120                     options:peer=p1 -- \
121                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=300 other_config:cfm_extended=true -- \
122                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=300 other_config:cfm_extended=true ])
123
124 ovs-appctl time/stop
125 # wait for a while to stablize cfm.
126 ovs-appctl time/warp 10100 100
127 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
128 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
129
130 # turn on demand mode on one end.
131 AT_CHECK([ovs-vsctl set interface p0 other_config:cfm_demand=true])
132
133 # cfm should never go down.
134 for i in `seq 0 100`
135 do
136     ovs-appctl time/warp 100
137     CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
138     CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
139 done
140
141 # turn on demand mode on the other end.
142 AT_CHECK([ovs-vsctl set interface p1 other_config:cfm_demand=true])
143 for i in `seq 0 100`
144 do
145     ovs-appctl time/warp 100
146     CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
147     CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
148 done
149
150 OVS_VSWITCHD_STOP
151 AT_CLEANUP
152
153 # test demand_rx_ccm under demand mode.
154 AT_SETUP([cfm - demand_rx_ccm])
155 #Create 2 bridges connected by patch ports and enable cfm
156 OVS_VSWITCHD_START([add-br br1 -- \
157                     set bridge br1 datapath-type=dummy \
158                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
159                     add-port br1 p1 -- set Interface p1 type=patch \
160                     options:peer=p0 ofport_request=2 -- \
161                     add-port br0 p0 -- set Interface p0 type=patch \
162                     options:peer=p1 ofport_request=1 -- \
163                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=300 other_config:cfm_extended=true other_config:cfm_demand=true -- \
164                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=300 other_config:cfm_extended=true other_config:cfm_demand=true])
165
166 ovs-appctl time/stop
167 # wait for a while to stablize cfm. (need a longer time, since in demand mode
168 # the fault interval is (MAX(ccm_interval_ms, 500) * 3.5) ms)
169 ovs-appctl time/warp 20100 100
170 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
171 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
172
173 # turn off the cfm on p1.
174 AT_CHECK([ovs-vsctl clear Interface p1 cfm_mpid])
175 # cfm should never go down while receiving data packets.
176 for i in `seq 0 200`
177 do
178     ovs-appctl time/warp 100
179     AT_CHECK([ovs-ofctl packet-out br1 3 2  "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"],
180              [0], [stdout], [])
181 done
182 CFM_CHECK_EXTENDED([p0], [1], [0], [up], [up], [300ms], [2], [up])
183
184 # wait longer, since the demand_rx_ccm interval is 100 * 300 ms.
185 # since there is no ccm received, the [recv] fault should be raised.
186 for i in `seq 0 200`
187 do
188     ovs-appctl time/warp 100
189     AT_CHECK([ovs-ofctl packet-out br1 3 2  "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"],
190              [0], [stdout], [])
191 done
192 CFM_CHECK_EXTENDED_FAULT([p0], [1], [recv], [0], [up], [up], [300ms])
193
194 # now turn on the cfm on p1 again,
195 AT_CHECK([ovs-vsctl set Interface p1 cfm_mpid=2])
196 # cfm should be up for both p0 and p1
197 ovs-appctl time/warp 20100 100
198 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
199 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
200
201 # now turn off the cfm on p1 again
202 AT_CHECK([ovs-vsctl clear Interface p1 cfm_mpid])
203 # since there is no ccm received, the [recv] fault should be raised.
204 for i in `seq 0 400`
205 do
206     ovs-appctl time/warp 100
207     AT_CHECK([ovs-ofctl packet-out br1 3 2  "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"],
208              [0], [stdout], [])
209 done
210 CFM_CHECK_EXTENDED_FAULT([p0], [1], [recv], [0], [up], [up], [300ms])
211
212 OVS_VSWITCHD_STOP
213 AT_CLEANUP
214
215 # test cfm_flap_count.
216 AT_SETUP([cfm - flap_count])
217 #Create 2 bridges connected by patch ports and enable cfm
218 OVS_VSWITCHD_START([add-br br1 -- \
219                     set bridge br1 datapath-type=dummy \
220                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
221                     add-port br1 p1 -- set Interface p1 type=patch \
222                     options:peer=p0 -- \
223                     add-port br0 p0 -- set Interface p0 type=patch \
224                     options:peer=p1 -- \
225                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=100 other_config:cfm_extended=true -- \
226                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 other_config:cfm_extended=true])
227
228 ovs-appctl time/stop
229
230 # wait for a while to stablize cfm.
231 ovs-appctl time/warp 10100 100
232 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [100ms], [2], [up])
233 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up])
234
235 # turn cfm on p1 off, should increment the cfm_flap_count on p0.
236 AT_CHECK([ovs-vsctl remove interface p1 cfm_mpid 2])
237 ovs-appctl time/warp 1100 100
238 CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count      : 1])
239 CFM_VSCTL_LIST_IFACE([p1], [cfm_flap_count], [cfm_flap_count      : [[]]])
240
241 # turn cfm on p1 on again, should increment the cfm_flap_count on p0.
242 AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2])
243 ovs-appctl time/warp 1100 100
244 CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count      : 2])
245
246 OVS_VSWITCHD_STOP
247 AT_CLEANUP
248
249 AT_SETUP([cfm - fault_override])
250 OVS_VSWITCHD_START([add-br br1 -- \
251                     set bridge br1 datapath-type=dummy \
252                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
253                     add-port br1 p1 -- set Interface p1 type=patch \
254                     options:peer=p0 -- \
255                     add-port br0 p0 -- set Interface p0 type=patch \
256                     options:peer=p1 -- \
257                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=100 other_config:cfm_extended=true -- \
258                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 other_config:cfm_extended=true])
259
260 ovs-appctl time/stop
261 # wait for a while to stablize cfm.
262 ovs-appctl time/warp 10100 100
263 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [100ms], [2], [up])
264 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up])
265 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore])
266 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[]]])
267
268 # set a fault and see that this is shown in the CFM module and the database
269 AT_CHECK([ovs-appctl cfm/set-fault p1 true], [0], [OK
270 ])
271 AT_CHECK([ovs-appctl time/warp 100], [0], [ignore])
272 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override' | sed -e 's/MPID [[0-9]]*: extended //'], [0], [dnl
273 fault_override
274 ])
275 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[override]]])
276
277 # reset and see that it returned to normal
278 AT_CHECK([ovs-appctl cfm/set-fault normal], [0], [OK
279 ])
280 AT_CHECK([ovs-appctl time/warp 100], [0], [ignore])
281 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore])
282 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[]]])
283
284 OVS_VSWITCHD_STOP
285 AT_CLEANUP