X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif.h;h=b2b18c7c7bc9827707bec3aaad92cf7a4ba586d5;hb=003ce655b7116d18c86a74c50391e54990346931;hp=eb4787c037d8fc04125208ef736822b969792a63;hpb=1ebeaaa7f0c3f0f94f28377404c52a11cca50d86;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h index eb4787c03..b2b18c7c7 100644 --- a/ofproto/ofproto-dpif.h +++ b/ofproto/ofproto-dpif.h @@ -17,6 +17,7 @@ #include +#include "fail-open.h" #include "hmapx.h" #include "odp-util.h" #include "ofp-util.h" @@ -87,27 +88,30 @@ size_t ofproto_dpif_get_max_mpls_depth(const struct ofproto_dpif *); bool ofproto_dpif_get_enable_recirc(const struct ofproto_dpif *); uint8_t rule_dpif_lookup(struct ofproto_dpif *, struct flow *, - struct flow_wildcards *, struct rule_dpif **rule); + struct flow_wildcards *, struct rule_dpif **rule, + bool take_ref); enum rule_dpif_lookup_verdict rule_dpif_lookup_from_table(struct ofproto_dpif *, const struct flow *, struct flow_wildcards *, bool force_controller_on_miss, uint8_t *table_id, - struct rule_dpif **rule); + struct rule_dpif **rule, + bool take_ref); -void rule_dpif_ref(struct rule_dpif *); -void rule_dpif_unref(struct rule_dpif *); +static inline void rule_dpif_ref(struct rule_dpif *); +static inline void rule_dpif_unref(struct rule_dpif *); void rule_dpif_credit_stats(struct rule_dpif *rule , const struct dpif_flow_stats *); -bool rule_dpif_is_fail_open(const struct rule_dpif *); -bool rule_dpif_is_table_miss(const struct rule_dpif *); -bool rule_dpif_is_internal(const struct rule_dpif *); +static inline bool rule_dpif_is_fail_open(const struct rule_dpif *); +static inline bool rule_dpif_is_table_miss(const struct rule_dpif *); +static inline bool rule_dpif_is_internal(const struct rule_dpif *); + uint8_t rule_dpif_get_table(const struct rule_dpif *); -struct rule_actions *rule_dpif_get_actions(const struct rule_dpif *); +const struct rule_actions *rule_dpif_get_actions(const struct rule_dpif *); ovs_be64 rule_dpif_get_flow_cookie(const struct rule_dpif *rule); @@ -117,7 +121,7 @@ void rule_dpif_reduce_timeouts(struct rule_dpif *rule, uint16_t idle_timeout, void choose_miss_rule(enum ofputil_port_config, struct rule_dpif *miss_rule, struct rule_dpif *no_packet_in_rule, - struct rule_dpif **rule); + struct rule_dpif **rule, bool take_ref); bool group_dpif_lookup(struct ofproto_dpif *ofproto, uint32_t group_id, struct group_dpif **group); @@ -218,4 +222,45 @@ int ofproto_dpif_add_internal_flow(struct ofproto_dpif *, int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *, int priority); +/* Number of implemented OpenFlow tables. */ +enum { N_TABLES = 255 }; +enum { TBL_INTERNAL = N_TABLES - 1 }; /* Used for internal hidden rules. */ +BUILD_ASSERT_DECL(N_TABLES >= 2 && N_TABLES <= 255); + + +/* struct rule_dpif has struct rule as it's first member. */ +#define RULE_CAST(RULE) ((struct rule *)RULE) + +static inline void rule_dpif_ref(struct rule_dpif *rule) +{ + if (rule) { + ofproto_rule_ref(RULE_CAST(rule)); + } +} + +static inline void rule_dpif_unref(struct rule_dpif *rule) +{ + if (rule) { + ofproto_rule_unref(RULE_CAST(rule)); + } +} + +static inline bool rule_dpif_is_fail_open(const struct rule_dpif *rule) +{ + return is_fail_open_rule(RULE_CAST(rule)); +} + +static inline bool rule_dpif_is_table_miss(const struct rule_dpif *rule) +{ + return rule_is_table_miss(RULE_CAST(rule)); +} + +/* Returns true if 'rule' is an internal rule, false otherwise. */ +static inline bool rule_dpif_is_internal(const struct rule_dpif *rule) +{ + return RULE_CAST(rule)->table_id == TBL_INTERNAL; +} + +#undef RULE_CAST + #endif /* ofproto-dpif.h */