From b9d5a387b2a0f822737ab78e0848884f2e1b5742 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 22 Feb 2011 13:17:51 -0800 Subject: [PATCH] ofp-util: Make NXM required for 64-bit cookies in is_nxm_required(). 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 | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 1125b83f..f017fc9f 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -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; -- 2.30.2