X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-provider.h;h=8f4f41e60e6d85a61d5905e17d4e48116197f838;hb=003ce655b7116d18c86a74c50391e54990346931;hp=11dcd82681c63b19d94605c0658a02665fc273b9;hpb=88bf179aa3f3fa89822edcd9b882e0f06d39bf08;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index 11dcd8268..8f4f41e60 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -39,6 +39,7 @@ #include "heap.h" #include "hindex.h" #include "list.h" +#include "ofp-actions.h" #include "ofp-errors.h" #include "ofp-util.h" #include "ofproto/ofproto.h" @@ -50,7 +51,6 @@ #include "timeval.h" struct match; -struct ofpact; struct ofputil_flow_mod; struct bfd_cfg; struct meter; @@ -377,7 +377,7 @@ struct rule { /* OpenFlow actions. See struct rule_actions for more thread-safety * notes. */ - OVSRCU_TYPE(struct rule_actions *) actions; + OVSRCU_TYPE(const struct rule_actions *) actions; /* In owning meter's 'rules' list. An empty list if there is no meter. */ struct list meter_list_node OVS_GUARDED_BY(ofproto_mutex); @@ -406,24 +406,8 @@ struct rule { void ofproto_rule_ref(struct rule *); void ofproto_rule_unref(struct rule *); -static inline struct rule_actions * -rule_get_actions(const struct rule *rule) -{ - return ovsrcu_get(struct rule_actions *, &rule->actions); -} - -/* Returns true if 'rule' is an OpenFlow 1.3 "table-miss" rule, false - * otherwise. - * - * ("Table-miss" rules are special because a packet_in generated through one - * uses OFPR_NO_MATCH as its reason, whereas packet_ins generated by any other - * rule use OFPR_ACTION.) */ -static inline bool -rule_is_table_miss(const struct rule *rule) -{ - return rule->cr.priority == 0 && cls_rule_is_catchall(&rule->cr); -} -bool rule_is_internal(const struct rule *); +static inline const struct rule_actions * rule_get_actions(const struct rule *); +static inline bool rule_is_table_miss(const struct rule *); /* A set of actions within a "struct rule". * @@ -431,21 +415,22 @@ bool rule_is_internal(const struct rule *); * Thread-safety * ============= * - * A struct rule_actions 'actions' may be accessed without a risk of being + * A struct rule_actions may be accessed without a risk of being * freed by code that holds a read-lock or write-lock on 'rule->mutex' (where - * 'rule' is the rule for which 'rule->actions == actions') or that owns a - * reference to 'actions->ref_count' (or both). */ + * 'rule' is the rule for which 'rule->actions == actions') or during the RCU + * active period. */ struct rule_actions { /* These members are immutable: they do not change during the struct's * lifetime. */ - struct ofpact *ofpacts; /* Sequence of "struct ofpacts". */ - unsigned int ofpacts_len; /* Size of 'ofpacts', in bytes. */ - uint32_t provider_meter_id; /* Datapath meter_id, or UINT32_MAX. */ + uint32_t ofpacts_len; /* Size of 'ofpacts', in bytes. */ + uint32_t provider_meter_id; /* Datapath meter_id, or UINT32_MAX. */ + struct ofpact ofpacts[]; /* Sequence of "struct ofpacts". */ }; +BUILD_ASSERT_DECL(offsetof(struct rule_actions, ofpacts) % OFPACT_ALIGNTO == 0); -struct rule_actions *rule_actions_create(const struct ofproto *, - const struct ofpact *, size_t); -void rule_actions_destroy(struct rule_actions *); +const struct rule_actions *rule_actions_create(const struct ofproto *, + const struct ofpact *, size_t); +void rule_actions_destroy(const struct rule_actions *); /* A set of rules to which an OpenFlow operation applies. */ struct rule_collection { @@ -475,11 +460,7 @@ extern unsigned ofproto_max_idle; * ofproto-dpif implementation. */ extern size_t n_handlers, n_revalidators; -static inline struct rule * -rule_from_cls_rule(const struct cls_rule *cls_rule) -{ - return cls_rule ? CONTAINER_OF(cls_rule, struct rule, cr) : NULL; -} +static inline struct rule *rule_from_cls_rule(const struct cls_rule *); void ofproto_rule_expire(struct rule *rule, uint8_t reason) OVS_REQUIRES(ofproto_mutex); @@ -1745,4 +1726,29 @@ bool ofproto_delete_flow(struct ofproto *, OVS_EXCLUDED(ofproto_mutex); void ofproto_flush_flows(struct ofproto *); + +static inline const struct rule_actions * +rule_get_actions(const struct rule *rule) +{ + return ovsrcu_get(const struct rule_actions *, &rule->actions); +} + +/* Returns true if 'rule' is an OpenFlow 1.3 "table-miss" rule, false + * otherwise. + * + * ("Table-miss" rules are special because a packet_in generated through one + * uses OFPR_NO_MATCH as its reason, whereas packet_ins generated by any other + * rule use OFPR_ACTION.) */ +static inline bool +rule_is_table_miss(const struct rule *rule) +{ + return rule->cr.priority == 0 && cls_rule_is_catchall(&rule->cr); +} + +static inline struct rule * +rule_from_cls_rule(const struct cls_rule *cls_rule) +{ + return cls_rule ? CONTAINER_OF(cls_rule, struct rule, cr) : NULL; +} + #endif /* ofproto/ofproto-provider.h */