2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

dpif_netdev_execute: Extract flow key from the packet.

Extract the flow key from the packet instead of the execute->key.
This reflects how the kernel datapath behaves.

Also use ofpbuf_clone_with_headroom() instead of open coding the same.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Jarno Rajahalme
2013-11-14 14:35:58 -08:00
parent f5e414cfb1
commit 24b7e19469

View File

@@ -1107,8 +1107,7 @@ static int
dpif_netdev_execute(struct dpif *dpif, const struct dpif_execute *execute)
{
struct dp_netdev *dp = get_dp_netdev(dpif);
struct ofpbuf copy;
struct flow key;
struct flow md;
int error;
if (execute->packet->size < ETH_HEADER_LEN ||
@@ -1116,22 +1115,24 @@ dpif_netdev_execute(struct dpif *dpif, const struct dpif_execute *execute)
return EINVAL;
}
/* Make a deep copy of 'packet', because we might modify its data. */
ofpbuf_init(&copy, DP_NETDEV_HEADROOM + execute->packet->size);
ofpbuf_reserve(&copy, DP_NETDEV_HEADROOM);
ofpbuf_put(&copy, execute->packet->data, execute->packet->size);
flow_extract(&copy, 0, 0, NULL, NULL, &key);
error = dpif_netdev_flow_from_nlattrs(execute->key, execute->key_len,
&key);
/* Get packet metadata. */
error = dpif_netdev_flow_from_nlattrs(execute->key, execute->key_len, &md);
if (!error) {
struct ofpbuf *copy;
struct flow key;
/* Make a deep copy of 'packet', because we might modify its data. */
copy = ofpbuf_clone_with_headroom(execute->packet, DP_NETDEV_HEADROOM);
/* Extract flow key. */
flow_extract(copy, md.skb_priority, md.pkt_mark, &md.tunnel,
&md.in_port, &key);
ovs_mutex_lock(&dp_netdev_mutex);
dp_netdev_execute_actions(dp, &copy, &key,
dp_netdev_execute_actions(dp, copy, &key,
execute->actions, execute->actions_len);
ovs_mutex_unlock(&dp_netdev_mutex);
ofpbuf_delete(copy);
}
ofpbuf_uninit(&copy);
return error;
}