Re: sFlow and OpenFlow

From: Ben Pfaff <blp@nicira.com>
Date: 10/14/09
Message-ID: <87y6nd99x3.fsf@blp.benpfaff.org>

"Peter Phaal" <peter.phaal@inmon.com> writes:

> 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.

> One possible addition is a bit array identifying the header fields that are
> being used to make the forwarding decision. OpenFlow currently forwards
> based on combinations of the following fields:
> 1. ingress port
> 2. VLAN
> 3. Priority
> 4. L2 source
> 5. L2 destination
> 6. L2 type
> 7. L3 source
> 8. L3 destination
> 9. L3 protocol
> 10. L4 source port
> 11. L4 destination port
> An unsigned int value would encode the 11 bits and leave room for future
> expansion. The bits would identify fields that were matched (1) or were
> wildcards (0).

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.
Received on Wed Oct 14 10:12:34 2009

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