a
    kÄ#d²‡  ã                   @   sŒ  d dl Z d dlmZ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 d dlmZ d dlmZ d dlmZ d dlmZ dd	d
dddddddœ	ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G d d!„ d!eƒZ!G d"d#„ d#eƒZ"G d$d%„ d%eƒZ#G d&d'„ d'eƒZ$G d(d)„ d)eƒZ%G d*d+„ d+eƒZ&G d,d-„ d-eƒZ'G d.d/„ d/eƒZ(G d0d1„ d1eƒZ)G d2d3„ d3eƒZ*G d4d5„ d5eƒZ+G d6d7„ d7eƒZ,G d8d9„ d9eƒZ-G d:d;„ d;eƒZ.G d<d=„ d=eƒZ/d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMœZ0G dNdO„ dOeƒZ1G dPdQ„ dQeƒZ2G dRdS„ dSeƒZ3G dTdU„ dUeƒZ4G dVdW„ dWeƒZ5G dXdY„ dYeƒZ6G dZd[„ d[eƒZ7G d\d]„ d]eƒZ8G d^d_„ d_eƒZ9G d`da„ daeƒZ:G dbdc„ dceƒZ;G ddde„ deeƒZ<G dfdg„ dgeƒZ=G dhdi„ dieƒZ>G djdk„ dkeƒZ?G dldm„ dmeƒZ@G dndo„ doeƒZAG dpdq„ dqeƒZBG drds„ dseƒZCG dtdu„ dueƒZDG dvdw„ dweƒZEG dxdy„ dyeƒZFG dzd{„ d{eƒZGG d|d}„ d}eƒZHG d~d„ deƒZIG d€d�„ d�eHƒZJG d‚dƒ„ dƒeIƒZKG d„d…„ d…eƒZLG d†d‡„ d‡eƒZMG dˆd‰„ d‰eƒZNG dŠd‹„ d‹eƒZOG dŒd�„ d�eƒZPG dŽd�„ d�eƒZQG d�d‘„ d‘eƒZRG d’d“„ d“eƒZSG d”d•„ d•eƒZTG d–d—„ d—eƒZUd˜d™dšd›dœœZVd�dždŸd d¡d¢d£d¤œZWd¥d¦d§d¨d©dªd«œZXd¬d­d®œZYG d¯d°„ d°eƒZZG d±d²„ d²eƒZ[G d³d´„ d´eƒZ\dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀœZ]dÁdÂdÃdÄdÅdÆdÇdÈdÉdÊdËdÀœZ^dÌdÍdÎdÏdÐdÐdÑdÒdÓdÔdÕdÖd×œZ_G dØdÙ„ dÙeƒZ`G dÚdÛ„ dÛeƒZaG dÜdÝ„ dÝeƒZbi Zci Zdi ZeG dÞdß„ dßeƒZfG dàdá„ dáeƒZgG dâdã„ dãeƒZhG dädå„ dåeƒZiG dædç„ dçeƒZjeee!e$e'e*e-e1e4e7e:e=e@eDeIeMePeSdèœZkee e#e&e)e,e/e3e6e9e<e?eBeGeLeOeReUe\déœZleee"e%e(e+e.e2e5e8e;e>eAeFeKeNeQeTdèœZmdêeZiZndêe[iZoG dëdì„ dìeƒZpG dídî„ dîeƒZqeeepdïdð� eeeqdïdñ� dS )òé    N)ÚPacketÚbind_layers)Ú
XByteFieldÚXShortFieldÚStrLenFieldÚByteEnumFieldÚBitFieldLenFieldÚ	ByteFieldÚConditionalFieldÚ	EnumFieldÚFieldListFieldÚ
ShortFieldÚStrFixedLenFieldÚXShortEnumField)ÚTCP)Úorb)Úconf)ÚVolatileValuezIllegal Function CodezIllegal Data AddresszIllegal Data ValuezServer Device FailureZAcknowledgezServer Device BusyzMemory Parity ErrorzGateway Path Unavailablez'Gateway Target Device Failed to Respond)	é   é   é   é   é   é   é   é
   é   c                   @   s   e Zd Zdd„ ZdS )Ú_ModbusPDUNoPayloadc                 C   s   dS )N)ó    N© )ÚselfÚsr   r   úK/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/modbus.pyÚextract_padding&   s    z#_ModbusPDUNoPayload.extract_paddingN)Ú__name__Ú
__module__Ú__qualname__r#   r   r   r   r"   r   $   s   r   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )ÚModbusPDU01ReadCoilsRequestzRead Coils RequestÚfuncCoder   Ú	startAddrr   ÚquantityN©r$   r%   r&   Únamer   r   Úfields_descr   r   r   r"   r'   *   s
   þr'   c                   @   sD   e Zd ZdZeddƒeddddd�edd	ged
d	ƒdd„ d�gZdS )ÚModbusPDU01ReadCoilsResponsezRead Coils Responser(   r   Ú	byteCountNr   Z
coilStatus©Úcount_ofr   Ú c                 C   s   | j S ©N©r/   ©Úpktr   r   r"   Ú<lambda>7   r   z%ModbusPDU01ReadCoilsResponse.<lambda>©Z
count_from)	r$   r%   r&   r,   r   r   r   r	   r-   r   r   r   r"   r.   1   s   ÿÿýr.   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚModbusPDU01ReadCoilsErrorzRead Coils Exceptionr(   é�   Ú
exceptCoder   N©r$   r%   r&   r,   r   r   Ú_modbus_exceptionsr-   r   r   r   r"   r9   :   s   
ÿr9   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )	Ú$ModbusPDU02ReadDiscreteInputsRequestzRead Discrete Inputsr(   r   r)   r   r*   r   Nr+   r   r   r   r"   r>   @   s
   þr>   c                   @   sH   e Zd ZdZdZeddƒeddddd	�edd
gedd
ƒdd„ d�gZ	dS )Ú%ModbusPDU02ReadDiscreteInputsResponsez· inputStatus: result is represented as bytes, padded with 0 to have a
        integer number of bytes. The field does not parse this result and
        present the bytes directly
    zRead Discrete Inputs Responser(   r   r/   Nr   ZinputStatusr0   r   r2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7   Q   r   z.ModbusPDU02ReadDiscreteInputsResponse.<lambda>r8   )
r$   r%   r&   Ú__doc__r,   r   r   r   r	   r-   r   r   r   r"   r?   G   s   ÿÿýr?   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú"ModbusPDU02ReadDiscreteInputsErrorzRead Discrete Inputs Exceptionr(   é‚   r;   r   Nr<   r   r   r   r"   rA   T   s   
ÿrA   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )	Ú&ModbusPDU03ReadHoldingRegistersRequestzRead Holding Registersr(   r   r)   r   r*   r   Nr+   r   r   r   r"   rC   Z   s
   þrC   c                   @   sJ   e Zd ZdZeddƒedddddd	„ d
�eddgeddƒdd	„ d�gZdS )Ú'ModbusPDU03ReadHoldingRegistersResponsezRead Holding Registers Responser(   r   r/   Nr   ÚregisterValc                 C   s   |d S ©Nr   r   ©r6   Úxr   r   r"   r7   f   r   z0ModbusPDU03ReadHoldingRegistersResponse.<lambda>©r1   Úadjustr   r2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7   i   r   r8   ©	r$   r%   r&   r,   r   r   r   r   r-   r   r   r   r"   rD   a   s   þþürD   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú$ModbusPDU03ReadHoldingRegistersErrorz Read Holding Registers Exceptionr(   éƒ   r;   r   Nr<   r   r   r   r"   rL   l   s   
ÿrL   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )	Ú$ModbusPDU04ReadInputRegistersRequestzRead Input Registersr(   r   r)   r   r*   r   Nr+   r   r   r   r"   rN   r   s
   þrN   c                   @   sJ   e Zd ZdZeddƒedddddd	„ d
�eddgeddƒdd	„ d�gZdS )Ú%ModbusPDU04ReadInputRegistersResponsezRead Input Registers Responser(   r   r/   Nr   rE   c                 C   s   |d S rF   r   rG   r   r   r"   r7   ~   r   z.ModbusPDU04ReadInputRegistersResponse.<lambda>rI   r   r2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7   �   r   r8   rK   r   r   r   r"   rO   y   s   þþürO   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú"ModbusPDU04ReadInputRegistersErrorzRead Input Registers Exceptionr(   é„   r;   r   Nr<   r   r   r   r"   rP   „   s   
ÿrP   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )Ú!ModbusPDU05WriteSingleCoilRequestúWrite Single Coilr(   r   Ú
outputAddrr   ÚoutputValueNr+   r   r   r   r"   rR   Š   s
   ürR   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )Ú"ModbusPDU05WriteSingleCoilResponserS   r(   r   rT   r   rU   Nr+   r   r   r   r"   rV   “   s
   ürV   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚModbusPDU05WriteSingleCoilErrorzWrite Single Coil Exceptionr(   é…   r;   r   Nr<   r   r   r   r"   rW   �   s   
ÿrW   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )Ú%ModbusPDU06WriteSingleRegisterRequestzWrite Single Registerr(   r   ÚregisterAddrr   ÚregisterValueNr+   r   r   r   r"   rY   £   s
   þrY   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )Ú&ModbusPDU06WriteSingleRegisterResponsezWrite Single Register Responser(   r   rZ   r   r[   Nr+   r   r   r   r"   r\   ª   s
   þr\   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú#ModbusPDU06WriteSingleRegisterErrorzWrite Single Register Exceptionr(   é†   r;   r   Nr<   r   r   r   r"   r]   ±   s   
ÿr]   c                   @   s   e Zd ZdZeddƒgZdS )Ú%ModbusPDU07ReadExceptionStatusRequestzRead Exception Statusr(   é   N©r$   r%   r&   r,   r   r-   r   r   r   r"   r_   ·   s   r_   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )Ú&ModbusPDU07ReadExceptionStatusResponsezRead Exception Status Responser(   r`   r)   r   Nra   r   r   r   r"   rb   ¼   s   ÿrb   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú#ModbusPDU07ReadExceptionStatusErrorúRead Exception Status Exceptionr(   é‡   r;   r   Nr<   r   r   r   r"   rc   Â   s   
ÿrc   zReturn Query DatazRestart Communications OptionzReturn Diagnostic RegisterzChange ASCII Input DelimiterzForce Listen Only Modez&Clear Counters and Diagnostic RegisterzReturn Bus Message Countz$Return Bus Communication Error Countz Return Bus Exception Error CountzReturn Slave Message CountzReturn Slave No Response CountzReturn Slave NAK CountzReturn Slave Busy Countz"Return Bus Character Overrun CountzClear Overrun Counter and Flag)r   r   r   r   r   r   r   é   é   é   é   é   é   é   é   c                   @   s8   e Zd ZdZeddƒeddeƒeddgeddƒƒgZ	dS )	ÚModbusPDU08DiagnosticsRequestÚDiagnosticsr(   r   ÚsubFuncr   Údatar2   N©
r$   r%   r&   r,   r   r   Ú_diagnostics_sub_functionr   r   r-   r   r   r   r"   rn   Û   s   ÿýrn   c                   @   s8   e Zd ZdZeddƒeddeƒeddgeddƒƒgZ	dS )	ÚModbusPDU08DiagnosticsResponsezDiagnostics Responser(   r   rp   r   rq   r2   Nrr   r   r   r   r"   rt   ã   s   ÿýrt   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚModbusPDU08DiagnosticsErrorzDiagnostics Exceptionr(   éˆ   ÚexceptionCoder   Nr<   r   r   r   r"   ru   ë   s   
ÿru   c                   @   s   e Zd ZdZeddƒgZdS )Ú%ModbusPDU0BGetCommEventCounterRequestzGet Comm Event Counterr(   r   Nra   r   r   r   r"   rx   ñ   s   rx   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )	Ú&ModbusPDU0BGetCommEventCounterResponsezGet Comm Event Counter Responser(   r   Ústatusr   Ú
eventCountéÿÿ  Nr+   r   r   r   r"   ry   ö   s
   þry   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú#ModbusPDU0BGetCommEventCounterErrorz Get Comm Event Counter Exceptionr(   é‹   rw   r   Nr<   r   r   r   r"   r}   ý   s   
ÿr}   c                   @   s   e Zd ZdZeddƒgZdS )Ú!ModbusPDU0CGetCommEventLogRequestzGet Comm Event Logr(   rf   Nra   r   r   r   r"   r     s   r   c                   @   sP   e Zd ZdZeddƒeddƒeddƒedd	ƒed
dƒedddgeddƒƒgZdS )Ú"ModbusPDU0CGetCommEventLogResponsezGet Comm Event Log Responser(   rf   r/   r   rz   r   r{   i  ZmessageCounti!  Úeventé    r2   N)	r$   r%   r&   r,   r   r	   r   r   r-   r   r   r   r"   r€     s   ûr€   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚModbusPDU0CGetCommEventLogErrorzGet Comm Event Log Exceptionr(   éŒ   rw   r   Nra   r   r   r   r"   rƒ     s   ÿrƒ   c                
   @   sT   e Zd ZdZeddƒeddƒeddƒedd	d
dd�eddgeddƒdd„ d�gZd	S )Ú$ModbusPDU0FWriteMultipleCoilsRequestzWrite Multiple Coilsr(   ri   r)   r   ÚquantityOutputr   r/   Nr   ÚoutputsValuer0   r2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7      r   z-ModbusPDU0FWriteMultipleCoilsRequest.<lambda>r8   ©	r$   r%   r&   r,   r   r   r   r   r-   r   r   r   r"   r…     s   ÿÿûr…   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )	Ú%ModbusPDU0FWriteMultipleCoilsResponsezWrite Multiple Coils Responser(   ri   r)   r   r†   r   Nr+   r   r   r   r"   r‰   #  s
   þr‰   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú"ModbusPDU0FWriteMultipleCoilsErrorzWrite Multiple Coils Exceptionr(   é�   r;   r   Nr<   r   r   r   r"   rŠ   *  s   
ÿrŠ   c                
   @   s`   e Zd ZdZeddƒeddƒeddddd	�ed
ddddd„ d�eddgeddƒdd„ d�gZdS )Ú(ModbusPDU10WriteMultipleRegistersRequestzWrite Multiple Registersr(   rj   r)   r   ÚquantityRegistersNr‡   r0   r/   r   c                 C   s   |d S rF   r   rG   r   r   r"   r7   8  r   z1ModbusPDU10WriteMultipleRegistersRequest.<lambda>rI   r2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7   ;  r   r8   rˆ   r   r   r   r"   rŒ   0  s   ÿþþùrŒ   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )	Ú)ModbusPDU10WriteMultipleRegistersResponsez!Write Multiple Registers Responser(   rj   r)   r   r�   r   Nr+   r   r   r   r"   rŽ   >  s
   þrŽ   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú&ModbusPDU10WriteMultipleRegistersErrorz"Write Multiple Registers Exceptionr(   é�   r;   r   Nr<   r   r   r   r"   r�   E  s   
ÿr�   c                   @   s   e Zd ZdZeddƒgZdS )ÚModbusPDU11ReportSlaveIdRequestzReport Slave Idr(   rk   Nra   r   r   r   r"   r‘   K  s   r‘   c                   @   sV   e Zd ZdZeddƒeddddd�eedd	d
d„ d�dd„ ƒeeddƒdd„ ƒgZdS )Ú ModbusPDU11ReportSlaveIdResponsezReport Slave Id Responser(   rk   r/   Nr   ZslaveId©Ú	length_ofr2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7   V  r   z)ModbusPDU11ReportSlaveIdResponse.<lambda>©Zlength_fromc                 C   s
   | j dkS ©Nr   r4   r5   r   r   r"   r7   W  r   ZrunIdicatorStatusr   c                 C   s
   | j dkS r–   r4   r5   r   r   r"   r7   Y  r   )	r$   r%   r&   r,   r   r   r
   r   r-   r   r   r   r"   r’   P  s   ÿþ
ÿúr’   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚModbusPDU11ReportSlaveIdErrorzReport Slave Id Exceptionr(   é‘   r;   r   Nr<   r   r   r   r"   r—   ]  s   
ÿr—   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 )ÚModbusReadFileSubRequestzSub-request of Read File RecordÚrefTyper   Ú
fileNumberr   ÚrecordNumberr   ÚrecordLengthc                 C   s   t S r3   )r™   ©r    Úpayloadr   r   r"   Úguess_payload_classj  s    z,ModbusReadFileSubRequest.guess_payload_classN)r$   r%   r&   r,   r	   r   r-   r    r   r   r   r"   r™   c  s   ýr™   c                   @   s4   e Zd ZdZeddƒeddƒgZdd„ Zdd	„ ZdS )
Ú ModbusPDU14ReadFileRecordRequestzRead File Recordr(   rm   r/   Nc                 C   s   | j dkrtS t | |¡S d S r–   )r/   r™   r   r    rž   r   r   r"   r    s  s    
z4ModbusPDU14ReadFileRecordRequest.guess_payload_classc                 C   s>   | j d u r6t|ƒ}|d d… t d|¡ |dd …  }|| S ©Nr   z!Br   )r/   ÚlenÚstructÚpack©r    ÚpZpayZtmp_lenr   r   r"   Ú
post_buildy  s    
$z+ModbusPDU14ReadFileRecordRequest.post_build)	r$   r%   r&   r,   r   r	   r-   r    r¨   r   r   r   r"   r¡   n  s   ÿr¡   c                   @   sR   e Zd ZdZedddddd„ d�ed	d
ƒeddgeddƒdd„ d�gZdd„ Z	dS )ÚModbusReadFileSubResponsezSub-responseÚ
respLengthNr   ÚrecDatac                 C   s   |d d S )Nr   r   r   ©r6   r§   r   r   r"   r7   „  r   z"ModbusReadFileSubResponse.<lambda>rI   rš   r   r   r2   c                 C   s   | j d d S )Nr   r   )rª   r5   r   r   r"   r7   ‡  r   r8   c                 C   s   t S r3   )r©   rž   r   r   r"   r    Š  s    z-ModbusReadFileSubResponse.guess_payload_class)
r$   r%   r&   r,   r   r	   r   r   r-   r    r   r   r   r"   r©   €  s   
ÿÿür©   c                   @   s4   e Zd ZdZeddƒeddƒgZdd„ Zdd	„ ZdS )
Ú!ModbusPDU14ReadFileRecordResponsezRead File Record Responser(   rm   Ú
dataLengthNc                 C   s>   | j d u r6t|ƒ}|d d… t d|¡ |dd …  }|| S r¢   ©r®   r£   r¤   r¥   r¦   r   r   r"   r¨   “  s    
$z,ModbusPDU14ReadFileRecordResponse.post_buildc                 C   s   | j dkrtS t | |¡S d S r–   )r®   r©   r   r    rž   r   r   r"   r    ™  s    
z5ModbusPDU14ReadFileRecordResponse.guess_payload_class©	r$   r%   r&   r,   r   r	   r-   r¨   r    r   r   r   r"   r­   Ž  s   ÿr­   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚModbusPDU14ReadFileRecordErrorzRead File Record Exceptionr(   é”   r;   r   Nr<   r   r   r   r"   r±      s   
ÿr±   c                
   @   sb   e Zd ZdZeddƒeddƒeddƒedd	d
ddd„ d�eddgeddƒdd„ d�gZdd„ Z	d	S )ÚModbusWriteFileSubRequestz Sub request of Write File Recordrš   r   r›   r   rœ   r   r�   Nrj   Z
recordDatac                 C   s   |d S rF   r   r¬   r   r   r"   r7   ¯  r   z"ModbusWriteFileSubRequest.<lambda>)r”   rJ   r2   c                 C   s
   | j d S rF   )r�   r5   r   r   r"   r7   ²  r   r•   c                 C   s   |rt S d S r3   )r³   rž   r   r   r"   r    µ  s    z-ModbusWriteFileSubRequest.guess_payload_class)
r$   r%   r&   r,   r	   r   r   r   r-   r    r   r   r   r"   r³   §  s   þþùr³   c                   @   s4   e Zd ZdZeddƒeddƒgZdd„ Zdd	„ ZdS )
Ú!ModbusPDU15WriteFileRecordRequestzWrite File Recordr(   é   r®   Nc                 C   sB   | j d u r>t|ƒ}|d d… t d|¡ |dd …  }|| S d S r¢   r¯   r¦   r   r   r"   r¨   ¿  s    
$z,ModbusPDU15WriteFileRecordRequest.post_buildc                 C   s   | j dkrtS t | |¡S d S r–   )r®   r³   r   r    rž   r   r   r"   r    Å  s    
z5ModbusPDU15WriteFileRecordRequest.guess_payload_classr°   r   r   r   r"   r´   º  s   ÿr´   c                   @   s   e Zd ZdZdd„ ZdS )ÚModbusWriteFileSubResponsez!Sub response of Write File Recordc                 C   s   |rt S d S r3   )r¶   rž   r   r   r"   r    Ï  s    z.ModbusWriteFileSubResponse.guess_payload_classN©r$   r%   r&   r,   r    r   r   r   r"   r¶   Ì  s   r¶   c                   @   s   e Zd ZdZdd„ ZdS )Ú"ModbusPDU15WriteFileRecordResponsezWrite File Record Responsec                 C   s   | j dkrtS t | |¡S d S r–   )r®   r¶   r   r    rž   r   r   r"   r    ×  s    
z6ModbusPDU15WriteFileRecordResponse.guess_payload_classNr·   r   r   r   r"   r¸   Ô  s   r¸   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚModbusPDU15WriteFileRecordErrorzWrite File Record Exceptionr(   é•   r;   r   Nr<   r   r   r   r"   r¹   Þ  s   
ÿr¹   c                   @   s4   e Zd ZdZeddƒeddƒeddƒeddƒgZd	S )
Ú#ModbusPDU16MaskWriteRegisterRequestzMask Write Registerr(   é   ÚrefAddrr   ÚandMaskr|   ÚorMaskNr+   r   r   r   r"   r»   ä  s   ýr»   c                   @   s4   e Zd ZdZeddƒeddƒeddƒeddƒgZd	S )
Ú$ModbusPDU16MaskWriteRegisterResponsezMask Write Register Responser(   r¼   r½   r   r¾   r|   r¿   Nr+   r   r   r   r"   rÀ   í  s   ýrÀ   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú!ModbusPDU16MaskWriteRegisterErrorzMask Write Register Exceptionr(   é–   r;   r   Nr<   r   r   r   r"   rÁ   õ  s   
ÿrÁ   c                   @   sp   e Zd ZdZeddƒeddƒeddƒeddƒed	d
ddd�edd
dddd„ d�eddgeddƒdd„ d�gZd
S )Ú,ModbusPDU17ReadWriteMultipleRegistersRequestzRead Write Multiple Registersr(   é   ZreadStartingAddrr   ZreadQuantityRegistersr   ZwriteStartingAddrZwriteQuantityRegistersNrj   ZwriteRegistersValuer0   r/   r   c                 C   s   |d S rF   r   rG   r   r   r"   r7     r   z5ModbusPDU17ReadWriteMultipleRegistersRequest.<lambda>rI   r2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7     r   r8   rˆ   r   r   r   r"   rÃ   û  s"   ÿþþ÷rÃ   c                   @   sJ   e Zd ZdZeddƒedddddd	„ d
�eddgeddƒdd	„ d�gZdS )Ú-ModbusPDU17ReadWriteMultipleRegistersResponsez&Read Write Multiple Registers Responser(   rÄ   r/   Nr   rE   c                 C   s   |d S rF   r   rG   r   r   r"   r7     r   z6ModbusPDU17ReadWriteMultipleRegistersResponse.<lambda>rI   r   r2   c                 C   s   | j S r3   r4   r5   r   r   r"   r7     r   r8   rK   r   r   r   r"   rÅ     s   þþürÅ   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú*ModbusPDU17ReadWriteMultipleRegistersErrorzRead Write Multiple Exceptionr(   é—   r;   r   Nr<   r   r   r   r"   rÆ     s   
ÿrÆ   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚModbusPDU18ReadFIFOQueueRequestzRead FIFO Queuer(   é   ZFIFOPointerAddrr   Nr+   r   r   r   r"   rÈ     s   ÿrÈ   c                	   @   sV   e Zd ZdZeddƒedddddd	„ d
�eddddd�edg eddƒdd	„ d�gZdS )Ú ModbusPDU18ReadFIFOQueueResponsezRead FIFO Queue Responser(   rÉ   r/   Nrj   ZFIFOValc                 C   s   |d d S rF   r   r¬   r   r   r"   r7   '  r   z)ModbusPDU18ReadFIFOQueueResponse.<lambda>rI   Z	FIFOCountr0   r2   r   c                 C   s   | j S r3   r4   r5   r   r   r"   r7   *  r   r8   rK   r   r   r   r"   rÊ   "  s   
ÿÿûrÊ   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚModbusPDU18ReadFIFOQueueErrorzRead FIFO Queue Exceptionr(   é˜   r;   r   Nr<   r   r   r   r"   rË   -  s   
ÿrË   ZBasicZRegularZExtendedZSpecific)r   r   r   r   Z
VendorNameZProductCodeZMajorMinorRevisionZ	VendorUrlZProductNameZ	ModelNameZUserApplicationName)r   r   r   r   r   r   r   z"Basic Identification (stream only)z$Regular Identification (stream only)z%Extended Identification (stream only)z3Basic Identification (stream and individual access)z5Regular Identification (stream and individual access)z6Extended Identification (stream and individual access))r   r   r   r:   rB   rM   ZNoZYes)r   r   c                   @   s8   e Zd ZdZeddƒeddƒeddeƒedd	eƒgZd
S )Ú,ModbusPDU2B0EReadDeviceIdentificationRequestúRead Device Identificationr(   é+   ÚMEITyperh   ÚreadCoder   ZobjectIdr   N)	r$   r%   r&   r,   r   r   Ú_read_device_id_codesÚ_read_device_id_object_idr-   r   r   r   r"   rÍ   _  s   

ýrÍ   c                	   @   s\   e Zd ZdZeddƒeddƒeddeƒedd	eƒed
deƒedde	ƒe
ddƒgZdd„ ZdS )Ú-ModbusPDU2B0EReadDeviceIdentificationResponserÎ   r(   rÏ   rÐ   rh   rÑ   r   ZconformityLevelr   Úmorer   Z	nextObjIdÚobjCountc                 C   s   | j dkrtS t | |¡S d S r–   )rÖ   ÚModbusObjectIdr   r    rž   r   r   r"   r    r  s    
zAModbusPDU2B0EReadDeviceIdentificationResponse.guess_payload_classN)r$   r%   r&   r,   r   r   rÒ   Ú_read_device_id_conformity_lvlÚ_read_device_id_more_followrÓ   r	   r-   r    r   r   r   r"   rÔ   g  s   
ÿ

ù	rÔ   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )Ú*ModbusPDU2B0EReadDeviceIdentificationErrorrd   r(   é«   r;   r   Nr<   r   r   r   r"   rÚ   y  s   
ÿrÚ   z0x09 Unknown Reserved Requestz0x0a Unknown Reserved Requestz0x0d Unknown Reserved Requestz0x0e Unknown Reserved Requestz0x29 Unknown Reserved Requestz0x2a Unknown Reserved Requestz#Specific Schneider Electric Requestz0x5b Unknown Reserved Requestz0x7d Unknown Reserved Requestz0x7e Unknown Reserved Requestz0x7f Unknown Reserved Request)é	   r   rg   rh   é)   é*   éZ   é[   é}   é~   é   z0x09 Unknown Reserved Responsez0x0a Unknown Reserved Responsez0x0d Unknown Reserved Responsez0x0e Unknown Reserved Responsez0x29 Unknown Reserved Responsez0x2a Unknown Reserved Responsez$Specific Schneider Electric Responsez0x5b Unknown Reserved Responsez0x7d Unknown Reserved Responsez0x7e Unknown Reserved Responsez0x7f Unknown Reserved Responsez0x89 Unknown Reserved Errorz0x8a Unknown Reserved Errorz0x8d Unknown Reserved Errorz0x8e Unknown Reserved Errorz0x88 Unknown Reserved Errorz!Specific Schneider Electric Errorz0xdb Unknown Reserved Errorz0xdc Unknown Reserved Errorz0xfd Unknown Reserved Errorz0xfe Unknown Reserved Errorz0xff Unknown Reserved Error)é‰   éŠ   é�   éŽ   é©   éª   éÚ   éÛ   éÜ   éý   éþ   éÿ   c                   @   s0   e Zd ZdZeddeƒedddƒgZdd„ Zd	S )
Ú$ModbusPDUReservedFunctionCodeRequestzReserved Function Code Requestr(   r   rŸ   r2   rï   c                 C   s
   |   d¡S )Nz"Modbus Reserved Request %funcCode%©Zsprintf©r    r   r   r"   Ú	mysummary±  s    z.ModbusPDUReservedFunctionCodeRequest.mysummaryN)	r$   r%   r&   r,   r   Ú_reserved_funccode_requestr   r-   ró   r   r   r   r"   rð   «  s
   

þrð   c                   @   s0   e Zd ZdZeddeƒedddƒgZdd„ Zd	S )
Ú%ModbusPDUReservedFunctionCodeResponsezReserved Function Code Responser(   r   rŸ   r2   rï   c                 C   s
   |   d¡S )Nz#Modbus Reserved Response %funcCode%rñ   rò   r   r   r"   ró   »  s    z/ModbusPDUReservedFunctionCodeResponse.mysummaryN)	r$   r%   r&   r,   r   Ú_reserved_funccode_responser   r-   ró   r   r   r   r"   rõ   µ  s
   

þrõ   c                   @   s0   e Zd ZdZeddeƒedddƒgZdd„ Zd	S )
Ú"ModbusPDUReservedFunctionCodeErrorzReserved Function Code Errorr(   r   rŸ   r2   rï   c                 C   s
   |   d¡S )Nz Modbus Reserved Error %funcCode%rñ   rò   r   r   r"   ró   Å  s    z,ModbusPDUReservedFunctionCodeError.mysummaryN)	r$   r%   r&   r,   r   Ú_reserved_funccode_errorr   r-   ró   r   r   r   r"   r÷   ¿  s
   

þr÷   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚModbusByteEnumFieldÚdefEnumc                 C   s   t  | |||d¡ || _d S )NÚB)r   Ú__init__rú   )r    r,   ÚdefaultÚenumrú   r   r   r"   rü   Ô  s    zModbusByteEnumField.__init__c                 C   s<   | t jvr(t|tƒs(|| jv r(| j| S | jr4| jS t|ƒS r3   )r   ZnoenumÚ
isinstancer   Zi2srú   Úrepr)r    r6   rH   r   r   r"   Ú
i2repr_oneØ  s    ÿ
zModbusByteEnumField.i2repr_oneN)r$   r%   r&   Ú	__slots__rü   r  r   r   r   r"   rù   Ñ  s   rù   c                   @   s2   e Zd ZdZeddedƒedddƒgZdd	„ Zd
S )Ú'ModbusPDUUserDefinedFunctionCodeRequestz"User-Defined Function Code Requestr(   r   z*Unknown user-defined request function CoderŸ   r2   rï   c                 C   s
   |   d¡S )Nz&Modbus User-Defined Request %funcCode%rñ   rò   r   r   r"   ró   é  s    z1ModbusPDUUserDefinedFunctionCodeRequest.mysummaryN)	r$   r%   r&   r,   rù   Ú_userdefined_funccode_requestr   r-   ró   r   r   r   r"   r  á  s   þ
ür  c                   @   s2   e Zd ZdZeddedƒedddƒgZdd	„ Zd
S )Ú(ModbusPDUUserDefinedFunctionCodeResponsez#User-Defined Function Code Responser(   r   z+Unknown user-defined response function CoderŸ   r2   rï   c                 C   s
   |   d¡S )Nz'Modbus User-Defined Response %funcCode%rñ   rò   r   r   r"   ró   õ  s    z2ModbusPDUUserDefinedFunctionCodeResponse.mysummaryN)	r$   r%   r&   r,   rù   Ú_userdefined_funccode_responser   r-   ró   r   r   r   r"   r  í  s   þ
ür  c                   @   s2   e Zd ZdZeddedƒedddƒgZdd	„ Zd
S )Ú%ModbusPDUUserDefinedFunctionCodeErrorz User-Defined Function Code Errorr(   r   z(Unknown user-defined error function CoderŸ   r2   rï   c                 C   s
   |   d¡S )Nz$Modbus User-Defined Error %funcCode%rñ   rò   r   r   r"   ró     s    z/ModbusPDUUserDefinedFunctionCodeError.mysummaryN)	r$   r%   r&   r,   rù   Ú_userdefined_funccode_errorr   r-   ró   r   r   r   r"   r  ù  s   þ
ür  c                   @   sD   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdd„ Z	dS )r×   ZObjectÚidr   ÚlengthNr   Úvaluer“   r2   c                 C   s   | j S r3   )r
  r5   r   r   r"   r7   
  r   zModbusObjectId.<lambda>r•   c                 C   s   t S r3   )r×   rž   r   r   r"   r      s    z"ModbusObjectId.guess_payload_class)
r$   r%   r&   r,   r   rÓ   r   r   r-   r    r   r   r   r"   r×     s   
ÿþr×   )r   r   r   r   r   r   r`   r   r   rf   ri   rj   rk   rm   rµ   r¼   rÄ   rÉ   )r:   rB   rM   rQ   rX   r^   re   rv   r~   r„   r‹   r�   r˜   r²   rº   rÂ   rÇ   rÌ   rÛ   rh   c                   @   sD   e Zd ZdZeddƒeddƒeddƒeddƒgZd	d
„ Zdd„ Z	dS )ÚModbusADURequestÚ	ModbusADUÚtransIdr   ÚprotoIdr£   NÚunitIdrï   c                 C   sl   t |d ƒ}|dkr>t |d ƒ}z
t| W S  ty<   Y n0 z
t| W S  tyZ   Y n0 |tv rhtS tS )Nr   rÏ   r   )r   Ú_mei_types_requestÚKeyErrorÚ_modbus_request_classesrô   rð   r  ©r    rŸ   Zfunction_codeZsub_coder   r   r"   r    d  s    

z$ModbusADURequest.guess_payload_classc                 C   sB   | j d u r:t |ƒd }|d d… t d|¡ |dd …  }|| S ©Nr   r   z!Hr   ©r£   r¤   r¥   r¦   r   r   r"   r¨   u  s    
$zModbusADURequest.post_build©
r$   r%   r&   r,   r   r   r   r-   r    r¨   r   r   r   r"   r  W  s   ør  c                   @   sD   e Zd ZdZeddƒeddƒeddƒeddƒgZd	d
„ Zdd„ Z	dS )ÚModbusADUResponser  r  r   r  r£   Nr  rï   c                 C   s¢   t |d ƒ}|dkr>t |d ƒ}z
t| W S  ty<   Y n0 z
t| W S  tyZ   Y n0 z
t| W S  tyx   Y n0 |tv r†tS |tv r’tS |dk ržt	S t
S )Nr   rÏ   r   é€   )r   Ú_mei_types_responser  Ú_modbus_response_classesÚ_modbus_error_classesrö   rõ   rø   r÷   r  r  r  r   r   r"   r    ‰  s,    


z%ModbusADUResponse.guess_payload_classc                 C   sB   | j d u r:t |ƒd }|d d… t d|¡ |dd …  }|| S r  r  r¦   r   r   r"   r¨   ¢  s    
$zModbusADUResponse.post_buildr  r   r   r   r"   r  |  s   ør  iö  )Údport)Zsport)rr¤   Zscapy.packetr   r   Zscapy.fieldsr   r   r   r   r   r	   r
   r   r   r   r   r   Zscapy.layers.inetr   Zscapy.utilsr   Zscapy.configr   Zscapy.volatiler   r=   r   r'   r.   r9   r>   r?   rA   rC   rD   rL   rN   rO   rP   rR   rV   rW   rY   r\   r]   r_   rb   rc   rs   rn   rt   ru   rx   ry   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Ù   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Î  8ø		
ñ

	ýúúÿõõô


îíîÿÿ%-