Add support for OFPFC_MODIFY Flow Mod command.
[openvswitch] / switch / table-linear.c
index b1143c7ad886123b477e45fd3733295f62243938..474d5ee3cbd078769b6bb945db1a30cdb59fd593 100644 (file)
@@ -74,6 +74,12 @@ 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->used = f->used;
+            flow->created = f->created;
+            flow->packet_count = f->packet_count;
+            flow->byte_count = f->byte_count;
+
             flow->serial = f->serial;
             list_replace(&flow->node, &f->node);
             list_replace(&flow->iter_node, &f->iter_node);
@@ -99,6 +105,23 @@ static int table_linear_insert(struct sw_table *swt, struct sw_flow *flow)
     return 1;
 }
 
+static int table_linear_modify(struct sw_table *swt,
+                const struct sw_flow_key *key,
+                const struct ofp_action *actions, int n_actions)
+{
+    struct sw_table_linear *tl = (struct sw_table_linear *) swt;
+    struct sw_flow *flow;
+    unsigned int count = 0;
+
+    LIST_FOR_EACH (flow, struct sw_flow, node, &tl->flows) {
+        if (flow_matches_1wild(&flow->key, key)) {
+            flow_replace_acts(flow, actions, n_actions);
+            count++;
+        }
+    }
+    return count;
+}
+
 static void
 do_delete(struct sw_flow *flow) 
 {
@@ -201,6 +224,7 @@ struct sw_table *table_linear_create(unsigned int max_flows)
     swt = &tl->swt;
     swt->lookup = table_linear_lookup;
     swt->insert = table_linear_insert;
+    swt->modify = table_linear_modify;
     swt->delete = table_linear_delete;
     swt->timeout = table_linear_timeout;
     swt->destroy = table_linear_destroy;