a
    kÄ#dœB  ã                   @   s¶  d dl Z d dlmZ d dlZd dlZd dlmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlm  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 d dlmZ d dlm Z m!Z!m"Z"m#Z# e j$ %edƒ¡Z&dZ'dZ(e(e' Z)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8d Z9d Z:dZ;d Z<d Z=d Z>d Z?e Z@e!ZAe"ZBe#ZCd ZDG dd„ de jEƒZFG dd „ d e jƒZGG d!d"„ d"e jEƒZHG d#d$„ d$e jEƒZIG d%d&„ d&eƒZJdS )'é    N)Úfind_library)ÚOptionalÚUnionÚTupleÚTypeÚcast)Ú	log_isotp)ÚPacket)ÚScapy_Exception)ÚSuperSocket)ÚSO_TIMESTAMPNS)Úconf)Úget_last_packet_timestampÚSIOCGIFINDEX)ÚISOTP)ÚCAN_MTUÚ
CAN_FD_MTUÚCAN_MAX_DLENÚCAN_FD_MAX_DLENÚcé   éd   é   é   é   é   é   é   é   é    é@   é€   é   i   éÌ   c                   @   s    e Zd ZdejfdejfgZdS )ÚtpÚrx_idÚtx_idN)Ú__name__Ú
__module__Ú__qualname__ÚctypesÚc_uint32Ú_fields_© r-   r-   ú^/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/isotp/isotp_native_socket.pyr$   C   s   ÿr$   c                   @   s   e Zd ZdefgZdS )Ú	addr_infor$   N)r'   r(   r)   r$   r,   r-   r-   r-   r.   r/   I   s   r/   c                   @   s&   e Zd ZdejfdejfdefgZdS )Úsockaddr_canZ
can_familyZcan_ifindexZcan_addrN)r'   r(   r)   r*   Úc_uint16Úc_intr/   r,   r-   r-   r-   r.   r0   O   s   þr0   c                   @   s$   e Zd Zdejd fdejfgZdS )ÚifreqÚifr_namer   Úifr_ifindexN)r'   r(   r)   r*   Zc_charr2   r,   r-   r-   r-   r.   r3   V   s   ÿr3   c                   @   s®   e Zd ZdZdZdZdZdZdZdZ	e
eeeeefdd„Zeeefd	d
„Zeeefdd„Zdd„ Zdd„ Zddd„Zdddddeeddedefdd„Zddd„Zd dd„ZdS )!ÚISOTPNativeSocketaÌ  
    ISOTPSocket using the can-isotp kernel module

    :param iface: a CANSocket instance or an interface name
    :param tx_id: the CAN identifier of the sent CAN frames
    :param rx_id: the CAN identifier of the received CAN frames
    :param ext_address: the extended address of the sent ISOTP frames
    :param rx_ext_address: the extended address of the received ISOTP frames
    :param bs: block size sent in Flow Control ISOTP frames
    :param stmin: minimum desired separation time sent in
                  Flow Control ISOTP frames
    :param padding: If True, pads sending packets with 0x00 which not
                    count to the payload.
                    Does not affect receiving packets.
    :param listen_only: Does not send Flow Control frames if a First Frame is
                        received
    :param frame_txtime: Separation time between two CAN frames during send
    :param basecls: base class of the packets emitted by this socket
    zCread/write packets at a given CAN interface using CAN_ISOTP socket z@2I4Bz@3Bz@H3ITc              	   C   s   t  | j||||||¡S ©N)ÚstructÚpackÚcan_isotp_options_fmt)ÚselfÚflagsÚframe_txtimeÚext_addressZtxpad_contentZrxpad_contentÚrx_ext_addressr-   r-   r.   Z__build_can_isotp_optionsx   s    	úz+ISOTPNativeSocket.__build_can_isotp_optionsc                 C   s   t  | j|||¡S r7   )r8   r9   Úcan_isotp_fc_options_fmt)r;   ÚbsÚstminZwftmaxr-   r-   r.   Z__build_can_isotp_fc_optionsž   s
    ýz.ISOTPNativeSocket.__build_can_isotp_fc_optionsc                 C   s   t  | j|||¡S r7   )r8   r9   Úcan_isotp_ll_options_fmt)r;   ÚmtuÚtx_dlZtx_flagsr-   r-   r.   Z__build_can_isotp_ll_options¹   s
    ýz.ISOTPNativeSocket.__build_can_isotp_ll_optionsc                 C   sR   t  | ¡ ¡}tƒ }| d¡|_t |tt  	|¡¡}|dk rNd 
|¡}t|ƒ‚|S )NÚasciir   z+Failure while getting "{}" interface index.)r*   r2   Úfilenor3   Úencoder4   ÚLIBCÚioctlr   ÚbyrefÚformatr
   )r;   ÚsockÚifaceÚ	socket_idÚifrÚretÚmr-   r-   r.   Z__get_sock_ifreq×   s    ÿz"ISOTPNativeSocket.__get_sock_ifreqc           	   	   C   sš   t  | ¡ ¡}|  ||¡}|dkr,|tjB }|dkr>|tjB }tt  tj¡|j	t
tt  |¡t  |¡ƒƒƒ}t |t  |¡t  |¡¡}|dk r–t d¡ d S )Niÿ  r   zCouldn't bind socket)r*   r2   rG   Ú"_ISOTPNativeSocket__get_sock_ifreqÚsocketÚCAN_EFF_FLAGr0   r1   ÚPF_CANr5   r/   r$   r+   rI   ÚbindrK   Zsizeofr   Úwarning)	r;   rM   rN   r&   r%   rO   rP   ÚaddrÚerrorr-   r-   r.   Z__bind_socketä   s"    

ÿþÿzISOTPNativeSocket.__bind_socketNFr   c              
   C   sl   t }|d ur|tB }nt}|d ur,|tB }nt}|r<|tB }|rL|tB tB }| tt	| j
||||d�¡ d S )N)r=   r<   r>   r?   )ÚCAN_ISOTP_DEFAULT_FLAGSÚCAN_ISOTP_EXTEND_ADDRÚCAN_ISOTP_DEFAULT_EXT_ADDRESSÚCAN_ISOTP_RX_EXT_ADDRÚCAN_ISOTP_LISTEN_MODEÚCAN_ISOTP_TX_PADDINGÚCAN_ISOTP_RX_PADDINGÚ
setsockoptÚSOL_CAN_ISOTPÚCAN_ISOTP_OPTSÚ+_ISOTPNativeSocket__build_can_isotp_options)r;   rM   Zextended_addrZextended_rx_addrÚlisten_onlyÚpaddingZtransmit_timeZoption_flagsr-   r-   r.   Z__set_option_flagsú   s(    	

üþz$ISOTPNativeSocket.__set_option_flagsr   c                 C   sL  t |tjƒsXtt|ƒ}t|dƒrPt|jdƒrP|j ¡ }t |tƒrXtt	|d ƒ}nt
dƒ‚tt	|ƒpntjd d | _t tjtjt¡| _|  | j|||	||
¡ || _|| _|| _|| _| j tt| j||d�¡ | j tt| j|rätnt|rît nt!d�¡ | j tj"t#d	¡ |  $| j| j||¡ | j| _| j| _%|d u �rBt& 'd
¡ || _(d S )NÚinsÚgetsocknamer   z9Provide a string or a CANSocket object as iface parameterZNativeCANSocketrN   )rB   rA   )rD   rE   r   zProvide a basecls ))Ú
isinstanceÚsixÚstring_typesr   r   Úhasattrrh   ri   ÚtupleÚstrr
   r   ZcontribsrN   rT   rV   Ú
SOCK_DGRAMÚ	CAN_ISOTPZ
can_socketÚ$_ISOTPNativeSocket__set_option_flagsr&   r%   r>   r?   rb   rc   ÚCAN_ISOTP_RECV_FCÚ._ISOTPNativeSocket__build_can_isotp_fc_optionsÚCAN_ISOTP_LL_OPTSÚ._ISOTPNativeSocket__build_can_isotp_ll_optionsÚCAN_ISOTP_CANFD_MTUÚCAN_ISOTP_DEFAULT_LL_MTUÚCAN_FD_ISOTP_DEFAULT_LL_TX_DLÚCAN_ISOTP_DEFAULT_LL_TX_DLÚ
SOL_SOCKETr   Ú_ISOTPNativeSocket__bind_socketZoutsr   rX   Úbasecls)r;   rN   r&   r%   r>   r?   rA   rB   rg   rf   r=   Úfdr}   r-   r-   r.   Ú__init__  s`    


ÿûÿþüþý

zISOTPNativeSocket.__init__éÿÿ  c              
   C   sÚ   z|   | j|¡\}}}W n¢ ty6   t d¡ Y dS  tjyT   t d¡ Y dS  tyº } zPt d| ¡ |jdkr†t d¡ n|jdkrœt d¡ n|  	¡  W Y d}~dS d}~0 0 |du rÎt
| jƒ}| j||fS )	zb
        Receives a packet, then returns a tuple containing
        (cls, pkt_data, time)
        z.Captured no data, socket in non-blocking mode.)NNNz(Captured no data, socket read timed out.zCaptured no data. %séT   zRMaybe a consecutive frame was missed. Increasing `stmin` could solve this problem.én   N)Z	_recv_rawrh   ÚBlockingIOErrorr   rX   rT   ÚtimeoutÚOSErrorÚerrnoÚcloser   r}   )r;   ÚxZpktÚ_ÚtsÚer-   r-   r.   Úrecv_rawa  s&    




zISOTPNativeSocket.recv_rawc                 C   sd   t  | |¡}|d u r|S t|dƒr*| j|_t|dƒr<| j|_t|dƒrN| j|_t|dƒr`| j|_|S )Nr&   r%   r>   r?   )r   Úrecvrm   r&   r%   r>   r?   )r;   rˆ   Úmsgr-   r-   r.   r�     s    



zISOTPNativeSocket.recv)NNFFr   )r€   )r€   )r'   r(   r)   Ú__doc__Údescr:   r@   rC   Zsockaddr_can_fmtZauxdata_availabler[   ÚCAN_ISOTP_DEFAULT_FRAME_TXTIMEr]   ÚCAN_ISOTP_DEFAULT_PAD_CONTENTre   ÚCAN_ISOTP_DEFAULT_RECV_BSÚCAN_ISOTP_DEFAULT_RECV_STMINÚCAN_ISOTP_DEFAULT_RECV_WFTMAXrt   rx   rz   ÚCAN_ISOTP_DEFAULT_LL_TX_FLAGSrv   rS   r|   rr   r   r   rŒ   r�   r-   r-   r-   r.   r6   ]   sZ   ù
'ý
ý
     ú
#ô
E
r6   )Kr*   Zctypes.utilr   r8   rT   Zscapy.compatr   r   r   r   r   Zscapy.contrib.isotpr   Zscapy.packetr	   Zscapy.libs.sixZlibsrk   Zscapy.errorr
   Zscapy.supersocketr   Z
scapy.datar   Zscapy.configr   Zscapy.arch.linuxr   r   Z scapy.contrib.isotp.isotp_packetr   Zscapy.layers.canr   r   r   r   ZcdllZLoadLibraryrI   rq   ÚSOL_CAN_BASErc   rd   rs   ZCAN_ISOTP_TX_STMINZCAN_ISOTP_RX_STMINru   r_   r\   r`   ra   ZCAN_ISOTP_CHK_PAD_LENZCAN_ISOTP_CHK_PAD_DATAZCAN_ISOTP_HALF_DUPLEXZCAN_ISOTP_FORCE_TXSTMINZCAN_ISOTP_FORCE_RXSTMINr^   r[   r]   r’   r‘   r“   r”   r•   rx   rw   rz   ry   r–   Z	Structurer$   r/   r0   r3   r6   r-   r-   r-   r.   Ú<module>	   sd   