a
    kÄ#dšI  ã                   @   sF  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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„ 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ƒZ0G d&d'„ d'eƒZ1G d(d)„ d)eƒZ2G d*d+„ d+eƒZ3G d,d-„ d-eƒZ4G d.d/„ d/eƒZ5G d0d1„ d1eƒZ6G d2d3„ d3eƒZ7G d4d5„ d5eƒZ8G d6d7„ d7eƒZ9e2e/e0e.e1e-e3e4e5e6e7e8e9d8œZ:d9d:„ Z;G d;d<„ d<eƒZ<ee)e<d=d>� ee)e<d?d>� dS )@z8
Real-Time Publish-Subscribe Protocol (RTPS) dissection
é    N)ÚConditionalFieldÚIntFieldÚPacketFieldÚPacketListFieldÚ
ShortFieldÚStrFieldÚStrFixedLenFieldÚStrLenFieldÚX3BytesFieldÚ
XByteFieldÚ	XIntFieldÚ
XLongFieldÚ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_SENTINELZENTITY_UNKNOWNZENTITYID_PARTICIPANTZ"ENTITYID_SEDP_BUILTIN_TOPIC_WRITERZ"ENTITYID_SEDP_BUILTIN_TOPIC_READERZ)ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITERZ)ENTITYID_SEDP_BUILTIN_PUBLICATIONS_READERZ*ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITERZ*ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_READERZ(ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITERZ(ENTITYID_SPDP_BUILTIN_PARTICIPANT_READERZ/ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITERZ/ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER)ó       s     Ás     Âs     Çs     Âs     Çs     Âs     Çs     Âs     Çs     Âs     Çc                   @   s4   e Zd ZdZeddƒeddƒeddƒgZdd„ ZdS )	ÚGUIDPrefixPacketzRTPS GUID PrefixZhostIdr   ZappIdZ
instanceIdc                 C   s   d|fS )Nó    © )ÚselfÚpr&   r&   úN/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/rtps/rtps.pyÚextract_paddingQ   s    z GUIDPrefixPacket.extract_paddingN)Ú__name__Ú
__module__Ú__qualname__Únamer   Úfields_descr*   r&   r&   r&   r)   r$   I   s   ýr$   c                   @   sF   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Úmagicr%   é   ZprotocolVersionZvendorIdÚ
guidPrefixN)r+   r,   r-   Ú__doc__r.   r   r   r   r   r$   r/   r&   r&   r&   r)   r0   U   s   +
ÿÿÿúr0   c                   @   s*   e Zd ZdZedg ed�eddeƒgZdS )ÚInlineQoSPacketz
Inline QoSÚ
parameters©Znext_cls_cbÚsentinelÚ N)	r+   r,   r-   r.   r   r!   r   r"   r/   r&   r&   r&   r)   r5   �   s   
þr5   c                	   @   sH   e Zd ZdZeddeƒeddƒeeddƒed�e	ddd	d
„ e
d�gZdS )ÚParticipantMessageDataPacketzParticipant Message Datar3   r9   Úkindr   ÚsequenceSize©Zendianness_fromÚserializedDatac                 C   s
   | j d S ©Nr2   )r<   )Úxr&   r&   r)   Ú<lambda>    r%   z%ParticipantMessageDataPacket.<lambda>)Úlength_fromÚ
max_lengthN)r+   r,   r-   r.   r   r$   r   r   r   r	   r   r/   r&   r&   r&   r)   r:   –   s   

ÿüûr:   c                
       s~   e Zd ZdZdZdZeddƒeddƒeedde	ƒdd	„ ƒeed
de
ƒdd	„ ƒeedddd	„ d�dd	„ ƒgZ‡ fdd„Z‡  ZS )Ú
DataPacketzData PacketNr   ÚencapsulationKindZencapsulationOptionsZparameterListr9   c                 C   s
   | j dkS )Né   )rE   ©Úpktr&   r&   r)   rA   ±   r%   zDataPacket.<lambda>ZparticipantMessageDatac                 C   s
   | j dkS )NÚParticipantMessageData)Ú_pl_typerG   r&   r&   r)   rA   ·   r%   r>   c                 C   s   | j S )N)Ú_pl_lenrG   r&   r&   r)   rA   ¼   r%   ©rB   c                 C   s   | j dko| jdkS )NrF   rI   )rE   rJ   rG   r&   r&   r)   rA   ¾   s    
c                    sb   |  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   éÂ   rI   ZSerializedData)ÚpoprD   rJ   rK   ÚsuperÚ__init__)r'   ÚargsÚkwargsrM   rN   rO   ©Ú	__class__r&   r)   rS   Å   s    zDataPacket.__init__)r+   r,   r-   r.   rJ   rK   r   r   r   r    r:   r   r/   rS   Ú__classcell__r&   r&   rV   r)   rD   ¦   s.   
þÿý
ÿüñrD   c                   @   sÖ   e Zd ZdZdZeddƒeddƒeeddƒed�e	d	dd
ƒeeddƒed�e
ddƒeddƒe
ddƒeddƒeeddƒed�eeddƒed�eeddeƒdd„ ƒeeddeed�dd„ ƒeeddeed�d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   ÚoctetsToNextHeaderr=   Z
extraFlagsé   ZoctetsToInlineQoSZreaderEntityIdKeyZreaderEntityIdKindZwriterEntityIdKeyZwriterEntityIdKindZwriterSeqNumHiZwriterSeqNumLowZ	inlineQoSr9   c                 C   s   | j d@ dkS )Nr^   ©r\   rG   r&   r&   r)   rA     r%   zRTPSSubMessage_DATA.<lambda>Úkeyc                 C   s   | j d@ dkS )Né   r_   rG   r&   r&   r)   rA     r%   Údatac                 C   s   | j d@ dkS r?   r_   rG   r&   r&   r)   rA     r%   N)r+   r,   r-   r4   r.   r   r   r   r   r   r
   r   r   r   r5   r   rD   r/   r&   r&   r&   r)   rY   Ó   sL   
ÿ

ÿ
ÿ
ÿ
þÿýÿýÚrY   c                
   @   sl   e Zd ZdZdZeddƒedddg d¢ƒeed	dƒe	d
�e
edddd�dd„ ƒe
edd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)rZ   é	   r\   r   ra   )ÚEÚIú?rg   rg   rg   rg   rg   r]   r=   Z
ts_secondsz<l)ÚdefaultÚfmtc                 C   s   t | jƒ d¡S ©Nrf   ©Ústrr\   ÚfindrG   r&   r&   r)   rA   2  r%   zRTPSSubMessage_INFO_TS.<lambda>Zts_fractionz<Lc                 C   s   t | jƒ d¡S rj   rk   rG   r&   r&   r)   rA   6  r%   N)r+   r,   r-   r4   r.   r   r   r   r   r   r   r   r/   r&   r&   r&   r)   rc     s&   þ
ÿþþõrc   c                
   @   sn   e Zd ZdZdZeddƒeddƒeeddƒed�e	d	d
de
d�e	dd
de
d�edddd„ d�edddƒ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)rZ   é   r\   r   r]   r=   Ú	reader_idr#   Ú4s©rh   ri   ÚenumÚ	writer_idZreaderSNStatec                 C   s   | j d d S )Nra   r2   )r]   rG   r&   r&   r)   rA   a  r%   zRTPSSubMessage_ACKNACK.<lambda>rL   Úcountr2   N)r+   r,   r-   r4   r.   r   r   r   r   r   Ú_rtps_reserved_entity_idsr   r   r/   r&   r&   r&   r)   rn   ;  s2   
ÿüüþ
ërn   c                   @   st   e Zd ZdZdZeddƒeddƒeeddƒed�e	d	d
de
d�e	dd
de
d�eddƒeddƒeeddƒed�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)rZ   é   r\   r   r]   r=   rp   r#   rq   rr   rt   ZfirstAvailableSeqNumZ
lastSeqNumru   N)r+   r,   r-   r4   r.   r   r   r   r   r   rv   r   r   r/   r&   r&   r&   r)   rw   g  s2   
ÿüü
ÿírw   c                   @   sF   e Zd ZdZdZdZeddƒeddƒeeddƒe	d	�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)ú>rZ   é   r\   r   r]   r=   r3   r9   N)r+   r,   r-   r4   r.   Z
endiannessr   r   r   r   r   r$   r/   r&   r&   r&   r)   ry   –  s   
ÿ
ûry   c                   @   s8   e Zd ZdZdZeddƒeddƒeeddƒed�gZ	d	S )
ÚRTPSSubMessage_PADa  
    0...2...........7...............15.............23...............31
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |   PAD         |     flags     |      octetsToNextHeader       |
    +---------------+---------------+---------------+---------------+
    zRTPS PAD (0x01)rZ   é   r\   r   r]   r=   N)
r+   r,   r-   r4   r.   r   r   r   r   r/   r&   r&   r&   r)   r|   ®  s   
ÿýr|   c                   @   s   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/   r&   r&   r&   r)   r~   ¿  s   r~   c                   @   s   e Zd ZdZeddƒgZdS )ÚRTPSSubMessage_SEC_PREFIXzRTPS SEC_PREFIX (0x31)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 )ÚRTPSSubMessage_SEC_POSTFIXzRTPS SEC_POSTFIX (0x32)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 )ÚRTPSSubMessage_SEC_BODYzRTPS SEC_BODY (0x30)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 )ÚRTPSSubMessage_SRTPS_PREFIXzRTPS SRPTS_PREFIX (0x33)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 )ÚRTPSSubMessage_SRTPS_POSTFIXzRTPS SRPTS_POSTFIX (0x34)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 )ÚRTPSSubMessage_GAPzRTPS GAP (0x08)r   r   Nr€   r&   r&   r&   r)   r†   Ý  s   r†   )r}   ro   rx   rd   r{   r[   é   é1   é2   é0   é3   é4   ra   c                 C   s(   t  d|dd… ¡d }t |d ¡}|S )Nz!br   r}   )ÚstructÚunpackÚ_RTPSSubMessageTypesÚget)rH   Úlstr(   ZremainZsm_idZnext_clsr&   r&   r)   Ú_next_cls_cbô  s    r’   c                   @   s    e Zd ZdZedg ed�gZdS )ÚRTPSMessagezRTPS MessageZsubmessagesr7   N)r+   r,   r-   r.   r   r’   r/   r&   r&   r&   r)   r“   û  s   ÿr“   s   RTPS)r1   s   RTPX)=r4   r�   Zscapy.fieldsr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Zscapy.packetr   r   Zscapy.contrib.rtps.common_typesr   r   r   r   r   r   r   r   r   r   Zscapy.contrib.rtps.pid_typesr    r!   r"   rv   r$   r0   r5   r:   rD   rY   rc   rn   rw   ry   r|   r~   r�   r‚   rƒ   r„   r…   r†   r�   r’   r“   r&   r&   r&   r)   Ú<module>   sl   P0ô8	-I,/ò