ofp-util: Make NXM required for 64-bit cookies in is_nxm_required().
authorBen Pfaff <blp@nicira.com>
Tue, 22 Feb 2011 21:17:51 +0000 (13:17 -0800)
committerBen Pfaff <blp@nicira.com>
Tue, 1 Mar 2011 22:20:52 +0000 (14:20 -0800)
Only NXM supports 64-bit cookies, but this code didn't properly check
for that.  This commit fixes the problem and makes the code much more
explicit about what it is checking.

This will hide bug #4566, but the following commit actually fixes it.

lib/ofp-util.c

index 1125b83fc17752de195b11ee6479136da958fb45..f017fc9f42baf577005dcbeffa5930f66f12270f 100644 (file)
@@ -856,7 +856,8 @@ is_nxm_required(const struct cls_rule *rule, bool cookie_support,
                 ovs_be64 cookie)
 {
     const struct flow_wildcards *wc = &rule->wc;
-    ovs_be32 cookie_hi;
+    uint32_t cookie_hi;
+    uint64_t tun_id;
 
     /* Only NXM supports separately wildcards the Ethernet multicast bit. */
     if (!(wc->wildcards & FWW_DL_DST) != !(wc->wildcards & FWW_ETH_MCAST)) {
@@ -885,11 +886,21 @@ is_nxm_required(const struct cls_rule *rule, bool cookie_support,
         break;
 
     case CONSTANT_HTONLL(UINT64_MAX):
-        /* Only NXM supports matching tunnel ID, unless there is a cookie and
-         * the top 32 bits of the cookie are the desired tunnel ID value. */
-        cookie_hi = htonl(ntohll(cookie) >> 32);
-        if (!cookie_support
-            || (cookie_hi && cookie_hi != ntohll(rule->flow.tun_id))) {
+        /* Only NXM supports tunnel ID matching without a cookie. */
+        if (!cookie_support) {
+            return true;
+        }
+
+        /* Only NXM supports 64-bit tunnel IDs. */
+        tun_id = ntohll(rule->flow.tun_id);
+        if (tun_id > UINT32_MAX) {
+            return true;
+        }
+
+        /* Only NXM supports a cookie whose top 32 bits conflict with the
+         * tunnel ID. */
+        cookie_hi = ntohll(cookie) >> 32;
+        if (cookie_hi && cookie_hi != tun_id) {
             return true;
         }
         break;