diff options
author | HIYAMA Manabu <hiyama.manabu@po.ntts.co.jp> | 2012-11-06 19:50:41 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-11-06 20:16:33 +0900 |
commit | 6afa1c35ec0a0b2c66c22b6521be9886397aa1df (patch) | |
tree | a17417510e4a3de9a5cb6dc1f32da446af2131ba | |
parent | 6e14f983bce3ae4a36eb95fbd62d091b2051214f (diff) |
of1.2: Fix MTVlanVid() parser and serializer
- The OFPVID_PRESENT bit indicate the presence of a valid VLAN_ID.
- Reflect to unittests.
Signed-off-by: HIYAMA Manabu <hiyama.manabu@po.ntts.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/ofproto/ofproto_v1_2_parser.py | 10 | ||||
-rw-r--r-- | ryu/tests/unit/ofproto/test_parser_v12.py | 26 |
2 files changed, 32 insertions, 4 deletions
diff --git a/ryu/ofproto/ofproto_v1_2_parser.py b/ryu/ofproto/ofproto_v1_2_parser.py index 37d1ee1d..f8d2af4b 100644 --- a/ryu/ofproto/ofproto_v1_2_parser.py +++ b/ryu/ofproto/ofproto_v1_2_parser.py @@ -2076,6 +2076,16 @@ class MTVlanVid(OFPMatchField): self.value = value self.mask = mask + @classmethod + def field_parser(cls, header, buf, offset): + m = super(MTVlanVid, cls).field_parser(header, buf, offset) + m.value &= ~ofproto_v1_2.OFPVID_PRESENT + return m + + def serialize(self, buf, offset): + self.value |= ofproto_v1_2.OFPVID_PRESENT + super(MTVlanVid, self).serialize(buf, offset) + @OFPMatchField.register_field_header([ofproto_v1_2.OXM_OF_VLAN_PCP]) class MTVlanPcp(OFPMatchField): diff --git a/ryu/tests/unit/ofproto/test_parser_v12.py b/ryu/tests/unit/ofproto/test_parser_v12.py index 7f38725a..b1e1cfc8 100644 --- a/ryu/tests/unit/ofproto/test_parser_v12.py +++ b/ryu/tests/unit/ofproto/test_parser_v12.py @@ -3511,24 +3511,42 @@ class TestOFPMatch(unittest.TestCase): self._test_serialize_and_parser(header, value, match) + def _test_serialize_and_parser_vid(self, header, vid, match): + # match_serialize + buf = bytearray() + length = match.serialize(buf, 0) + + cls_ = OFPMatchField._FIELDS_HEADERS.get(header) + fmt = '!HHI' + cls_.pack_str.replace('!', '') + res = unpack_from(fmt, buffer(buf), 0) + + eq_(res[3], vid | ofproto_v1_2.OFPVID_PRESENT) + + # match_parser + res = match.parser(str(buf), 0) + + eq_(res.type, ofproto_v1_2.OFPMT_OXM) + eq_(res.fields[0].header, header) + eq_(res.fields[0].value, vid) + def test_set_vlan_vid(self): header = ofproto_v1_2.OXM_OF_VLAN_VID - value = vid = 0b101010101010 + vid = 0b101010101010 match = OFPMatch() match.set_vlan_vid(vid) - self._test_serialize_and_parser(header, value, match) + self._test_serialize_and_parser_vid(header, vid, match) def test_set_vlan_vid_masked(self): header = ofproto_v1_2.OXM_OF_VLAN_VID_W - value = vid = 0b101010101010 + vid = 0b101010101010 mask = 0xfff match = OFPMatch() match.set_vlan_vid_masked(vid, mask) - self._test_serialize_and_parser(header, value, match) + self._test_serialize_and_parser_vid(header, vid, match) def test_set_vlan_pcp(self): header = ofproto_v1_2.OXM_OF_VLAN_PCP |