secchan: Reinstall flows deleted externally.
authorBen Pfaff <blp@nicira.com>
Mon, 4 May 2009 23:14:35 +0000 (16:14 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 4 May 2009 23:14:35 +0000 (16:14 -0700)
If something external to secchan deletes flows from the datapath (e.g.
the administrator runs "dpctl dp-del-flows") then until now secchan would
switch all of those packets manually, using dpif_execute().  Better
behavior is to reinstall the flow.  This commit implements that.

secchan/ofproto.c

index c5b443e8b0fd79e5206fb3e22fceb3904e6ded29..7faa0d8c8bda51b53a8ef821de6853ee9885395a 100644 (file)
@@ -1581,6 +1581,17 @@ rule_install(struct ofproto *p, struct rule *rule, struct rule *displaced_rule)
     }
 }
 
+static void
+rule_reinstall(struct ofproto *ofproto, struct rule *rule)
+{
+    if (rule->installed) {
+        struct odp_flow_put put;
+        do_put_flow(ofproto, rule, ODPPF_CREATE | ODPPF_MODIFY, &put);
+    } else {
+        rule_install(ofproto, rule, NULL);
+    }
+}
+
 static void
 rule_update_actions(struct ofproto *ofproto, struct rule *rule)
 {
@@ -2928,16 +2939,8 @@ handle_odp_msg(struct ofproto *p, struct ofpbuf *packet)
         }
     }
 
-    /* Invariant: 'rule' is an exact-match rule. */
-
-    /* XXX should forcibly install the rule here, since it's possible that it
-     * got deleted externally (e.g. "dpctl dp-del-flows") and unless we
-     * re-install it here we'll end up processing every packet by hand.  But
-     * the datapath doesn't provide a good interface for that. */
-    rule_install(p, rule, NULL);
-
-    /* Execute rule on packet. */
     rule_execute(p, rule, &payload, &flow);
+    rule_reinstall(p, rule);
     ofpbuf_delete(packet);
 }
 \f