datapath: Compare entire flow during lookup, not just first 4 or 8 bytes.
authorBen Pfaff <blp@nicira.com>
Wed, 6 May 2009 22:40:21 +0000 (15:40 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 6 May 2009 22:42:32 +0000 (15:42 -0700)
The size of a pointer is not the size of the referent.
Only God knows how much havoc this was wreaking.

(The change in dp_table_lookup is for conformance with kernel style only.)

datapath/table.c

index 88aa7d2ad97914e958bf299b374baeaa5321aafc..c0885b7056d824f0b5dff1bbcb4638105a7a3729 100644 (file)
@@ -96,7 +96,9 @@ static struct sw_flow *lookup_table(struct dp_table *table,
 {
        struct sw_flow **bucket = find_bucket(table, flows, hash);
        struct sw_flow *flow = rcu_dereference(*bucket);
-       return flow && !memcmp(&flow->key, key, sizeof key) ? flow : NULL;
+       if (flow && !memcmp(&flow->key, key, sizeof(struct odp_flow_key)))
+               return flow;
+       return NULL;
 }
 
 static u32 flow_hash0(const struct odp_flow_key *key)
@@ -213,7 +215,7 @@ dp_table_lookup_for_insert(struct dp_table *table,
        for (i = 0; i < 2; i++) {
                struct sw_flow *f = rcu_dereference(*buckets[i]);
                if (f) {
-                       if (!memcmp(&f->key, target, sizeof f->key))
+                       if (!memcmp(&f->key, target, sizeof(struct odp_flow_key)))
                                return buckets[i];
                } else if (!empty_bucket)
                        empty_bucket = buckets[i];