diff options
author | YAMAMOTO Takashi <yamamoto@valinux.co.jp> | 2013-11-12 18:05:30 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2013-11-12 19:19:04 +0900 |
commit | 32fff077b33ea87ccf03aef9ba54904c3c20a34b (patch) | |
tree | e2d0dac0941ea929e2cd0b9f27cae899045e05e3 | |
parent | a8750a2abe7bd2b09ee68ffe7c31c836344e9687 (diff) |
of13: implement OFPMP_EXPERIMENTER request and reply
Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/ofproto/ofproto_v1_3_parser.py | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/ryu/ofproto/ofproto_v1_3_parser.py b/ryu/ofproto/ofproto_v1_3_parser.py index 95ee2916..4e5cc9e9 100644 --- a/ryu/ofproto/ofproto_v1_3_parser.py +++ b/ryu/ofproto/ofproto_v1_3_parser.py @@ -5179,7 +5179,80 @@ class OFPPortDescStatsReply(OFPMultipartReply): super(OFPPortDescStatsReply, self).__init__(datapath, **kwargs) -# TODO: OFPMP_EXPERIMENTER +# XXX should this allow different interpretations for request and reply? +class OFPExperimenterMultipart(ofproto_parser.namedtuple( + 'OFPExperimenterMultipart', + ('experimenter', 'exp_type', 'data'))): + """ + The body of OFPExperimenterStatsRequest/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_v1_3.OFP_EXPERIMENTER_MULTIPART_HEADER_PACK_STR, buf, + offset) + args = list(args) + args.append(buf[offset + + ofproto_v1_3.OFP_EXPERIMENTER_MULTIPART_HEADER_SIZE:]) + stats = cls(*args) + stats.length = ofproto_v1_3.OFP_METER_FEATURES_SIZE + return stats + + def serialize(self): + buf = bytearray() + msg_pack_into(ofproto_v1_3.OFP_EXPERIMENTER_MULTIPART_HEADER_PACK_STR, + buf, 0, + self.experimenter, self.exp_type) + return buf + self.data + + +@_set_stats_type(ofproto_v1_3.OFPMP_EXPERIMENTER, OFPExperimenterMultipart) +@_set_msg_type(ofproto_v1_3.OFPT_MULTIPART_REQUEST) +class OFPExperimenterStatsRequest(OFPMultipartRequest): + """ + Experimenter multipart request message + + ================ ====================================================== + Attribute Description + ================ ====================================================== + flags Zero or ``OFPMPF_REQ_MORE`` + body An ``OFPExperimenterMultipart`` instance + ================ ====================================================== + """ + def __init__(self, datapath, flags, body, type_=None): + super(OFPExperimenterStatsRequest, self).__init__(datapath, flags) + self.body = body + + def _serialize_stats_body(self): + bin_body = self.body.serialize() + self.buf += bin_body + + +@OFPMultipartReply.register_stats_type(body_single_struct=True) +@_set_stats_type(ofproto_v1_3.OFPMP_EXPERIMENTER, OFPExperimenterMultipart) +@_set_msg_type(ofproto_v1_3.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) @_set_msg_type(ofproto_v1_3.OFPT_BARRIER_REQUEST) |