
    hJ                     B   d Z ddl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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! ddl"m#Z#m$Z$m%Z% ddd	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          Z0 G d( d)e          Z1 G d* d+e          Z2 G d, d-e          Z3 G d. d/e          Z4 G d0 d1e          Z5 G d2 d3e          Z6 G d4 d5e          Z7 G d6 d7e          Z8e1e.e/e-e0e,e2e3e4e5e6e7e8d8Z9d9 Z: G d: d;e          Z; ee(e;d<=            ee(e;d>=           dS )?z8
Real-Time Publish-Subscribe Protocol (RTPS) dissection
    N)ConditionalFieldIntFieldPacketFieldPacketListField
ShortFieldStrFieldStrFixedLenFieldStrLenFieldX3BytesField
XByteField	XIntFieldXNBytesFieldXShortFieldXStrLenField
FlagsFieldField	EnumField)Packetbind_layers)
EFieldEPacketEPacketFieldInlineQoSPacketFieldProtocolVersionPacketDataPacketFieldSTR_MAX_LENSerializedDataFieldVendorIdPackete_flags)ParameterListPacketget_pid_classPID_SENTINELENTITY_UNKNOWNENTITYID_PARTICIPANT"ENTITYID_SEDP_BUILTIN_TOPIC_WRITER"ENTITYID_SEDP_BUILTIN_TOPIC_READER)ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER)ENTITYID_SEDP_BUILTIN_PUBLICATIONS_READER*ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER*ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_READER(ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER(ENTITYID_SPDP_BUILTIN_PARTICIPANT_READER/ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER/ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER)       s     s     s     s     s     s     s     s     s     s     s     c                   ^    e Zd ZdZ edd           edd           edd          gZd ZdS )GUIDPrefixPacketzRTPS GUID PrefixhostIdr   appId
instanceIdc                 
    d|fS )N     )selfps     [/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/rtps/rtps.pyextract_paddingz GUIDPrefixPacket.extract_paddingP   s    Avr6   N)__name__
__module____qualname__namer   fields_descr;   r7   r6   r:   r1   r1   H   s\        D	(A	'1	,""K    r6   r1   c                       e Zd ZdZdZ eddd           ed e            e           ed e            e           ed e	            e	          gZ
d	S )
RTPSa  
    RTPS package, overall structure as per DDSI-RTPS v2.3, section 9.4.1
    The structure is also discussed at 8.3.3.

    The wire representation (bits) is as follows:

        0...2...........7...............15.............23.............. 31
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        | Header (RTPSHeader)                                           |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        | Submessage  (RTPSSubmessage)                                  |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        .................................................................
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        | Submessage                                                    |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    For representation purposes, this package will only contain the header
    and other submessages will be bound as layers (bind_layers):

    RTPS Header structure as per DDSI-RTPS v2.3, section 9.4.4
    The wire representation (bits) is as follows:

        0...2...........7...............15.............23...............31
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |      'R'      |       'T'     |      'P'      |       'S'     |
        +---------------+---------------+---------------+---------------+
        | ProtocolVersion version       | VendorId vendorId             |
        +---------------+---------------+---------------+---------------+
        |                                                               |
        +                                                               +
        |                 GuidPrefix      guidPrefix                    |
        +                                                               +
        |                                                               |
        +---------------+---------------+---------------+---------------+

    References:

    * https://community.rti.com/static/documentation/wireshark/current/doc/understanding_rtps.html # noqa E501
    * https://www.omg.org/spec/DDSI-RTPS/2.3/PDF
    * https://www.wireshark.org/docs/dfref/r/rtps.html
    zRTPS Headermagicr6      protocolVersionvendorId
guidPrefixN)r<   r=   r>   __doc__r?   r	   r   r   r   r1   r@   r7   r6   r:   rB   rB   T   s        ) )V D#q))44668M	O 	O((.	: 	:**,,.>	@ 	@KKKr6   rB   c                   H    e Zd ZdZ edg e           edde          gZdS )InlineQoSPacketz
Inline QoS
parametersnext_cls_cbsentinel N)	r<   r=   r>   r?   r   r!   r   r"   r@   r7   r6   r:   rJ   rJ      sA        D 	bmDDDJL11KKKr6   rJ   c            	           e Zd ZdZ edde           edd           e edd          e           e	ddd	 e

          gZdS )ParticipantMessageDataPacketzParticipant Message DatarG   rO   kindr   sequenceSizeendianness_fromserializedDatac                     | j         dz  S NrD   )rS   )xs    r:   <lambda>z%ParticipantMessageDataPacket.<lambda>   s    !.1"4 r6   )length_from
max_lengthN)r<   r=   r>   r?   r   r1   r   r   r   r
   r   r@   r7   r6   r:   rQ   rQ      s        %DL"&677	&!yy++&	( 	( 	(44"		
 	
 	
KKKr6   rQ   c                        e Zd ZdZdZdZ edd           edd           e edde	          d            e ed	de
          d
            e eddd           d           gZ fdZ xZS )
DataPacketzData PacketNr   encapsulationKindencapsulationOptionsparameterListrO   c                     | j         dk    S )N   )r_   pkts    r:   rZ   zDataPacket.<lambda>   s    -7 r6   participantMessageDatac                     | j         dk    S )NParticipantMessageData)_pl_typerd   s    r:   rZ   zDataPacket.<lambda>   s    (@@ r6   rV   c                     | j         S )N)_pl_lenrd   s    r:   rZ   zDataPacket.<lambda>   s    ck r6   r[   c                 .    | j         dk    o
| j        dk    S )Nrc   rh   )r_   ri   rd   s    r:   rZ   zDataPacket.<lambda>   s"    %/ =L$<< r6   c                 .   |                     dd           }|                     dd           }|                     dd          }|dk    r|dk    rdt          _        ndt          _        |t          _         t	          t          |           j        |i | d S )	Nwriter_entity_id_keywriter_entity_id_kindpl_lenr   i      rh   SerializedData)popr^   ri   rk   super__init__)r8   argskwargsro   rp   rq   	__class__s         r:   rv   zDataPacket.__init__   s    %zz*@$GG &

+BD I IHa((5((-Bd-J-J":J"2J#
(j$($9&99999r6   )r<   r=   r>   r?   ri   rk   r   r   r   r    rQ   r   r@   rv   __classcell__)ry   s   @r:   r^   r^      s       DHG 	'++*A..L".ABB77	
 	

 	L(".JL L@@	
 	
 	 "2I2I   		
 	
K4: : : : : : : : :r6   r^   c                      e Zd ZdZdZ edd           edd           e edd          e           e	d	dd
           e edd          e           e
dd           edd           e
dd           edd           e edd          e           e edd          e           e edde          d            e eddee          d            e eddee          d           gZdS )RTPSSubMessage_DATAa
  
    0...2...........7...............15.............23...............31
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | RTPS_DATA     |     flags     |      octetsToNextHeader       |
    +---------------+---------------+---------------+---------------+
    | Flags extraFlags              |      octetsToInlineQos        |
    +---------------+---------------+---------------+---------------+
    | EntityId readerEntityId                                       |
    +---------------+---------------+---------------+---------------+
    | EntityId writerEntityId                                       |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    + SequenceNumber writerSeqNum                                   +
    |                                                               |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    ~ ParameterList inlineQos [only if Q==1]                        ~
    |                                                               |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    ~ SerializedData serializedData [only if D==1 || K==1]          ~
    |                                                               |
    +---------------+---------------+---------------+---------------+
    zRTPS DATA (0x15)submessageId   submessageFlagsr   octetsToNextHeaderrT   
extraFlags   octetsToInlineQoSreaderEntityIdKeyreaderEntityIdKindwriterEntityIdKeywriterEntityIdKindwriterSeqNumHiwriterSeqNumLow	inlineQoSrO   c                     | j         dz  dk    S )Nr   r   rd   s    r:   rZ   zRTPSSubMessage_DATA.<lambda>      +j8JF r6   keyc                     | j         dz  dk    S )N   r   rd   s    r:   rZ   zRTPSSubMessage_DATA.<lambda>  r   r6   datac                     | j         dz  dk    S rX   r   rd   s    r:   rZ   zRTPSSubMessage_DATA.<lambda>  r   r6   N)r<   r=   r>   rH   r?   r   r   r   r   r   r   r   r   r   rJ   r   r^   r@   r7   r6   r:   r|   r|      s        2 D
>4((
$d++zz.22&	( 	( 	(\61--zz-q11&	( 	( 	((!,,
'++(!,,
'++ 	xx(!,,&	( 	( 	(xx)1--&	( 	( 	( 	  b/BBFF	
 	
 	OE2z,35 5 5FF	
 	

 	OFB
,35 5 5FF	
 	
M+KKKr6   r|   c                       e Zd ZdZdZ edd           edddg d           e ed	d          e	
           e
 eddd          d            e
 eddd          d           gZdS )RTPSSubMessage_INFO_TSa6  
    0...2...........7...............15.............23...............31
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   INFO_TS     |     flags     |      octetsToNextHeader       |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    + Timestamp timestamp [only if T==1]                            +
    |                                                               |
    +---------------+---------------+---------------+---------------+
    zRTPS INFO_TS (0x09)r}   	   r   r   r   )EI?r   r   r   r   r   r   rT   
ts_secondsz<l)defaultfmtc                 P    t          | j                                      d          S Nr   strr   findrd   s    r:   rZ   zRTPSSubMessage_INFO_TS.<lambda>1      C/0055c:: r6   ts_fractionz<Lc                 P    t          | j                                      d          S r   r   rd   s    r:   rZ   zRTPSSubMessage_INFO_TS.<lambda>5  r   r6   N)r<   r=   r>   rH   r?   r   r   r   r   r   r   r   r@   r7   r6   r:   r   r     s        	 	 !D
>4((
q!444	6 	6 	zz.22&	( 	( 	(E,t444::	
 	
 	E-555::	
 	
KKKr6   r   c                       e Zd ZdZdZ edd           edd           e edd          e           e	d	d
de
           e	dd
de
           eddd            e edd          e          gZdS )RTPSSubMessage_ACKNACKa  
    0...2...........7...............15.............23...............31
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   ACKNACK     |     flags     |      octetsToNextHeader       |
    +---------------+---------------+---------------+---------------+
    | EntityId readerEntityId                                       |
    +---------------+---------------+---------------+---------------+
    | EntityId writerEntityId                                       |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    + SequenceNumberSet readerSNState                               +
    |                                                               |
    +---------------+---------------+---------------+---------------+
    | Counter count                                                 |
    +---------------+---------------+---------------+---------------+
    zRTPS ACKNACK (0x06)r}      r   r   r   rT   	reader_idr/   4sr   r   enum	writer_idreaderSNStatec                     | j         dz
  dz
  S )Nr   rD   )r   rd   s    r:   rZ   zRTPSSubMessage_ACKNACK.<lambda>`  s    s'='AA'E r6   rl   countN)r<   r=   r>   rH   r?   r   r   r   r   r   _rtps_reserved_entity_idsr   r   r@   r7   r6   r:   r   r   :  s         " !D
>4((
$d++zz.22&	( 	( 	(	'*		
 	
 	
 		'*		
 	
 	
 	EE	
 	
 	
 	xx##&	( 	( 	(+KKKr6   r   c                      e Zd ZdZdZ edd           edd           e edd          e           e	d	d
de
           e	dd
de
           e edd          e           e edd          e           e edd          e           e edd          e           e edd          e          g
ZdS )RTPSSubMessage_HEARTBEATa  
    0...2...........7...............15.............23...............31
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   HEARTBEAT   |     flags     |      octetsToNextHeader       |
    +---------------+---------------+---------------+---------------+
    | EntityId readerEntityId                                       |
    +---------------+---------------+---------------+---------------+
    | EntityId writerEntityId                                       |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    + SequenceNumber firstAvailableSeqNumber                        +
    |                                                               |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    + SequenceNumber lastSeqNumber                                  +
    |                                                               |
    +---------------+---------------+---------------+---------------+
    | Counter count                                                 |
    +---------------+---------------+---------------+---------------+
    zRTPS HEARTBEAT (0x07)r}      r   r   r   rT   r   r/   r   r   r   firstAvailableSeqNumHifirstAvailableSeqNumLowlastSeqNumHilastSeqNumLowr   N)r<   r=   r>   rH   r?   r   r   r   r   r   r   r   r@   r7   r6   r:   r   r   g  sj        * #D
>4((
$a((zz.22&	( 	( 	(	'*		
 	
 	
 		'*		
 	
 	
 	xx0!44&	( 	( 	(xx1155&	( 	( 	(xx**&	( 	( 	(xx++&	( 	( 	(xx##&	( 	( 	(3KKKr6   r   c                       e Zd ZdZdZdZ edd           edd           e edd          e		           e
d
de          gZdS )RTPSSubMessage_INFO_DSTa6  
    0...2...........7...............15.............23...............31
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   INFO_DST    |     flags     |      octetsToNextHeader       |
    +---------------+---------------+---------------+---------------+
    |                                                               |
    + GuidPrefix guidPrefix                                         +
    |                                                               |
    +---------------+---------------+---------------+---------------+
    zRTPS INFO_DTS (0x0e)>r}      r   r   r   rT   rG   rO   N)r<   r=   r>   rH   r?   
endiannessr   r   r   r   r   r1   r@   r7   r6   r:   r   r     s        	 	 "DJ 	
>4((
$a((zz.22&	( 	( 	(L"&677KKKr6   r   c                   r    e Zd ZdZdZ edd           edd           e edd          e          gZ	d	S )
RTPSSubMessage_PADa  
    0...2...........7...............15.............23...............31
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   PAD         |     flags     |      octetsToNextHeader       |
    +---------------+---------------+---------------+---------------+
    zRTPS PAD (0x01)r}      r   r   r   rT   N)
r<   r=   r>   rH   r?   r   r   r   r   r@   r7   r6   r:   r   r     sk          D
>4((
$a((zz.22&	( 	( 	(KKKr6   r   c                   ,    e Zd ZdZ edd          gZdS )RTPSSubMessage_DATA_FRAGzRTPS DATA_FRAG (0x16)uninterpreted_datar   Nr<   r=   r>   r?   r   r@   r7   r6   r:   r   r     s(        "D80!445KKKr6   r   c                   ,    e Zd ZdZ edd          gZdS )RTPSSubMessage_SEC_PREFIXzRTPS SEC_PREFIX (0x31)r   r   Nr   r7   r6   r:   r   r     s(        #D80!445KKKr6   r   c                   ,    e Zd ZdZ edd          gZdS )RTPSSubMessage_SEC_POSTFIXzRTPS SEC_POSTFIX (0x32)r   r   Nr   r7   r6   r:   r   r     s(        $D80!445KKKr6   r   c                   ,    e Zd ZdZ edd          gZdS )RTPSSubMessage_SEC_BODYzRTPS SEC_BODY (0x30)r   r   Nr   r7   r6   r:   r   r     s(        !D80!445KKKr6   r   c                   ,    e Zd ZdZ edd          gZdS )RTPSSubMessage_SRTPS_PREFIXzRTPS SRPTS_PREFIX (0x33)r   r   Nr   r7   r6   r:   r   r     s(        %D80!445KKKr6   r   c                   ,    e Zd ZdZ edd          gZdS )RTPSSubMessage_SRTPS_POSTFIXzRTPS SRPTS_POSTFIX (0x34)r   r   Nr   r7   r6   r:   r   r     s(        &D80!445KKKr6   r   c                   ,    e Zd ZdZ edd          gZdS )RTPSSubMessage_GAPzRTPS GAP (0x08)r   r   Nr   r7   r6   r:   r   r     s(        D80!445KKKr6   r   )r   r   r   r   r   r~      1   2   0   3   4   r   c                     t          j        d|dd                   d         }t                              |d           }|S )Nz!br   r   )structunpack_RTPSSubMessageTypesget)re   lstr9   remainsm_idnext_clss         r:   _next_cls_cbr     s:    M$qs,,Q/E#''t44HOr6   c                   0    e Zd ZdZ edg e          gZdS )RTPSMessagezRTPS MessagesubmessagesrL   N)r<   r=   r>   r?   r   r   r@   r7   r6   r:   r   r     s.        Dr|DDDKKKr6   r   s   RTPS)rC   s   RTPX)<rH   r   scapy.fieldsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   scapy.packetr   r   scapy.contrib.rtps.common_typesr   r   r   r   r   r   r   r   r   r   scapy.contrib.rtps.pid_typesr    r!   r"   r   r1   rB   rJ   rQ   r^   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r6   r:   <module>r      su                                         & - , , , , , , ,                                 */==DDEECCJJ   	 	 	 	 	v 	 	 	5 5 5 5 56 5 5 5p    g       7    *: *: *: *: *: *: *: *:ZF F F F F' F F FR    W   >* * * * *W * * *Z2 2 2 2 2w 2 2 2j    g   0       "6 6 6 6 6w 6 6 6
6 6 6 6 6 6 6 6
6 6 6 6 6 6 6 6
6 6 6 6 6g 6 6 6
6 6 6 6 6' 6 6 6
6 6 6 6 67 6 6 6
6 6 6 6 6 6 6 6 
 
"
 
!

"
#
$
!
%
&
  $      &    D+W - - - - D+W - - - - - -r6   