From: Ethan Jackson Date: Fri, 1 Apr 2011 20:22:44 +0000 (-0700) Subject: cfm: cfm_configure() only update when necessary. X-Git-Tag: v1.1.0~8 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=9aa952b2dd7c091c63dbfc7becb3b3dcc9f7bfce cfm: cfm_configure() only update when necessary. Calling cfm_configure often could cause timers to be reset resulting in unexpected behavior. This commit only updates when cfm configuration actually changed. Bug #5244. --- diff --git a/lib/cfm.c b/lib/cfm.c index f6cfb2e67..f9b348863 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -230,19 +230,24 @@ cfm_wait(struct cfm *cfm) bool cfm_configure(struct cfm *cfm) { - struct cfm_internal *cfmi; + struct cfm_internal *cfmi = cfm_to_internal(cfm); + uint8_t interval; if (!cfm_is_valid_mpid(cfm->mpid) || !cfm->interval) { return false; } - cfmi = cfm_to_internal(cfm); - cfmi->ccm_interval = ms_to_ccm_interval(cfm->interval); - cfmi->ccm_interval_ms = ccm_interval_to_ms(cfmi->ccm_interval); + interval = ms_to_ccm_interval(cfm->interval); + + if (interval != cfmi->ccm_interval) { + cfmi->ccm_interval = interval; + cfmi->ccm_interval_ms = ccm_interval_to_ms(interval); + + /* Force a resend and check in case anything changed. */ + timer_set_expired(&cfmi->tx_timer); + timer_set_expired(&cfmi->fault_timer); + } - /* Force a resend and check in case anything changed. */ - timer_set_expired(&cfmi->tx_timer); - timer_set_expired(&cfmi->fault_timer); return true; }