
    h5f                        d Z ddlZddlZddlZddlm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 ddlmZmZ ddlmZmZ dd	lmZ dd
lmZ ddl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+m,Z,m-Z-m.Z. g dZ/dZ0dZ1dZ2dZ3dZ4dZ5dddej6        d<    G d de          Z7ej8        9                    e
e7            eee7d            G d de7          Z: eee:d            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;          ZA G d. d/e          ZB G d0 d1e7          ZCd6d3ZD G d4 d5          ZEdS )7zyA minimal implementation of the CANopen protocol, based on
Wireshark dissectors. See https://wiki.wireshark.org/CANopen

    N)conf)chb	hex_bytes)DLT_CAN_SOCKETCAN)	FieldLenField
FlagsFieldStrLenFieldThreeBytesField	XBitFieldScalingFieldConditionalFieldLenField
ShortField)	RandFloatRandBinFloat)Packetbind_layers)CookedLinux)Scapy_Exception)
PacketList)SuperSocket)_ByteStream)	TupleOptionalTypeListUnionCallableIOAnycast)CANSignalPacketSignalFieldLESignedSignalFieldLEUnsignedSignalFieldLEFloatSignalFieldBEFloatSignalFieldBESignedSignalFieldBEUnsignedSignalField	rdcandumpCandumpReaderSignalHeaderCAN_MTUCAN_MAX_IDENTIFIERCAN_MAX_DLENCAN_INV_FILTERCANFD
CAN_FD_MTUCAN_FD_MAX_DLENi      i    H   @   FT)
swap-bytesremove-paddingr"   c            	           e Zd ZdZ edddg d           eddd           edd	d
d           edd           ed
dd           gZ	e
	 dd            Zed             Zd Zd Zd Zd Zd	S )r"   au  A implementation of CAN messages.

    Dissection of CAN messages from Wireshark captures and Linux PF_CAN sockets
    are supported from protocol specification.
    See https://wiki.wireshark.org/CANopen for further information on
    the Wireshark dissector. Linux PF_CAN and Wireshark use different
    endianness for the first 32 bit of a CAN message. This dissector can be
    configured for both use cases.

    Configuration ``swap-bytes``:
        Wireshark dissection:
            >>> conf.contribs['CAN']['swap-bytes'] = False

        PF_CAN Socket dissection:
            >>> conf.contribs['CAN']['swap-bytes'] = True

    Configuration ``remove-padding``:
    Linux PF_CAN Sockets always return 16 bytes per CAN frame receive.
    This implicates that CAN frames get padded from the Linux PF_CAN socket
    with zeros up to 8 bytes of data. The real length from the CAN frame on
    the wire is given by the length field. To obtain only the CAN frame from
    the wire, this additional padding has to be removed. Nevertheless, for
    corner cases, it might be useful to also get the padding. This can be
    configured through the **remove-padding** configuration.

    Truncate CAN frame based on length field:
        >>> conf.contribs['CAN']['remove-padding'] = True

    Show entire CAN frame received from socket:
        >>> conf.contribs['CAN']['remove-padding'] = False

    flagsr      errorremote_transmission_requestextended
identifier   lengthNdataB	length_offmtreserved    c                 *    t          | j                  S NintrD   pkts    T/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/can.py<lambda>zCAN.<lambda>h       SZ rK   length_fromc                     |rYt          |          dk    o|d         dz  o|d         dz   }|rt          S t          |          dk    r|d         dk    rt          S t          S )N         r6   )lenr2   r"   )cls_pktargskargsfdf_sets        rR   dispatch_hookzCAN.dispatch_hookk   sr      	$ii!m #Q$ #GdN"  TQ47Q;;
rK   c                     t          |           dz
  }t          j        d                    |          gt          j        d                    |          |           R  S )a6  Invert the order of the first four bytes of a CAN packet

        This method is meant to be used specifically to convert a CAN packet
        between the pcap format and the SocketCAN format

        :param pkt: bytes str of the CAN packet
        :return: bytes str with the first four bytes swapped
        rY   z<I{}sz>I{}s)r[   structpackformatunpack)rQ   len_partials     rR   inv_endiannesszCAN.inv_endiannessz   s_     #hhl{7>>+66 M"M'..*E*EsKKM M M 	MrK   c                 n    t           j        d         d         rt                              |          }|S |S )z8Implements the swap-bytes functionality when dissecting r"   r9   r   contribsr"   rh   )selfsrE   s      rR   pre_dissectzCAN.pre_dissect   s5     =- 	%%a((DKrK   c                     d | _         |S rM   )raw_packet_cacherl   rm   s     rR   post_dissectzCAN.post_dissect   s     $rK   c                 z    t           j        d         d         rt                              |          }||z   S ||z   S )zImplements the swap-bytes functionality for Packet build.

        This is based on a copy of the Packet.self_build default method.
        The goal is to affect only the CAN layer data and keep
        under layers (e.g CookedLinux) unchanged
        r"   r9   rj   )rl   rQ   payrE   s       rR   
post_buildzCAN.post_build   s?     =- 	%%c**D#:SyrK   c                 >    t           j        d         d         rdS d|fS )Nr"   r:   )rK   NrK   )r   rk   )rl   ps     rR   extract_paddingzCAN.extract_padding   s%    = 01 	96MrK   rM   )__name__
__module____qualname____doc__r   r   r   r
   r	   fields_descclassmethodra   staticmethodrh   rn   rr   ru   rx    rK   rR   r"   r"   @   s        B 	
7Aq #/ #/ #/ 	0 	0 		,2&&hC@@@
A&&FC-H-HIIIK    [ M M \M    
      rK      )protoc            
            e Zd ZdZ edddg d           eddd           edd	d
d           edddg d           edd           ed
dd           gZ	 fdZ
 xZS )r2   z?
    This class is used for distinction of CAN FD packets.
    r<   r   r=   r>   rB   rC   rD   NrE   rF   rG   fd_flagsrY   r6   bit_rate_switcherror_state_indicatorfd_framerJ   rK   c                 *    t          | j                  S rM   rN   rP   s    rR   rS   zCANFD.<lambda>   rT   rK   rU   c                 L   t          t          |                               ||          }|d         }d|cxk     rdk    rn n
|| dz  z   }n)d|cxk     rdk    rn n
|| dz  z   }n|dk    rt          |}d||z
  z  }|dd         t	          |          z   |dd          z   |z   S )NrY   r6      r8       r   rX   )superr2   ru   NotImplementedErrorr   )rl   rQ   rt   rE   rD   wire_lengthpad	__class__s          rR   ru   zCANFD.post_build   s     UD!!,,S#66av VGq=0KK&B VGq=0KKb[[%% Kv-.AaCy3{+++d122h6<<rK   )ry   rz   r{   r|   r   r   r   r   r	   r}   ru   __classcell__)r   s   @rR   r2   r2      s          	
7Aq #/ #/ #/ 	0 	0 		,2&&hC@@@
:q! &2 &2 &2 	3 	3 	
:q!!FC-H-HIIIK= = = = = = = = =rK   r2      c                       e Zd ZdZddgZ	 	 dd	Zg d
Zed             Zed             Z	ed             Z
ed             Zd Zd Zd Zd Zd Zd Zd ZdS )r$   a
  SignalField is a base class for signal data, usually transmitted from
    CAN messages in automotive applications. Most vehicle manufacturers
    describe their vehicle internal signals by so called data base CAN (DBC)
    files. All necessary functions to easily create Scapy dissectors similar
    to signal descriptions from DBC files are provided by this base class.

    SignalField instances should only be used together with SignalPacket
    classes since SignalPackets enforce length checks for CAN messages.

    startsize    r   r=   rF   c
           
          t          j        | |||||||	           || _        t          |          | _        |	d         dk    r| j        dk    rt          d          d S d S )Nf    z(SignalField size has to be 32 for floats)r   __init__r   absr   r   )
rl   namedefaultr   r   scalingunitoffsetndigitsrI   s
             rR   r   zSignalField.__init__   so     	dD'7D&%s	, 	, 	,
II	r7c>>di2oo!"LMMM >oorK   )@      rX   rY   r=      r   r         r   r      
   	   r6                        r5         rC               r   '   &   %   $   #   "   !   r   /   .   -   ,   +   *   )   (   7   6   5   4   3   2   1   0   ?   >   =   <   ;   :   9   8   c                 |    	 t           j                            |           S # t          $ r t	          d          w xY w)N/Only 64 bits for all SignalFields are supported)r$   _lookup_tableindex
ValueErrorr   )r   s    rR   _msb_lookupzSignalField._msb_lookup   sP    	3,225999 	3 	3 	3! #2 3 3 3	3s   ! ;c                     	 t           j        t                               |           |z   dz
           S # t          $ r t	          d          w xY w)Nr   r   )r$   r   r   
IndexErrorr   )r   r   s     rR   _lsb_lookupzSignalField._lsb_lookup  si    	3,[-D-DU-K-K-1.245.6 7 7 	3 	3 	3! #2 3 3 3	3s	   /2 Ac                 0    | d|dz
  z  z  r
d|z  }|| z   S | S )Nr   r   r   number
bit_lengthmasks      rR   _convert_to_unsignedz SignalField._convert_to_unsigned  s2     Q:>*+ 	!OD&= rK   c                 >    d|z  dz
  }| d|dz
  z  z  r| | z  S | |z  S )Nr   r   r   r   s      rR   _convert_to_signedzSignalField._convert_to_signed  s>     Z1$Q:>*+ 	"TE>!}rK   c                 $    | j         d         dk    S )Nr   <rI   rl   s    rR   _is_little_endianzSignalField._is_little_endian  s    x{c!!rK   c                 @    | j         d                                         S )Nr   )rI   islowerr   s    rR   _is_signed_numberzSignalField._is_signed_number   s    x|##%%%rK   c                 $    | j         d         dk    S )Nr   r   r   r   s    rR   _is_float_numberzSignalField._is_float_number$  s    x|s""rK   c                    t          |t                    st          d          |                     ||          }|                                 r| j        | j        z   dz
  }| j        }|}d}nI| j        }|                     | j        | j                  }d|                     |          z
  | j        z
  }d}t          ||          dz  dz   }t          |          |k     r|d|t          |          z
  z  z  }|                                 rBt          j        | j        d         d	z   t          j        | j        |                    d         }	nR|                                 r)|                     t%          |          | j                  }	nt'          t$          |          }	t          j        ||d
z   d d                   d         }
|
|	|z  z  }
t          j        ||
          }|d t          |                   S )N'Only use SignalFields in a SignalPacketr   <Qr8   >Qr6   r   r   I           )
isinstancer#   r   i2mr   r   r   r   r   maxr[   r   rc   rf   rI   rd   r   r   rO   r!   )rl   rQ   rm   valmsb_poslsb_posshiftrI   	field_lenint_valpkt_valtmp_ss               rR   addfieldzSignalField.addfield(  s   #|,, 	M!"KLLLhhsC  !!## 		j49,q0GjGECCjG&&tz49==G$**7333di?EC))Q.2	q66IIA.//A  "" 	%mDHQK#$5$*K#$>$>@ @@ACGG##%% 	%//C$)DDGG3nnG-a+orr%:;;A>7e##C))Wc!ffW~rK   c                    t          |t                    st          d          t          |t                    r|\  }}|                                 r#| j        | j        z   dz
  }| j        }| j        }d}nN| j        }|                     | j        | j                  }d|                     | j                  z
  | j        z
  }d}t          ||          dz  dz   }|j
        ||_
        t          |j
        |          |_
        t          j        ||dz   d d                   d         |z	  }	|	d| j        z  dz
  z  }	|                                 rBt          j        | j        t          j        | j        d         d	z   |	                    d         }	n/|                                 r|                     |	| j                  }	||                     ||	          fS )
Nr   r   r   r8   r   r6   r   r   r   )r   r#   r   tupler   r   r   r   r   r   wirelenrc   rf   r   rI   rd   r   r   m2i)
rl   rQ   rm   _r   r   r   rI   r  fld_vals
             rR   getfieldzSignalField.getfieldK  s   #|,, 	M!"KLLLa 	DAq!!## 		j49,q0GjGJECCjG&&tz49==G$**4:666BEC))Q.2	;#CK#+y11-a+orr%:;;A>%GQ$)^q()  "" 	BmDH$*Kc0A7$K$KM MMNPGG##%% 	B--gtyAAG$((3((((rK   c                    |                                  rt          dd          S |                                 rd| j        dz
  z   }d| j        dz
  z  dz
  }nd}d| j        z  dz
  }t	          || j        z  | j        z   | j                  }t	          || j        z  | j        z   | j                  }t          t          ||          t          ||                    S )Nr   r   r   )r   r   r   r   roundr   r   r   r   minr   )rl   min_valmax_vals      rR   randvalzSignalField.randvalp  s      "" 	&1%%%!!## 	)49q=))G$)a-(1,GGG49nq(G$,.<dlKK$,.<dlKKWg..GW0E0EFFFrK   c                 J    t          t          | j                  dz            S )Nr6   )rO   floatr   )rl   rQ   xs      rR   i2lenzSignalField.i2len  s    5##a'(((rK   N)r   r   r   r=   rF   )ry   rz   r{   r|   	__slots__r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   rK   rR   r$   r$      s3       	 	 &!ICE*-	N 	N 	N 	N5 5 5M 3 3 \3 3 3 \3   \   \" " "& & &# # #! ! !F#) #) #)JG G G") ) ) ) )rK   r$   c                       e Zd Z	 	 ddZdS )r&   r   r   r   r=   c	                 L    t                               | ||||||||d
  
         d S )Nz<Br$   r   	rl   r   r   r   r   r   r   r   r   s	            rR   r   zLEUnsignedSignalField.__init__  @     	T4%$dFGT	C 	C 	C 	C 	CrK   Nr   r   r   r=   ry   rz   r{   r   r   rK   rR   r&   r&     4        CE#$C C C C C CrK   r&   c                       e Zd Z	 	 ddZdS )r%   r   r   r   r=   c	                 L    t                               | ||||||||d
  
         d S )Nz<br  r  s	            rR   r   zLESignedSignalField.__init__  r  rK   Nr  r  r   rK   rR   r%   r%     r  rK   r%   c                       e Zd Z	 	 ddZdS )r*   r   r   r   r=   c	                 L    t                               | ||||||||d
  
         d S )Nz>Br  r  s	            rR   r   zBEUnsignedSignalField.__init__  r  rK   Nr  r  r   rK   rR   r*   r*     r  rK   r*   c                       e Zd Z	 	 ddZdS )r)   r   r   r   r=   c	                 L    t                               | ||||||||d
  
         d S )Nz>br  r  s	            rR   r   zBESignedSignalField.__init__  r  rK   Nr  r  r   rK   rR   r)   r)     r  rK   r)   c                       e Zd Z	 	 ddZdS )r'   r   r   r   r=   c                 L    t                               | |||d||||d
  
         d S )Nr   z<fr  rl   r   r   r   r   r   r   r   s           rR   r   zLEFloatSignalField.__init__  @     	T4%$dFGT	C 	C 	C 	C 	CrK   Nr  r  r   rK   rR   r'   r'     4        =?#$C C C C C CrK   r'   c                       e Zd Z	 	 ddZdS )r(   r   r   r   r=   c                 L    t                               | |||d||||d
  
         d S )Nr   z>fr  r(  s           rR   r   zBEFloatSignalField.__init__  r)  rK   Nr  r  r   rK   rR   r(   r(     r*  rK   r(   c                       e Zd ZdZd Zd ZdS )r#   a  Special implementation of Packet.

    This class enforces the correct wirelen of a CAN message for
    signal transmitting in automotive applications.
    Furthermore, the dissection order of SignalFields in fields_desc is
    deduced by the start index of a field.
    c                 `    t          d | j        D                       st          d          |S )Nc              3      K   | ]H}t          |t                    p.t          |t                    ot          |j        t                    V  Id S rM   )r   r$   r   fld).0r   s     rR   	<genexpr>z+SignalPacket.pre_dissect.<locals>.<genexpr>  si       . .  a-- 4q"233 3quk22. . . . . .rK   z'Use only SignalFields in a SignalPacket)allr}   r   rq   s     rR   rn   zSignalPacket.pre_dissect  sL     . . !,. . . . . 	M ""KLLLrK   c                 p    | j         | j         dk    rt          d          d| _        || j         d         S )a  SignalFields can be dissected on packets with unordered fields.

        The order of SignalFields is defined from the start parameter.
        After a build, the consumed bytes of the length of all SignalFields
        have to be removed from the SignalPacket.
        Nr6   r   )r  r   rp   rq   s     rR   rr   zSignalPacket.post_dissect  sH     <#q(8(8! #2 3 3 3 $rK   N)ry   rz   r{   r|   rn   rr   r   rK   rR   r#   r#     s<                    rK   r#   c            
           e Zd ZdZ edddg d           eddd           edd	d
           edddg d           edd          gZe		 dd            Z
d Zd	S )r-   a"  Special implementation of a CAN Packet to allow dynamic binding.

    This class can be provided to CANSockets as basecls.

    Example:
        >>> class floatSignals(SignalPacket):
        >>>     fields_desc = [
        >>>         LEFloatSignalField("floatSignal2", default=0, start=32),
        >>>         BEFloatSignalField("floatSignal1", default=0, start=7)]
        >>>
        >>> bind_layers(SignalHeader, floatSignals, identifier=0x321)
        >>>
        >>> dbc_sock = CANSocket("can0", basecls=SignalHeader)

    All CAN messages received from this dbc_sock CANSocket will be interpreted
    as SignalHeader. Through Scapys ``bind_layers`` mechanism, all CAN messages
    with CAN identifier 0x321 will interpret the payload bytes of these
    CAN messages as floatSignals packet.
    r<   r   r=   r>   rB   rC   rD   NrF   r   r   r6   r   rJ   c                     t           S rM   )r-   )r\   r]   r^   r_   s       rR   ra   zSignalHeader.dispatch_hook  s
     rK   c                 
    |d fS rM   r   rq   s     rR   rx   zSignalHeader.extract_padding  s    $wrK   rM   )ry   rz   r{   r|   r   r   r   r   r}   r~   ra   rx   r   rK   rR   r-   r-     s         ( 	
7Aq #/ #/ #/ 	0 	0 		,2&&4S)))
:q! &2 &2 &2 	3 	3 	
:q!!
K    [    rK   r-   r   c                     t          | |          5 }|                    |          cddd           S # 1 swxY w Y   dS )ap   Read a candump log file and return a packet list.

    :param filename: Filename of the file to read from.
                     Also gzip files are accepted.
    :param count: Read only <count> packets. Specify -1 to read all packets.
    :param interface: Return only packets from a specified interface
    :return: A PacketList object containing the read files
    )countN)r,   read_all)filenamer9  	interfacefdescs       rR   r+   r+     s     
x	+	+ +u~~E~**+ + + + + + + + + + + + + + + + + +s   488c                       e Zd ZdZdZddZd Zed             Zd Z	e	Z
efdZd	 ZddZefdZd Zed             Zd Zd Zd Zedd            ZdS )r,   a  A stateful candump reader. Each packet is returned as a CAN packet.

    Creates a CandumpReader object

    :param filename: filename of a candump logfile, compressed or
                     uncompressed, or a already opened file object.
    :param interface: Name of a interface, if candump contains messages
                      of multiple interfaces and only one messages from a
                      specific interface are wanted.
    TNc                     |                      |          \  | _        | _        d | _        |(t	          |t
                    r
|g| _        d S || _        d S d S rM   )openr;  r   ifilterr   str)rl   r;  r<  s      rR   r   zCandumpReader.__init__   s[     $		( 3 3tv )S)) ) ){(	 ! rK   c                     | S rM   r   r   s    rR   __iter__zCandumpReader.__iter__*      rK   c                 "   	 t          | t                    re	 t          j        | d          }|                    d           |                    d           n # t          $ r t          | d          }Y nw xY w| |fS t          | dd          }|| fS )a  Open function to handle three types of input data.

        If filename of a regular candump log file is provided, this function
        opens the file and returns the file object.
        If filename of a gzip compressed candump log file is provided, the
        required gzip open function is used to obtain the necessary file
        object, which gets returned.
        If a fileobject or ByteIO is provided, the filename is gathered for
        internal use. No further steps are performed on this object.

        :param filename: Can be a string, specifying a candump log file or a
                         gzip compressed candump log file. Also already opened
                         file objects are allowed.
        :return: A opened file object for further use.
        rbr   r   r   zNo name)r   rB  gzipr@  readseekIOErrorgetattr)r;  r=  r   s      rR   r@  zCandumpReader.open.  s    $ 	,h$$ 	"-	(D11

1

1 - - -Xt,,-U?"8VY77D>!s   ?A A54A5c                 h    	 d}||                                  }|n# t          $ r t          w xY w|S )zImplements the iterator protocol on a set of packets

        :return: Next readable CAN Packet from the specified file
        N)read_packetEOFErrorStopIteration)rl   rQ   s     rR   nextzCandumpReader.nextN  sR    	 C+&&(( + 	  	  	 	  
s    /c                 V   | j                                         }|                                }t          |          dk     rt          |d         t          d          k    }d}|ry|                                \  }}}d|v r+|                    d          \  }}	|	d         }|	dd         }	n|                    d          \  }}	d}
t          |dd                   }n2|                    d	          \  }}	|                                \  }}}
d}| j        |	                    d
          | j        vrdS |	
                    dd          }	|	                                }	t          |	          dk    r/|-t          t          |d          t          |	                    }n-t          t          |d          |t          |	                    }|
t          |
dd                   |_        nt          |j                  |_        t          |          dk    rd|_        |||_        |S )aF  Read a packet from the specified file.

        This function will raise EOFError when no more packets are available.

        :param size: Not used. Just here to follow the function signature for
                     SuperSocket emulation.
        :return: A single packet read from the file or None if filters apply
        r5   r      (Ns   ##r      #r      ]ASCII    rK   r6   )rB   rE   )rB   r   rE   r=   rY   )r   readlinelstripr[   rO  ordsplitr  rA  decodereplacestripr"   rO   r   r2   rD   rE   r<   time)rl   r   lineis_log_file_formatr   t_bintfr   idnrE   lethrQ   s                 rR   rN  zCandumpReader.read_packet^  s    v  {{}}t99r>>N!!WD		1 	::<<LCqzzGGENN	T7ABBxGGDMM	TBc!B$i  AAjj&&GAtGGIIMD#rA<#G$$DL884||D#&&zz||t99>>h.S"IdOODDDCC3sB<<(&t__. . .C >RVCJJSXCJs88a<<CI=CH
rK   c                 &    | D ]} ||           dS )zCall the specified callback routine for each packet read

        This is just a convenience function for the main loop
        that allows for easy launching of packet processing in a
        thread.
        Nr   )rl   callbackrw   s      rR   dispatchzCandumpReader.dispatch  s,      	 	AHQKKKK	 	rK   r   c                 
   g }|dk    rI	 |                                  }|n# t          $ r Y n$w xY w|dz  }|                    |           |dk    It          |t          j                            | j                            S )a  Read a specific number or all packets from a candump file.

        :param count: Specify a specific number of packets to be read.
                      All packets can be read by count=-1.
        :return: A PacketList object containing read CAN messages
        r   Nr   )r   )rN  rO  appendr   ospathbasenamer;  )rl   r9  resrw   s       rR   r:  zCandumpReader.read_all  s     qjj$$&&9    QJEJJqMMM qjj #BG$4$4T]$C$CDDDDs   " 
//c                 R    	 |                      |          S # t          $ r Y dS w xY w)Emulation of SuperSocket)r   N)rN  rO  )rl   r   s     rR   recvzCandumpReader.recv  s@    	###... 	 	 	44	s    
&&c                 4    | j                                         S rr  )r   filenor   s    rR   rv  zCandumpReader.fileno  s     v}}rK   c                     | j         j        S rM   )r   closedr   s    rR   rx  zCandumpReader.closed  s     v}rK   c                 4    | j                                         S ru  )r   closer   s    rR   rz  zCandumpReader.close  s     v||~~rK   c                     | S rM   r   r   s    rR   	__enter__zCandumpReader.__enter__  rE  rK   c                 .    |                                   d S rM   )rz  )rl   exc_type	exc_valuetracbacks       rR   __exit__zCandumpReader.__exit__  s    

rK   c                     d | D             S )rr  c                 J    g | ] }t          |t                    |j        |!S r   )r   r,   rx  )r1  rm   s     rR   
<listcomp>z(CandumpReader.select.<locals>.<listcomp>  s?       ajM&B&B H   rK   r   )socketsremains     rR   selectzCandumpReader.select  s"     7    	rK   rM   )r   )ry   rz   r{   r|   nonblocking_socketr   rD  r   r@  rQ  __next__r.   rN  rj  r:  rs  rv  propertyrx  rz  r|  r  r  r   rK   rR   r,   r,     sI       	 	 ) ) ) )   " " \">   H& 8 8 8 8t	 	 	E E E E(        
   X  
        \  rK   r,   )r   N)Fr|   rm  rH  rc   scapy.configr   scapy.compatr   r   
scapy.datar   scapy.fieldsr   r   r	   r
   r   r   r   r   r   scapy.volatiler   r   scapy.packetr   r   scapy.layers.l2r   scapy.errorr   scapy.plistr   scapy.supersocketr   scapy.utilsr   typingr   r   r   r   r   r   r   r    r!   __all__r/   r.   r0   r1   r3   r4   rk   r"   l2typesregisterr2   r$   r&   r%   r*   r)   r'   r(   r#   r-   r+   r,   r   rK   rR   <module>r     s   
 
			         ' ' ' ' ' ' ' ' ( ( ( ( ( (U U U U U U U U U U U U U U U U U U U U U U 2 2 2 2 2 2 2 2 , , , , , , , , ' ' ' ' ' ' ' ' ' ' ' ' " " " " " " ) ) ) ) ) ) # # # # # #
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   # 


 ',*.0 0e h h h h h& h h hV   ' - - - KB ' ' ' '#= #= #= #= #=C #= #= #=L Kb ) ) ) )k) k) k) k) k), k) k) k)\C C C C CK C C CC C C C C+ C C CC C C C CK 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         6      B* * * * *3 * * *Z+ + + +I I I I I I I I I IrK   