struct dpif_port *dpif_port)
{
dpif_port->name = xstrdup(netdev_get_name(port->netdev));
- dpif_port->type = xstrdup(port->internal ? "internal" : "system");
+ dpif_port->type = xstrdup(port->internal ? "internal"
+ : netdev_get_type(port->netdev));
dpif_port->port_no = port->port_no;
}
free(state->name);
state->name = xstrdup(netdev_get_name(port->netdev));
dpif_port->name = state->name;
- dpif_port->type = port->internal ? "internal" : "system";
+ dpif_port->type = (char *) (port->internal ? "internal"
+ : netdev_get_type(port->netdev));
dpif_port->port_no = port->port_no;
state->port_no = port_no + 1;
return 0;
return 0;
}
+static int
+dpif_netdev_queue_to_priority(const struct dpif *dpif OVS_UNUSED,
+ uint32_t queue_id, uint32_t *priority)
+{
+ *priority = queue_id;
+ return 0;
+}
+
static struct dp_netdev_queue *
find_nonempty_queue(struct dpif *dpif)
{
}
}
-static void
-dp_netdev_pop_vlan(struct ofpbuf *packet)
-{
- struct vlan_eth_header *veh = packet->l2;
- if (packet->size >= sizeof *veh
- && veh->veth_type == htons(ETH_TYPE_VLAN)) {
- struct eth_header tmp;
-
- memcpy(tmp.eth_dst, veh->veth_dst, ETH_ADDR_LEN);
- memcpy(tmp.eth_src, veh->veth_src, ETH_ADDR_LEN);
- tmp.eth_type = veh->veth_next_type;
-
- ofpbuf_pull(packet, VLAN_HEADER_LEN);
- packet->l2 = (char*)packet->l2 + VLAN_HEADER_LEN;
- memcpy(packet->data, &tmp, sizeof tmp);
- }
-}
-
static void
dp_netdev_set_dl(struct ofpbuf *packet, const struct ovs_key_ethernet *eth_key)
{
{
struct udp_header *uh = packet->l4;
- if (uh->udp_src != udp_key->udp_src) {
- dp_netdev_set_port(&uh->udp_src, udp_key->udp_src, &uh->udp_csum);
- }
- if (uh->udp_dst != udp_key->udp_dst) {
- dp_netdev_set_port(&uh->udp_dst, udp_key->udp_dst, &uh->udp_csum);
+ if (uh->udp_csum) {
+ if (uh->udp_src != udp_key->udp_src) {
+ dp_netdev_set_port(&uh->udp_src, udp_key->udp_src, &uh->udp_csum);
+ }
+
+ if (uh->udp_dst != udp_key->udp_dst) {
+ dp_netdev_set_port(&uh->udp_dst, udp_key->udp_dst, &uh->udp_csum);
+ }
+
+ if (!uh->udp_csum) {
+ uh->udp_csum = htons(0xffff);
+ }
+ } else {
+ uh->udp_src = udp_key->udp_src;
+ uh->udp_dst = udp_key->udp_dst;
}
}
break;
case OVS_KEY_ATTR_UNSPEC:
+ case OVS_KEY_ATTR_ENCAP:
case OVS_KEY_ATTR_ETHERTYPE:
case OVS_KEY_ATTR_IPV6:
case OVS_KEY_ATTR_IN_PORT:
- case OVS_KEY_ATTR_8021Q:
+ case OVS_KEY_ATTR_VLAN:
case OVS_KEY_ATTR_ICMP:
case OVS_KEY_ATTR_ICMPV6:
case OVS_KEY_ATTR_ARP:
unsigned int left;
NL_ATTR_FOR_EACH_UNSAFE (a, left, actions, actions_len) {
- const struct nlattr *nested;
- const struct ovs_key_8021q *q_key;
+ const struct ovs_action_push_vlan *vlan;
int type = nl_attr_type(a);
switch ((enum ovs_action_attr) type) {
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);
+ case OVS_ACTION_ATTR_PUSH_VLAN:
+ vlan = nl_attr_get(a);
+ eth_push_vlan(packet, vlan->vlan_tci & ~htons(VLAN_CFI));
break;
- case OVS_ACTION_ATTR_POP:
- assert(nl_attr_get_u16(a) == OVS_KEY_ATTR_8021Q);
- dp_netdev_pop_vlan(packet);
+ case OVS_ACTION_ATTR_POP_VLAN:
+ eth_pop_vlan(packet);
break;
case OVS_ACTION_ATTR_SET:
NULL, /* operate */
dpif_netdev_recv_get_mask,
dpif_netdev_recv_set_mask,
- NULL, /* queue_to_priority */
+ dpif_netdev_queue_to_priority,
dpif_netdev_recv,
dpif_netdev_recv_wait,
dpif_netdev_recv_purge,