From: Ethan Jackson Date: Thu, 2 Feb 2012 23:48:13 +0000 (-0800) Subject: cfm: Support high priority CCM broadcasts. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7aa2d3cab85074dcd78c988eb86cf4628bad8e0;p=openvswitch cfm: Support high priority CCM broadcasts. Bug #9015. Signed-off-by: Ethan Jackson --- diff --git a/NEWS b/NEWS index 8b39b82e..193cf1c3 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,7 @@ post-v1.5.0 - ovsdb-client: - The new option --timestamp causes the "monitor" command to print a timestamp with every update. + - CFM module CCM broadcasts can now be tagged with an 802.1p priority. v1.5.0 - xx xxx xxxx diff --git a/lib/cfm.c b/lib/cfm.c index d62d4e20..537eeaa1 100644 --- a/lib/cfm.c +++ b/lib/cfm.c @@ -97,6 +97,7 @@ struct cfm { uint8_t ccm_interval; /* The CCM transmission interval. */ int ccm_interval_ms; /* 'ccm_interval' in milliseconds. */ uint16_t ccm_vlan; /* Vlan tag of CCM PDUs. */ + uint8_t ccm_pcp; /* Priority of CCM PDUs. */ uint8_t maid[CCM_MAID_LEN]; /* The MAID of this CFM. */ struct timer tx_timer; /* Send CCM when expired. */ @@ -361,8 +362,9 @@ cfm_compose_ccm(struct cfm *cfm, struct ofpbuf *packet, timer_set_duration(&cfm->tx_timer, cfm->ccm_interval_ms); eth_compose(packet, cfm_ccm_addr(cfm), eth_src, ETH_TYPE_CFM, sizeof *ccm); - if (cfm->ccm_vlan) { - eth_push_vlan(packet, htons(cfm->ccm_vlan)); + if (cfm->ccm_vlan || cfm->ccm_pcp) { + uint16_t tci = cfm->ccm_vlan | (cfm->ccm_pcp << VLAN_PCP_SHIFT); + eth_push_vlan(packet, htons(tci)); } ccm = packet->l3; @@ -420,6 +422,7 @@ cfm_configure(struct cfm *cfm, const struct cfm_settings *s) interval_ms = ccm_interval_to_ms(interval); cfm->ccm_vlan = s->ccm_vlan & VLAN_VID_MASK; + cfm->ccm_pcp = s->ccm_pcp & (VLAN_PCP_MASK >> VLAN_PCP_SHIFT); if (cfm->extended && interval_ms != s->interval) { interval = 0; interval_ms = MIN(s->interval, UINT16_MAX); diff --git a/lib/cfm.h b/lib/cfm.h index 334b80c0..5106a51b 100644 --- a/lib/cfm.h +++ b/lib/cfm.h @@ -30,6 +30,7 @@ struct cfm_settings { bool extended; /* Run in extended mode. */ bool opup; /* Operational State. */ uint16_t ccm_vlan; /* CCM Vlan tag. Zero if none. */ + uint8_t ccm_pcp; /* CCM Priority. Zero if none. */ }; void cfm_init(void); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 3c1aecfa..c175c58f 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -3218,6 +3218,8 @@ iface_configure_cfm(struct iface *iface) "0")); s.ccm_vlan = atoi(get_interface_other_config(iface->cfg, "cfm_ccm_vlan", "0")); + s.ccm_pcp = atoi(get_interface_other_config(iface->cfg, "cfm_ccm_pcp", + "0")); if (s.interval <= 0) { s.interval = 1000; } diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index 41325255..beaf8f28 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -1742,6 +1742,15 @@ with the given value. + + When set, the CFM module will apply a VLAN tag to all CCMs it generates + with the given PCP value. The VLAN ID of the tag is governed by the + value of . If + is unset, a VLAN ID of + zero is used. + +