
    h                         d 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	 ddl
mZmZmZ ddlmZ ddlmZ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 ddiej        d<    G d de	          ZeZ dS )z
NativeCANSocket.
    N)conf)SO_TIMESTAMPNS)SuperSocket)Scapy_Exceptionwarninglog_runtime)Packet)CANCAN_MTU
CAN_FD_MTU)raw)ListDictTypeAnyOptionalTuplecastchannelcan0NativeCANSocketc                   B     e Zd ZdZdZddddefdZefdZ fdZ	 xZ
S )r   a9  Initializes a Linux PF_CAN socket object.

    Example:
        >>> socket = NativeCANSocket(channel="vcan0", can_filters=[{'can_id': 0x200, 'can_mask': 0x7FF}])

    :param channel: Network interface name
    :param receive_own_messages: Messages, sent by this socket are will
                                 also be received.
    :param can_filters: A list of can filter dictionaries.
    :param basecls: Packet type in which received data gets interpreted.
    :param kwargs: Various keyword arguments for compatibility with
                   PythonCANSockets
    z@read/write packets at a given CAN interface using PF_CAN socketsNFc                    t          t          t                   |                    dd                     }|r|dk    rt	          d           t
          | _        || _        || _        |t          j
        d         d         n|| _        t          j        t          j        t          j        t          j                  | _        	 | j                            t          j        t          j        t)          j        d|                     n"# t,          $ r}t/          d|          d }~ww xY w	 | j                            t          j        t2          d           d	| _        n&# t6          $ r d
}	t9          j        |	           Y nw xY w| j        r`	 | j                            t          j        t          j        d           t>          | _        n"# t,          $ r}t/          d|          d }~ww xY w|dddg}d                     dtC          |          z            }
g }|D ]8}|"                    |d                    |"                    |d                    9| j                            t          j        t          j#        t)          j        |
g|R             | j        $                    | j        f           | j        | _%        d S )Nbustype	socketcanzYou created a NativeCANSocket. If you're providing the argument 'bustype', please use the correct one to achieve compatibility with python-can/PythonCANSocket. 
'bustype=socketcan'r   r   iz*Could not modify receive own messages (%s)   Tz2Your Linux Kernel does not support Auxiliary Data!z$Could not enable CAN FD support (%s)r   )can_idcan_maskz={}I   r   r   )&r   r   strpopr   r   MTUfdbaseclsr   contribsr   socketPF_CANSOCK_RAWCAN_RAWins
setsockoptSOL_CAN_RAWCAN_RAW_RECV_OWN_MSGSstructpack	Exceptionr   
SOL_SOCKETr   auxdata_availableOSErrorr   infoCAN_RAW_FD_FRAMESr   formatlenappendCAN_RAW_FILTERbindouts)selfr   receive_own_messagescan_filtersr$   r%   kwargsr   	exceptionmsgcan_filter_fmtfilter_data
can_filters                b/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/cansocket_native.py__init__zNativeCANSocket.__init__6   s    x}fjjD&A&ABB 	?w+-- > ? ? ?
 O }%67	BB!( 	=!'!'1 1	H 2 & < &C1E F FH H H H  	 	 	!<i  	
	"H!  
 &*D"" 	" 	" 	" GCS!!!!!		" 7 		##F$6$*$<$%' ' ' &   %:I  
   K
  q3{+;+;';<<% 	7 	7Jz(3444z*56666F."1"KEEEE	G 	G 	G 	t|o&&&H			sC   AD 
D$DD$(2E  E>=E>	<G 
G%G  G%c                     d}d}	 |                      | j        | j                  \  }}}nX# t          $ r t	          d           Y n=t
          j        $ r t	          d           Y nt          $ r t	          d           Y nw xY wt          j	        d         d         sQ|rOdt          |          dz
  z  }d	t          |          dz
  z  }t          j        |gt          j        ||          R  }|r|d
dlm}  || j                  }| j        ||fS )z0Returns a tuple containing (cls, pkt_data, time)Nz.Captured no data, socket in non-blocking mode.z(Captured no data, socket read timed out.zCaptured no data.r
   
swap-bytes<I%ds   >I%dsr   )get_last_packet_timestamp)	_recv_rawr+   r#   BlockingIOErrorr   r'   timeoutr4   r   r&   r8   r/   r0   unpackscapy.arch.linuxrM   r%   )r=   xpktts_pack_fmt
unpack_fmtrM   s           rF   recv_rawzNativeCANSocket.recv_raw   sa    	)$(;;JCBB 	F 	F 	FDEEEEE~ 	@ 	@ 	@>????? 	) 	) 	)'(((((	) }U#L1 	Ic 	I#c((Q,/H CHHqL1J+hHz3)G)GHHHC 	52:BBBBBB**4844B|S"$$s   $+ B B %B ?B c                    |dS 	 t          j                     |_        n# t          $ r Y nw xY wt          |          }t          j        d         d         sOdt          |          dz
  z  }dt          |          dz
  z  }t          j        |gt          j	        ||          R  }|d| j
        t          |          z
  z  z   }t          t          |                               |          S )Nr   r
   rI   rJ   rK   rL       )time	sent_timeAttributeErrorr   r   r&   r8   r/   r0   rQ   r#   superr   send)r=   rS   bsrW   rX   	__class__s        rF   r`   zNativeCANSocket.send   s    91	)++AKK 	 	 	D	
 VV}U#L1 	G#b''A+.H CGGaK0JXFj"(E(EFFFB'TXB/00_d++00444s     
--)__name__
__module____qualname____doc__descr
   rG   r   rY   r`   __classcell__)rb   s   @rF   r   r   &   s          ND &+!K K K KZ ! % % % %85 5 5 5 5 5 5 5 5    )!rf   r/   r'   r\   scapy.configr   
scapy.datar   scapy.supersocketr   scapy.errorr   r   r   scapy.packetr	   scapy.layers.canr
   r   r   scapy.compatr   typingr   r   r   r   r   r   r   r&   r   	CANSocket ri   rF   <module>rt      sn             % % % % % % ) ) ) ) ) ) = = = = = = = = = =       5 5 5 5 5 5 5 5 5 5                        %.v#6  M5 M5 M5 M5 M5k M5 M5 M5` 			ri   