summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKONDOH Tasuku <kondoh.tasuku@po.ntts.co.jp>2013-02-26 11:33:37 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2013-02-27 00:23:05 +0900
commit0fab6cdf2f1267c0cedcf874cbaf49b615f8ef77 (patch)
tree6d731870ac9b4a7bb33ff6e4e696518498a7e3e7
parente1c7f737f53141279ffb35d3cedb8c4da7bfa78d (diff)
of1.2: fix OFPErrorExperimenterMsg
- add OFPErrorExperimenterMsg. Signed-off-by: KONDOH Tasuku <kondoh.tasuku@po.ntts.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/ofproto/ofproto_v1_2_parser.py26
-rw-r--r--ryu/tests/unit/ofproto/test_parser_v12.py23
2 files changed, 49 insertions, 0 deletions
diff --git a/ryu/ofproto/ofproto_v1_2_parser.py b/ryu/ofproto/ofproto_v1_2_parser.py
index 21c36a33..61618a88 100644
--- a/ryu/ofproto/ofproto_v1_2_parser.py
+++ b/ryu/ofproto/ofproto_v1_2_parser.py
@@ -69,6 +69,12 @@ class OFPErrorMsg(MsgBase):
@classmethod
def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ type_, = struct.unpack_from('!H', buffer(buf),
+ ofproto_v1_2.OFP_HEADER_SIZE)
+ if type_ == ofproto_v1_2.OFPET_EXPERIMENTER:
+ return OFPErrorExperimenterMsg.parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+
msg = super(OFPErrorMsg, cls).parser(datapath, version, msg_type,
msg_len, xid, buf)
msg.type, msg.code = struct.unpack_from(
@@ -84,6 +90,26 @@ class OFPErrorMsg(MsgBase):
self.buf += self.data
+class OFPErrorExperimenterMsg(MsgBase):
+ def __init__(self, datapath):
+ super(OFPErrorExperimenterMsg, self).__init__(datapath)
+ self.type = None
+ self.exp_type = None
+ self.experimenter = None
+ self.data = None
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ cls.cls_msg_type = msg_type
+ msg = super(OFPErrorExperimenterMsg, cls).parser(
+ datapath, version, msg_type, msg_len, xid, buf)
+ msg.type, msg.exp_type, msg.experimenter = struct.unpack_from(
+ ofproto_v1_2.OFP_ERROR_EXPERIMENTER_MSG_PACK_STR, msg.buf,
+ ofproto_v1_2.OFP_HEADER_SIZE)
+ msg.data = msg.buf[ofproto_v1_2.OFP_ERROR_EXPERIMENTER_SIZE:]
+ return msg
+
+
@_register_parser
@_set_msg_type(ofproto_v1_2.OFPT_ECHO_REQUEST)
class OFPEchoRequest(MsgBase):
diff --git a/ryu/tests/unit/ofproto/test_parser_v12.py b/ryu/tests/unit/ofproto/test_parser_v12.py
index 4055af73..f8580c0e 100644
--- a/ryu/tests/unit/ofproto/test_parser_v12.py
+++ b/ryu/tests/unit/ofproto/test_parser_v12.py
@@ -763,6 +763,29 @@ class TestOFPErrorMsg(unittest.TestCase):
data = 'Error Message.'
self._test_parser(type_, code, data)
+ def test_parser_experimenter(self):
+ type_ = 0xffff
+ exp_type = 1
+ experimenter = 1
+ data = 'Error Experimenter Message.'
+
+ # OFP_ERROR_EXPERIMENTER_MSG_PACK_STR = '!HHI'
+ fmt = ofproto_v1_2.OFP_ERROR_EXPERIMENTER_MSG_PACK_STR
+ buf = self.buf + pack(fmt, type_, exp_type, experimenter) \
+ + data
+
+ res = OFPErrorMsg.parser(object, self.version, self.msg_type,
+ self.msg_len, self.xid, buf)
+
+ eq_(res.version, self.version)
+ eq_(res.msg_type, self.msg_type)
+ eq_(res.msg_len, self.msg_len)
+ eq_(res.xid, self.xid)
+ eq_(res.type, type_)
+ eq_(res.exp_type, exp_type)
+ eq_(res.experimenter, experimenter)
+ eq_(res.data, data)
+
def _test_serialize(self, type_, code, data):
# OFP_ERROR_MSG_PACK_STR = '!HH'
fmt = ofproto_v1_2.OFP_ERROR_MSG_PACK_STR