[ovs-dev] [tos 3/3] vswitch: Implement dscp column of the Queue table.

Ethan Jackson ethan at nicira.com
Wed Nov 23 19:28:32 UTC 2011


Here's an incremental.

---
 ofproto/ofproto-dpif.c     |   55 +++++++++++++++++++++++--------------------
 ofproto/ofproto-provider.h |    8 ++++--
 ofproto/ofproto.c          |    8 ++++--
 vswitchd/vswitch.xml       |    2 +-
 4 files changed, 40 insertions(+), 33 deletions(-)

diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index b32df2e..650cb1f 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -326,12 +326,15 @@ struct ofport_dpif {
     enum stp_state stp_state;   /* Always STP_DISABLED if STP not in use. */
     long long int stp_state_entered;
 
-    struct hmap priorities;     /* Map of attached 'priority_node's. */
+    struct hmap priorities;     /* Map of attached 'priority_to_dscp's. */
 };
 
-struct priority_node {
-    uint32_t priority;          /* Priority of this queue. */
+/* Node in 'ofport_dpif''s 'priorities' map.  Used to maintain a map from
+ * 'priority' (the datapath's term for QoS queue) to the dscp bits which all
+ * traffic egressing the 'ofport' with that priority should be marked with. */
+struct priority_to_dscp {
     struct hmap_node hmap_node; /* Node in 'ofport_dpif''s 'priorities' map. */
+    uint32_t priority;          /* Priority of this queue (see struct flow). */
 
     uint8_t dscp;               /* DSCP bits to mark outgoing traffic with. */
 };
@@ -1186,16 +1189,16 @@ stp_process_packet(const struct ofport_dpif *ofport,
     }
 }
 
-static struct priority_node *
+static struct priority_to_dscp *
 get_priority(const struct ofport_dpif *ofport, uint32_t priority)
 {
-    struct priority_node *pnode;
+    struct priority_to_dscp *pdscp;
     uint32_t hash;
 
     hash = hash_int(priority, 0);
-    HMAP_FOR_EACH_IN_BUCKET (pnode, hmap_node, hash, &ofport->priorities) {
-        if (pnode->priority == priority) {
-            return pnode;
+    HMAP_FOR_EACH_IN_BUCKET (pdscp, hmap_node, hash, &ofport->priorities) {
+        if (pdscp->priority == priority) {
+            return pdscp;
         }
     }
     return NULL;
@@ -1204,11 +1207,11 @@ get_priority(const struct ofport_dpif *ofport, uint32_t priority)
 static void
 ofport_clear_priorities(struct ofport_dpif *ofport)
 {
-    struct priority_node *pnode, *next;
+    struct priority_to_dscp *pdscp, *next;
 
-    HMAP_FOR_EACH_SAFE (pnode, next, hmap_node, &ofport->priorities) {
-        hmap_remove(&ofport->priorities, &pnode->hmap_node);
-        free(pnode);
+    HMAP_FOR_EACH_SAFE (pdscp, next, hmap_node, &ofport->priorities) {
+        hmap_remove(&ofport->priorities, &pdscp->hmap_node);
+        free(pdscp);
     }
 }
 
@@ -1223,7 +1226,7 @@ set_queues(struct ofport *ofport_,
     size_t i;
 
     for (i = 0; i < n_qdscp; i++) {
-        struct priority_node *pnode;
+        struct priority_to_dscp *pdscp;
         uint32_t priority;
         uint8_t dscp;
 
@@ -1233,22 +1236,22 @@ set_queues(struct ofport *ofport_,
             continue;
         }
 
-        pnode = get_priority(ofport, priority);
-        if (pnode) {
-            hmap_remove(&ofport->priorities, &pnode->hmap_node);
+        pdscp = get_priority(ofport, priority);
+        if (pdscp) {
+            hmap_remove(&ofport->priorities, &pdscp->hmap_node);
         } else {
-            pnode = xmalloc(sizeof *pnode);
-            pnode->priority = priority;
-            pnode->dscp = dscp;
+            pdscp = xmalloc(sizeof *pdscp);
+            pdscp->priority = priority;
+            pdscp->dscp = dscp;
             ofproto->need_revalidate = true;
         }
 
-        if (pnode->dscp != dscp) {
-            pnode->dscp = dscp;
+        if (pdscp->dscp != dscp) {
+            pdscp->dscp = dscp;
             ofproto->need_revalidate = true;
         }
 
-        hmap_insert(&new, &pnode->hmap_node, hash_int(pnode->priority, 0));
+        hmap_insert(&new, &pdscp->hmap_node, hash_int(pdscp->priority, 0));
     }
 
     if (!hmap_is_empty(&ofport->priorities)) {
@@ -3868,17 +3871,17 @@ compose_output_action__(struct action_xlate_ctx *ctx, uint16_t ofp_port,
     uint8_t flow_nw_tos = ctx->flow.nw_tos;
 
     if (ofport) {
-        struct priority_node *pnode;
+        struct priority_to_dscp *pdscp;
 
         if (ofport->up.opp.config & htonl(OFPPC_NO_FWD)
             || (check_stp && !stp_forward_in_state(ofport->stp_state))) {
             return;
         }
 
-        pnode = get_priority(ofport, ctx->flow.priority);
-        if (pnode) {
+        pdscp = get_priority(ofport, ctx->flow.priority);
+        if (pdscp) {
             ctx->flow.nw_tos &= ~IP_DSCP_MASK;
-            ctx->flow.nw_tos |= pnode->dscp;
+            ctx->flow.nw_tos |= pdscp->dscp;
         }
     } else {
         /* We may not have an ofport record for this port, but it doesn't hurt
diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index ed06a35..d303632 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -965,9 +965,11 @@ struct ofproto_class {
     int (*get_stp_port_status)(struct ofport *ofport,
                                struct ofproto_port_stp_status *s);
 
-    /* Registers the Quality of Service 'queues' associated with 'ofport'.
-     * 'queues' is an array of Queue elements in arbitrary order with 'n_qdscp'
-     * elements.
+    /* Registers meta-data associated with the 'n_qdscp' Qualities of Service
+     * 'queues' attached to 'ofport'.  This data is not intended to be
+     * sufficient to implement QoS.  Instead, providers may use this
+     * information to implement features which require knowledge of what queues
+     * exist on a port, and some basic information about them.
      *
      * EOPNOTSUPP as a return value indicates that this ofproto_class does not
      * support QoS, as does a null pointer. */
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index f08d64e..af02a0e 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -605,9 +605,11 @@ ofproto_port_get_stp_status(struct ofproto *ofproto, uint16_t ofp_port,
 
 /* Queue DSCP configuration. */
 
-/* Registers the Quality of Service 'queues' associated with 'ofp_port' in
- * 'ofproto'.  'queues' is an array of Queue elements in arbitrary order with
- * 'n_qdscp' elements.
+/* Registers meta-data associated with the 'n_qdscp' Qualities of Service
+ * 'queues' attached to 'ofport'.  This data is not intended to be sufficient
+ * to implement QoS.  Instead, it is used to implement features which require
+ * knowledge of what queues exist on a port, and some basic information about
+ * them.
  *
  * Returns 0 if successful, otherwise a positive errno value. */
 int
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 9bbd532..8eba5cb 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -1845,7 +1845,7 @@
     <column name="dscp">
       If set, Open vSwitch will mark all traffic egressing this
       <ref table="Queue"/> with the given DSCP bits.  Traffic egressing the
-      default <ref table="Queue"/> is only marked if it was explicity selected
+      default <ref table="Queue"/> is only marked if it was explicitly selected
       as the <ref table="Queue"/> at the time the packet was output.  If unset,
       the DSCP bits of traffic egressing this <ref table="Queue"/> will remain
       unchanged.
-- 
1.7.7.1




More information about the dev mailing list