a
    kÄ#d?.  ã                   @   s  d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	 ddl
mZmZmZ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ZmZ G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"G dd „ d eƒZ#G d!d"„ d"eƒZ$G d#d$„ d$eƒZ%G d%d&„ d&eƒZ&G d'd(„ d(eƒZ'G d)d*„ d*eƒZ(G d+d,„ d,eƒZ)G d-d.„ d.eƒZ*G d/d0„ d0eƒZ+e	ee+d1d2� e	ee+d1d3� e	eed1d2� e	eed1d3� eee+d1d1d4� eee+d1d1d4� dS )5z•
Label Distribution Protocol (LDP)

http://git.savannah.gnu.org/cgit/ldpscapy.git/snapshot/ldpscapy-5285b81d6e628043df2a83301b292f24a95f0ba1.tar.gz

é    )Úabsolute_importN)Úorb)ÚPacketÚbind_layersÚbind_bottom_up)ÚBitFieldÚIPFieldÚIntFieldÚ
ShortFieldÚStrFieldÚ	XBitField)ÚUDP)ÚTCP)Úconf)Ú	inet_atonÚ	inet_ntoac                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_LDP_Packetc                 C   s~   t ttttttttt	t
dœ}t d|dd… ¡d }|d@ }|dkrdt d|dd… ¡d dkrdtS ||v rt|| S tjS d S )	N)é   é   é   é  é   é  é   é  é  é  é  ú!Hr   é   iÿ  r   é   é   )ÚLDPNotificationÚLDPHelloÚLDPInitÚLDPKeepAliveÚ
LDPAddressÚLDPAddressWMÚ
LDPLabelMMÚLDPLabelReqMÚLDPLabelARMÚ
LDPLabelWMÚLDPLabelRelMÚstructÚunpackÚLDPr   Z	raw_layer)ÚselfÚpZLDPTypesÚtype© r3   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/ldp.pyÚguess_payload_class   s&    õ$z_LDP_Packet.guess_payload_classc                 C   sB   | j d u r:t |ƒd }|d d… t d|¡ |dd …  }|| S )Nr    r   r   ©Úlenr-   Úpack©r0   r1   ZpayÚtmp_lenr3   r3   r4   Ú
post_build6   s    
$z_LDP_Packet.post_buildN)Ú__name__Ú
__module__Ú__qualname__r5   r;   r3   r3   r3   r4   r      s   r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚFecTLVFieldr   c                 C   sŒ   d}|dd … }g }|rˆt |d ƒ}|d }|d r<|d7 }t|dd| … dd|   ƒ}| ||f¡ |d| 7 }|d| d … }q|S )Nr   r    é   é   r   ó    )r   r   Úappend)r0   ÚpktÚxÚusedÚlistÚmaskZ	nbroctetsÚaddr3   r3   r4   Úm2iD   s     zFecTLVField.m2ic                 C   s|   |sdS t |tƒr|S d}d}d}|D ]8}|d7 }|t d|d ¡7 }|t|d ƒ7 }|d7 }q&|t d|¡7 }||7 }|S )	Nó    s    r   s    ú!Br   rA   r   ©Ú
isinstanceÚbytesr-   r8   r   )r0   rD   rE   Úsr:   ÚfecÚor3   r3   r4   Úi2mX   s    

zFecTLVField.i2mc                 C   s    dt  d|dd… ¡d  }|S ©zGet the size of this fieldr    r   r   r   ©r-   r.   ©r0   rP   r:   r3   r3   r4   Úsizek   s    zFecTLVField.sizec                 C   s*   |   |¡}||d … |  ||d |… ¡fS ©N©rW   rJ   ©r0   rD   rP   r:   r3   r3   r4   Úgetfieldp   s    
zFecTLVField.getfieldN©r<   r=   r>   ÚislistrJ   rS   rW   r[   r3   r3   r3   r4   r?   A   s
   r?   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚLabelTLVFieldc                 C   s   t  d|dd… ¡d S )Nú!Ir    rA   r   rU   )r0   rD   rE   r3   r3   r4   rJ   x   s    zLabelTLVField.m2ic                 C   s&   t |tƒr|S d}|t d|¡7 }|S )Ns     r_   ©rN   rO   r-   r8   )r0   rD   rE   rP   r3   r3   r4   rS   {   s
    
zLabelTLVField.i2mc                 C   s    dt  d|dd… ¡d  }|S rT   rU   rV   r3   r3   r4   rW   ‚   s    zLabelTLVField.sizec                 C   s*   |   |¡}||d … |  ||d |… ¡fS rX   rY   rZ   r3   r3   r4   r[   ‡   s    
zLabelTLVField.getfieldN)r<   r=   r>   rJ   rS   rW   r[   r3   r3   r3   r4   r^   w   s   r^   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚAddressTLVFieldr   c                 C   sn   t  d|dd… ¡d d }|d }|dd … }g }td|ƒD ]*}|d| d| d … }| t|ƒ¡ q>|S )Nr   r   r    r   é   )r-   r.   ÚrangerC   r   )r0   rD   rE   ZnbrrG   ÚirI   r3   r3   r4   rJ   ‘   s    zAddressTLVField.m2ic                 C   sT   |sdS t |tƒr|S dt|ƒd  }dt d|¡ d }|D ]}|t|ƒ7 }q>|S )NrK   r   r    s   r   s    )rN   rO   r7   r-   r8   r   )r0   rD   rE   r:   rP   rR   r3   r3   r4   rS   ›   s    
zAddressTLVField.i2mc                 C   s    dt  d|dd… ¡d  }|S rT   rU   rV   r3   r3   r4   rW   ¦   s    zAddressTLVField.sizec                 C   s*   |   |¡}||d … |  ||d |… ¡fS rX   rY   rZ   r3   r3   r4   r[   «   s    
zAddressTLVField.getfieldNr\   r3   r3   r3   r4   ra   Ž   s
   
ra   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚStatusTLVFieldr   c                 C   sŽ   g }t  d|dd… ¡d }| |d@ d? ¡ | |d@ d? ¡ | |d	@ ¡ | t  d|dd
… ¡d ¡ | t  d|d
d… ¡d ¡ |S )Nr_   r    rA   r   ì        é   é   @é   iÿÿÿ?é   r   é   )r-   r.   rC   )r0   rD   rE   ÚlstÚ
statuscoder3   r3   r4   rJ   µ   s    zStatusTLVField.m2ic                 C   s¾   t |tƒr|S dt dd¡ }d}|d dkr6|d7 }|d dkrJ|d7 }||d 7 }|t d	|¡7 }t|ƒd
krˆ|t d	|d
 ¡7 }n|d7 }t|ƒdkr²|t d|d ¡7 }n|d7 }|S )Ns    r   é
   r   rf   r   rh   r   r_   r@   s       r    s     )rN   rO   r-   r8   r7   )r0   rD   rE   rP   rm   r3   r3   r4   rS   ¿   s"    
zStatusTLVField.i2mc                 C   s$   d}||d … |   ||d |… ¡fS )Nrk   ©rJ   rZ   r3   r3   r4   r[   Ô   s    zStatusTLVField.getfieldN©r<   r=   r>   r]   rJ   rS   r[   r3   r3   r3   r4   re   ²   s   
re   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚCommonHelloTLVFieldr   c                 C   sb   g }t  d|dd… ¡d }| |¡ t|d ƒ}|d@ d? }| |¡ |d@ d? }| |¡ |S )Nr   r    rb   r   é€   é   é@   )r-   r.   rC   r   )r0   rD   rE   rG   ÚvÚflagsr3   r3   r4   rJ   Ý   s    


zCommonHelloTLVField.m2ic                 C   sn   t |tƒr|S d}|t d|d ¡7 }d}|d dkr>|d7 }|d dkrR|d7 }|t d|¡7 }|d	7 }|S )
Ns     r   r   r   rr   r   rt   rL   rB   r`   )r0   rD   rE   rP   Úbyter3   r3   r4   rS   è   s    
zCommonHelloTLVField.i2mc                 C   s$   d}||d … |   ||d |… ¡fS )NrA   ro   rZ   r3   r3   r4   r[   ö   s    zCommonHelloTLVField.getfieldNrp   r3   r3   r3   r4   rq   Ú   s   rq   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚCommonSessionTLVFieldr   c                 C   sÊ   t  d|dd… ¡d g}t  d|dd… ¡d }| |d@ d? ¡ | |d	@ d? ¡ | t  d|dd
… ¡d ¡ | t  d|d
d… ¡d ¡ | t|dd… ƒ¡ | t  d|dd… ¡d ¡ |S )Nr   rb   rA   r   ÚBé	   rr   rs   rt   rn   rj   é   é   )r-   r.   rC   r   )r0   rD   rE   rl   Úoctetr3   r3   r4   rJ   ÿ   s    zCommonSessionTLVField.m2ic                 C   s²   t |tƒr|S d}|t d|d ¡7 }d}|d dkr>|d7 }|d dkrR|d7 }|t d|¡7 }|t d|d	 ¡7 }|t d|d
 ¡7 }|t|d ƒ7 }|t d|d ¡7 }|S )Ns      r   r   r   rr   r   rt   rL   r@   r    é   rb   rM   )r0   rD   rE   rP   r}   r3   r3   r4   rS   
  s    
zCommonSessionTLVField.i2mc                 C   s$   d}||d … |   ||d |… ¡fS )Nr|   ro   rZ   r3   r3   r4   r[     s    zCommonSessionTLVField.getfieldNrp   r3   r3   r3   r4   rx   ü   s   rx   c                   @   s@   e Zd Zd Zedddƒedddƒeddƒeddƒed	d
ƒgZdS )r"   Úur   r   r2   é   r7   NÚidÚstatus)r   r   r   r   r   )	r<   r=   r>   Únamer   r
   r	   re   Úfields_descr3   r3   r3   r4   r"   #  s   

ür"   c                   @   sD   e Zd Zd Zedddƒedddƒeddƒed	dƒed
g d¢ƒgZdS )r#   r   r   r   r2   r   r€   r7   Nr�   Úparams)é´   r   r   )	r<   r=   r>   rƒ   r   r
   r	   rq   r„   r3   r3   r3   r4   r#   .  s   

ür#   c                   @   s@   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒgZ	dS )r$   r   r   r   r2   r   r€   r7   Nr�   r…   )
r<   r=   r>   rƒ   r   r   r
   r	   rx   r„   r3   r3   r3   r4   r$   9  s   

ür$   c                   @   s8   e Zd Zd Zedddƒedddƒeddƒed	dƒgZdS )
r%   r   r   r   r2   r   r€   r7   Nr�   )	r<   r=   r>   rƒ   r   r   r
   r	   r„   r3   r3   r3   r4   r%   D  s   

ýr%   c                   @   s@   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒgZ	dS )r&   r   r   r   r2   r   r€   r7   Nr�   Úaddress©
r<   r=   r>   rƒ   r   r   r
   r	   ra   r„   r3   r3   r3   r4   r&   N  s   

ür&   c                   @   s@   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒgZ	dS )r'   r   r   r   r2   r   r€   r7   Nr�   r‡   rˆ   r3   r3   r3   r4   r'   Y  s   

ür'   c                   @   sH   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒe	ddƒgZ
dS )r(   r   r   r   r2   r   r€   r7   Nr�   rQ   Úlabel©r<   r=   r>   rƒ   r   r   r
   r	   r?   r^   r„   r3   r3   r3   r4   r(   d  s   

ûr(   c                   @   s@   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒgZ	dS )r)   r   r   r   r2   r   r€   r7   Nr�   rQ   ©
r<   r=   r>   rƒ   r   r   r
   r	   r?   r„   r3   r3   r3   r4   r)   p  s   

ür)   c                   @   sH   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒeddƒgZ	dS )r*   r   r   r   r2   r   r€   r7   Nr�   rQ   Z	labelRMidr‹   r3   r3   r3   r4   r*   {  s   

ûr*   c                   @   sH   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒe	ddƒgZ
dS )r+   r   r   r   r2   r   r€   r7   Nr�   rQ   r‰   rŠ   r3   r3   r3   r4   r+   ‡  s   

ûr+   c                   @   sH   e Zd Zd Zedddƒedddƒeddƒed	dƒed
dƒe	ddƒgZ
dS )r,   r   r   r   r2   r   r€   r7   Nr�   rQ   r‰   rŠ   r3   r3   r3   r4   r,   “  s   

ûr,   c                   @   s<   e Zd Zd ZeddƒeddƒeddƒeddƒgZd	d
„ ZdS )r/   Úversionr   r7   Nr�   z	127.0.0.1Úspacer   c                 C   sR   |pd}| j d u rJt |ƒt |ƒ d }|d d… t d|¡ |dd …  }|| S )NrK   r    r   r   r6   r9   r3   r3   r4   r;   ¦  s
    
$zLDP.post_build)r<   r=   r>   rƒ   r
   r   r„   r;   r3   r3   r3   r4   r/   Ÿ  s   ýr/   i†  )Úsport)Údport)rŽ   r�   ),Ú__doc__Ú
__future__r   r-   Zscapy.compatr   Zscapy.packetr   r   r   Zscapy.fieldsr   r   r	   r
   r   r   Zscapy.layers.inetr   r   Zscapy.configr   Zscapy.utilsr   r   r   r?   r^   ra   re   rq   rx   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r/   r3   r3   r3   r4   Ú<module>	   sD    $6$("'
