acl: fix invalid rule wildness calculation for bitmask field type
authorKonstantin Ananyev <konstantin.ananyev@intel.com>
Mon, 8 Jun 2015 10:41:23 +0000 (11:41 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 18 Jun 2015 15:57:28 +0000 (17:57 +0200)
Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_acl/acl_bld.c

index 3801843..aee6ed5 100644 (file)
@@ -1362,6 +1362,9 @@ acl_calc_wildness(struct rte_acl_build_rule *head,
                for (n = 0; n < config->num_fields; n++) {
 
                        double wild = 0;
+                       uint64_t msk_val =
+                               RTE_LEN2MASK(CHAR_BIT * config->defs[n].size,
+                               typeof(msk_val));
                        double size = CHAR_BIT * config->defs[n].size;
                        int field_index = config->defs[n].field_index;
                        const struct rte_acl_field *fld = rule->f->field +
@@ -1369,8 +1372,8 @@ acl_calc_wildness(struct rte_acl_build_rule *head,
 
                        switch (rule->config->defs[n].type) {
                        case RTE_ACL_FIELD_TYPE_BITMASK:
-                               wild = (size - __builtin_popcount(
-                                       fld->mask_range.u8)) /
+                               wild = (size - __builtin_popcountll(
+                                       fld->mask_range.u64 & msk_val)) /
                                        size;
                                break;