[ovs-dev] [PATCH 05/47] ofp-util: Make ofperr_encode_msg__() use correct Open Flow version

Simon Horman horms at verge.net.au
Wed Aug 1 07:01:48 UTC 2012


Make ofperr_encode_msg__() use correct Open Flow version in the header
of messages.

Signed-off-by: Simon Horman <horms at verge.net.au>

---

v9
* No change

v8
* Manual rebase

v7
* Manual rebase

v6
* No change

v5
* No change

v4
* Initial post

Conflicts:
	lib/ofp-errors.c
---
 lib/ofp-errors.c | 30 ++++++++++++++++++------------
 lib/ofp-errors.h |  2 +-
 lib/vconn.c      |  5 ++---
 3 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/lib/ofp-errors.c b/lib/ofp-errors.c
index 13b5c4c..9f15fac 100644
--- a/lib/ofp-errors.c
+++ b/lib/ofp-errors.c
@@ -145,13 +145,15 @@ ofperr_get_pair__(enum ofperr error, const struct ofperr_domain *domain)
 }
 
 static struct ofpbuf *
-ofperr_encode_msg__(enum ofperr error, const struct ofperr_domain *domain,
+ofperr_encode_msg__(enum ofperr error, uint8_t ofp_version,
                     ovs_be32 xid, const void *data, size_t data_len)
 {
     struct ofp_error_msg *oem;
     const struct pair *pair;
     struct ofpbuf *buf;
+    const struct ofperr_domain *domain;
 
+    domain = ofperr_domain_from_version(ofp_version);
     if (!domain) {
         return NULL;
     }
@@ -220,31 +222,35 @@ ofperr_encode_msg__(enum ofperr error, const struct ofperr_domain *domain,
 struct ofpbuf *
 ofperr_encode_reply(enum ofperr error, const struct ofp_header *oh)
 {
-    const struct ofperr_domain *domain;
     uint16_t len = ntohs(oh->length);
 
-    domain = ofperr_domain_from_version(oh->version);
-    return ofperr_encode_msg__(error, domain, oh->xid, oh, MIN(len, 64));
+    return ofperr_encode_msg__(error, oh->version, oh->xid, oh, MIN(len, 64));
 }
 
 /* Creates and returns an OpenFlow message of type OFPT_ERROR that conveys the
  * given 'error', in the error domain 'domain'.  The error message will include
  * the additional null-terminated text string 's'.
  *
- * If 'domain' is NULL, uses the OpenFlow 1.0 error domain.  OFPET_HELLO_FAILED
- * error messages are supposed to be backward-compatible, so in theory this
- * should work.
+ * If 'version' is an unknown version then OFP10_VERSION is used.
+ * OFPET_HELLO_FAILED error messages are supposed to be backward-compatible,
+ * so in theory this should work.
  *
  * Returns NULL if 'error' is not an OpenFlow error code or if 'error' cannot
  * be encoded in 'domain'. */
 struct ofpbuf *
-ofperr_encode_hello(enum ofperr error, const struct ofperr_domain *domain,
-                    const char *s)
+ofperr_encode_hello(enum ofperr error, uint8_t ofp_version, const char *s)
 {
-    if (!domain) {
-        domain = &ofperr_of10;
+    switch (ofp_version) {
+    case OFP10_VERSION:
+    case OFP11_VERSION:
+    case OFP12_VERSION:
+        break;
+
+    default:
+        ofp_version = OFP10_VERSION;
     }
-    return ofperr_encode_msg__(error, domain, htonl(0), s, strlen(s));
+
+    return ofperr_encode_msg__(error, ofp_version, htonl(0), s, strlen(s));
 }
 
 /* Returns the value that would go into an OFPT_ERROR message's 'type' for
diff --git a/lib/ofp-errors.h b/lib/ofp-errors.h
index 76b6574..dc99d45 100644
--- a/lib/ofp-errors.h
+++ b/lib/ofp-errors.h
@@ -515,7 +515,7 @@ enum ofperr ofperr_from_name(const char *);
 enum ofperr ofperr_decode_msg(const struct ofp_header *,
                               struct ofpbuf *payload);
 struct ofpbuf *ofperr_encode_reply(enum ofperr, const struct ofp_header *);
-struct ofpbuf *ofperr_encode_hello(enum ofperr, const struct ofperr_domain *,
+struct ofpbuf *ofperr_encode_hello(enum ofperr, uint8_t ofp_version,
                                    const char *);
 int ofperr_get_type(enum ofperr, const struct ofperr_domain *);
 int ofperr_get_code(enum ofperr, const struct ofperr_domain *);
diff --git a/lib/vconn.c b/lib/vconn.c
index 94040ce..f08e514 100644
--- a/lib/vconn.c
+++ b/lib/vconn.c
@@ -467,9 +467,8 @@ vcs_send_error(struct vconn *vconn)
 
     snprintf(s, sizeof s, "We support versions 0x%02x to 0x%02x inclusive but "
              "you support no later than version 0x%02"PRIx8".",
-             vconn->min_version, OFP10_VERSION, vconn->version);
-    b = ofperr_encode_hello(OFPERR_OFPHFC_INCOMPATIBLE,
-                            ofperr_domain_from_version(vconn->version), s);
+             vconn->min_version, OFP12_VERSION, vconn->version);
+    b = ofperr_encode_hello(OFPERR_OFPHFC_INCOMPATIBLE, vconn->version, s);
     retval = do_send(vconn, b);
     if (retval) {
         ofpbuf_delete(b);
-- 
1.7.10.2.484.gcd07cc5




More information about the dev mailing list