Acked-by: Jarno Rajahalme <[email protected]>

On Oct 30, 2014, at 3:36 PM, Ben Pfaff <[email protected]> wrote:

> OpenFlow has priorities in the 16-bit unsigned range, from 0 to 65535.
> In the classifier, it is sometimes useful to be able to have values below
> and above this range.  With the 'unsigned int' type used for priorities
> until now, there were no values below the range, so some code worked
> around it by converting priorities to 64-bit signed integers.  This didn't
> seem so great to me given that a plain 'int' also had the needed range.
> This commit therefore changes the type used for priorities to int.
> 
> The interesting parts of this change are in pvector.h and classifier.c,
> where one can see the elimination of the use of int64_t.
> 
> Signed-off-by: Ben Pfaff <[email protected]>
> ---
> v1->v2: Switch priority type to 'int', instead of trying to change all the
>  "greater than"s to "greater than or equals" and in later patches doing a
>  lot of awkward +1s.
> ---
> lib/classifier-private.h   |    5 ++---
> lib/classifier.c           |   24 ++++++++++--------------
> lib/classifier.h           |    9 ++++-----
> lib/match.c                |   11 +++++------
> lib/match.h                |    9 ++++-----
> lib/ofp-util.h             |    2 +-
> lib/pvector.c              |   12 +++++++-----
> lib/pvector.h              |   14 ++++++++------
> ofproto/in-band.c          |    4 ++--
> ofproto/ofproto-provider.h |    6 ++----
> ofproto/ofproto.c          |   13 ++++++-------
> tests/test-classifier.c    |   29 ++++++++++++++---------------
> utilities/ovs-ofctl.c      |    6 +++---
> 13 files changed, 68 insertions(+), 76 deletions(-)
> 
> diff --git a/lib/classifier-private.h b/lib/classifier-private.h
> index 10d29a5..145efbb 100644
> --- a/lib/classifier-private.h
> +++ b/lib/classifier-private.h
> @@ -33,8 +33,7 @@ struct cls_subtable {
>     /* The fields are only used by writers. */
>     int n_rules OVS_GUARDED;                /* Number of rules, including
>                                              * duplicates. */
> -    unsigned int max_priority OVS_GUARDED;  /* Max priority of any rule in
> -                                             * the subtable. */
> +    int max_priority OVS_GUARDED; /* Max priority of any rule in subtable. */
>     unsigned int max_count OVS_GUARDED;     /* Count of max_priority rules. */
> 
>     /* These fields are accessed by readers who care about wildcarding. */
> @@ -72,7 +71,7 @@ struct cls_match {
>     struct cls_partition *partition OVS_GUARDED;
> 
>     /* Accessed by readers interested in wildcarding. */
> -    unsigned int priority;      /* Larger numbers are higher priorities. */
> +    int priority;               /* Larger numbers are higher priorities. */
>     struct cmap_node index_nodes[CLS_MAX_INDICES]; /* Within subtable's
>                                                     * 'indices'. */
>     /* Accessed by all readers. */
> diff --git a/lib/classifier.c b/lib/classifier.c
> index 9f306b9..dab43ec 100644
> --- a/lib/classifier.c
> +++ b/lib/classifier.c
> @@ -114,11 +114,10 @@ static bool mask_prefix_bits_set(const struct 
> flow_wildcards *,
>  *
>  * The caller must eventually destroy 'rule' with cls_rule_destroy().
>  *
> - * (OpenFlow uses priorities between 0 and UINT16_MAX, inclusive, but
> - * internally Open vSwitch supports a wider range.) */
> + * Clients should not use priority INT_MIN.  (OpenFlow uses priorities 
> between
> + * 0 and UINT16_MAX, inclusive.) */
> void
> -cls_rule_init(struct cls_rule *rule,
> -              const struct match *match, unsigned int priority)
> +cls_rule_init(struct cls_rule *rule, const struct match *match, int priority)
> {
>     minimatch_init(&rule->match, match);
>     rule->priority = priority;
> @@ -128,8 +127,7 @@ cls_rule_init(struct cls_rule *rule,
> /* Same as cls_rule_init() for initialization from a "struct minimatch". */
> void
> cls_rule_init_from_minimatch(struct cls_rule *rule,
> -                             const struct minimatch *match,
> -                             unsigned int priority)
> +                             const struct minimatch *match, int priority)
> {
>     minimatch_clone(&rule->match, match);
>     rule->priority = priority;
> @@ -607,7 +605,7 @@ classifier_remove(struct classifier *cls, struct cls_rule 
> *rule)
>                && --subtable->max_count == 0) {
>         /* Find the new 'max_priority' and 'max_count'. */
>         struct cls_match *head;
> -        unsigned int max_priority = 0;
> +        int max_priority = INT_MIN;
> 
>         CMAP_FOR_EACH (head, cmap_node, &subtable->rules) {
>             if (head->priority > max_priority) {
> @@ -668,7 +666,7 @@ classifier_lookup(const struct classifier *cls, const 
> struct flow *flow,
> {
>     const struct cls_partition *partition;
>     tag_type tags;
> -    int64_t best_priority = -1;
> +    int best_priority = INT_MIN;
>     const struct cls_match *best;
>     struct trie_ctx trie_ctx[CLS_MAX_TRIES];
>     struct cls_subtable *subtable;
> @@ -717,8 +715,8 @@ classifier_lookup(const struct classifier *cls, const 
> struct flow *flow,
>         }
> 
>         rule = find_match_wc(subtable, flow, trie_ctx, cls->n_tries, wc);
> -        if (rule && (int64_t)rule->priority > best_priority) {
> -            best_priority = (int64_t)rule->priority;
> +        if (rule && rule->priority > best_priority) {
> +            best_priority = rule->priority;
>             best = rule;
>         }
>     }
> @@ -767,8 +765,7 @@ out:
>  * contain an exact match. */
> struct cls_rule *
> classifier_find_match_exactly(const struct classifier *cls,
> -                              const struct match *target,
> -                              unsigned int priority)
> +                              const struct match *target, int priority)
> {
>     struct cls_rule *retval;
>     struct cls_rule cr;
> @@ -789,11 +786,10 @@ classifier_rule_overlaps(const struct classifier *cls,
>     OVS_EXCLUDED(cls->mutex)
> {
>     struct cls_subtable *subtable;
> -    int64_t stop_at_priority = (int64_t)target->priority - 1;
> 
>     ovs_mutex_lock(&cls->mutex);
>     /* Iterate subtables in the descending max priority order. */
> -    PVECTOR_FOR_EACH_PRIORITY (subtable, stop_at_priority, 2,
> +    PVECTOR_FOR_EACH_PRIORITY (subtable, target->priority - 1, 2,
>                                sizeof(struct cls_subtable), &cls->subtables) {
>         uint32_t storage[FLOW_U32S];
>         struct minimask mask;
> diff --git a/lib/classifier.h b/lib/classifier.h
> index c910ac4..92be5bf 100644
> --- a/lib/classifier.h
> +++ b/lib/classifier.h
> @@ -258,14 +258,13 @@ struct classifier {
> /* A rule to be inserted to the classifier. */
> struct cls_rule {
>     struct minimatch match;      /* Matching rule. */
> -    unsigned int priority;       /* Larger numbers are higher priorities. */
> +    int priority;                /* Larger numbers are higher priorities. */
>     struct cls_match *cls_match; /* NULL if rule is not in a classifier. */
> };
> 
> -void cls_rule_init(struct cls_rule *, const struct match *,
> -                   unsigned int priority);
> +void cls_rule_init(struct cls_rule *, const struct match *, int priority);
> void cls_rule_init_from_minimatch(struct cls_rule *, const struct minimatch *,
> -                                  unsigned int priority);
> +                                  int priority);
> void cls_rule_clone(struct cls_rule *, const struct cls_rule *);
> void cls_rule_move(struct cls_rule *dst, struct cls_rule *src);
> void cls_rule_destroy(struct cls_rule *);
> @@ -303,7 +302,7 @@ struct cls_rule *classifier_find_rule_exactly(const 
> struct classifier *,
> 
> struct cls_rule *classifier_find_match_exactly(const struct classifier *,
>                                                const struct match *,
> -                                               unsigned int priority);
> +                                               int priority);
> 
> /* Iteration. */
> 
> diff --git a/lib/match.c b/lib/match.c
> index 1a28396..9a84546 100644
> --- a/lib/match.c
> +++ b/lib/match.c
> @@ -853,7 +853,7 @@ format_flow_tunnel(struct ds *s, const struct match 
> *match)
> /* Appends a string representation of 'match' to 's'.  If 'priority' is
>  * different from OFP_DEFAULT_PRIORITY, includes it in 's'. */
> void
> -match_format(const struct match *match, struct ds *s, unsigned int priority)
> +match_format(const struct match *match, struct ds *s, int priority)
> {
>     const struct flow_wildcards *wc = &match->wc;
>     size_t start_len = s->length;
> @@ -866,7 +866,7 @@ match_format(const struct match *match, struct ds *s, 
> unsigned int priority)
>     BUILD_ASSERT_DECL(FLOW_WC_SEQ == 27);
> 
>     if (priority != OFP_DEFAULT_PRIORITY) {
> -        ds_put_format(s, "priority=%u,", priority);
> +        ds_put_format(s, "priority=%d,", priority);
>     }
> 
>     format_uint32_masked(s, "pkt_mark", f->pkt_mark, wc->masks.pkt_mark);
> @@ -1110,7 +1110,7 @@ match_format(const struct match *match, struct ds *s, 
> unsigned int priority)
>  * different from OFP_DEFAULT_PRIORITY, includes it in the string.  The caller
>  * must free the string (with free()). */
> char *
> -match_to_string(const struct match *match, unsigned int priority)
> +match_to_string(const struct match *match, int priority)
> {
>     struct ds s = DS_EMPTY_INITIALIZER;
>     match_format(match, &s, priority);
> @@ -1204,8 +1204,7 @@ minimatch_matches_flow(const struct minimatch *match,
> /* Appends a string representation of 'match' to 's'.  If 'priority' is
>  * different from OFP_DEFAULT_PRIORITY, includes it in 's'. */
> void
> -minimatch_format(const struct minimatch *match, struct ds *s,
> -                 unsigned int priority)
> +minimatch_format(const struct minimatch *match, struct ds *s, int priority)
> {
>     struct match megamatch;
> 
> @@ -1217,7 +1216,7 @@ minimatch_format(const struct minimatch *match, struct 
> ds *s,
>  * different from OFP_DEFAULT_PRIORITY, includes it in the string.  The caller
>  * must free the string (with free()). */
> char *
> -minimatch_to_string(const struct minimatch *match, unsigned int priority)
> +minimatch_to_string(const struct minimatch *match, int priority)
> {
>     struct match megamatch;
> 
> diff --git a/lib/match.h b/lib/match.h
> index af08fc0..7469eaa 100644
> --- a/lib/match.h
> +++ b/lib/match.h
> @@ -141,8 +141,8 @@ uint32_t match_hash(const struct match *, uint32_t basis);
> void match_init_hidden_fields(struct match *);
> bool match_has_default_hidden_fields(const struct match *);
> 
> -void match_format(const struct match *, struct ds *, unsigned int priority);
> -char *match_to_string(const struct match *, unsigned int priority);
> +void match_format(const struct match *, struct ds *, int priority);
> +char *match_to_string(const struct match *, int priority);
> void match_print(const struct match *);
> 
> /* Compressed match. */
> @@ -174,8 +174,7 @@ bool minimatch_equal(const struct minimatch *a, const 
> struct minimatch *b);
> 
> bool minimatch_matches_flow(const struct minimatch *, const struct flow *);
> 
> -void minimatch_format(const struct minimatch *, struct ds *,
> -                      unsigned int priority);
> -char *minimatch_to_string(const struct minimatch *, unsigned int priority);
> +void minimatch_format(const struct minimatch *, struct ds *, int priority);
> +char *minimatch_to_string(const struct minimatch *, int priority);
> 
> #endif /* match.h */
> diff --git a/lib/ofp-util.h b/lib/ofp-util.h
> index af1a2a3..c9900d8 100644
> --- a/lib/ofp-util.h
> +++ b/lib/ofp-util.h
> @@ -271,7 +271,7 @@ struct ofputil_flow_mod {
>     struct list list_node;    /* For queuing flow_mods. */
> 
>     struct match match;
> -    unsigned int priority;
> +    int priority;
> 
>     /* Cookie matching.  The flow_mod affects only flows that have cookies 
> that
>      * bitwise match 'cookie' bits in positions where 'cookie_mask has 1-bits.
> diff --git a/lib/pvector.c b/lib/pvector.c
> index e6cb664..3f2e9e8 100644
> --- a/lib/pvector.c
> +++ b/lib/pvector.c
> @@ -69,8 +69,10 @@ pvector_destroy(struct pvector *pvec)
> static int
> pvector_entry_cmp(const void *a_, const void *b_)
> {
> -    unsigned int a = ((const struct pvector_entry *)a_)->priority;
> -    unsigned int b = ((const struct pvector_entry *)b_)->priority;
> +    const struct pvector_entry *ap = a_;
> +    const struct pvector_entry *bp = b_;
> +    int a = ap->priority;
> +    int b = bp->priority;
> 
>     return a > b ? -1 : a < b;
> }
> @@ -85,7 +87,7 @@ pvector_impl_sort(struct pvector_impl *impl)
>  * which will be one past the vector if none exists. */
> static int
> pvector_impl_find_priority(struct pvector_impl *impl,
> -                           unsigned int target_priority)
> +                           int target_priority)
> {
>     const struct pvector_entry *entry;
>     int index;
> @@ -114,7 +116,7 @@ pvector_impl_find(struct pvector_impl *impl, void *target)
> }
> 
> void
> -pvector_insert(struct pvector *pvec, void *ptr, unsigned int priority)
> +pvector_insert(struct pvector *pvec, void *ptr, int priority)
> {
>     struct pvector_impl *old, *new;
>     int index;
> @@ -182,7 +184,7 @@ pvector_remove(struct pvector *pvec, void *ptr)
> 
> /* Change entry's 'priority' and keep the vector ordered. */
> void
> -pvector_change_priority(struct pvector *pvec, void *ptr, unsigned int 
> priority)
> +pvector_change_priority(struct pvector *pvec, void *ptr, int priority)
> {
>     struct pvector_impl *old = pvector_impl_get(pvec);
>     int index = pvector_impl_find(old, ptr);
> diff --git a/lib/pvector.h b/lib/pvector.h
> index 61d71b9..40c8e93 100644
> --- a/lib/pvector.h
> +++ b/lib/pvector.h
> @@ -46,10 +46,12 @@
>  * 'size', or update the 'priority' value of an entry, but only if that does
>  * not change the ordering of the entries.  Writers will never change the 
> 'ptr'
>  * values, or decrement the 'size' on a copy that readers have access to.
> + *
> + * Clients should not use priority INT_MIN.
>  */
> 
> struct pvector_entry {
> -    unsigned int priority;
> +    int priority;
>     void *ptr;
> };
> 
> @@ -77,8 +79,8 @@ static inline size_t pvector_count(const struct pvector *);
> static inline bool pvector_is_empty(const struct pvector *);
> 
> /* Insertion and deletion. */
> -void pvector_insert(struct pvector *, void *, unsigned int);
> -void pvector_change_priority(struct pvector *, void *, unsigned int);
> +void pvector_insert(struct pvector *, void *, int priority);
> +void pvector_change_priority(struct pvector *, void *, int priority);
> void pvector_remove(struct pvector *, void *);
> 
> /* Iteration.
> @@ -135,14 +137,14 @@ static inline struct pvector_cursor 
> pvector_cursor_init(const struct pvector *,
>                                                         size_t n_ahead,
>                                                         size_t obj_size);
> static inline void *pvector_cursor_next(struct pvector_cursor *,
> -                                        int64_t stop_at_priority,
> +                                        int stop_at_priority,
>                                         size_t n_ahead, size_t obj_size);
> static inline void pvector_cursor_lookahead(const struct pvector_cursor *,
>                                             int n, size_t size);
> 
> #define PVECTOR_FOR_EACH(PTR, PVECTOR)                                  \
>     for (struct pvector_cursor cursor__ = pvector_cursor_init(PVECTOR, 0, 0); 
> \
> -         ((PTR) = pvector_cursor_next(&cursor__, -1, 0, 0)) != NULL; )
> +         ((PTR) = pvector_cursor_next(&cursor__, INT_MIN, 0, 0)) != NULL; )
> 
> /* Loop while priority is higher than 'PRIORITY' and prefetch objects
>  * of size 'SZ' 'N' objects ahead from the current object. */
> @@ -176,7 +178,7 @@ pvector_cursor_init(const struct pvector *pvec,
> }
> 
> static inline void *pvector_cursor_next(struct pvector_cursor *cursor,
> -                                        int64_t stop_at_priority,
> +                                        int stop_at_priority,
>                                         size_t n_ahead, size_t obj_size)
> {
>     if (++cursor->entry_idx < cursor->size &&
> diff --git a/ofproto/in-band.c b/ofproto/in-band.c
> index cbe0d1c..e25a27a 100644
> --- a/ofproto/in-band.c
> +++ b/ofproto/in-band.c
> @@ -83,7 +83,7 @@ enum in_band_op {
> struct in_band_rule {
>     struct hmap_node hmap_node; /* In struct in_band's "rules" hmap. */
>     struct match match;
> -    unsigned int priority;
> +    int priority;
>     enum in_band_op op;
> };
> 
> @@ -236,7 +236,7 @@ in_band_must_output_to_local_port(const struct flow *flow)
> }
> 
> static void
> -add_rule(struct in_band *ib, const struct match *match, unsigned int 
> priority)
> +add_rule(struct in_band *ib, const struct match *match, int priority)
> {
>     uint32_t hash = match_hash(match, 0);
>     struct in_band_rule *rule;
> diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
> index 158f86e..14f1cba 100644
> --- a/ofproto/ofproto-provider.h
> +++ b/ofproto/ofproto-provider.h
> @@ -1668,12 +1668,10 @@ int ofproto_class_unregister(const struct 
> ofproto_class *);
> 
> int ofproto_flow_mod(struct ofproto *, struct ofputil_flow_mod *)
>     OVS_EXCLUDED(ofproto_mutex);
> -void ofproto_add_flow(struct ofproto *, const struct match *,
> -                      unsigned int priority,
> +void ofproto_add_flow(struct ofproto *, const struct match *, int priority,
>                       const struct ofpact *ofpacts, size_t ofpacts_len)
>     OVS_EXCLUDED(ofproto_mutex);
> -void ofproto_delete_flow(struct ofproto *,
> -                         const struct match *, unsigned int priority)
> +void ofproto_delete_flow(struct ofproto *, const struct match *, int 
> priority)
>     OVS_EXCLUDED(ofproto_mutex);
> void ofproto_flush_flows(struct ofproto *);
> 
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index b8f0e62..1233164 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -153,8 +153,7 @@ struct rule_criteria {
> };
> 
> static void rule_criteria_init(struct rule_criteria *, uint8_t table_id,
> -                               const struct match *match,
> -                               unsigned int priority,
> +                               const struct match *match, int priority,
>                                ovs_be64 cookie, ovs_be64 cookie_mask,
>                                ofp_port_t out_port, uint32_t out_group);
> static void rule_criteria_require_rw(struct rule_criteria *,
> @@ -1882,7 +1881,7 @@ ofproto_port_del(struct ofproto *ofproto, ofp_port_t 
> ofp_port)
> 
> static void
> flow_mod_init(struct ofputil_flow_mod *fm,
> -              const struct match *match, unsigned int priority,
> +              const struct match *match, int priority,
>               const struct ofpact *ofpacts, size_t ofpacts_len,
>               enum ofp_flow_mod_command command)
> {
> @@ -1907,7 +1906,7 @@ flow_mod_init(struct ofputil_flow_mod *fm,
> 
> static int
> simple_flow_mod(struct ofproto *ofproto,
> -                const struct match *match, unsigned int priority,
> +                const struct match *match, int priority,
>                 const struct ofpact *ofpacts, size_t ofpacts_len,
>                 enum ofp_flow_mod_command command)
> {
> @@ -1931,7 +1930,7 @@ simple_flow_mod(struct ofproto *ofproto,
>  * This is a helper function for in-band control and fail-open. */
> void
> ofproto_add_flow(struct ofproto *ofproto, const struct match *match,
> -                 unsigned int priority,
> +                 int priority,
>                  const struct ofpact *ofpacts, size_t ofpacts_len)
>     OVS_EXCLUDED(ofproto_mutex)
> {
> @@ -2018,7 +2017,7 @@ ofproto_flow_mod(struct ofproto *ofproto, struct 
> ofputil_flow_mod *fm)
>  * This is a helper function for in-band control and fail-open. */
> void
> ofproto_delete_flow(struct ofproto *ofproto,
> -                    const struct match *target, unsigned int priority)
> +                    const struct match *target, int priority)
>     OVS_EXCLUDED(ofproto_mutex)
> {
>     struct classifier *cls = &ofproto->tables[0].cls;
> @@ -3510,7 +3509,7 @@ next_matching_table(const struct ofproto *ofproto,
>  * supplied as 0. */
> static void
> rule_criteria_init(struct rule_criteria *criteria, uint8_t table_id,
> -                   const struct match *match, unsigned int priority,
> +                   const struct match *match, int priority,
>                    ovs_be64 cookie, ovs_be64 cookie_mask,
>                    ofp_port_t out_port, uint32_t out_group)
> {
> diff --git a/tests/test-classifier.c b/tests/test-classifier.c
> index 85adb0d..9a58a18 100644
> --- a/tests/test-classifier.c
> +++ b/tests/test-classifier.c
> @@ -107,8 +107,7 @@ test_rule_destroy(struct test_rule *rule)
>     }
> }
> 
> -static struct test_rule *make_rule(int wc_fields, unsigned int priority,
> -                                   int value_pat);
> +static struct test_rule *make_rule(int wc_fields, int priority, int 
> value_pat);
> static void free_rule(struct test_rule *);
> static struct test_rule *clone_rule(const struct test_rule *);
> 
> @@ -466,10 +465,10 @@ static void
> pvector_verify(const struct pvector *pvec)
> {
>     void *ptr OVS_UNUSED;
> -    unsigned int priority, prev_priority = UINT_MAX;
> +    int prev_priority = INT_MAX;
> 
>     PVECTOR_FOR_EACH (ptr, pvec) {
> -        priority = cursor__.vector[cursor__.entry_idx].priority;
> +        int priority = cursor__.vector[cursor__.entry_idx].priority;
>         if (priority > prev_priority) {
>             ovs_abort(0, "Priority vector is out of order (%u > %u)",
>                       priority, prev_priority);
> @@ -524,7 +523,7 @@ check_tables(const struct classifier *cls, int n_tables, 
> int n_rules,
>     pvector_verify(&cls->subtables);
>     CMAP_FOR_EACH (table, cmap_node, &cls->subtables_map) {
>         const struct cls_match *head;
> -        unsigned int max_priority = 0;
> +        int max_priority = INT_MIN;
>         unsigned int max_count = 0;
>         bool found = false;
>         const struct cls_subtable *iter;
> @@ -552,7 +551,7 @@ check_tables(const struct classifier *cls, int n_tables, 
> int n_rules,
> 
>         found_tables++;
>         CMAP_FOR_EACH (head, cmap_node, &table->rules) {
> -            unsigned int prev_priority = UINT_MAX;
> +            int prev_priority = INT_MAX;
>             const struct cls_match *rule;
> 
>             if (head->priority > max_priority) {
> @@ -597,7 +596,7 @@ check_tables(const struct classifier *cls, int n_tables, 
> int n_rules,
> }
> 
> static struct test_rule *
> -make_rule(int wc_fields, unsigned int priority, int value_pat)
> +make_rule(int wc_fields, int priority, int value_pat)
> {
>     const struct cls_field *f;
>     struct test_rule *rule;
> @@ -642,7 +641,7 @@ make_rule(int wc_fields, unsigned int priority, int 
> value_pat)
>     }
> 
>     rule = xzalloc(sizeof *rule);
> -    cls_rule_init(&rule->cls_rule, &match, wc_fields ? priority : UINT_MAX);
> +    cls_rule_init(&rule->cls_rule, &match, wc_fields ? priority : INT_MAX);
>     return rule;
> }
> 
> @@ -665,11 +664,11 @@ free_rule(struct test_rule *rule)
> }
> 
> static void
> -shuffle(unsigned int *p, size_t n)
> +shuffle(int *p, size_t n)
> {
>     for (; n > 1; n--, p++) {
> -        unsigned int *q = &p[random_range(n)];
> -        unsigned int tmp = *p;
> +        int *q = &p[random_range(n)];
> +        int tmp = *p;
>         *p = *q;
>         *q = tmp;
>     }
> @@ -996,7 +995,7 @@ test_many_rules_in_one_table(int argc OVS_UNUSED, char 
> *argv[] OVS_UNUSED)
>         tcls_init(&tcls);
> 
>         for (i = 0; i < N_RULES; i++) {
> -            unsigned int priority = random_uint32();
> +            int priority = random_range(INT_MAX);
> 
>             do {
>                 value_pats[i] = random_uint32() & value_mask;
> @@ -1043,13 +1042,13 @@ test_many_rules_in_n_tables(int n_tables)
>     }
> 
>     for (iteration = 0; iteration < 30; iteration++) {
> -        unsigned int priorities[MAX_RULES];
> +        int priorities[MAX_RULES];
>         struct classifier cls;
>         struct tcls tcls;
> 
>         random_set_seed(iteration + 1);
>         for (i = 0; i < MAX_RULES; i++) {
> -            priorities[i] = i * 129;
> +            priorities[i] = (i * 129) & INT_MAX;
>         }
>         shuffle(priorities, ARRAY_SIZE(priorities));
> 
> @@ -1059,7 +1058,7 @@ test_many_rules_in_n_tables(int n_tables)
> 
>         for (i = 0; i < MAX_RULES; i++) {
>             struct test_rule *rule;
> -            unsigned int priority = priorities[i];
> +            int priority = priorities[i];
>             int wcf = wcfs[random_range(n_tables)];
>             int value_pat = random_uint32() & ((1u << CLS_N_FIELDS) - 1);
>             rule = make_rule(wcf, priority, value_pat);
> diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
> index b6b775f..f0ea15f 100644
> --- a/utilities/ovs-ofctl.c
> +++ b/utilities/ovs-ofctl.c
> @@ -989,8 +989,8 @@ compare_flows(const void *afs_, const void *bfs_)
>         int ret;
> 
>         if (!f) {
> -            unsigned int a_pri = afs->priority;
> -            unsigned int b_pri = bfs->priority;
> +            int a_pri = afs->priority;
> +            int b_pri = bfs->priority;
>             ret = a_pri < b_pri ? -1 : a_pri > b_pri;
>         } else {
>             bool ina, inb;
> @@ -2355,7 +2355,7 @@ fte_free_all(struct classifier *cls)
>  * Takes ownership of 'version'. */
> static void
> fte_insert(struct classifier *cls, const struct match *match,
> -           unsigned int priority, struct fte_version *version, int index)
> +           int priority, struct fte_version *version, int index)
> {
>     struct fte *old, *fte;
> 
> -- 
> 1.7.10.4
> 
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to