I take that back, just now noticed your response to patch 2/2.

  Jarno

> On Feb 24, 2016, at 2:44 PM, Jarno Rajahalme <ja...@ovn.org> wrote:
> 
> Ping.
> 
>> On Feb 18, 2016, at 10:46 AM, Jarno Rajahalme <ja...@ovn.org> wrote:
>> 
>> I was able to implement the Extension 230 on top of these, so looking good 
>> :-)
>> 
>> Acked-by: Jarno Rajahalme <ja...@ovn.org>
>> 
>>> On Jan 27, 2016, at 3:50 PM, Ben Pfaff <b...@ovn.org> wrote:
>>> 
>>> ONF introduced a number of "standard extensions" that use its own
>>> vendor (experimenter) ID.  This commit adds support for such extensions to
>>> ofp-msgs.
>>> 
>>> These extensions were already half-supported, so there's barely any change
>>> to build-aux/extract-ofp-msgs.
>>> 
>>> This isn't fully tested, since nothing adds support for such a message yet.
>>> 
>>> Requested-by: Jarno Rajahalme <ja...@ovn.org>
>>> Signed-off-by: Ben Pfaff <b...@ovn.org>
>>> ---
>>> build-aux/extract-ofp-msgs         |  2 +-
>>> include/openflow/nicira-ext.h      | 16 --------
>>> include/openflow/openflow-1.1.h    | 11 ------
>>> include/openflow/openflow-common.h | 11 ------
>>> lib/ofp-msgs.c                     | 75 
>>> ++++++++++++++++++++++----------------
>>> lib/ofp-msgs.h                     | 17 ++++++---
>>> 6 files changed, 56 insertions(+), 76 deletions(-)
>>> 
>>> diff --git a/build-aux/extract-ofp-msgs b/build-aux/extract-ofp-msgs
>>> index b00039d..d3c4d4c 100755
>>> --- a/build-aux/extract-ofp-msgs
>>> +++ b/build-aux/extract-ofp-msgs
>>> @@ -161,7 +161,7 @@ def extract_ofp_msgs(output_file_name):
>>>                   hdrs = (version, OFPT10_STATS_REPLY, number, 0, 0)
>>>               else:
>>>                   hdrs = (version, OFPT11_STATS_REPLY, number, 0, 0)
>>> -            elif type_ == 'ONF':
>>> +            elif type_ == 'ONFT':
>>>               hdrs = (version, OFPT_VENDOR, 0, ONF_VENDOR_ID, number)
>>>           elif type_ == 'ONFST' and name.endswith('_REQUEST'):
>>>               if version == VERSION["1.0"]:
>>> diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h
>>> index dad8707..fdee330 100644
>>> --- a/include/openflow/nicira-ext.h
>>> +++ b/include/openflow/nicira-ext.h
>>> @@ -68,14 +68,6 @@ struct nx_vendor_error {
>>> 
>>> /* Nicira vendor requests and replies. */
>>> 
>>> -/* Header for Nicira vendor requests and replies. */
>>> -struct nicira_header {
>>> -    struct ofp_header header;
>>> -    ovs_be32 vendor;            /* NX_VENDOR_ID. */
>>> -    ovs_be32 subtype;           /* See the NXT numbers in ofp-msgs.h. */
>>> -};
>>> -OFP_ASSERT(sizeof(struct nicira_header) == 16);
>>> -
>>> /* Header for Nicira vendor stats request and reply messages in OpenFlow
>>> * 1.0. */
>>> struct nicira10_stats_msg {
>>> @@ -85,14 +77,6 @@ struct nicira10_stats_msg {
>>> };
>>> OFP_ASSERT(sizeof(struct nicira10_stats_msg) == 24);
>>> 
>>> -/* Header for Nicira vendor stats request and reply messages in OpenFlow
>>> - * 1.1. */
>>> -struct nicira11_stats_msg {
>>> -    struct ofp11_vendor_stats_msg vsm; /* Vendor NX_VENDOR_ID. */
>>> -    ovs_be32 subtype;           /* One of NXST_* below. */
>>> -};
>>> -OFP_ASSERT(sizeof(struct nicira11_stats_msg) == 24);
>>> -
>>> /* Fields to use when hashing flows. */
>>> enum nx_hash_fields {
>>>   /* Ethernet source address (NXM_OF_ETH_SRC) only. */
>>> diff --git a/include/openflow/openflow-1.1.h 
>>> b/include/openflow/openflow-1.1.h
>>> index 361150a..63d8b41 100644
>>> --- a/include/openflow/openflow-1.1.h
>>> +++ b/include/openflow/openflow-1.1.h
>>> @@ -391,17 +391,6 @@ struct ofp11_stats_msg {
>>> };
>>> OFP_ASSERT(sizeof(struct ofp11_stats_msg) == 16);
>>> 
>>> -/* Vendor extension stats message. */
>>> -struct ofp11_vendor_stats_msg {
>>> -    struct ofp11_stats_msg osm; /* Type OFPST_VENDOR. */
>>> -    ovs_be32 vendor;            /* Vendor ID:
>>> -                                 * - MSB 0: low-order bytes are IEEE OUI.
>>> -                                 * - MSB != 0: defined by OpenFlow
>>> -                                 *   consortium. */
>>> -    /* Followed by vendor-defined arbitrary additional data. */
>>> -};
>>> -OFP_ASSERT(sizeof(struct ofp11_vendor_stats_msg) == 20);
>>> -
>>> /* Stats request of type OFPST_FLOW. */
>>> struct ofp11_flow_stats_request {
>>>   uint8_t table_id;         /* ID of table to read (from ofp_table_stats),
>>> diff --git a/include/openflow/openflow-common.h 
>>> b/include/openflow/openflow-common.h
>>> index da2b7a5..39c0e66 100644
>>> --- a/include/openflow/openflow-common.h
>>> +++ b/include/openflow/openflow-common.h
>>> @@ -422,17 +422,6 @@ struct ofp_hello_elem_header {
>>> };
>>> OFP_ASSERT(sizeof(struct ofp_hello_elem_header) == 4);
>>> 
>>> -/* Vendor extension. */
>>> -struct ofp_vendor_header {
>>> -    struct ofp_header header;   /* Type OFPT_VENDOR or OFPT_EXPERIMENTER. 
>>> */
>>> -    ovs_be32 vendor;            /* Vendor ID:
>>> -                                 * - MSB 0: low-order bytes are IEEE OUI.
>>> -                                 * - MSB != 0: defined by OpenFlow
>>> -                                 *   consortium. */
>>> -    /* Vendor-defined arbitrary additional data. */
>>> -};
>>> -OFP_ASSERT(sizeof(struct ofp_vendor_header) == 12);
>>> -
>>> /* Table numbering. Tables can use any number up to OFPT_MAX. */
>>> enum ofp_table {
>>>   /* Last usable table number. */
>>> diff --git a/lib/ofp-msgs.c b/lib/ofp-msgs.c
>>> index 944ab33..fcfbb50 100644
>>> --- a/lib/ofp-msgs.c
>>> +++ b/lib/ofp-msgs.c
>>> @@ -35,6 +35,39 @@ VLOG_DEFINE_THIS_MODULE(ofp_msgs);
>>> #define OFPT11_STATS_REPLY 19
>>> #define OFPST_VENDOR 0xffff
>>> 
>>> +/* Vendor extension message. */
>>> +struct ofp_vendor_header {
>>> +    struct ofp_header header;   /* OFPT_VENDOR. */
>>> +    ovs_be32 vendor;            /* Vendor ID:
>>> +                                 * - MSB 0: low-order bytes are IEEE OUI.
>>> +                                 * - MSB != 0: defined by OpenFlow
>>> +                                 *   consortium. */
>>> +
>>> +    /* In theory everything after 'vendor' is vendor specific.  In 
>>> practice,
>>> +     * the vendors we support put a 32-bit subtype here.  We'll change this
>>> +     * structure if we start adding support for other vendor formats. */
>>> +    ovs_be32 subtype;           /* Vendor-specific subtype. */
>>> +
>>> +    /* Followed by vendor-defined additional data. */
>>> +};
>>> +OFP_ASSERT(sizeof(struct ofp_vendor_header) == 16);
>>> +
>>> +/* Vendor extension stats message. */
>>> +struct ofp11_vendor_stats_msg {
>>> +    struct ofp11_stats_msg osm; /* Type OFPST_VENDOR. */
>>> +    ovs_be32 vendor;            /* Vendor ID:
>>> +                                 * - MSB 0: low-order bytes are IEEE OUI.
>>> +                                 * - MSB != 0: defined by OpenFlow
>>> +                                 *   consortium. */
>>> +
>>> +    /* In theory everything after 'vendor' is vendor specific.  In 
>>> practice,
>>> +     * the vendors we support put a 32-bit subtype here.  We'll change this
>>> +     * structure if we start adding support for other vendor formats. */
>>> +    ovs_be32 subtype;           /* Vendor-specific subtype. */
>>> +
>>> +    /* Followed by vendor-defined additional data. */
>>> +};
>>> +OFP_ASSERT(sizeof(struct ofp11_vendor_stats_msg) == 24);
>>> /* A thin abstraction of OpenFlow headers:
>>> *
>>> *   - 'version' and 'type' come straight from struct ofp_header, so these 
>>> are
>>> @@ -159,15 +192,8 @@ ofphdrs_decode(struct ofphdrs *hdrs,
>>> 
>>>       ovh = (const struct ofp_vendor_header *) oh;
>>>       hdrs->vendor = ntohl(ovh->vendor);
>>> -        if (hdrs->vendor == NX_VENDOR_ID) {
>>> -            /* Get Nicira message subtype (NXT_*). */
>>> -            const struct nicira_header *nh;
>>> -
>>> -            if (length < sizeof *nh) {
>>> -                return OFPERR_OFPBRC_BAD_LEN;
>>> -            }
>>> -            nh = (const struct nicira_header *) oh;
>>> -            hdrs->subtype = ntohl(nh->subtype);
>>> +        if (hdrs->vendor == NX_VENDOR_ID || hdrs->vendor == ONF_VENDOR_ID) 
>>> {
>>> +            hdrs->subtype = ntohl(ovh->subtype);
>>>       } else {
>>>           log_bad_vendor(hdrs->vendor);
>>>           return OFPERR_OFPBRC_BAD_VENDOR;
>>> @@ -230,15 +256,9 @@ ofphdrs_decode(struct ofphdrs *hdrs,
>>> 
>>>           ovsm = (const struct ofp11_vendor_stats_msg *) oh;
>>>           hdrs->vendor = ntohl(ovsm->vendor);
>>> -            if (hdrs->vendor == NX_VENDOR_ID) {
>>> -                /* Get Nicira statistic type (NXST_*). */
>>> -                const struct nicira11_stats_msg *nsm;
>>> -
>>> -                if (length < sizeof *nsm) {
>>> -                    return OFPERR_OFPBRC_BAD_LEN;
>>> -                }
>>> -                nsm = (const struct nicira11_stats_msg *) oh;
>>> -                hdrs->subtype = ntohl(nsm->subtype);
>>> +            if (hdrs->vendor == NX_VENDOR_ID ||
>>> +                hdrs->vendor == ONF_VENDOR_ID) {
>>> +                hdrs->subtype = ntohl(ovsm->subtype);
>>>           } else {
>>>               log_bad_vendor(hdrs->vendor);
>>>               return OFPERR_OFPBRC_BAD_VENDOR;
>>> @@ -308,7 +328,7 @@ size_t
>>> ofphdrs_len(const struct ofphdrs *hdrs)
>>> {
>>>   if (hdrs->type == OFPT_VENDOR) {
>>> -        return sizeof(struct nicira_header);
>>> +        return sizeof(struct ofp_vendor_header);
>>>   }
>>> 
>>>   switch ((enum ofp_version) hdrs->version) {
>>> @@ -329,7 +349,7 @@ ofphdrs_len(const struct ofphdrs *hdrs)
>>>       if (hdrs->type == OFPT11_STATS_REQUEST ||
>>>           hdrs->type == OFPT11_STATS_REPLY) {
>>>           return (hdrs->stat == OFPST_VENDOR
>>> -                    ? sizeof(struct nicira11_stats_msg)
>>> +                    ? sizeof(struct ofp11_vendor_stats_msg)
>>>                   : sizeof(struct ofp11_stats_msg));
>>>       }
>>>       break;
>>> @@ -675,11 +695,10 @@ ofpraw_put__(enum ofpraw raw, uint8_t version, 
>>> ovs_be32 xid,
>>>   oh->xid = xid;
>>> 
>>>   if (hdrs->type == OFPT_VENDOR) {
>>> -        struct nicira_header *nh = buf->header;
>>> +        struct ofp_vendor_header *ovh = buf->header;
>>> 
>>> -        ovs_assert(hdrs->vendor == NX_VENDOR_ID);
>>> -        nh->vendor = htonl(hdrs->vendor);
>>> -        nh->subtype = htonl(hdrs->subtype);
>>> +        ovh->vendor = htonl(hdrs->vendor);
>>> +        ovh->subtype = htonl(hdrs->subtype);
>>>   } else if (version == OFP10_VERSION
>>>              && (hdrs->type == OFPT10_STATS_REQUEST ||
>>>                  hdrs->type == OFPT10_STATS_REPLY)) {
>>> @@ -714,13 +733,7 @@ ofpraw_put__(enum ofpraw raw, uint8_t version, 
>>> ovs_be32 xid,
>>>           struct ofp11_vendor_stats_msg *ovsm = buf->header;
>>> 
>>>           ovsm->vendor = htonl(hdrs->vendor);
>>> -            if (hdrs->vendor == NX_VENDOR_ID) {
>>> -                struct nicira11_stats_msg *nsm = buf->header;
>>> -
>>> -                nsm->subtype = htonl(hdrs->subtype);
>>> -            } else {
>>> -                OVS_NOT_REACHED();
>>> -            }
>>> +            ovsm->subtype = htonl(hdrs->subtype);
>>>       }
>>>   }
>>> }
>>> diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h
>>> index a15efb6..38a2803 100644
>>> --- a/lib/ofp-msgs.h
>>> +++ b/lib/ofp-msgs.h
>>> @@ -60,9 +60,14 @@ struct ovs_list;
>>> *
>>> * where the syntax of each part is:
>>> *
>>> - *    - type: One of OFPT (standard OpenFlow message), OFPST (standard 
>>> OpenFlow
>>> - *      statistics message), NXT (Nicira extension message), or NXST 
>>> (Nicira
>>> - *      extension statistics message).
>>> + *    - type: One of the following:
>>> + *
>>> + *          * OFPT: standard OpenFlow message.
>>> + *          * OFPST: standard OpenFlow statistics or multipart message.
>>> + *          * NXT: Nicira extension message.
>>> + *          * NXST: Nicira extension statistics or multipart message.
>>> + *          * ONFT: Open Networking Foundation extension message.
>>> + *          * ONFST: Open Networking Foundation multipart message.
>>> *
>>> *      As new vendors implement extensions it will make sense to expand the
>>> *      dictionary of possible types.
>>> @@ -73,9 +78,9 @@ struct ovs_list;
>>> *    - number:
>>> *         For OFPT, the 'type' in struct ofp_header.
>>> *         For OFPST, the 'type' in struct ofp_stats_msg or ofp11_stats_msg.
>>> - *         For NXT, the 'subtype' in struct nicira_header.
>>> - *         For NXST, the 'subtype' in struct nicira10_stats_msg or
>>> - *           nicira11_stats_msg.
>>> + *         For NXT or ONFT, the 'subtype' in struct ofp_vendor_header.
>>> + *         For NXST or ONFST, the 'subtype' in an appropriate vendor stats
>>> + *         struct.
>>> *
>>> *    - arguments: The types of data that follow the OpenFlow headers (the
>>> *      message "body").  This can be "void" if the message has no body.
>>> -- 
>>> 2.1.3
>>> 
>> 
> 

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to