[ovs-dev] [QoS fixes 02/10] learning-switch: Refactor wildcards calculation.

Ben Pfaff blp at nicira.com
Fri Jul 16 22:52:45 UTC 2010


There's no need to calculate the wildcards to use for each flow, since it
is a constant across every flow.  In my opinion this also makes
process_packet_in() a little easier to understand, since it deletes a few
lines of code from a relatively complicated function.
---
 lib/learning-switch.c |   28 ++++++++++++----------------
 1 files changed, 12 insertions(+), 16 deletions(-)

diff --git a/lib/learning-switch.c b/lib/learning-switch.c
index 413a70f..c837fd0 100644
--- a/lib/learning-switch.c
+++ b/lib/learning-switch.c
@@ -58,7 +58,7 @@ struct lswitch {
     uint32_t capabilities;
     time_t last_features_request;
     struct mac_learning *ml;    /* NULL to act as hub instead of switch. */
-    bool exact_flows;           /* Use exact-match flows? */
+    uint32_t wildcards;         /* Wildcards to apply to flows. */
     bool action_normal;         /* Use OFPP_NORMAL? */
 
     /* Number of outgoing queued packets on the rconn. */
@@ -120,7 +120,16 @@ lswitch_create(struct rconn *rconn, bool learn_macs,
     sw->last_features_request = time_now() - 1;
     sw->ml = learn_macs ? mac_learning_create() : NULL;
     sw->action_normal = action_normal;
-    sw->exact_flows = exact_flows;
+    if (exact_flows) {
+        /* Exact match. */
+        sw->wildcards = 0;
+    } else {
+        /* We cannot wildcard all fields.
+         * We need in_port to detect moves.
+         * We need both SA and DA to do learning. */
+        sw->wildcards = (OFPFW_DL_TYPE | OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK
+                         | OFPFW_NW_PROTO | OFPFW_TP_SRC | OFPFW_TP_DST);
+    }
     sw->queued = rconn_packet_counter_create();
     sw->next_query = LLONG_MIN;
     sw->last_query = LLONG_MIN;
@@ -433,19 +442,6 @@ process_packet_in(struct lswitch *sw, struct rconn *rconn, void *opi_)
     } else if (sw->max_idle >= 0 && (!sw->ml || out_port != OFPP_FLOOD)) {
         struct ofpbuf *buffer;
         struct ofp_flow_mod *ofm;
-        uint32_t wildcards;
-
-        /* Check if we need to wildcard the flows. */
-        if (!sw->exact_flows) {
-            /* We can not wildcard all fields.
-             * We need in_port to detect moves.
-             * We need both SA and DA to do learning. */
-            wildcards = (OFPFW_DL_TYPE | OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK
-                         | OFPFW_NW_PROTO | OFPFW_TP_SRC | OFPFW_TP_DST);
-        } else {
-            /* Exact match */
-            wildcards = 0;
-        }
 
         /* Check if we need to use "NORMAL" action. */
         if (sw->action_normal && out_port != OFPP_FLOOD) {
@@ -457,7 +453,7 @@ process_packet_in(struct lswitch *sw, struct rconn *rconn, void *opi_)
         buffer = make_add_simple_flow(&flow, ntohl(opi->buffer_id),
                                       out_port, sw->max_idle);
         ofm = buffer->data;
-        ofm->match.wildcards = htonl(wildcards);
+        ofm->match.wildcards = htonl(sw->wildcards);
         queue_tx(sw, rconn, buffer);
 
         /* If the switch didn't buffer the packet, we need to send a copy. */
-- 
1.7.1





More information about the dev mailing list