Reset mac header in flow_extract(), because it might initially be null.
[sliver-openvswitch.git] / datapath / table-linear.c
index 4a10df5..2a0752a 100644 (file)
@@ -48,11 +48,6 @@ static int table_linear_insert(struct sw_table *swt, struct sw_flow *flow)
                if (f->priority == flow->priority
                                && f->key.wildcards == flow->key.wildcards
                                && flow_matches_2wild(&f->key, &flow->key)) {
-                       /* Keep stats from the original flow */
-                       flow->init_time = f->init_time;
-                       flow->packet_count = f->packet_count;
-                       flow->byte_count = f->byte_count;
-
                        flow->serial = f->serial;
                        list_replace_rcu(&f->node, &flow->node);
                        list_replace_rcu(&f->iter_node, &flow->iter_node);
@@ -78,16 +73,17 @@ static int table_linear_insert(struct sw_table *swt, struct sw_flow *flow)
 }
 
 static int table_linear_modify(struct sw_table *swt,
-                               const struct sw_flow_key *key,
-                               const struct ofp_action *actions, int n_actions)
+                               const struct sw_flow_key *key, uint16_t priority, int strict,
+                               const struct ofp_action_header *actions, size_t actions_len)
 {
        struct sw_table_linear *tl = (struct sw_table_linear *) swt;
        struct sw_flow *flow;
        unsigned int count = 0;
 
        list_for_each_entry (flow, &tl->flows, node) {
-               if (flow_matches_1wild(&flow->key, key)) {
-                       flow_replace_acts(flow, actions, n_actions);
+               if (flow_matches_desc(&flow->key, key, strict)
+                               && (!strict || (flow->priority == priority))) {
+                       flow_replace_acts(flow, actions, actions_len);
                        count++;
                }
        }
@@ -110,7 +106,7 @@ static int table_linear_delete(struct sw_table *swt,
        unsigned int count = 0;
 
        list_for_each_entry (flow, &tl->flows, node) {
-               if (flow_del_matches(&flow->key, key, strict)
+               if (flow_matches_desc(&flow->key, key, strict)
                                && (!strict || (flow->priority == priority)))
                        count += do_delete(swt, flow);
        }
@@ -182,6 +178,7 @@ static void table_linear_stats(struct sw_table *swt,
        stats->wildcards = OFPFW_ALL;
        stats->n_flows   = tl->n_flows;
        stats->max_flows = tl->max_flows;
+       stats->n_lookup  = swt->n_lookup;
        stats->n_matched = swt->n_matched;
 }