ofp-util: New functions make_nxmsg(), make_nxmsg_xid().
authorBen Pfaff <blp@nicira.com>
Mon, 18 Oct 2010 23:25:52 +0000 (16:25 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 5 Nov 2010 16:25:38 +0000 (09:25 -0700)
These functions slightly simplify constructing Nicira vendor extension
messages.

lib/ofp-util.c
lib/ofp-util.h
ofproto/ofproto.c
ofproto/status.c
utilities/ovs-ofctl.c

index 261c67ad076c62752520a43d4ae5d00e0445bd1f..23f715fa77c90df8555e949a7486acf584f8d19b 100644 (file)
@@ -59,6 +59,14 @@ make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **bufferp)
     return put_openflow_xid(openflow_len, type, alloc_xid(), *bufferp);
 }
 
+/* Similar to make_openflow() but creates a Nicira vendor extension message
+ * with the specific 'subtype'.  'subtype' should be in host byte order. */
+void *
+make_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf **bufferp)
+{
+    return make_nxmsg_xid(openflow_len, subtype, alloc_xid(), bufferp);
+}
+
 /* Allocates and stores in '*bufferp' a new ofpbuf with a size of
  * 'openflow_len', starting with an OpenFlow header with the given 'type' and
  * transaction id 'xid'.  Allocated bytes beyond the header, if any, are
@@ -80,6 +88,19 @@ make_openflow_xid(size_t openflow_len, uint8_t type, uint32_t xid,
     return put_openflow_xid(openflow_len, type, xid, *bufferp);
 }
 
+/* Similar to make_openflow_xid() but creates a Nicira vendor extension message
+ * with the specific 'subtype'.  'subtype' should be in host byte order. */
+void *
+make_nxmsg_xid(size_t openflow_len, uint32_t subtype, uint32_t 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;
+}
+
 /* Appends 'openflow_len' bytes to 'buffer', starting with an OpenFlow header
  * with the given 'type' and an arbitrary transaction id.  Allocated bytes
  * beyond the header, if any, are zeroed.
index a694348a74462423c6f8f4101d5b2edd3d156203..8bc00bd3d0ce42e7e3091d1af8b49fe133c8bef6 100644 (file)
@@ -28,8 +28,11 @@ struct ofp_action_header;
 
 /* 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,
                         uint32_t xid, struct ofpbuf **);
+void *make_nxmsg_xid(size_t openflow_len, uint32_t subtype, uint32_t 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, uint32_t xid,
                        struct ofpbuf *);
index 3da2a7444d0af08ac07e58a764a95b5bd6e17df4..c949fde381c4f242b64f6347bdbc58ac02b17d06 100644 (file)
@@ -3954,10 +3954,8 @@ handle_role_request(struct ofproto *ofproto,
     }
     ofconn->role = role;
 
-    reply = make_openflow_xid(sizeof *reply, OFPT_VENDOR, msg->header.xid,
-                              &buf);
-    reply->nxh.vendor = htonl(NX_VENDOR_ID);
-    reply->nxh.subtype = htonl(NXT_ROLE_REPLY);
+    reply = make_nxmsg_xid(sizeof *reply, NXT_ROLE_REPLY, msg->header.xid,
+                           &buf);
     reply->role = htonl(role);
     queue_tx(buf, ofconn, ofconn->reply_counter);
 
index 27db4980fadb6c132fd4f8a232293fcb37de5598..b5bc33a6362b7c150ffa687d24361aa2046f23d2 100644 (file)
@@ -77,10 +77,8 @@ switch_status_handle_request(struct switch_status *ss, struct rconn *rconn,
             c->cb(&sr, c->aux);
         }
     }
-    reply = make_openflow_xid(sizeof *reply + sr.output.length,
-                              OFPT_VENDOR, request->header.xid, &b);
-    reply->vendor = htonl(NX_VENDOR_ID);
-    reply->subtype = htonl(NXT_STATUS_REPLY);
+    reply = make_nxmsg_xid(sizeof *reply + sr.output.length,
+                           NXT_STATUS_REPLY, request->header.xid, &b);
     memcpy(reply + 1, sr.output.string, sr.output.length);
     retval = rconn_send(rconn, b, NULL);
     if (retval && retval != EAGAIN) {
index 17dafaafd8593652d7ac4bee2ae0e9f8ae9e2912..ff4305818100d0f9efff21e3b4d27fccbb60c038 100644 (file)
@@ -354,9 +354,7 @@ do_status(int argc, char *argv[])
     struct vconn *vconn;
     struct ofpbuf *b;
 
-    request = make_openflow(sizeof *request, OFPT_VENDOR, &b);
-    request->vendor = htonl(NX_VENDOR_ID);
-    request->subtype = htonl(NXT_STATUS_REQUEST);
+    request = make_nxmsg(sizeof *request, NXT_STATUS_REQUEST, &b);
     if (argc > 2) {
         ofpbuf_put(b, argv[2], strlen(argv[2]));
         update_openflow_length(b);
@@ -610,10 +608,8 @@ do_tun_cookie(int argc OVS_UNUSED, char *argv[])
     struct ofpbuf *buffer;
     struct vconn *vconn;
 
-    tun_id_cookie = make_openflow(sizeof *tun_id_cookie, OFPT_VENDOR, &buffer);
-
-    tun_id_cookie->vendor = htonl(NX_VENDOR_ID);
-    tun_id_cookie->subtype = htonl(NXT_TUN_ID_FROM_COOKIE);
+    tun_id_cookie = make_nxmsg(sizeof *tun_id_cookie, NXT_TUN_ID_FROM_COOKIE,
+                               &buffer);
     tun_id_cookie->set = !strcmp(argv[2], "true");
 
     open_vconn(argv[1], &vconn);