On Wed, Apr 29, 2015 at 11:49:09PM -0700, Ben Pfaff wrote:
> This last piece allows us to start testing and debugging a complete OVN
> installation.  It is so far tested only in the sandbox, where the flows
> created seem plausible at first glance.
> 
> Signed-off-by: Ben Pfaff <b...@nicira.com>

Here's an incremental diff that makes this work.  Most of the changes
are comment improvements; it would be smaller without those.  With
this and the two changes to your patch 6/6 that I pointed out in a
separate thread, the system works for me in my simple VM test setup.

diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c
index b68ff91..55422d3 100644
--- a/ovn/controller/physical.c
+++ b/ovn/controller/physical.c
@@ -88,26 +88,15 @@ physical_run(struct controller_ctx *ctx)
     struct ofpbuf ofpacts;
     ofpbuf_init(&ofpacts, 0);
 
-    /* Set up flows:
-     *
-     * Table 0
-     * =======
-     *
-     * Priority 100, for packets that arrive from a vif: annotate with their
-     * logical input port and resubmitted into the logical pipeline.
-     *
-     * Priority 50, for packets that arrive from a remote node: deliver
-     * directly to the vif.
-     *
-     * Table 64
-     * ========
-     *
-     * Priority 100, to drop packets whose logical inport and outport are the
-     * same.
-     *
-     * Priority 50, to send packets to their destinations. */
+    /* Set up flows in table 0 for physical-to-logical translation and in table
+     * 64 for logical-to-physical translation. */
     const struct sbrec_bindings *binding;
     SBREC_BINDINGS_FOR_EACH (binding, ctx->ovnsb_idl) {
+        /* Find the Openflow port for the logical port, as 'ofport'.  If it's
+         * on a remote chassis, this is the OpenFlow port for the tunnel to
+         * that chassis (and set 'local' to false).  Otherwise, if it's on the
+         * chassis we're managing, this is the OpenFlow port for the vif itself
+         * (and set 'local' to true). */
         ofp_port_t ofport = u16_to_ofp(simap_get(&lport_to_ofport,
                                                  binding->logical_port));
         bool local = ofport != 0;
@@ -119,20 +108,23 @@ physical_run(struct controller_ctx *ctx)
             }
         }
 
+        /* Translate the logical datapath into the form we use in
+         * MFF_METADATA. */
         uint32_t ldp = ldp_to_integer(&binding->logical_datapath);
         if (!ldp) {
             continue;
         }
 
         struct match match;
-        match_init_catchall(&match);
-        ofpbuf_clear(&ofpacts);
-        if (!local) {
-            /* Output directly to vif. */
-            match_set_tun_id(&match, htonll(binding->tunnel_key));
-            ofpact_put_OUTPUT(&ofpacts)->port = ofport;
-            ofctrl_add_flow(0, 50, &match, &ofpacts);
-        } else {
+        if (local) {
+            /* Table 0, Priority 100.
+             * ======================
+             *
+             * For packets that arrive from a vif: set MFF_LOG_INPORT to the
+             * logical input port, MFF_METADATA to the logical datapath, and
+             * resubmit into the logical pipeline starting at table 16. */
+            match_init_catchall(&match);
+            ofpbuf_clear(&ofpacts);
             match_set_in_port(&match, ofport);
 
             /* Set MFF_METADATA. */
@@ -151,18 +143,37 @@ physical_run(struct controller_ctx *ctx)
             struct ofpact_resubmit *resubmit = ofpact_put_RESUBMIT(&ofpacts);
             resubmit->in_port = OFPP_IN_PORT;
             resubmit->table_id = 16;
-
             ofctrl_add_flow(0, 100, &match, &ofpacts);
+
+            /* Table 0, Priority 50.
+             * =====================
+             *
+             * For packets that arrive from a remote node destined to this
+             * local vif: deliver directly to the vif. */
+            match_init_catchall(&match);
+            ofpbuf_clear(&ofpacts);
+            match_set_tun_id(&match, htonll(binding->tunnel_key));
+            ofpact_put_OUTPUT(&ofpacts)->port = ofport;
+            ofctrl_add_flow(0, 50, &match, &ofpacts);
         }
 
-        /* Table 64, priority 100. */
+        /* Table 64, Priority 100.
+         * =======================
+         *
+         * Drop packets whose logical inport and outport are the same. */
         match_init_catchall(&match);
         ofpbuf_clear(&ofpacts);
         match_set_reg(&match, MFF_LOG_INPORT - MFF_REG0, binding->tunnel_key);
         match_set_reg(&match, MFF_LOG_OUTPORT - MFF_REG0, binding->tunnel_key);
         ofctrl_add_flow(64, 100, &match, &ofpacts);
 
-        /* Table 64, priority 50. */
+        /* Table 64, Priority 50.
+         * ======================
+         *
+         * For packets to remote machines, send them over a tunnel to the
+         * remote chassis.
+         *
+         * For packest to local vifs, deliver them directly. */
         match_init_catchall(&match);
         ofpbuf_clear(&ofpacts);
         match_set_reg(&match, MFF_LOG_OUTPORT - MFF_REG0, binding->tunnel_key);
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to