diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-11-22 16:33:23 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-11-23 11:38:05 +0900 |
commit | 91df9a3890c009469efc0eab450308a4ceb1775b (patch) | |
tree | 7f89240aa2a2d53e249b1e4d93dd1d4ab514c14c | |
parent | fad94da2d49618dc7bb009c763f28c3a34d27fc5 (diff) |
of1.3: fix OFPMP_FLOW
FlowStats works now.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/ofproto/ofproto_v1_3_parser.py | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/ryu/ofproto/ofproto_v1_3_parser.py b/ryu/ofproto/ofproto_v1_3_parser.py index bce9dd85..1499ce90 100644 --- a/ryu/ofproto/ofproto_v1_3_parser.py +++ b/ryu/ofproto/ofproto_v1_3_parser.py @@ -1890,7 +1890,7 @@ class OFPMultipartRequest(MsgBase): assert flags == 0 # none yet defined super(OFPMultipartRequest, self).__init__(datapath) - self.type = self.__class__cls.stats_type + self.type = self.__class__.cls_stats_type self.flags = flags def _serialize_stats_body(): @@ -1919,11 +1919,8 @@ class OFPMultipartReply(MsgBase): return cls return _register_stats_type - def __init__(self, datapath, type_, flags): + def __init__(self, datapath): super(OFPMultipartReply, self).__init__(datapath) - self.type = type_ - self.flags = flags - self.body = None @classmethod def parser_stats_body(cls, buf, msg_len, offset): @@ -1948,14 +1945,23 @@ class OFPMultipartReply(MsgBase): @classmethod def parser(cls, datapath, version, msg_type, msg_len, xid, buf): - type_, flags = struct.unpack_from( + msg = super(OFPMultipartReply, cls).parser(datapath, version, msg_type, + msg_len, xid, buf) + msg.type, msg.flags = struct.unpack_from( ofproto_v1_3.OFP_MULTIPART_REPLY_PACK_STR, buffer(buf), ofproto_v1_3.OFP_HEADER_SIZE) - stats_type_cls = cls._STATS_MSG_TYPES.get(type_) - msg = stats_type_cls.parser_stats( - datapath, version, msg_type, msg_len, xid, buf) - msg.type = type_ - msg.flags = flags + stats_type_cls = cls._STATS_MSG_TYPES.get(msg.type) + + offset = ofproto_v1_3.OFP_MULTIPART_REPLY_SIZE + body = [] + while offset < msg_len: + b = stats_type_cls.cls_stats_body_cls.parser(msg.buf, offset) + offset += b.length + + if stats_type_cls.cls_body_single_struct: + msg.body = body[0] + else: + msg.body = body return msg @@ -1995,7 +2001,7 @@ class OFPFlowStats(object): self.priority = None self.idle_timeout = None self.hard_timeout = None - self.flags + self.flags = None self.cookie = None self.packet_count = None self.byte_count = None @@ -2008,19 +2014,32 @@ class OFPFlowStats(object): (flow_stats.length, flow_stats.table_id, flow_stats.duration_sec, flow_stats.duration_nsec, flow_stats.priority, flow_stats.idle_timeout, + flow_stats.hard_timeout, flow_stats.flags, flow_stats.cookie, flow_stats.packet_count, flow_stats.byte_count) = struct.unpack_from( ofproto_v1_3.OFP_FLOW_STATS_0_PACK_STR, buf, offset) offset += ofproto_v1_3.OFP_FLOW_STATS_0_SIZE - flow_stats.match = OFPMatch.parse(buf, offset) + flow_stats.match = OFPMatch.parser(buf, offset) + match_length = utils.round_up(flow_stats.match.length, 8) + inst_length = (flow_stats.length - (ofproto_v1_3.OFP_FLOW_STATS_SIZE - + ofproto_v1_3.OFP_MATCH_SIZE + + match_length)) + offset += match_length + instructions = [] + while inst_length > 0: + inst = OFPInstruction.parser(buf, offset) + instructions.append(inst) + offset += inst.len + inst_length -= inst.len + flow_stats.instructions = instructions return flow_stats class OFPFlowStatsRequestBase(OFPMultipartRequest): def __init__(self, datapath, flags, table_id, out_port, out_group, - cookie, cookie_mask): + cookie, cookie_mask, match): super(OFPFlowStatsRequestBase, self).__init__(datapath, flags) self.table_id = table_id self.out_port = out_port @@ -2035,7 +2054,7 @@ class OFPFlowStatsRequestBase(OFPMultipartRequest): self.buf, offset, self.table_id, self.out_port, self.out_group, self.cookie, self.cookie_mask) - offset += OFP_FLOWSTAT_REQUEST_0_SIZE + offset += ofproto_v1_3.OFP_FLOW_STATS_REQUEST_0_SIZE self.match.serialize(self.buf, offset) @@ -2043,10 +2062,10 @@ class OFPFlowStatsRequestBase(OFPMultipartRequest): @_set_msg_type(ofproto_v1_3.OFPT_MULTIPART_REQUEST) class OFPFlowStatsRequest(OFPFlowStatsRequestBase): def __init__(self, datapath, flags, table_id, out_port, out_group, - cookie, cookie_mask): - super(OFPFlowStatsRequest, self).__init__(datapath, table_id, + cookie, cookie_mask, match): + super(OFPFlowStatsRequest, self).__init__(datapath, flags, table_id, out_port, out_group, - cookie, cookie_mask) + cookie, cookie_mask, match) @OFPMultipartReply.register_stats_type() |