X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif-netdev.c;h=5efc8697b0c9fc3b9cce0962a740384f54fd52a6;hb=02c9ed77e316ef38d89a17a184e0b497615258fa;hp=93dd1cde99a89d1e36865524dde42d9aced45ec2;hpb=f915f1a8ca180828983ef22cf2fd21b8f010b972;p=openvswitch diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 93dd1cde..5efc8697 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -872,7 +872,7 @@ struct dp_netdev_flow_state { uint32_t bucket; uint32_t offset; struct nlattr *actions; - uint32_t keybuf[ODPUTIL_FLOW_KEY_U32S]; + struct odputil_keybuf keybuf; struct dpif_flow_stats stats; }; @@ -909,9 +909,8 @@ dpif_netdev_flow_dump_next(const struct dpif *dpif, void *state_, if (key) { struct ofpbuf buf; - ofpbuf_use_stack(&buf, state->keybuf, sizeof state->keybuf); + ofpbuf_use_stack(&buf, &state->keybuf, sizeof state->keybuf); odp_flow_key_from_flow(&buf, &flow->key); - assert(buf.base == state->keybuf); *key = buf.data; *key_len = buf.size; @@ -1137,36 +1136,6 @@ dp_netdev_wait(void) } -/* Modify the TCI field of 'packet'. If a VLAN tag is present, its TCI field - * is replaced by 'tci'. If a VLAN tag is not present, one is added with the - * TCI field set to 'tci'. - */ -static void -dp_netdev_set_dl_tci(struct ofpbuf *packet, uint16_t tci) -{ - struct vlan_eth_header *veh; - struct eth_header *eh; - - eh = packet->l2; - if (packet->size >= sizeof(struct vlan_eth_header) - && eh->eth_type == htons(ETH_TYPE_VLAN)) { - veh = packet->l2; - veh->veth_tci = tci; - } else { - /* Insert new 802.1Q header. */ - struct vlan_eth_header tmp; - memcpy(tmp.veth_dst, eh->eth_dst, ETH_ADDR_LEN); - memcpy(tmp.veth_src, eh->eth_src, ETH_ADDR_LEN); - tmp.veth_type = htons(ETH_TYPE_VLAN); - tmp.veth_tci = tci; - tmp.veth_next_type = eh->eth_type; - - veh = ofpbuf_push_uninit(packet, VLAN_HEADER_LEN); - memcpy(veh, &tmp, sizeof tmp); - packet->l2 = (char*)packet->l2 - VLAN_HEADER_LEN; - } -} - static void dp_netdev_strip_vlan(struct ofpbuf *packet) { @@ -1315,7 +1284,7 @@ dp_netdev_output_control(struct dp_netdev *dp, const struct ofpbuf *packet, upcall->key_len = key_len; upcall->userdata = arg; - q->upcalls[++q->head & QUEUE_MASK] = upcall; + q->upcalls[q->head++ & QUEUE_MASK] = upcall; return 0; } @@ -1369,7 +1338,7 @@ dp_netdev_execute_actions(struct dp_netdev *dp, break; case ODP_ACTION_ATTR_SET_DL_TCI: - dp_netdev_set_dl_tci(packet, nl_attr_get_be16(a)); + eth_set_vlan_tci(packet, nl_attr_get_be16(a)); break; case ODP_ACTION_ATTR_STRIP_VLAN: