Add an individual conversion process.
Some class inherits packet_base.StringifyMixin

and, remove class variable 'tlvs' (not used as class variable
and interferes to string) from lldp.lldp



Signed-off-by: WATANABE Fumitaka <[email protected]>
---
 ryu/lib/packet/arp.py      |    8 ++++++++
 ryu/lib/packet/dhcp.py     |   20 ++++++++++++++++++--
 ryu/lib/packet/ethernet.py |    7 +++++++
 ryu/lib/packet/icmp.py     |   10 +++++++---
 ryu/lib/packet/icmpv6.py   |   19 ++++++++++++++++---
 ryu/lib/packet/ipv4.py     |    8 ++++++++
 ryu/lib/packet/ipv6.py     |    6 ++++++
 ryu/lib/packet/lldp.py     |    3 +--
 ryu/lib/packet/tcp.py      |    5 +++++
 ryu/lib/packet/udp.py      |    4 ++++
 ryu/lib/packet/vlan.py     |    4 ++++
 ryu/lib/packet/vrrp.py     |   12 ++++++++++++
 12 files changed, 96 insertions(+), 10 deletions(-)

diff --git a/ryu/lib/packet/arp.py b/ryu/lib/packet/arp.py
index b6266df..0e0efb2 100644
--- a/ryu/lib/packet/arp.py
+++ b/ryu/lib/packet/arp.py
@@ -71,6 +71,14 @@ class arp(packet_base.PacketBase):
         self.dst_mac = dst_mac
         self.dst_ip = dst_ip

+        # for string conversion
+        convert_list = {'proto': lambda value: '0x%04x' % value,
+                        'src_mac': mac.haddr_to_str,
+                        'src_ip': ip.ipv4_to_str,
+                        'dst_mac': mac.haddr_to_str,
+                        'dst_ip': ip.ipv4_to_str}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         (hwtype, proto, hlen, plen, opcode, src_mac, src_ip,
diff --git a/ryu/lib/packet/dhcp.py b/ryu/lib/packet/dhcp.py
index 1783518..1049e7d 100644
--- a/ryu/lib/packet/dhcp.py
+++ b/ryu/lib/packet/dhcp.py
@@ -58,6 +58,9 @@ import socket
 import struct

 from . import packet_base
+from ryu.lib.ip import ipv4_to_str
+from ryu.lib.mac import haddr_to_str
+

 DHCP_BOOT_REQUEST = 1
 DHCP_BOOT_REPLY = 2
@@ -162,6 +165,15 @@ class dhcp(packet_base.PacketBase):
         self.boot_file = boot_file
         self.options = options

+        # for string conversion
+        convert_list = {'ciaddr': ipv4_to_str,
+                        'yiaddr': ipv4_to_str,
+                        'siaddr': ipv4_to_str,
+                        'giaddr': ipv4_to_str,
+                        'chaddr': haddr_to_str,
+                        'xid': hex}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         (op, htype, hlen) = struct.unpack_from(cls._HLEN_UNPACK_STR, buf)
@@ -190,7 +202,7 @@ class dhcp(packet_base.PacketBase):
                            self.chaddr, self.sname, self.boot_file, seri_opt)


-class options(object):
+class options(packet_base.StringifyMixin):
     """DHCP (RFC 2132) options encoder/decoder class.

     This is used with ryu.lib.packet.dhcp.dhcp.
@@ -226,6 +238,10 @@ class options(object):
         self.options_len = options_len
         self.magic_cookie = magic_cookie

+        # for string conversion
+        convert_list = {'magic_cookie': socket.inet_ntoa}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         opt_parse_list = []
@@ -250,7 +266,7 @@ class options(object):
         return seri_opt


-class option(object):
+class option(packet_base.StringifyMixin):
     """DHCP (RFC 2132) options encoder/decoder class.

     This is used with ryu.lib.packet.dhcp.dhcp.options.
diff --git a/ryu/lib/packet/ethernet.py b/ryu/lib/packet/ethernet.py
index 3db0e16..97a0a54 100644
--- a/ryu/lib/packet/ethernet.py
+++ b/ryu/lib/packet/ethernet.py
@@ -17,6 +17,7 @@ import struct
 from . import packet_base
 from . import vlan
 from . import mpls
+from ryu.lib import mac
 from ryu.ofproto import ether


@@ -44,6 +45,12 @@ class ethernet(packet_base.PacketBase):
         self.src = src
         self.ethertype = ethertype

+        # for string conversion
+        convert_list = {'dst': mac.haddr_to_str,
+                        'src': mac.haddr_to_str,
+                        'ethertype': lambda value: '0x%04x' % value}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         dst, src, ethertype = struct.unpack_from(cls._PACK_STR, buf)
diff --git a/ryu/lib/packet/icmp.py b/ryu/lib/packet/icmp.py
index f90f45d..33922a7 100644
--- a/ryu/lib/packet/icmp.py
+++ b/ryu/lib/packet/icmp.py
@@ -81,6 +81,10 @@ class icmp(packet_base.PacketBase):
         self.csum = csum
         self.data = data

+        # for string conversion
+        convert_list = {'csum': hex}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         (type_, code, csum) = struct.unpack_from(cls._PACK_STR, buf)
@@ -114,7 +118,7 @@ class icmp(packet_base.PacketBase):


 @icmp.register_icmp_type(ICMP_ECHO_REPLY, ICMP_ECHO_REQUEST)
-class echo(object):
+class echo(packet_base.StringifyMixin):
     """ICMP sub encoder/decoder class for Echo and Echo Reply messages.

     This is used with ryu.lib.packet.icmp.icmp for
@@ -164,7 +168,7 @@ class echo(object):


 @icmp.register_icmp_type(ICMP_DEST_UNREACH)
-class dest_unreach(object):
+class dest_unreach(packet_base.StringifyMixin):
     """ICMP sub encoder/decoder class for Destination Unreachable Message.

     This is used with ryu.lib.packet.icmp.icmp for
@@ -220,7 +224,7 @@ class dest_unreach(object):


 @icmp.register_icmp_type(ICMP_TIME_EXCEEDED)
-class TimeExceeded(object):
+class TimeExceeded(packet_base.StringifyMixin):
     """ICMP sub encoder/decoder class for Time Exceeded Message.

     This is used with ryu.lib.packet.icmp.icmp for
diff --git a/ryu/lib/packet/icmpv6.py b/ryu/lib/packet/icmpv6.py
index 3419108..fbd6338 100644
--- a/ryu/lib/packet/icmpv6.py
+++ b/ryu/lib/packet/icmpv6.py
@@ -20,6 +20,7 @@ import binascii

 from . import packet_base
 from . import packet_utils
+from ryu.lib.ip import ipv6_to_str
 from ryu.lib.mac import haddr_to_bin, haddr_to_str

 ICMPV6_DST_UNREACH = 1       # dest unreachable, codes:
@@ -94,6 +95,10 @@ class icmpv6(packet_base.PacketBase):
         self.csum = csum
         self.data = data

+        # for string conversion
+        convert_list = {'csum': hex}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         (type_, code, csum) = struct.unpack_from(cls._PACK_STR, buf)
@@ -125,7 +130,7 @@ class icmpv6(packet_base.PacketBase):


 @icmpv6.register_icmpv6_type(ND_NEIGHBOR_SOLICIT, ND_NEIGHBOR_ADVERT)
-class nd_neighbor(object):
+class nd_neighbor(packet_base.StringifyMixin):
     """ICMPv6 sub encoder/decoder class for Neighbor Solicitation and
     Neighbor Advertisement messages. (RFC 4861)

@@ -178,6 +183,10 @@ class nd_neighbor(object):
         self.length = length
         self.data = data

+        # for string conversion
+        convert_list = {'dst': ipv6_to_str}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf, offset):
         (res, dst) = struct.unpack_from(cls._PACK_STR, buf, offset)
@@ -209,7 +218,7 @@ class nd_neighbor(object):

 @nd_neighbor.register_nd_option_type(nd_neighbor.ND_OPTION_SLA,
                                      nd_neighbor.ND_OPTION_TLA)
-class nd_option_la(object):
+class nd_option_la(packet_base.StringifyMixin):
     """ICMPv6 sub encoder/decoder class for Neighbor discovery
     Source/Target Link-Layer Address Option. (RFC 4861)

@@ -241,6 +250,10 @@ class nd_option_la(object):
         self.hw_src = hw_src
         self.data = data

+        # for string conversion
+        convert_list = {'hw_src': haddr_to_str}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf, offset):
         (hw_src, ) = struct.unpack_from(cls._PACK_STR, buf, offset)
@@ -261,7 +274,7 @@ class nd_option_la(object):


 @icmpv6.register_icmpv6_type(ICMPV6_ECHO_REPLY, ICMPV6_ECHO_REQUEST)
-class echo(object):
+class echo(packet_base.StringifyMixin):
     """ICMPv6 sub encoder/decoder class for Echo Request and Echo Reply
     messages.

diff --git a/ryu/lib/packet/ipv4.py b/ryu/lib/packet/ipv4.py
index cc82a5d..96e0164 100644
--- a/ryu/lib/packet/ipv4.py
+++ b/ryu/lib/packet/ipv4.py
@@ -86,6 +86,14 @@ class ipv4(packet_base.PacketBase):
         self.dst = dst
         self.option = option

+        # for string conversion
+        convert_list = {'identification': hex,
+                        'flags': lambda value: '0x%02x' % value,
+                        'csum': hex,
+                        'src': ip.ipv4_to_str,
+                        'dst': ip.ipv4_to_str}
+        self.register_str_options(convert_list)
+
     def __len__(self):
         return self.header_length * 4

diff --git a/ryu/lib/packet/ipv6.py b/ryu/lib/packet/ipv6.py
index 707a3dd..5e8f933 100644
--- a/ryu/lib/packet/ipv6.py
+++ b/ryu/lib/packet/ipv6.py
@@ -19,6 +19,7 @@ from . import packet_base
 from . import packet_utils
 from . import icmpv6
 from . import tcp
+from ryu.lib.ip import ipv6_to_str
 from ryu.ofproto import inet


@@ -64,6 +65,11 @@ class ipv6(packet_base.PacketBase):
         self.src = src
         self.dst = dst

+        # for string conversion
+        convert_list = {'src': ipv6_to_str,
+                        'dst': ipv6_to_str}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         (v_tc_flow, payload_length, nxt, hlim, src, dst) = struct.unpack_from(
diff --git a/ryu/lib/packet/lldp.py b/ryu/lib/packet/lldp.py
index 0c6dc03..d1de172 100644
--- a/ryu/lib/packet/lldp.py
+++ b/ryu/lib/packet/lldp.py
@@ -70,7 +70,7 @@ LLDP_TLV_MANAGEMENT_ADDRESS = 8         # Management Address
 LLDP_TLV_ORGANIZATIONALLY_SPECIFIC = 127  # organizationally Specific TLVs


-class LLDPBasicTLV(object):
+class LLDPBasicTLV(packet_base.StringifyMixin):
     _LEN_MIN = 0
     _LEN_MAX = 511
     tlv_type = None
@@ -106,7 +106,6 @@ class LLDPBasicTLV(object):

 class lldp(packet_base.PacketBase):
     _tlv_parsers = {}
-    tlvs = []

     def __init__(self, tlvs):
         super(lldp, self).__init__()
diff --git a/ryu/lib/packet/tcp.py b/ryu/lib/packet/tcp.py
index e9982b4..cc5efb3 100644
--- a/ryu/lib/packet/tcp.py
+++ b/ryu/lib/packet/tcp.py
@@ -61,6 +61,11 @@ class tcp(packet_base.PacketBase):
         self.urgent = urgent
         self.option = option

+        # for string conversion
+        convert_list = {'bits': lambda value: format(value, '09b'),
+                        'csum': hex}
+        self.register_str_options(convert_list)
+
     def __len__(self):
         return self.offset * 4

diff --git a/ryu/lib/packet/udp.py b/ryu/lib/packet/udp.py
index 83cd51a..922bd3d 100644
--- a/ryu/lib/packet/udp.py
+++ b/ryu/lib/packet/udp.py
@@ -48,6 +48,10 @@ class udp(packet_base.PacketBase):
         self.total_length = total_length
         self.csum = csum

+        # for string conversion
+        convert_list = {'csum': hex}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         (src_port, dst_port, total_length, csum) = struct.unpack_from(
diff --git a/ryu/lib/packet/vlan.py b/ryu/lib/packet/vlan.py
index 913d7cd..fb72461 100644
--- a/ryu/lib/packet/vlan.py
+++ b/ryu/lib/packet/vlan.py
@@ -50,6 +50,10 @@ class vlan(packet_base.PacketBase):
         self.vid = vid
         self.ethertype = ethertype

+        # for string conversion
+        convert_list = {'ethertype': lambda value: '0x%04x' % value}
+        self.register_str_options(convert_list)
+
     @classmethod
     def parser(cls, buf):
         tci, ethertype = struct.unpack_from(cls._PACK_STR, buf)
diff --git a/ryu/lib/packet/vrrp.py b/ryu/lib/packet/vrrp.py
index 6330dc5..4a6d97c 100644
--- a/ryu/lib/packet/vrrp.py
+++ b/ryu/lib/packet/vrrp.py
@@ -70,6 +70,8 @@ VRRP v3 packet format
 import netaddr
 import struct

+from ryu.lib.ip import ipv4_to_str
+from ryu.lib.ip import ipv6_to_str
 from ryu.lib.packet import ethernet
 from ryu.lib.packet import ipv4
 from ryu.lib.packet import ipv6
@@ -272,6 +274,11 @@ class vrrp(packet_base.PacketBase):
         self._is_ipv6 = is_ipv6(self.ip_addresses[0])
         self.identification = 0         # used for ipv4 identification

+        # for string conversion
+        convert_list = {'checksum': hex,
+                        'ip_addresses': self._ip_addresses_to_str}
+        self.register_str_options(convert_list=convert_list)
+
     def checksum_ok(self, ipvx, vrrp_buf):
         cls_ = self._VRRP_VERSIONS[self.version]
         return cls_.checksum_ok(self, ipvx, vrrp_buf)
@@ -398,6 +405,11 @@ class vrrp(packet_base.PacketBase):
             return False
         return cls.is_valid(self)

+    def _ip_addresses_to_str(self, ip_addresses):
+        to_str = ipv6_to_str if self.is_ipv6 else ipv4_to_str
+        ip_str = ', '.join(to_str(ip_addr) for ip_addr in ip_addresses)
+        return '[%s]' % ip_str
+

 # max_adver_int is in seconds
 @vrrp.register_vrrp_version(VRRP_VERSION_V2, 1)
-- 1.7.10.4




------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to