projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dpif: Don't log warning for ENOENT with dpif_port_exists().
[openvswitch]
/
lib
/
cfm.c
diff --git
a/lib/cfm.c
b/lib/cfm.c
index 65701781a3c8e734e4273ca31b22c4a667d80009..b71c242a54763eb4a182b7df98af1e591f2d328f 100644
(file)
--- a/
lib/cfm.c
+++ b/
lib/cfm.c
@@
-86,7
+86,9
@@
struct cfm {
struct hmap_node hmap_node; /* Node in all_cfms list. */
uint64_t mpid;
struct hmap_node hmap_node; /* Node in all_cfms list. */
uint64_t mpid;
+ bool check_tnl_key; /* Verify the tunnel key of inbound packets? */
bool extended; /* Extended mode. */
bool extended; /* Extended mode. */
+ bool booted; /* A full fault interval has occured. */
enum cfm_fault_reason fault; /* Connectivity fault status. */
enum cfm_fault_reason recv_fault; /* Bit mask of faults occuring on
receive. */
enum cfm_fault_reason fault; /* Connectivity fault status. */
enum cfm_fault_reason recv_fault; /* Bit mask of faults occuring on
receive. */
@@
-407,6
+409,7
@@
cfm_run(struct cfm *cfm)
ds_destroy(&ds);
}
ds_destroy(&ds);
}
+ cfm->booted = true;
timer_set_duration(&cfm->fault_timer, interval);
VLOG_DBG("%s: new fault interval", cfm->name);
}
timer_set_duration(&cfm->fault_timer, interval);
VLOG_DBG("%s: new fault interval", cfm->name);
}
@@
-469,7
+472,7
@@
cfm_compose_ccm(struct cfm *cfm, struct ofpbuf *packet,
ccm->interval_ms_x = htons(0);
}
ccm->interval_ms_x = htons(0);
}
- if (hmap_is_empty(&cfm->remote_mps)) {
+ if (
cfm->booted &&
hmap_is_empty(&cfm->remote_mps)) {
ccm->flags |= CCM_RDI_MASK;
}
ccm->flags |= CCM_RDI_MASK;
}
@@
-503,6
+506,7
@@
cfm_configure(struct cfm *cfm, const struct cfm_settings *s)
}
cfm->mpid = s->mpid;
}
cfm->mpid = s->mpid;
+ cfm->check_tnl_key = s->check_tnl_key;
cfm->extended = s->extended;
cfm->opup = s->opup;
interval = ms_to_ccm_interval(s->interval);
cfm->extended = s->extended;
cfm->opup = s->opup;
interval = ms_to_ccm_interval(s->interval);
@@
-531,7
+535,8
@@
bool
cfm_should_process_flow(const struct cfm *cfm, const struct flow *flow)
{
return (ntohs(flow->dl_type) == ETH_TYPE_CFM
cfm_should_process_flow(const struct cfm *cfm, const struct flow *flow)
{
return (ntohs(flow->dl_type) == ETH_TYPE_CFM
- && eth_addr_equals(flow->dl_dst, cfm_ccm_addr(cfm)));
+ && eth_addr_equals(flow->dl_dst, cfm_ccm_addr(cfm))
+ && (!cfm->check_tnl_key || flow->tunnel.tun_id == htonll(0)));
}
/* Updates internal statistics relevant to packet 'p'. Should be called on
}
/* Updates internal statistics relevant to packet 'p'. Should be called on
@@
-682,12
+687,17
@@
cfm_get_health(const struct cfm *cfm)
/* Gets the operational state of 'cfm'. 'cfm' is considered operationally down
* if it has received a CCM with the operationally down bit set from any of its
/* Gets the operational state of 'cfm'. 'cfm' is considered operationally down
* if it has received a CCM with the operationally down bit set from any of its
- * remote maintenance points. Returns true if 'cfm' is operationally up. False
- * otherwise. */
-bool
+ * remote maintenance points. Returns 1 if 'cfm' is operationally up, 0 if
+ * 'cfm' is operationally down, or -1 if 'cfm' has no operational state
+ * (because it isn't in extended mode). */
+int
cfm_get_opup(const struct cfm *cfm)
{
cfm_get_opup(const struct cfm *cfm)
{
- return cfm->remote_opup;
+ if (cfm->extended) {
+ return cfm->remote_opup;
+ } else {
+ return -1;
+ }
}
/* Populates 'rmps' with an array of remote maintenance points reachable by
}
/* Populates 'rmps' with an array of remote maintenance points reachable by