X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-provider.h;h=9431be875d13e6642d9a97aacae8c6afd6495dc2;hb=dc723c447a797e555d400594133a35b9841eb1de;hp=28223fea78ff04318590bd95348e02c6258008a7;hpb=06a0f3e21b2cf2b772a01cc0779d4c2e01389095;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index 28223fea7..9431be875 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; @@ -174,6 +174,7 @@ struct ofport { struct netdev *netdev; struct ofputil_phy_port pp; ofp_port_t ofp_port; /* OpenFlow port number. */ + uint64_t change_seq; long long int created; /* Time created, in msec. */ int mtu; }; @@ -205,7 +206,8 @@ void ofproto_port_set_state(struct ofport *, enum ofputil_port_state); */ enum oftable_flags { OFTABLE_HIDDEN = 1 << 0, /* Hide from most OpenFlow operations. */ - OFTABLE_READONLY = 1 << 1 /* Don't allow OpenFlow to change this table. */ + OFTABLE_READONLY = 1 << 1 /* Don't allow OpenFlow controller to change + this table. */ }; /* A flow table within a "struct ofproto". @@ -262,7 +264,7 @@ struct oftable { struct hmap eviction_groups_by_id; struct heap eviction_groups_by_size; - /* Table config: contains enum ofp_table_config; accessed atomically. */ + /* Table config: contains enum ofproto_table_config; accessed atomically. */ atomic_uint config; }; @@ -375,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); @@ -404,10 +406,10 @@ struct rule { void ofproto_rule_ref(struct rule *); void ofproto_rule_unref(struct rule *); -static inline struct rule_actions * +static inline const struct rule_actions * rule_get_actions(const struct rule *rule) { - return ovsrcu_get(struct rule_actions *, &rule->actions); + return ovsrcu_get(const struct rule_actions *, &rule->actions); } /* Returns true if 'rule' is an OpenFlow 1.3 "table-miss" rule, false @@ -421,6 +423,7 @@ 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 *); /* A set of actions within a "struct rule". * @@ -428,21 +431,22 @@ rule_is_table_miss(const struct rule *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 { @@ -834,7 +838,7 @@ struct ofproto_class { * * - 'write_setfields' and 'apply_setfields' to OFPXMT12_MASK. * - * - 'metadata_match' and 'metadata_write' to UINT64_MAX. + * - 'metadata_match' and 'metadata_write' to OVS_BE64_MAX. * * - 'instructions' to OFPIT11_ALL. * @@ -1298,8 +1302,8 @@ struct ofproto_class { * information in 'flow' is extracted from 'packet', except for * flow->tunnel and flow->in_port, which are assigned the correct values * for the incoming packet. The register values are zeroed. 'packet''s - * header pointers (e.g. packet->l3) are appropriately initialized. - * packet->l3 is aligned on a 32-bit boundary. + * header pointers and offsets (e.g. packet->l3) are appropriately + * initialized. packet->l3 is aligned on a 32-bit boundary. * * The implementation should add the statistics for 'packet' into 'rule'. * @@ -1457,15 +1461,19 @@ struct ofproto_class { * support CFM, as does a null pointer. */ int (*set_cfm)(struct ofport *ofport, const struct cfm_settings *s); - /* Checks the status of CFM configured on 'ofport'. Returns true if the - * port's CFM status was successfully stored into '*status'. Returns false - * if the port did not have CFM configured, in which case '*status' is - * indeterminate. + /* Checks the status of CFM configured on 'ofport'. Returns 0 if the + * port's CFM status was successfully stored into '*status'. Returns + * negative number if there is no status change since last update. + * Returns positive errno otherwise. * - * The caller must provide and owns '*status', but it does not own and must - * not modify or free the array returned in 'status->rmps'. */ - bool (*get_cfm_status)(const struct ofport *ofport, - struct ofproto_cfm_status *status); + * EOPNOTSUPP as a return value indicates that this ofproto_class does not + * support CFM, as does a null pointer. + * + * The caller must provide and own '*status', and it must free the array + * returned in 'status->rmps'. '*status' is indeterminate if the return + * value is non-zero. */ + int (*get_cfm_status)(const struct ofport *ofport, + struct ofproto_cfm_status *status); /* Configures BFD on 'ofport'. * @@ -1478,8 +1486,11 @@ struct ofproto_class { int (*set_bfd)(struct ofport *ofport, const struct smap *cfg); /* Populates 'smap' with the status of BFD on 'ofport'. Returns 0 on - * success, or a positive errno. EOPNOTSUPP as a return value indicates - * that this ofproto_class does not support BFD, as does a null pointer. */ + * success. Returns a negative number if there is no status change since + * last update. Returns a positive errno otherwise. + * + * EOPNOTSUPP as a return value indicates that this ofproto_class does not + * support BFD, as does a null pointer. */ int (*get_bfd_status)(struct ofport *ofport, struct smap *smap); /* Configures spanning tree protocol (STP) on 'ofproto' using the @@ -1724,6 +1735,8 @@ BUILD_ASSERT_DECL(OFPROTO_POSTPONE < OFPERR_OFS); int ofproto_flow_mod(struct ofproto *, struct ofputil_flow_mod *) OVS_EXCLUDED(ofproto_mutex); +struct rule *ofproto_refresh_rule(struct rule *rule) + OVS_EXCLUDED(ofproto_mutex); void ofproto_add_flow(struct ofproto *, const struct match *, unsigned int priority, const struct ofpact *ofpacts, size_t ofpacts_len)