-dp_netdev_execute_actions(struct dp_netdev *dp,
- struct ofpbuf *packet, struct flow *key,
- const struct nlattr *actions,
- size_t actions_len)
-{
- odp_execute_actions(dp, packet, key, actions, actions_len,
- dp_netdev_output_port, dp_netdev_action_userspace);
-}
+dp_netdev_execute_actions(struct dp_netdev *dp, const struct flow *key,
+ struct ofpbuf *packet,
+ const struct nlattr *actions, size_t actions_len)
+{
+ struct dp_netdev_execute_aux aux = {dp, key};
+ struct flow md = *key; /* Packet metadata, may be modified by actions. */
+
+ odp_execute_actions(&aux, packet, &md, actions, actions_len,
+ dp_netdev_action_output, dp_netdev_action_userspace);
+}
+
+#define DPIF_NETDEV_CLASS_FUNCTIONS \
+ dpif_netdev_enumerate, \
+ dpif_netdev_port_open_type, \
+ dpif_netdev_open, \
+ dpif_netdev_close, \
+ dpif_netdev_destroy, \
+ dpif_netdev_run, \
+ dpif_netdev_wait, \
+ dpif_netdev_get_stats, \
+ dpif_netdev_port_add, \
+ dpif_netdev_port_del, \
+ dpif_netdev_port_query_by_number, \
+ dpif_netdev_port_query_by_name, \
+ dpif_netdev_get_max_ports, \
+ NULL, /* port_get_pid */ \
+ dpif_netdev_port_dump_start, \
+ dpif_netdev_port_dump_next, \
+ dpif_netdev_port_dump_done, \
+ dpif_netdev_port_poll, \
+ dpif_netdev_port_poll_wait, \
+ dpif_netdev_flow_get, \
+ dpif_netdev_flow_put, \
+ dpif_netdev_flow_del, \
+ dpif_netdev_flow_flush, \
+ dpif_netdev_flow_dump_start, \
+ dpif_netdev_flow_dump_next, \
+ dpif_netdev_flow_dump_done, \
+ dpif_netdev_execute, \
+ NULL, /* operate */ \
+ dpif_netdev_recv_set, \
+ dpif_netdev_queue_to_priority, \
+ dpif_netdev_recv, \
+ dpif_netdev_recv_wait, \
+ dpif_netdev_recv_purge, \