+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. */
+};
+
+/* A flow table within a "struct ofproto". */
+struct oftable {
+ enum oftable_flags flags;
+ struct classifier cls; /* Contains "struct rule"s. */
+ char *name; /* Table name exposed via OpenFlow, or NULL. */
+
+ /* Maximum number of flows or UINT_MAX if there is no limit besides any
+ * limit imposed by resource limitations. */
+ unsigned int max_flows;
+
+ /* These members determine the handling of an attempt to add a flow that
+ * would cause the table to have more than 'max_flows' flows.
+ *
+ * If 'eviction_fields' is NULL, overflows will be rejected with an error.
+ *
+ * If 'eviction_fields' is nonnull (regardless of whether n_eviction_fields
+ * is nonzero), an overflow will cause a flow to be removed. The flow to
+ * be removed is chosen to give fairness among groups distinguished by
+ * different values for the subfields within 'groups'. */
+ struct mf_subfield *eviction_fields;
+ size_t n_eviction_fields;
+
+ /* Eviction groups.
+ *
+ * When a flow is added that would cause the table to have more than
+ * 'max_flows' flows, and 'eviction_fields' is nonnull, these groups are
+ * used to decide which rule to evict: the rule is chosen from the eviction
+ * group that contains the greatest number of rules.*/
+ uint32_t eviction_group_id_basis;
+ struct hmap eviction_groups_by_id;
+ struct heap eviction_groups_by_size;
+};
+
+/* Assigns TABLE to each oftable, in turn, in OFPROTO.
+ *
+ * All parameters are evaluated multiple times. */
+#define OFPROTO_FOR_EACH_TABLE(TABLE, OFPROTO) \
+ for ((TABLE) = (OFPROTO)->tables; \
+ (TABLE) < &(OFPROTO)->tables[(OFPROTO)->n_tables]; \
+ (TABLE)++)