Signed-off-by: Simon Horman <[email protected]>
---
v4
* Initial post
---
lib/learning-switch.c | 9 +++++++--
lib/ofp-util.c | 19 ++++++++++---------
lib/ofp-util.h | 3 ++-
lib/vconn.c | 3 ++-
utilities/ovs-ofctl.c | 26 +++++++++++++++++---------
5 files changed, 38 insertions(+), 22 deletions(-)
diff --git a/lib/learning-switch.c b/lib/learning-switch.c
index 9fad356..e5f726b 100644
--- a/lib/learning-switch.c
+++ b/lib/learning-switch.c
@@ -323,13 +323,18 @@ send_features_request(struct lswitch *sw, struct rconn
*rconn)
if (now >= sw->last_features_request + 1) {
struct ofpbuf *b;
struct ofp_switch_config *osc;
+ int ofp_version;
+
+ ofp_version = rconn_get_version(rconn);
+ assert(ofp_version >= 0 && ofp_version <= 0xff);
/* Send OFPT_FEATURES_REQUEST. */
- make_openflow(sizeof(struct ofp_header), OFPT_FEATURES_REQUEST, &b);
+ make_openflow(sizeof(struct ofp_header), ofp_version,
+ OFPT_FEATURES_REQUEST, &b);
queue_tx(sw, rconn, b);
/* Send OFPT_SET_CONFIG. */
- osc = make_openflow(sizeof *osc, OFPT_SET_CONFIG, &b);
+ osc = make_openflow(sizeof *osc, ofp_version, OFPT_SET_CONFIG, &b);
osc->miss_send_len = htons(OFP_DEFAULT_MISS_SEND_LEN);
queue_tx(sw, rconn, b);
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index c09dbba..c09f5ea 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -2995,7 +2995,7 @@ ofputil_encode_port_mod(const struct ofputil_port_mod *pm,
if (ofp_version == OFP10_VERSION) {
struct ofp10_port_mod *opm;
- opm = make_openflow(sizeof *opm, OFPT10_PORT_MOD, &b);
+ opm = make_openflow(sizeof *opm, ofp_version, OFPT10_PORT_MOD, &b);
opm->port_no = htons(pm->port_no);
memcpy(opm->hw_addr, pm->hw_addr, ETH_ADDR_LEN);
opm->config = htonl(pm->config & OFPPC10_ALL);
@@ -3004,7 +3004,7 @@ ofputil_encode_port_mod(const struct ofputil_port_mod *pm,
} else if (ofp_version == OFP11_VERSION) {
struct ofp11_port_mod *opm;
- opm = make_openflow(sizeof *opm, OFPT11_PORT_MOD, &b);
+ opm = make_openflow(sizeof *opm, ofp_version, OFPT11_PORT_MOD, &b);
opm->port_no = htonl(pm->port_no);
memcpy(opm->hw_addr, pm->hw_addr, ETH_ADDR_LEN);
opm->config = htonl(pm->config & OFPPC11_ALL);
@@ -3058,9 +3058,9 @@ ofputil_msg_type_name(const struct ofputil_msg_type *type)
}
/* Allocates and stores in '*bufferp' a new ofpbuf with a size of
- * 'openflow_len', starting with an OpenFlow header with the given 'type' and
- * an arbitrary transaction id. Allocated bytes beyond the header, if any, are
- * zeroed.
+ * 'openflow_len', starting with an OpenFlow header with the given
+ * 'version' and 'type', and an arbitrary transaction id. Allocated bytes
+ * beyond the header, if any, are zeroed.
*
* The caller is responsible for freeing '*bufferp' when it is no longer
* needed.
@@ -3071,11 +3071,11 @@ ofputil_msg_type_name(const struct ofputil_msg_type
*type)
*
* Returns the header. */
void *
-make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **bufferp)
+make_openflow(size_t openflow_len, uint8_t version, uint8_t type,
+ struct ofpbuf **bufferp)
{
*bufferp = ofpbuf_new(openflow_len);
- return put_openflow_xid(openflow_len, OFP10_VERSION, type,
- alloc_xid(), *bufferp);
+ return put_openflow_xid(openflow_len, version, type, alloc_xid(),
*bufferp);
}
/* Similar to make_openflow() but creates a Nicira vendor extension message
@@ -3459,7 +3459,8 @@ ofputil_encode_barrier_request(void)
{
struct ofpbuf *msg;
- make_openflow(sizeof(struct ofp_header), OFPT10_BARRIER_REQUEST, &msg);
+ make_openflow(sizeof(struct ofp_header), OFP10_VERSION,
+ OFPT10_BARRIER_REQUEST, &msg);
return msg;
}
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index fb3fede..80b2065 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -517,7 +517,8 @@ struct ofpbuf *ofputil_encode_port_mod(const struct
ofputil_port_mod *,
enum ofputil_protocol);
/* OpenFlow protocol utility functions. */
-void *make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **);
+void *make_openflow(size_t openflow_len, uint8_t version, 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,
diff --git a/lib/vconn.c b/lib/vconn.c
index 5cd708d..676c4d3 100644
--- a/lib/vconn.c
+++ b/lib/vconn.c
@@ -385,7 +385,8 @@ vcs_send_hello(struct vconn *vconn)
struct ofpbuf *b;
int retval;
- make_openflow(sizeof(struct ofp_header), OFPT_HELLO, &b);
+ /* Note that here OFP10_VERSION is the maximum version supported */
+ make_openflow(sizeof(struct ofp_header), OFP10_VERSION, OFPT_HELLO, &b);
retval = do_send(vconn, b);
if (!retval) {
vconn->state = VCS_RECV_HELLO;
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index 6a65dc1..efe7d9d 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -361,7 +361,8 @@ static void
dump_trivial_transaction(const char *vconn_name, uint8_t request_type)
{
struct ofpbuf *request;
- make_openflow(sizeof(struct ofp_header), request_type, &request);
+ make_openflow(sizeof(struct ofp_header), OFP10_VERSION, request_type,
+ &request);
dump_transaction(vconn_name, request);
}
@@ -451,8 +452,8 @@ fetch_switch_config(struct vconn *vconn, struct
ofp_switch_config *config_)
struct ofpbuf *request;
struct ofpbuf *reply;
- make_openflow(sizeof(struct ofp_header), OFPT_GET_CONFIG_REQUEST,
- &request);
+ make_openflow(sizeof(struct ofp_header), vconn_get_version(vconn),
+ OFPT_GET_CONFIG_REQUEST, &request);
run(vconn_transact(vconn, request, &reply),
"talking to %s", vconn_get_name(vconn));
@@ -475,7 +476,8 @@ set_switch_config(struct vconn *vconn, struct
ofp_switch_config *config_)
struct ofp_header save_header;
struct ofpbuf *request;
- config = make_openflow(sizeof *config, OFPT_SET_CONFIG, &request);
+ config = make_openflow(sizeof *config, vconn_get_version(vconn),
+ OFPT_SET_CONFIG, &request);
save_header = config->header;
*config = *config_;
config->header = save_header;
@@ -492,8 +494,8 @@ do_show(int argc OVS_UNUSED, char *argv[])
struct ofpbuf *reply;
bool trunc;
- make_openflow(sizeof(struct ofp_header), OFPT_FEATURES_REQUEST,
- &request);
+ make_openflow(sizeof(struct ofp_header), vconn_get_version(vconn),
+ OFPT_FEATURES_REQUEST, &request);
open_vconn(vconn_name, &vconn);
run(vconn_transact(vconn, request, &reply), "talking to %s", vconn_name);
@@ -538,7 +540,8 @@ fetch_port_by_features(const char *vconn_name,
bool found = false;
/* Fetch the switch's ofp_switch_features. */
- make_openflow(sizeof(struct ofp_header), OFPT_FEATURES_REQUEST, &request);
+ make_openflow(sizeof(struct ofp_header), vconn_get_version(vconn),
+ OFPT_FEATURES_REQUEST, &request);
open_vconn(vconn_name, &vconn);
run(vconn_transact(vconn, request, &reply), "talking to %s", vconn_name);
vconn_close(vconn);
@@ -1210,8 +1213,11 @@ do_probe(int argc OVS_UNUSED, char *argv[])
struct vconn *vconn;
struct ofpbuf *reply;
- make_openflow(sizeof(struct ofp_header), OFPT_ECHO_REQUEST, &request);
open_vconn(argv[1], &vconn);
+
+ make_openflow(sizeof(struct ofp_header), vconn_get_version(vconn),
+ OFPT_ECHO_REQUEST, &request);
+
run(vconn_transact(vconn, request, &reply), "talking to %s", argv[1]);
if (reply->size != sizeof(struct ofp_header)) {
ovs_fatal(0, "reply does not match request");
@@ -1383,6 +1389,7 @@ do_ping(int argc, char *argv[])
struct ofp_header *rq_hdr, *rpy_hdr;
rq_hdr = make_openflow(sizeof(struct ofp_header) + payload,
+ vconn_get_version(vconn),
OFPT_ECHO_REQUEST, &request);
random_bytes(rq_hdr + 1, payload);
@@ -1438,7 +1445,8 @@ do_benchmark(int argc OVS_UNUSED, char *argv[])
struct ofpbuf *request, *reply;
struct ofp_header *rq_hdr;
- rq_hdr = make_openflow(message_size, OFPT_ECHO_REQUEST, &request);
+ rq_hdr = make_openflow(message_size, vconn_get_version(vconn),
+ OFPT_ECHO_REQUEST, &request);
memset(rq_hdr + 1, 0, payload_size);
run(vconn_transact(vconn, request, &reply), "transact");
ofpbuf_delete(reply);
--
1.7.10.2.484.gcd07cc5
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev