
    i                     f    d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	  G d de          Z
dS )    N)consts)
Pickleable)	BaseLayerc                       e Zd ZdZ	 	 ddZd Zd Zd ZdefdZ	d	 Z
d
 Zedej        fd            Zd Zd Zed             Zd ZeZd Zedefd            Zedefd            Zdej        e         fdZdS )PacketzZA packet object which contains layers.

    Layers can be accessed via index or name.
    Nc                 |    |g | _         n|| _         || _        || _        || _        || _        || _        || _        dS )a/  
        Creates a Packet object with the given layers and info.

        :param layers: A list of BaseLayer objects.
        :param frame_info: Layer object for the entire packet frame (information like frame length, packet number, etc.
        :param length: Length of the actual packet.
        :param captured_length: The length of the packet that was actually captured (could be less then length)
        :param sniff_time: The time the packet was captured (timestamp)
        :param interface_captured: The interface the packet was captured in.
        N)layers
frame_infonumberinterface_capturedcaptured_lengthlengthsniff_timestamp)selfr	   r
   r   r   r   
sniff_timer   s           e/home/jenkins/workspace/simtester-sanitize/venv/lib/python3.11/site-packages/pyshark/packet/packet.py__init__zPacket.__init__   sL     >DKK DK$"4.)    c                     t          |t                    r| j        |         S | j        D ]5}|j                                        |                                k    r|c S 6t          d          )z
        Gets a layer according to its index or its name

        :param item: layer index or name
        :return: BaseLayer object.
        zLayer does not exist in packet)
isinstanceintr	   
layer_namelowerKeyErrorr   itemlayers      r   __getitem__zPacket.__getitem__(   ss     dC   	%;t$$[ 	 	E%%''4::<<77 87888r   c                 :    	 | |          dS # t           $ r Y dS w xY w)zZChecks if the layer is inside the packet.

        :param item: name of the layer
        TF)r   )r   r   s     r   __contains__zPacket.__contains__6   s7    
	JJ4 	 	 	55	s    
c                     t          t          |                     t          | j                                                  z   d | j        D             z   S )Nc                     g | ]	}|j         
S  )r   ).0ls     r   
<listcomp>z"Packet.__dir__.<locals>.<listcomp>B   s    >a>a>aPQq|>a>a>ar   )dirtypelist__dict__keysr	   r   s    r   __dir__zPacket.__dir__A   sG    4::dm&8&8&:&:!;!;;>a>aUYU`>a>a>aaar   returnc                     d| v s
J d            d}d t          | j        j        dd d         | j        j        dd d                   D             }|D ]}|t          j        |          z  }|S )N	FRAME_RAWzPacket contains no raw data. In order to contains it, make sure that use_json and include_raw are set to True in the Capture objectr   c                 8    g | ]}d                      |          S ) )join)r$   xs     r   r&   z)Packet.get_raw_packet.<locals>.<listcomp>I   s"    gggarwwqzzgggr   r         )zip	frame_rawvaluebinascii	unhexlify)r   
raw_packetbyte_valuesr9   s       r   get_raw_packetzPacket.get_raw_packetD   s    d""" %<""" 
gg3t~/CADqD/I4>K_`a`dcd`dKe+f+fggg  	4 	4E(,U333JJr   c                 *    t          | j                  S N)r   r   r,   s    r   __len__zPacket.__len__N   s    4;r   c                     dS )NTr#   r,   s    r   __bool__zPacket.__bool__Q   s    tr   c                     	 t          | j                  }n=# t          $ r0 t          | j                            d          d                   }Y nw xY wt          j                            |          S )N.r   )floatr   
ValueErrorsplitdatetimefromtimestamp)r   	timestamps     r   r   zPacket.sniff_timeT   s{    	Bd233II 	B 	B 	B d288==a@AAIII	B  ..y999s    7AAc                 b    d}| j         | j        k    r| j         
| j         dz   }d| | j         dS )Nr2   /<z Packet>)transport_layerhighest_layer)r   transport_protocols     r   __repr__zPacket.__repr__^   sI    4#555$:N:Z!%!5!;C%Ct'9CCCCr   c                 L    | j         }| j        D ]}|t          |          z  }|S r@   )_packet_stringr	   str)r   sr   s      r   __str__zPacket.__str__e   s1    [ 	 	EUOAAr   c                 0    d| j          dt          j         S )z2A simple pretty string that represents the packet.zPacket (Length: ))r   oslinesepr,   s    r   rT   zPacket._packet_stringk   s     =$+<<
<<<r   c                 B    | j         D ]}|                                 d S r@   )r	   pretty_printr   r   s     r   r]   zPacket.pretty_printp   s2    [ 	! 	!E    	! 	!r   c                     | j         D ]5}|j                                        |                                k    r|c S 6t          d|           )zR
        Allows layers to be retrieved via get attr. For instance: pkt.ip
        zNo attribute named )r	   r   r   AttributeErrorr   s      r   __getattr__zPacket.__getattr__v   s\     [ 	 	E%%''4::<<77 89499:::r   c                 J    | j         d         j                                        S )N)r	   r   upperr,   s    r   rP   zPacket.highest_layer   s    {2)//111r   c                 4    t           j        D ]
}|| v r|c S d S r@   )r   TRANSPORT_LAYERSr^   s     r   rO   zPacket.transport_layer   s5    , 	 	E}} 	 	r   c                 *    fd| j         D             S )a  Returns a list of all the layers in the packet that are of the layer type (an incase-sensitive string).

        This is in order to retrieve layers which appear multiple times in the same packet (i.e. double VLAN)
        which cannot be retrieved by easier means.
        c                 r    g | ]3}|j                                                                         k    1|4S r#   )r   r   )r$   r   r   s     r   r&   z.Packet.get_multiple_layers.<locals>.<listcomp>   s>    aaa%%2B2H2H2J2JjN^N^N`N`2`2`2`2`2`r   )r	   )r   r   s    `r   get_multiple_layerszPacket.get_multiple_layers   s"     baaa4;aaaar   )NNNNNNN)__name__
__module____qualname____doc__r   r   r    r-   bytesr>   rA   rC   propertyrI   r   rR   rW   rT   r]   showra   r   rP   rO   typingListri   r#   r   r   r   r      s        
 =AX\* * * *.9 9 9	 	 	b b b            :H- : : : X:D D D   = = X=! ! ! D; ; ; 2y 2 2 2 X2     X
bY1G b b b b b br   r   )rI   rZ   r:   rq   pyshark.packetr   pyshark.packet.commonr   pyshark.packet.layers.baser   r   r#   r   r   <module>rv      s     				   ! ! ! ! ! ! , , , , , , 0 0 0 0 0 0Db Db Db Db DbZ Db Db Db Db Dbr   