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
