
    h	                         d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZ  G d de	          Z G d	 d
e	          Z G d de	          Zej                            ee           dS )a  
CACE Per-Packet Information (PPI) header.

A method for adding metadata to link-layer packets.

For example, one can tag an 802.11 packet with GPS coordinates of where it
was captured, and include it in the PCAP file.

New PPI types should:

 * Make their packet a subclass of ``PPI_Element``
 * Call ``bind_layers(PPI_Hdr, ExamplePPI, pfh_type=0xffff)``

See ``layers/contrib/ppi_cace.py`` for an example.
    )conf)DLT_PPI	PPI_TYPES)warning)Packet)	ByteFieldFieldLenField
LEIntFieldPacketListFieldLEShortEnumFieldLenFieldc                   N    e Zd ZdZ edde           eddd          gZd ZdS )	PPI_Hdrz
PPI Headerpfh_typer   
pfh_lengthN<H)fmtc                 ,    |                      d          S )NzPPI %pfh_type%)sprintf)selfs    T/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/ppi.py	mysummaryzPPI_Hdr.mysummary(   s    ||,---    )	__name__
__module____qualname__namer   r   r   fields_descr    r   r   r   r   !   sU        DQ	22t...K
. . . . .r   r   c                   2    e Zd ZdZdZd Zed             ZdS )PPI_ElementzSuperclass for all PPI types.zPPI Elementc                 
    d|fS )Nr   r   )r   ss     r   extract_paddingzPPI_Element.extract_padding0   s    Avr   c                 J    | j         st          d           dS | j         j        S )NzMissing under-layerr   )
underlayerr   len)pkts    r   length_fromzPPI_Element.length_from3   s+    ~ 	)***1~!!r   N)r   r   r   __doc__r   r$   staticmethodr)   r   r   r   r!   r!   ,   sI        ''D   " " \" " "r   r!   c            
           e Zd ZdZ edd           edd           eddddd	 
           edd           edg ed           gZ	d Z
d ZdS )PPIz#Per-Packet Information header (PPI)versionr   flagsr'   Nheadersr   c                     |dz   S N   r   )pxs     r   <lambda>zPPI.<lambda>B   s
    !a% r   )	length_ofr   adjustdltc                     | j         dz
  S r2   )r'   )r4   s    r   r6   zPPI.<lambda>E   s    aeai r   )r)   c                     t          j        | |           |                     d          Ot          |t                     r<|                     dt
          j                            |j                             d S d S d S Nr9   )	r   add_payloadgetfieldval
isinstancesetfieldvalr   l2typesget	__class__r   payloads     r   r=   zPPI.add_payloadH   sw    4))) E""*z'6/J/J*UDL$4$4W5F$G$GHHHHH +***r   c                     t           j                            |                     d          t	          j        | |                    S r<   )r   rA   rB   r>   r   guess_payload_classrD   s     r   rG   zPPI.guess_payload_classO   s?    |U##V%?g%N%NP P 	Pr   )r   r   r   r   r   r	   r
   r   r   r   r=   rG   r   r   r   r-   r-   <   s        0D	)Q	'1eTYD//	1 	1 	1
5$	2w$7$7	9 	9 	9KI I IP P P P Pr   r-   N)r*   scapy.configr   
scapy.datar   r   scapy.errorr   scapy.packetr   scapy.fieldsr   r	   r
   r   r   r   r   r!   r-   rA   registerr   r   r   <module>rN      sU           ) ) ) ) ) ) ) )            0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0. . . . .f . . ." " " " "& " " " P P P P P& P P P2   gs # # # # #r   