X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fcfm.c;h=670f03710f0c6f37de43a4bb680f796b03794658;hb=1dc6839d2dd4e672742114a2664f5130c3235f3d;hp=38de68f79ce0d94aecb3a1bbda04daa7335b48c1;hpb=56eb405ae4e84d095240f51ea7d93528b5c3a619;p=openvswitch diff --git a/lib/cfm.c b/lib/cfm.c index 38de68f7..670f0371 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, 2012 Nicira Networks. + * Copyright (c) 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,19 +62,19 @@ static const uint8_t eth_addr_ccm_x[6] = { #define CCM_RDI_MASK 0x80 #define CFM_HEALTH_INTERVAL 6 struct ccm { - uint8_t mdlevel_version; /* MD Level and Version */ - uint8_t opcode; - uint8_t flags; - uint8_t tlv_offset; + uint8_t mdlevel_version; /* MD Level and Version */ + uint8_t opcode; + uint8_t flags; + uint8_t tlv_offset; ovs_be32 seq; ovs_be16 mpid; - uint8_t maid[CCM_MAID_LEN]; + uint8_t maid[CCM_MAID_LEN]; /* Defined by ITU-T Y.1731 should be zero */ ovs_be16 interval_ms_x; /* Transmission interval in ms. */ ovs_be64 mpid64; /* MPID in extended mode. */ uint8_t opdown; /* Operationally down. */ - uint8_t zero[5]; + uint8_t zero[5]; /* TLV space. */ uint8_t end_tlv; @@ -118,7 +118,7 @@ struct cfm { received. */ int health_interval; /* Number of fault_intervals since health was recomputed. */ - + long long int last_tx; /* Last CCM transmission time. */ }; /* Remote MPs represent foreign network entities that are configured to have @@ -299,6 +299,7 @@ cfm_create(const char *name) cfm->remote_opup = true; cfm->fault_override = -1; cfm->health = -1; + cfm->last_tx = 0; return cfm; } @@ -404,6 +405,7 @@ cfm_run(struct cfm *cfm) } timer_set_duration(&cfm->fault_timer, interval); + VLOG_DBG("%s: new fault interval", cfm->name); } } @@ -465,6 +467,16 @@ cfm_compose_ccm(struct cfm *cfm, struct ofpbuf *packet, if (hmap_is_empty(&cfm->remote_mps)) { ccm->flags |= CCM_RDI_MASK; } + + if (cfm->last_tx) { + long long int delay = time_msec() - cfm->last_tx; + if (delay > (cfm->ccm_interval_ms * 3 / 2)) { + VLOG_WARN("%s: long delay of %lldms (expected %dms) sending CCM" + " seq %"PRIu32, cfm->name, delay, cfm->ccm_interval_ms, + cfm->seq); + } + } + cfm->last_tx = time_msec(); } void @@ -606,7 +618,7 @@ cfm_process_heartbeat(struct cfm *cfm, const struct ofpbuf *p) if (ccm_rdi) { cfm_fault |= CFM_FAULT_RDI; VLOG_DBG("%s: RDI bit flagged from RMP %"PRIu64, cfm->name, - rmp->mpid); + ccm_mpid); } VLOG_DBG("%s: received CCM (seq %"PRIu32") (mpid %"PRIu64")"