[ovs-dev] [PATCH 11/63] ofp-util: Make put_stats*__() aware of different OpenFlow versions.
Simon Horman
horms at verge.net.au
Wed Jun 27 08:19:47 UTC 2012
Signed-off-by: Simon Horman <horms at verge.net.au>
---
v5
* No change
v4
* Initial post
---
lib/ofp-util.c | 44 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 36 insertions(+), 8 deletions(-)
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 653472c..6613015 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -3199,7 +3199,7 @@ update_openflow_length(struct ofpbuf *buffer)
}
static void
-put_stats__(ovs_be32 xid, uint8_t ofp_type,
+put_stats__(ovs_be32 xid, uint8_t ofp_version, uint8_t ofp_type,
ovs_be16 ofpst_type, ovs_be32 nxst_subtype,
struct ofpbuf *msg)
{
@@ -3211,10 +3211,19 @@ put_stats__(ovs_be32 xid, uint8_t ofp_type,
nsm->vsm.vendor = htonl(NX_VENDOR_ID);
nsm->subtype = nxst_subtype;
} else {
- struct ofp10_stats_msg *osm;
+ if (ofp_version == OFP10_VERSION) {
+ struct ofp10_stats_msg *osm;
- osm = put_openflow_xid(sizeof *osm, OFP10_VERSION, ofp_type, xid, msg);
- osm->type = ofpst_type;
+ osm = put_openflow_xid(sizeof *osm, ofp_version, ofp_type,
+ xid, msg);
+ osm->type = ofpst_type;
+ } else {
+ struct ofp11_stats_msg *osm;
+
+ osm = put_openflow_xid(sizeof *osm, ofp_version, ofp_type,
+ xid, msg);
+ osm->type = ofpst_type;
+ }
}
}
@@ -3237,7 +3246,7 @@ ofputil_make_stats_request(size_t body_len, uint16_t ofpst_type,
struct ofpbuf *msg;
msg = *bufferp = ofpbuf_new(HEADER_LEN + body_len);
- put_stats__(alloc_xid(), OFPT10_STATS_REQUEST,
+ put_stats__(alloc_xid(), OFP10_VERSION, OFPT10_STATS_REQUEST,
htons(ofpst_type), htonl(nxst_subtype), msg);
return ofpbuf_put_zeros(msg, body_len);
@@ -3247,12 +3256,31 @@ static void
put_stats_reply__(const struct ofp_header *request, struct ofpbuf *msg)
{
const struct ofp10_stats_msg *osm;
+ uint8_t ofp_type;
+
+ switch (request->version) {
+ case OFP12_VERSION:
+ case OFP11_VERSION:
+ ofp_type = OFPT11_STATS_REPLY;
+ assert(request->type == OFPT11_STATS_REQUEST ||
+ request->type == OFPT11_STATS_REPLY);
+ break;
- assert(request->type == OFPT10_STATS_REQUEST ||
- request->type == OFPT10_STATS_REPLY);
+ case OFP10_VERSION:
+ assert(request->type == OFPT10_STATS_REQUEST ||
+ request->type == OFPT10_STATS_REPLY);
+ ofp_type = OFPT10_STATS_REPLY;
+ break;
+
+ default:
+ NOT_REACHED();
+ }
+ /* This is fine because the non-pad elements of
+ * struct ofp10_stats_msg and struct ofp11_stats_msg
+ * are at the same offsets */
osm = (const struct ofp10_stats_msg *) request;
- put_stats__(request->xid, OFPT10_STATS_REPLY, osm->type,
+ put_stats__(request->xid, request->version, ofp_type, osm->type,
(osm->type != htons(OFPST_VENDOR)
? htonl(0)
: ((const struct nicira10_stats_msg *) request)->subtype),
--
1.7.10.2.484.gcd07cc5
More information about the dev
mailing list