learning-switch: Refactor wildcards calculation.
authorBen Pfaff <blp@nicira.com>
Thu, 15 Jul 2010 23:20:37 +0000 (16:20 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 16 Jul 2010 19:04:11 +0000 (12:04 -0700)
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

index 413a70fd6943b84e71afb11f98042fe38bd9637b..c837fd0f549a061c306b0a2ddc81e448d00e444d 100644 (file)
@@ -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. */