a
    kÄ#dEu  ã                
   @   sJ  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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 ddlm Z m!Z! ddl"m#Z#m$Z$m%Z% ddl&m'Z' dd	l(m)Z) d
Z*G dd„ deƒZ+dddd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ƒZ0G dd„ de0ƒZ1G dd„ de0ƒZ2dddœZ3d d!„ Z4G d"d#„ d#eƒZ5G d$d%„ d%eƒZ6d&d'd(d)d*d+d,d-d.d/œ	Z7d0d1d2d3d4d5d6d7d8d/œ	Z8d9d:„ Z9G d;d<„ d<eƒZ:d=d>d?d@dAœZ;G dBdC„ dCeƒZ<dDdE„ Z=G dFdG„ dGeƒZ>G dHd0„ d0e>ƒZ?G dId1„ d1e>ƒZ@G dJd2„ d2e>ƒZAG dKd3„ d3eAƒZBG dLd4„ d4e>ƒZCG dMd5„ d5eCƒZDG dNd6„ d6e>ƒZEG dOd7„ d7eEƒZFG dPd8„ d8eEƒZGG dQdR„ dReƒZHG dSdT„ dTeƒZIG dUdV„ dVeƒZJG dWdX„ dXeƒZKG dYdZ„ dZeƒZLG d[d\„ d\eƒZMG d]d^„ d^eƒZNG d_d`„ d`eƒZOd&d'dadbdcdddedfdgœZPdhdidjdkdldmdndodgœZQG dpdq„ dqeƒZRdrds„ ZSd=d>dtd@dAœZTG dudv„ dveƒZUG dwdh„ dhe>ƒZVG dxdi„ die>ƒZWG dydz„ dzeƒZXG d{dj„ dje>ƒZYG d|dk„ dke>ƒZZG d}dl„ dle>ƒZ[G d~dm„ dme[ƒZ\G dd€„ d€eƒZ]G d�dn„ dne>ƒZ^G d‚do„ doe>ƒZ_G dƒd„„ d„eƒZ`G d…d†„ d†eƒZaG d‡dˆ„ dˆeƒZbG d‰dŠ„ dŠeƒZcG d‹dŒ„ dŒeƒZdeee.d�dŽ� ee.e/d�d�� ee.eHd‘d�� ee.eJd’d�� ee.eKd“d�� ee.eLd”d�� e ee.d•¡ ee eMd�d–� eeMeOd�d�� eeMe`d‘d�� eeMebd’d�� eeMecd“d�� eeMedd”d�� e
 eeMd—¡ efd˜k�rFdd™lgmhZh eheiƒ dše* d›� dS )œz²
OSPF extension for Scapy <http://www.secdev.org/scapy>

This module provides Scapy layers for the Open Shortest Path First
routing protocol as defined in RFC 2328 and RFC 5340.
é    N)Úbind_layersÚPacket)ÚBitFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚDestIP6FieldÚFieldLenFieldÚFieldListFieldÚ
FlagsFieldÚIP6FieldÚIP6PrefixFieldÚIPFieldÚIntEnumFieldÚIntFieldÚLenFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚStrLenFieldÚX3BytesFieldÚ	XIntFieldÚ
XLongFieldÚXShortField)ÚIPÚDestIPField)ÚIPv6Ú
in6_chksum)Úfletcher16_checkbytesÚchecksumÚ	inet_aton)Úorb)Úconfzv0.9.2c                   @   s   e Zd Zddd„ZdS )ÚOSPFOptionsFieldÚoptionsr   é   Nc                 C   s&   |d u rg d¢}t  | ||||¡ d S )N)ZMTÚEÚMCZNPÚLÚDCÚOZDN©r   Ú__init__©ÚselfÚnameÚdefaultÚsizeÚnames© r3   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/ospf.pyr,   %   s    zOSPFOptionsField.__init__)r$   r   r%   N©Ú__name__Ú
__module__Ú__qualname__r,   r3   r3   r3   r4   r#   #   s     ÿr#   ZHelloZDBDescZLSReqZLSUpdZLSAck)é   é   é   é   é   c                   @   s   e Zd ZdZdd„ ZdS )Ú_NoLLSLenFieldz\
    LenField that will ignore the size of OSPF_LLS_Hdr if it exists
    in the payload
    c                 C   s4   |d u r|   t|jƒ¡}t|v r0|t|t ƒ8 }|S ©N)ÚadjustÚlenÚpayloadÚOSPF_LLS_Hdr©r.   ÚpktÚxr3   r3   r4   Úi2m9   s
    z_NoLLSLenField.i2mN)r6   r7   r8   Ú__doc__rG   r3   r3   r3   r4   r>   3   s   r>   c                   @   sÒ   e Zd ZdZeddƒeddeƒedddd	„ d
�eddƒeddƒe	ddƒe
dd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	„ ƒgZd d!„ Zd"d#„ Zd$d%„ ZdS )&ÚOSPF_HdrzOSPF HeaderÚversionr:   Útyper9   rA   Nc                 C   s   | d S ©Né   r3   ©rF   r3   r3   r4   Ú<lambda>F   ó    zOSPF_Hdr.<lambda>)r@   Úsrcú1.1.1.1Úareaú0.0.0.0ÚchksumÚauthtyper   ZNullZSimpleZCrypto)r   r9   r:   Úauthdatac                 C   s
   | j dkS ©Nr:   ©rV   ©rE   r3   r3   r4   rO   L   rP   Úreservedc                 C   s
   | j dkS rX   rY   rZ   r3   r3   r4   rO   N   rP   Zkeyidc                 C   s
   | j dkS rX   rY   rZ   r3   r3   r4   rO   O   rP   Zauthdatalenc                 C   s
   | j dkS rX   rY   rZ   r3   r3   r4   rO   P   rP   Úseqc                 C   s
   | j dkS rX   rY   rZ   r3   r3   r4   rO   Q   rP   c                 C   sf   ||7 }| j d u rb| jdkr"d}n@t|d d… |dd …  ƒ}|d d… t d|¡ |dd …  }|S )Nr:   r   é   rM   é   ú!Hé   )rU   rV   r   ÚstructÚpack)r.   ÚpÚpayZckr3   r3   r4   Ú
post_buildU   s    

$zOSPF_Hdr.post_buildc                 C   s   t  d| j¡| j ¡  S )NÚH)ra   rb   rS   rB   Úhashret©r.   r3   r3   r4   rg   c   s    zOSPF_Hdr.hashretc                 C   s2   t |tƒr.| j|jkr.| jdkr.| j |j¡S dS )Nr=   r   )Ú
isinstancerI   rS   rK   rB   Úanswers)r.   Úotherr3   r3   r4   rj   f   s    

ÿþzOSPF_Hdr.answers)r6   r7   r8   r/   r   r   Ú_OSPF_typesr>   r   r   r   r   r   r   Úfields_descre   rg   rj   r3   r3   r3   r4   rI   A   s"   
òrI   c                   @   sh   e Zd ZdZeddƒeddƒeƒ eddƒedd	ƒed
dƒeddƒe	dg eddƒdd„ d�gZ
dd„ ZdS )Ú
OSPF_Helloz
OSPF HelloÚmaskú255.255.255.0Úhellointervalé
   Úprior9   Údeadintervalé(   ÚrouterrT   ÚbackupÚ	neighborsÚ c                 C   s   | j r| j jd S d S )Né,   ©Ú
underlayerrA   rZ   r3   r3   r4   rO   w   rP   zOSPF_Hello.<lambda>©Úlength_fromc                 C   s"   | j d@ dkrtS t | |¡S d S ©Nr]   ©r$   rC   r   Úguess_payload_class©r.   rB   r3   r3   r4   r�   y   s    zOSPF_Hello.guess_payload_classN)r6   r7   r8   r/   r   r   r#   r   r   r
   rm   r�   r3   r3   r3   r4   rn   n   s   ù	rn   c                   @   s@   e Zd ZdZeddƒedddd�eddd	d
„ d�gZdd„ ZdS )ÚLLS_Generic_TLVzLLS GenericrK   r   rA   NÚval)Ú	length_ofry   c                 C   s   | j S r?   ©rA   rN   r3   r3   r4   rO   …   rP   zLLS_Generic_TLV.<lambda>r}   c                 C   s   t jS r?   )r"   Zpadding_layer)r.   rc   r3   r3   r4   r�   ‡   s    z#LLS_Generic_TLV.guess_payload_class)	r6   r7   r8   r/   r   r	   r   rm   r�   r3   r3   r3   r4   rƒ   �   s   þrƒ   c                   @   s:   e Zd ZdZeddƒeddddd�edd	d
d„ d�gZdS )ÚLLS_Extended_OptionszLLS Extended Options and FlagsrK   r9   rA   Nr_   r$   ©Úfmtr…   ry   c                 C   s   | j S r?   r†   rN   r3   r3   r4   rO   �   rP   zLLS_Extended_Options.<lambda>r}   )r6   r7   r8   r/   r   r	   r   rm   r3   r3   r3   r4   r‡   ‹   s
   þr‡   c                   @   sF   e Zd ZdZeddƒeddddd„ d	�ed
dƒedddd„ d�gZdS )ÚLLS_Crypto_Authz LLS Cryptographic AuthenticationrK   r:   rA   é   ÚBc                 C   s
   | j d S ©Nr<   )rW   rN   r3   r3   r4   rO   –   rP   zLLS_Crypto_Auth.<lambda>rˆ   Úsequencer   rW   s                   c                 C   s
   | j d S r�   r†   rN   r3   r3   r4   rO   ˜   rP   r}   N)	r6   r7   r8   r/   r   r	   r   r   rm   r3   r3   r3   r4   rŠ   “   s   ýrŠ   )r9   r:   c                 K   sP   t j}t| ƒdkr@t d| dd… ¡d }t |d¡}tƒ | }|| fi |¤ŽS )z1 Guess the correct LLS class for a given payload r;   r_   r   r:   rƒ   )r"   Ú	raw_layerrA   ra   ÚunpackÚ_OSPF_LLSclassesÚgetÚglobals©rc   ZkargsÚclsÚtypÚclsnamer3   r3   r4   Ú_LLSGuessPayloadClassŸ   s    
r˜   c                   @   s   e Zd Zdd„ ZdS )ÚFieldLenField32Bitsc                 C   s&   |st |ƒS tt | ||¡d> ƒd S )Nr:   z bytes)ÚreprÚstrr	   Zi2hrD   r3   r3   r4   Úi2repr«   s    zFieldLenField32Bits.i2reprN)r6   r7   r8   rœ   r3   r3   r3   r4   r™   ª   s   r™   c                   @   sH   e Zd ZdZeddƒeddddd„ d�edg ed	d„ d
�gZdd„ Z	dS )rC   zOSPF Link-local signalingrU   NrA   Zllstlvc                 C   s   |d d? S )Nr<   r:   r3   )rE   rF   r3   r3   r4   rO   ²   rP   zOSPF_LLS_Hdr.<lambda>)r…   r@   c                 C   s   | j d> d S )Nr:   r<   r†   rN   r3   r3   r4   rO   ³   rP   r}   c                 C   s6   ||7 }| j d u r2t|ƒ}t d|¡|dd …  }|S )Nr_   r:   )rU   r   ra   rb   )r.   rc   rd   Úcr3   r3   r4   re   µ   s
    
zOSPF_LLS_Hdr.post_build)
r6   r7   r8   r/   r   r™   r   r˜   rm   re   r3   r3   r3   r4   rC   ¯   s   þrC   rv   ÚnetworkZ	summaryIPZsummaryASBRZexternalZNSSAexternalZlinkScopeOpaqueZareaScopeOpaqueZasScopeOpaque)	r9   r:   r;   r<   r=   é   é	   rr   é   ÚOSPF_Router_LSAÚOSPF_Network_LSAÚOSPF_SummaryIP_LSAÚOSPF_SummaryASBR_LSAÚOSPF_External_LSAÚOSPF_NSSA_External_LSAÚOSPF_Link_Scope_Opaque_LSAÚOSPF_Area_Scope_Opaque_LSAÚOSPF_AS_Scope_Opaque_LSAc                 C   s   t d| dd …  dƒS )Ns     r:   r]   )r   )Zlsar3   r3   r4   Úospf_lsa_checksumÒ   s    r«   c                
   @   sZ   e Zd ZdZeddƒeƒ eddeƒeddƒeddƒe	d	d
ƒe
ddƒeddƒgZdd„ ZdS )ÚOSPF_LSA_HdrzOSPF LSA HeaderÚager9   rK   Úidú192.168.0.0ÚadrouterrR   r\   ì       rU   r   rA   é$   c                 C   s   d|fS ©Nry   r3   ©r.   Úsr3   r3   r4   Úextract_paddingá   s    zOSPF_LSA_Hdr.extract_paddingN)r6   r7   r8   r/   r   r#   r   Ú_OSPF_LStypesr   r   r   rm   r¶   r3   r3   r3   r4   r¬   Ö   s   
ù	r¬   Zp2pZtransitZstubZvirtual)r9   r:   r;   r<   c                   @   s|   e Zd ZdZeddƒeddƒeddeƒedd	ƒed
dƒe	edd	ƒdd„ ƒe	edd	ƒdd„ ƒe	edd	ƒdd„ ƒgZ
dd„ ZdS )Ú	OSPF_Linkz	OSPF Linkr®   r¯   Údatarp   rK   r;   Ztoscountr   Úmetricrr   Útosc                 C   s   dS ©NFr3   rZ   r3   r3   r4   rO   ó   rP   zOSPF_Link.<lambda>r[   c                 C   s   dS r¼   r3   rZ   r3   r3   r4   rO   ô   rP   Ú	tosmetricc                 C   s   dS r¼   r3   rZ   r3   r3   r4   rO   õ   rP   c                 C   s   d|fS r³   r3   r´   r3   r3   r4   r¶   ÷   s    zOSPF_Link.extract_paddingN)r6   r7   r8   r/   r   r   Ú_OSPF_Router_LSA_typesr   r   r   rm   r¶   r3   r3   r3   r4   r¸   ë   s   
ø
r¸   c                 K   sD   t j}t| ƒdkr4t| d ƒ}t |d¡}tƒ | }|| fi |¤ŽS )z1 Guess the correct LSA class for a given payload r<   r;   ÚRaw)r"   r�   rA   r!   Ú_OSPF_LSclassesr’   r“   r”   r3   r3   r4   Ú_LSAGuessPayloadClassû   s    
rÁ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚOSPF_BaseLSAz6 An abstract base class for Link State Advertisements c                 C   sl   | j }|d u r:t |ƒ}|d d… t d|¡ |dd …  }| jd u rht|ƒ}|d d… | |dd …  }|S )Né   r_   r‹   r]   )rA   ra   rb   rU   r«   )r.   rc   rd   ÚlengthrU   r3   r3   r4   re   
  s    $
zOSPF_BaseLSA.post_buildc                 C   s   d|fS r³   r3   r´   r3   r3   r4   r¶     s    zOSPF_BaseLSA.extract_paddingN)r6   r7   r8   rH   re   r¶   r3   r3   r3   r4   rÂ     s   
rÂ   c                   @   sŒ   e Zd ZdZeddƒeƒ eddƒeddƒeddƒedd	ƒe	d
dƒeddƒe
dddg d¢ƒeddƒedddd�edg edd„ dd„ d�gZdS )r¢   zOSPF Router LSAr­   r9   rK   r®   rR   r°   r\   r±   rU   NrA   Úflagsr   r%   )rŒ   r&   ÚVÚWZNtr[   Ú	linkcountÚlinklist)Úcount_ofc                 C   s   | j S r?   ©rÈ   rZ   r3   r3   r4   rO   &  rP   zOSPF_Router_LSA.<lambda>c                 C   s
   | j d S )Nr^   rË   rZ   r3   r3   r4   rO   '  rP   ©Ú
count_fromr~   )r6   r7   r8   r/   r   r#   r   r   r   r   r   r	   r   r¸   rm   r3   r3   r3   r4   r¢     s"   þõc                   @   sp   e Zd ZdZeddƒeƒ eddƒeddƒedd	ƒed
dƒe	ddƒeddƒeddƒe
dg edd	ƒdd„ d�g
ZdS )r£   zOSPF Network LSAr­   r9   rK   r:   r®   r¯   r°   rR   r\   r±   rU   NrA   ro   rp   Ú
routerlistry   c                 C   s
   | j d S rL   r†   rZ   r3   r3   r4   rO   6  rP   zOSPF_Network_LSA.<lambda>r}   )r6   r7   r8   r/   r   r#   r   r   r   r   r
   rm   r3   r3   r3   r4   r£   *  s   ÿ÷c                   @   sŒ   e Zd ZdZeddƒeƒ eddƒeddƒedd	ƒed
dƒe	ddƒeddƒeddƒeddƒe
ddƒeeddƒdd„ ƒee
ddƒdd„ ƒgZdS )r¤   zOSPF Summary LSA (IP Network)r­   r9   rK   r;   r®   r¯   r°   rR   r\   r±   rU   NrA   ro   rp   r[   r   rº   rr   r»   c                 C   s   dS r¼   r3   rZ   r3   r3   r4   rO   G  rP   zOSPF_SummaryIP_LSA.<lambda>r½   c                 C   s   dS r¼   r3   rZ   r3   r3   r4   rO   H  rP   )r6   r7   r8   r/   r   r#   r   r   r   r   r   r   rm   r3   r3   r3   r4   r¤   9  s   óc                   @   s    e Zd ZdZdZdZdZdZdS )r¥   z%OSPF Summary LSA (AS Boundary Router)r<   ú2.2.2.2rT   r‹   N)r6   r7   r8   r/   rK   r®   ro   rº   r3   r3   r3   r4   r¥   K  s
   c                   @   s¬   e Zd ZdZeddƒeƒ eddƒeddƒedd	ƒed
dƒe	ddƒeddƒeddƒe
ddddgƒedddƒeddƒeddƒeddƒeeddƒdd„ ƒeeddƒdd„ ƒgZdS ) r¦   zOSPF External LSA (ASBR)r­   r9   rK   r=   r®   r¯   r°   rÏ   r\   r±   rU   NrA   ro   rp   Zebitr   r&   r[   rŸ   rº   r‹   ZfwdaddrrT   Útagr»   c                 C   s   dS r¼   r3   rZ   r3   r3   r4   rO   d  rP   zOSPF_External_LSA.<lambda>r½   c                 C   s   dS r¼   r3   rZ   r3   r3   r4   rO   e  rP   )r6   r7   r8   r/   r   r#   r   r   r   r   r   r   r   r   rm   r3   r3   r3   r4   r¦   S  s$   
ðc                   @   s   e Zd ZdZdZdS )r§   zOSPF NSSA External LSArŸ   N©r6   r7   r8   r/   rK   r3   r3   r3   r4   r§   h  s   c                   @   st   e Zd ZdZdZeddƒeƒ eddƒeddƒedd	ƒe	d
dƒe
ddƒeddƒedddd„ d�g	Zdd„ Zdd„ ZdS )r¨   zOSPF Link Scope External LSAr    r­   r9   rK   r®   z	192.0.2.1r°   z198.51.100.100r\   r±   rU   NrA   r¹   c                 C   s
   | j d S )Nr‹   r†   rZ   r3   r3   r4   rO   y  rP   z#OSPF_Link_Scope_Opaque_LSA.<lambda>r}   c                 C   s   t  dt| jƒ¡d d@ S )Nú>Ir   iÿÿÿ ©ra   r�   r    r®   rh   r3   r3   r4   Úopaqueid|  s    z#OSPF_Link_Scope_Opaque_LSA.opaqueidc                 C   s   t  dt| jƒ¡d d? d@ S )NrÒ   r   rM   éÿ   rÓ   rh   r3   r3   r4   Ú
opaquetype  s    z%OSPF_Link_Scope_Opaque_LSA.opaquetype)r6   r7   r8   r/   rK   r   r#   r   r   r   r   r   rm   rÔ   rÖ   r3   r3   r3   r4   r¨   m  s    ÿøc                   @   s   e Zd ZdZdZdS )r©   zOSPF Area Scope External LSArr   NrÑ   r3   r3   r3   r4   r©   ƒ  s   c                   @   s   e Zd ZdZdZdS )rª   zOSPF AS Scope External LSAr¡   NrÑ   r3   r3   r3   r4   rª   ˆ  s   c                   @   sX   e Zd ZdZeddƒeƒ edddg d¢ƒedd	ƒed
de	dd„ dd„ d�gZ
dd„ ZdS )ÚOSPF_DBDesczOSPF Database DescriptionÚmtuéÜ  Údbdescrr   r%   )ÚMSÚMÚIÚRÚ4Ú3Ú2Ú1Úddseqr9   Ú
lsaheadersNc                 C   s   d S r?   r3   rZ   r3   r3   r4   rO   ”  rP   zOSPF_DBDesc.<lambda>c                 C   s   | j jd d S )NrM   r%   r{   rZ   r3   r3   r4   rO   •  rP   rÌ   c                 C   s"   | j d@ dkrtS t | |¡S d S r   r€   r‚   r3   r3   r4   r�   —  s    zOSPF_DBDesc.guess_payload_class)r6   r7   r8   r/   r   r#   r   r   r   r¬   rm   r�   r3   r3   r3   r4   r×   �  s   þür×   c                   @   s6   e Zd ZdZeddeƒeddƒeddƒgZdd„ Zd	S )
ÚOSPF_LSReq_ItemzOSPF Link State Request (item)rK   r9   r®   rR   r°   c                 C   s   d|fS r³   r3   r´   r3   r3   r4   r¶   ¥  s    zOSPF_LSReq_Item.extract_paddingN)	r6   r7   r8   r/   r   r·   r   rm   r¶   r3   r3   r3   r4   rå   Ÿ  s   
þrå   c                   @   s,   e Zd ZdZeddedd„ dd„ d�gZdS )Ú
OSPF_LSReqz#OSPF Link State Request (container)ÚrequestsNc                 C   s   d S r?   r3   rZ   r3   r3   r4   rO   ¬  rP   zOSPF_LSReq.<lambda>c                 C   s   | j jd S rL   r{   rZ   r3   r3   r4   rO   ­  rP   rÌ   )r6   r7   r8   r/   r   rå   rm   r3   r3   r3   r4   ræ   ©  s
   þræ   c                   @   s:   e Zd ZdZeddddd�eddedd„ d	d„ d
�gZdS )Ú
OSPF_LSUpdzOSPF Link State UpdateÚlsacountNú!IÚlsalist©r‰   rÊ   c                 C   s   | j S r?   ©ré   rZ   r3   r3   r4   rO   ´  rP   zOSPF_LSUpd.<lambda>c                 C   s   | j jd S rL   r{   rZ   r3   r3   r4   rO   µ  rP   rÌ   )r6   r7   r8   r/   r	   r   rÁ   rm   r3   r3   r3   r4   rè   °  s   þÿrè   c                   @   s4   e Zd ZdZeddedd„ dd„ d�gZdd	„ ZdS )
Ú
OSPF_LSAckzOSPF Link State Acknowledgementrä   Nc                 C   s   d S r?   r3   rZ   r3   r3   r4   rO   »  rP   zOSPF_LSAck.<lambda>c                 C   s   | j jd S rL   r{   rZ   r3   r3   r4   rO   ¼  rP   rÌ   c                 C   sF   t |tƒrB|jD ]0}| jD ]$}|j|jkr|j|jkr  dS qqdS )Nr9   r   )ri   rè   rë   rä   rK   r\   )r.   rk   ZreqLSAZackLSAr3   r3   r4   rj   ¾  s    



ÿzOSPF_LSAck.answers)r6   r7   r8   r/   r   r¬   rm   rj   r3   r3   r3   r4   rî   ¸  s   þrî   c                
   @   s^   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒeddƒgZ
dd„ ZdS )Ú
OSPFv3_HdrzOSPFv3 HeaderrJ   r;   rK   r9   rA   NrQ   rR   rS   rT   rU   Úinstancer   r[   c                 C   s‚   ||7 }| j }|d u rBt |ƒ}|d d… t d|¡ |dd …  }| jd u r~td| j|ƒ}|d d… t d|¡ |dd …  }|S )Nr:   r_   r<   éY   r^   r`   )rA   ra   rb   rU   r   r|   )r.   rc   rd   Ztmp_lenrU   r3   r3   r4   re   Ö  s    $
$zOSPFv3_Hdr.post_build)r6   r7   r8   r/   r   r   rl   r   r   r   rm   re   r3   r3   r3   r4   rï   Ë  s   
ù	rï   c                   @   s   e Zd Zddd„ZdS )ÚOSPFv3OptionsFieldr$   r   rM   Nc                 C   s&   |d u rg d¢}t  | ||||¡ d S )N)
ZV6r&   r'   ÚNrÞ   r)   ZAFr(   rÝ   ÚFr+   r-   r3   r3   r4   r,   ç  s    zOSPFv3OptionsField.__init__)r$   r   rM   Nr5   r3   r3   r3   r4   rò   å  s     ÿrò   c                   @   s`   e Zd ZdZeddƒeddƒeƒ eddƒedd	ƒed
dƒeddƒe	dg eddƒdd„ d�gZ
dS )ÚOSPFv3_HellozOSPFv3 HelloÚintidr   rs   r9   rq   rr   rt   ru   rv   rT   rw   rx   ry   c                 C   s   | j jd S )Nr²   r{   rZ   r3   r3   r4   rO   ø  rP   zOSPFv3_Hello.<lambda>r}   N)r6   r7   r8   r/   r   r   rò   r   r   r
   rm   r3   r3   r3   r4   rõ   î  s   ÿùrõ   ZinterAreaPrefixZinterAreaRouterZ
asExternalZtype7ÚlinkZintraAreaPrefix)é   é   é   é   é@  é   r%   é	   ÚOSPFv3_Router_LSAÚOSPFv3_Network_LSAÚOSPFv3_Inter_Area_Prefix_LSAÚOSPFv3_Inter_Area_Router_LSAÚOSPFv3_AS_External_LSAÚOSPFv3_Type_7_LSAÚOSPFv3_Link_LSAÚOSPFv3_Intra_Area_Prefix_LSAc                	   @   sV   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒgZ
dd„ ZdS )ÚOSPFv3_LSA_HdrzOSPFv3 LSA Headerr­   r9   rK   rø   r®   rT   r°   rR   r\   r±   rU   r   rA   r²   c                 C   s   d|fS r³   r3   r´   r3   r3   r4   r¶     s    zOSPFv3_LSA_Hdr.extract_paddingN)r6   r7   r8   r/   r   r   Ú_OSPFv3_LStypesr   r   r   rm   r¶   r3   r3   r3   r4   r    s   
úr  c                 K   sP   t j}t| ƒdkr@t d| dd… ¡d }t |d¡}tƒ | }|| fi |¤ŽS )z8 Guess the correct OSPFv3 LSA class for a given payload é   r_   r:   r<   r   r¿   )r"   r�   rA   ra   r�   Ú_OSPFv3_LSclassesr’   r“   r”   r3   r3   r4   Ú_OSPFv3_LSAGuessPayloadClass  s    
r  r[   c                   @   sN   e Zd ZdZeddeƒeddƒeddƒeddƒed	dƒe	d
dƒgZ
dd„ ZdS )ÚOSPFv3_LinkzOSPFv3 LinkrK   r9   r[   r   rº   rr   rö   Z
neighintidZneighborrÏ   c                 C   s   d|fS r³   r3   r´   r3   r3   r4   r¶   8  s    zOSPFv3_Link.extract_paddingN)r6   r7   r8   r/   r   Ú_OSPFv3_Router_LSA_typesr   r   r   r   rm   r¶   r3   r3   r3   r4   r  /  s   
ûr  c                   @   st   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒe
dddg d¢ƒeƒ edg edd„ d�g
ZdS )rÿ   zOSPFv3 Router LSAr­   r9   rK   rø   r®   rT   r°   rR   r\   r±   rU   NrA   rÅ   r   r%   )rŒ   r&   rÆ   rÇ   rÉ   c                 C   s
   | j d S rL   r†   rZ   r3   r3   r4   rO   H  rP   zOSPFv3_Router_LSA.<lambda>r}   )r6   r7   r8   r/   r   r   r  r   r   r   r   rò   r   r  rm   r3   r3   r3   r4   rÿ   <  s   
ÿ÷c                   @   sr   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒe
ddƒeƒ edg eddƒdd„ d�g
ZdS )r   zOSPFv3 Network LSAr­   r9   rK   rù   r®   rT   r°   rR   r\   r±   rU   NrA   r[   r   rÎ   ry   z0.0.0.1c                 C   s
   | j d S rL   r†   rZ   r3   r3   r4   rO   W  rP   zOSPFv3_Network_LSA.<lambda>r}   )r6   r7   r8   r/   r   r   r  r   r   r   r   rò   r
   rm   r3   r3   r3   r4   r   K  s   
ÿ÷c                   @   s   e Zd Zddd„ZdS )ÚOSPFv3PrefixOptionsFieldÚprefixoptionsr   r%   Nc                 C   s&   |d u rg d¢}t  | ||||¡ d S )N)ZNUZLAr'   ÚPr+   r-   r3   r3   r4   r,   \  s    z!OSPFv3PrefixOptionsField.__init__)r  r   r%   Nr5   r3   r3   r3   r4   r  Z  s     ÿr  c                   @   sŠ   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒe
ddƒeddƒeddddd�eƒ eddƒeddddd„ d�gZdS )r  zOSPFv3 Inter Area Prefix LSAr­   r9   rK   rú   r®   rT   r°   rR   r\   r±   rU   NrA   r[   r   rº   rr   Ú	prefixlenÚprefixrŒ   ©r…   r‰   Ú	reserved2ú2001:db8:0:42::/64r<   c                 C   s   | j S r?   ©r  rZ   r3   r3   r4   rO   q  rP   z%OSPFv3_Inter_Area_Prefix_LSA.<lambda>©Z	wordbytesr~   )r6   r7   r8   r/   r   r   r  r   r   r   r   r   r	   r  r   rm   r3   r3   r3   r4   r  c  s   
ôc                   @   sr   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒe
ddƒeƒ e
ddƒeddƒeddƒgZdS )r  zOSPFv3 Inter Area Router LSAr­   r9   rK   rû   r®   rT   r°   rR   r\   r±   rU   NrA   r[   r   r  rº   rv   rÏ   )r6   r7   r8   r/   r   r   r  r   r   r   r   rò   r   rm   r3   r3   r3   r4   r  t  s   
õc                   @   sÊ   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒe
dddg d¢ƒeddƒeddddd�eƒ eddeƒeddddd„ d�eedd ƒd!d„ ƒeed"dƒd#d„ ƒeed$dƒd%d„ ƒgZdS )&r  zOSPFv3 AS External LSAr­   r9   rK   rü   r®   rT   r°   rR   r\   r±   rU   NrA   rÅ   r   r%   )ÚTrô   r&   rº   r‹   r  r  rŒ   r  Ú	reflstyper  r<   c                 C   s   | j S r?   r  rZ   r3   r3   r4   rO   ’  rP   zOSPFv3_AS_External_LSA.<lambda>r  Zfwaddrz::c                 C   s   | j d@ dkS rX   ©rÅ   rZ   r3   r3   r4   rO   “  rP   rÐ   c                 C   s   | j d@ dkS )Nr9   r  rZ   r3   r3   r4   rO   ”  rP   Úreflsidc                 C   s
   | j dkS )Nr   )r  rZ   r3   r3   r4   rO   •  rP   )r6   r7   r8   r/   r   r   r  r   r   r   r   r   r	   r  r   r   r   r   rm   r3   r3   r3   r4   r  „  s$   

ñc                   @   s   e Zd ZdZdZdS )r  zOSPFv3 Type 7 LSArý   NrÑ   r3   r3   r3   r4   r  ˜  s   c                	   @   sH   e Zd ZdZeddddd�eƒ eddƒedd	d
dd„ d�gZdd„ Z	dS )ÚOSPFv3_Prefix_ItemzOSPFv3 Link Prefix Itemr  Nr  rŒ   r  rº   rr   r  r<   c                 C   s   | j S r?   r  rZ   r3   r3   r4   rO   ¢  rP   zOSPFv3_Prefix_Item.<lambda>r  c                 C   s   d|fS r³   r3   r´   r3   r3   r4   r¶   ¤  s    z"OSPFv3_Prefix_Item.extract_padding)
r6   r7   r8   r/   r	   r  r   r   rm   r¶   r3   r3   r3   r4   r  �  s   ýr  c                   @   s‚   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒe
ddƒeƒ eddƒeddddd�eddedd„ d�gZdS )r  zOSPFv3 Link LSAr­   r9   rK   r%   r®   rT   r°   rR   r\   r±   rU   NrA   rs   Zlladdrzfe80::ÚprefixesÚ
prefixlistrÝ   ©rÊ   r‰   c                 C   s   | j S r?   ©r  rZ   r3   r3   r4   rO   ¶  rP   zOSPFv3_Link_LSA.<lambda>©rÍ   )r6   r7   r8   r/   r   r   r  r   r   r   r   rò   r   r	   r   r  rm   r3   r3   r3   r4   r  ¨  s    
ÿõc                   @   sˆ   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
dƒe	ddƒeddƒe
ddddd�eddeƒeddƒeddƒeddedd„ d�gZdS )r  zOSPFv3 Intra Area Prefix LSAr­   r9   rK   rþ   r®   rT   r°   rR   r\   r±   rU   NrA   r  r  rf   r  r  r   r  Zrefadrouterc                 C   s   | j S r?   r   rZ   r3   r3   r4   rO   Ç  rP   z%OSPFv3_Intra_Area_Prefix_LSA.<lambda>r!  )r6   r7   r8   r/   r   r   r  r   r   r   r	   r   r  rm   r3   r3   r3   r4   r  ¹  s    

ÿõc                   @   s`   e Zd ZdZeddƒeƒ eddƒeddƒedddg d	¢ƒed
dƒe	dde
dd„ dd„ d�gZdS )ÚOSPFv3_DBDesczOSPFv3 Database Descriptionr[   r   rØ   rÙ   r  rÚ   r%   )rÛ   rÜ   rÝ   rÞ   rã   r9   rä   Nc                 C   s   d S r?   r3   rZ   r3   r3   r4   rO   Ó  rP   zOSPFv3_DBDesc.<lambda>c                 C   s   | j jd S )Né   r{   rZ   r3   r3   r4   rO   Ô  rP   rÌ   )r6   r7   r8   r/   r   rò   r   r   r   r   r  rm   r3   r3   r3   r4   r"  Ê  s   þúr"  c                   @   s>   e Zd ZdZeddƒeddeƒeddƒeddƒgZd	d
„ Z	dS )ÚOSPFv3_LSReq_Itemz OSPFv3 Link State Request (item)r[   r   rK   rø   r®   rR   r°   c                 C   s   d|fS r³   r3   r´   r3   r3   r4   r¶   Þ  s    z!OSPFv3_LSReq_Item.extract_paddingN)
r6   r7   r8   r/   r   r   r  r   rm   r¶   r3   r3   r3   r4   r$  ×  s   
ýr$  c                   @   s,   e Zd ZdZeddedd„ dd„ d�gZdS )ÚOSPFv3_LSReqz%OSPFv3 Link State Request (container)rç   Nc                 C   s   d S r?   r3   rZ   r3   r3   r4   rO   å  rP   zOSPFv3_LSReq.<lambda>c                 C   s   | j jd S r   r{   rZ   r3   r3   r4   rO   æ  rP   rÌ   )r6   r7   r8   r/   r   r$  rm   r3   r3   r3   r4   r%  â  s
   þr%  c                   @   s:   e Zd ZdZeddddd�edg edd„ d	d„ d
�gZdS )ÚOSPFv3_LSUpdzOSPFv3 Link State Updateré   Nrê   rë   rì   c                 C   s   | j S r?   rí   rZ   r3   r3   r4   rO   í  rP   zOSPFv3_LSUpd.<lambda>c                 C   s   | j jd S r   r{   rZ   r3   r3   r4   rO   î  rP   rÌ   )r6   r7   r8   r/   r	   r   r  rm   r3   r3   r3   r4   r&  é  s   þÿr&  c                   @   s,   e Zd ZdZeddedd„ dd„ d�gZdS )ÚOSPFv3_LSAckz!OSPFv3 Link State Acknowledgementrä   Nc                 C   s   d S r?   r3   rZ   r3   r3   r4   rO   ô  rP   zOSPFv3_LSAck.<lambda>c                 C   s   | j jd S r   r{   rZ   r3   r3   r4   rO   õ  rP   rÌ   )r6   r7   r8   r/   r   r  rm   r3   r3   r3   r4   r'  ñ  s
   þr'  rñ   )Úprotor9   )rK   r:   r;   r<   r=   z	224.0.0.5)Znhzff02::5Ú__main__)ÚinteractzOSPF extension %s)ZmydictZmybanner)jrH   ra   Zscapy.packetr   r   Zscapy.fieldsr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscapy.layers.inetr   r   Zscapy.layers.inet6r   r   Zscapy.utilsr   r   r    Zscapy.compatr!   Zscapy.configr"   ZEXT_VERSIONr#   rl   r>   rI   rn   rƒ   r‡   rŠ   r‘   r˜   r™   rC   r·   rÀ   r«   r¬   r¾   r¸   rÁ   rÂ   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r×   rå   ræ   rè   rî   rï   rò   rõ   r  r
  r  r  r  r  rÿ   r   r  r  r  r  r  r  r  r  r"  r$  r%  r&  r'  Z	bind_addrr6   Z
scapy.mainr*  r“   r3   r3   r3   r4   Ú<module>
   s
  `	ü-
ÿø
øý
	ù	ù
ý	
