+/* Abstract ofp_table_mod. */
+struct ofputil_table_mod {
+ uint8_t table_id; /* ID of the table, 0xff indicates all tables. */
+ enum ofp_table_config config;
+};
+
+enum ofperr ofputil_decode_table_mod(const struct ofp_header *,
+ struct ofputil_table_mod *);
+struct ofpbuf *ofputil_encode_table_mod(const struct ofputil_table_mod *,
+ enum ofputil_protocol);
+
+/* Abstract ofp_table_features. */
+struct ofputil_table_features {
+ uint8_t table_id; /* Identifier of table. Lower numbered tables
+ are consulted first. */
+ char name[OFP_MAX_TABLE_NAME_LEN];
+ ovs_be64 metadata_match; /* Bits of metadata table can match. */
+ ovs_be64 metadata_write; /* Bits of metadata table can write. */
+ uint32_t config; /* Bitmap of OFPTC_* values */
+ uint32_t max_entries; /* Max number of entries supported. */
+
+ /* Table features related to instructions. There are two instances:
+ *
+ * - 'miss' reports features available in the table miss flow.
+ *
+ * - 'nonmiss' reports features available in other flows. */
+ struct ofputil_table_instruction_features {
+ /* Tables that "goto-table" may jump to. */
+ unsigned long int next[BITMAP_N_LONGS(255)];
+
+ /* Bitmap of OVSINST_* for supported instructions. */
+ uint32_t instructions;
+
+ /* Table features related to actions. There are two instances:
+ *
+ * - 'write' reports features available in a "write_actions"
+ * instruction.
+ *
+ * - 'apply' reports features available in an "apply_actions"
+ * instruction. */
+ struct ofputil_table_action_features {
+ uint32_t actions; /* Bitmap of supported OFPAT*. */
+ uint64_t set_fields; /* Bitmap of MFF_* "set-field" supports. */
+ } write, apply;
+ } nonmiss, miss;
+
+ /* MFF_* bitmaps.
+ *
+ * For any given field the following combinations are valid:
+ *
+ * - match=0, wildcard=0, mask=0: Flows in this table cannot match on
+ * this field.
+ *
+ * - match=1, wildcard=0, mask=0: Flows in this table must match on all
+ * the bits in this field.
+ *
+ * - match=1, wildcard=1, mask=0: Flows in this table must either match
+ * on all the bits in the field or wildcard the field entirely.
+ *
+ * - match=1, wildcard=1, mask=1: Flows in this table may arbitrarily
+ * mask this field (as special cases, they may match on all the bits
+ * or wildcard it entirely).
+ *
+ * Other combinations do not make sense.
+ */
+ uint64_t match; /* Fields that may be matched. */
+ uint64_t mask; /* Subset of 'match' that may have masks. */
+ uint64_t wildcard; /* Subset of 'match' that may be wildcarded. */
+};
+
+int ofputil_decode_table_features(struct ofpbuf *,
+ struct ofputil_table_features *, bool loose);
+struct ofpbuf *ofputil_encode_table_features_request(
+ enum ofp_version ofp_version);
+void ofputil_append_table_features_reply(
+ const struct ofputil_table_features *tf,
+ struct list *replies);
+
+uint16_t table_feature_prop_get_size(enum ofp13_table_feature_prop_type type);
+char *table_feature_prop_get_name(enum ofp13_table_feature_prop_type type);
+
+/* Meter band configuration for all supported band types. */
+struct ofputil_meter_band {
+ uint16_t type;
+ uint8_t prec_level; /* Non-zero if type == OFPMBT_DSCP_REMARK. */
+ uint32_t rate;
+ uint32_t burst_size;
+};
+
+struct ofputil_meter_band_stats {
+ uint64_t packet_count;
+ uint64_t byte_count;
+};
+
+struct ofputil_meter_config {
+ uint32_t meter_id;
+ uint16_t flags;
+ uint16_t n_bands;
+ struct ofputil_meter_band *bands;
+};
+
+/* Abstract ofp_meter_mod. */
+struct ofputil_meter_mod {
+ uint16_t command;
+ struct ofputil_meter_config meter;
+};
+
+struct ofputil_meter_stats {
+ uint32_t meter_id;
+ uint32_t flow_count;
+ uint64_t packet_in_count;
+ uint64_t byte_in_count;
+ uint32_t duration_sec;
+ uint32_t duration_nsec;
+ uint16_t n_bands;
+ struct ofputil_meter_band_stats *bands;
+};
+
+struct ofputil_meter_features {
+ uint32_t max_meters; /* Maximum number of meters. */
+ uint32_t band_types; /* Can support max 32 band types. */
+ uint32_t capabilities; /* Supported flags. */
+ uint8_t max_bands;
+ uint8_t max_color;
+};
+
+enum ofperr ofputil_decode_meter_mod(const struct ofp_header *,
+ struct ofputil_meter_mod *,
+ struct ofpbuf *bands);
+struct ofpbuf *ofputil_encode_meter_mod(enum ofp_version,
+ const struct ofputil_meter_mod *);
+
+void ofputil_decode_meter_features(const struct ofp_header *,
+ struct ofputil_meter_features *);
+struct ofpbuf *ofputil_encode_meter_features_reply(const struct
+ ofputil_meter_features *,
+ const struct ofp_header *
+ request);
+void ofputil_decode_meter_request(const struct ofp_header *,
+ uint32_t *meter_id);
+
+void ofputil_append_meter_config(struct list *replies,
+ const struct ofputil_meter_config *);
+
+void ofputil_append_meter_stats(struct list *replies,
+ const struct ofputil_meter_stats *);
+
+enum ofputil_meter_request_type {
+ OFPUTIL_METER_FEATURES,
+ OFPUTIL_METER_CONFIG,
+ OFPUTIL_METER_STATS
+};
+
+struct ofpbuf *ofputil_encode_meter_request(enum ofp_version,
+ enum ofputil_meter_request_type,
+ uint32_t meter_id);
+
+int ofputil_decode_meter_stats(struct ofpbuf *,
+ struct ofputil_meter_stats *,
+ struct ofpbuf *bands);
+
+int ofputil_decode_meter_config(struct ofpbuf *,
+ struct ofputil_meter_config *,
+ struct ofpbuf *bands);
+
+/* Type for meter_id in ofproto provider interface, UINT32_MAX if invalid. */
+typedef struct { uint32_t uint32; } ofproto_meter_id;
+
+/* Abstract ofp_role_request and reply. */
+struct ofputil_role_request {
+ enum ofp12_controller_role role;
+ bool have_generation_id;
+ uint64_t generation_id;
+};
+
+struct ofputil_role_status {
+ enum ofp12_controller_role role;
+ enum ofp14_controller_role_reason reason;
+ uint64_t generation_id;
+};
+
+enum ofperr ofputil_decode_role_message(const struct ofp_header *,
+ struct ofputil_role_request *);
+struct ofpbuf *ofputil_encode_role_reply(const struct ofp_header *,
+ const struct ofputil_role_request *);
+
+struct ofpbuf *ofputil_encode_role_status(
+ const struct ofputil_role_status *status,
+ enum ofputil_protocol protocol);
+
+enum ofperr ofputil_decode_role_status(const struct ofp_header *oh,
+ struct ofputil_role_status *rs);
+/* Abstract table stats.
+ *
+ * For now we use ofp12_table_stats as a superset of the other protocol
+ * versions' table stats. */
+
+struct ofpbuf *ofputil_encode_table_stats_reply(
+ const struct ofp12_table_stats[], int n,
+ const struct ofp_header *request);
+
+/* Queue configuration request. */
+struct ofpbuf *ofputil_encode_queue_get_config_request(enum ofp_version,
+ ofp_port_t port);
+enum ofperr ofputil_decode_queue_get_config_request(const struct ofp_header *,
+ ofp_port_t *port);
+
+/* Queue configuration reply. */
+struct ofputil_queue_config {
+ uint32_t queue_id;
+
+ /* Each of these optional values is expressed in tenths of a percent.
+ * Values greater than 1000 indicate that the feature is disabled.
+ * UINT16_MAX indicates that the value is omitted. */
+ uint16_t min_rate;
+ uint16_t max_rate;
+};
+
+struct ofpbuf *ofputil_encode_queue_get_config_reply(
+ const struct ofp_header *request);
+void ofputil_append_queue_get_config_reply(
+ struct ofpbuf *reply, const struct ofputil_queue_config *);
+
+enum ofperr ofputil_decode_queue_get_config_reply(struct ofpbuf *reply,
+ ofp_port_t *);
+int ofputil_pull_queue_get_config_reply(struct ofpbuf *reply,
+ struct ofputil_queue_config *);
+
+