
    hEu              
       d   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e          Z+ddddddZ, G d de          Z- G d de          Z. G d de          Z/ G d de          Z0 G d de0          Z1 G d de0          Z2dddZ3d  Z4 G d! d"e          Z5 G d# d$e          Z6d%d&d'd(d)d*d+d,d-d.	Z7d/d0d1d2d3d4d5d6d7d.	Z8d8 Z9 G d9 d:e          Z:d;d<d=d>d?Z; G d@ dAe          Z<dB Z= G dC dDe          Z> G dE d/e>          Z? G dF d0e>          Z@ G dG d1e>          ZA G dH d2eA          ZB G dI d3e>          ZC G dJ d4eC          ZD G dK d5e>          ZE G dL d6eE          ZF G dM d7eE          ZG G dN dOe          ZH G dP dQe          ZI G dR dSe          ZJ G dT dUe          ZK G dV dWe          ZL G dX dYe          ZM G dZ d[e          ZN G d\ d]e          ZOd%d&d^d_d`dadbdcddZPdedfdgdhdidjdkdlddZQ G dm dne          ZRdo ZSd;d<dpd>d?ZT G dq dre          ZU G ds dee>          ZV G dt dfe>          ZW G du dve          ZX G dw dge>          ZY G dx dhe>          ZZ G dy die>          Z[ G dz dje[          Z\ G d{ d|e          Z] G d} dke>          Z^ G d~ dle>          Z_ G d de          Z` G d de          Za G d de          Zb G d de          Zc G d de          Zd eee.d            ee.e/d            ee.eHd            ee.eJd            ee.eKd            ee.eLd            eje        e.d            ee eMd            eeMeOd            eeMe`d            eeMebd            eeMecd            eeMedd            e
je        eMd           efdk    r ddlgmhZh  eh ei            de*z             dS 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                       e Zd Z	 	 ddZdS )OSPFOptionsFieldoptionsr      Nc                 B    |g d}t          j        | ||||           d S )N)MTEMCNPLDCODNr   __init__selfnamedefaultsizenamess        V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/ospf.pyr2   zOSPFOptionsField.__init__%   s1    =AAAED$u=====    )r&   r   r'   N__name__
__module____qualname__r2    r:   r9   r%   r%   #   s.        78> > > > > >r:   r%   HelloDBDescLSReqLSUpdLSAck)               c                       e Zd ZdZd ZdS )_NoLLSLenFieldz\
    LenField that will ignore the size of OSPF_LLS_Hdr if it exists
    in the payload
    c                     |'|                      t          |j                            }t          |v r|t          |t                             z  }|S N)adjustlenpayloadOSPF_LLS_Hdrr4   pktxs      r9   i2mz_NoLLSLenField.i2m9   sI    9C,,--A3S&'''Ar:   N)r<   r=   r>   __doc__rU   r?   r:   r9   rK   rK   3   s-         
    r:   rK   c                      e Zd ZdZ edd           edde           eddd 	           ed
d           edd           e	dd           e
dddddd           e edd          d            e e	dd          d            e edd          d            e edd          d            e edd          d           gZd Zd  Zd! ZdS )"OSPF_HdrzOSPF HeaderversionrF   typerE   rO   Nc                     | dz   S N   r?   rT   s    r9   <lambda>zOSPF_Hdr.<lambda>F   s
    QV r:   )rN   src1.1.1.1area0.0.0.0chksumauthtyper   NullSimpleCrypto)r   rE   rF   authdatac                     | j         dk    S NrF   re   rS   s    r9   r_   zOSPF_Hdr.<lambda>L   s    PQ@Q r:   reservedc                     | j         dk    S rk   rl   rm   s    r9   r_   zOSPF_Hdr.<lambda>N   s    QRAR r:   keyidc                     | j         dk    S rk   rl   rm   s    r9   r_   zOSPF_Hdr.<lambda>O   s    CLA<M r:   authdatalenc                     | j         dk    S rk   rl   rm   s    r9   r_   zOSPF_Hdr.<lambda>P   s    #,RSBS r:   seqc                     | j         dk    S rk   rl   rm   s    r9   r_   zOSPF_Hdr.<lambda>Q   s    #,!:K r:   c                     ||z  }| j         [| j        dk    rd}nMt          |d d         |dd          z             }|d d         t          j        d|          z   |dd          z   }|S )NrF   r      r]      !H   )rd   re   r    structpack)r4   ppaycks       r9   
post_buildzOSPF_Hdr.post_buildU   sz    	S;}!! afqvo..crcFV[r222QrssV;r:   c                 j    t          j        d| j                  | j                                        z   S )NH)r{   r|   rb   rP   hashretr4   s    r9   r   zOSPF_Hdr.hashretc   s)    {3	**T\-A-A-C-CCCr:   c                     t          |t                    r:| j        |j        k    r*| j        dk    r| j                            |j                  S dS )NrI   r   )
isinstancerX   rb   rZ   rP   answers)r4   others     r9   r   zOSPF_Hdr.answersf   sK    uh'' 	7I##	Q<''666qr:   )r<   r=   r>   r5   r   r   _OSPF_typesrK   r   r   r   r   r   r   fields_descr   r   r   r?   r:   r9   rX   rX   A   sp       D	)Qfa--ud+;+;<<<y!!	""Hd##z1&X(&K&KLLJ224Q4QRRZ335R5RSS7A..0M0MNN=!446S6STT5!,,.K.KLLK$  D D D    r:   rX   c                       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           gZ
d ZdS )
OSPF_Helloz
OSPF Hellomask255.255.255.0hellointerval
   priorE   deadinterval(   routerrc   backup	neighbors c                 2    | j         r| j         j        dz
  nd S )N,   
underlayerrO   rm   s    r9   r_   zOSPF_Hello.<lambda>w   s2      AD  AO  dYdgdrdvy{d{d{  UY r:   length_fromc                 V    | j         dz  dk    rt          S t          j        | |          S Nrw   r&   rQ   r   guess_payload_classr4   rP   s     r9   r   zOSPF_Hello.guess_payload_classy   -    <$$&&-dG<<<r:   N)r<   r=   r>   r5   r   r   r%   r   r   r   r   r   r?   r:   r9   r   r   n   s        D76?33:or22##%%9VQ''8NB//78Y//78Y//!>+r772y3I3I  XY  XY  Z  Z  Z[K= = = = =r:   r   c                   h    e Zd ZdZ edd           eddd           eddd	 
          gZd ZdS )LLS_Generic_TLVzLLS GenericrZ   r   rO   Nval)	length_ofr   c                     | j         S rM   rO   r^   s    r9   r_   zLLS_Generic_TLV.<lambda>   s     r:   r   c                     t           j        S rM   )r#   padding_layer)r4   r}   s     r9   r   z#LLS_Generic_TLV.guess_payload_class   s    !!r:   )	r<   r=   r>   r5   r   r
   r   r   r   r?   r:   r9   r   r      si        D:fa(( =>>>;ubooFFFHK" " " " "r:   r   c                   d    e Zd ZdZ edd           edddd           edd	d
           gZdS )LLS_Extended_OptionszLLS Extended Options and FlagsrZ   rE   rO   Nry   r&   fmtr   r   c                     | j         S rM   r   r^   s    r9   r_   zLLS_Extended_Options.<lambda>   s    AE r:   r   )r<   r=   r>   r5   r   r
   r   r   r?   r:   r9   r   r      sV        +D:fa(( =$)LLL;y"//JJJLKKKr:   r   c                   |    e Zd ZdZ edd           edddd            ed	d
           eddd           gZdS )LLS_Crypto_Authz LLS Cryptographic AuthenticationrZ   rF   rO      Bc                     | j         dz   S NrH   )ri   r^   s    r9   r_   zLLS_Crypto_Auth.<lambda>   s    VW r:   r   sequencer   ri   s                   c                     | j         dz
  S r   r   r^   s    r9   r_   zLLS_Crypto_Auth.<lambda>   s    quWXy r:   r   N)	r<   r=   r>   r5   r   r
   r   r   r   r?   r:   r9   r   r      sk        -D:fa(( =?W?WXXX9Z++;z<EXEXYYY[KKKr:   r   )rE   rF   c                     t           j        }t          |           dk    rRt          j        d| dd                   d         }t
                              |d          }t                      |         } || fi |S )z1 Guess the correct LLS class for a given payload rG   ry   r   rF   r   )r#   	raw_layerrO   r{   unpack_OSPF_LLSclassesgetglobalsr}   kargsclstypclsnames        r9   _LLSGuessPayloadClassr      sp     .C
1vv{{mD!AaC&))!,"&&s,=>>ii 3q??E??r:   c                       e Zd Zd ZdS )FieldLenField32Bitsc                 v    |st          |          n(t          t          j        | ||          dz            dz   S )NrF   z bytes)reprstrr
   i2hrR   s      r9   i2reprzFieldLenField32Bits.i2repr   s9    YtAwwwS):4a)H)HA)M%N%NQY%YYr:   N)r<   r=   r>   r   r?   r:   r9   r   r      s(        Z Z Z Z Zr:   r   c                   n    e Zd ZdZ edd           edddd            edg ed 	          gZd
 Z	dS )rQ   zOSPF Link-local signalingrd   NrO   llstlvc                     |dz   dz	  S )NrH   rF   r?   )rS   rT   s     r9   r_   zOSPF_LLS_Hdr.<lambda>   s    _`cd_dij^j r:   )r   rN   c                     | j         dz  dz
  S )NrF   rH   r   r^   s    r9   r_   zOSPF_LLS_Hdr.<lambda>   s    _`_dhi_imn^n r:   r   c                 |    ||z  }| j         /t          |          }t          j        d|          |dd          z   }|S )Nry   rF   )rd   r    r{   r|   )r4   r}   r~   cs       r9   r   zOSPF_LLS_Hdr.post_build   sA    	S;AD!$$qu,Ar:   )
r<   r=   r>   r5   r   r   r   r   r   r   r?   r:   r9   rQ   rQ      su        &D;x..&&udhOjOjkkk"?8R1FTnTnoooqK    r:   rQ   r   network	summaryIPsummaryASBRexternalNSSAexternallinkScopeOpaqueareaScopeOpaqueasScopeOpaque)	rE   rF   rG   rH   rI      	   r      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                 8    t          d| dd          z   d          S )Ns     rF   rw   )r   )lsas    r9   ospf_lsa_checksumr      s     s122w!6;;;r:   c                       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 ZdS )OSPF_LSA_HdrzOSPF LSA HeaderagerE   rZ   id192.168.0.0adrouterra   rt          rd   r   rO   $   c                 
    d|fS Nr   r?   r4   ss     r9   extract_paddingzOSPF_LSA_Hdr.extract_padding       1ur:   N)r<   r=   r>   r5   r   r%   r   _OSPF_LStypesr   r   r   r   r   r?   r:   r9   r   r      s        D:eQ''##%% =M::74//7:y119UJ//;x++:eR((*K    r:   r   p2ptransitstubvirtual)rE   rF   rG   rH   c                      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            e	 edd	          d            e	 edd	          d           gZ
d ZdS )	OSPF_Linkz	OSPF Linkr   r   datar   rZ   rG   toscountr   metricr   tosc                     dS NFr?   rm   s    r9   r_   zOSPF_Link.<lambda>   s    U r:   rn   c                     dS r  r?   rm   s    r9   r_   zOSPF_Link.<lambda>   s    % r:   	tosmetricc                     dS r  r?   rm   s    r9   r_   zOSPF_Link.<lambda>   s    E r:   c                 
    d|fS r   r?   r   s     r9   r   zOSPF_Link.extract_padding   r   r:   N)r<   r=   r>   r5   r   r   _OSPF_Router_LSA_typesr   r   r   r   r   r?   r:   r9   r   r      s        D74//76?33 =,BCC9Z++:h++##IIeQ$7$79J9JKK##IIj!$<$<>O>OPP##JJ{A$>$>@Q@QRRTK    r:   r   c                     t           j        }t          |           dk    rDt          | d                   }t                              |d          }t                      |         } || fi |S )z1 Guess the correct LSA class for a given payload rH   rG   Raw)r#   r   rO   r"   _OSPF_LSclassesr   r   r   s        r9   _LSAGuessPayloadClassr     s`     .C
1vv{{!A$ii!%%c511ii 3q??E??r:   c                       e Zd ZdZd Zd ZdS )OSPF_BaseLSAz6 An abstract base class for Link State Advertisements c                     | j         }|:t          |          }|d d         t          j        d|          z   |dd          z   }| j        't	          |          }|d d         |z   |dd          z   }|S )N   ry   r   rw   )rO   r{   r|   rd   r   )r4   r}   r~   lengthrd   s        r9   r   zOSPF_BaseLSA.post_build
  s|    >VVF#2#T6222QrssV;A;&q))F#2#!BCC&(Ar:   c                 
    d|fS r   r?   r   s     r9   r   zOSPF_BaseLSA.extract_padding  r   r:   N)r<   r=   r>   rV   r   r   r?   r:   r9   r  r    s8        @@      r:   r  c                   2   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           edg ed d           gZdS )r   zOSPF Router LSAr   rE   rZ   r   ra   r   rt   r   rd   NrO   flagsr   r'   )r   r*   VWNtrn   	linkcountlinklist)count_ofc                     | j         S rM   r  rm   s    r9   r_   zOSPF_Router_LSA.<lambda>&  s    #- r:   c                     | j         dz  S )Nrx   r  rm   s    r9   r_   zOSPF_Router_LSA.<lambda>'  s    3=2;M r:   
count_fromr   )r<   r=   r>   r5   r   r%   r   r   r   r   r   r
   r   r   r   r?   r:   r9   r   r     s        D:eQ''##%%9VQ''74++7:y119UJ//;x..:eT**:gq!-G-G-GHH9Z++ =dZHHH"?:r9.G.G/M/MO O OPKKKr:   c                   
   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           g
ZdS )r   zOSPF Network LSAr   rE   rZ   rF   r   r   r   ra   rt   r   rd   NrO   r   r   
routerlistr   c                     | j         dz
  S r\   r   rm   s    r9   r_   zOSPF_Network_LSA.<lambda>6      #'B, r:   r   )r<   r=   r>   r5   r   r%   r   r   r   r   r   r   r?   r:   r9   r   r   *  s        D:eQ''##%%9VQ''74//7:y119UJ//;x..:eT**76?33!>,GGB	4J4J.F.FH H H
IKKKr:   c                   \   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            e e
dd          d           gZdS )r   zOSPF Summary LSA (IP Network)r   rE   rZ   rG   r   r   r   ra   rt   r   rd   NrO   r   r   rn   r   r   r   r  c                     dS r  r?   rm   s    r9   r_   zOSPF_SummaryIP_LSA.<lambda>G      E r:   r  c                     dS r  r?   rm   s    r9   r_   zOSPF_SummaryIP_LSA.<lambda>H      U r:   )r<   r=   r>   r5   r   r%   r   r   r   r   r   r   r   r?   r:   r9   r   r   9  s        *D:eQ''##%%9VQ''74//7:y119UJ//;x..:eT**76?339Z++<"--##IIeQ$7$79I9IJJ##LLa$@$@BRBRSSUKKKr:   c                   "    e Zd ZdZdZdZdZdZdS )r   z%OSPF Summary LSA (AS Boundary Router)rH   2.2.2.2rc   r   N)r<   r=   r>   r5   rZ   r   r   r   r?   r:   r9   r   r   K  s'        2DD	BDFFFr:   c                      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            e edd          d           gZdS )r   zOSPF External LSA (ASBR)r   rE   rZ   rI   r   r   r   r*  rt   r   rd   NrO   r   r   ebitr   r*   rn   r   r   r   fwdaddrrc   tagr  c                     dS r  r?   rm   s    r9   r_   zOSPF_External_LSA.<lambda>d  r&  r:   r  c                     dS r  r?   rm   s    r9   r_   zOSPF_External_LSA.<lambda>e  r(  r:   )r<   r=   r>   r5   r   r%   r   r   r   r   r   r   r   r   r   r?   r:   r9   r   r   S  s2       %D:eQ''##%%9VQ''74//7:y119UJ//;x..:eT**76?33:faSE228J1--<"--79i009UA&&##IIeQ$7$79I9IJJ##LLa$@$@BRBRSS!UKKKr:   c                       e Zd ZdZdZdS )r   zOSPF NSSA External LSAr   Nr<   r=   r>   r5   rZ   r?   r:   r9   r   r   h  s        #DDDDr:   c                       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           g	Zd Zd ZdS )r   zOSPF Link Scope External LSAr   r   rE   rZ   r   z	192.0.2.1r   z198.51.100.100rt   r   rd   NrO   r   c                     | j         dz
  S )Nr   r   rm   s    r9   r_   z#OSPF_Link_Scope_Opaque_LSA.<lambda>y  s    sw| r:   r   c                 b    t          j        dt          | j                            d         dz  S )N>Ir   i r{   r   r!   r   r   s    r9   opaqueidz#OSPF_Link_Scope_Opaque_LSA.opaqueid|  s(    }T9TW#5#566q9HDDr:   c                 h    t          j        dt          | j                            d         dz	  dz  S )Nr6  r   r]      r7  r   s    r9   
opaquetypez%OSPF_Link_Scope_Opaque_LSA.opaquetype  s-    dIdg$6$677:b@DHHr:   )r<   r=   r>   r5   rZ   r   r%   r   r   r   r   r   r   r8  r;  r?   r:   r9   r   r   m  s        )DD:eQ''##%%9VQ''74--7:'7889UJ//;x..:eT**;vv+C+CE E E
KE E EI I I I Ir:   c                       e Zd ZdZdZdS )r   zOSPF Area Scope External LSAr   Nr2  r?   r:   r9   r   r     s        )DDDDr:   c                       e Zd ZdZdZdS )r   zOSPF AS Scope External LSAr   Nr2  r?   r:   r9   r   r     s        'DDDDr:   c                       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           gZ
d ZdS )OSPF_DBDesczOSPF Database Descriptionmtu  dbdescrr   r'   )MSMIR4321ddseqrE   
lsaheadersNc                     d S rM   r?   rm   s    r9   r_   zOSPF_DBDesc.<lambda>      $ r:   c                 &    | j         j        dz
  dz
  S )Nr]   r'   r   rm   s    r9   r_   zOSPF_DBDesc.<lambda>  s    3>;MPR;RUV;V r:   r  c                 V    | j         dz  dk    rt          S t          j        | |          S r   r   r   s     r9   r   zOSPF_DBDesc.guess_payload_class  r   r:   )r<   r=   r>   r5   r   r%   r   r   r   r   r   r   r?   r:   r9   r?  r?    s        &D:eT**##%%:iA/X/X/XYY8GQ''"?<|.>.>/V/VX X X	YK= = = = =r:   r?  c                   `    e Zd ZdZ edde           edd           edd          gZd ZdS )	OSPF_LSReq_ItemzOSPF Link State Request (item)rZ   rE   r   ra   r   c                 
    d|fS r   r?   r   s     r9   r   zOSPF_LSReq_Item.extract_padding  r   r:   N)	r<   r=   r>   r5   r   r   r   r   r   r?   r:   r9   rR  rR    s^        +D<=9974++7:y113K    r:   rR  c                   8    e Zd ZdZ edded d           gZdS )
OSPF_LSReqz#OSPF Link State Request (container)requestsNc                     d S rM   r?   rm   s    r9   r_   zOSPF_LSReq.<lambda>       r:   c                      | j         j        dz
  S r\   r   rm   s    r9   r_   zOSPF_LSReq.<lambda>      #.:Lr:Q r:   r  )r<   r=   r>   r5   r   rR  r   r?   r:   r9   rU  rU    sC        0D"?:t_.=o/Q/QS S S TKKKr:   rU  c                   T    e Zd ZdZ edddd           edded d 	          gZdS )

OSPF_LSUpdzOSPF Link State UpdatelsacountN!Ilsalistr   r  c                     | j         S rM   r]  rm   s    r9   r_   zOSPF_LSUpd.<lambda>      #, r:   c                      | j         j        dz
  S r\   r   rm   s    r9   r_   zOSPF_LSUpd.<lambda>      3>;MPR;R r:   r  )r<   r=   r>   r5   r
   r   r  r   r?   r:   r9   r\  r\    s[        #D =TtiPPP"?9d4I.F.F/R/RT T TUKKKr:   r\  c                   >    e Zd ZdZ edded d           gZd ZdS )
OSPF_LSAckzOSPF Link State AcknowledgementrL  Nc                     d S rM   r?   rm   s    r9   r_   zOSPF_LSAck.<lambda>  rN  r:   c                      | j         j        dz
  S r\   r   rm   s    r9   r_   zOSPF_LSAck.<lambda>  re  r:   r  c                     t          |t                    r8|j        D ]0}| j        D ]&}|j        |j        k    r|j        |j        k    r  dS '1dS )NrE   r   )r   r\  r_  rL  rZ   rt   )r4   r   reqLSAackLSAs       r9   r   zOSPF_LSAck.answers  sj    eZ(( 	!- ! !"o ! !Fv{22"J&*44 qqq! qr:   )r<   r=   r>   r5   r   r   r   r   r?   r:   r9   rg  rg    sY        ,D"?<|.>.>/R/RT T T UK    r:   rg  c                       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 ZdS )
OSPFv3_HdrzOSPFv3 HeaderrY   rG   rZ   rE   rO   Nr`   ra   rb   rc   rd   instancer   rn   c                 &   ||z  }| j         }|:t          |          }|d d         t          j        d|          z   |dd          z   }| j        At	          d| j        |          }|d d         t          j        d|          z   |dd          z   }|S )NrF   ry   rH   Y   rx   rz   )rO   r{   r|   rd   r   r   )r4   r}   r~   tmp_lenrd   s        r9   r   zOSPFv3_Hdr.post_build  s    	S(?!ffG"1"D'222QqrrU:A;DOQ77F#2#T6222QrssV;Ar:   )r<   r=   r>   r5   r   r   r   r   r   r   r   r   r?   r:   r9   rn  rn    s        D9Y** =K88:eT**75),,769--;x..9Z++9Z++-K    r:   rn  c                       e Zd Z	 	 ddZdS )OSPFv3OptionsFieldr&   r   r]   Nc                 B    |g d}t          j        | ||||           d S )N)
V6r*   r+   NrF  r.   AFr-   rE  Fr1   r3   s        r9   r2   zOSPFv3OptionsField.__init__  s1    =JJJED$u=====r:   )r&   r   r]   Nr;   r?   r:   r9   rt  rt    s.        79> > > > > >r:   rt  c                       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           gZ
dS )OSPFv3_HellozOSPFv3 Hellointidr   r   rE   r   r   r   r   r   rc   r   r   r   c                      | j         j        dz
  S )Nr   r   rm   s    r9   r_   zOSPFv3_Hello.<lambda>  re  r:   r   N)r<   r=   r>   r5   r   r   rt  r   r   r   r   r?   r:   r9   r{  r{    s        D8GQ''9VQ''%%'':or22:nb1178Y//78Y//!>+r772y3I3I.S.SU U UVKKKr:   r{  interAreaPrefixinterAreaRouter
asExternaltype7link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            
           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 ZdS )OSPFv3_LSA_HdrzOSPFv3 LSA Headerr   rE   rZ   r  r   rc   r   ra   rt   r   rd   r   rO   r   c                 
    d|fS r   r?   r   s     r9   r   zOSPFv3_LSA_Hdr.extract_padding  r   r:   N)r<   r=   r>   r5   r   r   _OSPFv3_LStypesr   r   r   r   r   r?   r:   r9   r  r    s        D:eQ''!>&&/BB74++7:y119UJ//;x++:eR((*K    r:   r  c                     t           j        }t          |           dk    rRt          j        d| dd                   d         }t
                              |d          }t                      |         } || fi |S )z8 Guess the correct OSPFv3 LSA class for a given payload    ry   rF   rH   r   r
  )r#   r   rO   r{   r   _OSPFv3_LSclassesr   r   r   s        r9   _OSPFv3_LSAGuessPayloadClassr    so     .C
1vv{{mD!AaC&))!,#''U33ii 3q??E??r:   rn   c            	           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 ZdS )OSPFv3_LinkzOSPFv3 LinkrZ   rE   rn   r   r   r   r|  
neighintidneighborr*  c                 
    d|fS r   r?   r   s     r9   r   zOSPFv3_Link.extract_padding8  r   r:   N)r<   r=   r>   r5   r   _OSPFv3_Router_LSA_typesr   r   r   r   r   r   r?   r:   r9   r  r  /  s        D =,DEE9Z++:h++8GQ''8L!,,7:y113K    r:   r  c                       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           g
ZdS )r  zOSPFv3 Router LSAr   rE   rZ   r  r   rc   r   ra   rt   r   rd   NrO   r  r   r'   )r   r*   r  r  r  c                     | j         dz
  S r\   r   rm   s    r9   r_   zOSPFv3_Router_LSA.<lambda>H  r#  r:   r   )r<   r=   r>   r5   r   r   r  r   r   r   r   rt  r   r  r   r?   r:   r9   r  r  <  s        D:eQ''!>&&/BB74++7:y119UJ//;x..:eT**:gq!-A-A-ABB%%''"?:r;/F/FH H H
IKKKr:   c                      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           g
ZdS )r  zOSPFv3 Network LSAr   rE   rZ   r  r   rc   r   ra   rt   r   rd   NrO   rn   r   r!  r   z0.0.0.1c                     | j         dz
  S r\   r   rm   s    r9   r_   zOSPFv3_Network_LSA.<lambda>W  r#  r:   r   )r<   r=   r>   r5   r   r   r  r   r   r   r   rt  r   r   r?   r:   r9   r  r  K  s        D:eQ''!>&&/BB74++7:y119UJ//;x..:eT**9Z++%%''!>,GGB	4J4J.F.FH H H
IKKKr:   c                       e Zd Z	 	 ddZdS )OSPFv3PrefixOptionsFieldprefixoptionsr   r'   Nc                 B    |g d}t          j        | ||||           d S )N)NULAr+   Pr1   r3   s        r9   r2   z!OSPFv3PrefixOptionsField.__init__\  s1    =+++ED$u=====r:   )r  r   r'   Nr;   r?   r:   r9   r  r  Z  s.        =>> > > > > >r:   r  c                   @   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           e             edd           edddd           gZdS )r  zOSPFv3 Inter Area Prefix LSAr   rE   rZ   r  r   rc   r   ra   rt   r   rd   NrO   rn   r   r   r   	prefixlenprefixr   r   r   	reserved22001:db8:0:42::/64rH   c                     | j         S rM   r  rm   s    r9   r_   z%OSPFv3_Inter_Area_Prefix_LSA.<lambda>q  
    gjgt r:   	wordbytesr   )r<   r=   r>   r5   r   r   r  r   r   r   r   r   r
   r  r   r   r?   r:   r9   r  r  c  s        )D:eQ''!>&&/BB74++7:y119UJ//;x..:eT**9Z++<"-- =dhCPPP++--:k1--!>(,@A[t[tuuuwKKKr:   c                      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   rE   rZ   r  r   rc   r   ra   rt   r   rd   NrO   rn   r   r  r   r   r*  )r<   r=   r>   r5   r   r   r  r   r   r   r   rt  r   r   r?   r:   r9   r  r  t  s        )D:eQ''!>&&/BB74++7:y119UJ//;x..:eT**9Z++%%''9[!,,<!,,78Y//1KKKr:   c                      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           e             edde           edddd            e edd          d             e ed!d          d"            e ed#d          d$           gZdS )%r  zOSPFv3 AS External LSAr   rE   rZ   r  r   rc   r   ra   rt   r   rd   NrO   r  r   r'   )Try  r*   r   r   r  r  r   r  	reflstyper  rH   c                     | j         S rM   r  rm   s    r9   r_   zOSPFv3_AS_External_LSA.<lambda>  r  r:   r  fwaddrz::c                     | j         dz  dk    S rk   r  rm   s    r9   r_   zOSPFv3_AS_External_LSA.<lambda>  s    #)VZJZ^bJb r:   r.  c                     | j         dz  dk    S )NrE   r  rm   s    r9   r_   zOSPFv3_AS_External_LSA.<lambda>  s    CIPTDTX\D\ r:   reflsidc                     | j         dk    S )Nr   )r  rm   s    r9   r_   zOSPFv3_AS_External_LSA.<lambda>  s    s}XYGY r:   )r<   r=   r>   r5   r   r   r  r   r   r   r   r   r
   r  r   r   r   r   r   r?   r:   r9   r  r    sZ       #D:eQ''!>&&/BB74++7:y119UJ//;x..:eT**:gq!___==<"-- =dhCPPP++--!>+q/BB!>(,@A[t[tuuu##HHXt$<$<>b>bcc##HHUA$6$68\8\]]##GGIq$9$9;Y;YZZ\KKKr:   c                       e Zd ZdZdZdS )r  zOSPFv3 Type 7 LSAr  Nr2  r?   r:   r9   r  r    s        DDDDr:   c            	       ~    e Zd ZdZ edddd           e             edd           edd	d
d           gZd Z	dS )OSPFv3_Prefix_ItemzOSPFv3 Link Prefix Itemr  Nr  r   r  r   r   r  rH   c                     | j         S rM   r  rm   s    r9   r_   zOSPFv3_Prefix_Item.<lambda>  r  r:   r  c                 
    d|fS r   r?   r   s     r9   r   z"OSPFv3_Prefix_Item.extract_padding  r   r:   )
r<   r=   r>   r5   r
   r  r   r   r   r   r?   r:   r9   r  r    s|        $D =dhCPPP++--:h++!>(,@A[t[tuuuwK
    r:   r  c                   *   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           edded           gZdS )r  zOSPFv3 Link LSAr   rE   rZ   r'   r   rc   r   ra   rt   r   rd   NrO   r   lladdrzfe80::prefixes
prefixlistrE  r  r   c                     | j         S rM   r  rm   s    r9   r_   zOSPFv3_Link_LSA.<lambda>  rc  r:   r  )r<   r=   r>   r5   r   r   r  r   r   r   r   rt  r   r
   r   r  r   r?   r:   r9   r  r    s        D:eQ''!>&&/BB74++7:y119UJ//;x..:eT**9VQ''%%''8Hh// =TLcRRR"?<7I.F.FH H HIKKKr:   c                   0   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           edde           edd           edd           edded           gZdS )r  zOSPFv3 Intra Area Prefix LSAr   rE   rZ   r  r   rc   r   ra   rt   r   rd   NrO   r  r  r   r  r  r   r  refadrouterc                     | j         S rM   r  rm   s    r9   r_   z%OSPFv3_Intra_Area_Prefix_LSA.<lambda>  rc  r:   r  )r<   r=   r>   r5   r   r   r  r   r   r   r
   r   r  r   r?   r:   r9   r  r    s        )D:eQ''!>&&/BB74++7:y119UJ//;x..:eT** =TLcRRR!>+q/BB79i007=)44"?<7I.F.FH H HIKKKr:   c                       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           gZdS )OSPFv3_DBDesczOSPFv3 Database Descriptionrn   r   r@  rA  r  rB  r'   )rC  rD  rE  rF  rK  rE   rL  Nc                     d S rM   r?   rm   s    r9   r_   zOSPFv3_DBDesc.<lambda>  rX  r:   c                      | j         j        dz
  S )N   r   rm   s    r9   r_   zOSPFv3_DBDesc.<lambda>  rZ  r:   r  )r<   r=   r>   r5   r   rt  r   r   r   r   r  r   r?   r:   r9   r  r    s        (D9Z++%%'':eT**9[!,,:iA/D/D/DEE8GQ''"?<~.=o/Q/QS S STKKKr:   r  c                   v    e Zd ZdZ edd           edde           edd           edd          gZd	 Z	d
S )OSPFv3_LSReq_Itemz OSPFv3 Link State Request (item)rn   r   rZ   r  r   ra   r   c                 
    d|fS r   r?   r   s     r9   r   z!OSPFv3_LSReq_Item.extract_padding  r   r:   N)
r<   r=   r>   r5   r   r   r  r   r   r   r?   r:   r9   r  r    sm        -D:j!,,!>&&/BB74++7:y113K
    r:   r  c                   8    e Zd ZdZ edded d           gZdS )OSPFv3_LSReqz%OSPFv3 Link State Request (container)rV  Nc                     d S rM   r?   rm   s    r9   r_   zOSPFv3_LSReq.<lambda>  rX  r:   c                      | j         j        dz
  S r   r   rm   s    r9   r_   zOSPFv3_LSReq.<lambda>  rZ  r:   r  )r<   r=   r>   r5   r   r  r   r?   r:   r9   r  r    sD        2D"?:t5F.=o/Q/QS S S TKKKr:   r  c                   T    e Zd ZdZ edddd           edg ed d 	          gZdS )
OSPFv3_LSUpdzOSPFv3 Link State Updater]  Nr^  r_  r`  c                     | j         S rM   rb  rm   s    r9   r_   zOSPFv3_LSUpd.<lambda>  s     r:   c                      | j         j        dz
  S r   r   rm   s    r9   r_   zOSPFv3_LSUpd.<lambda>  rZ  r:   r  )r<   r=   r>   r5   r
   r   r  r   r?   r:   r9   r  r    s[        %D =TtiPPP"?9b2N.E.E/Q/QS S STKKKr:   r  c                   8    e Zd ZdZ edded d           gZdS )OSPFv3_LSAckz!OSPFv3 Link State AcknowledgementrL  Nc                     d S rM   r?   rm   s    r9   r_   zOSPFv3_LSAck.<lambda>  rX  r:   c                      | j         j        dz
  S r   r   rm   s    r9   r_   zOSPFv3_LSAck.<lambda>  rZ  r:   r  )r<   r=   r>   r5   r   r  r   r?   r:   r9   r  r    sC        .D"?<~.=o/Q/QS S S TKKKr:   r  rq  )protorE   )rZ   rF   rG   rH   rI   z	224.0.0.5)nhzff02::5__main__)interactzOSPF extension %s)mydictmybanner)jrV   r{   scapy.packetr   r   scapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.layers.inetr   r   scapy.layers.inet6r   r   scapy.utilsr   r    r!   scapy.compatr"   scapy.configr#   EXT_VERSIONr%   r   rK   rX   r   r   r   r   r   r   r   rQ   r   r  r   r   r  r   r  r  r   r   r   r   r   r   r   r   r   r?  rR  rU  r\  rg  rn  rt  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  	bind_addrr<   
scapy.mainr  r   r?   r:   r9   <module>r     s     , , , , , , , ,N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N
 . - - - - - - - / / / / / / / / B B B B B B B B B B            > > > > >z > > > 	     X   * * * * *v * * *Z= = = = = = = =&" " " " "f " " "L L L L L? L L L[ [ [ [ [o [ [ [ .(* *   Z Z Z Z Z- Z Z Z
    6    !"%&$& & ((*,).2313 3< < <    6    #&#&( (         	 	 	    6   "P P P P Pl P P P$I I I I I| I I IU U U U U U U U$    -   U U U U U U U U*    .   
I I I I I I I I,    !;   
    9   
= = = = =& = = =$    f   T T T T T T T TU U U U U U U U       &       4> > > > > > > >
V 
V 
V 
V 
V6 
V 
V 
V $$,,'"!,. . 11;;50.;= =     V   
 
 
  %()(* * 
 
 
 
 
& 
 
 
I I I I I I I II I I I I I I I> > > > >z > > >w w w w w< w w w"1 1 1 1 1< 1 1 1 \ \ \ \ \\ \ \ \(    .   
       I I I I Il I I I"I I I I I< I I I"
T 
T 
T 
T 
TF 
T 
T 
T       T T T T T6 T T TT T T T T6 T T TT T T T T6 T T T B # # # # Hjq ) ) ) ) Hk * * * * Hjq ) ) ) ) Hjq ) ) ) ) Hjq ) ) ) )  h , , , D* $ $ $ $ J1 - - - - JA . . . . J1 - - - - J1 - - - - J1 - - - -  z9 - - - z######HGGII(;k(IJJJJJJ r:   