|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright (c) 2007-2013 Nicira, Inc.
|
|
|
+ * Copyright (c) 2007-2014 Nicira, Inc.
|
|
|
*
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
* modify it under the terms of version 2 of the GNU General Public
|
|
@@ -276,7 +276,7 @@ void ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)
|
|
|
OVS_CB(skb)->flow = flow;
|
|
|
OVS_CB(skb)->pkt_key = &key;
|
|
|
|
|
|
- ovs_flow_stats_update(OVS_CB(skb)->flow, skb);
|
|
|
+ ovs_flow_stats_update(OVS_CB(skb)->flow, key.tp.flags, skb);
|
|
|
ovs_execute_actions(dp, skb);
|
|
|
stats_counter = &stats->n_hit;
|
|
|
|
|
@@ -889,8 +889,11 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct genl_info *info)
|
|
|
}
|
|
|
/* The unmasked key has to be the same for flow updates. */
|
|
|
if (unlikely(!ovs_flow_cmp_unmasked_key(flow, &match))) {
|
|
|
- error = -EEXIST;
|
|
|
- goto err_unlock_ovs;
|
|
|
+ flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
|
|
|
+ if (!flow) {
|
|
|
+ error = -ENOENT;
|
|
|
+ goto err_unlock_ovs;
|
|
|
+ }
|
|
|
}
|
|
|
/* Update actions. */
|
|
|
old_acts = ovsl_dereference(flow->sf_acts);
|
|
@@ -981,16 +984,12 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info)
|
|
|
goto err_unlock_ovs;
|
|
|
}
|
|
|
/* Check that the flow exists. */
|
|
|
- flow = ovs_flow_tbl_lookup(&dp->table, &key);
|
|
|
+ flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
|
|
|
if (unlikely(!flow)) {
|
|
|
error = -ENOENT;
|
|
|
goto err_unlock_ovs;
|
|
|
}
|
|
|
- /* The unmasked key has to be the same for flow updates. */
|
|
|
- if (unlikely(!ovs_flow_cmp_unmasked_key(flow, &match))) {
|
|
|
- error = -EEXIST;
|
|
|
- goto err_unlock_ovs;
|
|
|
- }
|
|
|
+
|
|
|
/* Update actions, if present. */
|
|
|
if (likely(acts)) {
|
|
|
old_acts = ovsl_dereference(flow->sf_acts);
|
|
@@ -1063,8 +1062,8 @@ static int ovs_flow_cmd_get(struct sk_buff *skb, struct genl_info *info)
|
|
|
goto unlock;
|
|
|
}
|
|
|
|
|
|
- flow = ovs_flow_tbl_lookup(&dp->table, &key);
|
|
|
- if (!flow || !ovs_flow_cmp_unmasked_key(flow, &match)) {
|
|
|
+ flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
|
|
|
+ if (!flow) {
|
|
|
err = -ENOENT;
|
|
|
goto unlock;
|
|
|
}
|
|
@@ -1113,8 +1112,8 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info)
|
|
|
goto unlock;
|
|
|
}
|
|
|
|
|
|
- flow = ovs_flow_tbl_lookup(&dp->table, &key);
|
|
|
- if (unlikely(!flow || !ovs_flow_cmp_unmasked_key(flow, &match))) {
|
|
|
+ flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
|
|
|
+ if (unlikely(!flow)) {
|
|
|
err = -ENOENT;
|
|
|
goto unlock;
|
|
|
}
|