From: Jarno Rajahalme Date: Thu, 14 Nov 2013 22:35:58 +0000 (-0800) Subject: dpif_netdev_execute: Extract flow key from the packet. X-Git-Tag: sliver-openvswitch-2.0.90-1~5^2~24 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=24b7e19469dbd2cb3fdf8db70ef0c7b4bc851f17 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 Acked-by: Ben Pfaff --- diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 3007d9ffd..daa78838a 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -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; }