X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fclassifier.h;h=d5c19f09434791bc24cd3a44b01daf964feca2ab;hb=0f49dd6925beadb7e86fda6646285c068ada7303;hp=b1162aeb89c89be4d4d13d6ce0e15a12855d2ee1;hpb=57452fdcfb64aca9d110fca0736f6c9587d282f1;p=openvswitch diff --git a/lib/classifier.h b/lib/classifier.h index b1162aeb..d5c19f09 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -32,6 +32,10 @@ #include "openflow/nicira-ext.h" #include "openflow/openflow.h" +#ifdef __cplusplus +extern "C" { +#endif + /* A flow classifier. */ struct classifier { int n_rules; /* Total number of rules. */ @@ -40,12 +44,24 @@ struct classifier { /* A set of rules that all have the same fields wildcarded. */ struct cls_table { - struct hmap_node hmap_node; /* Within struct classifier 'wctables'. */ + struct hmap_node hmap_node; /* Within struct classifier 'tables' hmap. */ struct hmap rules; /* Contains "struct cls_rule"s. */ struct flow_wildcards wc; /* Wildcards for fields. */ int n_table_rules; /* Number of rules, including duplicates. */ }; +/* Returns true if 'table' is a "catch-all" table that will match every + * packet (if there is no higher-priority match). */ +static inline bool +cls_table_is_catchall(const struct cls_table *table) +{ + /* A catch-all table can only have one rule, so use hmap_count() as a cheap + * check to rule out other kinds of match before doing the full check with + * flow_wildcards_is_catchall(). */ + return (hmap_count(&table->rules) == 1 + && flow_wildcards_is_catchall(&table->wc)); +} + /* A flow classification rule. * * Use one of the cls_rule_*() functions to initialize a cls_rule. @@ -101,6 +117,8 @@ bool cls_rule_set_nw_src_masked(struct cls_rule *, ovs_be32 ip, ovs_be32 mask); void cls_rule_set_nw_dst(struct cls_rule *, ovs_be32); bool cls_rule_set_nw_dst_masked(struct cls_rule *, ovs_be32 ip, ovs_be32 mask); void cls_rule_set_nw_tos(struct cls_rule *, uint8_t); +void cls_rule_set_frag(struct cls_rule *, uint8_t frag); +void cls_rule_set_frag_masked(struct cls_rule *, uint8_t frag, uint8_t mask); void cls_rule_set_icmp_type(struct cls_rule *, uint8_t); void cls_rule_set_icmp_code(struct cls_rule *, uint8_t); void cls_rule_set_arp_sha(struct cls_rule *, const uint8_t[6]); @@ -111,7 +129,7 @@ bool cls_rule_set_ipv6_src_masked(struct cls_rule *, const struct in6_addr *, void cls_rule_set_ipv6_dst(struct cls_rule *, const struct in6_addr *); bool cls_rule_set_ipv6_dst_masked(struct cls_rule *, const struct in6_addr *, const struct in6_addr *); -void cls_rule_set_nd_target(struct cls_rule *, const struct in6_addr); +void cls_rule_set_nd_target(struct cls_rule *, const struct in6_addr *); bool cls_rule_equal(const struct cls_rule *, const struct cls_rule *); uint32_t cls_rule_hash(const struct cls_rule *, uint32_t basis); @@ -164,4 +182,8 @@ struct cls_rule *cls_cursor_next(struct cls_cursor *, struct cls_rule *); : 0); \ (RULE) = (NEXT)) +#ifdef __cplusplus +} +#endif + #endif /* classifier.h */