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

Reply via email to