a
    kÄ#dÔ  ã                   @   s`  d dl m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
mZmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d dlm  mZ d d
l m!Z! G dd„ deƒZ"G dd„ deƒZ#dd„ Z$G dd„ de"ƒZ%G dd„ de"ƒZ&e$ej'j(j)_*e$ej'j(j+_*e$ej'j(j,_*e$ej'j-j._*e$ej'j-j/_*ee#e%ddd� ee#e&dd� dS )é    )Úabsolute_importN)Úchb)ÚPacketÚbind_layers)	ÚBitFieldÚ	ByteFieldÚConditionalFieldÚFieldLenFieldÚIPFieldÚIntFieldÚPacketListFieldÚ
ShortFieldÚStrLenField)ÚIPÚICMPÚchecksum)ÚIP6Field)Úwarning)ÚMPLS)Úconfc                   @   s4   e Zd ZdZeddƒeddƒeddƒgZdd„ ZdS )	ÚICMPExtensionObjectzICMP Extension ObjectÚlenNÚclassnumr   Ú	classtypec                 C   s:   | j d u r2t |ƒt |ƒ }t d|¡|dd …  }|| S )Nz!Hé   )r   ÚstructÚpack)ÚselfÚpÚpayZtmp_len© r    úT/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/icmp_extensions.pyÚ
post_build   s    
zICMPExtensionObject.post_build)Ú__name__Ú
__module__Ú__qualname__Únamer   r   Úfields_descr"   r    r    r    r!   r      s   þr   c                   @   sL   e Zd ZdZedddƒedddƒedd	d
ƒgZeeƒ ƒZdd„ Z	dd„ Z
d	S )ÚICMPExtensionHeaderzICMP Extension Header (RFC4884)Úversionr   é   Úreservedr   é   ÚchksumNé   c                 C   sJ   | j d u rBt|ƒ}|d d… t|d? ƒ t|d@ ƒ |dd …  }|| S )Nr   é   éÿ   r*   )r-   r   r   )r   r   r   Zckr    r    r!   r"   .   s    
0zICMPExtensionHeader.post_buildc                    sr   t |ƒ| jk rt | |¡S t|ƒ‰ ˆ j | jk r:t | |¡S | jD ],\}}t‡ fdd„t |¡D ƒƒr@|  S q@tS )Nc                 3   s*   | ]"\}}t ˆ |ƒo |ˆ  |¡kV  qd S ©N)ÚhasattrZgetfieldval)Ú.0ÚkÚv©Zieor    r!   Ú	<genexpr>?   s   ÿz:ICMPExtensionHeader.guess_payload_class.<locals>.<genexpr>)	r   Ú_min_ieo_lenr   Úguess_payload_classr   Zpayload_guessÚallÚsixÚ	iteritems)r   ÚpayloadZfvalÚclsr    r6   r!   r9   4   s    ÿ
z'ICMPExtensionHeader.guess_payload_class)r#   r$   r%   r&   r   r'   r   r   r8   r"   r9   r    r    r    r!   r(   &   s   


þ
r(   c                 C   sò   |  ¡ }t|tjƒsd S t|v r\t|v rV|t jdv rV|jdkrV|t  ¡ dd … }q¶d S nZt	j
jj|v r²t	j
jj|v s†t	j
jj|v r¬|jdkr¬|t	j
jj  ¡ dd … }q¶d S nd S t|ƒ}t| ¡ ƒrÎd S |jd t|ƒ … |_| |¡ d S )N)é   é   r,   é�   éˆ   )Ú	lastlayerÚ
isinstancer   Zpadding_layerr   r   Útyper   ÚbuildÚscapyÚlayersÚinet6ZIPv6ÚICMPv6TimeExceededÚICMPv6DestUnreachÚplenr(   r   ÚloadZadd_payload)r   ÚpktrC   ÚbytesZiehr    r    r!   ÚICMPExtension_post_dissectionE   s2    ÿþÿþrP   c                	   @   s>   e Zd ZdZeddƒeddƒeddƒedg edd	„ d
�gZdS )ÚICMPExtensionMPLSz&ICMP Extension Object - MPLS (RFC4950)r   Nr   é   r   Ústackc                 C   s
   | j d S )Nr*   )r   ©rN   r    r    r!   Ú<lambda>n   ó    zICMPExtensionMPLS.<lambda>©Zlength_from)	r#   r$   r%   r&   r   r   r   r   r'   r    r    r    r!   rQ   g   s   ÿýrQ   c                   @   s  e Zd ZdZeddƒeddƒedddƒedddƒed	dd
ƒeddd
ƒeddd
ƒeddd
ƒeeddƒdd„ ƒeeddƒdd„ ƒeeddƒdd„ ƒee	ddƒdd„ ƒee
ddƒdd„ ƒeeddddd�dd„ ƒeedddd„ d�d d„ ƒeed!dƒd"d„ ƒgZd#d$„ ZdS )%Ú!ICMPExtensionInterfaceInformationz>ICMP Extension Object - Interface Information Object (RFC5837)r   Nr   r   Zinterface_roler   r+   Úhas_ifindexrR   Ú
has_ipaddrÚ
has_ifnameÚhas_mtuÚifindexc                 C   s
   | j dkS ©NrR   )rY   rT   r    r    r!   rU      rV   z*ICMPExtensionInterfaceInformation.<lambda>Úafic                 C   s
   | j dkS r^   ©rZ   rT   r    r    r!   rU   ƒ   rV   Z	reserved2c                 C   s
   | j dkS r^   r`   rT   r    r    r!   rU   †   rV   Úip4c                 C   s
   | j dkS r^   ©r_   rT   r    r    r!   rU   ‰   rV   Úip6c                 C   s
   | j dkS )Nr   rb   rT   r    r    r!   rU   Œ   rV   Ú
ifname_lenÚBÚifname)ÚfmtZ	length_ofc                 C   s
   | j dkS r^   ©r[   rT   r    r    r!   rU   ‘   rV   c                 C   s   | j S r1   )rd   rT   r    r    r!   rU   ”   rV   rW   c                 C   s
   | j dkS r^   rh   rT   r    r    r!   rU   •   rV   Úmtuc                 C   s
   | j dkS r^   )r\   rT   r    r    r!   rU   ™   rV   c                 K   sÀ   | j d u r,| jd urd| _ n| jd ur,d| _ | jrD| jd u rDtdƒ | jr\| j d u r\tdƒ | jr~| jd u r~| jd u r~tdƒ | jr–| jd u r–tdƒ | j	r®| j
d u r®tdƒ tj| fi |¤ŽS )NrR   r   z'has_ifindex set but ifindex is not set.z"has_ipaddr set but afi is not set.z)has_ipaddr set but ip4 or ip6 is not set.z%has_ifname set but ifname is not set.zhas_mtu set but mtu is not set.)r_   ra   rc   rY   r]   r   rZ   r[   rf   r\   ri   r   Ú
self_build)r   Úkwargsr    r    r!   rj   ›   s     


z,ICMPExtensionInterfaceInformation.self_build)r#   r$   r%   r&   r   r   r   r   r   r
   r   r	   r   r'   rj   r    r    r    r!   rX   q   s^   





þþþþþÿýÿýþÝ'rX   rR   )r   r   r   )r   )0Ú
__future__r   r   rG   Zscapy.compatr   Zscapy.packetr   r   Zscapy.fieldsr   r   r   r	   r
   r   r   r   r   Zscapy.layers.inetr   r   r   Zscapy.layers.inet6r   Zscapy.errorr   Zscapy.contrib.mplsr   Zscapy.libs.sixZlibsr;   Zscapy.configr   r   r(   rP   rQ   rX   rH   ZinetZ	ICMPerrorZpost_dissectionZTCPerrorZUDPerrorrI   rK   rJ   r    r    r    r!   Ú<module>   s.   ,"
A