On Fri, Mar 13, 2015 at 04:52:00PM -0700, Jarno Rajahalme wrote:
> xlate_actions() now considers an optional recirculation context (via
> 'xin') and restores OpenFlow pipeline metadata (registers, 'metadata',
> etc.) based on it.  The recirculation context may contain an action
> set and stack to be restored and further actions to be executed upon
> recirculation.  It also contains a table_id number to be used for rule
> lookup in cases where no post-recirculation actions are used.
> 
> The translation context internal metadata is restored using a new
> internal action: UNROLL_XLATE action stores the translation context
> data visible to OpenFlow controllers via PACKET_IN messages.  This
> includes the current table number and the current rule cookie.
> UNROLL_XLATE actions are inserted only when the remaining actions may
> generate PACKET_IN messages.
> 
> These changes allow the post-MPLS recirculation to properly continue
> with the pipeline metadata that existed at the time of recirculation.
> 
> The internal table is still consulted for bonds.
> 
> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>

I'm a little concerned about ukey_create_from_dpif_flow(), which seems
to get called whenever the datapath does not support ufids.  It seems
to reject recirculation actions in that case.  Does that mean that
userspace becomes incompatible (if any recirculation is attempted)
with older datapaths?  I think that is what happens, but I don't think
that is the intent.

Here in upcall_cb(), I think I understand the idea--that when we can't
look up the recirculation ID, it's a problematic situation, so we
shouldn't install its flow--but I'm not sure how that helps with
anything.  Doesn't that just mean that the problematic situation
recurs slowly in userspace (sending lots of upcalls) instead of
quickly in the datapath?

+    /* Prevent miss flow installation if the key has recirculation ID but we
+     * were not able to get a reference on it. */
+    if (type == DPIF_UC_MISS && upcall.recirc && !upcall.have_recirc_ref) {
         error = ENOSPC;
+        goto out;
     }

In recirc_free_id, s/non-exiting/nonexistent/ in the log message.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to