On Tue, May 08, 2012 at 04:57:31PM -0700, Ethan Jackson wrote:
> Any particular reason we need to use a bitmask to store the slow path
> reason instead of a simple enum?  It seems to me that every slow path
> reason is mutually exclusive.  Would doing this simplify the code?  I
> suppose the one exception I see is that perhaps something could be
> both lacp and match, for example.  But in this case, just reporting it
> as lacp seems fine to me.  Of course, if the code is simpler as it is
> here, the current approach seems fine as well.

Most of the reasons are mostly mutually exclusive.  I've updated
comments to try to clear this up:

/* Reasons why a subfacet might not be fast-pathable. */
enum slow_path_reason {
    /* These reasons are mutually exclusive. */
    SLOW_CFM = 1 << 0,          /* CFM packets need per-packet processing. */
    SLOW_LACP = 1 << 1,         /* LACP packets need per-packet processing. */
    SLOW_STP = 1 << 2,          /* STP packets need per-packet processing. */
    SLOW_IN_BAND = 1 << 3,      /* In-band control needs every packet. */

    /* Mutually exclusive with SLOW_CFM, SLOW_LACP, SLOW_STP.
     * Could possibly appear with SLOW_IN_BAND. */
    SLOW_CONTROLLER = 1 << 4,   /* Packets must go to OpenFlow controller. */

    /* This can appear on its own, or, theoretically at least, along with any
     * other combination of reasons. */
    SLOW_MATCH = 1 << 5,        /* Datapath can't match specifically enough. */
};

The main reason that I used a bitmap is that most of the code only
wants to know "does this need to go in the slowpath?" and for that
it's more convenient to have a single piece of data that one can test
with a single condition, e.g. "if (subfacet->slow)", rather than
needing two conditions, e.g. "if (subfacet->special ||
subfacet->key_fitness == ODP_FIT_TOO_LITTLE)".  I tried something like
the latter out first, and even with a helper function I didn't like it
as much.

> > +                for (bit = 1; ; bit <<= 1) {
> 
> Here I think we want "for (bit = 1; bit; bit <<= 1) {"

Oops.  I guess this needs a test.  Coming up.

> > +            /* The actions for slow-path flows may legitimately vary from 
> > one
> > +             * packet to the next.  We're done. */
> 
> Is this true?  Seems to me that it's either something like a
> lacp/stp/cfm packet in which case the actions are simply "userspace",
> or its a slow_match in which case the actions are dictated by the
> openflow table and very on a per flow not per-packet basis.  I may be
> missing something though.

VLAN splinters are the case I had in mind.
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to