a
    kÄ#d  ã                   @   s¾   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	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mZ d
diejd< G dd„ deƒZeZdS )z
NativeCANSocket.
é    N)Úconf)ÚSuperSocket)ÚScapy_ExceptionÚwarning)ÚPacket)ÚCANÚCAN_MTUÚ
CAN_FD_MTU)Úget_last_packet_timestamp)ÚListÚDictÚTypeÚAnyÚOptionalÚTupleÚrawÚcastÚchannelZcan0ÚNativeCANSocketc                       sD   e Zd ZdZdZddddefdd„Zefdd„Z‡ fd	d
„Z	‡  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              
   K   s¨  t tt | dd ¡ƒ}|r*|dkr*tdƒ t| _|| _|| _|d u rRt	j
d d n|| _t tjtjtj¡| _z | j tjtjt d|¡¡ W n. ty¼ } ztd|ƒ‚W Y d }~n
d }~0 0 | j�rz| j tjtjd¡ t| _W n0 t�y } ztd	|ƒ‚W Y d }~n
d }~0 0 |d u �r,d
d
dœg}d dt|ƒ ¡}	g }
|D ]"}|
 |d ¡ |
 |d ¡ �qF| j tjtjtj|	g|
¢R Ž ¡ | j | jf¡ | j| _d S )NÚbustypeZ	socketcanz´You 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)é   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   ÚCAN_RAW_FD_FRAMESr	   ÚformatÚlenÚappendÚCAN_RAW_FILTERÚbindZouts)Úselfr   Zreceive_own_messagesZcan_filtersr   r   Úkwargsr   Ú	exceptionZcan_filter_fmtZfilter_dataZ
can_filter© r5   úU/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/cansocket_native.pyÚ__init__,   sb    	ÿÿþ

þÿ
þ
ÿ
þ
þzNativeCANSocket.__init__c                 C   sÆ   d}z| j  | j¡}W nL ty0   tdƒ Y n4 tjyJ   tdƒ Y n tyb   tdƒ Y n0 tj	d d s´|dur´dt
|ƒd  }d	t
|ƒd  }tj|gt ||¡¢R Ž }| j|t| 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%ds)r%   Úrecvr   ÚBlockingIOErrorr   r!   ÚtimeoutÚOSErrorr   r    r.   r)   r*   Úunpackr   r
   )r2   ÚxZpktÚpack_fmtÚ
unpack_fmtr5   r5   r6   Úrecv_rawk   s    zNativeCANSocket.recv_rawc                    s˜   zt   ¡ |_W n ty    Y n0 t|ƒ}tjd d srdt|ƒd  }dt|ƒd  }tj|gt 	||¡¢R Ž }|d| j
t|ƒ   }tt| ƒ |¡S )Nr   r8   r9   r:   r;   ó    )ÚtimeZ	sent_timeÚAttributeErrorr   r   r    r.   r)   r*   r@   r   Úsuperr   Úsend)r2   rA   ÚbsrB   rC   ©Ú	__class__r5   r6   rI   �   s    zNativeCANSocket.send)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Údescr   r7   r   rD   rI   Ú__classcell__r5   r5   rK   r6   r      s   û
?)rP   r)   r!   rF   Zscapy.configr   Zscapy.supersocketr   Zscapy.errorr   r   Zscapy.packetr   Zscapy.layers.canr   r   r	   Zscapy.arch.linuxr
   Zscapy.compatr   r   r   r   r   r   r   r   r    r   Z	CANSocketr5   r5   r5   r6   Ú<module>	   s   (y