Acked-by: Ethan Jackson <et...@nicira.com>

On Fri, Apr 18, 2014 at 12:41 PM, Jarno Rajahalme <jrajaha...@nicira.com> wrote:
> We only need to iterate over the bits masked by the 'b' in
> minimask_has_extra(), since for zeroes in 'b' there can be no 'extra'
> wildcards in 'a', as 'b' has already wildcarded all the bits.
>
> minimask_is_catchall() can be simplified by the invariant that mask's
> map never has 1-bits for all-zero values.
>
> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
> ---
>  lib/flow.c |   31 ++++++-------------------------
>  lib/flow.h |   12 +++++++++++-
>  2 files changed, 17 insertions(+), 26 deletions(-)
>
> diff --git a/lib/flow.c b/lib/flow.c
> index a227f73..22e95d2 100644
> --- a/lib/flow.c
> +++ b/lib/flow.c
> @@ -1862,19 +1862,17 @@ minimask_equal(const struct minimask *a, const struct 
> minimask *b)
>      return miniflow_equal(&a->masks, &b->masks);
>  }
>
> -/* Returns true if at least one bit is wildcarded in 'a_' but not in 'b_',
> +/* Returns true if at least one bit matched by 'b' is wildcarded by 'a',
>   * false otherwise. */
>  bool
> -minimask_has_extra(const struct minimask *a_, const struct minimask *b_)
> +minimask_has_extra(const struct minimask *a, const struct minimask *b)
>  {
> -    const struct miniflow *a = &a_->masks;
> -    const struct miniflow *b = &b_->masks;
> +    const uint32_t *p = b->masks.values;
>      uint64_t map;
>
> -    for (map = a->map | b->map; map; map = zero_rightmost_1bit(map)) {
> -        int ofs = raw_ctz(map);
> -        uint32_t a_u32 = miniflow_get(a, ofs);
> -        uint32_t b_u32 = miniflow_get(b, ofs);
> +    for (map = b->masks.map; map; map = zero_rightmost_1bit(map)) {
> +        uint32_t a_u32 = minimask_get(a, raw_ctz(map));
> +        uint32_t b_u32 = *p++;
>
>          if ((a_u32 & b_u32) != b_u32) {
>              return true;
> @@ -1883,20 +1881,3 @@ minimask_has_extra(const struct minimask *a_, const 
> struct minimask *b_)
>
>      return false;
>  }
> -
> -/* Returns true if 'mask' matches every packet, false if 'mask' fixes any 
> bits
> - * or fields. */
> -bool
> -minimask_is_catchall(const struct minimask *mask_)
> -{
> -    const struct miniflow *mask = &mask_->masks;
> -    const uint32_t *p = mask->values;
> -    uint64_t map;
> -
> -    for (map = mask->map; map; map = zero_rightmost_1bit(map)) {
> -        if (*p++) {
> -            return false;
> -        }
> -    }
> -    return true;
> -}
> diff --git a/lib/flow.h b/lib/flow.h
> index 0ed4f6a..47ccccb 100644
> --- a/lib/flow.h
> +++ b/lib/flow.h
> @@ -484,7 +484,17 @@ static inline ovs_be64 minimask_get_metadata_mask(const 
> struct minimask *);
>
>  bool minimask_equal(const struct minimask *a, const struct minimask *b);
>  bool minimask_has_extra(const struct minimask *, const struct minimask *);
> -bool minimask_is_catchall(const struct minimask *);
> +
> +/* Returns true if 'mask' matches every packet, false if 'mask' fixes any 
> bits
> + * or fields. */
> +static inline bool
> +minimask_is_catchall(const struct minimask *mask)
> +{
> +    /* For every 1-bit in mask's map, the corresponding value is non-zero,
> +     * so the only way the mask can not fix any bits or fields is for the
> +     * map the be zero. */
> +    return mask->masks.map == 0;
> +}
>
>
>
> --
> 1.7.10.4
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to