-int dpif_port_group_set(struct dpif *, uint16_t group,
- const uint16_t ports[], size_t n_ports);
-int dpif_port_group_get(const struct dpif *, uint16_t group,
- uint16_t ports[], size_t n_ports, size_t *n_out);
+struct dpif_port_dump {
+ const struct dpif *dpif;
+ int error;
+ void *state;
+};
+void dpif_port_dump_start(struct dpif_port_dump *, const struct dpif *);
+bool dpif_port_dump_next(struct dpif_port_dump *, struct dpif_port *);
+int dpif_port_dump_done(struct dpif_port_dump *);
+
+/* Iterates through each DPIF_PORT in DPIF, using DUMP as state.
+ *
+ * Arguments all have pointer type.
+ *
+ * If you break out of the loop, then you need to free the dump structure by
+ * hand using dpif_port_dump_done(). */
+#define DPIF_PORT_FOR_EACH(DPIF_PORT, DUMP, DPIF) \
+ for (dpif_port_dump_start(DUMP, DPIF); \
+ (dpif_port_dump_next(DUMP, DPIF_PORT) \
+ ? true \
+ : (dpif_port_dump_done(DUMP), false)); \
+ )
+
+int dpif_port_poll(const struct dpif *, char **devnamep);
+void dpif_port_poll_wait(const struct dpif *);