mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 22:35:15 +00:00
cfm: No longer allow configuration of ma_name and md_name.
These settings added complexity to the database and CFM module interface with negligible benefit. This patch removes them in such a way that they can easily be re-added in the (unlikely) event that we need them in the future.
This commit is contained in:
69
lib/cfm.c
69
lib/cfm.c
@@ -17,6 +17,7 @@
|
||||
#include <config.h>
|
||||
#include "cfm.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -44,6 +45,7 @@ struct cfm_internal {
|
||||
uint32_t seq; /* The sequence number of our last CCM. */
|
||||
uint8_t ccm_interval; /* The CCM transmission interval. */
|
||||
int ccm_interval_ms; /* 'ccm_interval' in milliseconds. */
|
||||
uint8_t maid[CCM_MAID_LEN]; /* The MAID of this CFM. */
|
||||
|
||||
struct timer tx_timer; /* Send CCM when expired. */
|
||||
struct timer fault_timer; /* Check for faults when expired. */
|
||||
@@ -55,6 +57,31 @@ static struct list all_cfms = LIST_INITIALIZER(&all_cfms);
|
||||
static void cfm_unixctl_show(struct unixctl_conn *, const char *args,
|
||||
void *aux);
|
||||
|
||||
static void
|
||||
cfm_generate_maid(struct cfm_internal *cfmi)
|
||||
{
|
||||
const char *ovs_md_name = "ovs_md";
|
||||
const char *ovs_ma_name = "ovs_ma";
|
||||
uint8_t *ma_p;
|
||||
size_t md_len, ma_len;
|
||||
|
||||
memset(cfmi->maid, 0, CCM_MAID_LEN);
|
||||
|
||||
md_len = strlen(ovs_md_name);
|
||||
ma_len = strlen(ovs_ma_name);
|
||||
|
||||
assert(md_len && ma_len && md_len + ma_len + 4 <= CCM_MAID_LEN);
|
||||
|
||||
cfmi->maid[0] = 4; /* MD name string format. */
|
||||
cfmi->maid[1] = md_len; /* MD name size. */
|
||||
memcpy(&cfmi->maid[2], ovs_md_name, md_len); /* MD name. */
|
||||
|
||||
ma_p = cfmi->maid + 2 + md_len;
|
||||
ma_p[0] = 2; /* MA name string format. */
|
||||
ma_p[1] = ma_len; /* MA name size. */
|
||||
memcpy(&ma_p[2], ovs_ma_name, ma_len); /* MA name. */
|
||||
}
|
||||
|
||||
static int
|
||||
ccm_interval_to_ms(uint8_t interval)
|
||||
{
|
||||
@@ -154,6 +181,7 @@ cfm_create(void)
|
||||
cfm = &cfmi->cfm;
|
||||
|
||||
hmap_init(&cfm->remote_mps);
|
||||
cfm_generate_maid(cfmi);
|
||||
list_push_back(&all_cfms, &cfmi->list_node);
|
||||
return cfm;
|
||||
}
|
||||
@@ -233,7 +261,7 @@ cfm_compose_ccm(struct cfm *cfm, struct ccm *ccm)
|
||||
ccm->seq = htonl(++cfmi->seq);
|
||||
ccm->mpid = htons(cfmi->cfm.mpid);
|
||||
ccm->flags = cfmi->ccm_interval;
|
||||
memcpy(ccm->maid, cfmi->cfm.maid, sizeof ccm->maid);
|
||||
memcpy(ccm->maid, cfmi->maid, sizeof ccm->maid);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -317,43 +345,6 @@ cfm_get_remote_mp(const struct cfm *cfm, uint16_t mpid)
|
||||
return lookup_remote_mp(&cfm->remote_mps, mpid);
|
||||
}
|
||||
|
||||
/* Generates 'maid' from 'md_name' and 'ma_name'. A NULL parameter indicates
|
||||
* the default should be used. Returns false if unsuccessful. */
|
||||
bool
|
||||
cfm_generate_maid(const char *md_name, const char *ma_name,
|
||||
uint8_t maid[CCM_MAID_LEN])
|
||||
{
|
||||
uint8_t *ma_p;
|
||||
size_t md_len, ma_len;
|
||||
|
||||
if (!md_name) {
|
||||
md_name = "ovs";
|
||||
}
|
||||
|
||||
if (!ma_name) {
|
||||
ma_name = "ovs";
|
||||
}
|
||||
|
||||
memset(maid, 0, CCM_MAID_LEN);
|
||||
|
||||
md_len = strlen(md_name);
|
||||
ma_len = strlen(ma_name);
|
||||
|
||||
if (!md_len || !ma_len || md_len + ma_len + 4 > CCM_MAID_LEN) {
|
||||
return false;
|
||||
}
|
||||
|
||||
maid[0] = 4; /* MD name string format. */
|
||||
maid[1] = md_len; /* MD name size. */
|
||||
memcpy(&maid[2], md_name, md_len); /* MD name. */
|
||||
|
||||
ma_p = maid + 2 + md_len;
|
||||
ma_p[0] = 2; /* MA name string format. */
|
||||
ma_p[1] = ma_len; /* MA name size. */
|
||||
memcpy(&ma_p[2], ma_name, ma_len); /* MA name. */
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Returns true if the CFM library should process packets from 'flow'. */
|
||||
bool
|
||||
cfm_should_process_flow(const struct flow *flow)
|
||||
@@ -398,7 +389,7 @@ cfm_process_heartbeat(struct cfm *cfm, const struct ofpbuf *p)
|
||||
* them judiciously, especially when CFM is used to check slave status of
|
||||
* bonds. Furthermore, faults can be maliciously triggered by crafting
|
||||
* invalid CCMs. */
|
||||
if (memcmp(ccm->maid, cfm->maid, sizeof ccm->maid)) {
|
||||
if (memcmp(ccm->maid, cfmi->maid, sizeof ccm->maid)) {
|
||||
VLOG_WARN_RL(&rl, "Received unexpected remote MAID from MAC "
|
||||
ETH_ADDR_FMT, ETH_ADDR_ARGS(eth->eth_src));
|
||||
} else {
|
||||
|
@@ -53,7 +53,6 @@ BUILD_ASSERT_DECL(CCM_LEN == sizeof(struct ccm));
|
||||
struct cfm {
|
||||
/* Configuration Variables. */
|
||||
uint16_t mpid; /* The MPID of this CFM. */
|
||||
uint8_t maid[CCM_MAID_LEN]; /* The MAID of this CFM. */
|
||||
int interval; /* The requested transmission interval. */
|
||||
const char *name; /* Name of this CFM object. */
|
||||
|
||||
@@ -92,9 +91,6 @@ void cfm_update_remote_mps(struct cfm *, const uint16_t *mpid, size_t n_mpids);
|
||||
|
||||
const struct remote_mp *cfm_get_remote_mp(const struct cfm *, uint16_t mpid);
|
||||
|
||||
bool cfm_generate_maid(const char *md_name, const char *ma_name,
|
||||
uint8_t maid[CCM_MAID_LEN]);
|
||||
|
||||
bool cfm_should_process_flow(const struct flow *);
|
||||
|
||||
void cfm_process_heartbeat(struct cfm *, const struct ofpbuf *packet);
|
||||
|
@@ -751,7 +751,6 @@ set_cfm(struct ofport *ofport_, const struct cfm *cfm,
|
||||
ofport->cfm->mpid = cfm->mpid;
|
||||
ofport->cfm->interval = cfm->interval;
|
||||
ofport->cfm->name = cfm->name;
|
||||
memcpy(ofport->cfm->maid, cfm->maid, CCM_MAID_LEN);
|
||||
|
||||
cfm_update_remote_mps(ofport->cfm, remote_mps, n_remote_mps);
|
||||
|
||||
|
@@ -2505,7 +2505,6 @@ iface_configure_cfm(struct iface *iface)
|
||||
struct cfm cfm;
|
||||
uint16_t *remote_mps;
|
||||
struct ovsrec_monitor *mon;
|
||||
uint8_t maid[CCM_MAID_LEN];
|
||||
|
||||
mon = iface->cfg->monitor;
|
||||
|
||||
@@ -2514,17 +2513,10 @@ iface_configure_cfm(struct iface *iface)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cfm_generate_maid(mon->md_name, mon->ma_name, maid)) {
|
||||
VLOG_WARN("interface %s: Failed to generate MAID.", iface->name);
|
||||
return;
|
||||
}
|
||||
|
||||
cfm.mpid = mon->mpid;
|
||||
cfm.interval = mon->interval ? *mon->interval : 1000;
|
||||
cfm.name = iface->name;
|
||||
|
||||
memcpy(cfm.maid, maid, sizeof cfm.maid);
|
||||
|
||||
remote_mps = xzalloc(mon->n_remote_mps * sizeof *remote_mps);
|
||||
for(i = 0; i < mon->n_remote_mps; i++) {
|
||||
remote_mps[i] = mon->remote_mps[i]->mpid;
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{"name": "Open_vSwitch",
|
||||
"version": "3.4.2",
|
||||
"cksum": "976911089 15276",
|
||||
"version": "3.5.0",
|
||||
"cksum": "1684955806 14964",
|
||||
"tables": {
|
||||
"Open_vSwitch": {
|
||||
"columns": {
|
||||
@@ -204,16 +204,6 @@
|
||||
"mpid": {
|
||||
"type" : {
|
||||
"key": { "type": "integer", "minInteger": 1, "maxInteger": 8191}}},
|
||||
"md_name": {
|
||||
"type" : {
|
||||
"key": { "type": "string", "minLength": 1, "maxLength": 43},
|
||||
"min": 0,
|
||||
"max": 1}},
|
||||
"ma_name": {
|
||||
"type" : {
|
||||
"key": { "type": "string", "minLength": 1, "maxLength": 43},
|
||||
"min": 0,
|
||||
"max": 1}},
|
||||
"interval": {
|
||||
"type": {
|
||||
"key": { "type": "integer", "minInteger": 100},
|
||||
|
@@ -1550,9 +1550,8 @@
|
||||
<group title="Monitor Configuration">
|
||||
<column name="mpid">
|
||||
A Maintenance Point ID (MPID) uniquely identifies each endpoint within
|
||||
a Maintenance Association (see <ref column="ma_name"/>). The MPID is
|
||||
used to identify this <ref table="Monitor"/> to other endpoints in the
|
||||
MA.
|
||||
a Maintenance Association. The MPID is used to identify this
|
||||
<ref table="Monitor"/> to other endpoints in the MA.
|
||||
</column>
|
||||
|
||||
<column name="remote_mps">
|
||||
@@ -1563,18 +1562,6 @@
|
||||
signaled.
|
||||
</column>
|
||||
|
||||
<column name="ma_name">
|
||||
A Maintenance Association (MA) name pairs with a Maintenance Domain
|
||||
(MD) name to uniquely identify a MA. A MA is a group of endpoints who
|
||||
have complete and exclusive interconnectivity. Defaults to
|
||||
<code>ovs</code> if unset.
|
||||
</column>
|
||||
|
||||
<column name="md_name">
|
||||
A Maintenance Domain name pairs with a Maintenance Association name to
|
||||
uniquely identify a MA. Defaults to <code>ovs</code> if unset.
|
||||
</column>
|
||||
|
||||
<column name="interval">
|
||||
The transmission interval of CCMs in milliseconds. Three missed CCMs
|
||||
indicate a connectivity fault. Defaults to 1000ms.
|
||||
|
Reference in New Issue
Block a user