summaryrefslogtreecommitdiff
path: root/datapath
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2011-09-08 15:32:24 -0700
committerJesse Gross <jesse@nicira.com>2011-09-08 16:07:36 -0700
commit0fe255dfbf37fa7ddc23c2593c512c092b0f61d7 (patch)
tree87009c2d5c39bff772a6a00789e2ca53b9dba84a /datapath
parentff8d7a5e81625bbb13d33ca73888fc848b02db83 (diff)
downloadopenvswitch-0fe255dfbf37fa7ddc23c2593c512c092b0f61d7.tar.gz
datapath: Calculate flow hash after extracting metadata.
When we execute a packet from userspace we first extract the header fields from the packet and then add supplied metadata. However, we compute the hash of the packet in between these two steps despite the fact that the metadata can affect the hash. This can lead to two separate hashes for packets of the same flow. Found by code inspection, not an actual real-world problem. Signed-off-by: Jesse Gross <jesse@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath')
-rw-r--r--datapath/datapath.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/datapath/datapath.c b/datapath/datapath.c
index 749908185..b92c198d7 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -686,7 +686,6 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
err = flow_extract(packet, -1, &flow->key, &key_len, &is_frag);
if (err)
goto err_flow_put;
- flow->tbl_node.hash = flow_hash(&flow->key, key_len);
err = flow_metadata_from_nlattrs(&flow->key.eth.in_port,
&flow->key.eth.tun_id,
@@ -694,6 +693,8 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
if (err)
goto err_flow_put;
+ flow->tbl_node.hash = flow_hash(&flow->key, key_len);
+
acts = flow_actions_alloc(a[OVS_PACKET_ATTR_ACTIONS]);
err = PTR_ERR(acts);
if (IS_ERR(acts))