
    h#              
       j   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mZ ddl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 Z  dddddddddd	Z! G d de          Z"d Z# G d de          Z$ G d de$          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+ G d' d(e%          Z, G d) d*e%          Z- G d+ d,e%          Z. G d- d.e%          Z/ G d/ d0e%          Z0 G d1 d2e%          Z1e)e+e,e-e/e1e%d3Z2 G d4 d5e$          Z3 G d6 d7e3          Z4 G d8 d9e3          Z5 G d: d;e$          Z6 G d< d=e$          Z7 eee"d>?            eee"d>@            ee"e(dA            ee"e7dBA           dS )Cz~
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IP6FieldPacketListFieldIntFieldFieldLenFieldBoundStrLenFieldMultipleTypeField)IP)IPv6
in6_chksum_IPv6ExtHdr)checksum)orb)conf)RandIntHelloRegisterzRegister-Stopz
Join/Prune	BootstrapAssertGraftz	Graft-AckzCandidate-RP-Advertisement)	r                           c                   z    e Zd ZdZ eddd           eddde           edd           edd	          gZ	d
 Z
d	S )PIMv2Hdrz/Protocol Independent Multicast Version 2 Headerversionr    r"   typer   reservedchksumNc                    ||z  }| j         t          | j        t                    rCt	          |          }|dk    rd}|dd         t          j        d|          z   |dd         z   }n}t          | j        t                    st          | j        t                    rIt          d| j        |          }|dk    rd}|dd         t          j        d|          z   |dd         z   }|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   i  r    !Hr"   g   )
r,   
isinstance
underlayerr   r   structpackr   r   r   )selfppaycks       U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/pim.py
post_buildzPIMv2Hdr.post_build-   s     	
S;$/2.. :a[[ 77BbqbEFKb111AabbE9DOT22 :jR]6^6^ :T_a8877BbqbEFKb111AabbE9    )__name__
__module____qualname__namer   r   PIM_TYPEr   r
   fields_descr9    r:   r8   r(   r(   &   sq        <D8Iq!,,<1h779Z++;x..0K
    r:   r(   c                     t           j        }t          |          dk    r+t          |d                   }|                     ||          } ||fi |S )Nr    r   )r   	raw_layerlenr   get)	h_classesdefault_keypktkargsclstlvtypes         r8   _guess_pim_tlv_classrL   K   sR    
.C
3xx1}}c!f++mmG[113ser:   c                   l    e Zd Z edd           edddd           eddd	 
          gZd Zd ZdS )_PIMGenericTlvBaser*   r   lengthNvalueB	length_offmt c                     | j         S NrO   rH   s    r8   <lambda>z_PIMGenericTlvBase.<lambda>W   s    CJ r:   length_fromc                     t           j        S rW   )r   padding_layer)r4   r5   s     r8   guess_payload_classz&_PIMGenericTlvBase.guess_payload_classY   s    !!r:   c                 
    d|fS )NrU   rA   )r4   ss     r8   extract_paddingz"_PIMGenericTlvBase.extract_padding\   s    1ur:   )	r;   r<   r=   r   r   r   r@   r_   rb   rA   r:   r8   rN   rN   S   s        9VQ'' =47LLL##GR0F0FH H HIK
" " "    r:   rN   c                       e Zd ZdZdS )_PIMv2GenericHellozPIMv2 Generic HelloNr;   r<   r=   r>   rA   r:   r8   rd   rd   c   s         DDDr:   rd   c                 *    t          t          d | fi |S rW   )rL   PIMv2_HELLO_CLASSES)r5   rI   s     r8   _guess_pimv2_hello_classrh   g   s     3T1FFFFFr:   c                       e Zd Zd ZdS )_PIMv2HelloListFieldc                 >    t          j        | dg t                     d S )Noption)r   __init__rh   )r4   s    r8   rm   z_PIMv2HelloListField.__init__l   s      x5MNNNNNr:   N)r;   r<   r=   rm   rA   r:   r8   rj   rj   k   s(        O O O O Or:   rj   c                   (    e Zd ZdZ e            gZdS )
PIMv2HellozPIMv2 Hello OptionsN)r;   r<   r=   r>   rj   r@   rA   r:   r8   ro   ro   p   s&         DKKKr:   ro   c                   ^    e Zd ZdZ edd           edddd           edd	          gZdS )
PIMv2HelloHoldtimezPIMv2 Hello Options : Holdtimer*   r   rO   Nholdtimer.   rR   i   )r;   r<   r=   r>   r	   r   r@   rA   r:   r8   rq   rq   w   sN        +D
61h
EEE
:s##KKKr:   rq   c                   \    e Zd ZdZ eddd           eddd           edd	          gZd
S )PIMv2HelloLANPruneDelayValuez+PIMv2 Hello Options : LAN Prune Delay Valuetr   r   propagation_delayi     override_intervali	  N)r;   r<   r=   r>   r   r	   r@   rA   r:   r8   ru   ru      sM        8Da$c2..
&--KKKr:   ru   c                   v    e Zd ZdZ edd           edddd           ed e            ed	 
          gZdS )PIMv2HelloLANPruneDelayz%PIMv2 Hello Options : LAN Prune Delayr*   r    rO   NrP   r.   rR   c                     | j         S rW   rX   rY   s    r8   rZ   z PIMv2HelloLANPruneDelay.<lambda>   s    
 r:   r[   )	r;   r<   r=   r>   r	   r   r   ru   r@   rA   r:   r8   r{   r{      sj        2D
61hTBBB!=!=!?!?4$:$:	< 	< 	<KKKr:   r{   c                   ^    e Zd ZdZ edd           edddd           edd	          gZdS )
PIMv2HelloDRPriorityz!PIMv2 Hello Options : DR Priorityr*      rO   Ndr_priorityr.   rR   r   )r;   r<   r=   r>   r	   r   r   r@   rA   r:   r8   r~   r~      sN        .D
62h4HHH""KKKr:   r~   c                   n    e Zd ZdZ edd           edddd           ed e                      gZdS )	PIMv2HelloGenerationIDz#PIMv2 Hello Options : Generation IDr*      rO   Ngeneration_idr.   rR   )	r;   r<   r=   r>   r	   r   r   r   r@   rA   r:   r8   r   r      s]        0D
62do4	
 	
 	
 	'')),,KKKr:   r   c                   X    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	   r@   rA   r:   r8   r   r      sG        6D9Y**9Z++:j!,,.KKKr:   r   c                   p    e Zd ZdZ edd           edddd           ed e            e          gZdS )	PIMv2HelloStateRefreshz#PIMv2 Hello Options : State-Refreshr*      rO   NrP   r.   rR   )	r;   r<   r=   r>   r	   r   r   r   r@   rA   r:   r8   r   r      sh        0D
62dg4	
 	
 	
 	!<!<!>!>3	5 	5KKKr:   r   c                   X    e Zd ZdZ edd           edd           edd          gZdS )	PIMv2HelloAddrListValuez(PIMv2 Hello Options : Address List Valueaddr_familyr   encoding_typer   prefix::N)r;   r<   r=   r>   r   r   r@   rA   r:   r8   r   r      sG        5D	-##	/1%%4  KKKr:   r   c                   p    e Zd ZdZ edd           edddd           ed e            e          gZdS )	PIMv2HelloAddrListz"PIMv2 Hello Options : Address Listr*      rO   NrP   r.   rR   )	r;   r<   r=   r>   r	   r   r   r   r@   rA   r:   r8   r   r      sh        /D
62dgD	
 	
 	
 	!8!8!:!:/	1 	1KKKr:   r   )r   r    r   r   r   r   Nc                       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 edd          d fg edd                    gZdS )PIMv2JoinPruneAddrsBaser   r   r   r   rsrvdr#   sparsewildcardrptmask_len    src_ipr   c                     | j         dk    S Nr    r   rY   s    r8   rZ   z PIMv2JoinPruneAddrsBase.<lambda>       #/Q. r:   0.0.0.0N)	r;   r<   r=   r   r   r   r   r   r@   rA   r:   r8   r   r      s        	-##	/1%%!Q1a  Q""1	*b!!hx&&..0 1GHi((	
 	
KKKr:   r   c                       e Zd ZdZdS )PIMv2JoinAddrszPIMv2 Join: Source AddressNre   rA   r:   r8   r   r      s        'DDDr:   r   c                       e Zd ZdZdS )PIMv2PruneAddrszPIMv2 Prune: Source AddressNre   rA   r:   r8   r   r      s        (DDDr:   r   c                   Z   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 edd          d fg edd                     e	dddd           e	dddd           e
dg ed            e
dg ed           gZdS )PIMv2GroupAddrsz)PIMv2 Join/Prune: Multicast Group Addressr   r   r   r   bidirectionr+   r$   admin_scope_zoner   r   gaddrr   c                     | j         dk    S r   r   rY   s    r8   rZ   zPIMv2GroupAddrs.<lambda>  r   r:   r   	num_joinsN   join_ips)sizecount_of
num_prunes	prune_ipsc                     | j         S rW   )r   xs    r8   rZ   zPIMv2GroupAddrs.<lambda>	  s    Q[ r:   
count_fromc                     | j         S rW   )r   r   s    r8   rZ   zPIMv2GroupAddrs.<lambda>  s    Q\ r:   )r;   r<   r=   r>   r   r   r   r   r   r   r   r   r   r@   rA   r:   r8   r   r      s)       6D	-##	/1%%1%%Q""#Q**	*b!!hw%%..0 1GGY''	
 	

 	djIIIt"{KKK
B#8#8	: 	: 	:R#9#9	; 	; 	;!KKKr:   r   c                       e Zd ZdZ edd           edd           e edd          d fg edd	                     ed
d           edddd           e	dd           e
dg ed           gZdS )PIMv2JoinPrunezPIMv2 Join/Prune Optionsup_addr_familyr   up_encoding_typer   up_neighbor_ipr   c                     | j         dk    S r   )r   rY   s    r8   rZ   zPIMv2JoinPrune.<lambda>  s    #,1 r:   r   r+   	num_groupNjp_ipsrQ   )r   rT   rr      c                     | j         S rW   )r   rY   s    r8   rZ   zPIMv2JoinPrune.<lambda>  s    s} r:   r   )r;   r<   r=   r>   r   r   r   r   r   r	   r   r   r@   rA   r:   r8   r   r     s        %D	"A&&	$a((h'..113 4G$i00	
 	

 		*a  k4(DDD
:s##"o#<#<	> 	> 	>KKKr:   r   r/   )proto)nh)r*   r!   )8__doc__r2   scapy.packetr   r   scapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   r   scapy.layers.inetr   scapy.layers.inet6r   r   r   scapy.utilsr   scapy.compatr   scapy.configr   scapy.volatiler   r?   r(   rL   rN   rd   rh   rj   ro   rq   ru   r{   r~   r   r   r   r   r   rg   r   r   r   r   r   rA   r:   r8   <module>r      sh   
  , , , , , , , ,A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A !           < < < < < < < < < <                         " " " " " " #
 
" " " " "v " " "J  
 
 
 
 
 
 
 
 ! ! ! ! !+ ! ! !G G GO O O O O? O O O
           +       #5       0       -       /   . . . . ."4 . . .	 	 	 	 	/ 	 	 	    0   	 	 	 	 	+ 	 	 	 
      0   $( ( ( ( (, ( ( () ) ) ) )- ) ) )    (   .    '   $ B $ $ $ $ D(s # # # # Hjq ) ) ) ) Hn1 - - - - - -r:   