a
    kÄ#dÅ`  ã                   @   sš  d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZ d dlmZ zejd d r˜W n* eyÄ   e d	¡ dd
iejd< Y n0 dejd d< G dd„ deƒZG dd„ deƒZ eee dd� G dd„ deƒZ!G dd„ deƒZ"eee"dd� G dd„ deƒZ#eee#dd� G dd„ deƒZ$ee#e$dd� G dd„ deƒZ%ee#e%dd� G d d!„ d!eƒZ&eee&d"d� G d#d$„ d$eƒZ'eee'd%d� G d&d'„ d'eƒZ(eee(d(d� G d)d*„ d*eƒZ)eee)d+d� G d,d-„ d-eƒZ*eee*d.d� G d/d0„ d0eƒZ+eee+d1d� G d2d3„ d3eƒZ,eee,d4d� G d5d6„ d6eƒZ-eee-d7d� G d8d9„ d9eƒZ.eee.d:d� G d;d<„ d<eƒZ/eee/d=d� G d>d?„ d?eƒZ0eee0d@d� G dAdB„ dBeƒZ1eee1dCd� G dDdE„ dEeƒZ2eee2dFd� G dGdH„ dHeƒZ3eee3dId� G dJdK„ dKeƒZ4eee4dLd� G dMdN„ dNeƒZ5eee5dOd� G dPdQ„ dQeƒZ6eee6dRd� G dSdT„ dTeƒZ7eee7dUd� G dVdW„ dWeƒZ8eee8dXd� G dYdZ„ dZeƒZ9eee9d[d� G d\d]„ d]eƒZ:ee9e:d^d� G d_d`„ d`eƒZ;ee9e;dad� G dbdc„ dceƒZ<ee9e<ddd� G dedf„ dfeƒZ=eee=dgd� G dhdi„ dieƒZ>eee>djd� G dkdl„ dleƒZ?eee?dmd� dS )né    N)Úlog_automotive)ÚObservableDictÚXByteEnumFieldÚByteEnumFieldÚConditionalFieldÚ
XByteFieldÚStrFieldÚXShortEnumFieldÚXShortFieldÚX3BytesFieldÚ	XIntFieldÚ
ShortFieldÚPacketFieldÚPacketListFieldÚFieldListFieldÚMultipleTypeFieldÚStrFixedLenField)ÚPacketÚbind_layersÚ	NoPayload)Úconf)ÚISOTPÚGMLANú treat-response-pending-as-answerzÊSpecify "conf.contribs['GMLAN'] = {'treat-response-pending-as-answer': True}" to treat a negative response 'RequestCorrectlyReceived-ResponsePending' as answer of a request. 
The default value is False.FÚGMLAN_ECU_AddressingSchemec                +   @   s–   e Zd Zedd„ ƒZeddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,œ)ƒZd-Zed.d/eƒgZ	d0d1„ Z
d2d3„ Zd4S )5r   c                 C   sJ   t jd d d u rt d¡ t jd d dvr8t d¡ t jd d | kS )Nr   r   zSDefine conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme']! Assign either 2,3 or 4©é   é   é   )r   Úcontribsr   Úwarning)Úx© r"   úX/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/automotive/gm/gmlan.pyÚdetermine_len(   s    ÿÿÿzGMLAN.determine_lenZClearDiagnosticInformationÚInitiateDiagnosticOperationÚReadFailureRecordDataÚReadDataByIdentifierZReturnToNormalOperationÚReadDataByParameterIdentifierÚReadMemoryByAddressÚSecurityAccessZDisableNormalCommunicationÚDynamicallyDefineMessageÚDefinePIDByAddressÚRequestDownloadÚTransferDataÚWriteDataByIdentifierZTesterPresentZ*ClearDiagnosticInformationPositiveResponseZ+InitiateDiagnosticOperationPositiveResponseÚ%ReadFailureRecordDataPositiveResponseÚ$ReadDataByIdentifierPositiveResponseZ'ReturnToNormalOperationPositiveResponseÚ-ReadDataByParameterIdentifierPositiveResponseÚ#ReadMemoryByAddressPositiveResponseÚSecurityAccessPositiveResponseZ*DisableNormalCommunicationPositiveResponseÚ(DynamicallyDefineMessagePositiveResponseÚ"DefinePIDByAddressPositiveResponseZRequestDownloadPositiveResponseZTransferDataPositiveResponseÚ%WriteDataByIdentifierPositiveResponseZTesterPresentPositiveResponseÚNegativeResponseZReportProgrammingStateÚProgrammingModeÚReadDiagnosticInformationÚReadDataByPacketIdentifierÚDeviceControlZ&ReportProgrammingStatePositiveResponseZProgrammingModePositiveResponseZ)ReadDiagnosticInformationPositiveResponseZ*ReadDataByPacketIdentifierPositiveResponseÚDeviceControlPositiveResponse))r   é   é   é   é    é"   é#   é'   é(   é,   é-   é4   é6   é;   é>   éD   éP   éR   éZ   é`   éb   éc   ég   éh   él   ém   ét   év   é{   é~   é   é¢   é¥   é©   éª   é®   éâ   éå   éé   éê   éî   z!General Motors Local Area NetworkÚservicer   c                 C   sf   t |t| ƒƒsdS | jdkr(| j |¡S | j|jd krbt | jtƒsPt |jtƒrTdS | j |j¡S dS )NFr[   é@   T)Ú
isinstanceÚtyperf   ÚpayloadÚanswersr   ©ÚselfÚotherr"   r"   r#   rk   d   s    

ÿzGMLAN.answersc                 C   s*   | j dkrt d| j¡S t d| j d@ ¡S )Nr[   ÚBi¿ÿÿÿ)rf   ÚstructÚpackÚrequestServiceId)rm   r"   r"   r#   Úhashretq   s    
zGMLAN.hashretN)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr$   r   ÚservicesÚnamer   Úfields_descrk   rs   r"   r"   r"   r#   r   '   sf   
Øÿ*
ÿc                   @   s*   e Zd ZddddœZdZeddeƒgZdS )	Ú	GMLAN_IDOZdisableAllDTCsZenableDTCsDuringDevCntrlZwakeUpLinksr   r%   Úsubfunctionr   N©rt   ru   rv   Úsubfunctionsry   r   rz   r"   r"   r"   r#   r{   x   s   ý
ÿr{   r>   )rf   c                   @   s<   e Zd ZdZeddƒeddƒeddƒeddƒgZdd„ Zd	S )
Ú	GMLAN_DTCzGMLAN DTC informationZfailureRecordNumberr   ÚDTCHighByteÚ
DTCLowByteÚDTCFailureTypec                 C   s   d|fS )NÚ r"   )rm   Úpr"   r"   r#   Úextract_padding�   s    zGMLAN_DTC.extract_paddingN)rt   ru   rv   ry   r   rz   r…   r"   r"   r"   r#   r   ‡   s   ür   c                   @   s<   e Zd ZdddœZdZeddeƒeeddeƒd	d
„ ƒgZ	dS )Ú
GMLAN_RFRDZreadFailureRecordIdentifiersZreadFailureRecordParameters)é   r   r&   r|   r   Údtcó    c                 C   s
   | j dkS ©Nr   ©r|   ©Zpktr"   r"   r#   Ú<lambda>œ   r‰   zGMLAN_RFRD.<lambda>N)
rt   ru   rv   r~   ry   r   r   r   r   rz   r"   r"   r"   r#   r†   ”   s   þ
ÿþr†   r?   c                   @   s(   e Zd ZdZeddejƒgZdd„ ZdS )ÚGMLAN_RFRDPRr0   r|   r   c                 C   s   t |tƒo|j| jkS ©N)rh   r†   r|   rl   r"   r"   r#   rk   ©   s    

ÿzGMLAN_RFRDPR.answersN)	rt   ru   rv   ry   r   r†   r~   rz   rk   r"   r"   r"   r#   rŽ   £   s   ÿrŽ   rN   c                   @   s2   e Zd ZdddœZdZeddeƒedg eƒgZdS )	ÚGMLAN_RFRDPR_RFRIZPIDZDPID)r   r‡   ZBReadFailureRecordDataPositiveResponse_readFailureRecordIdentifiersZ$failureRecordDataStructureIdentifierr   ZdtcsN)	rt   ru   rv   Z%failureRecordDataStructureIdentifiersry   r   r   r   rz   r"   r"   r"   r#   r�   ±   s   þÿ
ýr�   r‡   r‹   c                   @   s   e Zd ZdZeddeƒgZdS )ÚGMLAN_RFRDPR_RFRPZAReadFailureRecordDataPositiveResponse_readFailureRecordParametersrˆ   r‰   N)rt   ru   rv   ry   r   r   rz   r"   r"   r"   r#   r‘   Á   s   
ÿr‘   r   c                R   @   sÈ   e Zd Zeddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQœPƒZdRZedSdTeƒgZdUS )VÚ
GMLAN_RDBIz&$90: VehicleIdentificationNumber (VIN)z!$92: SystemSupplierId (SYSSUPPID)z#$97: SystemNameOrEngineType (SNOET)z1$98: RepairShopCodeOrTesterSerialNumber (RSCOTSN)z$99: ProgrammingDate (PD)z#$9a: DiagnosticDataIdentifier (DDI)z6$9b: XmlConfigurationCompatibilityIdentifier (XMLCCID)z$$9C: XmlDataFilePartNumber (XMLDFPN)z#$9D: XmlDataFileAlphaCode (XMLDFAC)zB$9F: PreviousStoredRepairShopCodeOrTesterSerialNumbers (PSRSCOTSN)z'$A0: manufacturers_enable_counter (MEC)z5$A1: ECUConfigurationOrCustomizationData (ECUCOCGD) 1z5$A2: ECUConfigurationOrCustomizationData (ECUCOCGD) 2z5$A3: ECUConfigurationOrCustomizationData (ECUCOCGD) 3z5$A4: ECUConfigurationOrCustomizationData (ECUCOCGD) 4z5$A5: ECUConfigurationOrCustomizationData (ECUCOCGD) 5z5$A6: ECUConfigurationOrCustomizationData (ECUCOCGD) 6z5$A7: ECUConfigurationOrCustomizationData (ECUCOCGD) 7z5$A8: ECUConfigurationOrCustomizationData (ECUCOCGD) 8z#$B0: ECUDiagnosticAddress (ECUADDR)z5$B1: ECUFunctionalSystemsAndVirtualDevices (ECUFSAVD)z $B2: GM ManufacturingData (GMMD)z:$B3: Data Universal Numbering System Identification (DUNS)z0$B4: Manufacturing Traceability Characters (MTC)z$B5: GM BroadcastCode (GMBC)z$B6: GM Target Vehicle (GMTV)z*$B7: GM Software Usage Description (GMSUD)z.$B8: GM Bench Verification Information (GMBVI)z)$B9: Subnet_Config_List_HighSpeed (SCLHS)z($BA: Subnet_Config_List_LowSpeed (SCLLS)z($BB: Subnet_Config_List_MidSpeed (SCLMS)z*$BC: Subnet_Config_List_NonCan 1 (SCLNC 1)z*$BD: Subnet_Config_List_NonCan 2 (SCLNC 2)z$$BE: Subnet_Config_List_LIN (SCLLIN)z:$BF: Subnet_Config_List_GMLANChassisExpansionBus (SCLGCEB)z"$C0: BootSoftwarePartNumber (BSPN)z'$C1: SoftwareModuleIdentifier (SWMI) 01z'$C2: SoftwareModuleIdentifier (SWMI) 02z'$C3: SoftwareModuleIdentifier (SWMI) 03z'$C4: SoftwareModuleIdentifier (SWMI) 04z'$C5: SoftwareModuleIdentifier (SWMI) 05z'$C6: SoftwareModuleIdentifier (SWMI) 06z'$C7: SoftwareModuleIdentifier (SWMI) 07z'$C8: SoftwareModuleIdentifier (SWMI) 08z'$C9: SoftwareModuleIdentifier (SWMI) 09z'$CA: SoftwareModuleIdentifier (SWMI) 10z$CB: EndModelPartNumberz$CC: BaseModelPartNumber (BMPN)z$$D0: BootSoftwarePartNumberAlphaCodez2$D1: SoftwareModuleIdentifierAlphaCode (SWMIAC) 01z2$D2: SoftwareModuleIdentifierAlphaCode (SWMIAC) 02z2$D3: SoftwareModuleIdentifierAlphaCode (SWMIAC) 03z2$D4: SoftwareModuleIdentifierAlphaCode (SWMIAC) 04z2$D5: SoftwareModuleIdentifierAlphaCode (SWMIAC) 05z2$D6: SoftwareModuleIdentifierAlphaCode (SWMIAC) 06z2$D7: SoftwareModuleIdentifierAlphaCode (SWMIAC) 07z2$D8: SoftwareModuleIdentifierAlphaCode (SWMIAC) 08z2$D9: SoftwareModuleIdentifierAlphaCode (SWMIAC) 09z2$DA: SoftwareModuleIdentifierAlphaCode (SWMIAC) 10z $DB: EndModelPartNumberAlphaCodez!$DC: BaseModelPartNumberAlphaCodez6$DD: SoftwareModuleIdentifierDataIdentifiers (SWMIDID)z&$DE: GMLANIdentificationData (GMLANID)z$DF: ECUOdometerValue (ECUODO)z$$E0: VehicleLevelDataRecord (VLDR) 0z$$E1: VehicleLevelDataRecord (VLDR) 1z$$E2: VehicleLevelDataRecord (VLDR) 2z$$E3: VehicleLevelDataRecord (VLDR) 3z$$E4: VehicleLevelDataRecord (VLDR) 4z$$E5: VehicleLevelDataRecord (VLDR) 5z$$E6: VehicleLevelDataRecord (VLDR) 6z$$E7: VehicleLevelDataRecord (VLDR) 7z=$E8: Subnet_Config_List_GMLANPowertrainExpansionBus (SCLGPEB)z?$E9: Subnet_Config_List_GMLANFrontObjectExpansionBus (SCLGFOEB)z>$EA: Subnet_Config_List_GMLANRearObjectExpansionBus (SCLGROEB)z4$EB: Subnet_Config_List_GMLANExpansionBus1 (SCLGEB1)z4$EC: Subnet_Config_List_GMLANExpansionBus2 (SCLGEB2)z4$ED: Subnet_Config_List_GMLANExpansionBus3 (SCLGEB3)z4$EE: Subnet_Config_List_GMLANExpansionBus4 (SCLGEB4)z4$EF: Subnet_Config_List_GMLANExpansionBus5 (SCLGEB5))Pé�   é’   é—   é˜   é™   éš   é›   éœ   é�   éŸ   é    é¡   r\   é£   é¤   r]   é¦   é§   é¨   é°   é±   é²   é³   é´   éµ   é¶   é·   é¸   é¹   éº   é»   é¼   é½   é¾   é¿   éÀ   éÁ   éÂ   éÃ   éÄ   éÅ   éÆ   éÇ   éÈ   éÉ   éÊ   éË   éÌ   éÐ   éÑ   éÒ   éÓ   éÔ   éÕ   éÖ   é×   éØ   éÙ   éÚ   éÛ   éÜ   éÝ   éÞ   éß   éà   éá   ra   éã   éä   rb   éæ   éç   éè   rc   rd   éë   éì   éí   re   éï   r'   ÚdataIdentifierr   N)rt   ru   rv   r   ÚdataIdentifiersry   r   rz   r"   r"   r"   r#   r’   Ì   sª   ®U
ÿr’   r@   c                   @   s(   e Zd ZdZeddejƒgZdd„ ZdS )ÚGMLAN_RDBIPRr1   rÜ   r   c                 C   s   t |tƒo|j| jkS r�   )rh   r’   rÜ   rl   r"   r"   r#   rk   1  s    

ÿzGMLAN_RDBIPR.answersN©	rt   ru   rv   ry   r   r’   rÝ   rz   rk   r"   r"   r"   r#   rÞ   +  s   ÿrÞ   rO   c                   @   s6   e Zd ZeddddœƒZdZedg eddeƒƒgZd	S )
ÚGMLAN_RDBPIZOBD_EngineCoolantTemperatureZOBD_EngineRPMZOBD_TimeSinceEngineStart)é   é   é   r(   ÚidentifiersÚparameterIdentifierr   N)	rt   ru   rv   r   rÝ   ry   r   r	   rz   r"   r"   r"   r#   rà   :  s   ýÿÿÿrà   rB   c                   @   s(   e Zd ZdZeddejƒgZdd„ ZdS )ÚGMLAN_RDBPIPRr2   rå   r   c                 C   s   t |tƒo| j|jv S r�   )rh   rà   rå   rä   rl   r"   r"   r#   rk   Q  s    

ÿzGMLAN_RDBPIPR.answersN)	rt   ru   rv   ry   r	   rà   rÝ   rz   rk   r"   r"   r"   r#   ræ   K  s   ÿræ   rQ   c                   @   sH   e Zd ZdZddddddœZedd	eƒeed
g edd	ƒƒdd„ ƒgZ	dS )ÚGMLAN_RDBPKTIr;   ZstopSendingZsendOneResponseZscheduleAtSlowRateZscheduleAtMediumRateZscheduleAtFastRate)r   r‡   r   r   r   r|   r   Zrequest_DPIDsrƒ   c                 C   s
   | j dkS )Nr   r‹   rŒ   r"   r"   r#   r�   h  r‰   zGMLAN_RDBPKTI.<lambda>N)
rt   ru   rv   ry   r~   r   r   r   r   rz   r"   r"   r"   r#   rç   Z  s   û	
ÿþþrç   r_   c                   @   sZ   e Zd ZdZeeddƒdd„ feddƒdd„ feddƒdd„ fgeddƒƒeddƒgZd	S )
Ú
GMLAN_RMBAr)   ÚmemoryAddressr   c                 C   s
   t  d¡S rŠ   ©r   r$   rŒ   r"   r"   r#   r�   v  r‰   zGMLAN_RMBA.<lambda>c                 C   s
   t  d¡S ©Nr   rê   rŒ   r"   r"   r#   r�   x  r‰   c                 C   s
   t  d¡S ©Nr   rê   rŒ   r"   r"   r#   r�   z  r‰   Ú
memorySizeN)	rt   ru   rv   ry   r   r
   r   r   rz   r"   r"   r"   r#   rè   p  s    ÿÿÿû÷
õrè   rC   c                   @   sf   e Zd ZdZeeddƒdd„ feddƒdd„ feddƒdd„ fgeddƒƒedd	d
d�gZ	dd„ Z
dS )ÚGMLAN_RMBAPRr3   ré   r   c                 C   s
   t  d¡S rŠ   rê   rŒ   r"   r"   r#   r�   Š  r‰   zGMLAN_RMBAPR.<lambda>c                 C   s
   t  d¡S rë   rê   rŒ   r"   r"   r#   r�   Œ  r‰   c                 C   s
   t  d¡S rì   rê   rŒ   r"   r"   r#   r�   Ž  r‰   Ú
dataRecordr‰   ro   )Úfmtc                 C   s   t |tƒo|j| jkS r�   )rh   rè   ré   rl   r"   r"   r#   rk   ”  s    

ÿzGMLAN_RMBAPR.answersN)rt   ru   rv   ry   r   r
   r   r   r   rz   rk   r"   r"   r"   r#   rî   „  s"   ÿÿÿû÷
õrî   rR   c                   @   sŠ   e Zd ZdddddddœZeddƒD ]Zdee< q$edd	ƒD ]Zd
ee< q<ed	dƒD ]Zdee< qTdZeddeƒee	ddƒdd„ ƒgZ
dS )ÚGMLAN_SAZReservedByDocumentZSPSrequestSeedZ
SPSsendKeyZDevCtrlrequestSeedZDevCtrlsendKey)r   r‡   r   r   r   éÿ   rá   é   éû   z0Reserved for vehicle manufacturer specific needsrò   z7Reserved for ECU or system supplier manufacturing needsr*   r|   r   ZsecurityKeyc                 C   s   | j d dkS )Nr   r   r‹   rŒ   r"   r"   r#   r�   ±  r‰   zGMLAN_SA.<lambda>N)rt   ru   rv   r~   ÚrangeÚiry   r   r   r
   rz   r"   r"   r"   r#   rñ   �  s&   ú




ÿþrñ   rD   c                   @   s:   e Zd ZdZeddejƒeeddƒdd„ ƒgZ	dd„ Z
d	S )
Ú
GMLAN_SAPRr4   r|   r   ZsecuritySeedc                 C   s   | j d dkS )Nr   r‡   r‹   rŒ   r"   r"   r#   r�   ½  r‰   zGMLAN_SAPR.<lambda>c                 C   s   t |tƒo|j| jkS r�   )rh   rñ   r|   rl   r"   r"   r#   rk   À  s    

ÿzGMLAN_SAPR.answersN)rt   ru   rv   ry   r   rñ   r~   r   r
   rz   rk   r"   r"   r"   r#   r÷   ¸  s   
ÿþr÷   rS   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )Ú	GMLAN_DDMr+   ÚDPIDIdentifierr   ZPIDDatas     N)rt   ru   rv   ry   r   r   rz   r"   r"   r"   r#   rø   É  s   þrø   rF   c                   @   s$   e Zd ZdZeddƒgZdd„ ZdS )ÚGMLAN_DDMPRr5   rù   r   c                 C   s   t |tƒo|j| jkS r�   )rh   rø   rù   rl   r"   r"   r#   rk   Ú  s    

ÿzGMLAN_DDMPR.answersN©rt   ru   rv   ry   r   rz   rk   r"   r"   r"   r#   rú   Ô  s   ÿrú   rU   c                   @   sb   e Zd ZdZeddƒeeddƒdd„ feddƒdd„ feddƒdd„ fgeddƒƒed	dƒgZ	d
S )Ú
GMLAN_DPBAr,   rå   r   ré   c                 C   s
   t  d¡S rŠ   rê   rŒ   r"   r"   r#   r�   ê  r‰   zGMLAN_DPBA.<lambda>c                 C   s
   t  d¡S rë   rê   rŒ   r"   r"   r#   r�   ì  r‰   c                 C   s
   t  d¡S rì   rê   rŒ   r"   r"   r#   r�   î  r‰   rí   N)
rt   ru   rv   ry   r
   r   r   r   r   rz   r"   r"   r"   r#   rü   ã  s"   ÿÿÿû÷
ôrü   rG   c                   @   s$   e Zd ZdZeddƒgZdd„ ZdS )ÚGMLAN_DPBAPRr6   rå   r   c                 C   s   t |tƒo|j| jkS r�   )rh   rü   rå   rl   r"   r"   r#   rk   þ  s    

ÿzGMLAN_DPBAPR.answersN)rt   ru   rv   ry   r
   rz   rk   r"   r"   r"   r#   rý   ø  s   ÿrý   rV   c                   @   sZ   e Zd ZdZeddƒeeddƒdd„ feddƒdd„ feddƒdd„ fgeddƒƒgZ	d	S )
ÚGMLAN_RDr-   ZdataFormatIdentifierr   rí   c                 C   s
   t  d¡S rŠ   rê   rŒ   r"   r"   r#   r�     r‰   zGMLAN_RD.<lambda>c                 C   s
   t  d¡S rë   rê   rŒ   r"   r"   r#   r�     r‰   c                 C   s
   t  d¡S rì   rê   rŒ   r"   r"   r#   r�     r‰   N)
rt   ru   rv   ry   r   r   r
   r   r   rz   r"   r"   r"   r#   rþ     s    ÿÿÿû÷þrþ   rH   c                   @   sn   e Zd ZdddœZdZeddeƒeeddƒdd	„ feddƒd
d	„ fe	ddƒdd	„ fge	ddƒƒe
ddƒgZdS )ÚGMLAN_TDÚdownloadZdownloadAndExecuteOrExecute)r   é€   r.   r|   r   ZstartingAddressc                 C   s
   t  d¡S rŠ   rê   rŒ   r"   r"   r#   r�   '  r‰   zGMLAN_TD.<lambda>c                 C   s
   t  d¡S rë   rê   rŒ   r"   r"   r#   r�   )  r‰   c                 C   s
   t  d¡S rì   rê   rŒ   r"   r"   r#   r�   +  r‰   rï   r‰   N)rt   ru   rv   r~   ry   r   r   r
   r   r   r   rz   r"   r"   r"   r#   rÿ     s(   þ
ÿÿÿû÷
ôrÿ   rI   c                   @   s(   e Zd ZdZeddejƒeddƒgZdS )Ú
GMLAN_WDBIr/   rÜ   r   rï   r‰   N)	rt   ru   rv   ry   r   r’   rÝ   r   rz   r"   r"   r"   r#   r  6  s   þr  rJ   c                   @   s(   e Zd ZdZeddejƒgZdd„ ZdS )ÚGMLAN_WDBIPRr7   rÜ   r   c                 C   s   t |tƒo|j| jkS r�   )rh   r  rÜ   rl   r"   r"   r#   rk   G  s    

ÿzGMLAN_WDBIPR.answersNrß   r"   r"   r"   r#   r  A  s   ÿr  rY   c                   @   s8   e Zd Zddddddddd	d
dœ
ZdZeddeƒgZdS )ÚGMLAN_RPSPRzfully programmedzno op s/w or cal dataz op s/w present, cal data missingz,s/w present, default or no start cal presentzGeneral Memory FaultzRAM Memory FaultzNVRAM Memory FaultzBoot Memory FailurezFlash Memory FailurezEEPROM Memory Failure)
r   r‡   r   r   rM   éQ   rN   éS   éT   éU   Z%ReportProgrammedStatePositiveResponseZprogrammedStater   N)rt   ru   rv   ZprogrammedStatesry   r   rz   r"   r"   r"   r#   r  P  s   ö
ÿr  ra   c                   @   s*   e Zd ZddddœZdZeddeƒgZdS )	ÚGMLAN_PMZrequestProgrammingModeZ requestProgrammingMode_HighSpeedZenableProgrammingMode)r‡   r   r   r9   r|   r   Nr}   r"   r"   r"   r#   r	  g  s   ý
ÿr	  r]   c                   @   s*   e Zd ZddddœZdZeddeƒgZdS )	Ú	GMLAN_RDIZreadStatusOfDTCByDTCNumberZreadStatusOfDTCByStatusMaskZsendOnChangeDTCCount)r  é�   é‚   r:   r|   r   Nr}   r"   r"   r"   r#   r
  w  s   ý
ÿr
  r^   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )ÚGMLAN_RDI_BNZReadStatusOfDTCByDTCNumberr€   r   r�   r‚   N©rt   ru   rv   ry   r   rz   r"   r"   r"   r#   r  †  s
   ýr  r  c                   @   s   e Zd ZdZeddƒgZdS )ÚGMLAN_RDI_BMZReadStatusOfDTCByStatusMaskÚDTCStatusMaskr   Nr  r"   r"   r"   r#   r  ’  s   ÿr  r  c                   @   s   e Zd ZdZeddƒgZdS )ÚGMLAN_RDI_BCZSendOnChangeDTCCountr  r   Nr  r"   r"   r"   r#   r  œ  s   ÿr  r  c                   @   s&   e Zd ZdZeddƒedddƒgZdS )ÚGMLAN_DCr<   Ú
CPIDNumberr   ZCPIDControlBytesr‰   rá   N)rt   ru   rv   ry   r   r   rz   r"   r"   r"   r#   r  ª  s   
þr  r`   c                   @   s$   e Zd ZdZeddƒgZdd„ ZdS )Ú
GMLAN_DCPRr=   r  r   c                 C   s   t |tƒo|j| jkS r�   )rh   r  r  rl   r"   r"   r#   rk   »  s    

ÿzGMLAN_DCPR.answersNrû   r"   r"   r"   r#   r  µ  s   ÿr  re   c                   @   s\   e Zd Zddddddddd	d
dddddœZdZeddejƒeddeƒe	ddƒgZ
dd„ ZdS )ÚGMLAN_NRZServiceNotSupportedZSubFunctionNotSupportedZ*ConditionsNotCorrectOrRequestSequenceErrorZRequestOutOfRangeZ
InvalidKeyZExceedNumberOfAttemptsZRequiredTimeDelayNotExpiredz(RequestCorrectlyReceived-ResponsePendingZSchedulerFullZVoltageOutOfRangeZGeneralProgrammingFailureZDeviceTypeErrorzReadyForDownload-DTCStoredZDeviceControlLimitsExceeded)é   r?   rB   é1   é5   rI   é7   éx   r  éƒ   é…   é‰   r—   rÓ   r8   rr   r   Ú
returnCodeZdeviceControlLimitExceededc                 C   s$   | j |jko"| jdkp"tjd d S )Nr  r   r   )rr   rf   r  r   r   rl   r"   r"   r#   rk   Ü  s    
þzGMLAN_NR.answersN)rt   ru   rv   ZnegativeResponseCodesry   r   r   rx   r   r   rz   rk   r"   r"   r"   r#   r  Ä  s*   ò
ýr  r[   )@rp   Zscapy.contrib.automotiver   Zscapy.fieldsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Zscapy.packetr   r   r   Zscapy.configr   Zscapy.contrib.isotpr   r   ÚKeyErrorÚinfor   r{   r   r†   rŽ   r�   r‘   r’   rÞ   rà   ræ   rç   rè   rî   rñ   r÷   rø   rú   rü   rý   rþ   rÿ   r  r  r  r	  r
  r  r  r  r  r  r  r"   r"   r"   r#   Ú<module>
   s˜   H
Q\	