
    hć                        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e          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z  G d  d!e          Z! G d" d#e          Z" G d$ d%e          Z# G d& d'e          Z$ G d( d)e          Z% G d* d+e          Z& G d, d-e          Z' G d. d/e          Z( G d0 d1e          Z) G d2 d3e          Z* G d4 d5e          Z+ G d6 d7e          Z, G d8 d9e          Z- G d: d;e          Z. G d< d=e          Z/d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMZ0 G dN dOe          Z1 G dP dQe          Z2 G dR dSe          Z3 G dT dUe          Z4 G dV dWe          Z5 G dX dYe          Z6 G dZ d[e          Z7 G d\ d]e          Z8 G d^ d_e          Z9 G d` dae          Z: G db dce          Z; G dd dee          Z< G df dge          Z= G dh die          Z> G dj dke          Z? G dl dme          Z@ G dn doe          ZA G dp dqe          ZB G dr dse          ZC G dt due          ZD G dv dwe          ZE G dx dye          ZF G dz d{e          ZG G d| d}e          ZH G d~ de          ZI G d deH          ZJ G d deI          ZK G d de          ZL G d de          ZM G d de          ZN G d de          ZO G d de          ZP G d de          ZQ G d de          ZR G d de          ZS G d de          ZT G d de          ZUdddddZVddddddddZWdddddddZXdddZY G d de          ZZ G d de          Z[ G d de          Z\ddddddddddddZ]ddddddddddddZ^dddddddddddddלZ_ G d؄ de          Z` G dڄ de          Za G d܄ de          Zbi Zci Zdi Ze G dބ de          Zf G d de          Zg G d de          Zh G d de          Zi G d de          Zji dedede!de$de'de*de-de1de4de7de:de=de@deDdeIdeMdePdeSiZki dede de#de&de)de,d e/de3de6de9de<de?deBdeGdeLd	eOd
eReUe\dZli dedede"de%de(de+de.de2de5de8de;de>deAdeFdeKdeNdeQdeTiZmdeZiZnde[iZo G d de          Zp G d de          Zq eeepd            eeeq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 FailureAcknowledgezServer Device BusyzMemory Parity ErrorzGateway Path Unavailablez'Gateway Target Device Failed to Respond)	                     
      c                       e Zd Zd ZdS )_ModbusPDUNoPayloadc                     dS )N)    N )selfss     X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/modbus.pyextract_paddingz#_ModbusPDUNoPayload.extract_padding&   s    yr"   N)__name__
__module____qualname__r'   r#   r"   r&   r    r    $   s#            r"   r    c                   X    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,   *   sG        D:j$//;{F33;z6224KKKr"   r,   c            
       |    e Zd ZdZ edd           edddd           edd	g ed
d	          d           gZdS )ModbusPDU01ReadCoilsResponsezRead Coils Responser-   r   	byteCountNr   
coilStatuscount_ofr    c                     | j         S Nr5   pkts    r&   <lambda>z%ModbusPDU01ReadCoilsResponse.<lambda>7        r"   
count_from)	r(   r)   r*   r1   r   r	   r   r
   r2   r#   r"   r&   r4   r4   1   sy         D:j$//##Kq-9; ; ;!>,		"d8K8K-F-FH H HIKKKr"   r4   c                   D    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*   r1   r   r   _modbus_exceptionsr2   r#   r"   r&   rD   rD   :   s<        !D:j$// =q2DEEGKKKr"   rD   c                   X    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   Nr0   r#   r"   r&   rJ   rJ   @   G        !D:j$//;{F33;z6224KKKr"   rJ   c            
           e Zd ZdZdZ edd           edddd	           edd
g e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   r5   Nr   inputStatusr7   r   r9   c                     | j         S r;   r<   r=   s    r&   r?   z.ModbusPDU02ReadDiscreteInputsResponse.<lambda>Q   r@   r"   rA   )
r(   r)   r*   __doc__r1   r   r	   r   r
   r2   r#   r"   r&   rM   rM   G   s          +D:j$//##Kq-:< < <!>-$2t9L9L-F-FH H HIKKKr"   rM   c                   D    e Zd ZdZ edd           edde          gZdS )"ModbusPDU02ReadDiscreteInputsErrorzRead Discrete Inputs Exceptionr-      rF   r   NrG   r#   r"   r&   rR   rR   T   <        +D:j$// =q2DEEGKKKr"   rR   c                   X    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   Nr0   r#   r"   r&   rV   rV   Z   sG        #D:j$//;{F33;z6224KKKr"   rV   c            
           e Zd ZdZ edd           eddddd 	           edd
g edd
          d           gZdS )'ModbusPDU03ReadHoldingRegistersResponsezRead Holding Registers Responser-   r   r5   Nr   registerValc                     |dz  S Nr   r#   r>   xs     r&   r?   z0ModbusPDU03ReadHoldingRegistersResponse.<lambda>f   
    !a% r"   r8   adjustr   r9   c                     | j         S r;   r<   r=   s    r&   r?   z0ModbusPDU03ReadHoldingRegistersResponse.<lambda>i   r@   r"   rA   	r(   r)   r*   r1   r   r	   r   r   r2   r#   r"   r&   rX   rX   a   s        ,D:j$//##Kq-:+?+?A A A ">-&",*R"8"8-F-FH H H	IKKKr"   rX   c                   D    e Zd ZdZ edd           edde          gZdS )$ModbusPDU03ReadHoldingRegistersErrorz Read Holding Registers Exceptionr-      rF   r   NrG   r#   r"   r&   rd   rd   l   s<        -D:j$// =q2DEEGKKKr"   rd   c                   X    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   Nr0   r#   r"   r&   rg   rg   r   rK   r"   rg   c            
           e Zd ZdZ edd           eddddd 	           edd
g edd
          d           gZdS )%ModbusPDU04ReadInputRegistersResponsezRead Input Registers Responser-   r   r5   Nr   rY   c                     |dz  S r[   r#   r\   s     r&   r?   z.ModbusPDU04ReadInputRegistersResponse.<lambda>~   r^   r"   r_   r   r9   c                     | j         S r;   r<   r=   s    r&   r?   z.ModbusPDU04ReadInputRegistersResponse.<lambda>   r@   r"   rA   rb   r#   r"   r&   ri   ri   y   s        *D:j$//##Kq-:+?+?A A A ">-&",*R"8"8-F-FH H H	IKKKr"   ri   c                   D    e Zd ZdZ edd           edde          gZdS )"ModbusPDU04ReadInputRegistersErrorzRead Input Registers Exceptionr-      rF   r   NrG   r#   r"   r&   rm   rm      rT   r"   rm   c                   X    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   outputValueNr0   r#   r"   r&   rp   rp      sG        D:j$//;|V44;}f55	7KKKr"   rp   c                   X    e Zd ZdZ edd           edd           edd          gZdS )"ModbusPDU05WriteSingleCoilResponserq   r-   r   rr   r   rs   Nr0   r#   r"   r&   ru   ru      sG        D:j$//;|V44;}f55	7KKKr"   ru   c                   D    e Zd ZdZ edd           edde          gZdS )ModbusPDU05WriteSingleCoilErrorzWrite Single Coil Exceptionr-      rF   r   NrG   r#   r"   r&   rw   rw      <        (D:j$// =q2DEEGKKKr"   rw   c                   X    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   registerValueNr0   r#   r"   r&   r{   r{      sG        "D:j$//;~v66;779KKKr"   r{   c                   X    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   r|   r   r}   Nr0   r#   r"   r&   r   r      sG        +D:j$//;~v66;779KKKr"   r   c                   D    e Zd ZdZ edd           edde          gZdS )#ModbusPDU06WriteSingleRegisterErrorzWrite Single Register Exceptionr-      rF   r   NrG   r#   r"   r&   r   r      <        ,D:j$// =q2DEEGKKKr"   r   c                   ,    e Zd ZdZ edd          gZdS )%ModbusPDU07ReadExceptionStatusRequestzRead Exception Statusr-      Nr(   r)   r*   r1   r   r2   r#   r"   r&   r   r      s'        "D:j$//0KKKr"   r   c                   B    e Zd ZdZ edd           edd          gZdS )&ModbusPDU07ReadExceptionStatusResponsezRead Exception Status Responser-   r   r.   r   Nr   r#   r"   r&   r   r      s8        +D:j$//:k4002KKKr"   r   c                   D    e Zd ZdZ edd           edde          gZdS )#ModbusPDU07ReadExceptionStatusErrorRead Exception Status Exceptionr-      rF   r   NrG   r#   r"   r&   r   r      r   r"   r   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            
       r    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   datar9   N
r(   r)   r*   r1   r   r   _diagnostics_sub_functionr   r   r2   r#   r"   r&   r   r      s_        D:j$//"?9f#<> >!>&6(KKF4K4KLLNKKKr"   r   c            
       r    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   r   r   r   r9   Nr   r#   r"   r&   r   r      s_        !D:j$//"?9f#<> >!>&6(KKF4K4KLLNKKKr"   r   c                   D    e Zd ZdZ edd           edde          gZdS )ModbusPDU08DiagnosticsErrorzDiagnostics Exceptionr-      exceptionCoder   NrG   r#   r"   r&   r   r      s<        "D:j$// =!5GHHJKKKr"   r   c                   ,    e Zd ZdZ edd          gZdS )%ModbusPDU0BGetCommEventCounterRequestzGet Comm Event Counterr-   r   Nr   r#   r"   r&   r   r      s'        #D:j$//0KKKr"   r   c                   X    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  Nr0   r#   r"   r&   r   r      sG        ,D:j$//;x00;|V446KKKr"   r   c                   D    e Zd ZdZ edd           edde          gZdS )#ModbusPDU0BGetCommEventCounterErrorz Get Comm Event Counter Exceptionr-      r   r   NrG   r#   r"   r&   r   r      s<        -D:j$// =!5GHHJKKKr"   r   c                   ,    e Zd ZdZ edd          gZdS )!ModbusPDU0CGetCommEventLogRequestzGet Comm Event Logr-   r   Nr   r#   r"   r&   r   r     s'        D:j$//0KKKr"   r   c                       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-   r   r5   r   r   r   r   i  messageCounti!  event    r9   N)	r(   r)   r*   r1   r   r
   r   r   r2   r#   r"   r&   r   r     s        (D:j$//9[!,,;x00;|V44;~v66!>'D$<B9M9MNNPKKKr"   r   c                   B    e Zd ZdZ edd           edd          gZdS )ModbusPDU0CGetCommEventLogErrorzGet Comm Event Log Exceptionr-      r   r   Nr   r#   r"   r&   r   r     s8        )D:j$//:oq113KKKr"   r   c                       e Zd ZdZ edd           edd           edd           edd	d
d           eddg edd          d           gZd	S )$ModbusPDU0FWriteMultipleCoilsRequestzWrite Multiple Coilsr-   r   r.   r   quantityOutputr   r5   Nr   outputsValuer7   r9   c                     | j         S r;   r<   r=   s    r&   r?   z-ModbusPDU0FWriteMultipleCoilsRequest.<lambda>   r@   r"   rA   	r(   r)   r*   r1   r   r   r	   r   r2   r#   r"   r&   r   r     s        !D:j$//;{F33;/88##Kq-;= = =!>.4&**R:N:N-F-FH H HIKKKr"   r   c                   X    e Zd ZdZ edd           edd           edd          gZdS )	%ModbusPDU0FWriteMultipleCoilsResponsezWrite Multiple Coils Responser-   r   r.   r   r   r   Nr0   r#   r"   r&   r   r   #  sH        *D:j$//;{F33;/88:KKKr"   r   c                   D    e Zd ZdZ edd           edde          gZdS )"ModbusPDU0FWriteMultipleCoilsErrorzWrite Multiple Coils Exceptionr-      rF   r   NrG   r#   r"   r&   r   r   *  rT   r"   r   c                       e Zd ZdZ edd           edd           edddd	           ed
dddd            eddg edd          d           gZdS )(ModbusPDU10WriteMultipleRegistersRequestzWrite Multiple Registersr-   r   r.   r   quantityRegistersNr   r7   r5   r   c                     |dz  S r[   r#   r\   s     r&   r?   z1ModbusPDU10WriteMultipleRegistersRequest.<lambda>8  r^   r"   r_   r9   c                     | j         S r;   r<   r=   s    r&   r?   z1ModbusPDU10WriteMultipleRegistersRequest.<lambda>;  r@   r"   rA   r   r#   r"   r&   r   r   0  s        %D:j$//;{F33##$7r-;= = =##Kq-;+?+?A A A ">.6("-+b&"9"9-F-FH H H	IKKKr"   r   c                   X    e Zd ZdZ edd           edd           edd          gZdS )	)ModbusPDU10WriteMultipleRegistersResponsez!Write Multiple Registers Responser-   r   r.   r   r   r   Nr0   r#   r"   r&   r   r   >  sH        .D:j$//;{F33;2F;;=KKKr"   r   c                   D    e Zd ZdZ edd           edde          gZdS )&ModbusPDU10WriteMultipleRegistersErrorz"Write Multiple Registers Exceptionr-      rF   r   NrG   r#   r"   r&   r   r   E  s<        /D:j$// =q2DEEGKKKr"   r   c                   ,    e Zd ZdZ edd          gZdS )ModbusPDU11ReportSlaveIdRequestzReport Slave Idr-   r   Nr   r#   r"   r&   r   r   K  s'        D:j$//0KKKr"   r   c            	           e Zd ZdZ edd           edddd           e edd	d
           d            e edd          d           gZdS ) ModbusPDU11ReportSlaveIdResponsezReport Slave Id Responser-   r   r5   Nr   slaveId	length_ofr9   c                     | j         S r;   r<   r=   s    r&   r?   z)ModbusPDU11ReportSlaveIdResponse.<lambda>V  s    S] r"   length_fromc                     | j         dk    S Nr   r<   r=   s    r&   r?   z)ModbusPDU11ReportSlaveIdResponse.<lambda>W      S]Q%6 r"   runIdicatorStatusr   c                     | j         dk    S r   r<   r=   s    r&   r?   z)ModbusPDU11ReportSlaveIdResponse.<lambda>Y  r   r"   )	r(   r)   r*   r1   r   r	   r   r   r2   r#   r"   r&   r   r   P  s        %D
:t$$dACCCY1J1JL L L66	8 	8 	$7>>66	8 	8KKKr"   r   c                   D    e Zd ZdZ edd           edde          gZdS )ModbusPDU11ReportSlaveIdErrorzReport Slave Id Exceptionr-      rF   r   NrG   r#   r"   r&   r   r   ]  <        &D:j$// =q2DEEGKKKr"   r   c                   t    e Zd ZdZ edd           edd           edd           edd          gZd	 Zd
S )ModbusReadFileSubRequestzSub-request of Read File RecordrefTyper   
fileNumberr   recordNumberr   recordLengthc                     t           S r;   )r   r$   payloads     r&   guess_payload_classz,ModbusReadFileSubRequest.guess_payload_classj  s    ''r"   N)r(   r)   r*   r1   r
   r   r2   r   r#   r"   r&   r   r   c  sk        ,D9Y--:lF33:nf55:nf557K
( ( ( ( (r"   r   c                   N    e Zd ZdZ edd           edd          gZd Zd ZdS ) ModbusPDU14ReadFileRecordRequestzRead File Recordr-   r   r5   Nc                 P    | j         dk    rt          S t          j        | |          S r   )r5   r   r   r   r   s     r&   r   z4ModbusPDU14ReadFileRecordRequest.guess_payload_classs  s(    >A++-dG<<<r"   c                     | j         :t          |          }|d d         t          j        d|          z   |dd          z   }||z   S Nr   z!Br   )r5   lenstructpackr$   ppaytmp_lens       r&   
post_buildz+ModbusPDU14ReadFileRecordRequest.post_buildy  sI    >!#hhG"1"D'222QqrrU:A3wr"   )	r(   r)   r*   r1   r   r
   r2   r   r   r#   r"   r&   r   r   n  s\        D:j$//9[$//1K= = =    r"   r   c            
           e Zd ZdZ eddddd            edd	           edd
g edd
          d           gZd Z	dS )ModbusReadFileSubResponsezSub-response
respLengthNr   recDatac                     |dz  dz   S )Nr   r   r#   r>   r   s     r&   r?   z"ModbusReadFileSubResponse.<lambda>  s    q1uqy r"   r_   r   r   r   r9   c                     | j         dz
  dz  S )Nr   r   )r   r=   s    r&   r?   z"ModbusReadFileSubResponse.<lambda>  s    s~/Aa.G r"   rA   c                     t           S r;   )r   r   s     r&   r   z-ModbusReadFileSubResponse.guess_payload_class  s    ((r"   )
r(   r)   r*   r1   r	   r
   r   r   r2   r   r#   r"   r&   r   r     s        DtQ 8 8	: 	: 	:	)T""y6(KKF,C,C"G"G	I 	I 	I	K) ) ) ) )r"   r   c                   N    e Zd ZdZ edd           edd          gZd Zd ZdS )!ModbusPDU14ReadFileRecordResponsezRead File Record Responser-   r   
dataLengthNc                     | j         :t          |          }|d d         t          j        d|          z   |dd          z   }||z   S r   r   r   r   r   r   s       r&   r   z,ModbusPDU14ReadFileRecordResponse.post_build  sI    ?"#hhG"1"D'222QqrrU:A3wr"   c                 P    | j         dk    rt          S t          j        | |          S r   )r   r   r   r   r   s     r&   r   z5ModbusPDU14ReadFileRecordResponse.guess_payload_class  (    ?Q,,-dG<<<r"   	r(   r)   r*   r1   r   r
   r2   r   r   r#   r"   r&   r   r     s\        &D:j$//9\4002K  = = = = =r"   r   c                   D    e Zd ZdZ edd           edde          gZdS )ModbusPDU14ReadFileRecordErrorzRead File Record Exceptionr-      rF   r   NrG   r#   r"   r&   r  r    s<        'D:j$// =q2DEEGKKKr"   r  c                       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           gZd Z	d	S )ModbusWriteFileSubRequestz Sub request of Write File Recordr   r   r   r   r   r   r   Nr   
recordDatac                     |dz  S r[   r#   r   s     r&   r?   z"ModbusWriteFileSubRequest.<lambda>  s
    qAv r"   )r   r`   r9   c                     | j         dz  S r[   )r   r=   s    r&   r?   z"ModbusWriteFileSubRequest.<lambda>  s    s/?!/C r"   r   c                     |rt           S d S r;   )r
  r   s     r&   r   z-ModbusWriteFileSubRequest.guess_payload_class  s     	-,,	- 	-r"   )
r(   r)   r*   r1   r
   r   r	   r   r2   r   r#   r"   r&   r
  r
    s        -D	)T""
<((
>6**r#/ 5 5	7 	7 	7 	|fX!z"f--#C#C	E 	E 	E
K- - - - -r"   r
  c                   N    e Zd ZdZ edd           edd          gZd Zd ZdS )!ModbusPDU15WriteFileRecordRequestzWrite File Recordr-      r   Nc                     | j         ?t          |          }|d d         t          j        d|          z   |dd          z   }||z   S d S r   r  r   s       r&   r   z,ModbusPDU15WriteFileRecordRequest.post_build  sQ    ?"#hhG"1"D'222QqrrU:As7N #"r"   c                 P    | j         dk    rt          S t          j        | |          S r   )r   r
  r   r   r   s     r&   r   z5ModbusPDU15WriteFileRecordRequest.guess_payload_class  r  r"   r  r#   r"   r&   r  r    s\        D:j$//9\4002K  = = = = =r"   r  c                       e Zd ZdZd ZdS )ModbusWriteFileSubResponsez!Sub response of Write File Recordc                     |rt           S d S r;   )r  r   s     r&   r   z.ModbusWriteFileSubResponse.guess_payload_class  s     	.--	. 	.r"   Nr(   r)   r*   r1   r   r#   r"   r&   r  r    s(        .D. . . . .r"   r  c                       e Zd ZdZd ZdS )"ModbusPDU15WriteFileRecordResponsezWrite File Record Responsec                 P    | j         dk    rt          S t          j        | |          S r   )r   r  r   r   r   s     r&   r   z6ModbusPDU15WriteFileRecordResponse.guess_payload_class  s(    ?Q---dG<<<r"   Nr  r#   r"   r&   r  r    s(        'D= = = = =r"   r  c                   D    e Zd ZdZ edd           edde          gZdS )ModbusPDU15WriteFileRecordErrorzWrite File Record Exceptionr-      rF   r   NrG   r#   r"   r&   r  r    ry   r"   r  c                   n    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   orMaskNr0   r#   r"   r&   r  r    sV         D:j$//;y&11;y&11;x002KKKr"   r  c                   n    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#  Nr0   r#   r"   r&   r%  r%    sV        )D:j$//;y&11;y&11;x002KKKr"   r%  c                   D    e Zd ZdZ edd           edde          gZdS )!ModbusPDU16MaskWriteRegisterErrorzMask Write Register Exceptionr-      rF   r   NrG   r#   r"   r&   r'  r'    <        *D:j$// =q2DEEGKKKr"   r'  c                       e Zd ZdZ edd           edd           edd           edd           ed	d
dd           edd
ddd            eddg edd          d           gZd
S ),ModbusPDU17ReadWriteMultipleRegistersRequestzRead Write Multiple Registersr-      readStartingAddrr   readQuantityRegistersr   writeStartingAddrwriteQuantityRegistersNr   writeRegistersValuer7   r5   r   c                     |dz  S r[   r#   r\   s     r&   r?   z5ModbusPDU17ReadWriteMultipleRegistersRequest.<lambda>  r^   r"   r_   r9   c                     | j         S r;   r<   r=   s    r&   r?   z5ModbusPDU17ReadWriteMultipleRegistersRequest.<lambda>  r@   r"   rA   r   r#   r"   r&   r+  r+    s        *D:j$//;16::;6??;2F;;##$<dB-BD D D##Kq-B+?+?A A A ">"7&"-+b&"9"9-F-FH H HIKKKr"   r+  c            
           e Zd ZdZ edd           eddddd 	           edd
g edd
          d           gZdS )-ModbusPDU17ReadWriteMultipleRegistersResponsez&Read Write Multiple Registers Responser-   r,  r5   Nr   rY   c                     |dz  S r[   r#   r\   s     r&   r?   z6ModbusPDU17ReadWriteMultipleRegistersResponse.<lambda>  r^   r"   r_   r   r9   c                     | j         S r;   r<   r=   s    r&   r?   z6ModbusPDU17ReadWriteMultipleRegistersResponse.<lambda>  r@   r"   rA   rb   r#   r"   r&   r5  r5    s        3D:j$//##Kq-:+?+?A A A ">-&",*R"8"8-F-FH H H	IKKKr"   r5  c                   D    e Zd ZdZ edd           edde          gZdS )*ModbusPDU17ReadWriteMultipleRegistersErrorzRead Write Multiple Exceptionr-      rF   r   NrG   r#   r"   r&   r9  r9    r)  r"   r9  c                   B    e Zd ZdZ edd           edd          gZdS )ModbusPDU18ReadFIFOQueueRequestzRead FIFO Queuer-      FIFOPointerAddrr   Nr0   r#   r"   r&   r<  r<    s9        D:j$//;0&99;KKKr"   r<  c                       e Zd ZdZ edd           eddddd 	           ed
ddd           edg  edd          d           gZdS ) ModbusPDU18ReadFIFOQueueResponsezRead FIFO Queue Responser-   r=  r5   Nr   FIFOValc                     |dz  dz   S r[   r#   r   s     r&   r?   z)ModbusPDU18ReadFIFOQueueResponse.<lambda>'  s    !a%!) r"   r_   	FIFOCountr7   r9   r   c                     | j         S r;   r<   r=   s    r&   r?   z)ModbusPDU18ReadFIFOQueueResponse.<lambda>*  r@   r"   rA   rb   r#   r"   r&   r@  r@  "  s        %D:j$//##KrI+C+CE E E##KrINNN!>)RB1G1G-F-FH H HIKKKr"   r@  c                   D    e Zd ZdZ edd           edde          gZdS )ModbusPDU18ReadFIFOQueueErrorzRead FIFO Queue Exceptionr-      rF   r   NrG   r#   r"   r&   rF  rF  -  r   r"   rF  BasicRegularExtendedSpecific)r   r   r   r   
VendorNameProductCodeMajorMinorRevision	VendorUrlProductName	ModelName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   rE   rS   re   NoYes)r   r   c                   r    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-   +   MEITyper   readCoder   objectIdr   N)	r(   r)   r*   r1   r   r   _read_device_id_codes_read_device_id_object_idr2   r#   r"   r&   rV  rV  _  s]        'D:j$//:i.. =Q0EFF =T3LMMOKKKr"   rV  c            
           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 ZdS )-ModbusPDU2B0EReadDeviceIdentificationResponserW  r-   rX  rY  r   rZ  r   conformityLevelr   morer   	nextObjIdobjCountc                 P    | j         dk    rt          S t          j        | |          S r   )rc  ModbusObjectIdr   r   r   s     r&   r   zAModbusPDU2B0EReadDeviceIdentificationResponse.guess_payload_classr  s(    =1!!-dG<<<r"   N)r(   r)   r*   r1   r   r   r\  _read_device_id_conformity_lvl_read_device_id_more_followr]  r
   r2   r   r#   r"   r&   r_  r_  g  s        'D:j$//:i.. =Q0EFF =!2D!?A A =/JKK =d4MNN9Z..0K= = = = =r"   r_  c                   D    e Zd ZdZ edd           edde          gZdS )*ModbusPDU2B0EReadDeviceIdentificationErrorr   r-      rF   r   NrG   r#   r"   r&   ri  ri  y  r   r"   ri  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   r   r   )   *   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                   L    e Zd ZdZ edde           eddd          gZd ZdS )	$ModbusPDUReservedFunctionCodeRequestzReserved Function Code Requestr-   r   
mb_payloadr9   r~  c                 ,    |                      d          S )Nz"Modbus Reserved Request %funcCode%sprintfr$   s    r&   	mysummaryz.ModbusPDUReservedFunctionCodeRequest.mysummary  s    ||@AAAr"   N)	r(   r)   r*   r1   r   _reserved_funccode_requestr   r2   r  r#   r"   r&   r  r    sX        +Dj$(BCCr3//3KB B B B Br"   r  c                   L    e Zd ZdZ edde           eddd          gZd ZdS )	%ModbusPDUReservedFunctionCodeResponsezReserved Function Code Responser-   r   r  r9   r~  c                 ,    |                      d          S )Nz#Modbus Reserved Response %funcCode%r  r  s    r&   r  z/ModbusPDUReservedFunctionCodeResponse.mysummary  s    ||ABBBr"   N)	r(   r)   r*   r1   r   _reserved_funccode_responser   r2   r  r#   r"   r&   r  r    sX        ,Dj$(CDDr3//3KC C C C Cr"   r  c                   L    e Zd ZdZ edde           eddd          gZd ZdS )	"ModbusPDUReservedFunctionCodeErrorzReserved Function Code Errorr-   r   r  r9   r~  c                 ,    |                      d          S )Nz Modbus Reserved Error %funcCode%r  r  s    r&   r  z,ModbusPDUReservedFunctionCodeError.mysummary  s    ||>???r"   N)	r(   r)   r*   r1   r   _reserved_funccode_errorr   r2   r  r#   r"   r&   r  r    sX        )Dj$(@AAr3//3K@ @ @ @ @r"   r  c                       e Zd ZdZd Zd ZdS )ModbusByteEnumFielddefEnumc                 D    t          j        | |||d           || _        d S )NB)r   __init__r  )r$   r1   defaultenumr  s        r&   r  zModbusByteEnumField.__init__  s&    4wc:::r"   c                     | t           j        vr+t          |t                    s|| j        v r| j        |         S | j        r| j        S t          |          S r;   )r   noenum
isinstancer   i2sr  repr)r$   r>   r]   s      r&   
i2repr_onezModbusByteEnumField.i2repr_one  sR    t{"":a+G+G"MM8A;< 	 <Awwr"   N)r(   r)   r*   	__slots__r  r  r#   r"   r&   r  r    s7        I      r"   r  c                   N    e Zd ZdZ edded           eddd          gZd Zd	S )
'ModbusPDUUserDefinedFunctionCodeRequestz"User-Defined Function Code Requestr-   r   z*Unknown user-defined request function Coder  r9   r~  c                 ,    |                      d          S )Nz&Modbus User-Defined Request %funcCode%r  r  s    r&   r  z1ModbusPDUUserDefinedFunctionCodeRequest.mysummary  s    ||DEEEr"   N)	r(   r)   r*   r1   r  _userdefined_funccode_requestr   r2   r  r#   r"   r&   r  r    sc        /D;8	: 	: 	r3//	3KF F F F Fr"   r  c                   N    e Zd ZdZ edded           eddd          gZd Zd	S )
(ModbusPDUUserDefinedFunctionCodeResponsez#User-Defined Function Code Responser-   r   z+Unknown user-defined response function Coder  r9   r~  c                 ,    |                      d          S )Nz'Modbus User-Defined Response %funcCode%r  r  s    r&   r  z2ModbusPDUUserDefinedFunctionCodeResponse.mysummary  s    ||EFFFr"   N)	r(   r)   r*   r1   r  _userdefined_funccode_responser   r2   r  r#   r"   r&   r  r    sc        0D<9	; 	; 	r3//	3KG G G G Gr"   r  c                   N    e Zd ZdZ edded           eddd          gZd Zd	S )
%ModbusPDUUserDefinedFunctionCodeErrorz User-Defined Function Code Errorr-   r   z(Unknown user-defined error function Coder  r9   r~  c                 ,    |                      d          S )Nz$Modbus User-Defined Error %funcCode%r  r  s    r&   r  z/ModbusPDUUserDefinedFunctionCodeError.mysummary  s    ||BCCCr"   N)	r(   r)   r*   r1   r  _userdefined_funccode_errorr   r2   r  r#   r"   r&   r  r    sc        -D96	8 	8 	r3//	3KD D D D Dr"   r  c                   l    e Zd ZdZ edde           edddd           edd	d
           gZd Z	dS )re  Objectidr   lengthNr   valuer   r9   c                     | j         S r;   )r  r=   s    r&   r?   zModbusObjectId.<lambda>
  s    sz r"   r   c                     t           S r;   )re  r   s     r&   r   z"ModbusObjectId.guess_payload_class  s    r"   )
r(   r)   r*   r1   r   r]  r	   r   r2   r   r#   r"   r&   re  re    sz        D =t-FGG##HdAIII;w+A+AC C CDK
    r"   re  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r,  r=  rE   rS   re   rn   rx   r   r   r   r   r   r   r   r   r  r  r(  r:  )rG  rj  r   c                   z    e Zd ZdZ edd           edd           edd           edd          gZd	 Zd
 Z	dS )ModbusADURequest	ModbusADUtransIdr   protoIdr   NunitIdr~  c                    t          |d                   }|dk    r3t          |d                   }	 t          |         S # t          $ r Y nw xY w	 t          |         S # t          $ r Y nw xY w|t          v rt
          S t          S )Nr   rX  r   )r   _mei_types_requestKeyError_modbus_request_classesr  r  r  r$   r   function_codesub_codes       r&   r   z$ModbusADURequest.guess_payload_classd  s    GAJD  71:H)(33   	*=99 	 	 	D	6667766s!   ? 
AAA 
A*)A*c                     | j         =t          |          dz   }|d d         t          j        d|          z   |dd          z   }||z   S Nr   r   z!Hr   r   r   r   r   s       r&   r   zModbusADURequest.post_buildu  M    8#hhlG"1"D'222QqrrU:A3wr"   
r(   r)   r*   r1   r   r   r   r2   r   r   r#   r"   r&   r  r  W  s|        D 	Iv&&Iv&&
5$
8T""	K7 7 7"    r"   r  c                   z    e Zd ZdZ edd           edd           edd           edd          gZd	 Zd
 Z	dS )ModbusADUResponser  r  r   r  r   Nr  r~  c                 ~   t          |d                   }|dk    r3t          |d                   }	 t          |         S # t          $ r Y nw xY w	 t          |         S # t          $ r Y nw xY w	 t          |         S # t          $ r Y nw xY w|t
          v rt          S |t          v rt          S |dk     rt          S t          S )Nr   rX  r      )r   _mei_types_responser  _modbus_response_classes_modbus_error_classesr  r  r  r  r  r  r  s       r&   r   z%ModbusADUResponse.guess_payload_class  s    GAJD  71:H*844   	+M:: 	 	 	D		(77 	 	 	D	77788666554;;44s3   ? 
AAA 
A*)A*.A; ;
BBc                     | j         =t          |          dz   }|d d         t          j        d|          z   |dd          z   }||z   S r  r  r   s       r&   r   zModbusADUResponse.post_build  r  r"   r  r#   r"   r&   r  r  |  s|        D 	Iv&&Iv&&
5$
8T""	K5 5 52    r"   r  i  )dport)sport)rr   scapy.packetr   r   scapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   scapy.layers.inetr   scapy.utilsr   scapy.configr   scapy.volatiler   rH   r    r,   r4   rD   rJ   rM   rR   rV   rX   rd   rg   ri   rm   rp   ru   rw   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+  r5  r9  r<  r@  rF  r\  r]  rf  rg  rV  r_  ri  r  r  r  r  r  r  r  r  r  r  r  r  r  re  r  r  r  r  r  r  r  r#   r"   r&   <module>r     s    , , , , , , , ,2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 " ! ! ! ! !             ( ( ( ( ( ( 1/-0&-.4CE E     &   4 4 4 4 4"5 4 4 4I I I I I#6 I I IG G G G G 3 G G G4 4 4 4 4+> 4 4 4
I 
I 
I 
I 
IF 
I 
I 
IG G G G G G G G4 4 4 4 4-@ 4 4 4I I I I If I I IG G G G G6 G G G4 4 4 4 4+> 4 4 4I I I I IF I I IG G G G G G G G7 7 7 7 7 7 7 77 7 7 7 7 7 7 7G G G G Gf G G G9 9 9 9 9,? 9 9 99 9 9 9 9V 9 9 9G G G G G& G G G1 1 1 1 1,? 1 1 1
2 2 2 2 2V 2 2 2G G G G G& G G G  +(*$4&2.(,$%0,  &N N N N N$7 N N NN N N N N%8 N N NJ J J J J"5 J J J1 1 1 1 1,? 1 1 1
6 6 6 6 6-@ 6 6 6J J J J J*= J J J1 1 1 1 1(; 1 1 1
P P P P P)< P P P3 3 3 3 3&9 3 3 3I I I I I6 I I I: : : : :F : : :G G G G G G G GI I I I Iv I I I= = = = = = = =G G G G GV G G G1 1 1 1 1&9 1 1 1

 
 
 
 
v 
 
 
G G G G GF G G G( ( ( ( (v ( ( (    v   $) ) ) ) ) ) ) )= = = = = = = =$G G G G GV G G G- - - - - - - -&= = = = = = = =$. . . . .!: . . .= = = = =)J = = =G G G G Gf G G G2 2 2 2 2& 2 2 22 2 2 2 26 2 2 2G G G G G G G GI I I I I6 I I I I I I I IF I I IG G G G G G G G; ; ; ; ;f ; ; ;I I I I Iv I I IG G G G GF G G G. $%&&( (  $0#0#7#.#0#.#8: :  /
0
1
?
A
B" "  &*%*, , O O O O O6 O O O= = = = =F = = =$G G G G G G G G *
)
)
)
)
)
/
)
)
)
)   +
*
*
*
*
*
0
*
*
*
*   (
'
'
'
'
'
-
'
'
'
'
'   B B B B B+> B B BC C C C C,? C C C@ @ @ @ @)< @ @ @! "      )    	F 	F 	F 	F 	F.A 	F 	F 	F	G 	G 	G 	G 	G/B 	G 	G 	G	D 	D 	D 	D 	D,? 	D 	D 	D    V   
%
. 	
0 	
.	
 	
+ 	
/ 	
/ 	
' 	
/ 	
+ 	
. 	
2 	
) 	
* 	
+  	
-!" 	
6#$ 	
)%  (
#
, 	
. 	
,	
 	
) 	
- 	
- 	
% 	
- 	
) 	
, 	
0 	
' 	
( 	
)  	
+!" 	
4#$ (
4'   *
&
/ 	
1 	
/	
 	
, 	
0 	
0 	
( 	
0 	
, 	
/ 	
3 	
* 	
+ 	
,  	
.!" 	
7#$ 	
*%  * 	
6 
 	
7 " " " " "v " " "J* * * * * * * *Z C! - - - - C"# . . . . . .r"   