cfm: Require ccm received in demand mode.
[sliver-openvswitch.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_status], [cfm_fault_status    : [[$2]]])
39 CFM_VSCTL_LIST_IFACE([$1], [cfm_flap_count], [cfm_flap_count      : $3])
40 CFM_VSCTL_LIST_IFACE([$1], [cfm_health], [cfm_health          : [[$4]]])
41 CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_mpids], [cfm_remote_mpids    : [[$5]]])
42 CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_opstate], [cfm_remote_opstate  : $6])
43 ])
44
45 # This test checks the update of cfm status to OVSDB at startup.
46 # The cfm status should be updated to OVSDB within 3.5 * cfm_interval.
47 AT_SETUP([cfm - check update ovsdb])
48 #Create 2 bridges connected by patch ports and enable cfm
49 OVS_VSWITCHD_START([add-br br1 -- \
50                     set bridge br1 datapath-type=dummy \
51                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
52                     add-port br1 p1 -- set Interface p1 type=patch \
53                     options:peer=p0 -- \
54                     add-port br0 p0 -- set Interface p0 type=patch \
55                     options:peer=p1 -- \
56                     set Interface p0 other_config:cfm_interval=300 other_config:cfm_extended=true -- \
57                     set Interface p1 other_config:cfm_interval=300 other_config:cfm_extended=true])
58
59 ovs-appctl time/stop
60
61 AT_CHECK([ovs-vsctl set Interface p0 cfm_mpid=1])
62 # check cfm status update in OVSDB.
63 for i in `seq 0 14`; do ovs-appctl time/warp 100; done
64 CFM_CHECK_DB([p0], [recv], [1], [], [], [up])
65
66 # turn cfm on p1 off, should increment the cfm_flap_count on p0.
67 AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2])
68 for i in `seq 0 14`; do ovs-appctl time/warp 100; done
69 CFM_CHECK_DB([p0], [], [2], [], [2], [up])
70 CFM_CHECK_DB([p1], [], [0], [], [1], [up])
71
72 OVS_VSWITCHD_STOP
73 AT_CLEANUP
74
75 # test cfm under demand mode.
76 AT_SETUP([cfm - demand mode])
77 #Create 2 bridges connected by patch ports and enable cfm
78 OVS_VSWITCHD_START([add-br br1 -- \
79                     set bridge br1 datapath-type=dummy \
80                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
81                     add-port br1 p1 -- set Interface p1 type=patch \
82                     options:peer=p0 -- \
83                     add-port br0 p0 -- set Interface p0 type=patch \
84                     options:peer=p1 -- \
85                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=300 other_config:cfm_extended=true -- \
86                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=300 other_config:cfm_extended=true ])
87
88 ovs-appctl time/stop
89 # wait for a while to stablize cfm.
90 for i in `seq 0 100`; do ovs-appctl time/warp 100; done
91 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
92 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
93
94 # turn on demand mode on one end.
95 AT_CHECK([ovs-vsctl set interface p0 other_config:cfm_demand=true])
96
97 # cfm should never go down.
98 for i in `seq 0 100`
99 do
100     ovs-appctl time/warp 100
101     CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
102     CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
103 done
104
105 # turn on demand mode on the other end.
106 AT_CHECK([ovs-vsctl set interface p1 other_config:cfm_demand=true])
107 for i in `seq 0 100`
108 do
109     ovs-appctl time/warp 100
110     CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
111     CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
112 done
113
114 OVS_VSWITCHD_STOP
115 AT_CLEANUP
116
117 # test demand_rx_ccm under demand mode.
118 AT_SETUP([cfm - demand_rx_ccm])
119 #Create 2 bridges connected by patch ports and enable cfm
120 OVS_VSWITCHD_START([add-br br1 -- \
121                     set bridge br1 datapath-type=dummy \
122                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
123                     add-port br1 p1 -- set Interface p1 type=patch \
124                     options:peer=p0 ofport_request=2 -- \
125                     add-port br0 p0 -- set Interface p0 type=patch \
126                     options:peer=p1 ofport_request=1 -- \
127                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=300 other_config:cfm_extended=true other_config:cfm_demand=true -- \
128                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=300 other_config:cfm_extended=true other_config:cfm_demand=true])
129
130 ovs-appctl time/stop
131 # wait for a while to stablize cfm. (need a longer time, since in demand mode
132 # the fault interval is (MAX(ccm_interval_ms, 500) * 3.5) ms)
133 for i in `seq 0 200`; do ovs-appctl time/warp 100; done
134 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
135 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
136
137 # turn off the cfm on p1.
138 AT_CHECK([ovs-vsctl clear Interface p1 cfm_mpid])
139 # cfm should never go down while receiving data packets.
140 for i in `seq 0 200`
141 do
142     ovs-appctl time/warp 100
143     AT_CHECK([ovs-ofctl packet-out br1 3 2  "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"],
144              [0], [stdout], [])
145 done
146 CFM_CHECK_EXTENDED([p0], [1], [0], [up], [up], [300ms], [2], [up])
147
148 # wait longer, since the demand_rx_ccm interval is 100 * 300 ms.
149 # since there is no ccm received, the [recv] fault should be raised.
150 for i in `seq 0 200`
151 do
152     ovs-appctl time/warp 100
153     AT_CHECK([ovs-ofctl packet-out br1 3 2  "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"],
154              [0], [stdout], [])
155 done
156 CFM_CHECK_EXTENDED_FAULT([p0], [1], [recv], [0], [up], [up], [300ms])
157
158 # now turn on the cfm on p1 again,
159 AT_CHECK([ovs-vsctl set Interface p1 cfm_mpid=2])
160 # cfm should be up for both p0 and p1
161 for i in `seq 0 200`; do ovs-appctl time/warp 100; done
162 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [300ms], [2], [up])
163 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [300ms], [1], [up])
164
165 # now turn off the cfm on p1 again
166 AT_CHECK([ovs-vsctl clear Interface p1 cfm_mpid])
167 # since there is no ccm received, the [recv] fault should be raised.
168 for i in `seq 0 400`
169 do
170     ovs-appctl time/warp 100
171     AT_CHECK([ovs-ofctl packet-out br1 3 2  "90e2ba01475000101856b2e80806000108000604000100101856b2e80202020300000000000002020202"],
172              [0], [stdout], [])
173 done
174 CFM_CHECK_EXTENDED_FAULT([p0], [1], [recv], [0], [up], [up], [300ms])
175
176 OVS_VSWITCHD_STOP
177 AT_CLEANUP
178
179 # test cfm_flap_count.
180 AT_SETUP([cfm - flap_count])
181 #Create 2 bridges connected by patch ports and enable cfm
182 OVS_VSWITCHD_START([add-br br1 -- \
183                     set bridge br1 datapath-type=dummy \
184                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
185                     add-port br1 p1 -- set Interface p1 type=patch \
186                     options:peer=p0 -- \
187                     add-port br0 p0 -- set Interface p0 type=patch \
188                     options:peer=p1 -- \
189                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=100 other_config:cfm_extended=true -- \
190                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 other_config:cfm_extended=true])
191
192 ovs-appctl time/stop
193
194 # wait for a while to stablize cfm.
195 for i in `seq 0 100`; do ovs-appctl time/warp 100; done
196 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [100ms], [2], [up])
197 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up])
198
199 # turn cfm on p1 off, should increment the cfm_flap_count on p0.
200 AT_CHECK([ovs-vsctl remove interface p1 cfm_mpid 2])
201 for i in `seq 0 10`; do ovs-appctl time/warp 100; done
202 CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count      : 1])
203 CFM_VSCTL_LIST_IFACE([p1], [cfm_flap_count], [cfm_flap_count      : [[]]])
204
205 # turn cfm on p1 on again, should increment the cfm_flap_count on p0.
206 AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2])
207 for i in `seq 0 10`; do ovs-appctl time/warp 100; done
208 CFM_VSCTL_LIST_IFACE([p0], [cfm_flap_count], [cfm_flap_count      : 2])
209
210 OVS_VSWITCHD_STOP
211 AT_CLEANUP
212
213 AT_SETUP([cfm - fault_override])
214 OVS_VSWITCHD_START([add-br br1 -- \
215                     set bridge br1 datapath-type=dummy \
216                     other-config:hwaddr=aa:55:aa:56:00:00 -- \
217                     add-port br1 p1 -- set Interface p1 type=patch \
218                     options:peer=p0 -- \
219                     add-port br0 p0 -- set Interface p0 type=patch \
220                     options:peer=p1 -- \
221                     set Interface p0 cfm_mpid=1 other_config:cfm_interval=100 other_config:cfm_extended=true -- \
222                     set Interface p1 cfm_mpid=2 other_config:cfm_interval=100 other_config:cfm_extended=true])
223
224 ovs-appctl time/stop
225 # wait for a while to stablize cfm.
226 for i in `seq 0 100`; do ovs-appctl time/warp 100; done
227 CFM_CHECK_EXTENDED([p0], [1], [100], [up], [up], [100ms], [2], [up])
228 CFM_CHECK_EXTENDED([p1], [2], [100], [up], [up], [100ms], [1], [up])
229 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore])
230 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[]]])
231
232 # set a fault and see that this is shown in the CFM module and the database
233 AT_CHECK([ovs-appctl cfm/set-fault p1 true], [0], [OK
234 ])
235 AT_CHECK([ovs-appctl time/warp 100], [0], [ignore])
236 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override' | sed -e 's/MPID [[0-9]]*: extended //'], [0], [dnl
237 fault_override
238 ])
239 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[override]]])
240
241 # reset and see that it returned to normal
242 AT_CHECK([ovs-appctl cfm/set-fault normal], [0], [OK
243 ])
244 AT_CHECK([ovs-appctl time/warp 100], [0], [ignore])
245 AT_CHECK([ovs-appctl cfm/show p1 | grep 'fault_override'], [1], [ignore])
246 CFM_VSCTL_LIST_IFACE([p1], [cfm_fault_status], [cfm_fault_status    : [[]]])
247
248 OVS_VSWITCHD_STOP
249 AT_CLEANUP