Bug #9015.
Signed-off-by: Ethan Jackson <[email protected]>
---
lib/cfm.c | 7 +++++--
lib/cfm.h | 1 +
vswitchd/bridge.c | 2 ++
vswitchd/vswitch.xml | 9 +++++++++
4 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/lib/cfm.c b/lib/cfm.c
index d62d4e2..537eeaa 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 334b80c..5106a51 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 06e9088..ece21be 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -3138,6 +3138,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 b720f05..42828fe 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -1715,6 +1715,15 @@
with the given value.
</column>
+ <column name="other_config" key="cfm_ccm_pcp"
+ type='{"type": "integer", "minInteger": 1, "maxInteger": 7}'>
+ 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 goverened by the
+ value of <ref column="other_config" key="cfm_ccm_vlan"/>. If
+ <ref column="other_config" key="cfm_ccm_vlan"/> is unset, a VLAN ID of
+ zero is used.
+ </column>
+
</group>
<group title="Bonding Configuration">
--
1.7.8.3
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev