X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fclassifier.h;h=2dc0bdf9135551a210dbea0bf056932187bb9463;hb=9ea5d2d58ba8783271d096d417082a8372b87c5d;hp=1dc9edc629749b360c2e1574210a4241f5265acf;hpb=cd10ed7fb4fb5b1e3ed8e3fae1fd115c7ae96e77;p=openvswitch diff --git a/lib/classifier.h b/lib/classifier.h index 1dc9edc6..2dc0bdf9 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -44,7 +44,6 @@ struct cls_table { struct hmap rules; /* Contains "struct cls_rule"s. */ struct flow_wildcards wc; /* Wildcards for fields. */ int n_table_rules; /* Number of rules, including duplicates. */ - int n_refs; /* Reference count used during iteration. */ }; /* A flow classification rule. @@ -71,8 +70,6 @@ void cls_rule_init(const struct flow *, const struct flow_wildcards *, unsigned int priority, struct cls_rule *); void cls_rule_init_exact(const struct flow *, unsigned int priority, struct cls_rule *); -void cls_rule_from_match(const struct ofp_match *, unsigned int priority, - int flow_format, uint64_t cookie, struct cls_rule *); void cls_rule_init_catchall(struct cls_rule *, unsigned int priority); void cls_rule_zero_wildcarded_fields(struct cls_rule *); @@ -81,10 +78,12 @@ void cls_rule_set_in_port(struct cls_rule *, uint16_t odp_port); void cls_rule_set_dl_type(struct cls_rule *, ovs_be16); void cls_rule_set_dl_src(struct cls_rule *, const uint8_t[6]); void cls_rule_set_dl_dst(struct cls_rule *, const uint8_t[6]); -bool cls_rule_set_dl_tci(struct cls_rule *, ovs_be16 tci); -bool cls_rule_set_dl_tci_masked(struct cls_rule *, +void cls_rule_set_dl_tci(struct cls_rule *, ovs_be16 tci); +void cls_rule_set_dl_tci_masked(struct cls_rule *, ovs_be16 tci, ovs_be16 mask); +void cls_rule_set_any_vid(struct cls_rule *); void cls_rule_set_dl_vlan(struct cls_rule *, ovs_be16); +void cls_rule_set_any_pcp(struct cls_rule *); void cls_rule_set_dl_vlan_pcp(struct cls_rule *, uint8_t); void cls_rule_set_tp_src(struct cls_rule *, ovs_be16); void cls_rule_set_tp_dst(struct cls_rule *, ovs_be16); @@ -97,6 +96,8 @@ void cls_rule_set_nw_tos(struct cls_rule *, uint8_t); void cls_rule_set_icmp_type(struct cls_rule *, uint8_t); void cls_rule_set_icmp_code(struct cls_rule *, uint8_t); +bool cls_rule_equal(const struct cls_rule *, const struct cls_rule *); + char *cls_rule_to_string(const struct cls_rule *); void cls_rule_print(const struct cls_rule *); @@ -113,12 +114,38 @@ bool classifier_rule_overlaps(const struct classifier *, typedef void cls_cb_func(struct cls_rule *, void *aux); -void classifier_for_each(const struct classifier *, - cls_cb_func *, void *aux); -void classifier_for_each_match(const struct classifier *, - const struct cls_rule *, - cls_cb_func *, void *aux); struct cls_rule *classifier_find_rule_exactly(const struct classifier *, const struct cls_rule *); + +/* Iteration. */ + +struct cls_cursor { + const struct classifier *cls; + const struct cls_table *table; + const struct cls_rule *target; +}; + +void cls_cursor_init(struct cls_cursor *, const struct classifier *, + const struct cls_rule *match); +struct cls_rule *cls_cursor_first(struct cls_cursor *); +struct cls_rule *cls_cursor_next(struct cls_cursor *, struct cls_rule *); + +#define CLS_CURSOR_FOR_EACH(RULE, MEMBER, CURSOR) \ + for ((RULE) = OBJECT_CONTAINING(cls_cursor_first(CURSOR), \ + RULE, MEMBER); \ + &(RULE)->MEMBER != NULL; \ + (RULE) = OBJECT_CONTAINING(cls_cursor_next(CURSOR, \ + &(RULE)->MEMBER), \ + RULE, MEMBER)) + +#define CLS_CURSOR_FOR_EACH_SAFE(RULE, NEXT, MEMBER, CURSOR) \ + for ((RULE) = OBJECT_CONTAINING(cls_cursor_first(CURSOR), \ + RULE, MEMBER); \ + (&(RULE)->MEMBER != NULL \ + ? ((NEXT) = OBJECT_CONTAINING(cls_cursor_next(CURSOR, \ + &(RULE)->MEMBER), \ + RULE, MEMBER), 1) \ + : 0); \ + (RULE) = (NEXT)) #endif /* classifier.h */