
    h#                     D   d Z ddlZddlmZm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mZ dddd	d
dddddd
ZddddddddZdddddddd d!d"d#d$d%d&Zi dd'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGi dHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtduZddviZ G dw dxe          Z G dy dze          Z G d{ d|e          Z  G d} d~e          Z! G d de          Z" G d de          Z# G d de          Z$ G d de          Z% G d de          Z& G d de          Z' G d de          Z( G d de          Z) G d de          Z* eee*d            eee*d            ee*ed            ee*e!d,            ee*e#d            ee*e%d            ee*e&d            ee*e'd            ee*e(d            ee*e)d           dS )zv
EtherNet/IP (Industrial Protocol)

Based on https://github.com/scy-phy/scapy-cip-enip
EtherNet/IP Home: www.odva.org
    N)Packetbind_layers)TCP)LEShortFieldLEShortEnumFieldLEIntEnumField
LEIntFieldLELongFieldFieldLenFieldPacketListField	ByteFieldStrLenFieldStrFixedLenFieldXLEIntFieldXLEStrLenFieldLEFieldLenField
ShortFieldIPField	LongFieldXLEShortFieldUnknownCommandListServicesListIdentityListInterfacesRegisterSessionUnregisterSession
SendRRDataSendUnitDataIndicateStatusCancel)
      c   d   e   f   o   p   r   s   successinvalid_cmdno_resourcesincorrect_datainvalid_sessioninvalid_lengthunsupported_prot_rev)r   r!         r$   r%   i   zNull Address ItemzCIP IdentityzCIP Security InformationzEtherNet/IP CapabilityzEtherNet/IP UsagezConnected Address ItemzConnected Data ItemzUnconnected Data ItemzList Services ResponsezSocket Address Info O->TzSocket Address Info T->OzSequenced Address ItemzUnconnected Message over UDP)r                           i   i  i  i  zGeneric Device (deprecated)r2   zAC Driver3   zMotor Overloadr"   zLimit Switch   zInductive Proximity Switch   zPhotoelectric Sensor   zGeneral Purpose Discrete I/O	   Resolverr5   zCommunications Adapter   zProgrammable Logic Controller   zPosition Controller   zDC Drive   	Contactor   zMotor Starter   z
Soft Start   zHuman-Machine Interface   zMass Flow Controller   zPneumatic Valve   zVacuum Pressure Gauge   zProcess Control Value   zResidual Gas Analyzer   zDC Power Generator    zRF Power Generator!   zTurbomolecular Vacuum Pump"   Encoder#   zSafety Discrete I/O Device$   zFluid Flow Controller%   zCIP Motion Drive&   zCompoNet Repeater'   zMass Flow Controller, Enhanced(   zCIP Modbus Device)   zCIP Modbus Translator*   zSafety Analog I/O Device+   zGeneric Device (keyable)zManaged Ethernet SwitchzCIP Motion Safety Drive DevicezSafety Drive DevicezCIP Motion EncoderzCIP Motion ConverterzCIP Motion I/Oz#ControlNet Physical Layer ComponentzCircuit BreakerzHART DevicezCIP-HART TranslatorzEmbedded Component),   -   .   /   0   1   2   3   4   5      CIPc                   j    e Zd ZdZdZ edde           edd           eddd 	          gZ	d
 Z
dS )ItemDatazCommon Packet Formatz	Item DatatypeIdr   lengthdata c                     | j         S N)rl   pkts    Y/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/enipTCP.py<lambda>zItemData.<lambda>{   s    3:     length_fromc                 
    d|fS )Nrn    )selfss     rs   extract_paddingzItemData.extract_padding~   s    1uru   N)__name__
__module____qualname____doc__namer   _typeIdListr   r   fields_descr|   ry   ru   rs   rj   rj   u   sn        D1k22Xq!!vr/E/EFFFK    ru   rj   c                       e Zd ZdZd ZdS )ENIPUnknownCommandzUnknown Command replyNr}   r~   r   r   r   ry   ru   rs   r   r      s        DDru   r   c            	           e Zd ZdZd Z edde           edd           edd           e	dd           e
ddd	          gZdS )
ENIPListServicesItemzList Services Item FielditemTypeCoder   
itemLengthprotocolVersionflagserviceNameNrC   )r}   r~   r   r   r   r   r   r   r   r   r   r   ry   ru   rs   r   r      sr        ""!DK88a((&**fa  b11KKKru   r   c                   L    e Zd ZdZd Z eddd           edde          gZdS )ENIPListServiceszList Services Command Field	itemCountr   itemscount_ofN)	r}   r~   r   r   r   r   r   r   r   ry   ru   rs   r   r      sF        %%Dk1w777';<<KKKru   r   c                      e Zd ZdZdZ edde           edd           edd           e	dd           e	dd           e
d	d
           edd           edd           edde           edd           edd           edd           edd           edd           edd           edd
d            edd          gZd
S )ENIPListIdentityItemzList Identity Item FieldsENIPListIdentityReplyItemr   r   r   r   	sinFamilysinPort
sinAddressNsinZerovendorId
deviceTypeproductCoderevisionMajorrevisionMinorstatusserialNumberproductNameLengthproductNamec                     | j         S rp   )r   rq   s    rs   rt   zENIPListIdentityItem.<lambda>   s	    C,A ru   rv   state)r}   r~   r   r   r   r   r   r   r   r   r   r   _deviceTypeListr   r   r   r   ry   ru   rs   r   r      s9       ##&DK88a((&**
;""
9a  d##	)QZ##q/::]A&&	/1%%	/1%%Xq!!NA&&	%q))M4 A A	C 	C 	C	'1)KKKru   r   c                   L    e Zd ZdZd Z eddd           edde          gZdS )ENIPListIdentityz"List identity request and responser   r   r   r   N)	r}   r~   r   r   r   r   r   r   r   ry   ru   rs   r   r      sF        ,,Dk1w777';<<KKKru   r   c                   h    e Zd ZdZd Z edde           eddd           eddd 	          gZ	d
S )ENIPListInterfacesItemzList Interfaces Item Fieldsr   r   r   itemData)	length_ofrn   c                     | j         S rp   )r   rq   s    rs   rt   zENIPListInterfacesItem.<lambda>   s    CN ru   rv   N)
r}   r~   r   r   r   r   r   r   r   r   ry   ru   rs   r   r      s^        %%#DK88lA<<<J0J0JKKK	KKKru   r   c                   L    e Zd ZdZd Z eddd           edde          gZdS )ENIPListInterfaceszList Interfaces Command Fieldr   r   r   r   N)	r}   r~   r   r   r   r   r   r   r   ry   ru   rs   r   r      sF        ''Dk1w777'=>>KKKru   r   c                   F    e Zd ZdZd Z edd           edd          gZdS )ENIPRegisterSessionzRegister Session Command Fieldr   r!   optionsr   N)r}   r~   r   r   r   r   r   ry   ru   rs   r   r      s?        (( D&**Y""KKKru   r   c                       e Zd ZdZd ZdS )ENIPUnregisterSessionz Unregister Session Command FieldNr   ry   ru   rs   r   r      s        **"DDru   r   c                   z    e Zd ZdZd Z edde           edd           eddd           e	dd	e
          gZd	S )
ENIPSendRRDatazSend RR Data Command Field	interfacer   timeout   r   r   r   Nr}   r~   r   r   r   r   _interfaceListr   r   r   rj   r   ry   ru   rs   r   r      se        $$D{A~66Y%%Q999x00	KKKru   r   c                   z    e Zd ZdZd Z edde           edd           eddd           e	dd	e
          gZd	S )
ENIPSendUnitDatazSend Unit Data Command Fieldr   r   r   r   r   r   r   Nr   ry   ru   rs   r   r     se        &&D{A~66Y%%Q999x00	KKKru   r   c            	           e Zd ZdZd Z edde           edd           edd           e	dde
           edd           ed	d          gZd
 ZdS )ENIPTCPzEthernet/IP packet over TCP	commandIdNrl   r   sessionr   senderContextr   c                     | j         :|r8|d d         t          j        dt          |                    z   |dd          z   }||z   S )Nr2   z<Hr"   )rl   structpacklen)rz   rr   pays      rs   
post_buildzENIPTCP.post_build"  sJ    ;3bqb'FKc#hh777#abb'ACSyru   )r}   r~   r   r   r   r   _commandIdListr   r   r   _statusListr
   r	   r   r   ry   ru   rs   r   r     s        %%DdN;;Xq!!Iq!!x{33OQ''
9a  K    ru   r   i  )dport)sportr!   )r   r#   r$   r%   r&   r'   r(   )+r   r   scapy.packetr   r   scapy.layers.inetr   scapy.fieldsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   ry   ru   rs   <module>r      s     , , , , , , , , ! ! ! ! ! !C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C   			   &$$!#$&&$*  .
).
J. . N	.
 (. ". *. J. $. +. !. J. K. O. L.  %!." "#. .$ %.& #'.( #).* #+.,  -..  /.0 (1.2 I3.4 (5.6 #7.8 9.: ;.< ,=.> ?.@ #A.B &C.D &E. .F &,! "1! [. . .b 	%

 
 
 
 
v 
 
 
 	 	 	 	 	 	 	 		 	 	 	 	6 	 	 	    v       6   6    v       V              &   	 	 	 	 	F 	 	 		 	 	 	 	V 	 	 	    v       f   $ C & & & & C & & & & G'6 : : : : G% 8 8 8 8 G% 8 8 8 8 G'6 : : : : G(F ; ; ; ; G*f = = = = G^v 6 6 6 6 G% 8 8 8 8 8 8ru   