From cf7cf630e24dddba9177fcd68bcfa903689c7b72 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 9 Nov 2012 09:55:12 -0800 Subject: [PATCH] ofp-msgs: Accept all versions of OpenFlow "hello" messages. Since the ofp-msgs code was introduced, only "hello" messages for versions of OpenFlow actually understood (to some extent) by Open vSwitch could be decoded correctly. This commit corrects that, by making every version of OpenFlow immutable messages acceptable. Signed-off-by: Ben Pfaff --- build-aux/extract-ofp-msgs | 5 +++-- lib/ofp-msgs.h | 27 ++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/build-aux/extract-ofp-msgs b/build-aux/extract-ofp-msgs index ad1a8a83..98072897 100755 --- a/build-aux/extract-ofp-msgs +++ b/build-aux/extract-ofp-msgs @@ -29,7 +29,8 @@ version_map = {"1.0": (OFP10_VERSION, OFP10_VERSION), "1.2+": (OFP12_VERSION, OFP13_VERSION), "1.3+": (OFP13_VERSION, OFP13_VERSION), "1.0-1.1": (OFP10_VERSION, OFP11_VERSION), - "1.0-1.2": (OFP10_VERSION, OFP12_VERSION)} + "1.0-1.2": (OFP10_VERSION, OFP12_VERSION), + "": (0x01, 0xff)} def get_line(): global line @@ -104,7 +105,7 @@ def extract_ofp_msgs(output_file_name): comment += ' %s' % line.lstrip('* \t').rstrip(' \t\r\n') comment = comment[:-2].rstrip() - m = re.match(r'([A-Z]+) ([-.+\d]+) \((\d+)\): ([^.]+)\.$', comment) + m = re.match(r'([A-Z]+) ([-.+\d]+|) \((\d+)\): ([^.]+)\.$', comment) if not m: fatal("unexpected syntax between messages") type_, versions, number, contents = m.groups() diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h index f8ac4cd6..5ed8705e 100644 --- a/lib/ofp-msgs.h +++ b/lib/ofp-msgs.h @@ -92,20 +92,37 @@ struct list; * to " indicates this, e.g. "struct ofp11_packet_in up to data". */ enum ofpraw { -/* Standard messages. */ +/* Immutable standard messages. + * + * The OpenFlow standard promises to preserve these messages and their numbers + * in future versions, so we mark them as , which covers every OpenFlow + * version numbered 0x01...0xff, rather than as OF1.0+, which covers only + * OpenFlow versions that we otherwise implement. + * + * Without here, then we would fail to decode "hello" messages that + * announce a version higher than we understand, even though there still could + * be a version in common with the peer that we do understand. The + * keyword is less useful for the other messages, because our OpenFlow channels + * accept only OpenFlow messages with a previously negotiated version. + */ - /* OFPT 1.0+ (0): uint8_t[]. */ + /* OFPT (0): uint8_t[]. */ OFPRAW_OFPT_HELLO, - /* OFPT 1.0+ (1): struct ofp_error_msg, uint8_t[]. */ + /* OFPT (1): struct ofp_error_msg, uint8_t[]. */ OFPRAW_OFPT_ERROR, - /* OFPT 1.0+ (2): uint8_t[]. */ + /* OFPT (2): uint8_t[]. */ OFPRAW_OFPT_ECHO_REQUEST, - /* OFPT 1.0+ (3): uint8_t[]. */ + /* OFPT (3): uint8_t[]. */ OFPRAW_OFPT_ECHO_REPLY, +/* Other standard messages. + * + * The meanings of these messages can (and often do) change from one version + * of OpenFlow to another. */ + /* OFPT 1.0+ (5): void. */ OFPRAW_OFPT_FEATURES_REQUEST, -- 2.30.2