[ovs-dev] [of1.5 2/9] ofp-msgs: New functions ofpmp_version() and ofpmp_decode_raw().
Ben Pfaff
blp at nicira.com
Thu May 8 06:56:41 UTC 2014
Each of these allows code in ofp-util.c to be simplified.
Signed-off-by: Ben Pfaff <blp at nicira.com>
---
lib/ofp-msgs.c | 25 +++++++++++++++++++++++++
lib/ofp-msgs.h | 3 +++
lib/ofp-util.c | 29 +++++++++--------------------
lib/ofp-util.h | 3 +--
ofproto/ofproto.c | 5 +----
5 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/lib/ofp-msgs.c b/lib/ofp-msgs.c
index b67e47a..e54918e 100644
--- a/lib/ofp-msgs.c
+++ b/lib/ofp-msgs.c
@@ -935,6 +935,31 @@ ofpmp_postappend(struct list *replies, size_t start_ofs)
}
}
+/* Returns the OpenFlow version of the replies being constructed in 'replies',
+ * which should have been initialized by ofpmp_init(). */
+enum ofp_version
+ofpmp_version(struct list *replies)
+{
+ struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
+ const struct ofp_header *oh = ofpbuf_data(msg);
+
+ return oh->version;
+}
+
+/* Determines the OFPRAW_* type of the OpenFlow messages in 'replies', which
+ * should have been initialized by ofpmp_init(). */
+enum ofpraw
+ofpmp_decode_raw(struct list *replies)
+{
+ struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
+ enum ofperr error;
+ enum ofpraw raw;
+
+ error = ofpraw_decode_partial(&raw, ofpbuf_data(msg), ofpbuf_size(msg));
+ ovs_assert(!error);
+ return raw;
+}
+
static ovs_be16 *
ofpmp_flags__(const struct ofp_header *oh)
{
diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h
index ded9042..df7569e 100644
--- a/lib/ofp-msgs.h
+++ b/lib/ofp-msgs.h
@@ -639,6 +639,9 @@ struct ofpbuf *ofpmp_reserve(struct list *, size_t len);
void *ofpmp_append(struct list *, size_t len);
void ofpmp_postappend(struct list *, size_t start_ofs);
+enum ofp_version ofpmp_version(struct list *);
+enum ofpraw ofpmp_decode_raw(struct list *);
+
/* Decoding multipart replies. */
uint16_t ofpmp_flags(const struct ofp_header *);
bool ofpmp_more(const struct ofp_header *);
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index d178113..beeecab 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -2855,10 +2855,9 @@ ofputil_append_flow_stats_reply(const struct ofputil_flow_stats *fs,
{
struct ofpbuf *reply = ofpbuf_from_list(list_back(replies));
size_t start_ofs = ofpbuf_size(reply);
- enum ofpraw raw;
- enum ofp_version version = ((struct ofp_header *)ofpbuf_data(reply))->version;
+ enum ofp_version version = ofpmp_version(replies);
+ enum ofpraw raw = ofpmp_decode_raw(replies);
- ofpraw_decode_partial(&raw, ofpbuf_data(reply), ofpbuf_size(reply));
if (raw == OFPRAW_OFPST11_FLOW_REPLY || raw == OFPRAW_OFPST13_FLOW_REPLY) {
struct ofp11_flow_stats *ofs;
@@ -3778,11 +3777,10 @@ ofputil_put_phy_port(enum ofp_version ofp_version,
}
void
-ofputil_append_port_desc_stats_reply(enum ofp_version ofp_version,
- const struct ofputil_phy_port *pp,
+ofputil_append_port_desc_stats_reply(const struct ofputil_phy_port *pp,
struct list *replies)
{
- switch (ofp_version) {
+ switch (ofpmp_version(replies)) {
case OFP10_VERSION: {
struct ofp10_phy_port *opp;
@@ -5145,14 +5143,13 @@ void
ofputil_append_flow_update(const struct ofputil_flow_update *update,
struct list *replies)
{
+ enum ofp_version version = ofpmp_version(replies);
struct nx_flow_update_header *nfuh;
struct ofpbuf *msg;
size_t start_ofs;
- enum ofp_version version;
msg = ofpbuf_from_list(list_back(replies));
start_ofs = ofpbuf_size(msg);
- version = ((struct ofp_header *)msg->frame)->version;
if (update->event == NXFME_ABBREV) {
struct nx_flow_update_abbrev *nfua;
@@ -5982,10 +5979,7 @@ void
ofputil_append_port_stat(struct list *replies,
const struct ofputil_port_stats *ops)
{
- struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
- struct ofp_header *oh = ofpbuf_data(msg);
-
- switch ((enum ofp_version)oh->version) {
+ switch (ofpmp_version(replies)) {
case OFP13_VERSION: {
struct ofp13_port_stats *reply = ofpmp_append(replies, sizeof *reply);
ofputil_port_stats_to_ofp13(ops, reply);
@@ -6316,11 +6310,9 @@ void
ofputil_append_group_stats(struct list *replies,
const struct ofputil_group_stats *gs)
{
- struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
- struct ofp_header *oh = ofpbuf_data(msg);
size_t length;
- switch ((enum ofp_version) oh->version) {
+ switch (ofpmp_version(replies)) {
case OFP11_VERSION:
case OFP12_VERSION:{
struct ofp11_group_stats *reply;
@@ -6529,10 +6521,10 @@ ofputil_append_group_desc_reply(const struct ofputil_group_desc *gds,
struct list *replies)
{
struct ofpbuf *reply = ofpbuf_from_list(list_back(replies));
+ enum ofp_version version = ofpmp_version(replies);
struct ofp11_group_desc_stats *ogds;
struct ofputil_bucket *bucket;
size_t start_ogds;
- enum ofp_version version = ((struct ofp_header *)ofpbuf_data(reply))->version;
start_ogds = ofpbuf_size(reply);
ofpbuf_put_zeros(reply, sizeof *ogds);
@@ -7023,10 +7015,7 @@ void
ofputil_append_queue_stat(struct list *replies,
const struct ofputil_queue_stats *oqs)
{
- struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
- struct ofp_header *oh = ofpbuf_data(msg);
-
- switch ((enum ofp_version)oh->version) {
+ switch (ofpmp_version(replies)) {
case OFP13_VERSION: {
struct ofp13_queue_stats *reply = ofpmp_append(replies, sizeof *reply);
ofputil_queue_stats_to_ofp13(oqs, reply);
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index f4b5f79..7a24688 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -872,8 +872,7 @@ uint32_t ofputil_decode_flow_monitor_cancel(const struct ofp_header *);
struct ofpbuf *ofputil_encode_flow_monitor_cancel(uint32_t id);
/* Encoding OpenFlow stats messages. */
-void ofputil_append_port_desc_stats_reply(enum ofp_version ofp_version,
- const struct ofputil_phy_port *pp,
+void ofputil_append_port_desc_stats_reply(const struct ofputil_phy_port *pp,
struct list *replies);
/* Encoding simple OpenFlow messages. */
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index d92bafd..557f124 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -3206,15 +3206,12 @@ handle_port_desc_stats_request(struct ofconn *ofconn,
const struct ofp_header *request)
{
struct ofproto *p = ofconn_get_ofproto(ofconn);
- enum ofp_version version;
struct ofport *port;
struct list replies;
ofpmp_init(&replies, request);
-
- version = ofputil_protocol_to_ofp_version(ofconn_get_protocol(ofconn));
HMAP_FOR_EACH (port, hmap_node, &p->ports) {
- ofputil_append_port_desc_stats_reply(version, &port->pp, &replies);
+ ofputil_append_port_desc_stats_reply(&port->pp, &replies);
}
ofconn_send_replies(ofconn, &replies);
--
1.9.1
More information about the dev
mailing list