secchan: When we flush the flow table, add the in-band control rules back in.
authorBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 20:52:03 +0000 (13:52 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 20:52:03 +0000 (13:52 -0700)
ofproto_flush_flows() deletes all the flows from the flow table, even the
ones added by in-band control.  If that happens we need to add them back
in.

This should be the only place that the in-band control rules can get
deleted, since their priorities are such that the controller cannot see
or modify them.

secchan/in-band.c
secchan/in-band.h
secchan/ofproto.c

index b6b51d33fce93289f8a3ab561ab26911891b97c8..2315c44b977f7d1e8c2de0613439a2b368c840a1 100644 (file)
@@ -317,6 +317,16 @@ in_band_wait(struct in_band *in_band)
     }
 }
 
+void
+in_band_flushed(struct in_band *in_band)
+{
+    int i;
+
+    for (i = 0; i < N_IB_RULES; i++) {
+        in_band->rules[i].installed = false;
+    }
+}
+
 int
 in_band_create(struct ofproto *ofproto,
                struct dpif *dpif, struct switch_status *ss,
index 979580c7dd960e21fbb8c41074d7aed165601918..a89dbd3a1006a682362eb1656669684959778bf1 100644 (file)
@@ -49,5 +49,6 @@ int in_band_create(struct ofproto *, struct dpif *, struct switch_status *,
 void in_band_destroy(struct in_band *);
 void in_band_run(struct in_band *);
 void in_band_wait(struct in_band *);
+void in_band_flushed(struct in_band *);
 
 #endif /* in-band.h */
index 3d69479b6658bceecd7f5c0ab2fc40675f59bd97..e2c69d5d0587da4cabb2d56b0f0806253be1bd51 100644 (file)
@@ -1024,6 +1024,9 @@ ofproto_flush_flows(struct ofproto *ofproto)
 {
     classifier_for_each(&ofproto->cls, CLS_INC_ALL, destroy_rule, ofproto);
     dpif_flow_flush(&ofproto->dpif);
+    if (ofproto->in_band) {
+        in_band_flushed(ofproto->in_band);
+    }
 }
 \f
 static void