summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSimon Horman <horms@verge.net.au>2014-01-29 12:05:51 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2014-01-29 12:42:53 +0900
commit19ff713d2c30373dfcaba7f2b037b16c274d5485 (patch)
treecfaa9a2b5d4c11863fd87721bb52b7e299883a14
parente7882b9b319e2a9a88daf12d0573abdf58a4d54a (diff)
Add OF1.4 multipart experimenter request and reply message support
Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/ofproto/ofproto_v1_4_parser.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/ryu/ofproto/ofproto_v1_4_parser.py b/ryu/ofproto/ofproto_v1_4_parser.py
index 980f2016..03aa12d0 100644
--- a/ryu/ofproto/ofproto_v1_4_parser.py
+++ b/ryu/ofproto/ofproto_v1_4_parser.py
@@ -845,6 +845,97 @@ class OFPPortDescStatsReply(OFPMultipartReply):
super(OFPPortDescStatsReply, self).__init__(datapath, **kwargs)
+class OFPExperimenterMultipart(ofproto_parser.namedtuple(
+ 'OFPExperimenterMultipart',
+ ('experimenter', 'exp_type', 'data'))):
+ """
+ The body of OFPExperimenterStatsReply multipart messages.
+
+ ================ ======================================================
+ Attribute Description
+ ================ ======================================================
+ experimenter Experimenter ID
+ exp_type Experimenter defined
+ data Experimenter defined additional data
+ ================ ======================================================
+ """
+
+ @classmethod
+ def parser(cls, buf, offset):
+ args = struct.unpack_from(
+ ofproto.OFP_EXPERIMENTER_MULTIPART_HEADER_PACK_STR, buf,
+ offset)
+ args = list(args)
+ args.append(buf[offset +
+ ofproto.OFP_EXPERIMENTER_MULTIPART_HEADER_SIZE:])
+ stats = cls(*args)
+ stats.length = ofproto.OFP_METER_FEATURES_SIZE
+ return stats
+
+ def serialize(self):
+ buf = bytearray()
+ msg_pack_into(ofproto.OFP_EXPERIMENTER_MULTIPART_HEADER_PACK_STR,
+ buf, 0,
+ self.experimenter, self.exp_type)
+ return buf + self.data
+
+
+class OFPExperimenterStatsRequestBase(OFPMultipartRequest):
+ def __init__(self, datapath, flags,
+ experimenter, exp_type,
+ type_=None):
+ super(OFPExperimenterStatsRequestBase, self).__init__(datapath, flags)
+ self.experimenter = experimenter
+ self.exp_type = exp_type
+
+
+@_set_stats_type(ofproto.OFPMP_EXPERIMENTER, OFPExperimenterMultipart)
+@_set_msg_type(ofproto.OFPT_MULTIPART_REQUEST)
+class OFPExperimenterStatsRequest(OFPExperimenterStatsRequestBase):
+ """
+ Experimenter multipart request message
+
+ ================ ======================================================
+ Attribute Description
+ ================ ======================================================
+ flags Zero or ``OFPMPF_REQ_MORE``
+ experimenter Experimenter ID
+ exp_type Experimenter defined
+ data Experimenter defined additional data
+ ================ ======================================================
+ """
+ def __init__(self, datapath, flags,
+ experimenter, exp_type, data,
+ type_=None):
+ super(OFPExperimenterStatsRequest, self).__init__(datapath, flags,
+ experimenter,
+ exp_type, type_)
+ self.data = data
+
+ def _serialize_stats_body(self):
+ body = OFPExperimenterMultipart(experimenter=self.experimenter,
+ exp_type=self.exp_type,
+ data=self.data)
+ self.buf += body.serialize()
+
+
+@OFPMultipartReply.register_stats_type(body_single_struct=True)
+@_set_stats_type(ofproto.OFPMP_EXPERIMENTER, OFPExperimenterMultipart)
+@_set_msg_type(ofproto.OFPT_MULTIPART_REPLY)
+class OFPExperimenterStatsReply(OFPMultipartReply):
+ """
+ Experimenter multipart reply message
+
+ ================ ======================================================
+ Attribute Description
+ ================ ======================================================
+ body An ``OFPExperimenterMultipart`` instance
+ ================ ======================================================
+ """
+ def __init__(self, datapath, type_=None, **kwargs):
+ super(OFPExperimenterStatsReply, self).__init__(datapath, **kwargs)
+
+
class OFPFlowStats(StringifyMixin):
def __init__(self, table_id=None, duration_sec=None, duration_nsec=None,
priority=None, idle_timeout=None, hard_timeout=None,