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
