#endif
struct dpif;
+struct ds;
struct netdev;
struct nlattr;
struct ofpbuf;
int dpif_port_poll(const struct dpif *, char **devnamep);
void dpif_port_poll_wait(const struct dpif *);
+struct dpif_flow_stats {
+ uint64_t n_packets;
+ uint64_t n_bytes;
+ long long int used;
+ uint8_t tcp_flags;
+};
+
+void dpif_flow_stats_format(const struct dpif_flow_stats *, struct ds *);
+
+enum dpif_flow_put_flags {
+ DPIF_FP_CREATE = 1 << 0, /* Allow creating a new flow. */
+ DPIF_FP_MODIFY = 1 << 1, /* Allow modifying an existing flow. */
+ DPIF_FP_ZERO_STATS = 1 << 2 /* Zero the stats of an existing flow. */
+};
+
int dpif_flow_flush(struct dpif *);
-int dpif_flow_put(struct dpif *, struct odp_flow_put *);
-int dpif_flow_del(struct dpif *, struct odp_flow *);
-int dpif_flow_get(const struct dpif *, struct odp_flow *);
+int dpif_flow_put(struct dpif *, enum dpif_flow_put_flags,
+ const struct nlattr *key, size_t key_len,
+ const struct nlattr *actions, size_t actions_len,
+ struct dpif_flow_stats *);
+int dpif_flow_del(struct dpif *,
+ const struct nlattr *key, size_t key_len,
+ struct dpif_flow_stats *);
+int dpif_flow_get(const struct dpif *,
+ const struct nlattr *key, size_t key_len,
+ struct ofpbuf **actionsp, struct dpif_flow_stats *);
struct dpif_flow_dump {
const struct dpif *dpif;
void *state;
};
void dpif_flow_dump_start(struct dpif_flow_dump *, const struct dpif *);
-bool dpif_flow_dump_next(struct dpif_flow_dump *, struct odp_flow *);
+bool dpif_flow_dump_next(struct dpif_flow_dump *,
+ const struct nlattr **key, size_t *key_len,
+ const struct nlattr **actions, size_t *actions_len,
+ const struct dpif_flow_stats **);
int dpif_flow_dump_done(struct dpif_flow_dump *);
int dpif_execute(struct dpif *, const struct nlattr *actions,