#!/usr/bin/python ############################################################################# # Copyright (C) 2011 Spidcom ############################################################################# from scapy.all import Packet from scapy.fields import * from commonfields import * from common import HPAV_CCO_LEVEL, HPAV_RESULT from scammer import MMEPayload class CC_WHO_RU_REQ (MMEPayload): """Handles the CC_WHO_RU.REQ MME.""" name = "HomePlug AV CC_WHO_RU.REQ""" fields_desc = [ HPAVNIDField ("nid", 0), ] class CC_WHO_RU_CNF (MMEPayload): """Handles the CC_WHO_RU.CNF MME.""" name = "HomePlug AV CC_WHO_RU.CNF""" fields_desc = [ HPAVNIDField ("nid", 0), MACField ("mac", ETHER_ANY), StrFixedLenField ("hfid", 0, 64), ] class CC_LEAVE_REQ (MMEPayload): """Handles the CC_LEAVE.REQ MME.""" name = "HomePlug AV CC_LEAVE.REQ""" fields_desc = [ ByteEnumField ("reason", 0, { 0: "USER_REQUEST", 1: "POWER_DOWN", }), ] class CC_LEAVE_CNF (MMEPayload): """Handles the CC_LEAVE.CNF MME.""" name = "HomePlug AV CC_LEAVE.CNF""" fields_desc = [ ] class CC_LEAVE_IND (MMEPayload): """Handles the CC_LEAVE.IND MME.""" name = "HomePlug AV CC_LEAVE.IND""" fields_desc = [ XByteField ("reason", 0), HPAVNIDField ("nid", 0), ] class CC_LEAVE_RSP (MMEPayload): """Handles the CC_LEAVE.RSP MME.""" name = "HomePlug AV CC_LEAVE.RSP""" fields_desc = [ ] class CC_HANDOVER_REQ (MMEPayload): """Handles the CC_HANDOVER.REQ MME.""" name = "HomePlug AV CC_HANDOVER.REQ""" fields_desc = [ ByteEnumField ("soft_hard", 0, { 0: "SOFT", 1: "HARD", }), ByteEnumField ("reason", 0, { 0x00: "USER_APPOINTED", 0x01: "CCO_SELECTION", 0x02: "CCO_LEAVING", }), ] class CC_HANDOVER_CNF (MMEPayload): """Handles the CC_HANDOVER.CNF MME.""" name = "HomePlug AV CC_HANDOVER.CNF""" fields_desc = [ ByteEnumField ("result", 0, { 0: "ACCEPT", 1: "REJECT_SOFT_HANDOVER", 2: "REJECT_ANY_HANDOVER", }), ] class CC_HANDOVER_INFO_IND_sta_info (Packet): """Handles the CC_HANDOVER_INFO.IND MME.""" name = "HomePlug AV CC_HANDOVER_INFO.IND." fields_desc = [ ByteField ("tei", 0), MACField ("mac", 0), ByteEnumField ("status", 0, { 0: "ASSOCIATED", 1: "AUTHENTICATED", }), ByteField ("ptei", 0), ] def extract_padding(self, s): return "",s class CC_HANDOVER_INFO_IND (MMEPayload): """Handles the CC_HANDOVER_INFO.IND MME.""" name = "HomePlug AV CC_HANDOVER_INFO.IND" fields_desc = [ ByteEnumField ("rsc", 0, { 0: "HOIP", 1: "UPDATE_BCCO", }), ByteField ("backupcco", 0), FieldLenField("num", None, count_of="stas",fmt="B"), PacketListField ("stas", None, CC_HANDOVER_INFO_IND_sta_info, count_from=lambda p: p.num), ] class CC_HANDOVER_INFO_RSP (MMEPayload): """Handles the CC_HANDOVER_INFO.RSP MME.""" name = "HomePlug AV CC_HANDOVER_INFO.RSP" fields_desc = [ ] class CC_SET_TEI_MAP_REQ (MMEPayload): """Handles the CC_SET_TEI_MAP.REQ MME.""" name = "HomePlug AV CC_SET_TEI_MAP.REQ" fields_desc = [ ] class CC_SET_TEI_MAP_IND_station (Packet): """Handle the station description within the CC_SET_TEI_MAP.IND.""" fields_desc = [ ByteField ("tei", 0), MACField ("mac", 0), ByteEnumField ("status", 0, { 0: "ASSOCIATED", 1: "AUTHENTICATED", 2: "DISASSOCIATED", }), ] def extract_padding(self, s): return "",s class CC_SET_TEI_MAP_IND (MMEPayload): """Handles the CC_SET_TEI_MAP.IND MME.""" name = "HomePlug AV CC_SET_TEI_MAP.IND" fields_desc = [ ByteEnumField ("mode", 0, { 0: "UPDATE", 1: "ADD", 2: "DELETE", }), FieldLenField("num", None, count_of="stations",fmt="B"), PacketListField ("stations", None, CC_SET_TEI_MAP_IND_station, count_from = lambda p: p.num), ] class CC_ASSOC_REQ (MMEPayload): """Handles the CC_ASSOC.REQ MME.""" name = "HomePlug AV CC_ASSOC.REQ" fields_desc = [ ByteEnumField ("reqtype", 0, { 0: "NEW", 1: "RENEW", }), HPAVNIDField ("nid", 0), ByteEnumField ("cco_cap", 0, HPAV_CCO_LEVEL), ByteField ("proxy_cap", 0) ] class CC_ASSOC_CNF (MMEPayload): """Handles the CC_ASSOC.CNF MME.""" name = "HomePlug AV CC_ASSOC.CNF" fields_desc = [ ByteEnumField ("result", 0, HPAV_RESULT), HPAVNIDField ("nid", 0), ByteField ("snid", 0), ByteField ("stei", 0), LEShortField ("tei_lease", 0), ] class CC_DISCOVER_LIST_REQ (MMEPayload): """Handles the CC_DISCOVER_LIST.REQ MME.""" name = "HomePlug AV CC_DISCOVER_LIST.REQ" fields_desc = [ ] class CC_DISCOVER_LIST_CNF_stations (Packet): """Handle a CC_DISCOVER_LIST.CNF StationInfo entry.""" name = "HomePlug AV CC_DISCOVER_LIST.CNF StationInfo entry" fields_desc = [ MACField ("mac", 0), ByteField ("tei", 0), ByteField ("same_network", 0), ByteField ("snid", 0), BitField ("reserved", 0, 1), BitField ("cco_cap", 0, 2), BitField ("pco_cap", 0, 1), BitField ("bcco_cap", 0, 1), BitField ("cco_status", 0, 1), BitField ("pco_status", 0, 1), BitField ("bcco_status", 0, 1), ByteField ("signal_level", 0), ByteField ("average_ble", 0), ] def extract_padding(self, s): return "", s class CC_DISCOVER_LIST_CNF_networks (Packet): """Handle a CC_DISCOVER_LIST.CNF NetworkInfo entry.""" name = "HomePlug AV CC_DISCOVER_LIST.CNF NetworkInfo entry" fields_desc = [ HPAVNIDField ("nid", 0), ByteField ("snid", 0), ByteField ("hm", 0), ByteField ("num_slots", 0), ByteField ("coordinating_status", 0), ShortField ("offset", 0), ] def extract_padding(self, s): return "", s class CC_DISCOVER_LIST_CNF (MMEPayload): """Handles the CC_DISCOVER_LIST.CNF MME.""" name = "HomePlug AV CC_DISCOVER_LIST.CNF" fields_desc = [ FieldLenField ("num_station", None, count_of="stations", fmt="B"), PacketListField ("stations", None, CC_DISCOVER_LIST_CNF_stations, count_from = lambda p: p.num_station), FieldLenField ("num_network", None, count_of="networks", fmt="B"), PacketListField ("networks", None, CC_DISCOVER_LIST_CNF_networks, count_from = lambda p: p.num_network), ] def extract_padding(self, s): return "", s if __name__ == '__main__': m = CC_WHO_RU_REQ (nid = 0x03c3ffdd7d22d5) hexdump (str (m)) s = CC_WHO_RU_REQ (str (m)) print hex (s.nid)