ofp-util: New functions for creating Nicira extension messages.
authorBen Pfaff <blp@nicira.com>
Tue, 23 Nov 2010 21:31:07 +0000 (13:31 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 6 Dec 2010 18:24:56 +0000 (10:24 -0800)
lib/ofp-util.c
lib/ofp-util.h

index 71e57677f333d79af98aa20b5e6872eded4a6ee2..11836ccdd94a73e91a4394865e96abc340182833 100644 (file)
@@ -821,11 +821,8 @@ void *
 make_nxmsg_xid(size_t openflow_len, uint32_t subtype, ovs_be32 xid,
                struct ofpbuf **bufferp)
 {
-    struct nicira_header *nxh = make_openflow_xid(openflow_len, OFPT_VENDOR,
-                                                  xid, bufferp);
-    nxh->vendor = htonl(NX_VENDOR_ID);
-    nxh->subtype = htonl(subtype);
-    return nxh;
+    *bufferp = ofpbuf_new(openflow_len);
+    return put_nxmsg_xid(openflow_len, subtype, xid, *bufferp);
 }
 
 /* Appends 'openflow_len' bytes to 'buffer', starting with an OpenFlow header
@@ -870,6 +867,28 @@ put_openflow_xid(size_t openflow_len, uint8_t type, ovs_be32 xid,
     return oh;
 }
 
+/* Similar to put_openflow() but append a Nicira vendor extension message with
+ * the specific 'subtype'.  'subtype' should be in host byte order. */
+void *
+put_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf *buffer)
+{
+    return put_nxmsg_xid(openflow_len, subtype, alloc_xid(), buffer);
+}
+
+/* Similar to put_openflow_xid() but append a Nicira vendor extension message
+ * with the specific 'subtype'.  'subtype' should be in host byte order. */
+void *
+put_nxmsg_xid(size_t openflow_len, uint32_t subtype, ovs_be32 xid,
+              struct ofpbuf *buffer)
+{
+    struct nicira_header *nxh;
+
+    nxh = put_openflow_xid(openflow_len, OFPT_VENDOR, xid, buffer);
+    nxh->vendor = htonl(NX_VENDOR_ID);
+    nxh->subtype = htonl(subtype);
+    return nxh;
+}
+
 /* Updates the 'length' field of the OpenFlow message in 'buffer' to
  * 'buffer->size'. */
 void
@@ -879,6 +898,37 @@ update_openflow_length(struct ofpbuf *buffer)
     oh->length = htons(buffer->size);
 }
 
+/* Creates an ofp_stats_request with the given 'type' and 'body_len' bytes of
+ * space allocated for the 'body' member.  Returns the first byte of the 'body'
+ * member. */
+void *
+ofputil_make_stats_request(size_t body_len, uint16_t type,
+                           struct ofpbuf **bufferp)
+{
+    struct ofp_stats_request *osr;
+    osr = make_openflow((offsetof(struct ofp_stats_request, body)
+                        + body_len), OFPT_STATS_REQUEST, bufferp);
+    osr->type = htons(type);
+    osr->flags = htons(0);
+    return osr->body;
+}
+
+/* Creates a stats request message with Nicira as vendor and the given
+ * 'subtype', of total length 'openflow_len'.  Returns the message. */
+void *
+ofputil_make_nxstats_request(size_t openflow_len, uint32_t subtype,
+                             struct ofpbuf **bufferp)
+{
+    struct nicira_stats_msg *nsm;
+
+    nsm = make_openflow(openflow_len, OFPT_STATS_REQUEST, bufferp);
+    nsm->type = htons(OFPST_VENDOR);
+    nsm->flags = htons(0);
+    nsm->vendor = htonl(NX_VENDOR_ID);
+    nsm->subtype = htonl(subtype);
+    return nsm;
+}
+
 /* Returns the first byte of the 'body' member of the ofp_stats_request or
  * ofp_stats_reply in 'oh'. */
 const void *
index 733fc714923f1363cf5f5ecc13d6e0a1d0c5bcec..f82e083a51b63182789a00f47d123c2beea0f1b7 100644 (file)
@@ -115,15 +115,27 @@ char *ofp_match_to_literal_string(const struct ofp_match *match);
 /* OpenFlow protocol utility functions. */
 void *make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **);
 void *make_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf **);
+
 void *make_openflow_xid(size_t openflow_len, uint8_t type,
                         ovs_be32 xid, struct ofpbuf **);
 void *make_nxmsg_xid(size_t openflow_len, uint32_t subtype, ovs_be32 xid,
                      struct ofpbuf **);
+
 void *put_openflow(size_t openflow_len, uint8_t type, struct ofpbuf *);
 void *put_openflow_xid(size_t openflow_len, uint8_t type, ovs_be32 xid,
                        struct ofpbuf *);
+
+void *put_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf *);
+void *put_nxmsg_xid(size_t openflow_len, uint32_t subtype, ovs_be32 xid,
+                    struct ofpbuf *);
+
 void update_openflow_length(struct ofpbuf *);
 
+void *ofputil_make_stats_request(size_t body_len, uint16_t type,
+                                 struct ofpbuf **);
+void *ofputil_make_nxstats_request(size_t openflow_len, uint32_t subtype,
+                                   struct ofpbuf **);
+
 const void *ofputil_stats_body(const struct ofp_header *);
 size_t ofputil_stats_body_len(const struct ofp_header *oh);