2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-03 07:45:30 +00:00

ofp-util: Make ofperr_encode_msg__() use correct Open Flow version

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

Signed-off-by: Simon Horman <horms@verge.net.au>
Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Simon Horman
2012-08-01 16:01:48 +09:00
committed by Ben Pfaff
parent a0ae0b6e83
commit 9b7e2112b1
3 changed files with 23 additions and 16 deletions

View File

@@ -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, enum ofp_version 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,36 @@ 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,
ofperr_encode_hello(enum ofperr error, enum ofp_version 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

View File

@@ -21,8 +21,9 @@
#include <stddef.h>
#include <stdint.h>
#include "openflow/openflow.h"
struct ds;
struct ofp_header;
struct ofpbuf;
/* Error codes.
@@ -515,7 +516,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, enum ofp_version ofp_version,
const char *);
int ofperr_get_type(enum ofperr, const struct ofperr_domain *);
int ofperr_get_code(enum ofperr, const struct ofperr_domain *);

View File

@@ -461,9 +461,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);