a
    kÄ#dƒ  ã                
   @   s  d Z ddl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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 dd	lmZ d
dddddddddœ	ZG dd„ deƒZdd„ 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#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*e$e&e'e(e*e d0œZ+G d1d2„ d2eƒZ,G d3d4„ d4e,ƒZ-G d5d6„ d6e,ƒZ.G d7d8„ d8eƒZ/G d9d:„ d:eƒZ0eeed;d<� eee#dd=� eee0d>d=� dS )?z~
References:
  - https://tools.ietf.org/html/rfc4601
  - https://www.iana.org/assignments/pim-parameters/pim-parameters.xhtml
é    N)ÚPacketÚbind_layers)ÚBitFieldLenFieldÚBitFieldÚBitEnumFieldÚ	ByteFieldÚ
ShortFieldÚXShortFieldÚIPFieldÚPacketListFieldÚIntFieldÚFieldLenFieldÚBoundStrLenFieldÚ
FlagsField)ÚIP)Úchecksum)Úorb)Úconf)ÚRandIntZHelloZRegisterzRegister-Stopz
Join/PruneZ	BootstrapÚAssertZGraftz	Graft-AckzCandidate-RP-Advertisement)	r   é   é   é   é   é   é   é   é   c                   @   sB   e Zd ZdZedddƒedddeƒeddƒedd	ƒgZ	d
d„ Z
d	S )ÚPIMv2Hdrz/Protocol Independent Multicast Version 2 HeaderÚversionr   r   Útyper   ÚreservedÚchksumNc                 C   sB   ||7 }| j du r>t|ƒ}|dd… t d|¡ |dd…  }|S )a7  
        Called implicitly before a packet is sent to compute and
         place PIM checksum.

        Parameters:
          self    The instantiation of an PIMv2Hdr class
          p       The PIMv2Hdr message in hex in network byte order
          pay     Additional payload for the PIMv2Hdr message
        Nr   ú!Hr   )r"   r   ÚstructÚpack)ÚselfÚpZpayZck© r(   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/pim.pyÚ
post_build,   s
    

$zPIMv2Hdr.post_build)Ú__name__Ú
__module__Ú__qualname__Únamer   r   ÚPIM_TYPEr   r	   Úfields_descr*   r(   r(   r(   r)   r   %   s   
ýr   c                 K   s:   t j}t|ƒdkr*t|d ƒ}|  ||¡}||fi |¤ŽS )Nr   r   )r   Z	raw_layerÚlenr   Úget)Z	h_classesZdefault_keyÚpktÚkargsÚclsZtlvtyper(   r(   r)   Ú_guess_pim_tlv_class=   s
    r6   c                   @   sF   e Zd Zeddƒeddddd�eddd	d
„ d�gZdd„ Zdd„ ZdS )Ú_PIMGenericTlvBaser    r   ÚlengthNÚvalueÚB©Z	length_ofÚfmtÚ c                 C   s   | j S ©N©r8   ©r3   r(   r(   r)   Ú<lambda>I   ó    z_PIMGenericTlvBase.<lambda>©Zlength_fromc                 C   s   t jS r>   )r   Zpadding_layer)r&   r'   r(   r(   r)   Úguess_payload_classK   s    z&_PIMGenericTlvBase.guess_payload_classc                 C   s   d|fS )Nr=   r(   )r&   Úsr(   r(   r)   Úextract_paddingN   s    z"_PIMGenericTlvBase.extract_padding)	r+   r,   r-   r   r   r   r0   rD   rF   r(   r(   r(   r)   r7   E   s   ÿþr7   c                   @   s   e Zd ZdZdS )Ú_PIMv2GenericHellozPIMv2 Generic HelloN©r+   r,   r-   r.   r(   r(   r(   r)   rG   U   s   rG   c                 K   s   t td | fi |¤ŽS r>   )r6   ÚPIMv2_HELLO_CLASSES)r'   r4   r(   r(   r)   Ú_guess_pimv2_hello_classY   s    rJ   c                   @   s   e Zd Zdd„ ZdS )Ú_PIMv2HelloListFieldc                 C   s   t  | dg t¡ d S )NÚoption)r   Ú__init__rJ   )r&   r(   r(   r)   rM   ^   s    z_PIMv2HelloListField.__init__N)r+   r,   r-   rM   r(   r(   r(   r)   rK   ]   s   rK   c                   @   s   e Zd ZdZeƒ gZdS )Ú
PIMv2HellozPIMv2 Hello OptionsN)r+   r,   r-   r.   rK   r0   r(   r(   r(   r)   rN   b   s   ÿrN   c                   @   s2   e Zd ZdZeddƒeddddd�edd	ƒgZdS )
ÚPIMv2HelloHoldtimezPIMv2 Hello Options : Holdtimer    r   r8   NÚholdtimer#   r;   éi   )r+   r,   r-   r.   r   r   r0   r(   r(   r(   r)   rO   i   s
   ýrO   c                   @   s6   e Zd ZdZedddddgƒedddƒedd	ƒgZd
S )ÚPIMv2HelloLANPruneDelayValuez+PIMv2 Hello Options : LAN Prune Delay ValueÚtr   r   Zpropagation_delayiô  é   Zoverride_intervaliÄ	  N)r+   r,   r-   r.   r   r   r   r0   r(   r(   r(   r)   rR   r   s
   
ýrR   c                   @   s>   e Zd ZdZeddƒeddddd�edeƒ ed	d
„ d�gZdS )ÚPIMv2HelloLANPruneDelayz%PIMv2 Hello Options : LAN Prune Delayr    r   r8   Nr9   r#   r;   c                 C   s   | j S r>   r?   r@   r(   r(   r)   rA   ‚   rB   z PIMv2HelloLANPruneDelay.<lambda>rC   )	r+   r,   r-   r.   r   r   r   rR   r0   r(   r(   r(   r)   rU   {   s   þýrU   c                   @   s2   e Zd ZdZeddƒeddddd�edd	ƒgZdS )
ÚPIMv2HelloDRPriorityz!PIMv2 Hello Options : DR Priorityr    é   r8   NZdr_priorityr#   r;   r   )r+   r,   r-   r.   r   r   r   r0   r(   r(   r(   r)   rV   †   s
   ýrV   c                   @   s4   e Zd ZdZeddƒeddddd�edeƒ ƒgZdS )	ÚPIMv2HelloGenerationIDz#PIMv2 Hello Options : Generation IDr    é   r8   NZgeneration_idr#   r;   )	r+   r,   r-   r.   r   r   r   r   r0   r(   r(   r(   r)   rX   �   s   ÿ
ûrX   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )ÚPIMv2HelloStateRefreshValuez)PIMv2 Hello Options : State-Refresh Valuer   r   Úintervalr   r!   N)r+   r,   r-   r.   r   r   r0   r(   r(   r(   r)   rZ   š   s
   þrZ   c                   @   s6   e Zd ZdZeddƒeddddd�edeƒ eƒgZdS )	ÚPIMv2HelloStateRefreshz#PIMv2 Hello Options : State-Refreshr    é   r8   Nr9   r#   r;   )	r+   r,   r-   r.   r   r   r   rZ   r0   r(   r(   r(   r)   r\   ¡   s   ÿÿûr\   )r   r   rW   rY   r]   Nc                
   @   sX   e 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ƒeddƒgZdS )ÚPIMv2JoinPruneAddrsBaseÚaddr_familyr   Úencoding_typer   Zrsrvdr   ÚsparseZwildcardÚrptÚmask_lené    Zsrc_ipú0.0.0.0N)r+   r,   r-   r   r   r
   r0   r(   r(   r(   r)   r^   º   s   



ør^   c                   @   s   e Zd ZdZdS )ÚPIMv2JoinAddrszPIMv2 Join: Source AddressNrH   r(   r(   r(   r)   rf   È   s   rf   c                   @   s   e Zd ZdZdS )ÚPIMv2PruneAddrszPIMv2 Prune: Source AddressNrH   r(   r(   r(   r)   rg   Ì   s   rg   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ƒeddƒeddddd�eddddd�edg e	dd„ d�edg e
dd„ d�gZdS )ÚPIMv2GroupAddrsz)PIMv2 Join/Prune: Multicast Group Addressr_   r   r`   r   Zbidirectionr!   r   Zadmin_scope_zonerc   rd   Zgaddrre   Ú	num_joinsNé   Zjoin_ips)ÚsizeÚcount_ofÚ
num_prunesZ	prune_ipsc                 C   s   | j S r>   )ri   ©Úxr(   r(   r)   rA   Ý   rB   zPIMv2GroupAddrs.<lambda>©Z
count_fromc                 C   s   | j S r>   )rm   rn   r(   r(   r)   rA   ß   rB   )r+   r,   r-   r.   r   r   r
   r   r   rf   rg   r0   r(   r(   r(   r)   rh   Ð   s"   


ÿÿôrh   c                   @   s\   e Zd ZdZeddƒeddƒeddƒeddƒed	d
ddd�eddƒedg e	dd„ d�gZ
d
S )ÚPIMv2JoinPrunezPIMv2 Join/Prune OptionsZup_addr_familyr   Zup_encoding_typer   Zup_neighbor_ipre   r!   Ú	num_groupNZjp_ipsr:   )rl   r<   rP   éÒ   c                 C   s   | j S r>   )rr   r@   r(   r(   r)   rA   í   rB   zPIMv2JoinPrune.<lambda>rp   )r+   r,   r-   r.   r   r
   r   r   r   rh   r0   r(   r(   r(   r)   rq   ã   s   ÿùrq   ég   )Úproto)r    r   )1Ú__doc__r$   Zscapy.packetr   r   Zscapy.fieldsr   r   r   r   r   r	   r
   r   r   r   r   r   Zscapy.layers.inetr   Zscapy.utilsr   Zscapy.compatr   Zscapy.configr   Zscapy.volatiler   r/   r   r6   r7   rG   rJ   rK   rN   rO   rR   rU   rV   rX   rZ   r\   rI   r^   rf   rg   rh   rq   r(   r(   r(   r)   Ú<module>   s^   8÷			ú