OpenFlow Spec 1.5 introduces OXS into flow statistics multipart
and flow aggregate multipart.

This patch fixes these multipart to use OXS.

Signed-off-by: IWASE Yusuke <[email protected]>
---
 ryu/ofproto/ofproto_v1_5_parser.py | 86 +++++++++++++-------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_5_parser.py 
b/ryu/ofproto/ofproto_v1_5_parser.py
index 16f0722..44012e5 100644
--- a/ryu/ofproto/ofproto_v1_5_parser.py
+++ b/ryu/ofproto/ofproto_v1_5_parser.py
@@ -4036,55 +4036,34 @@ class OFPExperimenterStatsReply(OFPMultipartReply):
 
 
 class OFPFlowStats(StringifyMixin):
-    def __init__(self, table_id=None, duration_sec=None, duration_nsec=None,
-                 priority=None, idle_timeout=None, hard_timeout=None,
-                 flags=None, importance=None, cookie=None, packet_count=None,
-                 byte_count=None, match=None, instructions=None,
-                 length=None):
+    def __init__(self, table_id=None, reason=None, priority=None,
+                 match=None, stats=None, length=0):
         super(OFPFlowStats, self).__init__()
-        self.length = 0
+        self.length = length
         self.table_id = table_id
-        self.duration_sec = duration_sec
-        self.duration_nsec = duration_nsec
+        self.reason = reason
         self.priority = priority
-        self.idle_timeout = idle_timeout
-        self.hard_timeout = hard_timeout
-        self.flags = flags
-        self.importance = importance
-        self.cookie = cookie
-        self.packet_count = packet_count
-        self.byte_count = byte_count
         self.match = match
-        self.instructions = instructions
+        self.stats = stats
 
     @classmethod
     def parser(cls, buf, offset):
         flow_stats = cls()
 
-        (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.importance, flow_stats.cookie,
-         flow_stats.packet_count,
-         flow_stats.byte_count) = struct.unpack_from(
+        (flow_stats.length, flow_stats.table_id, flow_stats.reason,
+         flow_stats.priority) = struct.unpack_from(
             ofproto.OFP_FLOW_STATS_0_PACK_STR, buf, offset)
         offset += ofproto.OFP_FLOW_STATS_0_SIZE
 
         flow_stats.match = OFPMatch.parser(buf, offset)
         match_length = utils.round_up(flow_stats.match.length, 8)
-        inst_length = (flow_stats.length - (ofproto.OFP_FLOW_STATS_SIZE -
-                                            ofproto.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
+        stats_length = (flow_stats.length - (ofproto.OFP_FLOW_STATS_0_SIZE +
+                                             match_length))
+        if stats_length > 0:
+            flow_stats.stats = OFPStats.parser(buf, offset)
+
         return flow_stats
 
 
@@ -4179,34 +4158,30 @@ class OFPFlowStatsReply(OFPMultipartReply):
         def flow_stats_reply_handler(self, ev):
             flows = []
             for stat in ev.msg.body:
-                flows.append('table_id=%s '
-                             'duration_sec=%d duration_nsec=%d '
-                             'priority=%d '
-                             'idle_timeout=%d hard_timeout=%d flags=0x%04x '
-                             'importance=%d cookie=%d packet_count=%d '
-                             'byte_count=%d match=%s instructions=%s' %
-                             (stat.table_id,
-                              stat.duration_sec, stat.duration_nsec,
-                              stat.priority,
-                              stat.idle_timeout, stat.hard_timeout,
-                              stat.flags, stat.importance,
-                              stat.cookie, stat.packet_count, stat.byte_count,
-                              stat.match, stat.instructions))
+                flows.append('table_id=%s reason=%d priority=%d '
+                             'match=%s stats=%s' %
+                             (stat.table_id, stat.reason, stat.priority,
+                              stat.match, stat.stats))
             self.logger.debug('FlowStats: %s', flows)
     """
     def __init__(self, datapath, type_=None, **kwargs):
         super(OFPFlowStatsReply, self).__init__(datapath, **kwargs)
 
 
-class OFPAggregateStats(ofproto_parser.namedtuple('OFPAggregateStats', (
-        'packet_count', 'byte_count', 'flow_count'))):
+class OFPAggregateStats(StringifyMixin):
+    def __init__(self, stats=None, length=None):
+        super(OFPAggregateStats, self).__init__()
+        self.stats = stats
+        # Note: length field is specific to this implementation.
+        # It does not have a corresponding field in the specification.
+        self.length = length
+
     @classmethod
     def parser(cls, buf, offset):
-        agg = struct.unpack_from(
-            ofproto.OFP_AGGREGATE_STATS_REPLY_PACK_STR, buf, offset)
-        stats = cls(*agg)
-        stats.length = ofproto.OFP_AGGREGATE_STATS_REPLY_SIZE
-        return stats
+        stats = OFPStats.parser(buf, offset)
+        agg = cls(stats)
+        agg.length = utils.round_up(stats.length, 8)
+        return agg
 
 
 @_set_stats_type(ofproto.OFPMP_AGGREGATE_STATS, OFPAggregateStats)
@@ -4281,10 +4256,7 @@ class OFPAggregateStatsReply(OFPMultipartReply):
         def aggregate_stats_reply_handler(self, ev):
             body = ev.msg.body
 
-            self.logger.debug('AggregateStats: packet_count=%d byte_count=%d '
-                              'flow_count=%d',
-                              body.packet_count, body.byte_count,
-                              body.flow_count)
+            self.logger.debug('AggregateStats: stats=%s', body.stats)
     """
     def __init__(self, datapath, type_=None, **kwargs):
         super(OFPAggregateStatsReply, self).__init__(datapath, **kwargs)
-- 
1.9.1



------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to