class ISAKMP_payload_ID(ISAKMP_payload): name = "ISAKMP Identification" fields_desc = [ _ISAKMP_payload_HDR, ByteEnumField("IDtype", 1, ISAKMP_ID_type), ByteEnumField("proto", 0, {0: "Unused"}), ShortEnumField("port", 0, {0: "Unused"}), ConditionalField(IPField("addr4", "127.0.0.1"), lambda pkt: pkt.IDtype in [1, 4, 7]), ConditionalField(IPField("addr4sub", "255.255.255.0"), lambda pkt: pkt.IDtype == 4), ConditionalField(IPField("addr4end", "127.0.0.1"), lambda pkt: pkt.IDtype == 7), ConditionalField(IP6Field("addr6", "::1"), lambda pkt: pkt.IDtype in [5, 6, 8]), ConditionalField(IP6Field("addr6sub", "ffff:ffff:ffff:ffff::"), lambda pkt: pkt.IDtype == 6), ConditionalField(IP6Field("addr6end", "::1"), lambda pkt: pkt.IDtype == 8), ConditionalField( StrLenField("domain", "", length_from=lambda x: x.length - 8), lambda pkt: pkt.IDtype in [2, 3]), ConditionalField( StrLenField("load", "", length_from=lambda x: x.length - 8), lambda pkt: pkt.IDtype in [9, 10, 11] or pkt.IDtype > 12), #ConditionalField(PacketListField("IDlist",... # self-reference, can't define here ]
class IPv6Entry(Packet): name = "IPv6 Entry" fields_desc = [ XByteField("type", None), IP6Field("iface_addr", "::"), IP6Field("addr_origin", "::") ] def extract_padding(self, s): return "", s
class FlowTableEntryMatchSetLyr24(Packet): fields_desc = [ MACField('smac', '00:00:00:00:00:00'), ShortField('ethertype', 0), MACField('dmac', '00:00:00:00:00:00'), BitField('first_prio', 0, 3), BitField('first_cfi', 0, 1), BitField('first_vid', 0, 12), ByteField('ip_protocol', 0), BitField('ip_dscp', 0, 6), BitField('ip_ecn', 0, 2), BitField('cvlan_tag', 0, 1), BitField('svlan_tag', 0, 1), BitField('frag', 0, 1), BitField('ip_version', 0, 4), BitField('tcp_flags', 0, 9), ShortField('tcp_sport', 0), ShortField('tcp_dport', 0), BitField('reserved1', 0, 16), BitField('ipv4_ihl', 0, 4), BitField('l3_ok', 0, 1), BitField('l4_ok', 0, 1), BitField('ipv4_checksum_ok', 0, 1), BitField('l4_checksum_ok', 0, 1), ByteField('ip_ttl_hoplimit', 0), ShortField('udp_sport', 0), ShortField('udp_dport', 0), # Ipv4 and IPv6 fields are edited manually: # Added lambda conditioning # Field names must be different ConditionalField( BitField('src_ip_mask', 0, 128), lambda pkt: pkt.ip_version != 4 and pkt.ip_version != 6), ConditionalField(BitField('reserved', 0, 96), lambda pkt: pkt.ip_version == 4), ConditionalField(IPField("src_ip4", "0.0.0.0"), lambda pkt: pkt.ip_version == 4), ConditionalField(IP6Field("src_ip6", "::"), lambda pkt: pkt.ip_version == 6), ConditionalField( BitField('dst_ip_mask', 0, 128), lambda pkt: pkt.ip_version != 4 and pkt.ip_version != 6), ConditionalField(BitField('reserved', 0, 96), lambda pkt: pkt.ip_version == 4), ConditionalField(IPField("dst_ip4", "0.0.0.0"), lambda pkt: pkt.ip_version == 4), ConditionalField(IP6Field("dst_ip6", "::"), lambda pkt: pkt.ip_version == 6), ]
class SDOption_IP6_SD_EndPoint(_SDPacketBase): name = "IP6 SDEndPoint Option" fields_desc = _MAKE_COMMON_SDOPTION_FIELDS_DESC( SDOPTION_IP6_SDENDPOINT_TYPE, SDOPTION_IP6_SDENDPOINT_LEN) fields_desc += [ IP6Field("addr", "::"), ] + _MAKE_COMMON_IP_SDOPTION_FIELDS_DESC()
class SDOption_IP6_Multicast(_SDPacketBase): name = "IP6 Multicast Option" fields_desc = _MAKE_COMMON_SDOPTION_FIELDS_DESC(SDOPTION_IP6_MCAST_TYPE, SDOPTION_IP6_MCAST_LEN) fields_desc += [ IP6Field("addr", "::"), ] + _MAKE_COMMON_IP_SDOPTION_FIELDS_DESC()
class LLDPManagementAddress(LLDPGeneric): name = "LLDP Management Address" fields_desc = [ BitField("type", 8, 7), BitField("length", None, 9), ByteField("addrlen", None), ByteEnumField("addrsubtype", 1, _LLDPManagementAddress_Subtype), ConditionalField(IPField("ipaddr", "192.168.0.1"), lambda pkt: pkt.addrsubtype == 1), ConditionalField(IP6Field("ip6addr", "2001:db8::1"), lambda pkt: pkt.addrsubtype == 2), ConditionalField(MACField("macaddr", "00:11:22:33:44:55"), lambda pkt: pkt.addrsubtype == 6), ConditionalField( StrLenField("addrval", "", length_from=lambda x: x.addrlen - 1), lambda pkt: pkt.addrsubtype not in [1, 2, 6]), ByteEnumField("ifsubtype", 2, _LLDPManagementAddress_IfSubtype), IntField("ifnumber", 0), FieldLenField("oidlen", None, length_of="oid", fmt="B"), StrLenField("oid", "", length_from=lambda x: x.oidlen) ] def post_build(self, p, pay): # TODO Remove redundant code. LLDPGeneric.post_build() if self.length is None: l = len(p) - 2 p = chr((self.type << 1) ^ (l >> 8)) + chr(l & 0xff) + p[2:] if self.addrlen is None: addrlen = len(p) - 2 - 8 - len(self.oid) + 1 p = p[:2] + struct.pack("B", addrlen) + p[3:] return p + pay
class SAPMSProperty(PacketNoPadded): """SAP Message Server Property packet. Packet containing information about properties. """ name = "SAP Message Server Property" fields_desc = [ StrNullFixedLenField("client", None, 39), IntEnumField("id", 0x00, ms_property_id_values), # MS_PROPERTY_VHOST ConditionalField(ShortEnumKeysField("logon", 0, ms_logon_type_values), lambda pkt:pkt.id in [0x02]), # MS_PROPERTY_IPADR ConditionalField(IPField("address", "0.0.0.0"), lambda pkt:pkt.id in [0x03]), ConditionalField(IP6Field("address6", "::"), lambda pkt:pkt.id in [0x03]), # MS_PROPERTY_PARAM ConditionalField(StrNullField("param", ""), lambda pkt:pkt.id in [0x04]), ConditionalField(StrNullField("value", ""), lambda pkt:pkt.id in [0x04]), # MS_PROPERTY_SERVICE ConditionalField(ShortField("service", 0), lambda pkt:pkt.id in [0x05]), # Release Information fields ConditionalField(StrNullFixedLenField("release", "720", length=9), lambda pkt:pkt.id in [0x07]), ConditionalField(IntField("patchno", 0), lambda pkt:pkt.id in [0x07]), ConditionalField(IntField("supplvl", 0), lambda pkt:pkt.id in [0x07]), ConditionalField(IntField("platform", 0), lambda pkt:pkt.id in [0x07]), ]
class SCTPChunkParamIPv6Addr(Packet): name = "SCTP Chunk Parameter: IPv6 Address" fields_desc = [ ShortEnumField("type", 6, sctpchunkparamtypes), ShortField("len", 20), IP6Field("addr", "::1"), ]
class SAPRFC(Packet): """SAP Remote Function Call packet This packet is used for the Remote Function Call (RFC) protocol. """ name = "SAP Remote Function Call" fields_desc = [ ByteField("version", 3), # If the version is 3, the packet has a size > 88h, versions 1 and 2 are 40h ByteEnumKeysField("req_type", 0, rfc_req_type_values), # Normal client fields (GW_NORMAL_CLIENT) ConditionalField(IPField("address", "0.0.0.0"), lambda pkt:pkt.req_type == 0x03), ConditionalField(IntField("padd1", 0), lambda pkt:pkt.req_type == 0x03), ConditionalField(StrFixedLenPaddedField("service", "", length=10), lambda pkt:pkt.req_type == 0x03), ConditionalField(StrFixedLenField("codepage", "1100", length=4), lambda pkt:pkt.req_type == 0x03), ConditionalField(StrFixedLenField("padd2", "\x00" * 6, length=6), lambda pkt:pkt.req_type == 0x03), ConditionalField(StrFixedLenPaddedField("lu", "", length=8), lambda pkt:pkt.req_type == 0x03), ConditionalField(StrFixedLenPaddedField("tp", "", length=8), lambda pkt:pkt.req_type == 0x03), ConditionalField(StrFixedLenPaddedField("conversation_id", "", length=8), lambda pkt:pkt.req_type == 0x03), ConditionalField(ByteField("appc_header_version", 6), lambda pkt:pkt.req_type == 0x03), ConditionalField(ByteField("accept_info", 0xcb), lambda pkt:pkt.req_type == 0x03), ConditionalField(SignedShortField("idx", -1), lambda pkt:pkt.req_type == 0x03), ConditionalField(IP6Field("address6", "::"), lambda pkt:pkt.req_type == 0x03 and pkt.version == 3), ConditionalField(IntField("rc", 0), lambda pkt:pkt.req_type == 0x03), ConditionalField(ByteField("echo_data", 0), lambda pkt:pkt.req_type == 0x03), ConditionalField(ByteField("filler", 0), lambda pkt:pkt.req_type == 0x03), # Monitor Command fields (GW_SEND_CMD) ConditionalField(ByteEnumKeysField("cmd", 0, rfc_monitor_cmd_values), lambda pkt:pkt.req_type == 0x09), ]
class SAPMSLogon(PacketNoPadded): """SAP Message Server Logon packet. Packet containing logon data. """ name = "SAP Message Server Logon" fields_desc = [ ShortEnumKeysField("type", 0, ms_logon_type_values), ShortField("port", 0), IPField("address", "0.0.0.0"), FieldLenField("logonname_length", None, length_of="logonname", fmt="!H"), # <= 80h bytes StrLenField("logonname", "", length_from=lambda pkt: pkt.logonname_length), FieldLenField("prot_length", None, length_of="prot", fmt="!H"), # <= 80h bytes StrLenField("prot", "", length_from=lambda pkt: pkt.prot_length), FieldLenField("host_length", None, length_of="host", fmt="!H"), # <= 100h bytes StrLenField("host", "", length_from=lambda pkt: pkt.host_length), FieldLenField("misc_length", None, length_of="misc", fmt="!H"), # <= 100h bytes StrLenField("misc", "", length_from=lambda pkt: pkt.misc_length), FieldLenField("address6_length", 16, length_of="address6", fmt="!H"), # == 16 bytes IP6Field("address6", "::"), ]
class SAPMSJ2EECluster(Packet): """SAP Message Server J2EE Cluster packet This packet is used for the Message Server protocol for J2EE cluster nodes. """ name = "SAP Message Server J2EE Cluster" cluster_no = 68199 node_no = 5 cluster_no_id = cluster_no + 100 + 50 + node_no icm_port = 5020 fields_desc = [ IntField("cluster_id", cluster_no_id), IntField("group_id", cluster_no), IntField("join_port", icm_port), StrFixedLenField("name", "J2EE{}".format(cluster_no_id), 32), StrFixedLenField("host", "localhost", 32), IPField("hostaddrv4", "127.0.0.1"), ByteField("type", 0x02), ByteField("state", 0x00), StrFixedLenField("service_mask", 32 * "\xff", 32), ByteField("version", 0x02), ByteField("modifiers", 0x02), StrFixedLenField("reserved", 4 * "\x00", 4), IP6Field("hostaddrv6", "::1") ]
class ISIS_IPv6NeighborAddressSubTlv(ISIS_GenericSubTlv): name = "ISIS IPv6 Neighbor Address (S)" fields_desc = [ ByteEnumField("type", 13, _isis_subtlv_names_1), FieldLenField("len", None, length_of="address", fmt="B"), IP6Field("address", "::") ]
class DNSRR(InheritOriginDNSStrPacket): name = "DNS Resource Record" show_indent = 0 fields_desc = [DNSStrField("rrname", ""), ShortEnumField("type", 1, dnstypes), ShortEnumField("rclass", 1, dnsclasses), IntField("ttl", 0), FieldLenField("rdlen", None, length_of="rdata", fmt="H"), MultipleTypeField( [ # A (IPField("rdata", "0.0.0.0"), lambda pkt: pkt.type == 1), # AAAA (IP6Field("rdata", "::"), lambda pkt: pkt.type == 28), # NS, MD, MF, CNAME, PTR (DNSStrField("rdata", "", length_from=lambda pkt: pkt.rdlen), lambda pkt: pkt.type in [2, 3, 4, 5, 12]), # TEXT (DNSTextField("rdata", [], length_from=lambda pkt: pkt.rdlen), lambda pkt: pkt.type == 16), ], StrLenField("rdata", "", length_from=lambda pkt:pkt.rdlen) )]
class IPFIXHandler(object): """Class for handling IPFIX packets. To use, create instance of class before dissecting IPFIX packets with scapy, then run update_template every time an IPFIX template packet is received.""" template_elements = { 4: ByteField("Protocol_ID", 0x00), 7: ShortField("src_port", 0), 8: IPField("IPv4_src", ""), 11: ShortField("dst_port", 0), 12: IPField("IPv4_dst", ""), 27: IP6Field("IPv6_src", "::"), 28: IP6Field("IPv6_dst", "::"), 86: LongField("packetTotalCount", 0), 180: ShortField("udp_src_port", 0), 181: ShortField("udp_dst_port", 0), 182: ShortField("tcp_src_port", 0), 183: ShortField("tcp_dst_port", 0), 193: ByteField("Next_header", 0x00) } def __init__(self): """Initializer, registers IPFIX header and template layers with scapy. """ bind_layers(UDP, IPFIXHeader, dport=4739) bind_layers(IPFIXHeader, IPFIXTemplate, Set_ID=2) def update_template(self, packet): """Updates IPFIXData class with new data template. Registers IPFIX data layer with scapy using the new template. :param packet: Packet containing an IPFIX template. :type packet: scapy.Ether """ template_list = packet['IPFIX template'].Template template_id = packet['IPFIX template'].Template_ID IPFIXData.fields_desc = [] for item in template_list[::2]: try: IPFIXData.fields_desc.append(self.template_elements[item]) except KeyError: raise KeyError( "Unknown IPFIX template element with ID {0}".format(item)) bind_layers(IPFIXHeader, IPFIXData, Set_ID=template_id) # if the packet doesn't end here, assume it contains more data sets bind_layers(IPFIXData, IPFIXData)
class PCPOptionFilter(PacketNoPayload): name = "PCP Filter Option" fields_desc = [ StrFixedLenField("reserved", "\x00" * 1, 1), ByteField("prefix_len", 0), ShortField("peer_port", 1234), IP6Field("peer_ip", "::ffff:127.0.0.1") ]
class PCPPeer(Packet): name = "PCP Peer" fields_desc = [ StrFixedLenField("nonce", os.urandom(12), 12), ByteEnumField("protocol", ProtocolNumbers.TCP, PROTOCOL_NUMBERS), StrFixedLenField("reserved1", "\x00" * 3, 3), Emph(ShortField("int_port", 1234)), Emph(ShortField("ext_port", 5678)), Emph(IP6Field("ext_ip", "::ffff:127.0.0.1")), Emph(ShortField("peer_port", 9101)), StrFixedLenField("reserved2", "\x00" * 2, 2), Emph(IP6Field("peer_ip", "::ffff:127.0.0.1")), PacketListField("options", None, PCPOption) ] def answers(self, other): return self.nonce == other.nonce
class IE_CharginGatewayAddress(IE_Base): name = "Chargin Gateway Address" fields_desc = [ByteEnumField("ietype", 251, IEType), ShortField("length", 4), ConditionalField(IPField("ipv4_address", "127.0.0.1"), lambda pkt: pkt.length == 4), ConditionalField(IP6Field("ipv6_address", "::1"), lambda pkt: pkt.length == 16)]
class PCPRequest(Packet): name = "PCP Request" fields_desc = [ ByteEnumField("version", PCPVersions.V2, PCP_VERSIONS), BitEnumField("R", PCPMessages.REQUEST, 1, PCP_MESSAGES), BitEnumField("opcode", PCPOpcodes.MAP, 7, PCP_OPCODES), StrFixedLenField("reserved", "\x00" * 2, 2), IntField("lifetime", 0x400), Emph(IP6Field("source_ip", "::ffff:127.0.0.1")) ]
class CDPAddrRecordIPv6(CDPAddrRecord): name = "CDP Address IPv6" fields_desc = [ ByteEnumField("ptype", 0x02, _CDP_addr_record_ptype), FieldLenField("plen", 8, "proto", "B"), StrLenField("proto", _CDP_addrrecord_proto_ipv6, length_from=lambda x: x.plen), ShortField("addrlen", 16), IP6Field("addr", "fe80::1") ]
class ICMPExtensionInterfaceInformation(ICMPExtensionObject): name = 'ICMP Extension Object - Interface Information Object (RFC5837)' fields_desc = [ ShortField('len', None), ByteField('classnum', 2), BitField('interface_role', 0, 2), BitField('reserved', 0, 2), BitField('has_ifindex', 0, 1), BitField('has_ipaddr', 0, 1), BitField('has_ifname', 0, 1), BitField('has_mtu', 0, 1), ConditionalField(IntField('ifindex', None), lambda pkt: pkt.has_ifindex == 1), ConditionalField(ShortField('afi', None), lambda pkt: pkt.has_ipaddr == 1), ConditionalField(ShortField('reserved2', 0), lambda pkt: pkt.has_ipaddr == 1), ConditionalField(IPField('ip4', None), lambda pkt: pkt.afi == 1), ConditionalField(IP6Field('ip6', None), lambda pkt: pkt.afi == 2), ConditionalField( FieldLenField('ifname_len', None, fmt='B', length_of='ifname'), lambda pkt: pkt.has_ifname == 1), ConditionalField( StrLenField('ifname', None, length_from=lambda pkt: pkt.ifname_len), lambda pkt: pkt.has_ifname == 1), ConditionalField(IntField('mtu', None), lambda pkt: pkt.has_mtu == 1) ] def self_build(self, field_pos_list=None): if self.afi is None: if self.ip4 is not None: self.afi = 1 elif self.ip6 is not None: self.afi = 2 if self.has_ifindex and self.ifindex is None: warning('has_ifindex set but ifindex is not set.') if self.has_ipaddr and self.afi is None: warning('has_ipaddr set but afi is not set.') if self.has_ipaddr and self.ip4 is None and self.ip6 is None: warning('has_ipaddr set but ip4 or ip6 is not set.') if self.has_ifname and self.ifname is None: warning('has_ifname set but ifname is not set.') if self.has_mtu and self.mtu is None: warning('has_mtu set but mtu is not set.') return ICMPExtensionObject.self_build(self, field_pos_list=field_pos_list)
class SCTPChunkParamSetPrimaryAddr(_SCTPChunkParam, Packet): fields_desc = [ ShortEnumField("type", 0xc004, sctpchunkparamtypes), FieldLenField("len", None, length_of="addr", adjust = lambda pkt,x:x+12), XIntField("correlation_id", None), ShortEnumField("addr_type", 5, sctpchunkparamtypes), FieldLenField("addr_len", None, length_of="addr", adjust = lambda pkt,x:x+4), ConditionalField( IPField("addr", "127.0.0.1"), lambda p: p.addr_type == 5), ConditionalField( IP6Field("addr", "::1"), lambda p: p.addr_type == 6),]
class OSPFv3_Link_LSA(_OSPF_BaseLSA): name = "OSPFv3 Link LSA" type = 0x0008 fields_desc = [ OSPFv3_LSA_Hdr, ByteField("prio", 1), FlagsField("options", 0, 24, _OSPFv3_options), IP6Field("lladdr", "fe80::"), IntField("prefixes", 0), PacketListField("prefixlist", None, OSPFv3_Prefix_Item, count_from=lambda pkt: pkt.prefixes) ]
class IE_GSNAddress(IE_Base): name = "GSN Address" fields_desc = [ByteEnumField("ietype", 133, IEType), ShortField("length", None), ConditionalField(IPField("ipv4_address", RandIP()), lambda pkt: pkt.length == 4), ConditionalField(IP6Field("ipv6_address", '::1'), lambda pkt: pkt.length == 16)] def post_build(self, p, pay): if self.length is None: tmp_len = len(p) - 3 p = p[:2] + struct.pack("!B", tmp_len) + p[3:] return p
class ISAKMP_payload_NAT_OA(ISAKMP_payload): name = "ISAKMP NAT Original Address" fields_desc = [ _ISAKMP_payload_HDR, ByteEnumField("IDtype", 1, ISAKMP_ID_type), ByteField("res2", 0), ShortField("res3", 0), ConditionalField(IPField("addr4", "127.0.0.1"), lambda pkt: pkt.IDtype == 1), ConditionalField(IP6Field("addr6", "::1"), lambda pkt: pkt.IDtype == 5), ConditionalField( StrLenField("load", "", length_from=lambda x: x.length - 8), lambda pkt: pkt.IDtype not in [1, 5]), ]
class EIGRPv6IntRoute(EIGRPGeneric): name = "EIGRP for IPv6 Internal Route" fields_desc = [ XShortEnumField("type", 0x0402, _EIGRP_tlv_types), FieldLenField("len", None, "dst", "!H", adjust=lambda pkt, x: x + 37), IP6Field("nexthop", "::"), IntField("delay", 128000), IntField("bandwidth", 256000), ThreeBytesField("mtu", 1500), ByteField("hopcount", 1), ByteField("reliability", 255), ByteField("load", 0), XShortField("reserved", 0), ByteField("prefixlen", 16), _EIGRP_IP6Field("dst", "2001::", length_from=lambda pkt: pkt.prefixlen) ]
class IPv6IfaceEntry(Packet): name = "Interface Entry" fields_desc = [ MACField("iface_mac", None), IP6Field("lladdr", "::"), FieldLenField("ipv6_entry_cnt", None, fmt='B', count_of="ipv6_entry_list"), PacketListField("ipv6_entry_list", None, IPv6Entry, count_from=lambda p: p.ipv6_entry_cnt) ] def extract_padding(self, s): return "", s
class OSPFv3_AS_External_LSA(_OSPF_BaseLSA): name = "OSPFv3 AS External LSA" type = 0x4005 fields_desc = [ OSPFv3_LSA_Hdr, FlagsField("flags", 0, 8, ["T", "F", "E"]), XThreeBytesField("metric", 20), ByteField("prefixlen", 64), FlagsField("prefixoptions", 0, 8, _OSPFv3_prefix_options), ShortEnumField("reflstype", 0, _OSPFv3_LStypes), OspfIP6Field("prefix", "2001:db8:0:42::", length_from=lambda pkt: pkt.prefixlen), ConditionalField(IP6Field("fwaddr", "::"), lambda pkt: pkt.flags & 0x02), ConditionalField(IntField("tag", 0), lambda pkt: pkt.flags & 0x01), ConditionalField(IPField("reflsid", 0), lambda pkt: pkt.reflstype != 0) ]
class EIGRPSeq(EIGRPGeneric): name = "EIGRP Sequence" fields_desc = [ XShortEnumField("type", 0x0003, _EIGRP_tlv_types), ShortField("len", None), ByteField("addrlen", 4), ConditionalField(IPField("ipaddr", "192.168.0.1"), lambda pkt: pkt.addrlen == 4), ConditionalField(IP6Field("ip6addr", "fe80::1"), lambda pkt: pkt.addrlen == 16) ] def post_build(self, p, pay): if self.len is None: l = len(p) p = p[:2] + chr((l >> 8) & 0xff) + chr(l & 0xff) + p[4:] return p + pay
class SCTPChunkParamAddIPAddr(_SCTPChunkParam, Packet): fields_desc = [ ShortEnumField("type", 0xc001, sctpchunkparamtypes), FieldLenField("len", None, length_of="addr", adjust=lambda pkt, x: x + 12), XIntField("correlation_id", None), ShortEnumField("addr_type", 5, sctpchunkparamtypes), FieldLenField("addr_len", None, length_of="addr", adjust=lambda pkt, x: x + 4), MultipleTypeField([ (IPField("addr", "127.0.0.1"), lambda p: p.addr_type == 5), (IP6Field("addr", "::1"), lambda p: p.addr_type == 6), ], StrFixedLenField("addr", "", length_from=lambda pkt: pkt.addr_len)) ]
class SAPMSClient3(Packet): """SAP Message Server Client packet version 3 Packet that contains information about a client of the Message Server service. This packet is for version 3. """ name = "SAP Message Server Client version 3" fields_desc = [ StrFixedLenField("client", None, 40), StrFixedLenField("host", None, 64), StrFixedLenField("service", None, 20), FlagsField("msgtype", 0, 8, ["ICM", "ATP", "UP2", "SPO", "BTC", "ENQ", "UPD", "DIA"]), IP6Field("hostaddrv6", "::1"), IPField("hostaddrv4", "0.0.0.0"), ShortField("servno", 0x00), ByteEnumKeysField("status", 0x00, ms_client_status_values), ByteField("nitrace", 0x00), ByteField("padd", 0), ]