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      |    7 +++++++
 ryu/lib/packet/dhcp.py     |   18 ++++++++++++++++--
 ryu/lib/packet/ethernet.py |    6 ++++++
 ryu/lib/packet/icmp.py     |    9 ++++++---
 ryu/lib/packet/icmpv6.py   |   16 +++++++++++++---
 ryu/lib/packet/ipv4.py     |    7 +++++++
 ryu/lib/packet/ipv6.py     |    5 +++++
 ryu/lib/packet/lldp.py     |    3 +--
 ryu/lib/packet/tcp.py      |    4 ++++
 ryu/lib/packet/udp.py      |    3 +++
 ryu/lib/packet/vlan.py     |    3 +++
 ryu/lib/packet/vrrp.py     |   14 ++++++++++++++
 12 files changed, 85 insertions(+), 10 deletions(-)

diff --git a/ryu/lib/packet/arp.py b/ryu/lib/packet/arp.py
index 616ab86..4d2362a 100644
--- a/ryu/lib/packet/arp.py
+++ b/ryu/lib/packet/arp.py
@@ -29,6 +29,7 @@ ARP_REV_REQUEST = 3
 ARP_REV_REPLY = 4


+@packet_base.StringifyMixin.register_str_conversion_rule
 class arp(packet_base.PacketBase):
     """ARP (RFC 826) header encoder/decoder class.

@@ -54,6 +55,12 @@ class arp(packet_base.PacketBase):
     _PACK_STR = '!HHBBH6s4s6s4s'
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'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}
+
     def __init__(self, hwtype=ARP_HW_TYPE_ETHERNET, proto=ether.ETH_TYPE_IP,
                  hlen=6, plen=4, opcode=ARP_REQUEST,
                  src_mac=mac.haddr_to_bin('ff:ff:ff:ff:ff:ff'),
diff --git a/ryu/lib/packet/dhcp.py b/ryu/lib/packet/dhcp.py
index 1783518..800197b 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
@@ -84,6 +87,7 @@ DHCP_REBINDING_TIME_OPT = 59
 DHCP_END_OPT = 255


+@packet_base.StringifyMixin.register_str_conversion_rule
 class dhcp(packet_base.PacketBase):
     """DHCP (RFC 2131) header encoder/decoder class.

@@ -136,6 +140,13 @@ class dhcp(packet_base.PacketBase):
     _DHCP_CHADDR_LEN = 16
     _HARDWARE_TYPE_ETHERNET = 1

+    _STR_CONVERT_RULE = {'ciaddr': ipv4_to_str,
+                         'yiaddr': ipv4_to_str,
+                         'siaddr': ipv4_to_str,
+                         'giaddr': ipv4_to_str,
+                         'chaddr': haddr_to_str,
+                         'xid': lambda value: '0x%x' % value}
+
     def __init__(self, op, chaddr, options, htype=_HARDWARE_TYPE_ETHERNET,
                  hlen=0, hops=0, xid=None, secs=0, flags=0, ciaddr=0, yiaddr=0,
                  siaddr=0, giaddr=0, sname='', boot_file=''):
@@ -190,7 +201,8 @@ class dhcp(packet_base.PacketBase):
                            self.chaddr, self.sname, self.boot_file, seri_opt)


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

     This is used with ryu.lib.packet.dhcp.dhcp.
@@ -216,6 +228,8 @@ class options(object):
     _MAGIC_COOKIE = socket.inet_aton("99.130.83.99")
     _OPT_TAG_LEN_BYTE = 2

+    _STR_CONVERT_RULE = {'magic_cookie': socket.inet_ntoa}
+
     def __init__(self, option_list=None, options_len=0,
                  magic_cookie=_MAGIC_COOKIE):
         super(options, self).__init__()
@@ -250,7 +264,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..faca6ac 100644
--- a/ryu/lib/packet/ethernet.py
+++ b/ryu/lib/packet/ethernet.py
@@ -17,9 +17,11 @@ import struct
 from . import packet_base
 from . import vlan
 from . import mpls
+from ryu.lib.mac import haddr_to_str
 from ryu.ofproto import ether


+@packet_base.StringifyMixin.register_str_conversion_rule
 class ethernet(packet_base.PacketBase):
     """Ethernet header encoder/decoder class.

@@ -38,6 +40,10 @@ class ethernet(packet_base.PacketBase):
     _PACK_STR = '!6s6sH'
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'dst': haddr_to_str,
+                         'src': haddr_to_str,
+                         'ethertype': lambda value: '0x%04x' % value}
+
     def __init__(self, dst, src, ethertype):
         super(ethernet, self).__init__()
         self.dst = dst
diff --git a/ryu/lib/packet/icmp.py b/ryu/lib/packet/icmp.py
index f90f45d..329d4dc 100644
--- a/ryu/lib/packet/icmp.py
+++ b/ryu/lib/packet/icmp.py
@@ -32,6 +32,7 @@ ICMP_PORT_UNREACH_CODE = 3
 ICMP_TTL_EXPIRED_CODE = 0


+@packet_base.StringifyMixin.register_str_conversion_rule
 class icmp(packet_base.PacketBase):
     """ICMP (RFC 792) header encoder/decoder class.

@@ -66,6 +67,8 @@ class icmp(packet_base.PacketBase):
     _MIN_LEN = struct.calcsize(_PACK_STR)
     _ICMP_TYPES = {}

+    _STR_CONVERT_RULE = {'csum': lambda value: '0x%x' % value}
+
     @staticmethod
     def register_icmp_type(*args):
         def _register_icmp_type(cls):
@@ -114,7 +117,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 +167,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 +223,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..c1ed83f 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:
@@ -56,6 +57,7 @@ ICMPV6_NI_REPLY = 140     # node information reply
 ICMPV6_MAXTYPE = 201


+@packet_base.StringifyMixin.register_str_conversion_rule
 class icmpv6(packet_base.PacketBase):
     """ICMPv6 (RFC 2463) header encoder/decoder class.

@@ -79,6 +81,8 @@ class icmpv6(packet_base.PacketBase):
     _MIN_LEN = struct.calcsize(_PACK_STR)
     _ICMPV6_TYPES = {}

+    _STR_CONVERT_RULE = {'csum': lambda value: '0x%x' % value}
+
     @staticmethod
     def register_icmpv6_type(*args):
         def _register_icmpv6_type(cls):
@@ -125,7 +129,8 @@ class icmpv6(packet_base.PacketBase):


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

@@ -163,6 +168,8 @@ class nd_neighbor(object):
     ND_OPTION_RH = 4   # Redirected Header
     ND_OPTION_MTU = 5  # MTU

+    _STR_CONVERT_RULE = {'dst': ipv6_to_str}
+
     @staticmethod
     def register_nd_option_type(*args):
         def _register_nd_option_type(cls):
@@ -209,7 +216,8 @@ 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):
+@packet_base.StringifyMixin.register_str_conversion_rule
+class nd_option_la(packet_base.StringifyMixin):
     """ICMPv6 sub encoder/decoder class for Neighbor discovery
     Source/Target Link-Layer Address Option. (RFC 4861)

@@ -237,6 +245,8 @@ class nd_option_la(object):
     _PACK_STR = '!6s'
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'hw_src': haddr_to_str}
+
     def __init__(self, hw_src, data=None):
         self.hw_src = hw_src
         self.data = data
@@ -261,7 +271,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 16b4698..506196b 100644
--- a/ryu/lib/packet/ipv4.py
+++ b/ryu/lib/packet/ipv4.py
@@ -29,6 +29,7 @@ IPV4_ADDRESS_LEN = struct.calcsize(IPV4_ADDRESS_PACK_STR)
 IPV4_PSEUDO_HEADER_PACK_STR = '!4s4s2xHH'


+@packet_base.StringifyMixin.register_str_conversion_rule
 class ipv4(packet_base.PacketBase):
     """IPv4 (RFC 791) header encoder/decoder class.

@@ -65,6 +66,12 @@ class ipv4(packet_base.PacketBase):
     _PACK_STR = '!BBHHHBBH4s4s'
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'identification': lambda value: '0x%x' % value,
+                         'flags': lambda value: '0x%02x' % value,
+                         'csum': lambda value: '0x%x' % value,
+                         'src': ip.ipv4_to_str,
+                         'dst': ip.ipv4_to_str}
+
     def __init__(self, version=4, header_length=5, tos=0,
                  total_length=0, identification=0, flags=0,
                  offset=0, ttl=255, proto=0, csum=0,
diff --git a/ryu/lib/packet/ipv6.py b/ryu/lib/packet/ipv6.py
index 707a3dd..2e1df73 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


@@ -27,6 +28,7 @@ IPV6_ADDRESS_LEN = struct.calcsize(IPV6_ADDRESS_PACK_STR)
 IPV6_PSEUDO_HEADER_PACK_STR = '!16s16s3xB'


+@packet_base.StringifyMixin.register_str_conversion_rule
 class ipv6(packet_base.PacketBase):
     """IPv6 (RFC 2460) header encoder/decoder class.

@@ -52,6 +54,9 @@ class ipv6(packet_base.PacketBase):
     _PACK_STR = '!IHBB16s16s'
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'src': ipv6_to_str,
+                         'dst': ipv6_to_str}
+
     def __init__(self, version, traffic_class, flow_label, payload_length,
                  nxt, hop_limit, src, dst):
         super(ipv6, self).__init__()
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..94caed4 100644
--- a/ryu/lib/packet/tcp.py
+++ b/ryu/lib/packet/tcp.py
@@ -19,6 +19,7 @@ from . import packet_base
 from . import packet_utils


+@packet_base.StringifyMixin.register_str_conversion_rule
 class tcp(packet_base.PacketBase):
     """TCP (RFC 793) header encoder/decoder class.

@@ -47,6 +48,9 @@ class tcp(packet_base.PacketBase):
     _PACK_STR = '!HHIIBBHHH'
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'bits': lambda value: format(value, '09b'),
+                         'csum': lambda value: '0x%x' % value}
+
     def __init__(self, src_port, dst_port, seq, ack, offset,
                  bits, window_size, csum, urgent, option=None):
         super(tcp, self).__init__()
diff --git a/ryu/lib/packet/udp.py b/ryu/lib/packet/udp.py
index 83cd51a..0855b36 100644
--- a/ryu/lib/packet/udp.py
+++ b/ryu/lib/packet/udp.py
@@ -19,6 +19,7 @@ from . import packet_base
 from . import packet_utils


+@packet_base.StringifyMixin.register_str_conversion_rule
 class udp(packet_base.PacketBase):
     """UDP (RFC 768) header encoder/decoder class.

@@ -41,6 +42,8 @@ class udp(packet_base.PacketBase):
     _PACK_STR = '!HHHH'
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'csum': lambda value: '0x%x' % value}
+
     def __init__(self, src_port, dst_port, total_length=0, csum=0):
         super(udp, self).__init__()
         self.src_port = src_port
diff --git a/ryu/lib/packet/vlan.py b/ryu/lib/packet/vlan.py
index cbd6396..eee434a 100644
--- a/ryu/lib/packet/vlan.py
+++ b/ryu/lib/packet/vlan.py
@@ -24,6 +24,7 @@ from ryu.ofproto import ether
 from ryu.ofproto.ofproto_parser import msg_pack_into


+@packet_base.StringifyMixin.register_str_conversion_rule
 class vlan(packet_base.PacketBase):
     """VLAN (IEEE 802.1Q) header encoder/decoder class.

@@ -44,6 +45,8 @@ class vlan(packet_base.PacketBase):
     _PACK_STR = "!HH"
     _MIN_LEN = struct.calcsize(_PACK_STR)

+    _STR_CONVERT_RULE = {'ethertype': lambda value: '0x%04x' % value}
+
     def __init__(self, pcp=0, cfi=0, vid=0, ethertype=ether.ETH_TYPE_IP):
         super(vlan, self).__init__()
         self.pcp = pcp
diff --git a/ryu/lib/packet/vrrp.py b/ryu/lib/packet/vrrp.py
index e79d758..202e49b 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
@@ -173,6 +175,13 @@ def is_ipv6(ip_address):
     return True


+def ip_addresses_to_str(ip_addresses):
+    to_str = ipv6_to_str if is_ipv6(ip_addresses[0]) else ipv4_to_str
+    ip_str = ', '.join(to_str(ip_addr) for ip_addr in ip_addresses)
+    return '[%s]' % ip_str
+
+
+@packet_base.StringifyMixin.register_str_conversion_rule
 class vrrp(packet_base.PacketBase):
     """The base class for VRRPv2 (RFC 3768) and VRRPv3 (RFC 5798)
     header encoder/decoder classes.
@@ -213,6 +222,9 @@ class vrrp(packet_base.PacketBase):
     _VRRP_VERSIONS = {}
     _SEC_IN_MAX_ADVER_INT_UNIT = {}

+    _STR_CONVERT_RULE = {'checksum': lambda value: '0x%x' % value,
+                         'ip_addresses': ip_addresses_to_str}
+
     @staticmethod
     def get_payload(packet_):
         protocols = packet_.protocols
@@ -400,6 +412,7 @@ class vrrp(packet_base.PacketBase):

 # max_adver_int is in seconds
 @vrrp.register_vrrp_version(VRRP_VERSION_V2, 1)
+@packet_base.StringifyMixin.register_str_conversion_rule
 class vrrpv2(vrrp):
     """VRRPv2 (RFC 3768) header encoder/decoder class.

@@ -508,6 +521,7 @@ class vrrpv2(vrrp):

 # max_adver_int is in centi seconds: 1 second = 100 centiseconds
 @vrrp.register_vrrp_version(VRRP_VERSION_V3, 100)
+@packet_base.StringifyMixin.register_str_conversion_rule
 class vrrpv3(vrrp):
     """VRRPv3 (RFC 5798) header encoder/decoder class.

-- 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