-static void
-dp_netdev_execute_actions(struct dp_netdev *dp,
- struct ofpbuf *packet, struct flow *key,
- const struct nlattr *actions,
- size_t actions_len)
-{
- const struct nlattr *a;
- unsigned int left;
-
- NL_ATTR_FOR_EACH_UNSAFE (a, left, actions, actions_len) {
- const struct nlattr *nested;
- const struct ovs_key_8021q *q_key;
- int type = nl_attr_type(a);
-
- switch ((enum ovs_action_attr) type) {
- case OVS_ACTION_ATTR_OUTPUT:
- dp_netdev_output_port(dp, packet, nl_attr_get_u32(a));
- break;
-
- case OVS_ACTION_ATTR_USERSPACE:
- dp_netdev_action_userspace(dp, packet, key, a);
- break;
-
- case OVS_ACTION_ATTR_PUSH:
- nested = nl_attr_get(a);
- assert(nl_attr_type(nested) == OVS_KEY_ATTR_8021Q);
- q_key = nl_attr_get_unspec(nested, sizeof(*q_key));
- eth_push_vlan(packet, q_key->q_tci);
- break;
-
- case OVS_ACTION_ATTR_POP:
- assert(nl_attr_get_u16(a) == OVS_KEY_ATTR_8021Q);
- dp_netdev_pop_vlan(packet);
- break;
-
- case OVS_ACTION_ATTR_SET:
- execute_set_action(packet, nl_attr_get(a));
- break;
-
- case OVS_ACTION_ATTR_SAMPLE:
- dp_netdev_sample(dp, packet, key, a);
- break;
-
- case OVS_ACTION_ATTR_UNSPEC:
- case __OVS_ACTION_ATTR_MAX:
- NOT_REACHED();
- }
- }
-}
-
-const struct dpif_class dpif_netdev_class = {
- "netdev",
- NULL, /* enumerate */
- 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_get_mask,
- dpif_netdev_recv_set_mask,
- NULL, /* queue_to_priority */
- dpif_netdev_recv,
- dpif_netdev_recv_wait,
- dpif_netdev_recv_purge,
-};
-
-void
-dpif_dummy_register(void)
-{
- if (!dpif_dummy_class.type) {
- dpif_dummy_class = dpif_netdev_class;
- dpif_dummy_class.type = "dummy";
- dp_register_provider(&dpif_dummy_class);
- }
-}