- * If no flow matching 'flow->key' exists in 'dpif', returns ENOENT. On
- * other failure, returns a positive errno value. */
- int (*flow_get)(const struct dpif *dpif, struct odp_flow *flow);
-
- /* Adds or modifies a flow in 'dpif' as specified in 'put':
+ * If 'actionsp' is nonnull, then on success '*actionsp' must be set to an
+ * ofpbuf owned by the caller that contains the Netlink attributes for the
+ * flow's actions. The caller must free the ofpbuf (with ofpbuf_delete())
+ * when it is no longer needed.
+ *
+ * If 'stats' is nonnull, then on success it must be updated with the
+ * flow's statistics. */
+ int (*flow_get)(const struct dpif *dpif, int flags,
+ const struct nlattr *key, size_t key_len,
+ struct ofpbuf **actionsp, struct dpif_flow_stats *stats);
+
+ /* Adds or modifies a flow in 'dpif'. The flow is specified by the Netlink
+ * attributes with types ODP_KEY_ATTR_* in the 'key_len' bytes starting at
+ * 'key'. The associated actions are specified by the Netlink attributes
+ * with types ODPAT_* in the 'actions_len' bytes starting at 'actions'.
+ *
+ * - If the flow's key does not exist in 'dpif', then the flow will be
+ * added if 'flags' includes DPIF_FP_CREATE. Otherwise the operation
+ * will fail with ENOENT.
+ *
+ * If the operation succeeds, then 'stats', if nonnull, must be zeroed.