+ * All of the returned data is owned by 'dpif', not by the caller, and the
+ * caller must not modify or free it. 'dpif' must guarantee that it
+ * remains accessible and unchanging until at least the next call to
+ * 'flow_dump_next' or 'flow_dump_done' for 'state'. */
+ int (*flow_dump_next)(const struct dpif *dpif, void *state,
+ const struct nlattr **key, size_t *key_len,
+ const struct nlattr **actions, size_t *actions_len,
+ const struct dpif_flow_stats **stats);
+
+ /* Releases resources from 'dpif' for 'state', which was initialized by a
+ * successful call to the 'flow_dump_start' function for 'dpif'. */
+ int (*flow_dump_done)(const struct dpif *dpif, void *state);
+
+ /* Performs the 'execute->actions_len' bytes of actions in
+ * 'execute->actions' on the Ethernet frame specified in 'execute->packet'
+ * taken from the flow specified in the 'execute->key_len' bytes of
+ * 'execute->key'. ('execute->key' is mostly redundant with
+ * 'execute->packet', but it contains some metadata that cannot be
+ * recovered from 'execute->packet', such as tunnel and in_port.) */
+ int (*execute)(struct dpif *dpif, const struct dpif_execute *execute);
+
+ /* Executes each of the 'n_ops' operations in 'ops' on 'dpif', in the order
+ * in which they are specified, placing each operation's results in the
+ * "output" members documented in comments.
+ *
+ * This function is optional. It is only worthwhile to implement it if
+ * 'dpif' can perform operations in batch faster than individually. */
+ void (*operate)(struct dpif *dpif, struct dpif_op **ops, size_t n_ops);
+
+ /* Enables or disables receiving packets with dpif_recv() for 'dpif'.
+ * Turning packet receive off and then back on is allowed to change Netlink
+ * PID assignments (see ->port_get_pid()). The client is responsible for
+ * updating flows as necessary if it does this. */
+ int (*recv_set)(struct dpif *dpif, bool enable);
+
+ /* Translates OpenFlow queue ID 'queue_id' (in host byte order) into a
+ * priority value used for setting packet priority. */
+ int (*queue_to_priority)(const struct dpif *dpif, uint32_t queue_id,
+ uint32_t *priority);
+
+ /* Polls for an upcall from 'dpif'. If successful, stores the upcall into
+ * '*upcall', using 'buf' for storage. Should only be called if 'recv_set'
+ * has been used to enable receiving packets from 'dpif'.
+ *
+ * The implementation should point 'upcall->packet' and 'upcall->key' into
+ * data in the caller-provided 'buf'. If necessary to make room, the
+ * implementation may expand the data in 'buf'. (This is hardly a great
+ * way to do things but it works out OK for the dpif providers that exist
+ * so far.)
+ *
+ * This function must not block. If no upcall is pending when it is
+ * called, it should return EAGAIN without blocking. */
+ int (*recv)(struct dpif *dpif, struct dpif_upcall *upcall,
+ struct ofpbuf *buf);