Use new method to describe table entries in OpenFlow wire protocol.
[openvswitch] / datapath / table-hash.c
index 46acf80e39f256bd84a1303cb20076b11d7a5d62..b0ce0b78f3a3cc113d79753fa7d58741c4f6abff 100644 (file)
@@ -31,7 +31,8 @@ static struct sw_flow **find_bucket(struct sw_table *swt,
                                                                        const struct sw_flow_key *key)
 {
        struct sw_table_hash *th = (struct sw_table_hash *) swt;
-       unsigned int crc = crc32_calculate(&th->crc32, key, sizeof *key);
+       unsigned int crc = crc32_calculate(&th->crc32, key, 
+                               offsetof(struct sw_flow_key, wildcards));
        return &th->buckets[crc & th->bucket_mask];
 }
 
@@ -39,7 +40,7 @@ static struct sw_flow *table_hash_lookup(struct sw_table *swt,
                                                                                 const struct sw_flow_key *key)
 {
        struct sw_flow *flow = *find_bucket(swt, key);
-       return flow && !memcmp(&flow->key, key, sizeof *key) ? flow : NULL;
+       return flow && flow_keys_equal(&flow->key, key) ? flow : NULL;
 }
 
 static int table_hash_insert(struct sw_table *swt, struct sw_flow *flow)
@@ -58,7 +59,7 @@ static int table_hash_insert(struct sw_table *swt, struct sw_flow *flow)
                retval = 1;
        } else {
                struct sw_flow *old_flow = *bucket;
-               if (!memcmp(&old_flow->key, &flow->key, sizeof flow->key)) {
+               if (flow_keys_equal(&old_flow->key, &flow->key)) {
                        rcu_assign_pointer(*bucket, flow);
                        flow_deferred_free(old_flow);
                        retval = 1;
@@ -90,7 +91,7 @@ static int table_hash_delete(struct sw_table *swt,
        if (key->wildcards == 0) {
                struct sw_flow **bucket = find_bucket(swt, key);
                struct sw_flow *flow = *bucket;
-               if (flow && !memcmp(&flow->key, key, sizeof *key))
+               if (flow && flow_keys_equal(&flow->key, key))
                        count = do_delete(bucket, flow);
        } else {
                unsigned int i;
@@ -185,7 +186,8 @@ static void table_hash_stats(struct sw_table *swt,
 {
        struct sw_table_hash *th = (struct sw_table_hash *) swt;
        stats->name = "hash";
-       stats->n_flows = th->n_flows;
+       stats->wildcards = 0;          /* No wildcards are supported. */
+       stats->n_flows   = th->n_flows;
        stats->max_flows = th->bucket_mask + 1;
        stats->n_matched = swt->n_matched;
 }
@@ -239,7 +241,7 @@ static struct sw_flow *table_hash2_lookup(struct sw_table *swt,
        
        for (i = 0; i < 2; i++) {
                struct sw_flow *flow = *find_bucket(t2->subtable[i], key);
-               if (flow && !memcmp(&flow->key, key, sizeof *key))
+               if (flow && flow_keys_equal(&flow->key, key))
                        return flow;
        }
        return NULL;
@@ -309,7 +311,8 @@ static void table_hash2_stats(struct sw_table *swt,
        for (i = 0; i < 2; i++)
                table_hash_stats(t2->subtable[i], &substats[i]);
        stats->name = "hash2";
-       stats->n_flows = substats[0].n_flows + substats[1].n_flows;
+       stats->wildcards = 0;          /* No wildcards are supported. */
+       stats->n_flows   = substats[0].n_flows + substats[1].n_flows;
        stats->max_flows = substats[0].max_flows + substats[1].max_flows;
        stats->n_matched = swt->n_matched;
 }