class UDS_RD(Packet): dataFormatIdentifiers = ObservableDict({ 0: 'noCompressionNoEncryption' }) name = 'RequestDownload' fields_desc = [ ByteEnumField('dataFormatIdentifier', 0, dataFormatIdentifiers), BitField('memorySizeLen', 0, 4), BitField('memoryAddressLen', 0, 4), ConditionalField(XByteField('memoryAddress1', 0), lambda pkt: pkt.memoryAddressLen == 1), ConditionalField(XShortField('memoryAddress2', 0), lambda pkt: pkt.memoryAddressLen == 2), ConditionalField(X3BytesField('memoryAddress3', 0), lambda pkt: pkt.memoryAddressLen == 3), ConditionalField(XIntField('memoryAddress4', 0), lambda pkt: pkt.memoryAddressLen == 4), ConditionalField(XByteField('memorySize1', 0), lambda pkt: pkt.memorySizeLen == 1), ConditionalField(XShortField('memorySize2', 0), lambda pkt: pkt.memorySizeLen == 2), ConditionalField(X3BytesField('memorySize3', 0), lambda pkt: pkt.memorySizeLen == 3), ConditionalField(XIntField('memorySize4', 0), lambda pkt: pkt.memorySizeLen == 4) ]
class UDS_RD(Packet): dataFormatIdentifiers = ObservableDict({0: 'noCompressionNoEncryption'}) name = 'RequestDownload' fields_desc = [ ByteEnumField('dataFormatIdentifier', 0, dataFormatIdentifiers), BitField('memorySizeLen', 0, 4), BitField('memoryAddressLen', 0, 4), ConditionalField(XByteField('memoryAddress1', 0), lambda pkt: pkt.memoryAddressLen == 1), ConditionalField(XShortField('memoryAddress2', 0), lambda pkt: pkt.memoryAddressLen == 2), ConditionalField(X3BytesField('memoryAddress3', 0), lambda pkt: pkt.memoryAddressLen == 3), ConditionalField(XIntField('memoryAddress4', 0), lambda pkt: pkt.memoryAddressLen == 4), ConditionalField(XByteField('memorySize1', 0), lambda pkt: pkt.memorySizeLen == 1), ConditionalField(XShortField('memorySize2', 0), lambda pkt: pkt.memorySizeLen == 2), ConditionalField(X3BytesField('memorySize3', 0), lambda pkt: pkt.memorySizeLen == 3), ConditionalField(XIntField('memorySize4', 0), lambda pkt: pkt.memorySizeLen == 4) ] @staticmethod def get_log(pkt): addr = getattr(pkt, "memoryAddress%d" % pkt.memoryAddressLen) size = getattr(pkt, "memorySize%d" % pkt.memorySizeLen) return pkt.sprintf("%UDS.service%"), (addr, size)
class UDS_RDBI(Packet): dataIdentifiers = ObservableDict() name = 'ReadDataByIdentifier' fields_desc = [ FieldListField("identifiers", [], XShortEnumField('dataIdentifier', 0, dataIdentifiers)) ]
class UDS_IOCBI(Packet): name = 'InputOutputControlByIdentifier' dataIdentifiers = ObservableDict() fields_desc = [ XShortEnumField('dataIdentifier', 0, dataIdentifiers), ByteField('controlOptionRecord', 0), StrField('controlEnableMaskRecord', b"", fmt="B") ]
class KWP_SDS(Packet): diagnosticSessionTypes = ObservableDict({ 0x81: 'defaultSession', 0x85: 'programmingSession', 0x89: 'standBySession', 0x90: 'EcuPassiveSession', 0x92: 'extendedDiagnosticSession' }) name = 'StartDiagnosticSession' fields_desc = [ ByteEnumField('diagnosticSession', 0, diagnosticSessionTypes) ]
class UDS_DSC(Packet): diagnosticSessionTypes = ObservableDict({ 0x00: 'ISOSAEReserved', 0x01: 'defaultSession', 0x02: 'programmingSession', 0x03: 'extendedDiagnosticSession', 0x04: 'safetySystemDiagnosticSession', 0x7F: 'ISOSAEReserved'}) name = 'DiagnosticSessionControl' fields_desc = [ ByteEnumField('diagnosticSessionType', 0, diagnosticSessionTypes) ]
class GMLAN_RDBPI(Packet): dataIdentifiers = ObservableDict({ 0x0005: "OBD_EngineCoolantTemperature", 0x000C: "OBD_EngineRPM", 0x001f: "OBD_TimeSinceEngineStart" }) name = 'ReadDataByParameterIdentifier' fields_desc = [ FieldListField("identifiers", [], XShortEnumField('parameterIdentifier', 0, dataIdentifiers)) ]
class UDS_RDBI(Packet): dataIdentifiers = ObservableDict() name = 'ReadDataByIdentifier' fields_desc = [ FieldListField("identifiers", [0], XShortEnumField('dataIdentifier', 0, dataIdentifiers)) ] @staticmethod def get_log(pkt): return pkt.sprintf("%UDS.service%"), \ pkt.sprintf("%UDS_RDBI.identifiers%")
class UDS_IOCBI(Packet): name = 'InputOutputControlByIdentifier' dataIdentifiers = ObservableDict() fields_desc = [ XShortEnumField('dataIdentifier', 0, dataIdentifiers), ByteField('controlOptionRecord', 0), StrField('controlEnableMaskRecord', 0, fmt="B") ] @staticmethod def get_log(pkt): return pkt.sprintf("%UDS.service%"), pkt.dataIdentifier
class UDS_RC(Packet): routineControlTypes = { 0: 'ISOSAEReserved', 1: 'startRoutine', 2: 'stopRoutine', 3: 'requestRoutineResults' } routineControlIdentifiers = ObservableDict() name = 'RoutineControl' fields_desc = [ ByteEnumField('routineControlType', 0, routineControlTypes), XShortEnumField('routineIdentifier', 0, routineControlIdentifiers) ]
class GMLAN_RDBPI(Packet): dataIdentifiers = ObservableDict({ 0x0005: "OBD_EngineCoolantTemperature", 0x000C: "OBD_EngineRPM", 0x001f: "OBD_TimeSinceEngineStart" }) name = 'ReadDataByParameterIdentifier' fields_desc = [ FieldListField( "identifiers", [], XShortEnumField('parameterIdentifier', 0, dataIdentifiers)) ] @staticmethod def get_log(pkt): return pkt.sprintf("%GMLAN.service%"), \ pkt.sprintf("%GMLAN_RDBPI.identifiers%")
class KWP_SRBLI(Packet): routineLocalIdentifiers = ObservableDict({ 0xE0: "FlashEraseRoutine", 0xE1: "FlashCheckRoutine", 0xE2: "Tell-TaleRetentionStack", 0xE3: "RequestDTCsFromShadowErrorMemory", 0xE4: "RequestEnvironmentDataFromShadowErrorMemory", 0xE5: "RequestEventInformation", 0xE6: "RequestEventEnvironmentData", 0xE7: "RequestSoftwareModuleInformation", 0xE8: "ClearTell-TaleRetentionStack", 0xE9: "ClearEventInformation" }) name = 'StartRoutineByLocalIdentifier' fields_desc = [ XByteEnumField('routineLocalIdentifier', 0, routineLocalIdentifiers) ]
class UDS_DSC(Packet): diagnosticSessionTypes = ObservableDict({ 0x00: 'ISOSAEReserved', 0x01: 'defaultSession', 0x02: 'programmingSession', 0x03: 'extendedDiagnosticSession', 0x04: 'safetySystemDiagnosticSession', 0x7F: 'ISOSAEReserved'}) name = 'DiagnosticSessionControl' fields_desc = [ ByteEnumField('diagnosticSessionType', 0, diagnosticSessionTypes) ] @staticmethod def get_log(pkt): return pkt.sprintf("%UDS.service%"), \ pkt.sprintf("%UDS_DSC.diagnosticSessionType%")
class KWP_RECUI(Packet): name = 'ReadECUIdentification' localIdentifiers = ObservableDict({ 0x86: "DCS ECU Identification", 0x87: "DCX / MMC ECU Identification", 0x88: "VIN (Original)", 0x89: "Diagnostic Variant Code", 0x90: "VIN (Current)", 0x96: "Calibration Identification", 0x97: "Calibration Verification Number", 0x9A: "ECU Code Fingerprint", 0x98: "ECU Data Fingerprint", 0x9C: "ECU Code Software Identification", 0x9D: "ECU Data Software Identification", 0x9E: "ECU Boot Software Identification", 0x9F: "ECU Boot Fingerprint" }) fields_desc = [XByteEnumField('localIdentifier', 0, localIdentifiers)]
class KWP_RDBLI(Packet): localIdentifiers = ObservableDict({ 0xE0: "Development Data", 0xE1: "ECU Serial Number", 0xE2: "DBCom Data", 0xE3: "Operating System Version", 0xE4: "Ecu Reprogramming Identification", 0xE5: "Vehicle Information", 0xE6: "Flash Info 1", 0xE7: "Flash Info 2", 0xE8: "System Diagnostic general parameter data", 0xE9: "System Diagnostic global parameter data", 0xEA: "Ecu Configuration", 0xEB: "Diagnostic Protocol Information" }) name = 'ReadDataByLocalIdentifier' fields_desc = [ XByteEnumField('recordLocalIdentifier', 0, localIdentifiers) ]
class UDS_RC(Packet): routineControlTypes = { 0: 'ISOSAEReserved', 1: 'startRoutine', 2: 'stopRoutine', 3: 'requestRoutineResults' } routineControlIdentifiers = ObservableDict() name = 'RoutineControl' fields_desc = [ ByteEnumField('routineControlType', 0, routineControlTypes), XShortEnumField('routineIdentifier', 0, routineControlIdentifiers), StrField('routineControlOptionRecord', 0, fmt="B"), ] @staticmethod def get_log(pkt): return pkt.sprintf("%UDS.service%"),\ (pkt.routineControlType, pkt.routineIdentifier, pkt.routineControlOptionRecord)
class UDS(ISOTP): services = ObservableDict({ 0x10: 'DiagnosticSessionControl', 0x11: 'ECUReset', 0x14: 'ClearDiagnosticInformation', 0x19: 'ReadDTCInformation', 0x22: 'ReadDataByIdentifier', 0x23: 'ReadMemoryByAddress', 0x24: 'ReadScalingDataByIdentifier', 0x27: 'SecurityAccess', 0x28: 'CommunicationControl', 0x2A: 'ReadDataPeriodicIdentifier', 0x2C: 'DynamicallyDefineDataIdentifier', 0x2E: 'WriteDataByIdentifier', 0x2F: 'InputOutputControlByIdentifier', 0x31: 'RoutineControl', 0x34: 'RequestDownload', 0x35: 'RequestUpload', 0x36: 'TransferData', 0x37: 'RequestTransferExit', 0x3D: 'WriteMemoryByAddress', 0x3E: 'TesterPresent', 0x50: 'DiagnosticSessionControlPositiveResponse', 0x51: 'ECUResetPositiveResponse', 0x54: 'ClearDiagnosticInformationPositiveResponse', 0x59: 'ReadDTCInformationPositiveResponse', 0x62: 'ReadDataByIdentifierPositiveResponse', 0x63: 'ReadMemoryByAddressPositiveResponse', 0x64: 'ReadScalingDataByIdentifierPositiveResponse', 0x67: 'SecurityAccessPositiveResponse', 0x68: 'CommunicationControlPositiveResponse', 0x6A: 'ReadDataPeriodicIdentifierPositiveResponse', 0x6C: 'DynamicallyDefineDataIdentifierPositiveResponse', 0x6E: 'WriteDataByIdentifierPositiveResponse', 0x6F: 'InputOutputControlByIdentifierPositiveResponse', 0x71: 'RoutineControlPositiveResponse', 0x74: 'RequestDownloadPositiveResponse', 0x75: 'RequestUploadPositiveResponse', 0x76: 'TransferDataPositiveResponse', 0x77: 'RequestTransferExitPositiveResponse', 0x7D: 'WriteMemoryByAddressPositiveResponse', 0x7E: 'TesterPresentPositiveResponse', 0x83: 'AccessTimingParameter', 0x84: 'SecuredDataTransmission', 0x85: 'ControlDTCSetting', 0x86: 'ResponseOnEvent', 0x87: 'LinkControl', 0xC3: 'AccessTimingParameterPositiveResponse', 0xC4: 'SecuredDataTransmissionPositiveResponse', 0xC5: 'ControlDTCSettingPositiveResponse', 0xC6: 'ResponseOnEventPositiveResponse', 0xC7: 'LinkControlPositiveResponse', 0x7f: 'NegativeResponse' }) name = 'UDS' fields_desc = [XByteEnumField('service', 0, services)] def answers(self, other): if other.__class__ != self.__class__: return False if self.service == 0x7f: return self.payload.answers(other) if self.service == (other.service + 0x40): if isinstance(self.payload, NoPayload) or \ isinstance(other.payload, NoPayload): return len(self) <= len(other) else: return self.payload.answers(other.payload) return False def hashret(self): if self.service == 0x7f: return struct.pack('B', self.requestServiceId) return struct.pack('B', self.service & ~0x40)
class UDS(Packet): services = ObservableDict({ 0x10: 'DiagnosticSessionControl', 0x11: 'ECUReset', 0x14: 'ClearDiagnosticInformation', 0x19: 'ReadDTCInformation', 0x22: 'ReadDataByIdentifier', 0x23: 'ReadMemoryByAddress', 0x24: 'ReadScalingDataByIdentifier', 0x27: 'SecurityAccess', 0x28: 'CommunicationControl', 0x2A: 'ReadDataPeriodicIdentifier', 0x2C: 'DynamicallyDefineDataIdentifier', 0x2E: 'WriteDataByIdentifier', 0x2F: 'InputOutputControlByIdentifier', 0x31: 'RoutineControl', 0x34: 'RequestDownload', 0x35: 'RequestUpload', 0x36: 'TransferData', 0x37: 'RequestTransferExit', 0x3D: 'WriteMemoryByAddress', 0x3E: 'TesterPresent', 0x50: 'DiagnosticSessionControlPositiveResponse', 0x51: 'ECUResetPositiveResponse', 0x54: 'ClearDiagnosticInformationPositiveResponse', 0x59: 'ReadDTCInformationPositiveResponse', 0x62: 'ReadDataByIdentifierPositiveResponse', 0x63: 'ReadMemoryByAddressPositiveResponse', 0x64: 'ReadScalingDataByIdentifierPositiveResponse', 0x67: 'SecurityAccessPositiveResponse', 0x68: 'CommunicationControlPositiveResponse', 0x6A: 'ReadDataPeriodicIdentifierPositiveResponse', 0x6C: 'DynamicallyDefineDataIdentifierPositiveResponse', 0x6E: 'WriteDataByIdentifierPositiveResponse', 0x6F: 'InputOutputControlByIdentifierPositiveResponse', 0x71: 'RoutineControlPositiveResponse', 0x74: 'RequestDownloadPositiveResponse', 0x75: 'RequestUploadPositiveResponse', 0x76: 'TransferDataPositiveResponse', 0x77: 'RequestTransferExitPositiveResponse', 0x7D: 'WriteMemoryByAddressPositiveResponse', 0x7E: 'TesterPresentPositiveResponse', 0x83: 'AccessTimingParameter', 0x84: 'SecuredDataTransmission', 0x85: 'ControlDTCSetting', 0x86: 'ResponseOnEvent', 0x87: 'LinkControl', 0xC3: 'AccessTimingParameterPositiveResponse', 0xC4: 'SecuredDataTransmissionPositiveResponse', 0xC5: 'ControlDTCSettingPositiveResponse', 0xC6: 'ResponseOnEventPositiveResponse', 0xC7: 'LinkControlPositiveResponse', 0x7f: 'NegativeResponse' }) name = 'UDS' fields_desc = [XByteEnumField('service', 0, services)] def answers(self, other): """DEV: true if self is an answer from other""" if other.__class__ == self.__class__: return (other.service + 0x40) == self.service or \ (self.service == 0x7f and self.requestServiceId == other.service and (self.negativeResponseCode != 0x78 or conf.contribs['UDS']['treat-response-pending-as-answer'])) return 0 def hashret(self): if self.service == 0x7f: return struct.pack('B', self.requestServiceId) return struct.pack('B', self.service & ~0x40)
class GMLAN(Packet): @staticmethod def determine_len(x): if conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] is None: warning("Define conf.GMLAN_ECU_AddressingScheme! " "Assign either 2,3 or 4") if conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] \ not in [2, 3, 4]: warning("Define conf.GMLAN_ECU_AddressingScheme! " "Assign either 2,3 or 4") return conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] == x services = ObservableDict( {0x04: 'ClearDiagnosticInformation', 0x10: 'InitiateDiagnosticOperation', 0x12: 'ReadFailureRecordData', 0x1a: 'ReadDataByIdentifier', 0x20: 'ReturnToNormalOperation', 0x22: 'ReadDataByParameterIdentifier', 0x23: 'ReadMemoryByAddress', 0x27: 'SecurityAccess', 0x28: 'DisableNormalCommunication', 0x2c: 'DynamicallyDefineMessage', 0x2d: 'DefinePIDByAddress', 0x34: 'RequestDownload', 0x36: 'TransferData', 0x3b: 'WriteDataByIdentifier', 0x3e: 'TesterPresent', 0x44: 'ClearDiagnosticInformationPositiveResponse', 0x50: 'InitiateDiagnosticOperationPositiveResponse', 0x52: 'ReadFailureRecordDataPositiveResponse', 0x5a: 'ReadDataByIdentifierPositiveResponse', 0x60: 'ReturnToNormalOperationPositiveResponse', 0x62: 'ReadDataByParameterIdentifierPositiveResponse', 0x63: 'ReadMemoryByAddressPositiveResponse', 0x67: 'SecurityAccessPositiveResponse', 0x68: 'DisableNormalCommunicationPositiveResponse', 0x6c: 'DynamicallyDefineMessagePositiveResponse', 0x6d: 'DefinePIDByAddressPositiveResponse', 0x74: 'RequestDownloadPositiveResponse', 0x76: 'TransferDataPositiveResponse', 0x7b: 'WriteDataByIdentifierPositiveResponse', 0x7e: 'TesterPresentPositiveResponse', 0x7f: 'NegativeResponse', 0xa2: 'ReportProgrammingState', 0xa5: 'ProgrammingMode', 0xa9: 'ReadDiagnosticInformation', 0xaa: 'ReadDataByPacketIdentifier', 0xae: 'DeviceControl', 0xe2: 'ReportProgrammingStatePositiveResponse', 0xe5: 'ProgrammingModePositiveResponse', 0xe9: 'ReadDiagnosticInformationPositiveResponse', 0xea: 'ReadDataByPacketIdentifierPositiveResponse', 0xee: 'DeviceControlPositiveResponse'}) name = 'General Motors Local Area Network' fields_desc = [ XByteEnumField('service', 0, services) ] def answers(self, other): """DEV: true if self is an answer from other""" if other.__class__ == self.__class__: return (other.service + 0x40) == self.service or \ (self.service == 0x7f and (self.requestServiceId == other.service)) return 0 def hashret(self): if self.service == 0x7f: return struct.pack('B', self.requestServiceId) return struct.pack('B', self.service & ~0x40)
class GMLAN(ISOTP): @staticmethod def determine_len(x): if conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] is None: warning( "Define conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme']! " # noqa: E501 "Assign either 2,3 or 4") if conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] \ not in [2, 3, 4]: warning( "Define conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme']! " # noqa: E501 "Assign either 2,3 or 4") return conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] == x services = ObservableDict({ 0x04: 'ClearDiagnosticInformation', 0x10: 'InitiateDiagnosticOperation', 0x12: 'ReadFailureRecordData', 0x1a: 'ReadDataByIdentifier', 0x20: 'ReturnToNormalOperation', 0x22: 'ReadDataByParameterIdentifier', 0x23: 'ReadMemoryByAddress', 0x27: 'SecurityAccess', 0x28: 'DisableNormalCommunication', 0x2c: 'DynamicallyDefineMessage', 0x2d: 'DefinePIDByAddress', 0x34: 'RequestDownload', 0x36: 'TransferData', 0x3b: 'WriteDataByIdentifier', 0x3e: 'TesterPresent', 0x44: 'ClearDiagnosticInformationPositiveResponse', 0x50: 'InitiateDiagnosticOperationPositiveResponse', 0x52: 'ReadFailureRecordDataPositiveResponse', 0x5a: 'ReadDataByIdentifierPositiveResponse', 0x60: 'ReturnToNormalOperationPositiveResponse', 0x62: 'ReadDataByParameterIdentifierPositiveResponse', 0x63: 'ReadMemoryByAddressPositiveResponse', 0x67: 'SecurityAccessPositiveResponse', 0x68: 'DisableNormalCommunicationPositiveResponse', 0x6c: 'DynamicallyDefineMessagePositiveResponse', 0x6d: 'DefinePIDByAddressPositiveResponse', 0x74: 'RequestDownloadPositiveResponse', 0x76: 'TransferDataPositiveResponse', 0x7b: 'WriteDataByIdentifierPositiveResponse', 0x7e: 'TesterPresentPositiveResponse', 0x7f: 'NegativeResponse', 0xa2: 'ReportProgrammingState', 0xa5: 'ProgrammingMode', 0xa9: 'ReadDiagnosticInformation', 0xaa: 'ReadDataByPacketIdentifier', 0xae: 'DeviceControl', 0xe2: 'ReportProgrammingStatePositiveResponse', 0xe5: 'ProgrammingModePositiveResponse', 0xe9: 'ReadDiagnosticInformationPositiveResponse', 0xea: 'ReadDataByPacketIdentifierPositiveResponse', 0xee: 'DeviceControlPositiveResponse' }) name = 'General Motors Local Area Network' fields_desc = [XByteEnumField('service', 0, services)] def answers(self, other): if other.__class__ != self.__class__: return False if self.service == 0x7f: return self.payload.answers(other) if self.service == (other.service + 0x40): if isinstance(self.payload, NoPayload) or \ isinstance(other.payload, NoPayload): return True else: return self.payload.answers(other.payload) return False def hashret(self): if self.service == 0x7f: return struct.pack('B', self.requestServiceId) return struct.pack('B', self.service & ~0x40) @staticmethod def modifies_ecu_state(pkt, ecu): if pkt.service == 0x50: ecu.current_session = 3 elif pkt.service == 0x60: ecu.current_session = 1 ecu.communication_control = 0 ecu.current_security_level = 0 elif pkt.service == 0x68: ecu.communication_control = 1 elif pkt.service == 0xe5: ecu.current_session = 2
class GMLAN_RDBI(Packet): dataIdentifiers = ObservableDict({ 0x90: "$90: VehicleIdentificationNumber (VIN)", 0x92: "$92: SystemSupplierId (SYSSUPPID)", 0x97: "$97: SystemNameOrEngineType (SNOET)", 0x98: "$98: RepairShopCodeOrTesterSerialNumber (RSCOTSN)", 0x99: "$99: ProgrammingDate (PD)", 0x9a: "$9a: DiagnosticDataIdentifier (DDI)", 0x9b: "$9b: XmlConfigurationCompatibilityIdentifier (XMLCCID)", 0x9C: "$9C: XmlDataFilePartNumber (XMLDFPN)", 0x9D: "$9D: XmlDataFileAlphaCode (XMLDFAC)", 0x9F: "$9F: PreviousStoredRepairShopCodeOrTesterSerialNumbers " "(PSRSCOTSN)", 0xA0: "$A0: manufacturers_enable_counter (MEC)", 0xA1: "$A1: ECUConfigurationOrCustomizationData (ECUCOCGD) 1", 0xA2: "$A2: ECUConfigurationOrCustomizationData (ECUCOCGD) 2", 0xA3: "$A3: ECUConfigurationOrCustomizationData (ECUCOCGD) 3", 0xA4: "$A4: ECUConfigurationOrCustomizationData (ECUCOCGD) 4", 0xA5: "$A5: ECUConfigurationOrCustomizationData (ECUCOCGD) 5", 0xA6: "$A6: ECUConfigurationOrCustomizationData (ECUCOCGD) 6", 0xA7: "$A7: ECUConfigurationOrCustomizationData (ECUCOCGD) 7", 0xA8: "$A8: ECUConfigurationOrCustomizationData (ECUCOCGD) 8", 0xB0: "$B0: ECUDiagnosticAddress (ECUADDR)", 0xB1: "$B1: ECUFunctionalSystemsAndVirtualDevices (ECUFSAVD)", 0xB2: "$B2: GM ManufacturingData (GMMD)", 0xB3: "$B3: Data Universal Numbering System Identification (DUNS)", 0xB4: "$B4: Manufacturing Traceability Characters (MTC)", 0xB5: "$B5: GM BroadcastCode (GMBC)", 0xB6: "$B6: GM Target Vehicle (GMTV)", 0xB7: "$B7: GM Software Usage Description (GMSUD)", 0xB8: "$B8: GM Bench Verification Information (GMBVI)", 0xB9: "$B9: Subnet_Config_List_HighSpeed (SCLHS)", 0xBA: "$BA: Subnet_Config_List_LowSpeed (SCLLS)", 0xBB: "$BB: Subnet_Config_List_MidSpeed (SCLMS)", 0xBC: "$BC: Subnet_Config_List_NonCan 1 (SCLNC 1)", 0xBD: "$BD: Subnet_Config_List_NonCan 2 (SCLNC 2)", 0xBE: "$BE: Subnet_Config_List_LIN (SCLLIN)", 0xBF: "$BF: Subnet_Config_List_GMLANChassisExpansionBus (SCLGCEB)", 0xC0: "$C0: BootSoftwarePartNumber (BSPN)", 0xC1: "$C1: SoftwareModuleIdentifier (SWMI) 01", 0xC2: "$C2: SoftwareModuleIdentifier (SWMI) 02", 0xC3: "$C3: SoftwareModuleIdentifier (SWMI) 03", 0xC4: "$C4: SoftwareModuleIdentifier (SWMI) 04", 0xC5: "$C5: SoftwareModuleIdentifier (SWMI) 05", 0xC6: "$C6: SoftwareModuleIdentifier (SWMI) 06", 0xC7: "$C7: SoftwareModuleIdentifier (SWMI) 07", 0xC8: "$C8: SoftwareModuleIdentifier (SWMI) 08", 0xC9: "$C9: SoftwareModuleIdentifier (SWMI) 09", 0xCA: "$CA: SoftwareModuleIdentifier (SWMI) 10", 0xCB: "$CB: EndModelPartNumber", 0xCC: "$CC: BaseModelPartNumber (BMPN)", 0xD0: "$D0: BootSoftwarePartNumberAlphaCode", 0xD1: "$D1: SoftwareModuleIdentifierAlphaCode (SWMIAC) 01", 0xD2: "$D2: SoftwareModuleIdentifierAlphaCode (SWMIAC) 02", 0xD3: "$D3: SoftwareModuleIdentifierAlphaCode (SWMIAC) 03", 0xD4: "$D4: SoftwareModuleIdentifierAlphaCode (SWMIAC) 04", 0xD5: "$D5: SoftwareModuleIdentifierAlphaCode (SWMIAC) 05", 0xD6: "$D6: SoftwareModuleIdentifierAlphaCode (SWMIAC) 06", 0xD7: "$D7: SoftwareModuleIdentifierAlphaCode (SWMIAC) 07", 0xD8: "$D8: SoftwareModuleIdentifierAlphaCode (SWMIAC) 08", 0xD9: "$D9: SoftwareModuleIdentifierAlphaCode (SWMIAC) 09", 0xDA: "$DA: SoftwareModuleIdentifierAlphaCode (SWMIAC) 10", 0xDB: "$DB: EndModelPartNumberAlphaCode", 0xDC: "$DC: BaseModelPartNumberAlphaCode", 0xDD: "$DD: SoftwareModuleIdentifierDataIdentifiers (SWMIDID)", 0xDE: "$DE: GMLANIdentificationData (GMLANID)", 0xDF: "$DF: ECUOdometerValue (ECUODO)", 0xE0: "$E0: VehicleLevelDataRecord (VLDR) 0", 0xE1: "$E1: VehicleLevelDataRecord (VLDR) 1", 0xE2: "$E2: VehicleLevelDataRecord (VLDR) 2", 0xE3: "$E3: VehicleLevelDataRecord (VLDR) 3", 0xE4: "$E4: VehicleLevelDataRecord (VLDR) 4", 0xE5: "$E5: VehicleLevelDataRecord (VLDR) 5", 0xE6: "$E6: VehicleLevelDataRecord (VLDR) 6", 0xE7: "$E7: VehicleLevelDataRecord (VLDR) 7", 0xE8: "$E8: Subnet_Config_List_GMLANPowertrainExpansionBus (SCLGPEB)", 0xE9: "$E9: Subnet_Config_List_GMLANFrontObjectExpansionBus " "(SCLGFOEB)", 0xEA: "$EA: Subnet_Config_List_GMLANRearObjectExpansionBus (SCLGROEB)", 0xEB: "$EB: Subnet_Config_List_GMLANExpansionBus1 (SCLGEB1)", 0xEC: "$EC: Subnet_Config_List_GMLANExpansionBus2 (SCLGEB2)", 0xED: "$ED: Subnet_Config_List_GMLANExpansionBus3 (SCLGEB3)", 0xEE: "$EE: Subnet_Config_List_GMLANExpansionBus4 (SCLGEB4)", 0xEF: "$EF: Subnet_Config_List_GMLANExpansionBus5 (SCLGEB5)", }) name = 'ReadDataByIdentifier' fields_desc = [XByteEnumField('dataIdentifier', 0, dataIdentifiers)] @staticmethod def get_log(pkt): return pkt.sprintf("%GMLAN.service%"), \ pkt.sprintf("%GMLAN_RDBI.dataIdentifier%")
class UDS_RSDBI(Packet): name = 'ReadScalingDataByIdentifier' dataIdentifiers = ObservableDict() fields_desc = [XShortEnumField('dataIdentifier', 0, dataIdentifiers)]
class KWP(ISOTP): services = ObservableDict({ 0x10: 'StartDiagnosticSession', 0x11: 'ECUReset', 0x14: 'ClearDiagnosticInformation', 0x17: 'ReadStatusOfDiagnosticTroubleCodes', 0x18: 'ReadDiagnosticTroubleCodesByStatus', 0x1A: 'ReadECUIdentification', 0x21: 'ReadDataByLocalIdentifier', 0x22: 'ReadDataByIdentifier', 0x23: 'ReadMemoryByAddress', 0x27: 'SecurityAccess', 0x28: 'DisableNormalMessageTransmission', 0x29: 'EnableNormalMessageTransmission', 0x2C: 'DynamicallyDefineLocalIdentifier', 0x2E: 'WriteDataByIdentifier', 0x30: 'InputOutputControlByLocalIdentifier', 0x31: 'StartRoutineByLocalIdentifier', 0x32: 'StopRoutineByLocalIdentifier', 0x33: 'RequestRoutineResultsByLocalIdentifier', 0x34: 'RequestDownload', 0x35: 'RequestUpload', 0x36: 'TransferData', 0x37: 'RequestTransferExit', 0x3B: 'WriteDataByLocalIdentifier', 0x3D: 'WriteMemoryByAddress', 0x3E: 'TesterPresent', 0x85: 'ControlDTCSetting', 0x86: 'ResponseOnEvent', 0x50: 'StartDiagnosticSessionPositiveResponse', 0x51: 'ECUResetPositiveResponse', 0x54: 'ClearDiagnosticInformationPositiveResponse', 0x57: 'ReadStatusOfDiagnosticTroubleCodesPositiveResponse', 0x58: 'ReadDiagnosticTroubleCodesByStatusPositiveResponse', 0x5A: 'ReadECUIdentificationPositiveResponse', 0x61: 'ReadDataByLocalIdentifierPositiveResponse', 0x62: 'ReadDataByIdentifierPositiveResponse', 0x63: 'ReadMemoryByAddressPositiveResponse', 0x67: 'SecurityAccessPositiveResponse', 0x68: 'DisableNormalMessageTransmissionPositiveResponse', 0x69: 'EnableNormalMessageTransmissionPositiveResponse', 0x6C: 'DynamicallyDefineLocalIdentifierPositiveResponse', 0x6E: 'WriteDataByIdentifierPositiveResponse', 0x70: 'InputOutputControlByLocalIdentifierPositiveResponse', 0x71: 'StartRoutineByLocalIdentifierPositiveResponse', 0x72: 'StopRoutineByLocalIdentifierPositiveResponse', 0x73: 'RequestRoutineResultsByLocalIdentifierPositiveResponse', 0x74: 'RequestDownloadPositiveResponse', 0x75: 'RequestUploadPositiveResponse', 0x76: 'TransferDataPositiveResponse', 0x77: 'RequestTransferExitPositiveResponse', 0x7B: 'WriteDataByLocalIdentifierPositiveResponse', 0x7D: 'WriteMemoryByAddressPositiveResponse', 0x7E: 'TesterPresentPositiveResponse', 0xC5: 'ControlDTCSettingPositiveResponse', 0xC6: 'ResponseOnEventPositiveResponse', 0x7f: 'NegativeResponse' }) # type: Dict[int, str] name = 'KWP' fields_desc = [XByteEnumField('service', 0, services)] def answers(self, other): # type: (Packet) -> bool if not isinstance(other, type(self)): return False if self.service == 0x7f: return self.payload.answers(other) if self.service == (other.service + 0x40): if isinstance(self.payload, NoPayload) or \ isinstance(other.payload, NoPayload): return len(self) <= len(other) else: return self.payload.answers(other.payload) return False def hashret(self): # type: () -> bytes if self.service == 0x7f: return struct.pack('B', self.requestServiceId) else: return struct.pack('B', self.service & ~0x40)
class KWP_RDBI(Packet): dataIdentifiers = ObservableDict() name = 'ReadDataByIdentifier' fields_desc = [XShortEnumField('identifier', 0, dataIdentifiers)]