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