mirror of
https://github.com/openvswitch/ovs
synced 2025-10-13 14:07:02 +00:00
classifier: Change classifier_rule_overlaps() to take a cls_rule *.
There's no benefit to spelling out all of the components of a cls_rule separately. Just use cls_rule itself.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -3619,13 +3619,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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user