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:
@@ -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(©, DP_NETDEV_HEADROOM + execute->packet->size);
|
||||
ofpbuf_reserve(©, DP_NETDEV_HEADROOM);
|
||||
ofpbuf_put(©, execute->packet->data, execute->packet->size);
|
||||
|
||||
flow_extract(©, 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, ©, &key,
|
||||
dp_netdev_execute_actions(dp, copy, &key,
|
||||
execute->actions, execute->actions_len);
|
||||
ovs_mutex_unlock(&dp_netdev_mutex);
|
||||
ofpbuf_delete(copy);
|
||||
}
|
||||
|
||||
ofpbuf_uninit(©);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user