
    h                      z   d 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 ddlmZmZ ddlmZmZ dd	lmZmZmZ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# ddl$m%Z% dZ&dZ'dZ(dZ)d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/dS )zt
Implementation of TUN/TAP interfaces.

These allow Scapy to act as the remote side of a virtual network interface.
    N)ioctl)rawbytes_encode)conf)
BIG_ENDIANBSDLINUX)ETHER_TYPESMTU)warninglog_runtime)Field
FlagsFieldStrFixedLenFieldXShortEnumField)network_name)IP)IPv46IPv6)Ether)Packet)SimpleSocketiT@      i      c                       e Zd Zd ZdS )NativeShortFieldc                 4    t          j        | ||d           d S )Nz@H)r   __init__)selfnamedefaults      W/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/tuntap.pyr   zNativeShortField.__init__)   s    tT7D11111    N)__name__
__module____qualname__r    r$   r#   r   r   (   s#        2 2 2 2 2r$   r   c                       e Zd ZegZdS )TunPacketInfoN)r%   r&   r'   r   
aliastypesr(   r$   r#   r*   r*   -   s        JJJr$   r*   c                   D    e Zd ZdZ eddd           edd          gZdS )LinuxTunIfReqz
    Structure to request a specific device name for a tun/tap
    Linux  ``struct ifreq``.

    See linux/if.h (struct ifreq) and tuntap.txt for reference.
    	ifrn_namer$   r   
ifru_flagsr   N)r%   r&   r'   __doc__r   r   fields_descr(   r$   r#   r-   r-   1   sC          	c2..q))	KKKr$   r-   c                   z    e Zd ZdZ eddd dgd  edd          D             z              ed	d
e          gZdS )LinuxTunPacketInfozV
    Base for TUN packets.

    See linux/if_tun.h (struct tun_pi) for reference.
    flagsr   c                     t           rdndS )Nr   i)r   )_s    r#   <lambda>zLinuxTunPacketInfo.<lambda>I   s    J7bbC r$   TUN_VNET_HDRc                     g | ]}d |z  S )z
reserved%dr(   ).0xs     r#   
<listcomp>zLinuxTunPacketInfo.<listcomp>K   s    ;;;L1$;;;r$   r   r   typei   N)	r%   r&   r'   r0   r   ranger   r
   r1   r(   r$   r#   r3   r3   @   ss          	
7A77"#;;eeArll;;;<	= 	=
 	44KKKr$   r3   c                   D     e Zd ZdZdZddedf fd	Zd Zd	dZd Z	 xZ
S )
TunTapInterfacea
  
    A socket to act as the host's peer of a tun / tap interface.

    This implements kernel interfaces for tun and tap devices.

    :param iface: The name of the interface to use, eg: 'tun0'
    :param mode_tun: If True, create as TUN interface (layer 3).
                     If False, creates a TAP interface (layer 2).
                     If not supplied, attempts to detect from the ``iface``
                     name.
    :type mode_tun: bool
    :param strip_packet_info: If True (default), strips any TunPacketInfo from
                              the packet. If False, leaves it in tact. Some
                              operating systems and tunnel types don't include
                              this sort of data.
    :type strip_packet_info: bool

    FreeBSD references:

    * tap(4): https://www.freebsd.org/cgi/man.cgi?query=tap&sektion=4
    * tun(4): https://www.freebsd.org/cgi/man.cgi?query=tun&sektion=4

    Linux references:

    * https://www.kernel.org/doc/Documentation/networking/tuntap.txt

    z/Act as the host's peer of a tun / tap interfaceNTc                    t          |t          t          j                  n|          | _        || _        | j        \| j                            d          rd| _        n:| j                            d          rd| _        nt          d| j        d          t          |          | _        d| _	        | j        rt          nt          | _        t          rd}| j        rt          | _        d	| _	        nt          d
           d| _        t!          | j                  t"          k    r1t          dt"          fz             | j        d t"                   | _        nt$          rk| j                            d          s)| j                            d          st          d          d| j        z   }| j        st          d           d| _        nt'          d          t)          |dd          }t          rW| j        rt*          }	nt,          t.          z  }	t1          t3          | j        |	                    }
t5          |t6          |
           d| _        || _        t=          t>          |                                |           d S )Ns   tunTs   tapFz'Could not determine interface type for z; set `mode_tun` explicitly.r   s   /dev/net/tun   z0tap devices on Linux do not include packet info!z:Linux interface names are limited to %d bytes, truncating!z@Interface names must start with `tun` or `tap` on BSD and Darwins   /dev/z<tun/tap devices on BSD and Darwin never include packet info!z2TunTapInterface is not supported on this platform!zr+b)	buffering)r.   r/   )!r   r   r   ifacemode_tun
startswith
ValueErrorboolstrip_packet_infomtu_overheadr   r   kernel_packet_classr	   r3   r   lenLINUX_IFNAMSIZr   NotImplementedErroropenLINUX_IFF_TUNLINUX_IFF_TAPLINUX_IFF_NO_PIr   r-   r   LINUX_TUNSETIFFcloseddefault_read_sizesuperr@   r   )r    rD   rE   rU   rI   argskwargsdevnamesockr4   tsetiff	__class__s              r#   r   zTunTapInterface.__init__o   s   !(-L$$$5
 

 != z$$V,, > $&&v.. > % j04


=> > > "&&7!8!8
  -1M#D55u  	8%G } .+=($%!!JKKK)-&4:// &)7(9: ; ; ;!Z8
 	8J))&11 <J))&11<  "; < < <+G) . ' ( ( ()-&% '7 8 8 8 GUa000 	2} 8% &7-* " " " # #G $111!2ot$$--d33333r$   c                     | S )z}Needed when using an instantiated TunTapInterface object for
        conf.L2listen, conf.L2socket or conf.L3socket.

        r(   )r    argkargs      r#   __call__zTunTapInterface.__call__   s	    
 r$   c                 d   || j         }|| j        z  }| j                            |          }| j        |t          j                    f}| j        dk    r\| j        rU |d         |d         d | j                                               d          }||d         | j        d          |d         fS |S )Nr   r   r$   r   )rU   rJ   insreadrK   timerI   guess_payload_class)r    r;   datrclss        r#   recv_rawzTunTapInterface.recv_raw   s    9&A	ThmmA$c49;;6q  T%;  !A$qt.T../00DDSIIC !T.//0!A$66Hr$   c                    t          |d          rt          j                    |_        | j        t          k    r.t          |t          t          f          st                      |z  }n,t          || j                  s|                                 |z  }t          |          }	 | j	        
                    |          }| j	                                         |S # t          j        $ r% t          j        d| j        j        d           Y d S w xY w)N	sent_timez%s sendT)exc_info)hasattrrd   rk   rK   r   
isinstancer   r   r   outswriteflushsocketerrorr   r\   r%   )r    r;   sxrg   s       r#   sendzTunTapInterface.send   s   1k"" 	&)++AK#u,, a"d,, DD1HAt788 	/((**Q.AVV	F	##AIOOH| 	F 	F 	Fi"n5F F F F F F F	Fs   #4C 0DD)N)r%   r&   r'   r0   descr   r   r`   ri   ru   __classcell__)r\   s   @r#   r@   r@   Q   s         6 =D!DC#'T4 T4 T4 T4 T4 T4l     $F F F F F F Fr$   r@   )0r0   rr   rd   fcntlr   scapy.compatr   r   scapy.configr   scapy.constsr   r   r	   
scapy.datar
   r   scapy.errorr   r   scapy.fieldsr   r   r   r   scapy.interfacesr   scapy.layers.inetr   scapy.layers.inet6r   r   scapy.layers.l2r   scapy.packetr   scapy.supersocketr   rS   rP   rQ   rR   rM   r   r*   r-   r3   r@   r(   r$   r#   <module>r      sN            * * * * * * * *       / / / / / / / / / / ' ' ' ' ' ' ' ' , , , , , , , , M M M M M M M M M M M M ) ) ) ) ) )             * * * * * * * * ! ! ! ! ! !       * * * * * * 2 2 2 2 2u 2 2 2
    F       F          "bF bF bF bF bFl bF bF bF bF bFr$   