diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-07-28 12:50:26 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-07-30 11:58:23 +0900 |
commit | 6b99b1408b83a1a6204360d8cc0abfd8c5a67793 (patch) | |
tree | a5dfe9e0844267d41b2e3c924c445c30830ece03 | |
parent | 8c1978942daaa96a5336aab3def2f94e37cccc5c (diff) |
of1.2: handle unknown match field properly
Ryu crashes when it finds an unknown match field in OFPMatch. Instead,
Ryu should just ignore it and continue to parse.
With this patch, Ryu uses OFPmatchField class for an unknown match
field and continue to parse.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Tested-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | ryu/ofproto/ofproto_v1_2_parser.py | 12 | ||||
-rw-r--r-- | ryu/tests/unit/ofproto/test_parser_v12.py | 12 |
2 files changed, 21 insertions, 3 deletions
diff --git a/ryu/ofproto/ofproto_v1_2_parser.py b/ryu/ofproto/ofproto_v1_2_parser.py index 32a7313d..f5a1b242 100644 --- a/ryu/ofproto/ofproto_v1_2_parser.py +++ b/ryu/ofproto/ofproto_v1_2_parser.py @@ -1931,7 +1931,11 @@ class OFPMatchField(object): def __init__(self, header): self.header = header - self.n_bytes = struct.calcsize(self.pack_str) + hasmask = (header >> 8) & 1 + if hasmask: + self.n_bytes = (header & 0xff) / 2 + else: + self.n_bytes = header & 0xff self.length = 0 @staticmethod @@ -1942,9 +1946,11 @@ class OFPMatchField(object): @classmethod def parser(cls, buf, offset): (header,) = struct.unpack_from('!I', buf, offset) - # TODO: handle unknown field cls_ = OFPMatchField._FIELDS_HEADERS.get(header) - field = cls_.field_parser(header, buf, offset) + if cls_: + field = cls_.field_parser(header, buf, offset) + else: + field = OFPMatchField(header) field.length = (header & 0xff) + 4 return field diff --git a/ryu/tests/unit/ofproto/test_parser_v12.py b/ryu/tests/unit/ofproto/test_parser_v12.py index be10443a..e3f3fb42 100644 --- a/ryu/tests/unit/ofproto/test_parser_v12.py +++ b/ryu/tests/unit/ofproto/test_parser_v12.py @@ -3403,6 +3403,18 @@ class TestOFPMatch(unittest.TestCase): eq_(res.fields[0].header, header) eq_(res.fields[0].value, value) + def test_parse_unknown_field(self): + buf = bytearray() + ofproto_parser.msg_pack_into('!HH', buf, 0, ofproto_v1_2.OFPMT_OXM, + 4 + 6) + header = ofproto_v1_2.oxm_tlv_header(36, 2) + ofproto_parser.msg_pack_into('!IH', buf, 4, header, 1) + header = ofproto_v1_2.OXM_OF_ETH_TYPE + ofproto_v1_2_parser.msg_pack_into('!IH', buf, 10, header, 1) + + match = OFPMatch() + res = match.parser(str(buf), 0) + def test_set_in_port(self): header = ofproto_v1_2.OXM_OF_IN_PORT value = in_port = 0xfff8 |