RE: Re: sFlow and OpenFlow

From: Peter Phaal <peter.phaal@inmon.com>
Date: 10/14/09
Message-ID: <BC8441E8135D47DAA0814264F35AA21B@PHAALPC>

> > The following structure would add the needed support to sFlow:
> >
> > /* Extended OpenFlow data */
> > /* opaque = flow_data; enterprise = 0; format = 1017 */
> >
> > struct extended_openflow {
> > opaque flow_cookie[8];
> > }
>
> It seems likely that OpenFlow will add the flow cookie as an
> unsigned 64-bit integer. Perhaps sFlow should use the same type,
> if so.

I agree, we should match the semantics of the OpenFlow cookie.

If it is 64 bit integer, then the following XDR encoding is a better match,
enduring the platform byte ordering will not affect the transport and
interpretation of the cookie.

unsigned hyper flow_cookie;

> OpenFlow has an existing type that it uses to encode the
> wildcards for a flow. It would be convenient for OpenFlow
> implementors of sFlow if sFlow specified the same encoding:
>
> /* Flow wildcards. */
> enum ofp_flow_wildcards {
> OFPFW_IN_PORT = 1 << 0, /* Switch input port. */
> OFPFW_DL_VLAN = 1 << 1, /* VLAN. */
> OFPFW_DL_SRC = 1 << 2, /* Ethernet source address. */
> OFPFW_DL_DST = 1 << 3, /* Ethernet destination address. */
> OFPFW_DL_TYPE = 1 << 4, /* Ethernet frame type. */
> OFPFW_NW_PROTO = 1 << 5, /* IP protocol. */
> OFPFW_TP_SRC = 1 << 6, /* TCP/UDP source port. */
> OFPFW_TP_DST = 1 << 7, /* TCP/UDP destination port. */
>
> /* IP source address wildcard bit count. 0 is exact match, 1 ignores
> the
> * LSB, 2 ignores the 2 least-significant bits, ..., 32 and higher
> wildcard
> * the entire field. This is the *opposite* of the usual convention
> where
> * e.g. /24 indicates that 8 bits (not 24 bits) are wildcarded. */
> OFPFW_NW_SRC_SHIFT = 8,
> OFPFW_NW_SRC_BITS = 6,
> OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) <<
> OFPFW_NW_SRC_SHIFT,
> OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT,
>
> /* IP destination address wildcard bit count. Same format as source.
> */
> OFPFW_NW_DST_SHIFT = 14,
> OFPFW_NW_DST_BITS = 6,
> OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) <<
> OFPFW_NW_DST_SHIFT,
> OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT,
>
> /* Wildcard all fields. */
> OFPFW_ALL = ((1 << 20) - 1)
> };
>
> > An OpenFlow switch may also rewrite packet fields (e.g. changing the
> VLAN,
> > MAC address, IP address) if it is performing functions like NAT,
> tunneling
> > etc. Again, a bit array could be used to identify the fields that are
> being
> > rewritten. The value of rewritten fields should be reported using
> existing
> > sflow structures (extended_switch, extended_nat etc.)
>
> I agree that it would be a good idea to provide this information
> in fields already included in sFlow.

Here is a new definition for the Extended OpenFlow structure that better
addresses your points:

/* Extended OpenFlow data */
/* opaque = flow_data; enterprise = 0; format = 1017 */
/* Data structure for exporting OpenFlow forwarding state
   See http://www.openflowswitch.org/ for field definitions */

/* A bit array describing the fields in the packet header
   that are used to form the flow key. See ofp_match for
   the definition of wildcards. */

typedef unsigned int wildcards;

/* A bit array describing fields that may have been altered
   by the flow action. The ofp_action_type enum is used to
   determine the bit positions, with OFPAT_OUTPUT assigned
   to the least significant bit. The bit is set if an action
   of the corresponding type has been specified.
   Note: OFPAT_VENDOR is encoded using the most significant bit */

typedef unsigned int actions;

struct extended_openflow {
  unsigned hyper flow_cookie;
  wildcards flow_match;
  actions flow_actions;
}
Received on Wed Oct 14 11:37:56 2009

This archive was generated by hypermail 2.1.8 : 02/17/10 PST