[ovs-dev] [nxm 16/42] classifier: Change classifier_rule_overlaps() to take a cls_rule *.

Ben Pfaff blp at nicira.com
Fri Oct 29 17:00:26 UTC 2010


Thanks, I pushed 1-16 (plus your suggestions).

On Thu, Oct 28, 2010 at 07:09:20PM -0700, Justin Pettit wrote:
> And...wait for it...........looks good.
> 
> --Justin
> 
> 
> On Oct 28, 2010, at 10:27 AM, Ben Pfaff wrote:
> 
> > There's no benefit to spelling out all of the components of a cls_rule
> > separately.  Just use cls_rule itself.
> > ---
> > lib/classifier.c  |   22 +++++++++-------------
> > lib/classifier.h  |    4 ++--
> > ofproto/ofproto.c |   10 ++++------
> > 3 files changed, 15 insertions(+), 21 deletions(-)
> > 
> > diff --git a/lib/classifier.c b/lib/classifier.c
> > index 091e0ca..ae2019f 100644
> > --- a/lib/classifier.c
> > +++ b/lib/classifier.c
> > @@ -299,24 +299,20 @@ classifier_find_rule_exactly(const struct classifier *cls,
> >     return NULL;
> > }
> > 
> > -/* Checks if the flow defined by 'target' with 'wildcards' at 'priority'
> > - * overlaps with any other rule at the same priority in the classifier.
> > - * Two rules are considered overlapping if a packet could match both. */
> > +/* Checks if 'target' would overlap any other rule in 'cls'.  Two rules are
> > + * considered to overlap if both rules have the same priority and a packet
> > + * could match both. */
> > bool
> > classifier_rule_overlaps(const struct classifier *cls,
> > -                         const struct flow *target, uint32_t wildcards,
> > -                         unsigned int priority)
> > +                         const struct cls_rule *target)
> > {
> > -    struct cls_rule target_rule;
> >     const struct hmap *tbl;
> > 
> > -    if (!wildcards) {
> > -        return search_exact_table(cls, flow_hash(target, 0), target) ?
> > -            true : false;
> > +    if (!target->wc.wildcards) {
> > +        return (search_exact_table(cls, flow_hash(&target->flow, 0),
> > +                                   &target->flow) != NULL);
> >     }
> > 
> > -    cls_rule_from_flow(target, wildcards, priority, &target_rule);
> > -
> >     for (tbl = &cls->tables[0]; tbl < &cls->tables[CLS_N_FIELDS]; tbl++) {
> >         struct cls_bucket *bucket;
> > 
> > @@ -324,8 +320,8 @@ classifier_rule_overlaps(const struct classifier *cls,
> >             struct cls_rule *rule;
> > 
> >             LIST_FOR_EACH (rule, node.list, &bucket->rules) {
> > -                if (rule->priority == priority
> > -                    && rules_match_2wild(rule, &target_rule, 0)) {
> > +                if (rule->priority == target->priority
> > +                    && rules_match_2wild(rule, target, 0)) {
> >                     return true;
> >                 }
> >             }
> > diff --git a/lib/classifier.h b/lib/classifier.h
> > index 46df77d..d2e2b8b 100644
> > --- a/lib/classifier.h
> > +++ b/lib/classifier.h
> > @@ -147,8 +147,8 @@ void classifier_insert_exact(struct classifier *, struct cls_rule *);
> > void classifier_remove(struct classifier *, struct cls_rule *);
> > struct cls_rule *classifier_lookup(const struct classifier *,
> >                                    const struct flow *, int include);
> > -bool classifier_rule_overlaps(const struct classifier *, const struct flow *,
> > -                              uint32_t wildcards, unsigned int priority);
> > +bool classifier_rule_overlaps(const struct classifier *,
> > +                              const struct cls_rule *);
> > 
> > typedef void cls_cb_func(struct cls_rule *, void *aux);
> > 
> > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> > index c051b47..77c21e9 100644
> > --- a/ofproto/ofproto.c
> > +++ b/ofproto/ofproto.c
> > @@ -3621,13 +3621,11 @@ add_flow(struct ofproto *p, struct ofconn *ofconn,
> >     int error;
> > 
> >     if (ofm->flags & htons(OFPFF_CHECK_OVERLAP)) {
> > -        struct flow flow;
> > -        uint32_t wildcards;
> > +        struct cls_rule cr;
> > 
> > -        flow_from_match(&ofm->match, p->tun_id_from_cookie, ofm->cookie,
> > -                        &flow, &wildcards);
> > -        if (classifier_rule_overlaps(&p->cls, &flow, wildcards,
> > -                                     ntohs(ofm->priority))) {
> > +        cls_rule_from_match(&ofm->match, ntohs(ofm->priority),
> > +                            p->tun_id_from_cookie, ofm->cookie, &cr);
> > +        if (classifier_rule_overlaps(&p->cls, &cr)) {
> >             return ofp_mkerr(OFPET_FLOW_MOD_FAILED, OFPFMFC_OVERLAP);
> >         }
> >     }
> > -- 
> > 1.7.1
> > 
> > 
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
> 




More information about the dev mailing list