Reduce the number of goto statements by returning via a new helper fill_range_wc() when no match is found.
Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- lib/classifier.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/classifier.c b/lib/classifier.c index 2d47310..2ed28d2 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -1454,6 +1454,17 @@ miniflow_and_mask_matches_flow_wc(const struct miniflow *flow, return true; } +/* Unwildcard the fields looked up so far, if any. */ +static struct cls_match * +fill_range_wc(const struct cls_subtable *subtable, struct flow_wildcards *wc, + uint8_t to) +{ + if (to) { + flow_wildcards_fold_minimask_range(wc, &subtable->mask, 0, to); + } + return NULL; +} + static struct cls_match * find_match_wc(const struct cls_subtable *subtable, const struct flow *flow, struct trie_ctx trie_ctx[CLS_MAX_TRIES], unsigned int n_tries, @@ -1477,16 +1488,17 @@ find_match_wc(const struct cls_subtable *subtable, const struct flow *flow, if (check_tries(trie_ctx, n_tries, subtable->trie_plen, ofs, flow, wc)) { - goto range_out; + /* 'wc' bits for the trie field set, now unwildcard the preceding + * bits used so far. */ + return fill_range_wc(subtable, wc, ofs.start); } hash = flow_hash_in_minimask_range(flow, &subtable->mask, ofs.start, ofs.end, &basis); - ofs.start = ofs.end; inode = hindex_node_with_hash(&subtable->indices[i], hash); if (!inode) { - /* No match, can stop immediately, but must fold in the mask - * covered so far. */ - goto range_out; + /* No match, can stop immediately, but must fold in the bits + * used in lookup so far. */ + return fill_range_wc(subtable, wc, ofs.end); } /* If we have narrowed down to a single rule already, check whether @@ -1502,11 +1514,12 @@ find_match_wc(const struct cls_subtable *subtable, const struct flow *flow, } return NULL; } + ofs.start = ofs.end; } ofs.end = FLOW_U32S; /* Trie check for the final range. */ if (check_tries(trie_ctx, n_tries, subtable->trie_plen, ofs, flow, wc)) { - goto range_out; + return fill_range_wc(subtable, wc, ofs.start); } hash = flow_hash_in_minimask_range(flow, &subtable->mask, ofs.start, ofs.end, &basis); @@ -1525,20 +1538,14 @@ find_match_wc(const struct cls_subtable *subtable, const struct flow *flow, ((OVS_FORCE ovs_be32 *)&wc->masks)[TP_PORTS_OFS32] |= mask & htonl(~0 << (32 - mbits)); - ofs.start = TP_PORTS_OFS32; - goto range_out; + /* Unwildcard all bits in the mask upto the ports, as they were used + * to determine there is no match. */ + return fill_range_wc(subtable, wc, TP_PORTS_OFS32); } /* Must unwildcard all the fields, as they were looked at. */ flow_wildcards_fold_minimask(wc, &subtable->mask); return rule; - -range_out: - /* Must unwildcard the fields looked up so far, if any. */ - if (ofs.start) { - flow_wildcards_fold_minimask_range(wc, &subtable->mask, 0, ofs.start); - } - return NULL; } static struct cls_match * -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev