
    hh                    N    d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ ddl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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'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZI ddlJmKZKmLZLmMZMmNZNmOZOmPZP ddlQmRZRmSZSmTZT ddlUmVZVmWZWmXZXmYZY ddlZm[Z[ ddl\m]Z]m^Z^ ddl_m`Z`maZa ddlbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZl ddlmmnZnmoZo ddlpmqZq ejr        s ejs        d           eted          sde_u         eted          sde_v        ejw        ddlxZyejz        {                    dd           ej|        j}        dOd             Z~ej|        j}        dPd!            Zi dd"dd#d$d%d&d'dd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>Zd?d#d%d'd@dAdBdCdDdEdFdGZ G dH dIe7          Z G dJ dK          Z G dL d(eeSeD          Z G dM dNeCe          ZdO Zej                            eLee            G dP dQe          Z G dR dSeS          ZdT ZdU Z G dV dWeeS          ZdXdYdZd[d\d]d^d_Z G d` dae(          Z G db dceS          Z G dd dXeS          Z G de dYeS          Z G df dgeS          Z G dh dieS          Z G dj dkeS          Z G dl dmeS          ZeeeeeednZ G do dpe3          Z G dq dre)          Z G ds d?e          Z G dt dFe          Z G du d@e          Zdvdwdxdydzd{Z G d| d}eS          Z G d~ de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d dAe          Zd Zd Zi ddddddddddddddddd;dddddd=dddddddddddddddddddddd
Zi ddddddddddddddddd;dddddd=ddddddddddddddddddddZi ddddddddddddddēddœddƓddǓd;dȓddɓddʓd=d˓dd̓dd͓ddϓi ddГddѓddғddӓddԓdd֓ddؓddړddܓddޓddddddddddddddZ G d deS          Z G d de          Z G d dDe          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d deS          Z G d de          Z G d  de          Z G d de          Z G d de          Zi ddddddddddd$d	d
dddddddddddddddddddd&ddddd d!d"d#d$d%d&	Zi dd'dd(dd)dd*dd+d$d,d
d-dd.dd/dd0d&d1d2d3d4d5d6d7dd8d9d:d;d<d=d>d?d@ZdAdBdCdDdEZ G dF dG          Z G dH dIe9          Z G dJ dKeeS          Z G dL d'eeS          Z G dM d(eĦ          Z G dN d)eeS          Z G dO dPe2          Z G dQ d*eeS          Z G dR d+eeS          Z G dS d,eeS          Z G dT d-eeS          Z G dU d.eeS          Z G dV d1eeS          Z G dW d3eeS          ZΐdXdYdZd[d\d]d^d_d`Z G da d5eeS          Z G db d7eeS          Z G dc dde.          Z G de d8eeS          Z G df d:eeS          Z G dg d<eeS          Z G dh die9          Z G dj d=eeS          Z G dk d>eeS          Z G dl dme.          Z G dn d?eeS          Z G do dee          Z G dp dee          Z G dq deeeS          Z G dr deeeS          Z G ds deeeS          Z G dt d/eeS          Z G du d0e          Z G dv dee          Z G dw dee          Zdxdydzd{d|Z G d} d~          Z G d d          Z G d de8          Zej|        j}        d             Zd Zd Z G d de7          Z G d de(          ZddddZ G d dee          Z G d de          Z G d de          Z G d de          ZddddZdddddddZ G d de7          Z G d deee          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Zd ZdddddddZ G d de          Z G d de          Z G d de          Z G d de          Z  G d dee          ZddddddddÐdĐdŐdƐdǐdȐdɐdʐd˜Z G d̄ deS          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ބ de/          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i dedededededed$ed
e	de
dedededededededeZddddddddddddZi dddddddddd ddd;dddddd=ddddddΐddd	dd
dddddddddddddZ G d deS          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%e5          Z G d& d'e          Z  G d( d)e          Z!d*d+d,Z" G d- d.e          Z#eeeeee e!e#d`Z$ G d/ d0e          Z% G d1 d2eG          Z&ej|        j}        d3dd4 eo            dddfd5            Z'esdd6lZm(Z(  G d7 d8e(          Z)dQd:Z* G d; d<e[          Z+	 	 dRd=Z,	 	 dRd>Z-	 	 dRd?Z.	 	 dSdAZ/	 	 	 dTdDZ0	 	 	 dUdEZ1	 	 dVdFZ2dG Z3dH Z4 e4e            e4e            e4e           ej5        }                    e e           ej5        6                    ee           ej7        }                    dIe           ej7        }                    ee           ej7        }                    ee           ej7        6                    ee            eReLedJK            eReKedJL            eReMedJL            eReOedJM           er eReNedK           n eReNeej8        K            eReeFej9        N            eReeIej:        N            eReeEej9        N            eReeHej:        N            eReCeeju        L            eReeeju        N            eReeCejv        N            eReeMej;        N           dS (W  z
IPv6 (Internet Protocol v6).
    )md5N)gmtimestrftime)get_if_hwaddr)AS_resolver_riswhois)Gen	_ScopedIP)chborbraw	plain_strbytes_encode)WINDOWS)conf)DLT_IPV6DLT_RAWDLT_RAW_ALT	ETHER_ANY	ETH_P_ALL
ETH_P_IPV6MTU)log_runtimewarning)BitEnumFieldBitFieldByteEnumField	ByteFieldDestIP6FieldFieldLenField
FlagsFieldIntFieldIP6Field	LongFieldMACFieldMayEndPacketLenFieldPacketListFieldShortEnumField
ShortFieldSourceIP6FieldStrFieldStrFixedLenFieldStrLenFieldX3BytesField	XBitField
XByteField	XIntFieldXShortField)
_ICMPExtensionField_ICMPExtensionPadField_ICMP_extpad_post_dissectionIPIPToolsTCPTCPerrorTracerouteResultUDPUDPerror)CookedLinuxEtherGRELoopbackSNAPSourceMACField)bind_layersPacketRaw)sendpsniffsrsrp1)SuperSocket)checksumstrxor)	inet_pton	inet_ntop)
in6_getnsmain6_getnsmacin6_isaddr6to4in6_isaddrllallnodesin6_isaddrllallserversin6_isaddrTeredoin6_isllsnmaddrin6_ismaddrNet6teredoAddrExtractInfo)RandInt	RandShort)Optionalz$can't use AF_INET6, IPv6 is disabledIPPROTO_IPV6)   IPPROTO_IPIP   in6_neighborx      c                    t          t          t          j        |                     }t	          t          j        |          }t          |          }t          |          }t          ||          t          ||d          z  }	|	t          |           z  }	|	t          |          z  }	t          |	t          ||d|          }
|
S )a  Sends and receive an ICMPv6 Neighbor Solicitation message

    This function sends an ICMPv6 Neighbor Solicitation message
    to get the MAC address of the neighbor with specified IPv6 address address.

    'src' address is used as the source IPv6 address of the message. Message
    is sent on 'iface'. The source MAC address is retrieved accordingly.

    By default, timeout waiting for an answer is 1 second.

    If no answer is gathered, None is returned. Else, the answer is
    returned (ethernet frame).
    dstsrc   )re   rf   hlimtgtlladdrr   )typeifacetimeoutverbosechainCC)rO   rM   socketAF_INET6rN   rP   r   r>   IPv6ICMPv6ND_NSICMPv6NDOptSrcLLAddrrI   r   )addrrf   rn   ro   rq   nsmaddmsmpress              V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/inet6.pyneighsolr   w   s      y$7788D&/4((A	d		B	u		B""# > > >>A			A	R	(	(	((A
qz     C J    c                 $   t          | t                    rt          |           } t          |           r)t	          t          t          j        |                     }|S t          j	        
                    |           \  }}}|t          j        k    rdS |dk    r|} t          j        j                            |           }|r|S t          | |||          }|9t           |v r|t                    j        }n|j        }|t          j        j        | <   |S dS )a  
    Returns the MAC address of the next hop used to reach a given IPv6 address.

    neighborCache.get() method is used on instantiated neighbor cache.
    Resolution mechanism is described in associated doc string.

    (chainCC parameter value ends up being passed to sending function
     used to perform the resolution, if needed)

    .. seealso:: :func:`~scapy.layers.l2.getmacbyip` for IPv4.
    zff:ff:ff:ff:ff:ff::)rq   N)
isinstancerW   strrV   rP   rM   rr   rs   r   route6routeloopback_namenetcacher`   getr   ICMPv6NDOptDstLLAddrrl   rf   )ip6rq   maciffanhr}   s          r~   getmacbyip6r      s	    #t #hh 3 9V_c::;;
""3''JCB
d   ""	Tzz
-
$
(
(
-
-C
 

33
0
0
0C
3&&*+2CC'C*-"3'
4r   zHop-by-Hop Option Headerr6      r8      r;   rt   +   zRouting Header,   zFragment Header/   r?   2   z
ESP Header3   z	AH Header:   ICMPv6;   zNo Next Header<   zDestination Option Headerp   VRRP   SCTP   zMobility HeaderIPv6ExtHdrHopByHopIPv6ExtHdrRoutingIPv6ExtHdrFragmentESPAHICMPv6UnknownrE   IPv6ExtHdrDestOpt)r   r_   r   r   r   r   r   r   r   r   r   c                   @    e Zd ZddgZdZddZd Zd Zd Zd	 Z	d
 Z
dS )IP6ListField
count_fromlength_fromrb   Nc                 V    |g }t          j        | ||           || _        || _        d S N)r+   __init__r   r   )selfnamedefaultr   r   s        r~   r   zIP6ListField.__init__   s6    ?G$g...$&r   c                 &    dt          |          z  S N   lenr   pktis      r~   i2lenzIP6ListField.i2len   s    CFF{r   c                 N    t          |t                    rt          |          S dS Nr   )r   listr   r   s      r~   i2countzIP6ListField.i2count   s$    a 	q66Mqr   c                 h   d x}}| j         |                      |          }n| j        |                     |          }g }d}|}||d |         ||d          }}|rQ||dk    rnH|dz  }t          t          j        |d d                   }|                    |           |dd          }|Q||z   |fS )Nr   r   rb   r   )r   r   rN   rr   rs   append)	r   r   sctmp_lenlstretremainrw   s	            r~   getfieldzIP6ListField.getfield   s    G'&&s++GG_($$AHWH+q{CF 	!}66QV_fSbSk::DJJtBCC[F  	! |S  r   c                    d}|D ]}	 t          t          j        |          }n\# t          $ rO t          j        |d t          j                  d         d         d         }t          t          j        |          }Y nw xY w||z  }|S )Nr   r   )rM   rr   rs   	Exceptiongetaddrinfor   r   xr   ys        r~   i2mzIP6ListField.i2m  s     	 	A2foq11 2 2 2&q$@@CBGJfoq112 FAAs   #AA<;A<c                 x    g }|dS |D ]}|                     d|z             dd                    |          z  S )N[]z%s[ %s ], )r   joinr   s        r~   i2reprzIP6ListField.i2repr  sN    94 	 	AHHTAX499Q<<((r   )NN)__name__
__module____qualname__	__slots__islistr   r   r   r   r   r    r   r~   r   r      s        }-IF' ' ' '    
! ! !,	 	 	) ) ) ) )r   r   c                       e Zd ZdZd ZdS )_IPv6GuessPayloadz:Dummy class that implements guess_payload_class() for IPv6c                    | j         dk    rt          |d                   }t          |          dk    r|dk    s|dk    rt          |          S t          |          t                              |t          d                    k    r@|dk    rt          |          dk    rt          S t                              |t                    S t          S | j         d	k    rFt          |          d
k    r3t                              t          |d                   t                    S | j         dk    r t          |d                   dk    rt          S t                              | j         t                    S )Nr   r            inf      r      r   r_   )r   r   r   _niquery_guessericmp6typesminhdrlenr   floatICMPv6MLQuery2icmp6typesclsrE   _mip6_mhtype2clsMIP6MH_GenericIPv6ExtHdrSegmentRouting	ipv6nhcls)r   r|   ts      r~   default_payload_classz'_IPv6GuessPayload.default_payload_class(  s   7b==AaD		A1vvzzqCxx188'***1vv,00E%LLAAAA88A"))$((C000JW^^A

#''AaD		>BBBW]]s1Q4yyA~~++}}TWc***r   N)r   r   r   r   r   r   r   r~   r   r   %  s(        GD+ + + + +r   r   c                       e Zd Zd Z eddd           eddd           eddd           ed	d
           edde           edd           e	d           e
dd          gZd Zd Zd Zd Zd Zd Zd
S )rt   versionr   r_   tcr      fl   plenNr   r   rh   @   rf   re   ::1c                    | j         }d}t          |t          t          f          r|j        }t          |t
          t          f          rt          t          |                    }t          j
                            ||          S )zUsed to select the L2 addressN)dev)re   r   rW   r	   scoper   r   nextiterr   r   r   )r   re   r   s      r~   r   z
IPv6.routeE  sn    hcD),-- 	IEcC;'' 	"tCyy//C{  % 000r   c                 0    d| j         | j        | j        fz  S )Nz%s > %s (%i))rf   re   r   r   s    r~   	mysummaryzIPv6.mysummaryO  s    48TW ===r   c                     ||z  }| j         =t          |          dz
  }|d d         t          j        d|          z   |dd          z   }|S )N(   r_   !Hr   )r   r   structpack)r   r|   payr   s       r~   
post_buildzIPv6.post_buildR  sR    	S9!ffrkG"1"D'222QqrrU:Ar   c                    | j         dk    r| j        dk    rt          |          dk    rt          |d                   }d|dz  z   }d}d}d|z  dz   }|t          |          k    rht          ||                   }|dk    r-t	          j        d||dz   |dz   dz                      d         }n d|z  dz   }|dz  }|t          |          k    h|t          j        d	           d}||z   }n| j         }|d|         ||d         fS )
zExtract the IPv6 payloadr   r   rb   Nr_   r      Iz!Scapy did not find a Jumbo option)r   r   r   r   r  unpackr   info)r   datahbh_len	jumbo_lenidxoffsetopt_typer   s           r~   extract_paddingzIPv6.extract_paddingY  s0    9>>dglls4yyA~~$q'llG'A+oG
 ICWq[FCII%%tF|,,t## &c4
6A:PQ>8Q3R S STU VIS1q CII%%   !DEEE		)GGiGHWH~tGHH~--r   c                    | j         dk    rt          | j        t                    rp| j        j        dk     r| j        j                                        S | j        j        dv r4t          j        d| j                   | j                                        z   S t          j	        s"| j         dv r| j                                        S | j         }| j
        }| j        }| j         dk    rt          | j        t                    r| j        j         }	 | j        d         }n# t          $ r d}Y nw xY w	 t          t           j        |          }| j        D ],}t          t           j        |          }t%          ||          }-t'          t           j        |          }| j         dk    r@t          | j        t(                    r&	 | j        d
         }n# t          $ r
 | j
        }Y nw xY w| j         dk    r&t          | j        t*                    r| j        j         }| j         d
k    r&t          | j        t,                    r| j        j         }| j         dk    rWt          | j        t.                    r=d }| j        j        D ]}t          |t2                    r|}|r|j        }| j        j         }t          j        rt          j        rt;          |          stt          t           j        |          }t          t           j        |          }t%          ||          t          j        d|          z   | j                                        z   S t          j        d|          | j                                        z   S )Nr      )      r            Br_   r]   r   r   r   rb   r   r   r   )r   r   payload_ICMPv6rm   hashretr  r  r   checkIPinIPre   rf   r   	addresses
IndexErrorrM   rr   rs   rL   rN   r   r   r   r   optionsHAOhoa
checkIPsrccheckIPaddrrV   )r   r   sdssr   foundhaoos          r~   r   zIPv6.hashrety  s   7b==Zg>>=| 3&&|+33555,#'EEE{3004<3G3G3I3III 	*DGw$6$6<'')))WXX7b==Z6GHH= B^B'   4v33 ' 'A!&/155AABBv337b==Z6NOO=^A&   X 7b==Z6HII=B7a<<Jt|5GHH<B7b==Z6GHH=H\) ! !a%% ! H "\B? 	At/ 	AB 	A6?B//B6?B//B"b>>FKR$8$884<;O;O;Q;QQQ;sB''$,*>*>*@*@@@s$   D D('D(:G GGc                    t           j        s| j        dv r| j                            |          S t          |t                    r#|j        dv r|                     |j                  S t          |t                    r#|j        dv r|                     |j                  S t          |t                    sdS t           j	        rt          t          j        | j                  }t          t          j        |j                  }t          t          j        |j                  }t          |j                  rt          | j                  rO||k    s(t!          | j                  r3t#          |j                  r| j                            |j                  S dS ||k    r| j                            |j                  S dS ||k    rdS | j        dk    rIt          | j        t$                    r/| j        j        dk     r| j        j                            |          S |j        dk    r9t          |j        t(                    r| j                            |j                  S |j        dk    r>t          |j        t*                    r$| j                            |j        j                  S |j        dk    r>t          |j        t,                    r$| j                            |j        j                  S |j        dk    r>t          |j        t.                    r$| j                            |j        j                  S |j        dk    r>t          |j        t0                    r$| j                            |j        j                  S | j        dk    r>t          | j        t0                    r$| j        j                            |j                  S | j        |j        k    rdS | j                            |j                  S )	Nr  Fr   r  r   r   r   r   )r   r!  r   r  answersr   rt   r6   protor(  rM   rr   rs   re   rf   rV   rR   rS   r  rm   r   r   r   r   r   )r   otherr)  osods        r~   r.  zIPv6.answers  sN    	3w'!!|++E222%&& 358w+>+>||EM222%$$ 3)?)?||EM222%&& 	5 	6?DH55B6?EI66B6?EI66B
 59%% 
tx(( !r1$(;; "@VW\W`@a@a "#|33EMBBB 5"HH<//>>>u((u7b==Zg>>=4<CTWZCZCZ <'//666X]]z%-9KLL]<''666X^^
5=:L M M^<''(=>>>X^^
5=:K L L^<''(=>>>X^^
5=:R S S^<''(=>>>X^^
5=:K L L^<''(=>>>W]]z$,8IJJ]<'//>>>58##u<''666r   )r   r   r   r   r   r)   r   ipv6nhr   r*   r   fields_descr   r  r  r  r   r.  r   r   r~   rt   rt   :  s        D8Iq!,,8D!Q''8D!R((:fd++ =r6229VR((!>%((<u--/K1 1 1> > >  . . .@:A :A :Ax57 57 57 57 57r   c                   .    e Zd ZdZdZedd            ZdS )IPv46zw
    This class implements a dispatcher that is used to detect the IP version
    while parsing Raw IP pcap files.
    zIPv4/6Nc                     |r$t          |d                   dz	  dk    rt          S n |                    d          dk    rt          S t          S )Nr   r_   r   r   )r   rt   r   r6   )cls_pkt_kargss       r~   dispatch_hookzIPv46.dispatch_hook  sO     	47||q A%% &YYy!!Q&&K	r   r   )r   r   r   __doc__r   classmethodr<  r   r   r~   r6  r6    sC          D   [  r   r6  c                 *    t          |j                  S )zH
    Resolves the default L2 destination address when IPv6 is used.
    )r   re   )l2l3s     r~   inet6_register_l3rB    s     rvr   c                       e Zd ZdZd Zd ZdS )IPerror6zIPv6 in ICMPv6c                    t          |t                    sdS t          t          j        | j                  }t          t          j        | j                  }t          t          j        |j                  }t          t          j        |j                  }t          | j        t                    r/| j        j	        dk     r| j
        }|3t          |t                    r|j
        }|t          |t                    |j
        }d}|Jt          |t                    r5t          |t                    rd}|j
        }|t          |t                    5||k    r||k    s
||k    rz|rwt          |t                    rt          |t                    r|j        |j        k    r|j        }	|j        }
|j        }|j        }|j        }|j        }g |_        d|_        d|_        g |_        d|_        d|_        t#          |          }t#          |          }t%          t'          |          t'          |                    }|d |         |d |         k    }|	|_        |
|_        ||_        ||_        ||_        ||_        |S t#          |          }t#          |          }t%          t'          |          t'          |                    }|d |         |d |         k    S dS )NFr  Tr   )r   rt   rM   rr   rs   re   rf   
underlayerr  rm   r  _IPv6ExtHdrr   r8   r$  chksumdataofsr   minr   )r   r0  r)  r*  r2  r1  selfupotheruprequest_has_rhold_otherup_optsold_otherup_cksumold_otherup_dataofsold_selfup_optsold_selfup_cksumold_selfup_dataofss1s2r   r}   s                      r~   r.  zIPerror6.answers  s   %&& 	5v11v11v	22v	22 dow// ;	4DO4H34N4N \F$FK)H)H$ $FK)H)H$ mG"N%*Wk*J*J%g'899 *%)N!/ %*Wk*J*J%
 rbBhh2XX.X vs++ "w,,"'/99 (/$(/%*1/'&,nO'-}$)/& ')GO%&GN&'GO%'FN$%FM%&FN VBWB!#b''3r7733GXgX,"XgX,6C '7GO%6GN&9GO%4FN$4FM%7FNJ[[\\c"ggs2ww//(7(|r(7(|33ur   c                 *    t          j        |           S r   )rD   r  r   s    r~   r  zIPerror6.mysummaryS  s    %%%r   N)r   r   r   r   r.  r  r   r   r~   rD  rD    s;        DF F FP& & & & &r   rD  c                       e Zd ZdZ edd           edd           edd           eddd	           ed
d          gZdS )
PseudoIPv6zPseudo IPv6 Headerrf   r   re   uplenNzeror      r   )	r   r   r   r   r"   r!   r   r   r4  r   r   r~   rX  rX  ]  sg        D8E4((8E4((8GT**8FAr**9T1%%	'KKKr   rX  c                 .   t                      }| |_        d}d}d}|0t          |t                    st          |t                    r9|j        dk    r.t          |j                  dk    r|dk    r|j        d         }d}nt          |t                    r9|j        dk    r.t          |j                  dk    r|dk    r|j        d         }d}n_t          |t                    rJt          |j
                  dk    r2t          |j
        d         t                    r|j
        d         j        }|j        }|t          |t                    |t          d           dS |r||_        n|j        |_        |r||_        n|j        |_        ||_        |S )a  
    Build an PseudoIPv6 instance as specified in RFC 2460 8.1

    This function operates by filling a pseudo header class instance
    (PseudoIPv6) with:
    - Next Header value
    - the address of _final_ destination (if some Routing Header with non
    segleft field is present in underlayer classes, last address is used.)
    - the address of _real_ source (basically the source address of an
    IPv6 class instance available in the underlayer or the source address
    in HAO option if some Destination Option header found in underlayer
    includes this option).
    - the length is the length of provided payload string ('p')

    :param nh: value of upper layer protocol
    :param u: upper layer instance (TCP, UDP, ICMPv6*, ). Instance must be
        provided with all under layers (IPv6 and all extension headers,
        for example)
    :param plen: the length of the upper layer and payload
    r   Nr   rb   z5No IPv6 underlayer to compute checksum. Leaving null.)rX  r   r   rt   r   segleftr   r"  r   r   r$  r%  r&  rF  r   rf   re   rY  )r   ur   ph6rthdrhahdrfinal_dest_addr_founds          r~   in6_pseudoheaderrc  f  s   , ,,CCFEE
-
1d 3 3-q+,, 	%INNs1;//144%**KOE$%!!455 	%i1nnQ[!1!1Q!6!6#q((KNE$%!!-.. 	%C	NNa4G4G1s++ 5HIaL$EL -
1d 3 3- 	yGHHHt % %CIJr   c                     t          | |t          |                    }|dS t          |          }t          ||z             S )ax  
    As Specified in RFC 2460 - 8.1 Upper-Layer Checksums

    See also `.in6_pseudoheader`

    :param nh: value of upper layer protocol
    :param u: upper layer instance (TCP, UDP, ICMPv6*, ). Instance must be
        provided with all under layers (IPv6 and all extension headers,
        for example)
    :param p: the payload of the upper layer provided as a string
    Nr   )rc  r   r   rK   )r   r^  r|   r_  ph6ss        r~   
in6_chksumrf    sB     2q#a&&
)
)C
{qs88DD1Hr   c                       e Zd ZdZeegZdS )rG  zAbstract IPv6 Option HeaderN)r   r   r   r   rt   rD  
aliastypesr   r   r~   rG  rG    s        (D!JJJr   rG  Pad1PadNzTunnel Encapsulation LimitRouter AlertzQuick-StartJumbo PayloadHome Address Option)r   rb   r_      r   r
     c                   0    e Zd ZdZdddddZddd	Zd
 ZdS )_OTypeFielda  
    Modified BytEnumField that displays information regarding the IPv6 option
    based on its option type value (What should be done by nodes that process
    the option if they do not understand it ...)

    It is used by Jumbo, Pad1, PadN, RouterAlert, HAO options
    z00: skipz01: discardz10: discard+ICMPz11: discard+ICMP not mcast)r   r   r     z0: Don't change en-routez1: May change en-route)r       c                     | j                             |t          |                    }| j        |dz           }| j        |dz           }|d|d|dS )Nrr  rs  z [r   ])i2sr   reprpolenroutechange)r   r   r   r   polstrenroutechangestrs         r~   r   z_OTypeField.i2repr  s[    HLLDGG$$1t8%-q4x9 !666+;+;+;<<r   N)r   r   r   r=  rx  ry  r   r   r   r~   rq  rq    s[          #-/ /C
 635 5M= = = = =r   rq  c                       e Zd ZdZ edde           edddd           edd	d
           gZd Z	e
dd            Zd ZdS )HBHOptUnknownzScapy6 Unknown Optionotyperb   optlenNoptdatar  	length_offmt c                     | j         S r   r  r   s    r~   <lambda>zHBHOptUnknown.<lambda>      sz r   r   c                     dS )a  
        As specified in section 4.2 of RFC 2460, every options has
        an alignment requirement usually expressed xn+y, meaning
        the Option Type must appear at an integer multiple of x octets
        from the start of the header, plus y octets.

        That function is provided the current position from the
        start of the header and returns required padding length.
        r   r   r   curposs     r~   alignment_deltazHBHOptUnknown.alignment_delta  s	     qr   c                 `    |r+t          |d                   }|t          v rt          |         S | S r   )r   
_hbhoptcls)r8  r9  argsr;  r,  s        r~   r<  zHBHOptUnknown.dispatch_hook  s1     	%DGAJ!!}$
r   c                 
    d|fS Nr   r   r   r|   s     r~   r  zHBHOptUnknown.extract_padding      Avr   r   )r   r   r   r   rq  _hbhoptsr   r-   r4  r  r>  r<  r  r   r   r~   r}  r}    s        "D;wh77 =49#NNN;y"+A+AC C CDK

 
 
    [    r   r}  c                   :    e Zd Zd Z edde          gZd Zd ZdS )ri  r~  r   c                     dS r   r   r  s     r~   r  zPad1.alignment_delta      qr   c                 
    d|fS r  r   r  s     r~   r  zPad1.extract_padding  r  r   N)	r   r   r   r   rq  r  r4  r  r  r   r   r~   ri  ri     sM        D;wh778K      r   c                   r    e Zd Zd Z edde           edddd           eddd	 
          gZd Z	d Z
dS )rj  r~  rb   r  Nr  r  r  r  c                     | j         S r   r  r  s    r~   r  zPadN.<lambda>  r  r   r  c                     dS r   r   r  s     r~   r  zPadN.alignment_delta  r  r   c                 
    d|fS r  r   r  s     r~   r  zPadN.extract_padding  r  r   )r   r   r   r   rq  r  r   r-   r4  r  r  r   r   r~   rj  rj    s        D;wh77 =49#NNN;y"+A+AC C CDK
      r   c                   v    e Zd ZdZ edde           edd           edddd	d
dddd          gZd Z	d Z
dS )RouterAlertrk  r~  rn  r  r   valueNzDatagram contains a MLD messagezDatagram contains RSVP messagez+Datagram contains an Active Network messagezNSIS NATFW NSLPzMPLS OAMReserved)r   rb   r   D   E     c                 <    d}d}|||z
  |z   dz
  |z  z  |z   |z
  }|S Nr   r   rb   r   r   r  r   r   deltas        r~   r  zRouterAlert.alignment_delta)  7    fqj1nq(Q./!3f<r   c                 
    d|fS r  r   r  s     r~   r  zRouterAlert.extract_padding/  r  r   )r   r   r   r   rq  r  r   r(   r4  r  r  r   r   r~   r  r    s        D;wh779Xq))!>'4&G&F&S'8'1*4#6 #67 78K      r   r  c                       e Zd ZdZ edde           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 Zd ZdS )	RplOptionz
RPL Optionr~  c   r  r_   Downr   rb   	RankErrorForwardErrorunusedrn  RplInstanceId
SenderRankc                 <    d}d}|||z
  |z   dz
  |z  z  |z   |z
  }|S r  r   r  s        r~   r  zRplOption.alignment_delta>  r  r   c                 
    d|fS r  r   r  s     r~   r  zRplOption.extract_paddingD  r  r   N)r   r   r   r   rq  r  r   r   r0   r2   r4  r  r  r   r   r~   r  r  3  s        D;wh779Xq))8FAq))8KA..8NAq118Ha++:oq11;|Q//1K      r   r  c                   f    e Zd ZdZ edde           edd           edd          gZd Z	d	 Z
dS )
Jumborl  r~  r
  r  r_   	jumboplenNc                 <    d}d}|||z
  |z   dz
  |z  z  |z   |z
  }|S )Nr_   r   rb   r   r  s        r~   r  zJumbo.alignment_deltaN  r  r   c                 
    d|fS r  r   r  s     r~   r  zJumbo.extract_paddingT  r  r   )r   r   r   r   rq  r  r   r!   r4  r  r  r   r   r~   r  r  H  sm        D;wh779Xq))8K..0K      r   r  c                   f    e Zd ZdZ edde           edd           edd          gZd Z	d	 Z
d
S )r%  rm  r~  ro  r  r   r&  r   c                 <    d}d}|||z
  |z   dz
  |z  z  |z   |z
  }|S )Nr   r   rb   r   r  s        r~   r  zHAO.alignment_delta^  r  r   c                 
    d|fS r  r   r  s     r~   r  zHAO.extract_paddingd  r  r   N)r   r   r   r   rq  r  r   r"   r4  r  r  r   r   r~   r%  r%  X  sm         D;wh779Xr**8E4((*K      r   r%  )r   rb   rn  r  r
  ro  c                   ,    e Zd ZdgZd Zd Zd Zd ZdS )_OptionsFieldr  c                 D    || _         t          j        | |||g|R i | d S r   )r  r'   r   )r   r   r   r8  r  r  r;  s          r~   r   z_OptionsField.__init__u  s6     tWcJDJJJEJJJJJr   c                 H    t          |                     ||                    S r   r   r   r   s      r~   r   z_OptionsField.i2leny      488C##$$$r   c           	         d }	 t          |d          }n# t          $ r d}Y nw xY w|s(d                    t          t          |                    S | j        }d}|D ]}|                    |          }||z  }|dk    r|t          t                                z  }n,|dk    r&|t          t          d|dz
  z                      z  }t          |          }|t          |          z  }||z  }|dz  }|dk    r|S d|z
  }|dk    r|t          t                                z  }n,|dk    r&|t          t          d|dz
  z                      z  }|S )	Nautopadrb   r   r       r   )r  r   )getattrr   r   mapbytesr  r  r   ri  rj  r   )	r   r   r   r  r  r   r|   ry   pstrs	            r~   r   z_OptionsField.i2m|  s   	c9--GG 	 	 	GGG	  	+88CqMM*** 		 		A!!&))AaKFAvvS[[ aSgQ&7888999q66Dc$iiFIAA QJ66HE66TVVAA!VVT'QU"3444555As    $$c                 4    ||                      ||          z   S r   r   r   r   r   vals       r~   addfieldz_OptionsField.addfield      488C%%%%r   N)r   r   r   r   r   r   r   r  r   r   r~   r  r  r  s[        
IK K K% % %" " "H& & & & &r   r  c                        e Zd Zd Zd Zd ZdS )_PhantomAutoPadFieldc                     |S r   r   r  s       r~   r  z_PhantomAutoPadField.addfield  s    r   c                 
    |dfS Nrb   r   r   r   r   s      r~   r   z_PhantomAutoPadField.getfield  s    !tr   c                     |rdS dS )NOnOffr   r   r   r   s      r~   r   z_PhantomAutoPadField.i2repr  s     	4ur   N)r   r   r   r  r   r   r   r   r~   r  r    sA                r   r  c            
           e Zd ZdZ edde           eddddd 	           ed
d           edg e	dd           gZ
eddiiZdS )r   z1IPv6 Extension Header - Hop-by-Hop Options Headerr   r   r   Nr$  r  c                     |dz   dz   dz  dz
  S Nr      r   rb   r   r   r   s     r~   r  zIPv6ExtHdrHopByHop.<lambda>      A	a7G!7K r   r  r  adjustr  rb   r   c                 "    d| j         dz   z  dz
  S Nr   rb   r   r   r  s    r~   r  zIPv6ExtHdrHopByHop.<lambda>      !sw{:Kq9P r   r  r   r   r   r   r   r   r3  r   r  r  r}  r4  rt   overload_fieldsr   r   r~   r   r     s        >D =r622 =	s(K(KM M M''	155 =Bq-P-PR R R	SK dAY'OOOr   c            
           e Zd ZdZ edde           eddddd 	           ed
d           edg e	dd           gZ
eddiiZdS )r   z2IPv6 Extension Header - Destination Options Headerr   r   r   Nr$  r  c                     |dz   dz   dz  dz
  S r  r   r  s     r~   r  zIPv6ExtHdrDestOpt.<lambda>  r  r   r  r  rb   r   c                 "    d| j         dz   z  dz
  S r  r   r  s    r~   r  zIPv6ExtHdrDestOpt.<lambda>  r  r   r  r   r  r   r   r~   r   r     s        ?D =r622 =	s(K(KM M M''	155 =Bq-P-PR R R	SK dBZ(OOOr   c            
           e Zd ZdZ edde           eddddd 	           ed
d           edd           eddd           e	dg d           gZ
eddiiZd ZdS )r   zIPv6 Option Header Routingr   r   r   Nr"  r  c                     d|z  S Nr   r   r  s     r~   r  zIPv6ExtHdrRouting.<lambda>  s
    a!e r   count_ofr  r  rm   r   r]  reservedrs  c                     d| j         z  S Nr   r   r  s    r~   r  zIPv6ExtHdrRouting.<lambda>  s    CG r   r  r   c                     | j         =|d d         t          j        dt          | j                            z   |dd          z   }t
                              | ||          S )Nr   r  r_   )r]  r  r  r   r"  rG  r  )r   r   r  s      r~   r  zIPv6ExtHdrRouting.post_build  sW    <bqb'FKS-@-@AAACGKC%%dC555r   )r   r   r   r   r   r3  r   r   r   r   r4  rt   r  r  r   r   r~   r   r     s        'D =r622 ={(;(;= = =9VQ''9Y--8J2..<R,C,CE E EFK dBZ(O6 6 6 6 6r   zPad1 TLVzIngress Node TLVzEgress Node TLVzPadN TLVzHMAC TLV)r   rb   r   r_   rn  c                       e Zd ZdZ edde           edd           eddd 	          gZd
 Z	i Z
ed             Zedd            ZdS )IPv6ExtHdrSegmentRoutingTLVz0IPv6 Option Header Segment Routing - Generic TLVrm   Nr   r   r  r  c                     | j         S r   r   r  s    r~   r  z$IPv6ExtHdrSegmentRoutingTLV.<lambda>  s    CG r   r  c                 
    d|fS r  r   r  s     r~   r  z+IPv6ExtHdrSegmentRoutingTLV.extract_padding  r  r   c                 .    | | j         | j        j        <   d S r   )registered_sr_tlvrm   r   )r8  s    r~   register_variantz,IPv6ExtHdrSegmentRoutingTLV.register_variant  s    25ch.///r   c                 n    |r2t          |d d                   }| j                            ||           S | S r  )ordr  r   )r8  r   r  r;  tmp_types        r~   r<  z)IPv6ExtHdrSegmentRoutingTLV.dispatch_hook  s;     	<3rr7||H(,,Xs;;;
r   r   )r   r   r   r   r   _segment_routing_header_tlvsr   r-   r4  r  r  r>  r  r<  r   r   r~   r  r    s        =D =/KLL9UA&&;w8K8KLLLNK   6 6 [6    [  r   r  c                       e Zd ZdZ edde           edd           edd           edd           ed	d
          gZdS )&IPv6ExtHdrSegmentRoutingTLVIngressNodez5IPv6 Option Header Segment Routing - Ingress Node TLVrm   rb   r      r  r   flagsingress_noder   N	r   r   r   r   r   r  r   r"   r4  r   r   r~   r  r    sh        BD =,HII9UB''9Z++9Wa((8NE22	4KKKr   r  c                       e Zd ZdZ edde           edd           edd           edd           ed	d
          gZdS )%IPv6ExtHdrSegmentRoutingTLVEgressNodez4IPv6 Option Header Segment Routing - Egress Node TLVrm   r   r   r  r  r   r  egress_noder   Nr  r   r   r~   r  r    sh        AD =,HII9UB''9Z++9Wa((8M511	3KKKr   r  c                   f    e Zd ZdZ edde           edddd           edd	d
           gZdS )IPv6ExtHdrSegmentRoutingTLVPad1z-IPv6 Option Header Segment Routing - Pad1 TLVrm   r   r   Npaddingr  r  r  c                     | j         S r   r   r  s    r~   r  z(IPv6ExtHdrSegmentRoutingTLVPad1.<lambda>      37 r   r  	r   r   r   r   r   r  r   r-   r4  r   r   r~   r
  r
    [        :D =,HII =	sKKK;y'?R?RSSSUKKKr   r
  c                   f    e Zd ZdZ edde           edddd           edd	d
           gZdS )IPv6ExtHdrSegmentRoutingTLVPadNz-IPv6 Option Header Segment Routing - PadN TLVrm   r_   r   Nr  r  r  r  c                     | j         S r   r   r  s    r~   r  z(IPv6ExtHdrSegmentRoutingTLVPadN.<lambda>%  r  r   r  r  r   r   r~   r  r     r  r   r  c            
           e Zd ZdZ edde           edddd            ed	d
d           edd
d           edd
           e	ddd           gZ
dS )IPv6ExtHdrSegmentRoutingTLVHMACz-IPv6 Option Header Segment Routing - HMAC TLVrm   rn  r   Nhmacc                     |dz   S N0   r   )r:  r   s     r~   r  z(IPv6ExtHdrSegmentRoutingTLVHMAC.<lambda>-  s
    QV r   r  r  Dr   rb   r     	hmackeyidr  c                     | j         dz
  S r  r   r  s    r~   r  z(IPv6ExtHdrSegmentRoutingTLVHMAC.<lambda>2  s    sw| r   r  )r   r   r   r   r   r  r   r   r!   r-   r4  r   r   r~   r  r  (  s        :D =,HII =(;(;= = =8CA&&8J2..8K++;vr+C+CE E EFKKKr   r  c                   z   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d           ed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d            e
dg ed           gZeddiiZd ZdS )r   z"IPv6 Option Header Segment Routingr   r   r   Nrm   r_   r]  	lastentryunused1r   rb   	protectedoamalertr  unused2r   tagr"  r   c                     | j         dz   S r  )r  r  s    r~   r  z!IPv6ExtHdrSegmentRouting.<lambda>E  s    8I r   r   tlv_objectsc                 2    d| j         z  d| j        dz   z  z
  S )Nr   r   rb   )r   r  r  s    r~   r  z!IPv6ExtHdrSegmentRouting.<lambda>H  s#    1sw;'*}q'8J < r   r  r   c                    | j         t          |           dz   dz  }|dk    r!t                      }|t          |          z  }n0|dk    r*d|dz
  z  }t          |          }|t          |          z  }t          |          dz
  dz  }|d d         t	          j        d|          z   |dd          z   }| j        Ft          | j                  }|r|dz  }|d d         t	          j        d|          z   |dd          z   }| j        Zt          | j                  }|d	k    rt          d
           n|dz  }|d d         t	          j        d|          z   |dd          z   }t                              | ||          S )Nr   rb   r   r  )r  r  r   r_   r   z8IPv6ExtHdrSegmentRouting(): the addresses list is empty!rn  )r   r
  r   r  r  r  r]  r"  r  r   rG  r  )r   r   r  tmp_modtlvtmp_padr   r  s           r~   r  z#IPv6ExtHdrSegmentRouting.post_buildN  s   8 Cy1})G!||577s3xxA!Wq[15gFFFs3xx3xx!|)Gbqb'FKW555ABB?C<$.))G 1bqb'FKW555ABB?C>!DN++IA~~N    Q	bqb'FKY777#abb'AC%%dC555r   )r   r   r   r   r   r3  r   r   r)   r   r'   r  r4  rt   r  r  r   r   r~   r   r   5  sI       /D =r6229UD))9VQ''9Y--9[$//8Iq!,,8KA..8E1a((8GQ**8FAq))8Iq!,,:eQ''<eW+J+JL L L"?="#>0 0  K( dBZ(O"6 "6 "6 "6 "6r   r   c            	            e Zd ZdZ edde           eddd           eddd           ed	dd
           eddd           edd          gZe	ddiiZ
 fdZ xZS )r   z,IPv6 Extension Header - Fragmentation headerr   r   res1r   r   r     res2r   mrb   idNr   c                 x    | j         dk    rt          S t          t          |                               |          S r   )r  rE   superr   guess_payload_class)r   r|   	__class__s     r~   r6  z&IPv6ExtHdrFragment.guess_payload_class  s2    ;??J+T22FFqIIIr   )r   r   r   r   r   r3  r   r!   r4  rt   r  r6  __classcell__r7  s   @r~   r   r   u  s        9D =r6228FAq))8Ha,,8FAq))8CA&&8D$'')K dBZ(OJ J J J J J J J Jr   c                 x   d | D             }|sg S |d         t                    j        t          |          }fd|D             }t          |          |k    rt          d           g }|r[d}|d         t                    j        }|D ]}|t                    j        }||k     rd}|}|                    ||                    ||= |[d}|D ]|}|t                    }	d|	j        z  }
|
t          |          k    r!t          dt          |          |
fz             |d|
t          |          z
  z  z  }|t          |	j                  z  }}|d                                         }	|	t                    j	        }||	t                    j
        _	        t          |          |	t                    j
        _        |	t                    j
        `|	t          j        |	          z  }	|	`|	t                   j
        r0t          t          |	t                                       |	t          <   nt          t          |	                    }	|	S )
z
    Performs defragmentation of a list of IPv6 packets. Packets are reordered.
    Crap is dropped. What lacks is completed by 'X' characters.
    c                 $    g | ]}t           |v |S r   )r   ).0r   s     r~   
<listcomp>zdefragment6.<locals>.<listcomp>  s#    
9
9
9!3q!8!81!8!8!8r   r   c                 @    g | ]}|t                    j        k    |S r   )r   r3  )r<  r   r3  s     r~   r=  zdefragment6.<locals>.<listcomp>  s,    
<
<
<Q125;;1;;;r   z@defragment6: some fragmented packets have been removed from listr   r   z5Expected an offset of %d. Found %d. Padding with XXXX   Xload)r   r3  r   r   r  r   r   r  copyr   rF  r   r   	raw_layerrt   )packetsr   llenr}   min_pos
min_offsetr|   
cur_offsetfragmentableqr  r   r3  s               @r~   defragment6rK    sE    :
9g
9
9
9C 		Q"	#	&Bs88D
<
<
<
<c
<
<
<C
3xx4RSSS C
 	V./6
 	( 	(A-.5JJ&&'


3w<   L  	 L ' ' !QXS&&&&KsS_O`O`bhNiijjj\):): :;;AI& 	AA	
		!B*,A$',/,=,=A$)	
(0\	*	*	**A	w s1T7||$$$QLLHr   c                    |                                  } t          | vrwt          | vr| gS | t                   }|j        }t          |j                  }|                                 |`|`|                    |           |                    |           t          t          | t                                       dk    rt          d           g S t          |           }t          |          |k    r| gS | t                   j        }t          t          dd          |z            }t          |          dz
  }|| d         }	| t                   j        }
| t                   }|`t          |          |z
  dz
  }| }| t                   j        `||z
  dz
  }||dz  z
  }|d	k    s|d	k    r!t          d
d|dz   z  z              ||z  |z  gS |	}g }d	}t          j        d	d          }|j        |j        }d|_        ||_        |
|_        	 t          |          |k    ro|d|         }||d         }||_        ||dz  z  }t          |v rd|t                   _        ||z  t#          j        |          z  }|                    |           nZ||_        d	|_        t          |v rd|t                   _        ||z  t#          j        |          z  }|                    |           n|S )aW  
    Performs fragmentation of an IPv6 packet. 'fragSize' argument is the
    expected maximum size of fragment data (MTU). The list of packets is
    returned.

    If packet does not contain an IPv6ExtHdrFragment class, it is added to
    first IPv6 layer found. If no IPv6 layer exists packet is returned in
    result list unmodified.
    r   r  zDAn IPv6 packet can'be bigger than 65535, please use a Jumbo payload.r   rf   re   r  Nr   r   z)Provided fragment size value is too low. zShould be more than %d    rb   Tr@  )rB  r   rt   r  r   remove_payloadr   add_payloadr   r   r   rF  randomrandintr3  r2  r  r   rC  r   )r   fragSizelayer3r  fragr   fragParttmpfragPartLenfragPartStrr   
fragHeaderunfragPartLen
unfragPartlastFragSizeinnerFragSizer   r}   
fragOffsetfragIdtempos                        r~   	fragment6rc    s4    ((**C$$s??5LT~!VY///IK4    3s%&''((500VWWW	CA
1vvu %&.H
du%(((83
4
4Cc((R-K[LMM"K 
	 	#B '(J FF[(1,MJ*2
 m+a/L L1$45MqMQ..;(MA,=>? 	@ 	@ 	@Z'(233F
CJ^Az**F} JLJMJMKK,&&-(CMNN+F *J=A-.Jz!!(,
4 %+dn#.F.F.FFEJJu *JJLz!!(,
4 %+dn&.I.I.IIEJJu#$ Jr   ICMPv6DestUnreachr   ICMPv6PacketTooBigr   ICMPv6TimeExceededICMPv6ParamProblemr  ICMPv6EchoRequest   ICMPv6EchoReplyr   ICMPv6MLQuery   ICMPv6MLReportICMPv6MLDoner  ICMPv6ND_RSr  ICMPv6ND_RAru   r  ICMPv6ND_NA   ICMPv6ND_Redirectr   ICMPv6NIQueryr   ICMPv6NIReply   ICMPv6ND_INDSolICMPv6ND_INDAdvICMPv6MLReport2ICMPv6HAADRequestICMPv6HAADReplyICMPv6MPSolICMPv6MPAdvICMPv6MRD_AdvertisementICMPv6MRD_SolicitationICMPv6MRD_Termination	ICMPv6RPL)
      r  r                    r   r[  r   r  r  r  )r  r  r  r  r  r  r  r  zDestination unreachablezPacket too bigzTime exceededzParameter problemd   zPrivate Experimentatione   zEcho Requestz
Echo Replyz	MLD Queryz
MLD ReportzMLD DonezRouter SolicitationzRouter AdvertisementzNeighbor SolicitationzNeighbor AdvertisementzRedirect Message   zRouter RenumberingzICMP Node Information QueryzICMP Node Information Responsez/Inverse Neighbor Discovery Solicitation Messagez0Inverse Neighbor Discovery Advertisement MessagezMLD Report Version 2r  z,Home Agent Address Discovery Request Messager  z*Home Agent Address Discovery Reply Messager  zMobile Prefix Solicitationr  zMobile Prefix Advertisement   zCertification Path Solicitation   z Certification Path Advertisementr  zMulticast Router Advertisementr  zMulticast Router Solicitationr  zMulticast Router Terminationr  zRPL Control Message   ro  c                   0    e Zd ZdZeddiiZd Zd Zd ZdS )r  zICMPv6 dummy classr   r   c                     ||z  }| j         At          d| j        |          }|d d         t          j        d|          z   |dd          z   }|S )Nr   r   r  r_   )cksumrf  rF  r  r  )r   r|   r  rH  s       r~   r  z_ICMPv6.post_build  sV    	S:DOQ77F"1"D&111AabbE9Ar   c                 4    | j                                         S r   )r  r   r   s    r~   r   z_ICMPv6.hashret  s    |##%%%r   c                     t          | j        t                    s/t          | j        t                    r9t          |t                    r$| j        |j        k    r| j        |j        k    sdS dS dS Nr   rb   )r   rF  rD  rG  r  rm   coder   r0  s     r~   r.  z_ICMPv6.answers  sk    t11 	t44	5'**	 Y%*,,Y%*,,q1qr   N)	r   r   r   r   rt   r  r  r   r.  r   r   r~   r  r    sT        DdBZ(O  & & &	 	 	 	 	r   r  c                       e Zd ZdZd ZdS )_ICMPv6ErrorzICMPv6 errors dummy classc                     t           S r   )rD  r  s     r~   r6  z _ICMPv6Error.guess_payload_class  s    r   Nr   r   r   r   r6  r   r   r~   r  r    s(        &D    r   r  c                   p    e Zd ZdZ edde           edd           edd           edd	          gZ	dS )
r   zScapy6 ICMPv6 fallback classrm   rb   r  r   r  Nmsgbodyr  )
r   r   r   r   r   
icmp6typesr   r2   r+   r4  r   r   r~   r   r     sX        )D =J779VQ'';w--8Ir**,KKKr   c                       e Zd ZdZ edde           edddddd	d
d           edd           edd           edd           e	             e
            gZeZdS )rd  zICMPv6 Destination Unreachablerm   rb   r  r   zNo route to destinationz:Communication with destination administratively prohibitedzBeyond scope of source addresszAddress unreachablezPort unreachable)r   rb   r   r   r_   r  Nlengthr  r   r   r   r   r   r  r2   r   r.   r4   r3   r4  r5   post_dissectionr   r   r~   rd  rd    s        +D =J77 =0I0l0P0E0B	-D -D E E
 ;w--9Xq))<!,,))++&&((
*K 3OOOr   c                   p    e Zd ZdZ edde           edd           edd           edd	          gZ	dS )
re  zICMPv6 Packet Too Bigrm   r   r  r   r  Nmtu   )
r   r   r   r   r   r  r   r2   r!   r4  r   r   r~   re  re    sX        "D =J779VQ'';w--8E4((*KKKr   c                       e Zd ZdZ edde           eddddd           ed	d
           edd           edd           e	             e
            gZeZd
S )rf  zICMPv6 Time Exceededrm   r   r  r   zhop limit exceeded in transitz!fragment reassembly time exceededr   rb   r  Nr  r  r  r   r   r~   rf  rf    s        !D =J77 =0O0S-U -U V V;w--9Xq))<!,,))++&&((*K 3OOOr   c            
       |    e Zd ZdZ edde           edddddd	d
           edd           edd          gZdS )rg  zICMPv6 Parameter Problemrm   r_   r  r   z"erroneous header field encounteredz)unrecognized Next Header type encounteredz$unrecognized IPv6 option encounteredz*first fragment has incomplete header chainr   rb   r   r   r  Nptrr   )	r   r   r   r   r   r  r2   r!   r4  r   r   r~   rg  rg    sy        %D =J77 =q?FAGI IJ J ;w--8E1%%'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          gZ	d Z
d ZdS )rh  zICMPv6 Echo Requestrm   r  r  r   r  Nr3  seqr  r  c                 ,    |                      d          S )Nz%name% (id: %id% seq: %seq%)sprintfr   s    r~   r  zICMPv6EchoRequest.mysummary      ||:;;;r   c                 v    t          j        d| j        | j                  | j                                        z   S )NHH)r  r  r3  r  r  r   r   s    r~   r   zICMPv6EchoRequest.hashret  s-    {4$(33dl6J6J6L6LLLr   )r   r   r   r   r   r  r   r2   r+   r4  r  r   r   r   r~   rh  rh    s         D =j999VQ'';w--;tQ'';ua((8FB'')K< < <M M M M Mr   c                       e Zd ZdZdZd ZdS )rj  zICMPv6 Echo Replyri  c                     t          |t                    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r   rh  r3  r  r  r  s     r~   r.  zICMPv6EchoReply.answers  sH    5"344 (58#((,EI(=(	UZ'	)r   N)r   r   r   r   rm   r.  r   r   r~   rj  rj    s-        DD) ) ) ) )r   c            	           e 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S )	_ICMPv6MLrm   r   r  r   r  Nmrdr  mladdrr   )
r   r   r   r   r  r   r2   r)   r"   r4  r   r   r~   r  r    sq         =j999VQ'';w--:eQ'':j!,,8Hd++-KKKr   r  c                   .    e Zd ZdZdZdZdZeddddiZd	S )
rk  zMLD - Multicast Listener Queryr   '  r   ff02::1rb   r   re   rh   r   N)	r   r   r   r   rm   r  r  rt   r  r   r   r~   rk  rk  "  s6        +DD
CFYDDEOOOr   c                   *    e Zd ZdZdZedddiZd ZdS )rm  zMLD - Multicast Listener Reportrl  rb   r   )rh   r   c                     t           |v S zCheck the query type)rk  r   querys     r~   r.  zICMPv6MLReport.answers1  s    %%r   N)r   r   r   r   rm   rt   r  r.  r   r   r~   rm  rm  ,  s?        ,DDar223O& & & & &r   c                   &    e Zd ZdZdZeddddiZdS )rn  zMLD - Multicast Listener Doner   ff02::2rb   r   r  N)r   r   r   r   rm   rt   r  r   r   r~   rn  rn  =  s,        *DDYDDEOOOr   c                   B   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d           e
ddd           e
ddd           edd           edd           edg d           gZeddddiZd ZdS )r   z MLDv2 - Multicast Listener Queryrm   r   r  r   r  Nr  r  r  r  r   Resvr_   Srb   QRVr   QQICsources_numbersourcesc                     | j         S r   r  r  s    r~   r  zICMPv6MLQuery2.<lambda>S  s	    s7I r   r'  r  r   r  c                     | j         ?t          j        dt          | j                            }|dd         |z   |dd         z   }t
                              | ||          S )z.Compute the 'sources_number' field when neededNr     r   )r  r  r  r   r  r  r  )r   packetr  srcnums       r~   r  zICMPv6MLQuery2.post_buildX  s]    &[s4<'8'899FCRC[6)F233K7F!!$888r   )r   r   r   r   r   r  r   r2   r)   r"   r   r   r4  rt   r  r  r   r   r~   r   r   E  s       -D =j999VQ'';w--:eU++:j!,,8Hd++8FAq))8CA&&8E1a((9VQ'':.55<	2+I+IK K KLK YDDEO9 9 9 9 9r   r   c            
           e Zd ZdZ edd           edddd           ed	dd
d            edd           ed
g d            eddd           gZ	d Z
dS )ICMPv6MLDMultAddrRecz'ICMPv6 MLDv2 - Multicast Address Recordrtyper_   auxdata_lenNauxdatar  r  r  r  c                     |dz  S r   r   )r|   nums     r~   r  zICMPv6MLDMultAddrRec.<lambda>h  s
    sby r   r  re   r   c                     d| j         z  S r   r  r|   s    r~   r  zICMPv6MLDMultAddrRec.<lambda>k  s    b1;K6K r   r  r  c                     | j         S r   )r  r  s    r~   r  zICMPv6MLDMultAddrRec.<lambda>m  s    Q] r   c                     | j         S )z0Multicast Address Record followed by another oner9  )r   r  s     r~   r   z*ICMPv6MLDMultAddrRec.default_payload_classo  s
    ~r   )r   r   r   r   r   r   r"   r   r-   r4  r   r   r   r~   r  r  `  s        4D9Wa(( =+4%(* * * !=!14+4(@(@B B B 8E4((<	2,K,KM M M;y"+B+BD D DEK    r   r  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
g e
d           gZeddddiZd Zd ZdS )ry  z!MLDv2 - Multicast Listener Reportrm   r  r}   r   r  Nr  records_numberrecordsc                     | j         S r   )r  r  s    r~   r  zICMPv6MLReport2.<lambda>}  s	    8H r   r'  zff02::16rb   r   r  c                     | j         ?t          j        dt          | j                            }|dd         |z   |dd         z   }t
                              | ||          S )z.Compute the 'records_number' field when neededNr  r   r   )r  r  r  r   r  r  r  )r   r  r  recnums       r~   r  zICMPv6MLReport2.post_build  s]    &[s4<'8'899FBQBZ&(6!"":5F!!$888r   c                 ,    t          |t                    S r  )r   r   r  s     r~   r.  zICMPv6MLReport2.answers  s    %000r   )r   r   r   r   r   r  r   r2   r)   r'   r  r4  rt   r  r  r.  r   r   r~   ry  ry  t  s        .D =j999UA&&;w--:j!,,:.55"?9b#7.H.HJ J JKK Z"EEFO9 9 91 1 1 1 1r   c                       e Zd ZdZ edde           edd           edd           edd	           ed
d	          gZ	e
ddddiZd ZdS )r~  z/ICMPv6 Multicast Router Discovery Advertisementrm   r  advinterr   r  Nqueryintr   
robustnessr   rb   r  r   rh   re   c                 *    |d d         |dd          fS r  r   r   r   s     r~   r  z'ICMPv6MRD_Advertisement.extract_padding      !uae|r   )r   r   r   r   r   r  r   r2   r)   r4  rt   r  r  r   r   r~   r~  r~    s        <D =j999Z,,;w--:j!,,:lA..	0K
 B)DDEO    r   c                   p    e Zd ZdZ edde           edd           edd          gZe	dd	d
diZ
d ZdS )r  z.ICMPv6 Multicast Router Discovery Solicitationrm   r  r}   r   r  Nr   rb   r  r  c                 *    |d d         |dd          fS Nr_   r   r  s     r~   r  z&ICMPv6MRD_Solicitation.extract_padding  r  r   r   r   r   r   r   r  r   r2   r4  rt   r  r  r   r   r~   r  r    st        ;D =j999UA&&;w--/K B)DDEO    r   c                   p    e Zd ZdZ edde           edd           edd          gZe	dd	d
diZ
d ZdS )r  z-ICMPv6 Multicast Router Discovery Terminationrm   r  r}   r   r  Nr   rb   zff02::6Ar  c                 *    |d d         |dd          fS r  r   r  s     r~   r  z%ICMPv6MRD_Termination.extract_padding  r  r   r  r   r   r~   r  r    st        :D =j999UA&&;w--/K B*EEFO    r   zSource Link-Layer AddresszTarget Link-Layer AddresszPrefix InformationzRedirected Headerrn  r   zNBMA Shortcut Limit Optionr  zAdvertisement Interval OptionzHome Agent Information Option	   zSource Address List
   zTarget Address List   z
CGA Option   zRSA Signature Optionr0  zTimestamp Option   zNonce optionr  zTrust Anchor OptionzCertificate OptionzIP Address Optionz$New Router Prefix Information OptionzLink-layer Address Optionz-Neighbor Advertisement Acknowledgement OptionzCARD Request OptionzCARD Reply Optionz
MAP OptionzRoute Information OptionzRecursive DNS Server Optionz&IPv6 Router Advertisement Flags Option)	r     r            r[     r  rv   r   ICMPv6NDOptPrefixInfoICMPv6NDOptRedirectedHdrICMPv6NDOptMTUICMPv6NDOptShortcutLimitICMPv6NDOptAdvIntervalICMPv6NDOptHAInfoICMPv6NDOptSrcAddrListICMPv6NDOptTgtAddrListICMPv6NDOptIPAddrr  ICMPv6NDOptNewRtrPrefixr  ICMPv6NDOptLLAr  ICMPv6NDOptMAPICMPv6NDOptRouteInfor  ICMPv6NDOptRDNSSr  ICMPv6NDOptEFAICMPv6NDOptDNSSLICMPv6NDOptCaptivePortalICMPv6NDOptPREF64)   %   &   zMedium (default)Highr  Lowr  c                       e Zd ZdZd ZdS )_ICMPv6NDGuessPayloadz4Dummy ND class that implements guess_payload_class()c                     t          |          dk    r3t                              t          |d                   t                    S d S Nrb   r   )r   icmp6ndoptsclsr   r   ICMPv6NDOptUnknownr  s     r~   r6  z)_ICMPv6NDGuessPayload.guess_payload_class  s9    q66A::!%%c!A$ii1CDDD :r   Nr  r   r   r~   r  r    s-        ADE E E E Er   r  c                   8     e Zd ZdgZd fd	Zd Zd Zd Z xZS )ICMPv6NDOptDataFieldstrip_zerosFc                 L     t                      j        ||fi | || _        d S r   )r5  r   r  )r   r   r   r  kwargsr7  s        r~   r   zICMPv6NDOptDataField.__init__  s2    w11&111&r   c                 H    t          |                     ||                    S r   r  r  s      r~   r   zICMPv6NDOptDataField.i2len  r  r   c                 J    t          |          dz   dz  }|r|dd|z
  z  z  }|S )Nr   r   r  r   )r   r   r   rs       r~   r   zICMPv6NDOptDataField.i2m  s6    VVaZ1 	#AE""Ar   c                 >    | j         r|                    d          }|S )Nr  )r  rstripr  s      r~   m2izICMPv6NDOptDataField.m2i  s#     	"!!Ar   )F)	r   r   r   r   r   r   r   r"  r8  r9  s   @r~   r  r    sq        I' ' ' ' ' '% % %        r   r  c                   j    e Zd ZdZ edd           eddddd 	           edd
dd           gZdS )r  z6ICMPv6 Neighbor Discovery Option - Scapy Unimplementedrm   r   r   Nr  r  c                     d|z   dz  S Nr   r   r   r  s     r~   r  zICMPv6NDOptUnknown.<lambda>)      A!| r   r  r  Fc                 8    dt          | j        d          z  dz
  S r  maxr   r  s    r~   r  zICMPv6NDOptUnknown.<lambda>+      ()COO(;a(? r   r  r   )r   r   r   r   r   r   r  r4  r   r   r~   r  r  %  sy        CD9VQ'' =C(C(CE E E''5@ 5@A A ABKKKr   r  c                   \    e Zd ZdZ edd           edd           ed          gZd ZdS )rv   z<ICMPv6 Neighbor Discovery Option - Source Link-Layer Addressrm   rb   r   rl   c                 ,    |                      d          S )Nz%name% %lladdr%r  r   s    r~   r  zICMPv6NDOptSrcLLAddr.mysummary8  s    ||-...r   N)r   r   r   r   r   rB   r4  r  r   r   r~   rv   rv   2  sZ        ID9VQ''9UA&&!>(++-K/ / / / /r   c                       e Zd ZdZdZdS )r   zAICMPv6 Neighbor Discovery Option - Destination Link-Layer Addressr   Nr   r   r   r   rm   r   r   r~   r   r   <  s        NDDDDr   c                      e Zd ZdZ edd           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           edd           edd          gZd Z	dS )r  z5ICMPv6 Neighbor Discovery Option - Prefix Informationrm   r   r   r_   	prefixlenr   Lrb   ARr   r/  rn  validlifetimerO  preferredlifetimer1  prefixr   c                 ,    |                      d          S )NzQ%name% %prefix%/%prefixlen% On-link %L% Autonomous Address %A% Router Address %R%r  r   s    r~   r  zICMPv6NDOptPrefixInfo.mysummaryO  s    || 1 2 2 	2r   N)
r   r   r   r   r   r   r1   r"   r4  r  r   r   r~   r  r  A  s        BD9VQ''9UA&&9["--8CA&&8CA&&8CA&&8FAq))9_j9990*==9VZ008Hd++
-K2 2 2 2 2r   c                       e Zd Zd Zd ZdS )TruncPktLenFieldc                 ^    t          |          }t          |          }|d ||dz  z
           S r  )r  r   )r   r   r   r   r   s        r~   r   zTruncPktLenField.i2mY  s2    !HHa&&)'Wq[))**r   c                 H    t          |                     ||                    S r   r  r   s      r~   r   zTruncPktLenField.i2len^  r  r   N)r   r   r   r   r   r   r   r~   r:  r:  X  s2        + + +
% % % % %r   r:  c            	           e Zd ZdZ edd           eddddd 	           e ed
dd                     edde	d           gZ
dS )r  z4ICMPv6 Neighbor Discovery Option - Redirected Headerrm   r_   r   Nr   r  c                     |dz   dz  S r  r   r  s     r~   r  z!ICMPv6NDOptRedirectedHdr.<lambda>f  r&  r   r  r}            r   r   c                     d| j         z  dz
  S r  r   r  s    r~   r  z!ICMPv6NDOptRedirectedHdr.<lambda>i  s    AK!O r   r  )r   r   r   r   r   r   r%   r,   r:  rt   r4  r   r   r~   r  r  b  s        AD9VQ'' =3(C(CE E E6**5+qAABB##E30K0KM M M	NKKKr   c                   t    e Zd ZdZ edd           edd           edd           edd	          gZd
 ZdS )r  z&ICMPv6 Neighbor Discovery Option - MTUrm   rn  r   rb   r}   r   r  r  c                 ,    |                      d          S )Nz%name% %mtu%r  r   s    r~   r  zICMPv6NDOptMTU.mysummaryu      ||N+++r   N)	r   r   r   r   r   r2   r!   r4  r  r   r   r~   r  r  n  sk        3D9VQ''9UA&&;ua((8E4((*K
, , , , ,r   c                       e Zd ZdZ edd           edd           edd           edd	           ed
d	          gZdS )r  z6ICMPv6 Neighbor Discovery Option - NBMA Shortcut Limitrm   r   r   rb   shortcutlimr  r/  r   r1  N)r   r   r   r   r   r!   r4  r   r   r~   r  r  y  se        CD9VQ''9UA&&9]B//9VQ''8FA&&	(KKKr   c                   t    e Zd ZdZ edd           edd           edd           edd          gZd	 Zd
S )r  z2ICMPv6 Neighbor Discovery - Interval Advertisementrm   r  r   rb   r}   r   advintc                 ,    |                      d          S )Nz%name% %advint% millisecondsr  r   s    r~   r  z ICMPv6NDOptAdvInterval.mysummary  r  r   N)	r   r   r   r   r   r)   r!   r4  r  r   r   r~   r  r    sk        ?D9VQ''9UA&&:eQ''8Ha((*K
< < < < <r   c                       e Zd ZdZ edd           edd           edd           edd           ed	d          gZd
 ZdS )r   z2ICMPv6 Neighbor Discovery - Home Agent Informationrm   r   r   rb   r}   r   preflifetimec                 ,    |                      d          S )Nz %name% %pref% %lifetime% secondsr  r   s    r~   r  zICMPv6NDOptHAInfo.mysummary  s    ||>???r   N)r   r   r   r   r   r)   r4  r  r   r   r~   r   r     s        ?D9VQ''9UA&&:eQ'':fa((:j!,,	.K@ @ @ @ @r   c            
           e Zd ZdZ edd           edd           edddd	d
d           edd           edd           edd          gZdS )r  z<ICMPv6 Neighbor Discovery - IP Address Option (FH for MIPv6)rm   r   r   r   optcoderb   zOld Care-Of AddresszNew Care-Of AddresszNAR's IP address)rb   r   r   r   r   r}   r   rw   r   N)	r   r   r   r   r   r   r!   r"   r4  r   r   r~   r  r    s        ID9VR((9UA&& =A3H3H3E0G 0G H H 9VR((8E1%%8FD))+KKKr   c            	           e Zd ZdZ edd           edd           edd           edd	           ed
d           edd          gZdS )r  zOICMPv6 Neighbor Discovery - New Router Prefix Information Option (FH for MIPv6)rm   r  r   r   rN  r   r   r   r}   r7  r   N)r   r   r   r   r   r!   r"   r4  r   r   r~   r  r    st        \D9VR((9UA&&9Y**9VR((8E1%%8Hd++-KKKr   z0Wildcard requesting resolution for all nearby APzLLA for the new APzLLA of the MNzLLA of the NARz(LLA of the src of TrSolPr or PrRtAdv msgz7AP identified by LLA belongs to current iface of routerz5No preifx info available for AP identified by the LLAz6No fast handovers support for AP identified by the LLA)r   rb   r   r   r_   rn  r   r  c                   p    e Zd ZdZ edd           edd           edde           ede          gZ	d	S )
r  zJICMPv6 Neighbor Discovery - Link-Layer Address (LLA) Option (FH for MIPv6)rm   r  r   rb   rN  r   llaN)
r   r   r   r   r   r   _rfc4068_lla_optcoder$   r   r4  r   r   r~   r  r    sY        WD9VR((9UA&& =A/CDD8E9--/KKKr   c                       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d           edd           edd          gZdS )r  z&ICMPv6 Neighbor Discovery - MAP Optionrm   r  r   r   distrb   r_   rJ  r  r4  r}   r   r  r5  rO  rw   r   N)	r   r   r   r   r   r   r!   r"   r4  r   r   r~   r  r    s        3D9VR((9UA&&8FAq))8FB**8CA&&8E1a((8OZ888FD))+KKKr   c                   2    e Zd ZdgZd Zd Zd Zd Zd ZdS )_IP6PrefixFieldr   c                 B    t          j        | ||           d | _        d S )Nc                     d| j         dz
  z  S Nr   rb   r   r  s    r~   r  z*_IP6PrefixField.__init__.<locals>.<lambda>  s    qCGaK'8 r   )r"   r   r   r   r   r   s      r~   r   z_IP6PrefixField.__init__  s(    $g...88r   c                 4    ||                      ||          z   S r   r  r  s       r~   r  z_IP6PrefixField.addfield  r  r   c                     |                      |          }|d |         }|dk     r|dd|z
  z  z  }||d          |                     ||          fS )Nr   r  )r   r"  )r   r   r   r   r|   s        r~   r   z_IP6PrefixField.getfield  s_    ""3''hwhKR<<BL))A{DHHS!,,,,r   c                 H    t          |                     ||                    S r   r  r  s      r~   r   z_IP6PrefixField.i2len  r  r   c                     |j         }|d}|d}t          t          j        |          }||S |dv rdS |dv r|d d|dz
  z           S |d|dz
  z  z   S )	Nr   rb   r  r   )r   r   r              r   )r   rM   rr   rs   )r   r   r   r   s       r~   r   z_IP6PrefixField.i2m  s    '9Afoq))?Hf3f'a7Q;''((;'A+...r   N)	r   r   r   r   r   r  r   r   r   r   r   r~   rV  rV    sf        I9 9 9& & &- - -% % %/ / / / /r   rV  c                       e Zd ZdZ edd           eddddd 	           ed
d           eddd           eddde           eddd           e	dd           e
dd          gZd ZdS )r  z;ICMPv6 Neighbor Discovery Option - Route Information Optionrm   r[  r   Nr7  r  c                     |dz  dz   S rY  r   r  s     r~   r  zICMPv6NDOptRouteInfo.<lambda>  s    qAvz r   r  r   r/  r   r   prfr   r1  
rtlifetimerO  c                 ,    |                      d          S )Nz'%name% %prefix%/%plen% Preference %prf%r  r   s    r~   r  zICMPv6NDOptRouteInfo.mysummary  s    ||EFFFr   )r   r   r   r   r   r   r   r   icmp6ndraprefsr!   rV  r4  r  r   r   r~   r  r    s        HD9VR(( =c(A(AC C C9VT**8FAq))<q!^<<8FAq))8L*55"?8T224KG G G G Gr   c            	           e Zd ZdZ edd           eddddd 	           ed
d           edd           edg d           gZ	d Z
dS )r  z>ICMPv6 Neighbor Discovery Option - Recursive DNS Server Optionrm   r  r   Ndnsr  c                     d|z  dz   S Nr   rb   r   r  s     r~   r  zICMPv6NDOptRDNSS.<lambda>      q1uqy r   r  r}   rK  rO  c                     d| j         dz
  z  S rY  r   r  s    r~   r  zICMPv6NDOptRDNSS.<lambda>      SWq[8I r   r  c                 b    |                      d          d                    | j                  z   S Nz%name% r   )r  r   rg  r   s    r~   r  zICMPv6NDOptRDNSS.mysummary  s'    ||I&&48)<)<<<r   )r   r   r   r   r   r   r)   r!   r   r4  r  r   r   r~   r  r    s        KD9VR(( =u#(@(@B B B:eT**8J
33<r,I,IK K KLK= = = = =r   c                   Z    e Zd ZdZ edd           edd           eddd          gZd	S )
r	  z8ICMPv6 Neighbor Discovery Option - Expanded Flags Optionrm   r  r   rb   r}   r   r  N)r   r   r   r   r   r   r4  r   r   r~   r	  r	    sI        ED9VR((9UA&&8E1b))+KKKr   c                   <    e Zd ZdgZdZdZddZd Zd Zd	 Z	d
 Z
dS )DomainNameListFieldpaddedrb   r   NFc                 D    || _         t          j        | |||           d S )Nr  )rr  r-   r   )r   r   r   r   rr  s        r~   r   zDomainNameListField.__init__'  s)    T4kJJJJJJr   c                 H    t          |                     ||                    S r   r  r  s      r~   r   zDomainNameListField.i2len+  r  r   c                     |sg S |S r   r   r  s      r~   i2hzDomainNameListField.i2h.  s     	Ir   c                 L   t          |          }g }|rg }|rvt          |d                   dk    r]t          |d                   }|                    |d|dz                       ||dz   d          }|rt          |d                   dk    ]| j        r;t	          |          r+|                    d                    |          dz              n+|                    d                    |          dz              |r#t          |d                   dk    r
|dd          }||S )Nr   rb   .)r   r  r   rr  r   r   )r   r   r   r}   curr   s         r~   r"  zDomainNameListField.m2i3  s+   aLL 	C $AaD		Qad))

1Qw{]+,,,gkllO  $AaD		Q { 0s88 4JJsxx}}s2333 

388C==3./// S1YY!^^abbE  	  
r   c                     d d |D             }d                     fd|D                       }| j        r@t          |          | j        z  dk    s%|d| j        t          |          | j        z  z
  z  z  }|S )Nc                 F    | rt          | d                   dk    r| S | dz   S )Nr   r   r  )r   )zs    r~   conditionalTrailingDotz7DomainNameListField.i2m.<locals>.conditionalTrailingDotI  s+     S2ZZ1__w;r   c              3   T   K   | ]#}d  |                     d          D             V  $dS )c                 r    g | ]4}t          t          |                    |                    d           z   5S )utf8)r
   r   encode)r<  r|  s     r~   r=  z5DomainNameListField.i2m.<locals>.<genexpr>.<listcomp>N  s5    EEE1CFFahhv...EEEr   rx  N)splitr<  r   s     r~   	<genexpr>z*DomainNameListField.i2m.<locals>.<genexpr>N  s;      QQ!EEEEEQQQQQQr   r   c              3   T   K   | ]"} d                      |                    V  #dS )r   N)r   )r<  r   r}  s     r~   r  z*DomainNameListField.i2m.<locals>.<genexpr>O  s9      OOa44SXXa[[AAOOOOOOr   r   r  )r   rr  r   padded_unit)r   r   r   rX  
ret_stringr}  s        @r~   r   zDomainNameListField.i2mH  s    	 	 	
 RQqQQQXXOOOO3OOOOO
 ; 	\s:1AAQFF'T%5J$JZ8Z%Z[[Jr   )NF)r   r   r   r   r   r  r   r   rv  r"  r   r   r   r~   rq  rq  "  sy        
IFKK K K K% % %  
  *    r   rq  c            
           e Zd ZdZ edd           eddddd 	           ed
d           edd           edg d d          gZ	d Z
dS )r
  z9ICMPv6 Neighbor Discovery Option - DNS Search List Optionrm   r  r   N
searchlistr  c                     d|dz  z   S )Nrb   r   r   r  s     r~   r  zICMPv6NDOptDNSSL.<lambda>\  s    q16z r   r  r}   rK  rO  c                     d| j         z  dz
  S r  r   r  s    r~   r  zICMPv6NDOptDNSSL.<lambda>`  s    q37{Q r   T)r   rr  c                 b    |                      d          d                    | j                  z   S rn  )r  r   r  r   s    r~   r  zICMPv6NDOptDNSSL.mysummaryd  s'    ||I&&4?)C)CCCr   )r   r   r   r   r   r   r)   r!   rq  r4  r  r   r   r~   r
  r
  X  s        FD9VR(( =#(A(AC C C:eT**8J
33&&|R3N3N.24 4 4KD D D D Dr   c                   p    e Zd ZdZ edd           eddddd 	           edd
dd           gZd ZdS )r  z8ICMPv6 Neighbor Discovery Option - Captive-Portal Optionrm   r  r   NURIr  c                     d|z   dz  S r%  r   r  s     r~   r  z!ICMPv6NDOptCaptivePortal.<lambda>l  r&  r   r  r  Tc                 8    dt          | j        d          z  dz
  S r  r(  r  s    r~   r  z!ICMPv6NDOptCaptivePortal.<lambda>n  r*  r   r+  c                 ,    |                      d          S )Nz%name% %URI%r  r   s    r~   r  z"ICMPv6NDOptCaptivePortal.mysummaryq  rC  r   )	r   r   r   r   r   r   r  r4  r  r   r   r~   r  r  h  s        ED9VR(( =3(C(CE E E''rt5@ 5@A A ABK, , , , ,r   c                       e Zd Zd Zd ZdS )_PREF64c                 D    ||                      ||          d d         z   S )Nr  r  r  s       r~   r  z_PREF64.addfieldv  s$    488C%%crc***r   c                 X    |dd          |                      ||d d         dz             fS )Nr  s       )r"  r  s      r~   r   z_PREF64.getfieldy  s0    vtxxQssVk%9::::r   N)r   r   r   r  r   r   r   r~   r  r  u  s2        + + +; ; ; ; ;r   r  c            
           e Zd ZdZ edd           edd           eddd           ed	dd
g d           edd          gZd Z	dS )r  z0ICMPv6 Neighbor Discovery Option - PREF64 Optionrm   r  r   r   scaledlifetimer   r0  plcr   )z/96z/64z/56z/48z/40z/32r7  r   c                     | j         dk     r|                     d          n
d| j          d}|                     d          |z   S )Nr   z%plc%z[invalid PLC(z)]z%name% %prefix%)r  r  )r   r  s     r~   r  zICMPv6NDOptPREF64.mysummary  sH    '+x!||dll7###9U9U9U9U||-..44r   N)
r   r   r   r   r   r   r   r  r4  r  r   r   r~   r  r  }  s        =D9VR((9UA&&8,a44<q! J J JL L78T**,K5 5 5 5 5r   c                       e Zd ZdZ edde           edd           edd           edd          gZ	e
d	d
ddiZdS )ro  z/ICMPv6 Neighbor Discovery - Router Solicitationrm   r  r  r   r  Nr}   r   r  rg   r   re   rh   )r   r   r   r   r   r  r   r2   r!   r4  rt   r  r   r   r~   ro  ro    sn        <D =j999VQ'';w--8E1%%'K By#FFGOOOr   c                   `   e Zd ZdZ edde           edd           edd           edd           ed	dd
           eddd
           eddd
           e	dd
de
           eddd
           eddd           edd           edd           edd          gZeddddiZd Zd ZdS )rp  z0ICMPv6 Neighbor Discovery - Router Advertisementrm   r  r  r   r  NchlimMrb   OHrb  r   Pr}   routerlifetimei  reachabletimeretranstimerr   r  rg   r  c                 ,    t          |t                    S r   )r   ro  r  s     r~   r.  zICMPv6ND_RA.answers      %---r   c                 ,    |                      d          S )Nzb%name% Lifetime %routerlifetime% Hop Limit %chlim% Preference %prf% Managed %M% Other %O% Home %H%r  r   s    r~   r  zICMPv6ND_RA.mysummary  s    || = > > 	>r   )r   r   r   r   r   r  r   r2   r   r   re  r)   r!   r4  rt   r  r.  r  r   r   r~   rp  rp    s(       =D =j999VQ'';w--9Wa((8CA&&8CA&&8CA&&<q!^<<8CA&&8E1a((:.558OQ//8NA..0K By#FFGO. . .> > > > >r   c                       e Zd ZdZ edde           edd           edd           edd           e	d	d
          gZ
eddddiZd Zd ZdS )ru   z1ICMPv6 Neighbor Discovery - Neighbor Solicitationrm   r   r  r   r  Nr}   rj   r   r   r  rg   r  c                 ,    |                      d          S Nz%name% (tgt: %tgt%)r  r   s    r~   r  zICMPv6ND_NS.mysummary      ||1222r   c                 ^    t          | j                  | j                                        z   S r   r   rj   r  r   r   s    r~   r   zICMPv6ND_NS.hashret  %    DH%%(<(<(>(>>>r   )r   r   r   r   r   r  r   r2   r!   r"   r4  rt   r  r  r   r   r   r~   ru   ru     s        >D =j999VQ'';w--8E1%%8E4((	*K
 By#FFGO3 3 3? ? ? ? ?r   c                       e Zd ZdZ edde           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          gZeddddiZd Zd Zd ZdS )rq  z2ICMPv6 Neighbor Discovery - Neighbor Advertisementrm   r  r  r   r  Nr4  rb   r  r  r}      rj   r   r   r  rg   r  c                 ,    |                      d          S r  r  r   s    r~   r  zICMPv6ND_NA.mysummary  r  r   c                 ^    t          | j                  | j                                        z   S r   r  r   s    r~   r   zICMPv6ND_NA.hashret  r  r   c                 L    t          |t                    o| j        |j        k    S r   )r   ru   rj   r  s     r~   r.  zICMPv6ND_NA.answers  s     %--G$(ei2GGr   )r   r   r   r   r   r  r   r2   r   r/   r"   r4  rt   r  r  r   r.  r   r   r~   rq  rq    s        ?D =j999VQ'';w--8CA&&8CA&&8CA&&9UAr**8E4((*K By#FFGO3 3 3? ? ?H H H H Hr   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
eddddiZdS )rs  z$ICMPv6 Neighbor Discovery - Redirectrm   rr  r  r   r  Nr}   rj   r   re   r   r  rg   r  )r   r   r   r   r   r  r   r2   r1   r"   r4  rt   r  r   r   r~   rs  rs    s        1D =j999VQ'';w--9UA&&8E4((8E4((*K By#FFGOOOr   c                       e Zd ZdZ edd           eddddd 	           ed
dd           edg d           gZdS )r  z>ICMPv6 Inverse Neighbor Discovery Option - Source Address Listrm   r  r   Naddrlistr  c                     d|z  dz   S ri  r   r  s     r~   r  zICMPv6NDOptSrcAddrList.<lambda>  rj  r   r  r}   r?  r   c                     d| j         dz
  z  S rY  r   r  s    r~   r  zICMPv6NDOptSrcAddrList.<lambda>  rl  r   r  )	r   r   r   r   r   r   r,   r   r4  r   r   r~   r  r    s        KD9VQ'' =zs(@(@B B B##E;::<
B,I,IK K K	LKKKr   c                       e Zd ZdZdZdS )r  z>ICMPv6 Inverse Neighbor Discovery Option - Target Address Listr  Nr/  r   r   r~   r  r    s        KDDDDr   c                       e Zd ZdZ edde           edd           edd           edd          gZ	e
d	d
ddiZdS )rw  z.ICMPv6 Inverse Neighbor Discovery Solicitationrm   rv  r  r   r  Nr  r   r  rg   r  r   r   r   r   r   r  r   r2   r1   r4  rt   r  r   r   r~   rw  rw    sn        ;D =j999VQ'';w--9Z++-K By#FFGOOOr   c                       e Zd ZdZ edde           edd           edd           edd          gZ	e
d	d
ddiZdS )rx  z/ICMPv6 Inverse Neighbor Discovery Advertisementrm   r  r  r   r  Nr  r   r  rg   r  r  r   r   r~   rx  rx  		  sn        <D =j999VQ'';w--9Z++-K By#FFGOOOr   NOOPz	Node NamezIPv6 AddresszIPv4 Addressr   r   r   r_   c                       e Zd Zd ZdS )_ICMPv6NIHashretc                 *    t          | j                  S r   )r   noncer   s    r~   r   z_ICMPv6NIHashret.hashret.	  s    DJ'''r   N)r   r   r   r   r   r   r~   r  r  -	  s#        ( ( ( ( (r   r  c                       e Zd Zd ZdS )_ICMPv6NIAnswersc                 "    | j         |j         k    S r   )r  r  s     r~   r.  z_ICMPv6NIAnswers.answers3	  s    zU[((r   N)r   r   r   r.  r   r   r~   r  r  2	  s#        ) ) ) ) )r   r  c                       e Zd ZddZdS )
NonceFieldNc                 n    t          j        | ||d           ||                                 | _        d S d S r  )r,   r   randvalr   rZ  s      r~   r   zNonceField.__init__:	  s8    !$gq999?<<>>DLLL ?r   r   )r   r   r   r   r   r   r~   r  r  9	  s(        * * * * * *r   r  c                 J   |                                                      d          d         } t          t          |                     | z   }t	          |                    d                    }|                                }dt          j        d|dd                   z  }|S )z@Compute the NI group Address. Can take a FQDN as input parameterrx  r   r  zff02::2:%2x%2x:%2x%2xBBBBNr_   )	lowerr  chrr   r   r  digestr  r  )r   recordhrw   s       r~   computeNIGroupAddrr  @	  s     ::<<c""1%DT^^d"FFMM&!!""A	

A"V]61RaR5%A%AADKr   c                 b   t          | t                    r| r| dd         dk    r| S | g} g }| D ]l}d}|                    d          dk    r|dz  }d                    d |                    d          D                       |z   }|                    |           md                    |          S )a/  
    Take as input a list of DNS names or a single DNS name
    and encode it in DNS format (with possible compression)
    If a string that is already a DNS name in DNS format
    is passed, it is returned unmodified. Result is a string.
    !!!  At the moment, compression is not implemented  !!!
    r   Nr     .r   r   c              3   T   K   | ]#}t          t          |                    |z   V  $d S r   )r
   r   r  s     r~   r  z names2dnsrepr.<locals>.<genexpr>v	  s2      <<SQ[[1_<<<<<<r   )r   r  countr   r  r   )r   r}   ntermins       r~   names2dnsreprr  c	  s     !U  	2337""HC
C  774==AgFHH<<aggdmm<<<<<vE

188C==r   c                 b   g }d}| rt          | d                   }| dd         } |sW|r|dd         dk    r
|dd         }|                    |           d}| r#t          | d                   dk    r
| dd         } z|dz  rt          d          || d|         dz   z  }| |d         } | |S )	a  
    Take as input a DNS encoded string (possibly compressed)
    and returns a list of DNS names contained in it.
    If provided string is already in printable format
    (does not end with a null character, a one element list
    is returned). Result is a list.
    r   r   rb   Nr   r  rr  z.DNS message can't be compressed at this point!)r   r   r   )r   r}   ry  r   s       r~   dnsrepr2namesr  {	  s     C
C
 ad))abbE 	 s233x4''#2#hJJsOOOC S1YY!^^abbET> 	NLMMMq'{T!!ghhK   Jr   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )NIQueryDataFieldc                 2    t          j        | ||           d S r   )r+   r   rZ  s      r~   r   zNIQueryDataField.__init__	  s    $g.....r   c                 N    ||S |\  }}|dk    rt          |          d         }|S r  r  )r   r   r   r   r  s        r~   rv  zNIQueryDataField.i2h	  s5    9H366$$Q'C
r   c                    |t           u rt          |d         t                    r|S 	 t          t          j        |                                           d|                                fS # t          $ r Y nw xY w	 t          t          j        |                                           d|                                fS # t          $ r Y nw xY w|d}t          |          }d|fS )Nr   r   r   rb   )
tupler   intrM   rr   rs   decoder   AF_INETr  r  s      r~   h2izNIQueryDataField.h2i	  s    ::*QqT3//:H	foqxxzz222qxxzz?" 	 	 	D		fnahhjj111qxxzz?" 	 	 	D	 9A!1vs%   AA* *
A76A7;AB= =
C
	C
c                 Z   |\  }}|dk    rg }|r_t          |d                   }|dd          }|dk    rn9|                    t          |d |                   dz              ||d          }|_d                    |          }|r|d         dk    r
|d d         }|S t	          |          S )Nrb   r   rx  r  r   )r   r   r   r   rw  )r   r   r   r   r  r}   r   rX  s           r~   r   zNIQueryDataField.i2repr	  s    366 C $c!f++!""ga<<

9S']33c9:::'((m  $ ''#,,C s2w#~~#2#hJCyyr   c                 2   t          |d          }|dk    r|dfS t          |d          }|dk    r.|dd          dt          t          j        |d d                   ffS |dk    r.|dd          dt          t          j        |d d                   ffS dd	|ffS )
Nqtyper   r   r   r  r   r   r_   r   rb   )r  rN   rr   rs   r  )r   r   r   r  r  s        r~   r   zNIQueryDataField.getfield	  s    W%%A::h;3''Dqyyv9V_af#E#EFFFuq)FNAbqbE"B"BCCCQF{"r   c                    t          |t                    r|d         |d}|d         }|dk    r||d         z   S |dk    r#|t          t          j        |d                   z   S |t          t          j        |d                   z   S )Nrb   )rb   r   r   )r   r  rM   rr   rs   r  )r   r   r   r  r   s        r~   r  zNIQueryDataField.addfield	  s    U## 	ACF66s1v:!VVy#a&9999yQ8888r   N)	r   r   r   r   rv  r  r   r   r  r   r   r~   r  r  	  sn        / / /    ,  &# # #
9 
9 
9 
9 
9r   r  c                       e Zd Zd ZdS )NIQueryCodeFieldc                     |E|                     d          }|dS |d         dk    rdS |d         dk    rdS |d         dk    rdS dS |S )Nr  rb   r   r   )getfieldval)r   r   r   ry   s       r~   r   zNIQueryCodeField.i2m	  sb    9''Ayq1q1q1qqr   N)r   r   r   r   r   r   r~   r  r  	  s#            r   r  z
IPv6 Queryz
Name Queryz
IPv4 Query)r   rb   r   c                       e Zd ZdZ edde           edde           edd           e	dde
           ed	dd
           edddd           edd           edd          gZdS )ICMPv6NIQueryNOOPz*ICMPv6 Node Information Query - NOOP Queryrm   r   r  Nr  r  r   r  r  r  r   TACLSGr  r  )r   r   r   r   r   r  r  _niquery_coder2   r(   icmp6_niqtypesr   r    r  r  r4  r   r   r~   r  r  
  s        7D =j99##FD-@@;w--!>'1n==8Ha,,:gq!X66:gt,,##FD113KKKr   r  c                       e Zd ZdZdZdS )ICMPv6NIQueryNamez/ICMPv6 Node Information Query - IPv6 Name Queryr   Nr   r   r   r   r  r   r   r~   r  r  
  s        <DEEEr   r  c                       e Zd ZdZdZdZdS )ICMPv6NIQueryIPv6z2ICMPv6 Node Information Query - IPv6 Address Queryr   >   N)r   r   r   r   r  r  r   r   r~   r  r  
  s        ?DEEEEr   r  c                       e Zd ZdZdZdS )ICMPv6NIQueryIPv4z2ICMPv6 Node Information Query - IPv4 Address Queryr_   Nr  r   r   r~   r  r  
  s        ?DEEEr   r  zSuccessful ReplyzResponse RefusalzUnknown query type)r   rb   r   zReply set incompletezAll unicast addresseszIPv4 addresseszLink-local addresseszSite-local addresseszGlobal addresses)rb   r   r_   r   r   rs  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )NIReplyDataFieldc                 T    ||S |\  }}|dk    r|\  }}|gt          |          z   }|S r  r  )r   r   r   r   r  ttldnsnamess          r~   rv  zNIReplyDataField.i2h8
  s@    9H366MC%-111C
r   c                    d}t          |t                    s
||j        }n|d         }|d         }|dk    rt          |t          t          f          r|g}t          |t
                    rd |D             }|r.t          |d         t                    r|d         }|dd          }nd}|}d|t          |          gfS |dv r+t          |t
                    s|g}d |fd|D             fS ||fS )Nr   rb   r   c                 d    g | ]-}t          |t                    r|                                n|.S r   )r   r   r  )r<  r  s     r~   r=  z(NIReplyDataField.h2i.<locals>.<listcomp>S
  s3    PPPsZS%9%9BSZZ\\\sPPPr   )r   r_   c                     t          | t                    sd| f} t          | d         t                    r"| d         | d                                         f} | S r  )r   r  r  r  )r   s    r~   fixvaluez&NIReplyDataField.h2i.<locals>.fixvalue`
  sT     "!U++ AAadE** .1qt{{}}-Ar   c                 &    g | ]} |          S r   r   )r<  ry   r  s     r~   r=  z(NIReplyDataField.h2i.<locals>.<listcomp>j
  s!    333AHHQKK333r   )r   r  r  r   r  r   r  r  )r   r   r   r  r  namesr  s         @r~   r  zNIReplyDataField.h2iA
  s=    !U## 		aDE!A A::!c5\** C!T"" QPPaPPP Z!c** d!""]511233f__a&& C   333333344qzr   c                    |\  }}|d}|dk    r |\  }}|t          j        d|          z   |z   S |dk    r'|d                    t          d |                    z   S |dk    r'|d                    t          d |                    z   S ||z   S )Nr   r   !Ir   c                 z    t          j        d| d                   t          t          j        | d                   z   S Nr  r   rb   )r  r  rM   rr   rs   )x_y1s    r~   r  z+NIReplyDataField.addfield.<locals>.<lambda>v
  s0    T471K1KiX^XgimnoipNqNq1q r   r_   c                 z    t          j        d| d                   t          t          j        | d                   z   S r
  )r  r  rM   rr   r  )x_y2s    r~   r  z+NIReplyDataField.addfield.<locals>.<lambda>x
  s0    T471K1KiX^XfhlmnhoNpNp1p r   )r  r  r   r  )r   r   r   r  r   rX  r  dnsstrs           r~   r  zNIReplyDataField.addfieldn
  s    3;C66KCv{4---66!VVsxx$q$qsv w wxxxx!VVsxx$p$pru v vwwwws7Nr   c                 ~   t          |d          }|dk    r|dfS t          |d          }|dk    r|dfS |dk    rJt          |          dk     r|dfS t          j        d|d d                   d         }dd||dd          gffS |d	k    rg }t          |          d
k    ryt          j        d|d d                   d         }t	          t
          j        |dd
                   }|                    ||f           |d
d          }t          |          d
k    y|d	|ffS |dk    rg }t          |          dk    ryt          j        d|d d                   d         }t	          t
          j        |dd                   }|                    ||f           |dd          }t          |          dk    y|d|ffS dd|ffS )Nr  r   r  r  r   r_   r  r   r   r   r   )	r  r   r  r  rN   rr   rs   r   r  )r   r   r   r  r  r  r}   ips           r~   r   zNIReplyDataField.getfield|
  s   sF##199h;W%%A::h;aZZ1vvzz({"-ae,,Q/CS!ABB%L)))aZZCa&&B,,mD!BQB%003v!B$88

C9%%%bccF	 a&&B,,
 q#h;aZZCa&&A++mD!BQB%003v~q1v66

C9%%%abbE	 a&&A++
 q#h; A;r   c                    |dS t          |t                    rt          |          dk    r|\  }}|dk    r:|\  }}t          |          }d |D             }d|d                    |          fz  S |dk    s|dk    r'dd	                    t          d
 |                    z  S t          |          S t          |          S )Nr   r   c              3   4   K   | ]}t          |          V  d S r   )r   )r<  r   s     r~   r  z*NIReplyDataField.i2repr.<locals>.<genexpr>
  s(      BB$iooBBBBBBr   z	ttl:%d %s,r   r_   r   r   c                 (    d| d         | d         fz  S )Nz(%d, %s)r   rb   r   )x_ys    r~   r  z)NIReplyDataField.i2repr.<locals>.<lambda>
  s    Z3q6SVWXSYJZ=Z r   )r   r  r   r  r   r  rw  )r   r   r   r   r  r  r   
names_lists           r~   r   zNIReplyDataField.i2repr
  s    94a 		CFFaKKFAsAvv"W'00BB'BBB
"c388J+?+?%@@@a166499S1Z1Z\_-`-`#a#abb99Awwr   N)r   r   r   rv  r  r  r   r   r   r   r~   r  r  6
  sa          + + +Z  $ $ $L    r   r  c                       e Zd ZdZ edde           edde           edd           edde	           e
d	dd
           edddd           edd           edd          gZdS )ICMPv6NIReplyNOOPz*ICMPv6 Node Information Reply - NOOP Replyrm   r   r  r   r  Nr  r  r  r  r   r  r  r  )r   r   r   r   r   r  _nireply_coder2   r(   r  r   r    r  r  r4  r   r   r~   r  r  
  s        7D =j99 =M::;w--!>'1n==8Ha,,:gq!X66:gt,,##FD113KKKr   r  c                       e Zd ZdZdZdS )ICMPv6NIReplyNamez*ICMPv6 Node Information Reply - Node Namesr   Nr  r   r   r~   r  r  
  s        7DEEEr   r  c                       e Zd ZdZdZdS )ICMPv6NIReplyIPv6z.ICMPv6 Node Information Reply - IPv6 addressesr   Nr  r   r   r~   r  r  
          ;DEEEr   r  c                       e Zd ZdZdZdS )ICMPv6NIReplyIPv4z.ICMPv6 Node Information Reply - IPv4 addressesr_   Nr  r   r   r~   r   r   
  r  r   r   c                       e Zd ZdZdZdS )ICMPv6NIReplyRefusezBICMPv6 Node Information Reply - Responder refuses to supply answerrb   Nr   r   r   r   r  r   r   r~   r"  r"  
  s        ODDDDr   r"  c                       e Zd ZdZdZdS )ICMPv6NIReplyUnknownz>ICMPv6 Node Information Reply - Qtype unknown to the responderr   Nr#  r   r   r~   r%  r%  
  s        KDDDDr   r%  c                 f   t           j        }t          | d                   }|dk    rlt          |           dk    rXt	          j        d| dd                   \  }t          t          t          t          d
                    |t           j                  }n|dk    rt          | d                   }|dk    rat          |           dk    rMt	          j        d| dd                   \  }t          t          t          d	
                    |t                    }n|dk    rt          }n|d
k    rt           }|S )Nr   r   r   r  r_   r  r   rb   )r   r   r_   r   )r   rC  r   r   r  r  r  r  r  r  r   r  r  r   r  r"  r%  )r|   r8  rm   r  r  s        r~   r   r   
  s   
.Cqt99Ds{{q66A::]41Q300FE'''') ) *-UDN)C)C  
1Q4yy1991vvzztQqsV44+++- --0S8I-J-J  QYY%CCQYY&CJr   DISDIODAOzDAO-ACKDCOzDCO-ACK)r   rb   r   r   r  r   c                   j    e Zd ZdZ edde           edde           edd          gZe	dd	d
iZ
dS )r  RPLrm   r  r  r   r  Nr   zff02::1a)r   re   )r   r   r   r   r   r  rplcodesr2   r4  rt   r  r   r   r~   r  r    s_        D =j99 =H55;w--/K Bz::;OOOr   c                       e Zd ZdZ edde           edd           edd           edd           ed	d
d
d
di           e	ddd          gZ
d ZdS )rz  z+ICMPv6 Home Agent Address Discovery Requestrm   r  r  r   r  Nr3  r4  rb   MRr}   r  c                 j    t          j        d| j                  | j                                        z   S Nr  r  r  r3  r  r   r   s    r~   r   zICMPv6HAADRequest.hashret  )    {4))DL,@,@,B,BBBr   )r   r   r   r   r   r  r   r2   r   r/   r4  r   r   r   r~   rz  rz    s        8D =j999VQ'';w--;tT**<QAt9559UAr**,KC C C C Cr   c                       e Zd ZdZ edde           edd           edd           edd           ed	d
d
d
di           e	ddd           e
dd          gZd Zd ZdS )r{  z)ICMPv6 Home Agent Address Discovery Replyrm   r  r  r   r  Nr3  r4  rb   r/  r}   r  r"  c                 j    t          j        d| j                  | j                                        z   S r1  r2  r   s    r~   r   zICMPv6HAADReply.hashret,  r3  r   c                 P    t          |t                    sdS | j        |j        k    S r   )r   rz  r3  r  s     r~   r.  zICMPv6HAADReply.answers/  s)    %!233 	1w%(""r   )r   r   r   r   r   r  r   r2   r   r/   r   r4  r   r.  r   r   r~   r{  r{  "  s        6D =j999VQ'';w--;tT**<QAt9559UAr**<T224KC C C# # # # #r   c                       e Zd ZdZ edde           edd           edd           edd           ed	d          gZd
 Z	dS )r|  z!ICMPv6 Mobile Prefix Solicitationrm   r  r  r   r  Nr3  r}   c                 6    t          j        d| j                  S r1  r  r  r3  r   s    r~   _hashretzICMPv6MPSol._hashret=      {4)))r   )
r   r   r   r   r   r  r   r2   r4  r:  r   r   r~   r|  r|  5  s|        .D =j999VQ'';w--;tT**;ua((	*K* * * * *r   c                       e Zd ZdZ edde           edd           edd           edd           ed	d
d
ddd           e	ddd          gZ
d Zd ZdS )r}  z"ICMPv6 Mobile Prefix Advertisementrm   r  r  r   r  Nr3  r  r   r  r  )r   rb   r}   r  c                 6    t          j        d| j                  S r1  r9  r   s    r~   r   zICMPv6MPAdv.hashretJ  r;  r   c                 ,    t          |t                    S r   )r   r|  r  s     r~   r.  zICMPv6MPAdv.answersM  r  r   )r   r   r   r   r   r  r   r2   r   r/   r4  r   r.  r   r   r~   r}  r}  A  s        /D =j999VQ'';w--;tT**<A33/?/?@@9UAr**,K* * *. . . . .r   zBinding Refresh AdvicezAlternate Care-of AddresszNonce IndiceszBinding Authorization DatazMobile Network Prefix (RFC3963)zLink-Layer Address (RFC4068)z Mobile Node Identifier (RFC4283)z)Mobility Message Authentication (RFC4285)zReplay Protection (RFC4285)z CGA Parameters Request (RFC4866)zCGA Parameters (RFC4866)zSignature (RFC4866)zHome Keygen Token (RFC4866)zCare-of Test Init (RFC4866)zCare-of Test (RFC4866))r   r   r_   rn  r   r  r   r  r  r  r  r0  r  r  r   c                   &    e Zd ZdZddgZd Zd ZdS )_MIP6OptAlignaZ   Mobile IPv6 options have alignment requirements of the form x*n+y.
    This class is inherited by all MIPv6 options to help in computing the
    required Padding for that option, i.e. the need for a Pad1 or PadN
    option before it. They only need to provide x and y as class
    parameters. (x=0 and y=0 are used when no alignment is required)r   r   c                 l    | j         }| j        }|dk    r|dk    rdS |||z
  |z   dz
  |z  z  |z   |z
  }|S r  )r   r   r  s        r~   r  z_MIP6OptAlign.alignment_deltam  sQ    FF66a1ff1fqj1nq(Q./!3f<r   c                 
    d|fS r  r   r  s     r~   r  z_MIP6OptAlign.extract_paddingu  r  r   N)r   r   r   r=  r   r  r  r   r   r~   r@  r@  d  sI        H H c
I      r   r@  c                   b    e Zd ZdZ edde           edd           edd          gZdZ	dZ
dS )MIP6OptBRAdvicez+Mobile IPv6 Option - Binding Refresh Advicer~  r   olenrinterr   Nr   r   r   r   r   _mobopttypesr   r)   r4  r   r   r   r   r~   rD  rD  y  sU        8D =!\::9VQ'':h**,K 	
A	AAAr   rD  c                   b    e Zd ZdZ edde           edd           edd          gZdZ	d	Z
d
S )MIP6OptAltCoAz(MIPv6 Option - Alternate Care-of Addressr~  r   rE  r   acoar   r   r   Nr   r   r   r   r   rH  r   r"   r4  r   r   r   r   r~   rJ  rJ    sU        5D =!\::9VR((8FD))+K 	
A	AAAr   rJ  c                   x    e Zd ZdZ edde           edd           edd           edd          gZd	Z	dZ
d
S )MIP6OptNonceIndiceszMIPv6 Option - Nonce Indicesr~  r_   rE  r   hnir   conir   NrG  r   r   r~   rN  rN    sd        )D =!\::9VR((:eQ'':fa((*K 	
A	AAAr   rN  c                   d    e Zd ZdZ edde           edd           eddd          gZd	Z	d
Z
dS )MIP6OptBindingAuthDataz)MIPv6 Option - Binding Authorization Datar~  rn  rE  r   authenticatorr   `   r   r   N)r   r   r   r   r   rH  r   r   r4  r   r   r   r   r~   rR  rR    sW        6D =!\::9VR((8OQ335K 	
A	AAAr   rR  c                       e Zd ZdZ edde           edd           edd           edd	           ed
d          gZdZ	dZ
dS )MIP6OptMobNetPrefixz#NEMO Option - Mobile Network Prefixr~  r   rE  r  r  r   r   r   r7  r   r   r_   NrL  r   r   r~   rV  rV    ss        0D =!\::9VR((9Z++9VR((8Hd++	-K
 	
A	AAAr   rV  c                       e Zd ZdZ edde           edd           edde           edd           ed	e	          gZ
dZdZd
S )MIP6OptLLAddrz*MIPv6 Option - Link-Layer Address (MH-LLA)r~  r  rE  ocoder   padr   rQ  N)r   r   r   r   r   rH  r   rR  r$   r   r4  r   r   r   r   r~   rX  rX    sv        7D =!\::9VQ'' =!-ABB9UA&&8E9--	/K
 	
A	AAAr   rX  c                       e Zd ZdZ edde           eddddd 	           ed
dddi           eddd           gZdZ	dZ
dS )MIP6OptMNIDz%MIPv6 Option - Mobile Node Identifierr~  r   rE  Nr3  r  c                     |dz   S r  r   r  s     r~   r  zMIP6OptMNID.<lambda>  
    q1u r   r  subtyperb   NAIr  c                     | j         dz
  S r  rE  r  s    r~   r  zMIP6OptMNID.<lambda>      sx!| r   r  r   r   r   r   r   r   rH  r   r-   r4  r   r   r   r   r~   r\  r\    s        2D =!\:: =3(<(<> > > =A5z::;tR+C+CE E E	FK 	
A	AAAr   r\  c            	           e Zd ZdZ edde           eddddd 	           ed
dddd           edd           eddd           gZ	dZ
dZdS )MIP6OptMsgAuthz.MIPv6 Option - Mobility Message Authenticationr~  r  rE  Nauthdatar  c                     |dz   S Nrn  r   r  s     r~   r  zMIP6OptMsgAuth.<lambda>  r^  r   r  r_  rb   z$MN-HA authentication mobility optionz%MN-AAA authentication mobility optionrb   r   mspiAAAAAAAAAAAAc                     | j         dz
  S ri  rb  r  s    r~   r  zMIP6OptMsgAuth.<lambda>  rc  r   r  r_   )r   r   r   r   r   rH  r   r!   r-   r4  r   r   r   r   r~   rf  rf    s        ;D =!\:: =(<(<> > > =A3Y3Z0\ 0\ ] ]8FD));z8+C+CE E EFK 	
A	AAAr   rf  c                       e Zd Zd ZdS )NTPTimestampFieldc                     |dk     rd|z  S d}t          |dz	            }t          |dz            dz  }||z   |z   }t          dt          |                    }d||fz  S )	Nl        <o z Some date a few decades ago (%d)l1RW rs  rO  g      =z%a, %d %b %Y %H:%M:%S +0000z%s (%d))r  r   r   r   )r   r   r   r  r   jr}   r   s           r~   r   zNTPTimestampField.i2repr  sw    %&&599 RLL!j.!!H,!eem2F3KK@@Aq6!!r   Nr   r   r   r   r   r   r~   ro  ro    s#        " " " " "r   ro  c                   b    e Zd ZdZ edde           edd           edd          gZdZ	dZ
d	S )
MIP6OptReplayProtectionz MIPv6 option - Replay Protectionr~  r  rE  r   	timestampr   r   N)r   r   r   r   r   rH  r   ro  r4  r   r   r   r   r~   rt  rt    sV        -D ="l;;9VQ''$$[!446K 	
A	AAAr   rt  c                   L    e Zd ZdZ edde           edd          gZdZdZ	dS )MIP6OptCGAParamsReqz%MIPv6 option - CGA Parameters Requestr~  r  rE  r   N
r   r   r   r   r   rH  r   r4  r   r   r   r   r~   rw  rw    sD        2D ="l;;9VQ'')K	A	AAAr   rw  c                   n    e Zd ZdZ edde           edddd           edd	d
           gZdZ	dZ
dS )MIP6OptCGAParamszMIPv6 option - CGA Parametersr~  r  rE  N	cgaparamsr  r  r  c                     | j         S r   rb  r  s    r~   r  zMIP6OptCGAParams.<lambda>      sx r   r  r   rd  r   r   r~   rz  rz    so        *D ="l;; =#NNN;{B+?+?A A ABK 	
A	AAAr   rz  c                   n    e Zd ZdZ edde           edddd           edd	d
           gZdZ	dZ
dS )MIP6OptSignaturezMIPv6 option - Signaturer~  r0  rE  Nsigr  r  r  c                     | j         S r   rb  r  s    r~   r  zMIP6OptSignature.<lambda>  r}  r   r  r   rd  r   r   r~   r  r    so        %D ="l;; =CHHH;ub+?+?A A ABK 	
A	AAAr   r  c                   n    e Zd ZdZ edde           edddd           edd	d
           gZdZ	dZ
dS )MIP6OptHomeKeygenTokenz MIPv6 option - Home Keygen Tokenr~  r  rE  Nhktr  r  r  c                     | j         S r   rb  r  s    r~   r  zMIP6OptHomeKeygenToken.<lambda>  r}  r   r  r   rd  r   r   r~   r  r    so        -D ="l;; =CHHH;ub+?+?A A ABK 	
A	AAAr   r  c                   L    e Zd ZdZ edde           edd          gZdZdZ	dS )MIP6OptCareOfTestInitz MIPv6 option - Care-of Test Initr~  r  rE  r   Nrx  r   r   r~   r  r    sD        -D ="l;;9VQ'')K	A	AAAr   r  c                   n    e Zd ZdZ edde           edddd           edd	d
           gZdZ	dZ
dS )MIP6OptCareOfTestzMIPv6 option - Care-of Testr~  r   rE  Ncoktr  r  r_  c                     | j         S r   rb  r  s    r~   r  zMIP6OptCareOfTest.<lambda>'  r}  r   r  r   rd  r   r   r~   r  r  "  so        (D ="l;; =SIII;v{+?+?A A ABK 	
A	AAAr   r  c                       e Zd ZdZ edde           edddd           edd	d
           gZdZ	dZ
edd            ZdS )MIP6OptUnknownz Scapy6 - Unknown Mobility Optionr~  r   rE  Nodatar  r  r  c                     | j         S r   rb  r  s    r~   r  zMIP6OptUnknown.<lambda>1  r}  r   r  r   c                 `    |r+t          |d                   }|t          v rt          |         S | S r   )r   	moboptcls)r8  r9  r:  r;  r,  s        r~   r<  zMIP6OptUnknown.dispatch_hook5  s1     	$DGAI~~ |#
r   r   )r   r   r   r   r   rH  r   r-   r4  r   r   r>  r<  r   r   r~   r  r  ,  s        -D =!\:: =cJJJ;w+?+?A A ABK 	
A	A   [  r   r  BRRHoTICoTIHoTCoTBUBABEzFast BUzFast BAzFast NA)r   rb   r   r   r_   rn  r   r  r   r  r  zBinding Update acceptedz'Accepted but prefix discovery necessaryzReason unspecifiedzAdministratively prohibitedzInsufficient resourceszHome registration not supportedzNot home subnetz#Not home agent for this mobile nodez"Duplicate Address Detection failedzSequence number out of windowzExpired home nonce indexzExpired care-of nonce indexzExpired noncesz#Registration type change disallowedz%Mobile Router Operation not permittedzInvalid PrefixzNot Authorized for Prefixz*Forwarding Setup failed (prefixes missing)zMIPV6-ID-MISMATCHzMIPV6-MESG-ID-REQDzMIPV6-AUTH-FAILz'Permanent home keygen token unavailablez%CGA and signature verification failedz"Permanent home keygen token existsz"Non-null home nonce index expected)r  r  r  r  r  r  r     c                   $    e Zd ZdZeddiiZd ZdS )_MobilityHeaderzDummy IPv6 Mobility Headerr   r   c                 L   ||z  }| j         }| j         t          |          dz
  dz  }|d d         t          j        d|          z   |dd          z   }| j        t	          d| j        |          }n| j        }|d d         t          j        d|          z   |dd          z   }|S )	Nr   rb   r  r   r   r_   r  r   )r   r  r  r  rf  rF  )r   r|   r  r   r  s        r~   r  z_MobilityHeader.post_build  s    	S(81vvza'GbqbEFKW---!""5:sDOQ77EEJEbqbEFKe,,,qu4r   N)r   r   r   r   rt   r  r  r   r   r~   r  r  {  s6        'DdC[)O    r   r  c            
           e Zd ZdZ edde           edd           edde           edd           edd           e	d	d
d           gZ
dS )r   z&IPv6 Mobility Header - Generic Messager   r   r   Nmhtyper}   r  msg     c                     d| j         z  dz
  S )Nr   r   r   r  s    r~   r  zMIP6MH_Generic.<lambda>  s    q37{Q r   r  )r   r   r   r   r   r3  r   mhtypesr2   r-   r4  r   r   r~   r   r     s        3D =r6229UD)) =4999UD));w--;uk+F+FH H HIKKKr   r   c                       e Zd ZdZ edde           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           gZeddiiZd ZdS )
MIP6MH_BRRz.IPv6 Mobility Header - Binding Refresh Requestr   r   r   Nr  r   r}   r  r1  r  rb   r$  r   c                     d| j         z  S r  r   r  s    r~   r  zMIP6MH_BRR.<lambda>  s    SW r   r  r   c                     dS Ns    	r   r   s    r~   r   zMIP6MH_BRR.hashret  s	     r   )r   r   r   r   r   r3  r   r  r2   r)   r  r  r  r4  rt   r  r   r   r   r~   r  r    s        ;D =r6229UD)) =1g669UD));w--:fd++''	155 =B-D-DF F FGK dC[)O    r   r  c                       e Zd ZdZ edde           edd           edde           edd           ed	d           e	d
dd           e	ddd           e
dd           edg edd           g	ZeddiiZd ZdS )MIP6MH_HoTIz%IPv6 Mobility Header - Home Test Initr   r   r   Nr  rb   r}   r  r  r  r   cookier_  r   r  r$  r   c                     d| j         dz
  z  S rY  r   r  s    r~   r  zMIP6MH_HoTI.<lambda>      cgk9J r   r  r   c                 *    t          | j                  S r   r   r  r   s    r~   r   zMIP6MH_HoTI.hashret      DK(((r   )r   r   r   r   r   r3  r   r  r2   r,   r  r  r  r4  rt   r  r   r   r   r~   r  r    s        2D =r6229UD)) =1g669UD));w--##JQ??##Hk1==''	155 =B-J-JL L L	MK dC[)O) ) ) ) )r   r  c                       e Zd ZdZdZd ZdS )MIP6MH_CoTIz(IPv6 Mobility Header - Care-of Test Initr   c                 *    t          | j                  S r   r  r   s    r~   r   zMIP6MH_CoTI.hashret  r  r   N)r   r   r   r   r  r   r   r   r~   r  r    s-        5DF) ) ) ) )r   r  c                      e Zd ZdZ edde           edd           edde           edd           ed	d           e	d
d           e
ddd           e
ddd           edd           edg edd           g
ZeddiiZd Zd ZdS )
MIP6MH_HoTz IPv6 Mobility Header - Home Testr   r   r   Nr  r   r}   r  indexr  r_  r   tokenr  rb   r$  r[  c                     d| j         dz
  z  S Nr   r   r   r  s    r~   r  zMIP6MH_HoT.<lambda>  r  r   r  r   c                 *    t          | j                  S r   r  r   s    r~   r   zMIP6MH_HoT.hashret  r  r   c                 T    t          |t                    r| j        |j        k    rdS dS r  )r   r  r  r  s     r~   r.  zMIP6MH_HoT.answers  -    uk** 	u|++1qr   )r   r   r   r   r   r3  r   r  r2   r)   r,   r  r  r  r4  rt   r  r   r.  r   r   r~   r  r    s       -D =r6229UD)) =1g669UD));w--:gt,,##Hk1==##G[!<<''	155 =B-J-JL L L
MK dC[)O) ) )    r   r  c                   "    e Zd ZdZdZd Zd ZdS )
MIP6MH_CoTz#IPv6 Mobility Header - Care-of Testr_   c                 *    t          | j                  S r   r  r   s    r~   r   zMIP6MH_CoT.hashret  r  r   c                 T    t          |t                    r| j        |j        k    rdS dS r  )r   r  r  r  s     r~   r.  zMIP6MH_CoT.answers  r  r   N)r   r   r   r   r  r   r.  r   r   r~   r  r    s<        0DF) ) )    r   r  c                       e Zd Zd ZdS )LifetimeFieldc                     dd|z  z  S )Nz%d secr_   r   r  s      r~   r   zLifetimeField.i2repr  s    1q5!!r   Nrr  r   r   r~   r  r    s#        " " " " "r   r  c                   4   e Zd ZdZ edde           edd           edde           edd           ed	d           ed
d           e	dddd           e
ddd           edd           edd           edg edd           gZeddiiZd Zd ZdS )	MIP6MH_BUz%IPv6 Mobility Header - Binding Updater   r   r   Nr  rn  r}   r  r  r  KHAr  PRMKLHAr  r   r  mhtimer   r  rb   r$  r  c                     d| j         z  dz
  S Nr   r_   r   r  s    r~   r  zMIP6MH_BU.<lambda>      SWq r   r  r   c                     dS r  r   r   s    r~   r   zMIP6MH_BU.hashret      r   c                 4    t          |t                    rdS dS r  )r   r  r  s     r~   r.  zMIP6MH_BU.answers  s    eZ(( 	1qr   )r   r   r   r   r   r3  r   r  r2   r    r/   r  r  r  r  r4  rt   r  r   r.  r   r   r~   r  r    s       2D =r6229UD)) =1g669UD));w--;ud++:gua;;9ZA.. =1--''	155 =B-H-HJ J JKK dC[)O      r   r  c                   L   e Zd ZdZ edde           edd           edde           edd           ed	d           ed
de	           e
dddd           eddd           edd           edd           edd           edg edd           gZeddiiZd Zd ZdS )	MIP6MH_BAz"IPv6 Mobility Header - Binding ACKr   r   r   Nr  r   r}   r  statusr   r  Kr   PRKr1  rn  r  r  r  rb   r$  r  c                     d| j         z  dz
  S r  r   r  s    r~   r  zMIP6MH_BA.<lambda>  r  r   r  r   c                     dS r  r   r   s    r~   r   zMIP6MH_BA.hashret  r  r   c                     t          |t                    r2|j        dk    r'| j        dk    r|j        dz  r| j        |j        k    rdS dS )Nrn  r   rb   r   )r   r  r  r  r  r  s     r~   r.  zMIP6MH_BA.answers  sV    ui(( 	LAK1K# EI%%1qr   )r   r   r   r   r   r3  r   r  r2   bastatusr    r/   r  r  r  r4  rt   r  r   r.  r   r   r~   r  r    s&       /D =r6229UD)) =1g669UD));w-- =1h77:gsAu559VT1--;ud++;x++''	155 =B-H-HJ J JKK dC[)O      r   r  z3Unknown binding for Home Address destination optionzUnrecognized MH Type valuerj  c                       e Zd ZdZ edde           edd           edde           edd	           ed
d           edd	e	           edd	           e
dd           edg edd           g	ZeddiiZdS )	MIP6MH_BEz$IPv6 Mobility Header - Binding Errorr   r   r   Nr  r  r}   r   r  r  r  har   r$  r[  c                     d| j         dz
  z  S r  r   r  s    r~   r  zMIP6MH_BE.<lambda>:  r  r   r  r   )r   r   r   r   r   r3  r   r  r2   	_bestatusr"   r  r  r4  rt   r  r   r   r~   r  r  /  s        1D =r6229UD)) =1g669UA&&;w-- =1i889Z++8D$'' =B-J-JL L L	MK dC[)OOOr   r  c                       e Zd Zd ZdS )AS_resolver6c                    t          |          r=t          t          j        |          }t	          t          j        |dd                   }n't          |          rt          |          d         }n|}t          j	        | |          \  }}}|
                    d          r)	 t          |dd                   }n# t          $ r Y nw xY w|||fS )z
        overloaded version to provide a Whois resolution on the
        embedded IPv4 address if the address is 6to4 or Teredo.
        Otherwise, the native IPv6 address is passed.
        r   r   ASN)rQ   rM   rr   rs   rN   r  rT   rX   r   _resolve_one
startswithr  
ValueError)r   r  rX  rw   r:  asndescs          r~   r  zAS_resolver6._resolve_oneO  s     " 	FOR00CV^S1X66DDb!! 	(,,Q/DDD+8tDD3>>$ 	#abb'll    3}s   #B; ;
CCN)r   r   r   r  r   r   r~   r  r  N  s#            r   r  c                   8    e Zd Zg Zd Zd Z e            fdZdS )TracerouteResult6c                 .    |                      d           S )Nc                 b    |                      d          | j        |                     d          fS )NzO%-42s,IPv6.dst%:{TCP:tcp%TCP.dport%}{UDP:udp%UDP.dport%}{ICMPv6EchoRequest:IER}z%-42s,IPv6.src% {TCP:%TCP.flags%}{ICMPv6DestUnreach:%ir,type%}{ICMPv6PacketTooBig:%ir,type%}{ICMPv6TimeExceeded:%ir,type%}{ICMPv6ParamProblem:%ir,type%}{ICMPv6EchoReply:%ir,type%})r  rh   )r   r  s     r~   r  z(TracerouteResult6.show.<locals>.<lambda>m  s@    QYY  8I  .J  .J-.V-.YY 8U .V .V-W r   )
make_tabler   s    r~   showzTracerouteResult6.showl  s'      W  W X X 	Xr   c                    i }| j         D ]|\  }}t          |vr|t                   j        }||vri ||<   t          |v pt          |v pt
          |v pt          |v  }|t                   j        |f||         |t                   j        <   }|	                                D ]Z}	 t          d |                                D                       }n# t          $ r Y ;w xY wt          |          D ]}||k    r||= [|S )Nc              3   0   K   | ]\  }}|d          |V  dS )rb   Nr   )r<  r   r   s      r~   r  z.TracerouteResult6.get_trace.<locals>.<genexpr>  s/      88da1Q48888888r   )r}   rt   re   rf  rd  re  rg  rf   rh   valuesrJ  itemsr  r   )	r   tracer   r  ry   r   kr2  lis	            r~   	get_tracezTracerouteResult6.get_tracet  s4   H 	4 	4DAq1}}$A~~a'1, -&!+-'1,- (1,.A
 &'tW[!^E!HQtW\"" 	 	A88aggii88888   1gg  66" s   +C


CCc                 .    t          j        | fd|i| d S )NASres)r:   graph)r   r  r;  s      r~   r  zTracerouteResult6.graph  s&    t::5:E:::::r   N)r   r   r   r   r  r  r  r  r   r   r~   r  r  i  sY        IX X X  8 ',.. ; ; ; ; ; ;r   r  P      c                 V   |t           j        }|Et          t          | ||f          t	          t                      ||          z  f|d|d|\  }	}
n't          t          | ||f          |z  f||d|\  }	}
t          |	j                  }	|r|	                                 |	|
fS )zkInstant TCP traceroute using IPv6
    traceroute6(target, [maxttl=30], [dport=80], [sport=80]) -> None
    N)re   rh   )r  sportdportzicmp6 or tcp)ro   filterrp   )ro   rp   )	r   verbrH   rt   r8   rY   r  r}   r  )targetr  minttlmaxttlr  l4ro   rp   r;  r   bs              r~   traceroute6r    s     )	z$6(8999CGIIUZbg<h<h<hh T!.'T TMRT T11 $6(8999B> =!7= =6;= =1 	!%  A 	a4Kr   )L3RawSocketc                        e Zd ZeddddfdZdS )L3RawSocket6Nr   c                    t          j         t           j        t           j        t           j                  | _        t          j         t           j        t           j        t          j        |                    | _        || _        d S r   )	rr   rs   SOCK_RAWIPPROTO_RAWouts	AF_PACKEThtonsinsrn   )r   rm   r  rn   promiscnofilters         r~   r   zL3RawSocket6.__init__  sN    fovHZ[[DI}V%5vUYHZHZ[[DHDJJJr   )r   r   r   r   r   r   r   r~   r  r    s4         *4tT\] 	 	 	 	 	 	r   r  203.178.135.36c                     | t           _        |t           _        t          j        t           k    st          j        t           _        nt          `t           S r   )	_IPv6inIPre   rf   r   L3socketr8  rd   s     r~   IPv6inIPr    s3    IMIM=I%%	Mr   c                   `    e Zd ZdZdZdZej        ej        dfdZ	d
dZ
d Zd ZefdZd	 ZdS )r  z	127.0.0.1Nr   c                 X    t          j        | |||            | j        di || _        d S )Nr   )rJ   r   r8  worker)r   familyrm   r/  r  s        r~   r   z_IPv6inIP.__init__  s6    T64777dh&&&&r   c                 6    |t           _        |t           _        d S r   )r  rf   re   )r   re   rf   s      r~   setz_IPv6inIP.set  s    		r   c                 ^    | j                                         }|                     |          S r   )r  nonblock_recv_recvr  s     r~   r  z_IPv6inIP.nonblock_recv  s%    K%%''zz!}}r   c                 b    | j                             |          }|                     ||          S r   )r  recvr  )r   r   r|   s      r~   r  z_IPv6inIP.recv  s+    KQzz!Qr   c                     ||S t          |t                    rF|j        | j        k    r6|j        t
          j        k    r!t          |j        t                    r|j        S |S r   )	r   r6   rf   re   r/  rr   r\   r  rt   )r   r|   r   s      r~   r  z_IPv6inIP._recv  s]    9H2 	%u  QW0C%C%Cai.. %9$r   c                     | j                             t          | j        | j        t
          j                  |z            S )N)re   rf   r/  )r  sendr6   re   rf   rr   r\   )r   r   s     r~   r"  z_IPv6inIP.send  s4    {txTXVEX Y Y Y\] ]^^^r   r   )r   r   r   re   rf   r8  rr   rs   SOCK_STREAMr   r  r  r  r   r  r"  r   r   r~   r  r    s        
C
C
C$oF4Fa ' ' ' '               _ _ _ _ _r   r  c                      d st           j        st                    dz  }t          d|fd fd           dS )z
    Internal generic helper accepting a specific callback as first argument,
    for NS or NA reply. See the two specific functions below.
    c                    t           | v rt          | v r	t          | v sdS | t                    j        }|r||k    rdS | t                   j        dk    rdS t	          t
          j        | t                   j                  }|r||k    rdS t	          t
          j        | t                   j                  }t          |          }||k    rdS dS )2
        Check if packet req is a request
        r   r   rb   )
r>   rt   ru   rf   rM   rr   rs   rj   re   rO   )reqmac_src_filter
tgt_filtermac_srcrj   received_snmaexpected_snmas          r~   
is_requestz'_NDP_Attack_DAD_DoS.<locals>.is_request  s     1C1C1 e*. 	g771 t9=D  1 [)9)=>> 	#++1!&/3t9=AA#C((M))1qr   icmp6 and not ether src %sr   c                      |           S r   r   r   r-  r(  r)  s    r~   r  z%_NDP_Attack_DAD_DoS.<locals>.<lambda>      JJq.*EE r   c                      |           S r   r   )r   rn   reply_callback	reply_macs    r~   r  z%_NDP_Attack_DAD_DoS.<locals>.<lambda>   s    q)U;; r   storer  lfilterprnrn   Nr   rn   r   rG   )r3  rn   r(  r)  r4  sniff_filterr-  s   ````` @r~   _NDP_Attack_DAD_DoSr;    s      <  
  )!%((	/);L	EEEEEE;;;;;;	     r   c                 2    d }t          || |||           dS )a.  
    Perform the DAD DoS attack using NS described in section 4.1.3 of RFC
    3756. This is done by listening incoming NS messages sent from the
    unspecified address and sending a NS reply for the target address,
    leading the peer to believe that another node is also performing DAD
    for that address.

    By default, the fake NS sent to create the DoS uses:
     - as target address the target address found in received NS.
     - as IPv6 source address: the unspecified address (::).
     - as IPv6 destination address: the link-local solicited-node multicast
       address derived from the target address in received NS.
     - the mac address of the interface as source (or reply_mac, see below).
     - the multicast mac address derived from the solicited node multicast
       address used as IPv6 destination address.

    Following arguments can be used to change the behavior:

    iface: a specific interface (e.g. "eth0") of the system on which the
         DoS should be launched. If None is provided conf.iface is used.

    mac_src_filter: a mac address (e.g "00:13:72:8c:b5:69") to filter on.
         Only NS messages received from this source will trigger replies.
         This allows limiting the effects of the DoS to a single target by
         filtering on its mac address. The default value is None: the DoS
         is not limited to a specific mac address.

    tgt_filter: Same as previous but for a specific target IPv6 address for
         received NS. If the target address in the NS message (not the IPv6
         destination address) matches that address, then a fake reply will
         be sent, i.e. the emitter will be a target of the DoS.

    reply_mac: allow specifying a specific source mac address for the reply,
         i.e. to prevent the use of the mac address of the interface.
    c                 (   | t                    j        }| t                   j        }| t                   j        }t          |          t          d|          z  t	          |          z  }t          ||d           t          d|d|d	           d
S )zE
        Callback that reply to a NS by sending a similar NS
        rf   r   rN  ri   r   rn   rp   zReply NS for target address  (received from )N)r>   rf   rt   re   ru   rj   rF   printr'  r4  rn   r   re   rj   reps          r~   ns_reply_callbackz4NDP_Attack_DAD_DoS_via_NS.<locals>.ns_reply_callbackJ  s     %jn$im+"	"""Td%<%<%<<{s?S?S?SSc****SSS###NOOOOOr   Nr;  )rn   r(  r)  r4  rE  s        r~   NDP_Attack_DAD_DoS_via_NSrG  $  s?    LP P P )5."I/ / / / /r   c                 2    d }t          || |||           dS )a  
    Perform the DAD DoS attack using NS described in section 4.1.3 of RFC
    3756. This is done by listening incoming NS messages *sent from the
    unspecified address* and sending a NA reply for the target address,
    leading the peer to believe that another node is also performing DAD
    for that address.

    By default, the fake NA sent to create the DoS uses:
     - as target address the target address found in received NS.
     - as IPv6 source address: the target address found in received NS.
     - as IPv6 destination address: the link-local solicited-node multicast
       address derived from the target address in received NS.
     - the mac address of the interface as source (or reply_mac, see below).
     - the multicast mac address derived from the solicited node multicast
       address used as IPv6 destination address.
     - A Target Link-Layer address option (ICMPv6NDOptDstLLAddr) filled
       with the mac address used as source of the NA.

    Following arguments can be used to change the behavior:

    iface: a specific interface (e.g. "eth0") of the system on which the
          DoS should be launched. If None is provided conf.iface is used.

    mac_src_filter: a mac address (e.g "00:13:72:8c:b5:69") to filter on.
         Only NS messages received from this source will trigger replies.
         This allows limiting the effects of the DoS to a single target by
         filtering on its mac address. The default value is None: the DoS
         is not limited to a specific mac address.

    tgt_filter: Same as previous but for a specific target IPv6 address for
         received NS. If the target address in the NS message (not the IPv6
         destination address) matches that address, then a fake reply will
         be sent, i.e. the emitter will be a target of the DoS.

    reply_mac: allow specifying a specific source mac address for the reply,
         i.e. to prevent the use of the mac address of the interface. This
         address will also be used in the Target Link-Layer Address option.
    c                 X   | t                    j        }| t                   j        }| t                   j        }t          |          t          ||          z  }|t          |ddd          z  }|t          |          z  }t          ||d           t          d|d	|d
           dS )z7
        Callback that reply to a NS with a NA
        r>  rN  r   rb   rj   r  r4  r  rk   r?  Reply NA for target address r@  rA  N)
r>   rf   rt   re   ru   rj   rq  r   rF   rB  rC  s          r~   na_reply_callbackz4NDP_Attack_DAD_DoS_via_NA.<locals>.na_reply_callback  s     %jn$im+"	"""Tcs%;%;%;;{sa12222#95555c****SSS###NOOOOOr   NrF  )rn   r(  r)  r4  rL  s        r~   NDP_Attack_DAD_DoS_via_NArM  \  s?    RP P P  )5."I/ / / / /r   Fc           	           d d  st           j         st                     dz  }rdndt          d|fd fd            d	S )
aA  
    The main purpose of this function is to send fake Neighbor Advertisement
    messages to a victim. As the emission of unsolicited Neighbor Advertisement
    is pretty pointless (from an attacker standpoint) because it will not
    lead to a modification of a victim's neighbor cache, the function send
    advertisements in response to received NS (NS sent as part of the DAD,
    i.e. with an unspecified address as source, are not considered).

    By default, the fake NA sent to create the DoS uses:
     - as target address the target address found in received NS.
     - as IPv6 source address: the target address
     - as IPv6 destination address: the source IPv6 address of received NS
       message.
     - the mac address of the interface as source (or reply_mac, see below).
     - the source mac address of the received NS as destination macs address
       of the emitted NA.
     - A Target Link-Layer address option (ICMPv6NDOptDstLLAddr)
       filled with the mac address used as source of the NA.

    Following arguments can be used to change the behavior:

    iface: a specific interface (e.g. "eth0") of the system on which the
          DoS should be launched. If None is provided conf.iface is used.

    mac_src_filter: a mac address (e.g "00:13:72:8c:b5:69") to filter on.
         Only NS messages received from this source will trigger replies.
         This allows limiting the effects of the DoS to a single target by
         filtering on its mac address. The default value is None: the DoS
         is not limited to a specific mac address.

    tgt_filter: Same as previous but for a specific target IPv6 address for
         received NS. If the target address in the NS message (not the IPv6
         destination address) matches that address, then a fake reply will
         be sent, i.e. the emitter will be a target of the DoS.

    reply_mac: allow specifying a specific source mac address for the reply,
         i.e. to prevent the use of the mac address of the interface. This
         address will also be used in the Target Link-Layer Address option.

    router: by the default (False) the 'R' flag in the NA used for the reply
         is not set. If the parameter is set to True, the 'R' flag in the
         NA is set, advertising us as a router.

    Please, keep the following in mind when using the function: for obvious
    reasons (kernel space vs. Python speed), when the target of the address
    resolution is on the link, the sender of the NS receives 2 NA messages
    in a row, the valid one and our fake one. The second one will overwrite
    the information provided by the first one, i.e. the natural latency of
    Scapy helps here.

    In practice, on a common Ethernet link, the emission of the NA from the
    genuine target (kernel stack) usually occurs in the same millisecond as
    the receipt of the NS. The NA generated by Scapy6 will usually come after
    something 20+ ms. On a usual testbed for instance, this difference is
    sufficient to have the first data packet sent from the victim to the
    destination before it even receives our fake NA.
    c                    t           | v rt          | v r	t          | v sdS | t                    j        }|r||k    rdS | t                   j        dk    rdS t	          t
          j        | t                   j                  }|r||k    rdS | t                   j        }t          |          r@t	          t
          j        |          }t          |          }||k    rt          d           dS dS )r&  r   r   z3solicited node multicast @ does not match target @!rb   )r>   rt   ru   rf   rM   rr   rs   rj   re   rU   rO   rB  )r'  r(  r)  r*  rj   re   r+  r,  s           r~   r-  z*NDP_Attack_NA_Spoofing.<locals>.is_request  s     1C1C1e*. 	g771 t9=D  1[)9)=>> 	#++1$im3 	 &fos;;M',,M--KLLLqqr   c                 ^   | t                    j        }| t                   }|j        }| t                   j        }t          ||          t          ||          z  }|t          |d|d          z  }|t          |          z  }t          ||d           t          d|d|d	           d
S )z?
        Callback that reply to a NS with a spoofed NA
        rN  rb   rJ  rk   r   r?  rK  r@  rA  N)	r>   rf   rt   ru   rj   rq  r   rF   rB  )	r'  r4  routerrn   r   r   rf   rj   rD  s	            r~   r3  z.NDP_Attack_NA_Spoofing.<locals>.reply_callback  s     %jn$ig+"	s+++ds.D.D.DD{sa6Q7777
 	#95555c****SSS###NOOOOOr   r.  rb   r   c                      |           S r   r   r0  s    r~   r  z(NDP_Attack_NA_Spoofing.<locals>.<lambda>  r1  r   c                       |           S r   r   )r   rn   r3  r4  rQ  s    r~   r  z(NDP_Attack_NA_Spoofing.<locals>.<lambda>  s    q)VUCC r   r5  Nr9  )rn   r(  r)  r4  rQ  r:  r-  r3  s   ````` @@r~   NDP_Attack_NA_SpoofingrT    s    x$ $ $LP P P0  
 )!%((	/);LQQaF	EEEEEECCCCCCC	     r   2001:db8::1Tc	           	         |st           j        }| st          |          } i }	|r||	d<   |r||	d<   i }
|r||
d<   |r||
d<   nDt          t          j        t          t          t          j        |                              }||
d<   t          di |	}|t          di |
z  }|t          |          z  }|t          |           z  }t          ||||d           dS )	aH  
    The main purpose of this function is to send fake Neighbor Solicitations
    messages to a victim, in order to either create a new entry in its neighbor
    cache or update an existing one. In section 7.2.3 of RFC 4861, it is stated
    that a node SHOULD create the entry or update an existing one (if it is not
    currently performing DAD for the target of the NS). The entry's reachability  # noqa: E501
    state is set to STALE.

    The two main parameters of the function are the source link-layer address
    (carried by the Source Link-Layer Address option in the NS) and the
    source address of the packet.

    Unlike some other NDP_Attack_* function, this one is not based on a
    stimulus/response model. When called, it sends the same NS packet in loop
    every second (the default)

    Following arguments can be used to change the format of the packets:

    src_lladdr: the MAC address used in the Source Link-Layer Address option
         included in the NS packet. This is the address that the peer should
         associate in its neighbor cache with the IPv6 source address of the
         packet. If None is provided, the mac address of the interface is
         used.

    src: the IPv6 address used as source of the packet. If None is provided,
         an address associated with the emitting interface will be used
         (based on the destination address of the packet).

    target: the target address of the NS packet. If no value is provided,
         a dummy address (2001:db8::1) is used. The value of the target
         has a direct impact on the destination address of the packet if it
         is not overridden. By default, the solicited-node multicast address
         associated with the target is used as destination address of the
         packet. Consider specifying a specific destination address if you
         intend to use a target address different than the one of the victim.

    dst: The destination address of the NS. By default, the solicited node
         multicast address associated with the target address (see previous
         parameter) is used if no specific value is provided. The victim
         is not expected to check the destination address of the packet,
         so using a multicast address like ff02::1 should work if you want
         the attack to target all hosts on the link. On the contrary, if
         you want to be more stealth, you should provide the target address
         for this parameter in order for the packet to be sent only to the
         victim.

    src_mac: the MAC address used as source of the packet. By default, this
         is the address of the interface. If you want to be more stealth,
         feel free to use something else. Note that this address is not the
         that the victim will use to populate its neighbor cache.

    dst_mac: The MAC address used as destination address of the packet. If
         the IPv6 destination address is multicast (all-nodes, solicited
         node, ...), it will be computed. If the destination address is
         unicast, a neighbor solicitation will be performed to get the
         associated address. If you want the attack to be stealth, you
         can provide the MAC address using this parameter.

    loop: By default, this parameter is True, indicating that NS packets
         will be sent in loop, separated by 'inter' seconds (see below).
         When set to False, a single packet is sent.

    inter: When loop parameter is True (the default), this parameter provides
         the interval in seconds used for sending NS packets.

    iface: to force the sending interface.
    rf   re   ri   rk   r   )interlooprn   rp   Nr   )r   rn   r   rN   rr   rs   rO   rM   r>   rt   ru   rv   rF   )
src_lladdrrf   r  re   src_macdst_macrX  rW  rn   ether_paramsipv6_paramsrX  r   s                r~   NDP_Attack_NS_Spoofingr^  #  s/   N  
  *"5))
 L &%U &%UK
 ! E
 ! E #Ifov$F$FGGI I E


,

C4+C;6""""Cz2222C	#UUA>>>>>>r   c           	           d d  st           j         st                     dz  }t          d|fd fd            dS )	aQ  
    The purpose of the function is to monitor incoming RA messages
    sent by default routers (RA with a non-zero Router Lifetime values)
    and invalidate them by immediately replying with fake RA messages
    advertising a zero Router Lifetime value.

    The result on receivers is that the router is immediately invalidated,
    i.e. the associated entry is discarded from the default router list
    and destination cache is updated to reflect the change.

    By default, the function considers all RA messages with a non-zero
    Router Lifetime value but provides configuration knobs to allow
    filtering RA sent by specific routers (Ethernet source address).
    With regard to emission, the multicast all-nodes address is used
    by default but a specific target can be used, in order for the DoS to
    apply only to a specific host.

    More precisely, following arguments can be used to change the behavior:

    iface: a specific interface (e.g. "eth0") of the system on which the
         DoS should be launched. If None is provided conf.iface is used.

    mac_src_filter: a mac address (e.g "00:13:72:8c:b5:69") to filter on.
         Only RA messages received from this source will trigger replies.
         If other default routers advertised their presence on the link,
         their clients will not be impacted by the attack. The default
         value is None: the DoS is not limited to a specific mac address.

    ip_src_filter: an IPv6 address (e.g. fe80::21e:bff:fe4e:3b2) to filter
         on. Only RA messages received from this source address will trigger
         replies. If other default routers advertised their presence on the
         link, their clients will not be impacted by the attack. The default
         value is None: the DoS is not limited to a specific IPv6 source
         address.

    reply_mac: allow specifying a specific source mac address for the reply,
         i.e. to prevent the use of the mac address of the interface.

    tgt_mac: allow limiting the effect of the DoS to a specific host,
         by sending the "invalidating RA" only to its mac address.
    c                     t           | v rt          | v r	t          | v sdS | t                    j        }|r||k    rdS | t                   j        }|r||k    rdS | t                   j        dk    rdS dS r&  r   rb   )r>   rt   rp  rf   r  r'  r(  ip_src_filterr*  ip_srcs        r~   r-  z2NDP_Attack_Kill_Default_Router.<locals>.is_request  s    
 1C1C1e*. 	g771T 	V}441 {*a//1qr   c                    | t                    j        }i }|r||d<   |r||d<   t          di |t          |d          z  }|t          dd          z  }| }t          |v r$|t                   }|j        }|`||z  }t          |v $t          | v r| t                   j        }	n| t                   j        }	|t          |	          z  }t          ||d	           t          d
|z             dS )z=
        Callback that sends an RA with a 0 lifetime
        rf   re   r  rN  rb   r   )rb  r  rk   r?  z#Fake RA sent with source address %sNr   )
rt   rf   r>   rp  r  r  rv   rl   rF   rB  )
r'  r4  tgt_macrn   rf   r\  rD  rX  pior   s
             r~   ra_reply_callbackz9NDP_Attack_Kill_Default_Router.<locals>.ra_reply_callback  s$    $im  	,"+L 	*")L ##l##ds	&B&B&BB{q3333 #s**+,C+C3JC	 $s**  3&&*+2CCe*.C#3////c****3c9:::::r   r.  r   c                      |           S r   r   r   rc  r-  r(  s    r~   r  z0NDP_Attack_Kill_Default_Router.<locals>.<lambda>      JJq.-HH r   c                       |           S r   r   )r   rn   rh  r4  rf  s    r~   r  z0NDP_Attack_Kill_Default_Router.<locals>.<lambda>  s    ))!YGG r   r5  Nr9  )rn   r(  rc  r4  rf  r:  r-  rh  s   ````` @@r~   NDP_Attack_Kill_Default_Routerrm    s    Z  .&; &; &;P  
 )!%((	/);L	HHHHHHGGGGGGG	     r   c                 |     d  fdst           j        d}t          d|fdfd           dS )	a  
    The purpose of this function is to send provided RA message at layer 2
    (i.e. providing a packet starting with IPv6 will not work) in response
    to received RS messages. In the end, the function is a simple wrapper
    around sendp() that monitor the link for RS messages.

    It is probably better explained with an example:

      >>> ra  = Ether()/IPv6()/ICMPv6ND_RA()
      >>> ra /= ICMPv6NDOptPrefixInfo(prefix="2001:db8:1::", prefixlen=64)
      >>> ra /= ICMPv6NDOptPrefixInfo(prefix="2001:db8:2::", prefixlen=64)
      >>> ra /= ICMPv6NDOptSrcLLAddr(lladdr="00:11:22:33:44:55")
      >>> NDP_Attack_Fake_Router(ra, iface="eth0")
      Fake RA sent in response to RS from fe80::213:58ff:fe8c:b573
      Fake RA sent in response to RS from fe80::213:72ff:fe8c:b9ae
      ...

    Following arguments can be used to change the behavior:

      ra: the RA message to send in response to received RS message.

      iface: a specific interface (e.g. "eth0") of the system on which the
             DoS should be launched. If none is provided, conf.iface is
             used.

      mac_src_filter: a mac address (e.g "00:13:72:8c:b5:69") to filter on.
         Only RS messages received from this source will trigger a reply.
         Note that no changes to provided RA is done which imply that if
         you intend to target only the source of the RS using this option,
         you will have to set the Ethernet destination address to the same
         value in your RA.
         The default value for this parameter is None: no filtering on the
         source of RS is done.

    ip_src_filter: an IPv6 address (e.g. fe80::21e:bff:fe4e:3b2) to filter
         on. Only RS messages received from this source address will trigger
         replies. Same comment as for previous argument apply: if you use
         the option, you will probably want to set a specific Ethernet
         destination address in the RA.
    c                     t           | v rt          | v r	t          | v sdS | t                    j        }|r||k    rdS | t                   j        }|r||k    rdS dS ra  )r>   rt   ro  rf   rb  s        r~   r-  z*NDP_Attack_Fake_Router.<locals>.is_request3  sm    
 1C1C1e*. 	g771T 	V}441qr   c                 t    | t                    j        }t          |d           t          d|z             dS )z=
        Callback that sends an RA in reply to an RS
        r   r?  z&Fake RA sent in response to RS from %sN)rt   rf   rF   rB  )r'  rn   rf   ras      r~   rh  z1NDP_Attack_Fake_Router.<locals>.ra_reply_callbackE  s?    
 $imbq))))6<=====r   icmp6r   c                      |           S r   r   rj  s    r~   r  z(NDP_Attack_Fake_Router.<locals>.<lambda>T  rk  r   c                      |           S r   r   )r   rn   rh  s    r~   r  z(NDP_Attack_Fake_Router.<locals>.<lambda>U  s    ))!U33 r   r5  N)r   rn   rG   )rq  rn   r(  rc  r:  r-  rh  s   ```` @@r~   NDP_Attack_Fake_Routerru    s    V  $> > > > >  
L	HHHHHH33333	     r   c                 P    t                                          | t                    S r   )globalsr   rE   )r   s    r~   _get_clsrx  ]  s    99==s###r   c                 ^    |                                  D ]\  }}t          |          | |<   d S r   )r  rx  )ry   r  vs      r~   
_load_dictr{  a  s8    		  1{{! r   r  i݆  )rm   )r/  )r  rM  )rb   r   )r   )r  N)NNNN)NNNNF)	NNrU  NNNTrb   N)NNNNN)NNN(<  r=  hashlibr   rR  rr   r  timer   r   
scapy.archr   scapy.as_resolversr   scapy.base_classesr   r	   scapy.compatr
   r   r   r   r   scapy.constsr   scapy.configr   
scapy.datar   r   r   r   r   r   r   scapy.errorr   r   scapy.fieldsr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   scapy.layers.inetr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   scapy.layers.l2r=   r>   r?   r@   rA   rB   scapy.packetrC   rD   rE   scapy.sendrecvrF   rG   rH   rI   scapy.supersocketrJ   scapy.utilsrK   rL   scapy.pton_ntoprM   rN   scapy.utils6rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   scapy.volatilerY   rZ   typingr[   has_ipv6errorhasattrr\   r^   r   scapy.route6scapyr   	new_cachecommandsregisterr   r   r3  r   r   r   rt   r6  rB  neighborregister_l3rD  rX  rc  rf  rG  r  rq  r}  ri  rj  r  r  r  r%  r  r  r  r   r   r   r  r  r  r  r
  r  r  r   r   rK  rc  r   r   r  r  r  r   rd  re  rf  rg  rh  rj  r  rk  rm  rn  r   r  ry  r~  r  r  icmp6ndoptsr  re  r  r  r  rv   r   r  r:  r  r  r  r  r   r  r  rR  r  r  rV  r  r  r	  rq  r
  r  r  r  ro  rp  ru   rq  rs  r  r  rw  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  _nireply_flagsr  r  r  r  r   r"  r%  r   r-  r  rz  r{  r|  r}  rH  r@  rD  rJ  rN  rR  rV  rX  r\  rf  ro  rt  rw  rz  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;  rG  rM  rT  r^  rm  ru  rx  r{  l3typesregister_num2layerl2typesrs   IPPROTO_TCPIPPROTO_UDPIPPROTO_GREr   r   r~   <module>r     sm+   
          ! ! ! ! ! ! ! ! $ $ $ $ $ $ 3 3 3 3 3 3 - - - - - - - - ? ? ? ? ? ? ? ? ? ? ? ? ? ?                                    - , , , , , , ,                                                     6                                       2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) ) ) ) ) ) ( ( ( ( ( ( ( ( 0 0 0 0 0 0 0 0> > > > > > > > > > > > > > > > > > > > > > > > . - - - - - - -       ?
&,=
>
>>wv~&& Fwv~&& F;    , , ,    8 , , , ,j
"!' 
"
T
"
U
" e
" f	
"
 
" 
" e
" l
" k
" h
" 
" )
" v
" v
"  
"" %$% $
& 
&	:) :) :) :) :)8 :) :) :)z+ + + + + + + +*p7 p7 p7 p7 p7fg p7 p7 p7f    B   "     %'8 9 9 9L& L& L& L& L&t L& L& L&j' ' ' ' ' ' ' '6 6 6r  6" " " " "#V " " " . !') )= = = = =- = = =.    F   >    6       6       &   4       *    F        &      
/& /& /& /& /&O /& /& /&d
 
 
 
 
9 
 
 
( ( ( ( ( ( ( () ) ) ) ) ) ) )6 6 6 6 6 6 6 62         &   04 4 4 4 4-H 4 4 43 3 3 3 3,G 3 3 3U U U U U&A U U UU U U U U&A U U U
F 
F 
F 
F 
F&A 
F 
F 
F;6 ;6 ;6 ;6 ;6{ ;6 ;6 ;6@J J J J J J J J"6 6 6ra a aV' (( ( )	
 ' o & n m m m m ) o  o!" '#$ (')'## 0.-!=  Bq! !! ! A	
 A B B B A B B B B  A!" A#$ A%& 5   :!.a* !.!!.!. $!. ,	!.
 ,!. >!. <!. ;!. <!. :!. (!. )!. *!. +!. %!.  '!!. !." 0#!.$ 3%!.& D'!.( E)!.* )+!., A-!.. ?/!.0 /1!.2 03!.4 45!.6 57!.8 39!.: 2;!.< 1=!.> (?!.@ ,A!.B ,C!. !.
H    f   4    7   , , , , ,G , , ,3 3 3 3 3 3 3 3 * * * * * * * *
3 
3 
3 
3 
3 
3 
3 
3"
' 
' 
' 
' 
' 
' 
' 
'M M M M M M M M ) ) ) ) )' ) ) )(- - - - - - - -"F F F F FI F F F& & & & &Y & & &"F F F F F9 F F F9 9 9 9 9W 9 9 96    6   (1 1 1 1 1g 1 1 1L    g   	 	 	 	 	W 	 	 		 	 	 	 	G 	 	 	q- -& % %	
 . 1 1 ' ( < ) % > ( '  &!" :.B(&-0;3  8!+ +, / %	
 / - ( - .  )!" /#$ &%0 &12 ,34 (56 &78 )0)=  B ( E E E E E E E E    ;   ,B B B B B. B B B/ / / / /0& / / /    /   
2 2 2 2 216 2 2 2.% % % % %~ % % %N N N N N4f N N N, , , , ,*F , , ,( ( ( ( (4f ( ( (< < < < <2F < < <	@ 	@ 	@ 	@ 	@-v 	@ 	@ 	@ 	+ 	+ 	+ 	+ 	+-v 	+ 	+ 	+- - - - -3V - - - N/*+ETRSU U / / / / /*F / / /	+ 	+ 	+ 	+ 	+*F 	+ 	+ 	+$/ $/ $/ $/ $/h $/ $/ $/NG G G G G0& G G G = = = = =,f = = =+ + + + +*F + + +3 3 3 3 3+ 3 3 3lD D D D D,f D D D 
, 
, 
, 
, 
,4f 
, 
, 
,; ; ; ; ;h ; ; ;5 5 5 5 5-v 5 5 5 H H H H H' H H H> > > > >' > > >4? ? ? ? ?'& ? ? ? H H H H H'& H H H0H H H H H-w H H HL L L L L2F L L L    3   H H H H H+W H H HH H H H H+W H H H<  ##% %( ( ( ( ( ( ( (
) ) ) ) ) ) ) )* * * * *! * * *   D  0  8L9 L9 L9 L9 L9x L9 L9 L9^    }   " !\lCC	3 	3 	3 	3 	3(' 	3 	3 	3    )       )       )   
 '&(* * ,,%+,(* *&z z z z zx z z z~	3 	3 	3 	3 	3(*:G 	3 	3 	3    )   
    )   
    )   
    +   
    ,   
  @   < < < < < < < < 
C 
C 
C 
C 
C 
C 
C 
C# # # # #g # # #&	* 	* 	* 	* 	*' 	* 	* 	*. . . . .' . . .$ ,."/415>16.)11,. ."    F   *
 
 
 
 
m 
 
 

 
 
 
 
M 
 
 

 
 
 
 
- 
 
 

 
 
 
 
] 
 
 

 
 
 
 
- 
 
 

 
 
 
 
M 
 
 
	
 	
 	
 	
 	
- 	
 	
 	
 
 
 
 
 
] 
 
 
&" " " " "	 " " " 
 
 
 
 
m 
 
 

 
 
 
 
- 
 
 

 
 
 
 
} 
 
 

 
 
 
 
} 
 
 

 
 
 
 
] 
 
 

 
 
 
 
M 
 
 

 
 
 
 
 
 
 
    ]   $$Q $$$ $ #	$
 &$ #$ $ $ $ ($ $$ !$ !$ '$ &$  "!$	* 
 
7A( 7;7%7 .7 )	7
 27 "7 67 57 07 +7 .7 !7 67 87 !7  ,!7" >$%":85517 7 76    f   $I I I I I_ I I I       () ) ) ) )/ ) ) )$) ) ) ) )+ ) ) )       2       " " " " "J " " "
       2       < F,. .	* * * * * * * * """!!   " "      '   6(; (; (; (; (;( (; (; (;V  2YY[[D   :  ------    {       _  _  _  _  _  _  _  _R DH371 1 1 1h KO(,5/ 5/ 5/ 5/p KO(,:/ :/ :/ :/z HL27G G G GT >KFJ*.h? h? h? h?V ?CAE+/w w w wt ;?)-N N N Nj$ $ $  
 
>    

=    

9      j$ ' ' '   	5 1 1 1   b$      h % % %   gu % % %   U 3 3 3 E4f % % % % KV , , , , CV $ $ $ $ D$V $ $ $ $  6K$T*****K$V_5555 Hh6#5 6 6 6 6 Hh6#5 6 6 6 6 D#&, - - - - D#&, - - - - BF/ 0 0 0 0 D$6. / / / / D", - - - - D#&, - - - - - -r   