a
    kÄ#d­\ ã                #   @   sØ  d Z ddlmZ ddlm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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJmKZKmLZL ddlMmN  mOZO ddlPmQZQmRZRmSZS ddlTmUZUmVZVmWZWmXZX ddlYmZZZ ddl[m\Z\m]Z] ddl^m_Z_m`Z` ddlambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZk ddllmmZmmnZn ejo�s<e pd¡‚eqedƒ�sNde_reqedƒ�s`de_sejtdu �rtddluZvejw xdd¡ ejyjz�d'd!d"„ƒZ{ejyjz�d(d#d$„ƒZ|d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5œZ}d6d&d'd(d7d8d9d:d;d<d=d>œZ~G d?d@„ d@e8ƒZG dAdB„ dBƒZ€G dCd)„ d)e€eReAƒZ�G dDdE„ dEe@ƒZ‚dFdG„ Zƒej„ …eIe�eƒ¡ G dHdI„ dIe�ƒZ†G dJdK„ dKeRƒZ‡dLdM„ ZˆdNdO„ Z‰G dPdQ„ dQe€eRƒZŠdRdSdTdUdVdWdXdYœZ‹G dZd[„ d[e*ƒZŒG d\d]„ d]eRƒZ�G d^dR„ dReRƒZŽG d_dS„ dSeRƒZ�G d`da„ daeRƒZ�G dbdc„ dceRƒZ‘G ddde„ deeRƒZ’eŽe�e�e‘e’dfœZ“G dgdh„ dhe4ƒZ”G didj„ dje+ƒZ•G dkd6„ d6eŠƒZ–G dld=„ d=eŠƒZ—G dmd7„ d7eŠƒZ˜dndodpdqdrdsœZ™G dtdu„ dueRƒZšG dvdw„ dwešƒZ›G dxdy„ dyešƒZœG dzd{„ d{ešƒZ�G d|d}„ d}ešƒZžG d~d„ dešƒZŸG d€d�„ d�eŠƒZ G d‚d8„ d8eŠƒZ¡dƒd„„ Z¢d…d†„ Z£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¤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¥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É„ dÉeRƒZ§G dÊdË„ dËe§ƒZ¨G dÌd;„ d;e§ƒZ©G dÍd‡„ d‡e¨ƒZªG dÎdˆ„ dˆe¨ƒZ«G dÏd‰„ d‰e¨ƒZ¬G dÐdŠ„ dŠe¨ƒZ­G dÑd‹„ d‹e§ƒZ®G dÒdŒ„ dŒe®ƒZ¯G dÓdÔ„ dÔe§ƒZ°G dÕd�„ d�e°ƒZ±G dÖdŽ„ dŽe°ƒZ²G d×d�„ d�e°ƒZ³G dØdÙ„ dÙe§ƒZ´G dÚdÛ„ dÛeRƒZµG dÜd™„ d™e§ƒZ¶G dÝdž„ dže§ƒZ·G dÞdŸ„ dŸe§ƒZ¸G dßd „ d e§ƒZ¹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ºdûdüdýdþdÿ�d �d�d�d�d�d�d�d�d�d	�d
�d�d�dœZ»�d�d�d�d�dœZ¼G �d�d„ �dƒZ½G �d�d„ �de½eRƒZ¾G �ddû„ dûe½eRƒZ¿G �ddü„ düe¿ƒZÀG �ddý„ dýe½eRƒZÁG �d�d„ �de3ƒZÂG �ddþ„ dþe½eRƒZÃG �ddÿ„ dÿe½eRƒZÄG �d�d „ �d e½eRƒZÅG �d�d„ �de½eRƒZÆG �d �d„ �de½eRƒZÇG �d!�d„ �de½eRƒZÈG �d"�d„ �de½eRƒZÉ�d#�d$�d%�d&�d'�d(�d)�d*�d+œZÊG �d,�d„ �de½eRƒZËG �d-�d„ �de½eRƒZÌG �d.�d/„ �d/e0ƒZÍG �d0�d	„ �d	e½eRƒZÎG �d1�d
„ �d
e½eRƒZÏG �d2�d„ �de½eRƒZÐG �d3�d4„ �d4e:ƒZÑG �d5�d„ �de½eRƒZÒG �d6d�„ d�e½e§ƒZÓG �d7d‘„ d‘e½e§ƒZÔG �d8d’„ d’e½e§eRƒZÕG �d9d“„ d“e½e§eRƒZÖG �d:d”„ d”e½e§eRƒZ×G �d;�d„ �de½eRƒZØG �d<�d„ �deØƒZÙG �d=d—„ d—e½e§ƒZÚG �d>d˜„ d˜e½e§ƒZÛ�d?�d@�dA�dB�dCœZÜG �dD�dE„ �dEƒZÝG �dF�dG„ �dGƒZÞG �dH�dI„ �dIe9ƒZßejyjz�dJ�dK„ ƒZà�dL�dM„ Zá�dN�dO„ ZâG �dP�dQ„ �dQe8ƒZãG �dR�dS„ �dSe*ƒZä�dT�dU�dV�dWœZåG �dX�dY„ �dYeÝe§ƒZæG �dZ�d[„ �d[eæƒZçG �d\�d]„ �d]eæƒZèG �d^�d_„ �d_eæƒZé�d`�da�db�dcœZê�dd�de�df�dg�dh�di�djœZëG �dk�dl„ �dle8ƒZìG �dm�dn„ �dneÞeÝe§ƒZíG �do�dp„ �dpeíƒZîG �dq�dr„ �dreíƒZïG �ds�dt„ �dteíƒZðG �du�dv„ �dveíƒZñG �dw�dx„ �dxeíƒZò�dy�dz„ Zó�d{�d|�d}�d~�d�d€�d�œZôG �d‚d¡„ d¡e§ƒZõG �dƒdš„ dše§ƒZöG �d„d›„ d›e§ƒZ÷G �d…dœ„ dœe§ƒZøG �d†d�„ d�e½e§ƒZù�d‡�dˆ�d‰�dŠ�d‹�dŒ�d��dŽ�d��d��d‘�d’�d“�d”�d•�d–œZúG �d—�d˜„ �d˜eRƒZûG �d™�dš„ �dšeûƒZüG �d›�dœ„ �dœeûƒZýG �d��dž„ �džeûƒZþG �dŸ�d „ �d eûƒZÿG �d¡�d¢„ �d¢eûƒ�Z G �d£�d¤„ �d¤eûƒ�ZG �d¥�d¦„ �d¦eûƒ�ZG �d§�d¨„ �d¨eûƒ�ZG �d©�dª„ �dªe1ƒ�ZG �d«�d¬„ �d¬eûƒ�ZG �d­�d®„ �d®eûƒ�ZG �d¯�d°„ �d°eûƒ�ZG �d±�d²„ �d²eûƒ�ZG �d³�d´„ �d´eûƒ�Z	G �dµ�d¶„ �d¶eûƒ�Z
G �d·�d¸„ �d¸eûƒ�ZG �d¹�dº„ �dºeûƒ�ZeŽe�eüeýeþeÿ�e �e�e�e�e�e�e�e�e	�e
�e�d»œ�Z�d¼�d½�d¾�d¿�dÀ�dÁ�dÂ�dÃ�dÄ�dÅ�dÆ�dÇœ�Z�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ã„ �dãeRƒ�ZG �dä�då„ �då�eƒ�ZG �dæ�dç„ �dç�eƒ�ZG �dè�dé„ �dé�eƒ�ZG �dê�dë„ �dë�eƒ�ZG �dì�dí„ �dí�eƒ�ZG �dî�dï„ �dï�eƒ�ZG �dð�dñ„ �dñe6ƒ�ZG �dò�dó„ �dó�eƒ�ZG �dô�dõ„ �dõ�eƒ�Z�dö�d÷�døœ�ZG �dù�dú„ �dú�eƒ�Z�e�e�e�e�e�e�e�e�d+œ�ZG �dû�dü„ �düeƒ�ZG �dý�dþ„ �dþeDƒ�Zejyjz�dÿd �d enƒ d�ddf�d�d„ƒ�Ze�s~d�dlY�m �Z  G �d�d„ �d�e ƒ�Z!�d)�d�d	„�Z"G �d
�d„ �deZƒ�Z#�d*�d�d„�Z$�d+�d�d„�Z%�d,�d�d„�Z&�d-�d�d„�Z'�d.�d�d„�Z(�d/�d�d„�Z)�d0�d�d„�Z*�d�d„ �Z+�d�d „ �Z,�e,e»ƒ �e,e¤ƒ �e,e~ƒ e�j- ze"e�¡ e�j-� .e!e‚¡ e�j/ z�d!e�¡ e�j/ zee�¡ e�j/ zee‚¡ e�j/� .ee‚¡ eQeIe��d"�d#� eQeHe��d"�d$� eQeJe��d"�d$� eQeLe��d"�d%� e�r&eQeKe�d¤�d#� neQeKe�e�j0�d#� eQe†eCe�j1�d&� eQe†eFe�j2�d&� eQe�eBe�j1�d&� eQe�eEe�j2�d&� eQe@e�ejr�d$� eQe�e�ejr�d&� eQe�e@ejs�d&� eQe�eJe�j3�d&� dS (1  z
IPv6 (Internet Protocol v6).
é    )Úabsolute_import)Úprint_function)Úmd5N)ÚgmtimeÚstrftime)Úget_if_hwaddr)ÚAS_resolver_riswhois)ÚGen)Ú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ÚPacketLenFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚSourceIP6FieldÚStrFieldÚStrFixedLenFieldÚStrLenFieldÚX3BytesFieldÚ	XBitFieldÚ	XIntFieldÚXShortField)ÚIPÚIPToolsÚTCPÚTCPerrorÚTracerouteResultÚUDPÚUDPerror)ÚCookedLinuxÚEtherÚGREÚLoopbackÚSNAP)Ú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Ú	RandShortz$can't use AF_INET6, IPv6 is disabledÚIPPROTO_IPV6é)   ÚIPPROTO_IPIPé   Úin6_neighboréx   é   c           
      C   st   t ttj| ƒƒ}ttj|ƒ}t|ƒ}t|d�t||dd� }|t| d� }|t	t
|ƒd� }t|t|dd|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 source of the message. Message is sent on iface.
    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éÿ   )r\   ÚsrcÚhlim©Útgt©Úlladdrr[   r   )ÚtypeÚifaceÚtimeoutÚverboseÚchainCC)rI   rG   ÚsocketÚAF_INET6rH   rJ   r9   ÚIPv6ÚICMPv6ND_NSÚICMPv6NDOptSrcLLAddrr   rC   r   )
Úaddrr^   re   rf   rh   ZnsmaÚdÚdmÚpÚres© rs   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/inet6.pyÚneighsolO   s    ÿru   c                 C   s¶   t | tƒrt| ƒ} t| ƒr.tttj| ƒƒ}|S tj	 
| ¡\}}}|tjkrNdS |dkrZ|} tjj | ¡}|rp|S t| |||d�}|dur²t|v rœ|t j}n|j}|tjj| < |S dS )a<  Returns the MAC address corresponding to an 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)
    zff:ff:ff:ff:ff:ffú::)rh   N)Ú
isinstancerQ   ÚstrrP   rJ   rG   ri   rj   r   Úroute6ÚrouteZloopback_nameÚnetcacherY   Úgetru   ÚICMPv6NDOptDstLLAddrrc   r^   )Zip6rh   ÚmacZiffÚaÚnhrr   rs   rs   rt   Úgetmacbyip6i   s*    

r�   zHop-by-Hop Option Headerr1   r3   r6   rk   zRouting HeaderzFragment Headerr:   z
ESP Headerz	AH HeaderZICMPv6zNo Next HeaderzDestination Option HeaderZVRRPZSCTPzMobility Header)r   rX   é   é   rV   é+   é,   é/   é2   é3   é:   é;   é<   ép   é„   é‡   ÚIPv6ExtHdrHopByHopÚIPv6ExtHdrRoutingÚIPv6ExtHdrFragmentZESPZAHÚICMPv6Unknownr?   ÚIPv6ExtHdrDestOpt)r   rX   r‚   rƒ   r„   r…   r‡   rˆ   r‰   rŠ   r‹   c                   @   sJ   e Zd ZddgZdZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚIP6ListFieldÚ
count_fromÚlength_fromr[   Nc                 C   s*   |d u rg }t  | ||¡ || _|| _d S ©N)r*   Ú__init__r•   r–   )ÚselfÚnameÚdefaultr•   r–   rs   rs   rt   r˜   ¼   s
    zIP6ListField.__init__c                 C   s   dt |ƒ S ©Né   ©Úlen©r™   ÚpktÚirs   rs   rt   Úi2lenÃ   s    zIP6ListField.i2lenc                 C   s   t |tƒrt|ƒS dS ©Nr   )rw   ÚlistrŸ   r    rs   rs   rt   Úi2countÆ   s    
zIP6ListField.i2countc           	      C   s¶   d  }}| j d ur|   |¡}n| jd ur2|  |¡}g }d}|}|d ur`|d |… ||d …  }}|rª|d ur~|dkrvqª|d8 }ttj|d d… ƒ}| |¡ |dd … }q`|| |fS )Nó    r   r[   r�   )r–   r•   rH   ri   rj   Úappend)	r™   r¡   ÚsÚcÚtmp_lenÚlstÚretÚremainrn   rs   rs   rt   ÚgetfieldË   s&    



zIP6ListField.getfieldc              	   C   sf   d}|D ]X}zt tj|ƒ}W n: tyV   t |d tj¡d d d }t tj|ƒ}Y n0 ||7 }q|S )Nr§   r   éÿÿÿÿ)rG   ri   rj   Ú	ExceptionÚgetaddrinfo©r™   r¡   Úxr©   Úyrs   rs   rt   Úi2má   s    
zIP6ListField.i2mc                 C   s6   g }|d u rdS |D ]}|  d| ¡ qdd |¡ S )Nú[]z%sú[ %s ]ú, )r¨   Újoinr³   rs   rs   rt   Úi2reprì   s    zIP6ListField.i2repr)NN)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__Úislistr˜   r£   r¦   r¯   r¶   r»   rs   rs   rs   rt   r”   ¸   s   
r”   c                   @   s   e Zd ZdZdd„ ZdS )Ú_IPv6GuessPayloadz:Dummy class that implements guess_payload_class() for IPv6c                 C   sÐ   | j dkrzt|d ƒ}t|ƒdkr:|dks2|dkr:t|ƒS t|ƒt |tdƒ¡krv|dkrjt|ƒdkrjtS t |t	¡S t	S | j d	kr¤t|ƒd
kr¤t
 t|d ƒt¡S | j dkrÂt|d ƒdkrÂtS t | j t	¡S )Nr‰   r   é   é‹   éŒ   Úinfé‚   é   rŽ   é   r„   rX   )r€   r   rŸ   Ú_niquery_guesserÚicmp6typesminhdrlenr|   ÚfloatÚICMPv6MLQuery2Úicmp6typesclsr?   Ú_mip6_mhtype2clsÚMIP6MH_GenericÚIPv6ExtHdrSegmentRoutingÚ	ipv6nhcls)r™   rq   Útrs   rs   rt   Údefault_payload_classø   s    
z'_IPv6GuessPayload.default_payload_classN)r¼   r½   r¾   rš   rÓ   rs   rs   rs   rt   rÁ   õ   s   rÁ   c                
   @   sŒ   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dƒe
ddƒgZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd
S )rk   Úversionr‚   rX   Ztcr   é   Úflé   ÚplenNr€   rŠ   r_   é@   r^   r\   ú::1c                 C   s(   | j }t|tƒrtt|ƒƒ}tj |¡S )zUsed to select the L2 address)r\   rw   r	   ÚnextÚiterr   ry   rz   )r™   r\   rs   rs   rt   rz     s    
z
IPv6.routec                 C   s   d| j | j| jf S )Nz%s > %s (%i))r^   r\   r€   ©r™   rs   rs   rt   Ú	mysummary  s    zIPv6.mysummaryc                 C   sF   ||7 }| j d u rBt|ƒd }|d d… t d|¡ |dd …  }|S )Né(   rX   ú!Hr‚   )rØ   rŸ   ÚstructÚpack)r™   rq   Úpayr«   rs   rs   rt   Ú
post_build  s
    
$zIPv6.post_buildc                 C   sæ   | j dkrÈ| jdkrÈt|ƒdkrÈt|d ƒ}d|d  }d}d}d| d }|t|ƒkr¨t|| ƒ}|dkr’t d||d |d d … ¡d }q¨d| d }|d7 }qL|du r¾t d	¡ d}|| }n| j }|d|… ||d… fS )
zExtract the IPv6 payloadr   rÕ   r[   NrX   rÂ   éÂ   ÚIz!Scapy did not find a Jumbo option)rØ   r€   rŸ   r   rá   Úunpackr   Úinfo)r™   ÚdataZhbh_lenZ	jumbo_lenÚidxÚoffsetZopt_typer«   rs   rs   rt   Úextract_padding&  s&     $


zIPv6.extract_paddingc                 C   sB  | j dkrRt| jtƒrR| jjdk r.| jj ¡ S | jjdv rRt d| j ¡| j ¡  S tj	sl| j dv rl| j ¡ S | j }| j
}| j}| j dkrüt| jtƒrü| jj }z| jd }W n tyÀ   d}Y n0 ttj|ƒ}| jD ]}ttj|ƒ}t||ƒ}qÔttj|ƒ}| j dk�r@t| jtƒ�r@z| jd	 }W n t�y>   | j
}Y n0 | j d
k�rbt| jtƒ�rb| jj }| j d	k�r„t| jtƒ�r„| jj }| j dk�rÖt| jtƒ�rÖd }| jjD ]}t|tƒ�rª|}�qª|�rÖ| jj }|j}tj�r(tj�r(t|ƒ�s(ttj|ƒ}ttj|ƒ}t||ƒt d|¡ | j ¡  S t d|¡| j ¡  S d S )Nr‰   é€   )é…   é†   rŽ   éˆ   é�   é‘   ÚB©rX   rV   r„   r°   rÚ   r   r…   r‹   )r€   rw   ÚpayloadÚ_ICMPv6rd   Úhashretrá   râ   r   ÚcheckIPinIPr\   r^   r�   Ú	addressesÚ
IndexErrorrG   ri   rj   rF   rH   rÐ   r‘   r�   r“   ÚoptionsÚHAOÚhoaZ
checkIPsrcÚcheckIPaddrrP   )r™   r€   ÚsdÚssr   ZfoundhaoÚors   rs   rt   r÷   F  sV    


 zIPv6.hashretc                 C   s\  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ƒsjdS t j	�rt
tj| jƒ}t
tj|jƒ}t
tj|jƒ}t|jƒrøt| jƒrÞ||ksÌt| jƒrÚt|jƒrÚ| j |j¡S dS ||krô| j |j¡S dS ||k�rdS | jdk�r<t| jtƒ�r<| jjdk �r<| jj |¡S |jdk�rdt|jtƒ�rd| 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tƒ�r| jj |jj¡S | jdk�r8t| jtƒ�r8| jj |j¡S | j|jk�rJdS | j |j¡S d S )	Nrô   Fr‰   rí   r   r…   r„   r‹   )r   rø   r€   rõ   Úanswersrw   rk   r1   Úprotorþ   rG   ri   rj   r\   r^   rP   rL   rM   rö   rd   r�   r‘   r�   rÐ   r“   )r™   Úotherrÿ   ÚosÚodrs   rs   rt   r  ‚  sX    



ÿÿ
(zIPv6.answers)r¼   r½   r¾   rš   r   r(   r   Úipv6nhr   r)   r   Úfields_descrz   rÞ   rä   rì   r÷   r  rs   rs   rs   rt   rk   
  s    



ù	 <c                   @   s   e Zd ZdZed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.
    Nc                 O   s4   |rt |d ƒd? dkr0tS n| d¡dkr0tS tS )Nr   rX   r‚   rÔ   )r   rk   r|   r1   )ÚclsÚ_pktÚ_Úkargsrs   rs   rt   Údispatch_hook¿  s    zIPv46.dispatch_hook)N)r¼   r½   r¾   Ú__doc__Úclassmethodr  rs   rs   rs   rt   r	  º  s   r	  c                 C   s
   t |jƒS r—   )r�   r\   )Úl2Úl3rs   rs   rt   Úinet6_register_l3É  s    r  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚIPerror6zIPv6 in ICMPv6c                 C   sâ  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
}|d ur‚t |tƒr‚|j
}qh|j
}d}|d ur´t |tƒr´t |tƒr¬d}|j
}qŒ||krÄ||ksÔ||k�rÞ|�rÞt |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   )rw   rk   rG   ri   rj   r\   r^   Ú
underlayerrö   rd   rõ   Ú_IPv6ExtHdrr�   r3   rû   ÚchksumZdataofsr   ÚminrŸ   )r™   r  rÿ   r   r  r  ZselfupZotherupZrequest_has_rhZold_otherup_optsZold_otherup_cksumZold_otherup_dataofsZold_selfup_optsZold_selfup_cksumZold_selfup_dataofsÚs1Ús2r«   rr   rs   rs   rt   r  Ó  sl    

ÿÿÿ
þzIPerror6.answersc                 C   s
   t  | ¡S r—   )r>   rÞ   rÝ   rs   rs   rt   rÞ     s    zIPerror6.mysummaryN)r¼   r½   r¾   rš   r  rÞ   rs   rs   rs   rt   r  Ð  s   Hr  c                   @   s>   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 Headerr^   rv   r\   ÚuplenNÚzeror   é   r€   )	r¼   r½   r¾   rš   r"   r!   r   r   r  rs   rs   rs   rt   r  %  s   
ür  c                 C   s"  t ƒ }| |_d}d}d}|durÚt|tƒsÚt|tƒrd|jdkrdt|jƒdkrd|dkrd|jd }d}nnt|tƒrž|jdkržt|jƒdkrž|dkrž|jd }d}n4t|t	ƒrÒt|j
ƒdkrÒt|j
d tƒrÒ|j
d j}|j}q|du rî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°   r[   z5No IPv6 underlayer to compute checksum. Leaving null.)r  r€   rw   rk   r�   ÚsegleftrŸ   rù   rÐ   r“   rû   rü   rý   r  r   r^   r\   r  )r€   ÚurØ   Úph6ZrthdrZhahdrZfinal_dest_addr_foundrs   rs   rt   Úin6_pseudoheader.  sP    
ÿÿþ

ÿÿþ
ÿr"  c                 C   s0   t | |t|ƒƒ}|du rdS t|ƒ}t|| ƒ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   )r"  rŸ   r   rE   )r€   r   rq   r!  Zph6srs   rs   rt   Ú
in6_chksumg  s
    r#  c                   @   s   e Zd ZdZeegZdS )r  zAbstract IPv6 Option HeaderN)r¼   r½   r¾   rš   rk   r  Z
aliastypesrs   rs   rs   rt   r  ‚  s   r  ÚPad1ÚPadNzTunnel Encapsulation LimitúRouter AlertzQuick-StartúJumbo PayloadúHome Address Option)r   r[   rX   é   r‚   rå   éÉ   c                   @   s0   e Zd ZdZdddddœZddd	œZd
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                 C   s<   | j  |t|ƒ¡}| j|d@  }| j|d@  }d|||f S )Nr,  r-  z%s [%s, %s])Zi2sr|   ÚreprÚpolÚenroutechange)r™   r¡   r´   r©   ZpolstrZenroutechangestrrs   rs   rt   r»   ¢  s    z_OTypeField.i2reprN)r¼   r½   r¾   r  r/  r0  r»   rs   rs   rs   rt   r+  ’  s   ýÿr+  c                   @   sZ   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdd„ Z	e
ddd„ƒZdd„ ZdS )ÚHBHOptUnknownzScapy6 Unknown OptionÚotyper[   ÚoptlenNÚoptdataró   ©Ú	length_ofÚfmtÚ c                 C   s   | j S r—   ©r3  ©r¡   rs   rs   rt   Ú<lambda>®  r§   zHBHOptUnknown.<lambda>©r–   c                 C   s   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   rs   ©r™   Úcurposrs   rs   rt   Úalignment_delta°  s    
zHBHOptUnknown.alignment_deltac                 O   s$   |r t |d ƒ}|tv r t| S | S r¤   )r   Ú
_hbhoptcls)r
  r  Úargsr  r  rs   rs   rt   r  ¼  s
    zHBHOptUnknown.dispatch_hookc                 C   s   d|fS ©Nr§   rs   ©r™   rq   rs   rs   rt   rì   Ä  s    zHBHOptUnknown.extract_padding)N)r¼   r½   r¾   rš   r+  Ú_hbhoptsr   r,   r  r?  r  r  rì   rs   rs   rs   rt   r1  ©  s   
ÿþr1  c                   @   s.   e Zd Zd ZeddeƒgZdd„ Zdd„ ZdS )r$  r2  r   c                 C   s   dS r¤   rs   r=  rs   rs   rt   r?  Ì  s    zPad1.alignment_deltac                 C   s   d|fS rB  rs   rC  rs   rs   rt   rì   Ï  s    zPad1.extract_paddingN)	r¼   r½   r¾   rš   r+  rD  r  r?  rì   rs   rs   rs   rt   r$  È  s   c                   @   sL   e Zd Zd Zeddeƒeddddd�eddd	d
„ d�gZdd„ Z	dd„ Z
dS )r%  r2  r[   r3  Nr4  ró   r5  r8  c                 C   s   | j S r—   r9  r:  rs   rs   rt   r;  Ø  r§   zPadN.<lambda>r<  c                 C   s   dS r¤   rs   r=  rs   rs   rt   r?  Ú  s    zPadN.alignment_deltac                 C   s   d|fS rB  rs   rC  rs   rs   rt   rì   Ý  s    zPadN.extract_padding)r¼   r½   r¾   rš   r+  rD  r   r,   r  r?  rì   rs   rs   rs   rt   r%  Ó  s   
ÿþc                   @   sN   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d„ Z	dd„ Z
dS )ÚRouterAlertr&  r2  r)  r3  rÂ   ÚvalueNzDatagram contains a MLD messagezDatagram contains RSVP messagez+Datagram contains an Active Network messagezNSIS NATFW NSLPzMPLS OAMÚReserved)r   r[   rÂ   éD   éE   éÿÿ  c                 C   s,   d}d}||| | d |  | | }|S )NrÂ   r   r[   rs   ©r™   r>  r´   rµ   Údeltars   rs   rt   r?  ñ  s     zRouterAlert.alignment_deltac                 C   s   d|fS rB  rs   rC  rs   rs   rt   rì   ÷  s    zRouterAlert.extract_padding)r¼   r½   r¾   rš   r+  rD  r   r'   r  r?  rì   rs   rs   rs   rt   rE  á  s   
ûÿþrE  c                   @   s>   e Zd ZdZeddeƒeddƒeddƒgZdd	„ Z	d
d„ Z
dS )ÚJumbor'  r2  rå   r3  rX   Z	jumboplenNc                 C   s,   d}d}||| | d |  | | }|S )NrX   rÂ   r[   rs   rK  rs   rs   rt   r?    s     zJumbo.alignment_deltac                 C   s   d|fS rB  rs   rC  rs   rs   rt   rì     s    zJumbo.extract_padding)r¼   r½   r¾   rš   r+  rD  r   r!   r  r?  rì   rs   rs   rs   rt   rM  û  s   
þrM  c                   @   s>   e Zd ZdZeddeƒeddƒeddƒgZdd	„ Z	d
d„ Z
dS )rü   r(  r2  r*  r3  r�   rý   rv   c                 C   s,   d}d}||| | d |  | | }|S )NrÕ   r‚   r[   rs   rK  rs   rs   rt   r?    s     zHAO.alignment_deltac                 C   s   d|fS rB  rs   rC  rs   rs   rt   rì     s    zHAO.extract_paddingN)r¼   r½   r¾   rš   r+  rD  r   r"   r  r?  rì   rs   rs   rs   rt   rü     s   
þrü   )r   r[   r)  rå   r*  c                   @   s2   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_OptionsFieldr>  c                 O   s(   || _ tj| |||g|¢R i |¤Ž d S r—   )r>  r&   r˜   )r™   rš   r›   r
  r>  rA  r  rs   rs   rt   r˜   '  s    z_OptionsField.__init__c                 C   s   t |  ||¡ƒS r—   ©rŸ   r¶   r    rs   rs   rt   r£   +  s    z_OptionsField.i2lenc           	      C   s  d }zt |dƒ}W n ty(   d}Y n0 |s>d tt|ƒ¡S | j}d}|D ]l}| |¡}||7 }|dkrz|ttƒ ƒ7 }n"|dkrœ|tt	d|d  d�ƒ7 }t|ƒ}|t
|ƒ7 }||7 }qL|d }|dkrÎ|S d| }|dkrî|ttƒ ƒ7 }n$|dk�r|tt	d|d  d�ƒ7 }|S )	NÚautopadr[   r§   r   ó    rÂ   )r4  rÕ   )Úgetattrr±   rº   ÚmapÚbytesr>  r?  r   r$  r%  rŸ   )	r™   r¡   r´   rP  r>  r©   rq   ro   Úpstrrs   rs   rt   r¶   .  s8    



z_OptionsField.i2mc                 C   s   ||   ||¡ S r—   ©r¶   ©r™   r¡   r©   Úvalrs   rs   rt   ÚaddfieldR  s    z_OptionsField.addfieldN)r¼   r½   r¾   r¿   r˜   r£   r¶   rY  rs   rs   rs   rt   rN  $  s
   $rN  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_PhantomAutoPadFieldc                 C   s   |S r—   rs   rW  rs   rs   rt   rY  W  s    z_PhantomAutoPadField.addfieldc                 C   s   |dfS ©Nr[   rs   )r™   r¡   r©   rs   rs   rt   r¯   Z  s    z_PhantomAutoPadField.getfieldc                 C   s   |rdS dS )NZOnZOffrs   ©r™   r¡   r´   rs   rs   rt   r»   ]  s    z_PhantomAutoPadField.i2reprN)r¼   r½   r¾   rY  r¯   r»   rs   rs   rs   rt   rZ  V  s   rZ  c                
   @   sZ   e Zd ZdZeddeƒedddddd	„ d
�eddƒedg e	dd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                 C   s   |d d d d S ©NrÂ   é   rÕ   r[   rs   ©r¡   r´   rs   rs   rt   r;  g  r§   zIPv6ExtHdrHopByHop.<lambda>©r6  r7  ÚadjustrP  r[   rÂ   c                 C   s   d| j d  d S ©NrÕ   r[   rÂ   rž   r:  rs   rs   rt   r;  j  r§   r<  r   ©r¼   r½   r¾   rš   r   r  r   rZ  rN  r1  r  rk   Úoverload_fieldsrs   rs   rs   rt   r�   c  s   

ÿ
ÿüc                
   @   sZ   e Zd ZdZeddeƒedddddd	„ d
�eddƒedg e	ddd	„ d�gZ
eddiiZdS )r“   z2IPv6 Extension Header - Destination Options Headerr€   rŠ   rŸ   Nrû   ró   c                 C   s   |d d d d S r]  rs   r_  rs   rs   rt   r;  t  r§   zIPv6ExtHdrDestOpt.<lambda>r`  rP  r[   rÂ   c                 C   s   d| j d  d S rb  rž   r:  rs   rs   rt   r;  w  r§   r<  r‹   rc  rs   rs   rs   rt   r“   p  s   

ÿ
ÿüc                
   @   sp   e Zd ZdZeddeƒedddddd	„ d
�eddƒeddƒedddƒe	dg dd	„ d�gZ
eddiiZdd„ ZdS )r�   zIPv6 Option Header Routingr€   rŠ   rŸ   Nrù   ró   c                 C   s   d| S ©NrÂ   rs   r_  rs   rs   rt   r;  �  r§   zIPv6ExtHdrRouting.<lambda>©Zcount_ofr7  ra  rd   r   r  Úreservedr-  c                 C   s
   d| j  S ©NrÕ   rž   r:  rs   rs   rt   r;  †  r§   r<  r„   c                 C   sB   | j d u r4|d d… t dt| jƒ¡ |dd …  }t | ||¡S )NrÈ   ró   rX   )r  rá   râ   rŸ   rù   r  rä   )r™   r¡   rã   rs   rs   rt   rä   ‰  s    
*zIPv6ExtHdrRouting.post_build)r¼   r½   r¾   rš   r   r  r   r   r   r”   r  rk   rd  rä   rs   rs   rs   rt   r�   }  s   

ÿ
ÿúzPad1 TLVzIngress Node TLVzEgress Node TLVzPadN TLVzHMAC TLV)r   r[   rÂ   rX   r)  c                   @   s\   e Zd ZdZeddeƒeddƒedddd	„ d
�gZdd„ Z	i Z
edd„ ƒZeddd„ƒZdS )ÚIPv6ExtHdrSegmentRoutingTLVz0IPv6 Option Header Segment Routing - Generic TLVrd   NrŸ   r   rF  r8  c                 C   s   | j S r—   rž   r:  rs   rs   rt   r;  £  r§   z$IPv6ExtHdrSegmentRoutingTLV.<lambda>r<  c                 C   s   d|fS rB  rs   rC  rs   rs   rt   rì   ¥  s    z+IPv6ExtHdrSegmentRoutingTLV.extract_paddingc                 C   s   | | j | jj< d S r—   )Úregistered_sr_tlvrd   r›   )r
  rs   rs   rt   Úregister_variantª  s    z,IPv6ExtHdrSegmentRoutingTLV.register_variantc                 O   s&   |r"t |d d… ƒ}| j || ¡S | S r[  )Úordrj  r|   )r
  r¡   rA  r  Ztmp_typers   rs   rt   r  ®  s    z)IPv6ExtHdrSegmentRoutingTLV.dispatch_hook)N)r¼   r½   r¾   rš   r   Ú_segment_routing_header_tlvsr   r,   r  rì   rj  r  rk  r  rs   rs   rs   rt   ri  ž  s   
þ
ri  c                   @   s>   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 TLVrd   r[   rŸ   é   rg  r   ÚflagsZingress_noderÚ   N©	r¼   r½   r¾   rš   r   rm  r   r"   r  rs   rs   rs   rt   rn  ¶  s   
ürn  c                   @   s>   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 TLVrd   rÂ   rŸ   ro  rg  r   rp  Zegress_noderÚ   Nrq  rs   rs   rs   rt   rr  À  s   
ürr  c                   @   s<   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdS )ÚIPv6ExtHdrSegmentRoutingTLVPad1z-IPv6 Option Header Segment Routing - Pad1 TLVrd   r   rŸ   NÚpaddingró   r5  rQ  c                 C   s   | j S r—   rž   r:  rs   rs   rt   r;  Ï  r§   z(IPv6ExtHdrSegmentRoutingTLVPad1.<lambda>r<  ©	r¼   r½   r¾   rš   r   rm  r   r,   r  rs   rs   rs   rt   rs  Ê  s
   
þrs  c                   @   s<   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdS )ÚIPv6ExtHdrSegmentRoutingTLVPadNz-IPv6 Option Header Segment Routing - PadN TLVrd   rX   rŸ   Nrt  ró   r5  rQ  c                 C   s   | j S r—   rž   r:  rs   rs   rt   r;  ×  r§   z(IPv6ExtHdrSegmentRoutingTLVPadN.<lambda>r<  ru  rs   rs   rs   rt   rv  Ò  s
   
þrv  c                
   @   s\   e Zd ZdZeddeƒeddddd„ d	�ed
ddƒedddƒeddƒe	dddd„ d�gZ
dS )ÚIPv6ExtHdrSegmentRoutingTLVHMACz-IPv6 Option Header Segment Routing - HMAC TLVrd   r)  rŸ   NÚhmacc                 C   s   |d S ©Né0   rs   )r  r´   rs   rs   rt   r;  ß  r§   z(IPv6ExtHdrSegmentRoutingTLVHMAC.<lambda>©r6  ra  ÚDr   r[   rg  é   Z	hmackeyidr8  c                 C   s
   | j d S ry  rž   r:  rs   rs   rt   r;  ä  r§   r<  )r¼   r½   r¾   rš   r   rm  r   r   r!   r,   r  rs   rs   rs   rt   rw  Ú  s   
ÿ

ÿúrw  c                   @   sº   e Zd ZdZeddeƒeddƒeddƒeddƒed	dƒed
d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d„ d�e
dg edd„ d�gZeddiiZdd„ ZdS )rÐ   z"IPv6 Option Header Segment Routingr€   rŠ   rŸ   Nrd   rX   r  Ú	lastentryZunused1r   r[   Z	protectedZoamÚalertrx  Zunused2rÈ   Útagrù   rÚ   c                 C   s
   | j d S r[  )r~  r:  rs   rs   rt   r;  ÷  r§   z!IPv6ExtHdrSegmentRouting.<lambda>©r•   Ztlv_objectsc                 C   s   d| j  d| jd   S )NrÕ   r�   r[   )rŸ   r~  r:  rs   rs   rt   r;  ú  s   
ÿr<  r„   c                 C   s>  | j d u r–t |ƒ d d }|dkr8tƒ }|t|ƒ7 }n*|dkrbd|d  }t|d�}|t|ƒ7 }t |ƒd d }|d d… t d|¡ |dd …  }| jd u rÚt | jƒ}|r¶|d8 }|d d… t d|¡ |dd …  }| jd u �r0t | jƒ}|d	k�rt	d
ƒ n|d8 }|d d… t d|¡ |dd …  }t
 | ||¡S )NrÕ   r[   rÂ   rQ  )rt  ró   rÈ   rX   r   z8IPv6ExtHdrSegmentRouting(): the addresses list is empty!r)  )rŸ   rs  r   rv  rá   râ   r  rù   r~  r   r  rä   )r™   r¡   rã   Ztmp_modZtlvZtmp_padr«   r~  rs   rs   rt   rä      s2    

$

$

ÿ$z#IPv6ExtHdrSegmentRouting.post_build)r¼   r½   r¾   rš   r   r  r   r   r(   r”   r&   ri  r  rk   rd  rä   rs   rs   rs   rt   rÐ   ç  s.   






ÿþòrÐ   c                       sj   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d„Z‡  ZS )r‘   z,IPv6 Extension Header - Fragmentation headerr€   rŠ   Úres1r   rÕ   rë   é   Úres2rÂ   Úmr[   ÚidNr…   c                    s"   | j dkrtS tt| ƒ |¡S d S r¤   )rë   r?   Úsuperr‘   Úguess_payload_classrC  ©Ú	__class__rs   rt   rˆ  1  s    
z&IPv6ExtHdrFragment.guess_payload_class)r¼   r½   r¾   rš   r   r  r   r!   r  rk   rd  rˆ  Ú__classcell__rs   rs   r‰  rt   r‘   '  s   




ûc                    sŠ  dd„ | D ƒ}|sg S |d t  j‰ t|ƒ}‡ fdd„|D ƒ}t|ƒ|krRtdƒ g }|r¦d}|d t  j}|D ]}|t  j}||k rpd}|}qp| || ¡ ||= qVd}|D ]X}|t  }	d|	j }
|
t|ƒkrätdt|ƒ|
f ƒ |d	|
t|ƒ  7 }|t|	jƒ7 }q®|d  ¡ }	|	t  j	}||	t  j
_	t|ƒ|	t  j
_|	t  j
`|	tj|d
� }	|	`|	t j
�rzt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                 S   s   g | ]}t |v r|‘qS rs   )r‘   ©Ú.0r´   rs   rs   rt   Ú
<listcomp>?  r§   zdefragment6.<locals>.<listcomp>r   c                    s   g | ]}|t  jˆ kr|‘qS rs   )r‘   r†  rŒ  ©r†  rs   rt   rŽ  F  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‘   r†  rŸ   r   rë   r¨   r   rõ   Úcopyr€   r  rØ   r   Ú	raw_layerrk   )Zpacketsr¬   Zllenrr   Zmin_posZ
min_offsetrq   Z
cur_offsetZfragmentableÚqrë   r€   rs   r�  rt   Údefragment68  sL    



r–  c                 C   sB  |   ¡ } t| vr\t| vr| gS | t }|j}t|jd�}| ¡  |`|`| |¡ | |¡ tt	| t ƒƒdkr|t
dƒ g S t	| ƒ}t|ƒ|kr–| gS | t j}t	tddd�| ƒ}t|ƒd }|| d… }	| t j}
| t }|`t|ƒ| d }| }| t j`|| d }||d  }|d	k�s.|d	k�rPt
d
d|d   ƒ || | gS |	}g }d	}t d	d¡}|jdu�rz|j}d|_||_|
|_t|ƒ|k�rø|d|… }||d… }||_||d 7 }t|v �rØd|t _|| tj|d� }| |¡ nB||_d	|_t|v �rd|t _|| tj|d� }| |¡ �q>�qŒ|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€   rJ  zDAn IPv6 packet can'be bigger than 65535, please use a Jumbo payload.rÚ   ©r^   r\   rß   NrÕ   r   z)Provided fragment size value is too low. zShould be more than %dì   ÿÿ r[   r‘  )r“  r‘   rk   rõ   r€   Zremove_payloadrØ   Zadd_payloadrŸ   r   r   r  ÚrandomÚrandintr†  r…  rë   r   r”  r¨   )r¡   ZfragSizeZlayer3ré   Úfragr©   ZfragPartÚtmpZfragPartLenZfragPartStrr€   Z
fragHeaderZunfragPartLenZ
unfragPartZlastFragSizeZinnerFragSizer®   rr   Z
fragOffsetZfragIdZtempors   rs   rt   Ú	fragment6q  sz    





ÿ




rž  ÚICMPv6DestUnreachÚICMPv6PacketTooBigÚICMPv6TimeExceededÚICMPv6ParamProblemÚICMPv6EchoRequestÚICMPv6EchoReplyÚICMPv6MLQueryÚICMPv6MLReportÚICMPv6MLDoneÚICMPv6ND_RSÚICMPv6ND_RArl   ÚICMPv6ND_NAÚICMPv6ND_RedirectZICMPv6NIQueryZICMPv6NIReplyÚICMPv6ND_INDSolÚICMPv6ND_INDAdvÚICMPv6MLReport2ÚICMPv6HAADRequestÚICMPv6HAADReplyÚICMPv6MPSolÚICMPv6MPAdvÚICMPv6MRD_AdvertisementÚICMPv6MRD_SolicitationÚICMPv6MRD_TerminationÚ	ICMPv6RPL)r[   rÂ   rÈ   rX   rí   é�   rÆ   éƒ   r�   rî   rï   rŽ   rð   é‰   rÃ   rÄ   é�   éŽ   é�   rñ   rò   é’   é“   é—   é˜   é™   é›   rÕ   r  r�   rß   )r[   rÂ   rÈ   rX   rí   r·  rÆ   r¸  r�   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 problemzPrivate ExperimentationzEcho Requestz
Echo Replyz	MLD Queryz
MLD ReportzMLD DonezRouter SolicitationzRouter AdvertisementzNeighbor SolicitationzNeighbor AdvertisementzRedirect MessagezRouter RenumberingzICMP Node Information QueryzICMP Node Information Responsez/Inverse Neighbor Discovery Solicitation Messagez0Inverse Neighbor Discovery Advertisement MessagezMLD Report Version 2z,Home Agent Address Discovery Request Messagez*Home Agent Address Discovery Reply MessagezMobile Prefix SolicitationzMobile Prefix AdvertisementzCertification Path Solicitationz Certification Path AdvertisementzMulticast Router AdvertisementzMulticast Router SolicitationzMulticast Router TerminationzRPL Control Message)"r[   rÂ   rÈ   rX   éd   ée   rí   r·  rÆ   r¸  r�   rî   rï   rŽ   rð   r¹  éŠ   rÃ   rÄ   rº  r»  r¼  rñ   rò   r½  r¾  é”   é•   r¿  rÀ  rÁ  rÂ  éÈ   r*  c                   @   s4   e Zd ZdZeddiiZdd„ Zdd„ Zdd	„ Zd
S )rö   zICMPv6 dummy classr€   r‰   c                 C   sH   ||7 }| j d u rDtd| j|ƒ}|d d… t d|¡ |dd …  }|S )Nr‰   rÂ   rà   rX   )Úcksumr#  r  rá   râ   )r™   rq   rã   r  rs   rs   rt   rä   B  s
    
$z_ICMPv6.post_buildc                 C   s
   | j  ¡ S r—   )rõ   r÷   rÝ   rs   rs   rt   r÷   I  s    z_ICMPv6.hashretc                 C   sF   t | jtƒs"t | jtƒrBt |tƒrB| j|jkr:| j|jks>dS dS dS ©Nr   r[   )rw   r  r  r  rö   rd   Úcode©r™   r  rs   rs   rt   r  L  s    
ÿþ
ÿz_ICMPv6.answersN)	r¼   r½   r¾   rš   rk   rd  rä   r÷   r  rs   rs   rs   rt   rö   >  s
   rö   c                   @   s   e Zd ZdZdd„ ZdS )Ú_ICMPv6ErrorzICMPv6 errors dummy classc                 C   s   t S r—   )r  rC  rs   rs   rt   rˆ  [  s    z _ICMPv6Error.guess_payload_classN©r¼   r½   r¾   rš   rˆ  rs   rs   rs   rt   rÍ  X  s   rÍ  c                   @   s6   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 classrd   r[   rË  r   rÉ  NZmsgbodyr8  )
r¼   r½   r¾   rš   r   Ú
icmp6typesr   r0   r*   r  rs   rs   rs   rt   r’   _  s   
ýc                
   @   sL   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ƒgZ	dS )rŸ  zICMPv6 Destination Unreachablerd   r[   rË  r   zNo route to destinationz:Communication with destination administratively prohibitedzBeyond scope of source addresszAddress unreachablezPort unreachable)r   r[   rÂ   rÈ   rX   rÉ  NÚlengthÚunused©
r¼   r½   r¾   rš   r   rÏ  r0   r   r-   r  rs   rs   rs   rt   rŸ  i  s   
üøc                   @   s6   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ICMPv6 Packet Too Bigrd   rÂ   rË  r   rÉ  NÚmtué   )
r¼   r½   r¾   rš   r   rÏ  r   r0   r!   r  rs   rs   rs   rt   r   v  s   
ýc                   @   sF   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ƒgZ	d
S )r¡  zICMPv6 Time Exceededrd   rÈ   rË  r   zhop limit exceeded in transitz!fragment reassembly time exceeded©r   r[   rÉ  NrÐ  rÑ  rÒ  rs   rs   rs   rt   r¡  ~  s   
ÿûc                	   @   sB   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 )r¢  zICMPv6 Parameter Problemrd   rX   rË  r   z"erroneous header field encounteredz)unrecognized Next Header type encounteredz$unrecognized IPv6 option encounteredz*first fragment has incomplete header chain©r   r[   rÂ   rÈ   rÉ  NZptrr‚   )	r¼   r½   r¾   rš   r   rÏ  r0   r!   r  rs   rs   rs   rt   r¢  ‹  s   
ýþøc                   @   sV   e Zd ZdZeddeƒeddƒeddƒeddƒed	dƒed
dƒgZ	dd„ Z
dd„ ZdS )r£  zICMPv6 Echo Requestrd   rí   rË  r   rÉ  Nr†  Úseqré   r8  c                 C   s
   |   d¡S )Nz%name% (id: %id% seq: %seq%)©ÚsprintfrÝ   rs   rs   rt   rÞ   ¡  s    zICMPv6EchoRequest.mysummaryc                 C   s   t  d| j| j¡| j ¡  S )NZHH)rá   râ   r†  r×  rõ   r÷   rÝ   rs   rs   rt   r÷   ¤  s    zICMPv6EchoRequest.hashret)r¼   r½   r¾   rš   r   rÏ  r   r0   r*   r  rÞ   r÷   rs   rs   rs   rt   r£  ˜  s   
ûc                   @   s   e Zd ZdZdZdd„ ZdS )r¤  zICMPv6 Echo Replyr·  c                 C   s.   t |tƒo,| j|jko,| j|jko,| j|jkS r—   )rw   r£  r†  r×  ré   rÌ  rs   rs   rt   r  ¬  s    

ÿ
ÿ
þzICMPv6EchoReply.answersN)r¼   r½   r¾   rš   rd   r  rs   rs   rs   rt   r¤  ¨  s   c                   @   sB   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 )Ú	_ICMPv6MLrd   rÆ   rË  r   rÉ  NÚmrdrg  Úmladdrrv   )
r¼   r½   r¾   r   rÏ  r   r0   r(   r"   r  rs   rs   rs   rt   rÚ  ¼  s   
ûrÚ  c                   @   s,   e Zd ZdZdZdZdZeddddœiZd	S )
r¥  zMLD - Multicast Listener QueryrÆ   é'  rv   úff02::1r[   r‰   ©r\   r_   r€   N)	r¼   r½   r¾   rš   rd   rÛ  rÜ  rk   rd  rs   rs   rs   rt   r¥  Í  s
   c                   @   s*   e Zd ZdZdZedddœiZdd„ ZdS )	r¦  zMLD - Multicast Listener Reportr¸  r[   r‰   )r_   r€   c                 C   s   t |v S ©zCheck the query type)r¥  ©r™   Úqueryrs   rs   rt   r  Ü  s    zICMPv6MLReport.answersN)r¼   r½   r¾   rš   rd   rk   rd  r  rs   rs   rs   rt   r¦  ×  s   c                   @   s$   e Zd ZdZdZeddddœiZdS )r§  zMLD - Multicast Listener Doner�   úff02::2r[   r‰   rß  N)r¼   r½   r¾   rš   rd   rk   rd  rs   rs   rs   rt   r§  è  s   c                   @   sœ   e Zd ZdZeddeƒeddƒeddƒedd	ƒed
dƒe	ddƒe
dddƒe
dddƒe
dddƒeddƒeddƒedg dd„ d�gZeddddœiZdd„ ZdS )rÌ   z MLDv2 - Multicast Listener Queryrd   rÆ   rË  r   rÉ  NrÛ  rÝ  rg  rÜ  rv   ZResvrX   ÚSr[   ZQRVrÈ   ZQQICÚsources_numberÚsourcesc                 C   s   | j S r—   ©rå  r:  rs   rs   rt   r;  þ  r§   zICMPv6MLQuery2.<lambda>r�  rÞ  r‰   rß  c                 C   sF   | j du r8t dt| jƒ¡}|dd… | |dd…  }t | ||¡S )z.Compute the 'sources_number' field when neededNrà   é   rÇ   )rå  rá   râ   rŸ   ræ  rö   rä   )r™   Úpacketrõ   Zsrcnumrs   rs   rt   rä     s    
zICMPv6MLQuery2.post_build)r¼   r½   r¾   rš   r   rÏ  r   r0   r(   r"   r   r”   r  rk   rd  rä   rs   rs   rs   rt   rÌ   ð  s$   



ÿõrÌ   c                
   @   sl   e Zd ZdZeddƒeddddd�ed	dd
dd„ d�eddƒed
g dd„ d�edddd„ d�gZ	dd„ Z
dS )ÚICMPv6MLDMultAddrRecz'ICMPv6 MLDv2 - Multicast Address RecordZrtyperX   Úauxdata_lenNZauxdataró   r5  rå  ræ  c                 C   s   |d S rœ   rs   )rq   Únumrs   rs   rt   r;    r§   zICMPv6MLDMultAddrRec.<lambda>r{  r\   rv   c                 C   s
   d| j  S rœ   rç  ©rq   rs   rs   rt   r;    r§   r<  r8  c                 C   s   | j S r—   )rë  rí  rs   rs   rt   r;    r§   c                 C   s   | j S )z0Multicast Address Record followed by another oner‰  )r™   ré  rs   rs   rt   rÓ     s    z*ICMPv6MLDMultAddrRec.default_payload_class)r¼   r½   r¾   rš   r   r   r"   r”   r,   r  rÓ   rs   rs   rs   rt   rê    s&   þþÿÿörê  c                   @   sp   e Zd ZdZeddeƒeddƒeddƒeddƒed	dƒe	d
g e
dd„ d�gZeddddœiZdd„ Zdd„ ZdS )r®  z!MLDv2 - Multicast Listener Reportrd   r¼  rr   r   rÉ  Nrg  Úrecords_numberÚrecordsc                 C   s   | j S r—   )rî  rí  rs   rs   rt   r;  (  r§   zICMPv6MLReport2.<lambda>r�  zff02::16r[   r‰   rß  c                 C   sF   | j du r8t dt| jƒ¡}|dd… | |dd…  }t | ||¡S )z.Compute the 'records_number' field when neededNrà   r‚   rÕ   )rî  rá   râ   rŸ   rï  rö   rä   )r™   ré  rõ   Zrecnumrs   rs   rt   rä   -  s    
zICMPv6MLReport2.post_buildc                 C   s
   t |tƒS rà  )rw   rÌ   rá  rs   rs   rt   r  4  s    zICMPv6MLReport2.answers)r¼   r½   r¾   rš   r   rÏ  r   r0   r(   r&   rê  r  rk   rd  rä   r  rs   rs   rs   rt   r®    s   
þû
c                   @   sV   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d„ ZdS )r³  z/ICMPv6 Multicast Router Discovery Advertisementrd   r¿  Zadvinterr×   rÉ  NZqueryintr   Z
robustnessr‰   r[   rã  ©r€   r_   r\   c                 C   s   |d d… |dd … fS rh  rs   ©r™   r©   rs   rs   rt   rì   O  s    z'ICMPv6MRD_Advertisement.extract_padding)r¼   r½   r¾   rš   r   rÏ  r   r0   r(   r  rk   rd  rì   rs   rs   rs   rt   r³  E  s   
üc                   @   sF   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d„ ZdS )r´  z.ICMPv6 Multicast Router Discovery Solicitationrd   rÀ  rr   r   rÉ  Nr‰   r[   rã  rð  c                 C   s   |d d… |dd … fS ©NrX   rs   rñ  rs   rs   rt   rì   [  s    z&ICMPv6MRD_Solicitation.extract_padding©r¼   r½   r¾   rš   r   rÏ  r   r0   r  rk   rd  rì   rs   rs   rs   rt   r´  S  s   
þc                   @   sF   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d„ ZdS )rµ  z-ICMPv6 Multicast Router Discovery Terminationrd   rÁ  rr   r   rÉ  Nr‰   r[   zff02::6Arð  c                 C   s   |d d… |dd … fS rò  rs   rñ  rs   rs   rt   rì   g  s    z%ICMPv6MRD_Termination.extract_paddingró  rs   rs   rs   rt   rµ  _  s   
þzSource Link-Layer AddresszTarget Link-Layer AddresszPrefix InformationzRedirected Headerr   zNBMA Shortcut Limit OptionzAdvertisement Interval OptionzHome Agent Information OptionzSource Address ListzTarget Address Listz
CGA OptionzRSA Signature OptionzTimestamp OptionzNonce optionz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È   rX   r)  r‚   r^  rÕ   é	   é
   é   é   rƒ  é   r}  r�   rƒ   ro  é   r×   é   é   é   r  é   rè  rm   r}   ÚICMPv6NDOptPrefixInfoÚICMPv6NDOptRedirectedHdrÚICMPv6NDOptMTUÚICMPv6NDOptShortcutLimitÚICMPv6NDOptAdvIntervalÚICMPv6NDOptHAInfoÚICMPv6NDOptSrcAddrListÚICMPv6NDOptTgtAddrListÚICMPv6NDOptIPAddrÚICMPv6NDOptNewRtrPrefixÚICMPv6NDOptLLAÚICMPv6NDOptMAPÚICMPv6NDOptRouteInfoÚICMPv6NDOptRDNSSÚICMPv6NDOptEFAÚICMPv6NDOptDNSSL)r[   rÂ   rÈ   rX   r)  r‚   r^  rÕ   rô  rõ  rƒ   ro  rù  rü  r  rý  rè  é   zMedium (default)ZHighrG  ZLowrÖ  c                   @   s   e Zd ZdZdd„ ZdS )Ú_ICMPv6NDGuessPayloadz4Dummy ND class that implements guess_payload_class()c                 C   s$   t |ƒdkr t t|d ƒt¡S d S ©Nr[   r   )rŸ   Úicmp6ndoptsclsr|   r   r?   rC  rs   rs   rt   rˆ  ±  s    z)_ICMPv6NDGuessPayload.guess_payload_classNrÎ  rs   rs   rs   rt   r  ®  s   r  c                   @   s@   e Zd ZdZeddƒedddddd„ d	�edd
dd„ d�gZdS )ÚICMPv6NDOptUnknownz6ICMPv6 Neighbor Discovery Option - Scapy Unimplementedrd   NrŸ   ré   ró   c                 C   s   |d S re  rs   r_  rs   rs   rt   r;  ¼  r§   zICMPv6NDOptUnknown.<lambda>r`  r8  c                 C   s
   | j d S re  rž   r:  rs   rs   rt   r;  ¾  r§   r<  )r¼   r½   r¾   rš   r   r   r,   r  rs   rs   rs   rt   r  ¸  s   
ÿÿýr  c                   @   s4   e Zd ZdZeddƒeddƒedeƒgZdd„ ZdS )	rm   z<ICMPv6 Neighbor Discovery Option - Source Link-Layer Addressrd   r[   rŸ   rc   c                 C   s
   |   d¡S )Nz%name% %lladdr%rØ  rÝ   rs   rs   rt   rÞ   Ê  s    zICMPv6NDOptSrcLLAddr.mysummaryN)	r¼   r½   r¾   rš   r   r$   r   r  rÞ   rs   rs   rs   rt   rm   Ä  s   þc                   @   s   e Zd ZdZdZdS )r}   zAICMPv6 Neighbor Discovery Option - Destination Link-Layer AddressrÂ   N©r¼   r½   r¾   rš   rd   rs   rs   rs   rt   r}   Î  s   c                   @   s|   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d„ Z	dS )rþ  z5ICMPv6 Neighbor Discovery Option - Prefix Informationrd   rÈ   rŸ   rX   Ú	prefixlenrÙ   ÚLr[   ÚAÚRr   r‚  r)  Úvalidlifetimer™  Zpreferredlifetimer„  Úprefixrv   c                 C   s
   |   d¡S )NzQ%name% %prefix%/%prefixlen% On-link %L% Autonomous Address %A% Router Address %R%rØ  rÝ   rs   rs   rt   rÞ   á  s    zICMPv6NDOptPrefixInfo.mysummaryN)
r¼   r½   r¾   rš   r   r   r/   r"   r  rÞ   rs   rs   rs   rt   rþ  Ó  s   



öc                   @   s<   e Zd ZdgZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚTruncPktLenFieldÚ	cur_shiftNr   c                 C   s   t j| ||||d� || _d S ©Nr<  )r%   r˜   r  )r™   rš   r›   r
  r  r–   Úshiftrs   rs   rt   r˜   í  s    zTruncPktLenField.__init__c                 C   s.   |   |¡}|  ||d |… ¡}||d … |fS r—   ©r–   Úm2i)r™   r¡   r©   r«   r¢   rs   rs   rt   r¯   ñ  s    
zTruncPktLenField.getfieldc                 C   s4   d }z|   |¡}W n ty.   t |¡ Y S 0 |S r—   )r
  r±   r   r”  )r™   r¡   r…  r©   rs   rs   rt   r  ö  s    zTruncPktLenField.m2ic                 C   s2   t |ƒ}t|ƒ}|| j d }|| }|d |… S rh  )r   rŸ   r  )r™   r¡   r´   r©   r«   Úrrs   rs   rt   r¶   þ  s
    zTruncPktLenField.i2mc                 C   s   t |  ||¡ƒS r—   rO  r    rs   rs   rt   r£     s    zTruncPktLenField.i2len)Nr   )	r¼   r½   r¾   r¿   r˜   r¯   r  r¶   r£   rs   rs   rs   rt   r  ê  s   
r  c                
   @   sN   e Zd ZdZeddƒedddddd	„ d
�edddƒeddeddd	„ d�gZ	dS )rÿ  z4ICMPv6 Neighbor Discovery Option - Redirected Headerrd   rX   rŸ   Nr¡   ró   c                 C   s   |d d S rh  rs   r_  rs   rs   rt   r;    r§   z!ICMPv6NDOptRedirectedHdr.<lambda>r`  rr   ó         r‚   r§   rÕ   c                 C   s   d| j  d S rh  rž   r:  rs   rs   rt   r;    r§   r<  )
r¼   r½   r¾   rš   r   r   r+   r  rk   r  rs   rs   rs   rt   rÿ  
  s   
ÿ

ÿüc                   @   s<   e Zd ZdZeddƒeddƒeddƒedd	ƒgZd
d„ ZdS )r   z&ICMPv6 Neighbor Discovery Option - MTUrd   r)  rŸ   r[   rr   r   rÓ  rÔ  c                 C   s
   |   d¡S )Nz%name% %mtu%rØ  rÝ   rs   rs   rt   rÞ     s    zICMPv6NDOptMTU.mysummaryN)	r¼   r½   r¾   rš   r   r0   r!   r  rÞ   rs   rs   rs   rt   r     s   ýc                   @   s<   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 Limitrd   r‚   rŸ   r[   Zshortcutlimrß   r‚  r   r„  N)r¼   r½   r¾   rš   r   r!   r  rs   rs   rs   rt   r  !  s   üc                   @   s<   e Zd ZdZeddƒeddƒeddƒeddƒgZd	d
„ ZdS )r  z2ICMPv6 Neighbor Discovery - Interval Advertisementrd   r^  rŸ   r[   rr   r   Zadvintc                 C   s
   |   d¡S )Nz%name% %advint% millisecondsrØ  rÝ   rs   rs   rt   rÞ   1  s    z ICMPv6NDOptAdvInterval.mysummaryN)	r¼   r½   r¾   rš   r   r(   r!   r  rÞ   rs   rs   rs   rt   r  *  s   ýc                   @   sD   e Zd ZdZeddƒeddƒeddƒeddƒed	dƒgZd
d„ ZdS )r  z2ICMPv6 Neighbor Discovery - Home Agent Informationrd   rÕ   rŸ   r[   rr   r   ÚprefÚlifetimec                 C   s
   |   d¡S )Nz %name% %pref% %lifetime% secondsrØ  rÝ   rs   rs   rt   rÞ   =  s    zICMPv6NDOptHAInfo.mysummaryN)r¼   r½   r¾   rš   r   r(   r  rÞ   rs   rs   rs   rt   r  5  s   üc                	   @   sN   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)rd   rƒ   rŸ   rÈ   Úoptcoder[   zOld Care-Of AddresszNew Care-Of AddresszNAR's IP address)r[   rÂ   rÈ   rØ   rÙ   rr   r   rn   rv   N)	r¼   r½   r¾   rš   r   r   r!   r"   r  rs   rs   rs   rt   r  E  s   þùc                   @   sD   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)rd   ro  rŸ   rÈ   r$  r   rØ   rÙ   rr   r  rv   N)r¼   r½   r¾   rš   r   r!   r"   r  rs   rs   rs   rt   r  Q  s   û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   r[   rÂ   rÈ   rX   r)  r‚   r^  c                   @   s6   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)rd   rù  rŸ   r[   r$  r   ÚllaN)
r¼   r½   r¾   rš   r   r   Ú_rfc4068_lla_optcoder$   r   r  rs   rs   rs   rt   r  e  s   
ýc                
   @   s\   e Zd ZdZeddƒeddƒedddƒed	d
dƒedddƒedddƒeddƒeddƒgZdS )r	  z&ICMPv6 Neighbor Discovery - MAP Optionrd   rü  rŸ   rÈ   Údistr[   rX   r"  r}  r  rr   r   r^  r  r™  rn   rv   N)	r¼   r½   r¾   rš   r   r   r!   r"   r  rs   rs   rs   rt   r	  m  s   



ùc                   @   s:   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú_IP6PrefixFieldr–   c                 C   s   t  | ||¡ dd„ | _d S )Nc                 S   s   d| j d  S ©NrÕ   r[   rž   r:  rs   rs   rt   r;  ~  r§   z*_IP6PrefixField.__init__.<locals>.<lambda>)r"   r˜   r–   ©r™   rš   r›   rs   rs   rt   r˜   |  s    z_IP6PrefixField.__init__c                 C   s   ||   ||¡ S r—   rV  rW  rs   rs   rt   rY  €  s    z_IP6PrefixField.addfieldc                 C   sF   |   |¡}|d |… }|dk r.|dd|  7 }||d … |  ||¡fS )Nr�   rQ  r  )r™   r¡   r©   r«   rq   rs   rs   rt   r¯   ƒ  s
    
z_IP6PrefixField.getfieldc                 C   s   t |  ||¡ƒS r—   rO  r\  rs   rs   rt   r£   Š  s    z_IP6PrefixField.i2lenc                 C   sn   |j }|d u rd}|d u rd}ttj|ƒ}|d u r6|S |dv rBdS |dv r^|d d|d  … S |d|d   S )	Nrv   r[   rÕ  r§   )rÂ   rÈ   rÕ   ó           rÈ   )rŸ   rG   ri   rj   )r™   r¡   r´   r«   rs   rs   rt   r¶   �  s    z_IP6PrefixField.i2mN)	r¼   r½   r¾   r¿   r˜   rY  r¯   r£   r¶   rs   rs   rs   rt   r(  y  s   r(  c                
   @   sp   e Zd ZdZeddƒedd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d„ ZdS )r
  z;ICMPv6 Neighbor Discovery Option - Route Information Optionrd   r  rŸ   Nr  ró   c                 C   s   |d d S r)  rs   r_  rs   rs   rt   r;  ¤  r§   zICMPv6NDOptRouteInfo.<lambda>r`  rØ   r‚  r   rÈ   ÚprfrÂ   r„  Z
rtlifetimer™  c                 C   s
   |   d¡S )Nz'%name% %prefix%/%plen% Preference %prf%rØ  rÝ   rs   rs   rt   rÞ   ¬  s    zICMPv6NDOptRouteInfo.mysummary)r¼   r½   r¾   rš   r   r   r   r   Úicmp6ndraprefsr!   r(  r  rÞ   rs   rs   rs   rt   r
     s   
ÿ

ø
c                	   @   sX   e Zd ZdZeddƒedddddd	„ d
�eddƒeddƒedg dd	„ d�gZ	dd„ Z
dS )r  z>ICMPv6 Neighbor Discovery Option - Recursive DNS Server Optionrd   rý  rŸ   NÚdnsró   c                 C   s   d| d S ©NrÂ   r[   rs   r_  rs   rs   rt   r;  ´  r§   zICMPv6NDOptRDNSS.<lambda>rf  rr   r#  r™  c                 C   s   d| j d  S r)  rž   r:  rs   rs   rt   r;  ¸  r§   r<  c                 C   s   |   dd | j¡ ¡S ©Nz%name% r¹   )rÙ  rº   r.  rÝ   rs   rs   rt   rÞ   º  s    zICMPv6NDOptRDNSS.mysummary)r¼   r½   r¾   rš   r   r   r(   r!   r”   r  rÞ   rs   rs   rs   rt   r  °  s   
ÿÿûc                   @   s.   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 Optionrd   rè  rŸ   r[   rr   r   rz  N)r¼   r½   r¾   rš   r   r   r  rs   rs   rs   rt   r  ¾  s
   
þc                   @   s<   e Zd ZdgZdZdZddd„Zdd	„ Zd
d„ Zdd„ Z	dS )ÚDomainNameListFieldÚpaddedr[   rÕ   NFc                 C   s   || _ tj| |||d� d S r  )r2  r,   r˜   )r™   rš   r›   r–   r2  rs   rs   rt   r˜   Ï  s    zDomainNameListField.__init__c                 C   s   t |  ||¡ƒS r—   rO  r\  rs   rs   rt   r£   Ó  s    zDomainNameListField.i2lenc                 C   sº   t |ƒ}g }|r¶g }|r\t|d ƒdkr\t|d ƒ}| |d|d … ¡ ||d d … }q| jr€t|ƒr”| d |¡d ¡ n| d |¡d ¡ |rt|d ƒdkr|dd … }q|S )Nr   r[   Ú.)r   rl  r¨   r2  rŸ   rº   )r™   r¡   r´   rr   Úcurr«   rs   rs   rt   r  Ö  s    zDomainNameListField.m2ic                    sf   dd„ ‰ dd„ |D ƒ}d  ‡ fdd„|D ƒ¡}| jrbt|ƒ| j dksb|d| jt|ƒ| j   7 }|S )	Nc                 S   s    | rt | d ƒdkr| S | d S )Nr°   r   rQ  )r   )Úzrs   rs   rt   ÚconditionalTrailingDotì  s    z7DomainNameListField.i2m.<locals>.conditionalTrailingDotc                 s   s"   | ]}d d„ |  d¡D ƒV  qdS )c                 S   s"   g | ]}t t|ƒƒ| d ¡ ‘qS )Úutf8)r
   rŸ   Úencode)r�  r5  rs   rs   rt   rŽ  ñ  r§   z5DomainNameListField.i2m.<locals>.<genexpr>.<listcomp>r3  N)Úsplit©r�  rµ   rs   rs   rt   Ú	<genexpr>ñ  r§   z*DomainNameListField.i2m.<locals>.<genexpr>r§   c                 3   s   | ]}ˆ d   |¡ƒV  qdS )r§   N)rº   rŒ  ©r6  rs   rt   r;  ò  r§   r   rQ  )rº   r2  rŸ   Úpadded_unit)r™   r¡   r´   r�  Z
ret_stringrs   r<  rt   r¶   ë  s    zDomainNameListField.i2m)NF)
r¼   r½   r¾   r¿   rÀ   r=  r˜   r£   r  r¶   rs   rs   rs   rt   r1  Ê  s   
r1  c                
   @   sZ   e Zd ZdZeddƒedddddd	„ d
�eddƒeddƒedg dd	„ dd�gZ	dd„ Z
dS )r  z9ICMPv6 Neighbor Discovery Option - DNS Search List Optionrd   r  rŸ   NÚ
searchlistró   c                 C   s   d|d  S )Nr[   rÕ   rs   r_  rs   rs   rt   r;  ÿ  r§   zICMPv6NDOptDNSSL.<lambda>r`  rr   r#  r™  c                 C   s   d| j  d S rh  rž   r:  rs   rs   rt   r;    r§   T)r–   r2  c                 C   s   |   dd | j¡ ¡S r0  )rÙ  rº   r>  rÝ   rs   rs   rt   rÞ     s    zICMPv6NDOptDNSSL.mysummary)r¼   r½   r¾   rš   r   r   r(   r!   r1  r  rÞ   rs   rs   rs   rt   r  û  s   
ÿþû
c                   @   sF   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 )r¨  z/ICMPv6 Neighbor Discovery - Router Solicitationrd   rî   rË  r   rÉ  Nrr   r‰   rã  r]   ©r€   r\   r_   )r¼   r½   r¾   rš   r   rÏ  r   r0   r!   r  rk   rd  rs   rs   rs   rt   r¨    s   
ýc                   @   s¬   e Zd ZdZeddeƒeddƒeddƒeddƒed	d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d„ Zdd„ ZdS )r©  z0ICMPv6 Neighbor Discovery - Router Advertisementrd   rï   rË  r   rÉ  NZchlimÚMr[   ÚOÚHr,  rÂ   ÚPrr   Úrouterlifetimei  ZreachabletimeZretranstimerr‰   rÞ  r]   r?  c                 C   s
   t |tƒS r—   )rw   r¨  rÌ  rs   rs   rt   r  '  s    zICMPv6ND_RA.answersc                 C   s
   |   d¡S )Nzb%name% Lifetime %routerlifetime% Hop Limit %chlim% Preference %prf% Managed %M% Other %O% Home %H%rØ  rÝ   rs   rs   rt   rÞ   *  s    zICMPv6ND_RA.mysummary)r¼   r½   r¾   rš   r   rÏ  r   r0   r   r   r-  r(   r!   r  rk   rd  r  rÞ   rs   rs   rs   rt   r©    s$   





ôc                   @   s^   e Zd ZdZeddeƒeddƒeddƒeddƒe	d	d
ƒgZ
eddddœiZdd„ Zdd„ ZdS )rl   z1ICMPv6 Neighbor Discovery - Neighbor Solicitationrd   rŽ   rË  r   rÉ  Nrr   ra   rv   r‰   rÞ  r]   r?  c                 C   s
   |   d¡S ©Nz%name% (tgt: %tgt%)rØ  rÝ   rs   rs   rt   rÞ   9  s    zICMPv6ND_NS.mysummaryc                 C   s   t | jƒ| j ¡  S r—   ©r   ra   rõ   r÷   rÝ   rs   rs   rt   r÷   <  s    zICMPv6ND_NS.hashret)r¼   r½   r¾   rš   r   rÏ  r   r0   r!   r"   r  rk   rd  rÞ   r÷   rs   rs   rs   rt   rl   0  s   
üc                
   @   s†   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d„ Zdd„ Zdd„ ZdS )rª  z2ICMPv6 Neighbor Discovery - Neighbor Advertisementrd   rð   rË  r   rÉ  Nr  r[   rä  rA  rr   é   ra   rv   r‰   rÞ  r]   r?  c                 C   s
   |   d¡S rE  rØ  rÝ   rs   rs   rt   rÞ   L  s    zICMPv6ND_NA.mysummaryc                 C   s   t | jƒ| j ¡  S r—   rF  rÝ   rs   rs   rt   r÷   O  s    zICMPv6ND_NA.hashretc                 C   s   t |tƒo| j|jkS r—   )rw   rl   ra   rÌ  rs   rs   rt   r  R  s    zICMPv6ND_NA.answers)r¼   r½   r¾   rš   r   rÏ  r   r0   r   r.   r"   r  rk   rd  rÞ   r÷   r  rs   rs   rs   rt   rª  @  s   




ùc                   @   sV   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 )r«  z$ICMPv6 Neighbor Discovery - Redirectrd   r¹  rË  r   rÉ  Nrr   ra   rv   r\   r‰   rÞ  r]   r?  )r¼   r½   r¾   rš   r   rÏ  r   r0   r/   r"   r  rk   rd  rs   rs   rs   rt   r«  X  s   
ûc                   @   sJ   e Zd ZdZeddƒedddddd	„ d
�edddƒedg dd	„ d�gZdS )r  z>ICMPv6 Inverse Neighbor Discovery Option - Source Address Listrd   rô  rŸ   NÚaddrlistró   c                 C   s   d| d S r/  rs   r_  rs   rs   rt   r;  i  r§   zICMPv6NDOptSrcAddrList.<lambda>rf  rr   r!  r‚   c                 C   s   d| j d  S r)  rž   r:  rs   rs   rt   r;  l  r§   r<  )	r¼   r½   r¾   rš   r   r   r+   r”   r  rs   rs   rs   rt   r  e  s   
ÿ
ÿüc                   @   s   e Zd ZdZdZdS )r  z>ICMPv6 Inverse Neighbor Discovery Option - Target Address Listrõ  Nr  rs   rs   rs   rt   r  o  s   c                   @   sF   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 )r¬  z.ICMPv6 Inverse Neighbor Discovery Solicitationrd   rº  rË  r   rÉ  Nrg  r‰   rÞ  r]   r?  ©r¼   r½   r¾   rš   r   rÏ  r   r0   r/   r  rk   rd  rs   rs   rs   rt   r¬  }  s   
ýc                   @   sF   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 )r­  z/ICMPv6 Inverse Neighbor Discovery Advertisementrd   r»  rË  r   rÉ  Nrg  r‰   rÞ  r]   r?  rI  rs   rs   rs   rt   r­  ‰  s   
ýZNOOPz	Node NamezIPv6 AddresszIPv4 Address©r   rÂ   rÈ   rX   c                   @   s   e Zd Zdd„ ZdS )Ú_ICMPv6NIHashretc                 C   s
   t | jƒS r—   )r   ÚnoncerÝ   rs   rs   rt   r÷   ®  s    z_ICMPv6NIHashret.hashretN)r¼   r½   r¾   r÷   rs   rs   rs   rt   rK  ­  s   rK  c                   @   s   e Zd Zdd„ ZdS )Ú_ICMPv6NIAnswersc                 C   s   | j |j kS r—   )rL  rÌ  rs   rs   rt   r  ³  s    z_ICMPv6NIAnswers.answersN)r¼   r½   r¾   r  rs   rs   rs   rt   rM  ²  s   rM  c                   @   s   e Zd Zddd„ZdS )Ú
NonceFieldNc                 C   s&   t  | ||d¡ |d u r"|  ¡ | _d S rh  )r+   r˜   Zrandvalr›   r*  rs   rs   rt   r˜   º  s    zNonceField.__init__)N)r¼   r½   r¾   r˜   rs   rs   rs   rt   rN  ¹  s   rN  c                 C   sT   |   ¡  d¡d } tt| ƒƒ|  }t| d¡ƒ}| ¡ }dt d|dd… ¡ }|S )z@Compute the NI group Address. Can take a FQDN as input parameterr3  r   r7  zff02::2:%2x%2x:%2x%2xZBBBBNrX   )	Úlowerr9  ÚchrrŸ   r   r8  Údigestrá   rç   )rš   ÚrecordÚhrn   rs   rs   rt   ÚcomputeNIGroupAddrÀ  s    rT  c                 C   s‚   t | tƒr(| r"| dd… dkr"| S | g} g }| D ]F}d}| d¡dkrN|d7 }d dd„ | d¡D ƒ¡| }| |¡ q0d |¡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°   NrQ  ó   .r   r§   c                 s   s   | ]}t t|ƒƒ| V  qd S r—   )r
   rŸ   r:  rs   rs   rt   r;  ö  r§   z names2dnsrepr.<locals>.<genexpr>)rw   rT  Úcountrº   r9  r¨   )r´   rr   ÚnZterminrs   rs   rt   Únames2dnsreprã  s    	
rX  c                 C   s®   g }d}| rªt | d ƒ}| dd… } |sx|rH|dd… dkrH|dd… }| |¡ d}| rt | d ƒdkr| dd… } q|d@ rˆtdƒ‚|| d|… d 7 }| |d… } q|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   r[   Nr°   rU  r,  z.DNS message can't be compressed at this point!)r   r¨   r±   )r´   rr   r4  r«   rs   rs   rt   Údnsrepr2namesû  s$    
rY  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚNIQueryDataFieldc                 C   s   t  | ||¡ d S r—   )r*   r˜   r*  rs   rs   rt   r˜   	  s    zNIQueryDataField.__init__c                 C   s,   |d u r|S |\}}|dkr(t |ƒd }|S r  ©rY  )r™   r¡   r´   rÒ   rX  rs   rs   rt   Úi2h	  s    zNIQueryDataField.i2hc                 C   sš   |t u rt|d tƒr|S zttj| ¡ ƒ d| ¡ fW S  tyJ   Y n0 zttj| ¡ ƒ d| ¡ fW S  ty|   Y n0 |d u rŠd}t	|ƒ}d|fS )Nr   rÂ   r§   r[   )
Útuplerw   ÚintrG   ri   rj   Údecoder±   ÚAF_INETrX  r\  rs   rs   rt   Úh2i#	  s     zNIQueryDataField.h2ic                 C   s”   |\}}|dkrŒg }|rbt |d ƒ}|dd … }|dkr:qb| t|d |… ƒd ¡ ||d … }qd |¡}|rˆ|d dkrˆ|d d… }|S t|ƒS )Nr[   r   r3  r8  r°   )r   r¨   r   rº   r.  )r™   r¡   r´   rÒ   rX  rr   r«   r�  rs   rs   rt   r»   9	  s    
zNIQueryDataField.i2reprc                 C   sŒ   t |dƒ}|dkr|dfS t |dƒ}|dkrP|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 d S )
NÚqtyper   ©r   r§   rË  r�   rÂ   rX   r§   r[   )rR  rH   ri   rj   r`  )r™   r¡   r©   rb  rË  rs   rs   rt   r¯   L	  s    

$$zNIQueryDataField.getfieldc                 C   sr   t |tƒr|d d u s|d u r"d}|d }|dkr>||d  S |dkrZ|ttj|d ƒ S |ttj|d ƒ S d S )Nr[   )r[   r§   r   )rw   r]  rG   ri   rj   r`  )r™   r¡   r©   rX  rÒ   rs   rs   rt   rY  Y	  s    ÿzNIQueryDataField.addfieldN)	r¼   r½   r¾   r˜   r\  ra  r»   r¯   rY  rs   rs   rs   rt   rZ  	  s   rZ  c                   @   s   e Zd Zdd„ ZdS )ÚNIQueryCodeFieldc                 C   sV   |d u rR|  d¡}|d u rdS |d dkr.dS |d dkr>dS |d dkrNdS dS |S )Nré   r[   r   rÂ   )Zgetfieldval)r™   r¡   r´   ro   rs   rs   rt   r¶   g	  s    
zNIQueryCodeField.i2mN)r¼   r½   r¾   r¶   rs   rs   rs   rt   rd  f	  s   rd  z
IPv6 Queryz
Name Queryz
IPv4 Query)r   r[   rÂ   c                
   @   s`   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 Queryrd   rÃ   rË  NrÉ  rb  r   rÑ  rõ  rp  r‚   ÚTACLSGrL  ré   )r¼   r½   r¾   rš   r   rÏ  rd  Ú_niquery_coder0   r'   Úicmp6_niqtypesr   r    rN  rZ  r  rs   rs   rs   rt   re  �	  s   



ùre  c                   @   s   e Zd ZdZdZdS )ÚICMPv6NIQueryNamez/ICMPv6 Node Information Query - IPv6 Name QueryrÂ   N©r¼   r½   r¾   rš   rb  rs   rs   rs   rt   ri  �	  s   ri  c                   @   s   e Zd ZdZdZdZdS )ÚICMPv6NIQueryIPv6z2ICMPv6 Node Information Query - IPv6 Address QueryrÈ   é>   N)r¼   r½   r¾   rš   rb  rp  rs   rs   rs   rt   rk  ”	  s   rk  c                   @   s   e Zd ZdZdZdS )ÚICMPv6NIQueryIPv4z2ICMPv6 Node Information Query - IPv4 Address QueryrX   Nrj  rs   rs   rs   rt   rm  š	  s   rm  zSuccessful ReplyzResponse RefusalzUnknown query type)r   r[   rÈ   zReply set incompletezAll unicast addresseszIPv4 addresseszLink-local addresseszSite-local addresseszGlobal addresses)r[   rÂ   rX   rÕ   r�   r-  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚNIReplyDataFieldc                 C   s6   |d u r|S |\}}|dkr2|\}}|gt |ƒ }|S re  r[  )r™   r¡   r´   rÒ   rX  ÚttlÚdnsnamesrs   rs   rt   r\  ¸	  s    zNIReplyDataField.i2hc                    sâ   d}t |tƒs|d ur.|j}n|d }|d }|dkr¤t |ttfƒrJ|g}t |tƒrbdd„ |D ƒ}|rŒt |d tjƒrŒ|d }|dd … }nd}|}d|t|ƒgfS |dv rÚt |tƒs¼|g}dd„ ‰ |‡ fd	d„|D ƒfS ||fS )
Nr   r[   rÂ   c                 S   s"   g | ]}t |tƒr| ¡ n|‘qS rs   )rw   rx   r8  )r�  rX  rs   rs   rt   rŽ  Ó	  r§   z(NIReplyDataField.h2i.<locals>.<listcomp>)rÈ   rX   c                 S   s>   t | tƒsd| f} tjr:t | d tƒr:| d | d  ¡ f} | S rÊ  )rw   r]  ÚsixÚPY3rT  r_  ©r´   rs   rs   rt   Úfixvalueà	  s
    
z&NIReplyDataField.h2i.<locals>.fixvaluec                    s   g | ]}ˆ |ƒ‘qS rs   rs   )r�  ro   ©rt  rs   rt   rŽ  ê	  r§   )	rw   r]  rb  rx   rT  r¥   rq  Úinteger_typesrX  )r™   r¡   r´   rb  ro  Únamesrs   ru  rt   ra  Á	  s.    



zNIReplyDataField.h2ic                 C   s„   |\}}|d u rd}|dkr8|\}}|t  d|¡ | S |dkrX|d tdd„ |ƒ¡ S |dkrx|d tdd„ |ƒ¡ S || S d S )	Nr§   rÂ   ú!IrÈ   c                 S   s    t  d| d ¡ttj| d ƒ S ©Nrx  r   r[   )rá   râ   rG   ri   rj   )Zx_y1rs   rs   rt   r;  ö	  r§   z+NIReplyDataField.addfield.<locals>.<lambda>rX   c                 S   s    t  d| d ¡ttj| d ƒ S ry  )rá   râ   rG   ri   r`  )Zx_y2rs   rs   rt   r;  ø	  r§   )rá   râ   rº   rS  )r™   r¡   r©   rX  rÒ   r�  ro  Zdnsstrrs   rs   rt   rY  î	  s    zNIReplyDataField.addfieldc                 C   sn  t |dƒ}|dkr|dfS t |dƒ}|dkr4|dfS |dkr€t|ƒdk rP|dfS t d|d d… ¡d }dd||dd … gffS |d	krìg }t|ƒd
kràt d|d d… ¡d }ttj|dd
… ƒ}| ||f¡ |d
d … }qŒ|d	|ffS |dk�r^g }t|ƒdk�rRt d|d d… ¡d }ttj|dd… ƒ}| ||f¡ |dd … }� qú|d|ffS dd|ffS d S )NrË  r   rc  rb  rÂ   rX   rx  r§   rÈ   r×   rÕ   )	rR  rŸ   rá   rç   rH   ri   rj   r¨   r`  )r™   r¡   r©   rË  rb  ro  rr   Úiprs   rs   rt   r¯   ü	  s8    


zNIReplyDataField.getfieldc                 C   sš   |d u rdS t |tƒr’t|ƒdkr’|\}}|dkrb|\}}t|ƒ}dd„ |D ƒ}d|d |¡f S |dksr|dkrŠd	d
 tdd„ |ƒ¡ S t|ƒS t|ƒS )Nr·   rÂ   c                 s   s   | ]}t |ƒV  qd S r—   )r   )r�  rš   rs   rs   rt   r;  +
  r§   z*NIReplyDataField.i2repr.<locals>.<genexpr>z	ttl:%d %sú,rÈ   rX   r¸   r¹   c                 S   s   d| d | d f S )Nz(%d, %s)r   r[   rs   )Zx_yrs   rs   rt   r;  .
  r§   z)NIReplyDataField.i2repr.<locals>.<lambda>)rw   r]  rŸ   rY  rº   rS  r.  )r™   r¡   r´   rÒ   rX  ro  r«   Z
names_listrs   rs   rt   r»   "
  s    zNIReplyDataField.i2reprN)r¼   r½   r¾   r\  ra  rY  r¯   r»   rs   rs   rs   rt   rn  ¶	  s
   	-&rn  c                
   @   s`   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 Replyrd   rÄ   rË  r   rÉ  Nrb  rÑ  rõ  rp  r‚   rf  rL  ré   )r¼   r½   r¾   rš   r   rÏ  Ú_nireply_coder0   r'   rh  r   r    rN  rn  r  rs   rs   rs   rt   r|  5
  s   



ùr|  c                   @   s   e Zd ZdZdZdS )ÚICMPv6NIReplyNamez*ICMPv6 Node Information Reply - Node NamesrÂ   Nrj  rs   rs   rs   rt   r~  A
  s   r~  c                   @   s   e Zd ZdZdZdS )ÚICMPv6NIReplyIPv6z.ICMPv6 Node Information Reply - IPv6 addressesrÈ   Nrj  rs   rs   rs   rt   r  F
  s   r  c                   @   s   e Zd ZdZdZdS )ÚICMPv6NIReplyIPv4z.ICMPv6 Node Information Reply - IPv4 addressesrX   Nrj  rs   rs   rs   rt   r€  K
  s   r€  c                   @   s   e Zd ZdZdZdS )ÚICMPv6NIReplyRefusezBICMPv6 Node Information Reply - Responder refuses to supply answerr[   N©r¼   r½   r¾   rš   rË  rs   rs   rs   rt   r�  P
  s   r�  c                   @   s   e Zd ZdZdZdS )ÚICMPv6NIReplyUnknownz>ICMPv6 Node Information Reply - Qtype unknown to the responderrÂ   Nr‚  rs   rs   rs   rt   rƒ  U
  s   rƒ  c                 C   sÈ   t j}t| d ƒ}|dkrVt| ƒdkrÄt d| dd… ¡\}tttt	dœ 
|t j¡}nn|dkrÄt| d ƒ}|dkrªt| ƒdkrÄt d| dd… ¡\}tttd	œ 
|t¡}n|dkr¸t}n|d
krÄt}|S )Nr   rÃ   r‚   rà   rX   rJ  rÄ   r[   )rÂ   rÈ   rX   rÂ   )r   r”  r   rŸ   rá   rç   re  ri  rk  rm  r|   r~  r  r€  r|  r�  rƒ  )rq   r
  rd   rb  rË  rs   rs   rt   rÉ   Z
  s8    ýýþþrÉ   ZDISZDIOZDAOzDAO-ACKZDCOzDCO-ACK)r   r[   rÂ   rÈ   r^  rÕ   c                   @   s>   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¶  ZRPLrd   rÂ  rË  r   rÉ  Nr‰   zff02::1a)r€   r\   )r¼   r½   r¾   rš   r   rÏ  Úrplcodesr0   r  rk   rd  rs   rs   rs   rt   r¶  …
  s   

þc                
   @   sX   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d„ ZdS )r¯  z+ICMPv6 Home Agent Address Discovery Requestrd   rñ   rË  r   rÉ  Nr†  r  r[   ÚMRrr   r}  c                 C   s   t  d| j¡| j ¡  S ©Nrà   ©rá   râ   r†  rõ   r÷   rÝ   rs   rs   rt   r÷   ž
  s    zICMPv6HAADRequest.hashret)r¼   r½   r¾   rš   r   rÏ  r   r0   r   r.   r  r÷   rs   rs   rs   rt   r¯  •
  s   

ûc                
   @   sh   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d„ Zdd„ ZdS )r°  z)ICMPv6 Home Agent Address Discovery Replyrd   rò   rË  r   rÉ  Nr†  r  r[   r…  rr   r}  rù   c                 C   s   t  d| j¡| j ¡  S r†  r‡  rÝ   rs   rs   rt   r÷   ¬
  s    zICMPv6HAADReply.hashretc                 C   s   t |tƒsdS | j|jkS r¤   )rw   r¯  r†  rÌ  rs   rs   rt   r  ¯
  s    
zICMPv6HAADReply.answers)r¼   r½   r¾   rš   r   rÏ  r   r0   r   r.   r”   r  r÷   r  rs   rs   rs   rt   r°  ¢
  s   

úc                   @   sF   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
d„ Z	dS )r±  z!ICMPv6 Mobile Prefix Solicitationrd   r½  rË  r   rÉ  Nr†  rr   c                 C   s   t  d| j¡S r†  ©rá   râ   r†  rÝ   rs   rs   rt   Ú_hashret½
  s    zICMPv6MPSol._hashret)
r¼   r½   r¾   rš   r   rÏ  r   r0   r  r‰  rs   rs   rs   rt   r±  µ
  s   
üc                   @   sb   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d„ Zdd„ ZdS )r²  z"ICMPv6 Mobile Prefix Advertisementrd   r¾  rË  r   rÉ  Nr†  rp  rÂ   r@  rA  )rÂ   r[   rr   rø  c                 C   s   t  d| j¡S r†  rˆ  rÝ   rs   rs   rt   r÷   Ê
  s    zICMPv6MPAdv.hashretc                 C   s
   t |tƒS r—   )rw   r±  rÌ  rs   rs   rt   r  Í
  s    zICMPv6MPAdv.answers)r¼   r½   r¾   rš   r   rÏ  r   r0   r   r.   r  r÷   r  rs   rs   rs   rt   r²  Á
  s   

û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È   rX   r)  r‚   r^  rÕ   rô  rõ  rö  r÷  rƒ  rø  r}  r�   c                   @   s(   e Zd ZdZddgZdd„ Zd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                 C   sD   | j }| j}|dkr |dkr dS ||| | d |  | | }|S rÊ  )r´   rµ   rK  rs   rs   rt   r?  í
  s     z_MIP6OptAlign.alignment_deltac                 C   s   d|fS rB  rs   rC  rs   rs   rt   rì   õ
  s    z_MIP6OptAlign.extract_paddingN)r¼   r½   r¾   r  r¿   r?  rì   rs   rs   rs   rt   rŠ  ä
  s   rŠ  c                   @   s6   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 Advicer2  rÂ   ÚolenZrinterr   N©r¼   r½   r¾   rš   r   Ú_mobopttypesr   r(   r  r´   rµ   rs   rs   rs   rt   r‹  ù
  s   
þr‹  c                   @   s6   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 Addressr2  rÈ   rŒ  r�   Zacoarv   rÕ   r‚   N©r¼   r½   r¾   rš   r   rŽ  r   r"   r  r´   rµ   rs   rs   rs   rt   r�    s   
þr�  c                   @   s>   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 Indicesr2  rX   rŒ  r�   Zhnir   ZconirÂ   Nr�  rs   rs   rs   rt   r‘    s   
ýr‘  c                   @   s8   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 Datar2  r)  rŒ  r�   Zauthenticatorr   é`   rÕ   rÂ   N)r¼   r½   r¾   rš   r   rŽ  r   r   r  r´   rµ   rs   rs   rs   rt   r’    s   

þr’  c                   @   sF   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 Prefixr2  r‚   rŒ  ro  rg  r   rØ   rÙ   r  rv   rÕ   rX   Nr�  rs   rs   rs   rt   r”    s   
ür”  c                   @   sH   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)r2  r^  rŒ  ZocoderÂ   Úpadr   r%  N)r¼   r½   r¾   rš   r   rŽ  r   r&  r$   r   r  r´   rµ   rs   rs   rs   rt   r•  )  s   

ür•  c                   @   sX   e Zd ZdZeddeƒedddddd	„ d
�eddddiƒedddd	„ d�gZdZ	dZ
dS )ÚMIP6OptMNIDz%MIPv6 Option - Mobile Node Identifierr2  rÕ   rŒ  Nr†  ró   c                 C   s   |d S r[  rs   r_  rs   rs   rt   r;  8  r§   zMIP6OptMNID.<lambda>r`  Úsubtyper[   ZNAIr8  c                 C   s
   | j d S r[  ©rŒ  r:  rs   rs   rt   r;  ;  r§   r<  r   ©r¼   r½   r¾   rš   r   rŽ  r   r,   r  r´   rµ   rs   rs   rs   rt   r—  4  s   

ÿÿür—  c                	   @   sb   e Zd ZdZeddeƒedddddd	„ d
�edddddœƒeddƒedddd	„ d�gZ	dZ
dZdS )ÚMIP6OptMsgAuthz.MIPv6 Option - Mobility Message Authenticationr2  rô  rŒ  NZauthdataró   c                 C   s   |d S ©Nr)  rs   r_  rs   rs   rt   r;  H  r§   zMIP6OptMsgAuth.<lambda>r`  r˜  r[   z$MN-HA authentication mobility optionz%MN-AAA authentication mobility option©r[   rÂ   ZmspiZAAAAAAAAAAAAc                 C   s
   | j d S rœ  r™  r:  rs   rs   rt   r;  M  r§   r<  rX   )r¼   r½   r¾   rš   r   rŽ  r   r!   r,   r  r´   rµ   rs   rs   rs   rt   r›  D  s   

ÿÿÿúr›  c                   @   s   e Zd Zdd„ ZdS )ÚNTPTimestampFieldc                 C   sV   |dk rd| S d}t |d? ƒ}t|d@ ƒd }|| | }tdt|ƒƒ}d||f S )	Nl        <ào z Some date a few decades ago (%d)lýÿÿÿ1RW r-  r™  g      ð=z%a, %d %b %Y %H:%M:%S +0000z%s (%d))r^  rË   r   r   )r™   r¡   r´   rL  r¢   Újrr   rÒ   rs   rs   rt   r»   X  s    zNTPTimestampField.i2reprN©r¼   r½   r¾   r»   rs   rs   rs   rt   rž  W  s   rž  c                   @   s6   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 Protectionr2  rõ  rŒ  rÕ   Ú	timestampr   rÂ   N)r¼   r½   r¾   rš   r   rŽ  r   rž  r  r´   rµ   rs   rs   rs   rt   r¡  g  s   
þr¡  c                   @   s.   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 Requestr2  rö  rŒ  r   N©
r¼   r½   r¾   rš   r   rŽ  r   r  r´   rµ   rs   rs   rs   rt   r£  p  s   
ÿr£  c                   @   sD   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdZ	dZ
dS )ÚMIP6OptCGAParamszMIPv6 option - CGA Parametersr2  r÷  rŒ  NZ	cgaparamsró   r5  r8  c                 C   s   | j S r—   r™  r:  rs   rs   rt   r;  �  r§   zMIP6OptCGAParams.<lambda>r<  r   rš  rs   rs   rs   rt   r¥  |  s   
ÿþr¥  c                   @   sD   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdZ	dZ
dS )ÚMIP6OptSignaturezMIPv6 option - Signaturer2  rƒ  rŒ  NÚsigró   r5  r8  c                 C   s   | j S r—   r™  r:  rs   rs   rt   r;  ‹  r§   zMIP6OptSignature.<lambda>r<  r   rš  rs   rs   rs   rt   r¦  †  s   
ÿþr¦  c                   @   sD   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdZ	dZ
dS )ÚMIP6OptHomeKeygenTokenz MIPv6 option - Home Keygen Tokenr2  rø  rŒ  NZhktró   r5  r8  c                 C   s   | j S r—   r™  r:  rs   rs   rt   r;  •  r§   zMIP6OptHomeKeygenToken.<lambda>r<  r   rš  rs   rs   rs   rt   r¨  �  s   
ÿþr¨  c                   @   s.   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 Initr2  r}  rŒ  r   Nr¤  rs   rs   rs   rt   r©  š  s   
ÿr©  c                   @   sD   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdZ	dZ
dS )ÚMIP6OptCareOfTestzMIPv6 option - Care-of Testr2  r�   rŒ  NZcoktró   r5  r+  c                 C   s   | j S r—   r™  r:  rs   rs   rt   r;  §  r§   zMIP6OptCareOfTest.<lambda>r<  r   rš  rs   rs   rs   rt   rª  ¢  s   
ÿþrª  c                   @   sR   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdZ	dZ
eddd„ƒZdS )ÚMIP6OptUnknownz Scapy6 - Unknown Mobility Optionr2  r‚   rŒ  NÚodataró   r5  r8  c                 C   s   | j S r—   r™  r:  rs   rs   rt   r;  ±  r§   zMIP6OptUnknown.<lambda>r<  r   c                 O   s$   |r t |d ƒ}|tv r t| S | S r¤   )r   Ú	moboptcls)r
  r  r  r  r  rs   rs   rt   r  µ  s
    zMIP6OptUnknown.dispatch_hook)N)r¼   r½   r¾   rš   r   rŽ  r   r,   r  r´   rµ   r  r  rs   rs   rs   rt   r«  ¬  s   
ÿþr«  )r   r[   rÂ   rÈ   rX   r)  r‚   r^  rÕ   rô  rõ  rö  r÷  rƒ  rø  r}  r�   ZBRRZHoTIZCoTIZHoTZCoTZBUZBAZBEzFast BUzFast BAzFast NA)r   r[   rÂ   rÈ   rX   r)  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�   rî   rï   rŽ   rð   r¹  rÅ  rÃ   rÄ   rº  r»  r¼  rñ   rò   r½  r¾  rÆ  rÇ  é–   c                   @   s$   e Zd ZdZeddiiZdd„ ZdS )Ú_MobilityHeaderzDummy IPv6 Mobility Headerr€   rŽ   c                 C   s”   ||7 }| j }| j d u r(t |ƒd d }|d d… t d|¡ |dd …  }| jd u rftd| j|ƒ}n| j}|d d… t d|¡ |dd …  }|S )	NrÕ   r[   ró   rÂ   rŽ   rX   rà   r‚   )rŸ   rá   râ   rÉ  r#  r  )r™   rq   rã   r«   rÉ  rs   rs   rt   rä   ÿ  s    
$
$z_MobilityHeader.post_buildN)r¼   r½   r¾   rš   rk   rd  rä   rs   rs   rs   rt   r¯  û  s   r¯  c                
   @   sP   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d„ d�gZ
dS )rÏ   z&IPv6 Mobility Header - Generic Messager€   rŠ   rŸ   NÚmhtyperr   rÉ  Úmsgó     c                 C   s   d| j  d S )NrÕ   r‚   rž   r:  rs   rs   rt   r;    r§   zMIP6MH_Generic.<lambda>r<  )r¼   r½   r¾   rš   r   r  r   Úmhtypesr0   r,   r  rs   rs   rs   rt   rÏ     s   

ÿûrÏ   c                   @   sx   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d„ d�gZeddiiZdd„ ZdS )Ú
MIP6MH_BRRz.IPv6 Mobility Header - Binding Refresh Requestr€   rŠ   rŸ   Nr°  r   rr   rÉ  r„  rP  r[   rû   rÕ   c                 C   s
   d| j  S rh  rž   r:  rs   rs   rt   r;  "  r§   zMIP6MH_BRR.<lambda>r<  rŽ   c                 C   s   dS ©Ns    	rs   rÝ   rs   rs   rt   r÷   %  s    zMIP6MH_BRR.hashret)r¼   r½   r¾   rš   r   r  r   r³  r0   r(   rZ  rN  r«  r  rk   rd  r÷   rs   rs   rs   rt   r´    s   


ÿù	r´  c                   @   s„   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d„ d�g	ZeddiiZdd„ ZdS )ÚMIP6MH_HoTIz%IPv6 Mobility Header - Home Test Initr€   rŠ   rŸ   Nr°  r[   rr   rÉ  rg  r²  rÂ   Úcookier+  rÕ   rP  rû   r�   c                 C   s   d| j d  S r)  rž   r:  rs   rs   rt   r;  7  r§   zMIP6MH_HoTI.<lambda>r<  rŽ   c                 C   s
   t | jƒS r—   ©r   r·  rÝ   rs   rs   rt   r÷   :  s    zMIP6MH_HoTI.hashret)r¼   r½   r¾   rš   r   r  r   r³  r0   r+   rZ  rN  r«  r  rk   rd  r÷   rs   rs   rs   rt   r¶  ,  s   




ÿø
r¶  c                   @   s   e Zd ZdZdZdd„ ZdS )ÚMIP6MH_CoTIz(IPv6 Mobility Header - Care-of Test InitrÂ   c                 C   s
   t | jƒS r—   r¸  rÝ   rs   rs   rt   r÷   B  s    zMIP6MH_CoTI.hashretN)r¼   r½   r¾   rš   r°  r÷   rs   rs   rs   rt   r¹  >  s   r¹  c                   @   s”   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d„ d�g
ZeddiiZdd„ Zdd„ ZdS )Ú
MIP6MH_HoTz IPv6 Mobility Header - Home Testr€   rŠ   rŸ   Nr°  rÈ   rr   rÉ  Úindexr·  r+  rÕ   ÚtokenrP  r[   rû   r  c                 C   s   d| j d  S ©NrÕ   rÂ   rž   r:  rs   rs   rt   r;  R  r§   zMIP6MH_HoT.<lambda>r<  rŽ   c                 C   s
   t | jƒS r—   r¸  rÝ   rs   rs   rt   r÷   U  s    zMIP6MH_HoT.hashretc                 C   s   t |tƒr| j|jkrdS dS r  )rw   r¶  r·  rÌ  rs   rs   rt   r  X  s
    

ÿzMIP6MH_HoT.answers)r¼   r½   r¾   rš   r   r  r   r³  r0   r(   r+   rZ  rN  r«  r  rk   rd  r÷   r  rs   rs   rs   rt   rº  F  s"   




ÿ÷rº  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )Ú
MIP6MH_CoTz#IPv6 Mobility Header - Care-of TestrX   c                 C   s
   t | jƒS r—   r¸  rÝ   rs   rs   rt   r÷   c  s    zMIP6MH_CoT.hashretc                 C   s   t |tƒr| j|jkrdS dS r  )rw   r¹  r·  rÌ  rs   rs   rt   r  f  s
    

ÿzMIP6MH_CoT.answersN)r¼   r½   r¾   rš   r°  r÷   r  rs   rs   rs   rt   r¾  _  s   r¾  c                   @   s   e Zd Zdd„ ZdS )ÚLifetimeFieldc                 C   s   dd|  S )Nz%d secrX   rs   r\  rs   rs   rt   r»   n  s    zLifetimeField.i2reprNr   rs   rs   rs   rt   r¿  m  s   r¿  c                   @   sž   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d„ d�gZeddiiZdd„ Zdd„ ZdS ) Ú	MIP6MH_BUz%IPv6 Mobility Header - Binding Updater€   rŠ   rŸ   Nr°  r)  rr   rÉ  r×  rp  ZKHAr^  ZPRMKLHArg  r   rô  ÚmhtimerÈ   rP  r[   rû   r÷  c                 C   s   d| j  d S ©NrÕ   rX   rž   r:  rs   rs   rt   r;    r§   zMIP6MH_BU.<lambda>r<  rŽ   c                 C   s   dS rµ  rs   rÝ   rs   rs   rt   r÷   ‚  s    zMIP6MH_BU.hashretc                 C   s   t |tƒrdS dS r  )rw   r´  rÌ  rs   rs   rt   r  …  s    
zMIP6MH_BU.answers)r¼   r½   r¾   rš   r   r  r   r³  r0   r    r.   r¿  rZ  rN  r«  r  rk   rd  r÷   r  rs   rs   rs   rt   rÀ  r  s$   



ÿörÀ  c                   @   s¨   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d„ d�gZeddiiZdd„ Zdd„ ZdS ) Ú	MIP6MH_BAz"IPv6 Mobility Header - Binding ACKr€   rŠ   rŸ   Nr°  r‚   rr   rÉ  Ústatusr   rp  ÚKrÈ   ZPRKr„  r)  r×  rÁ  rP  r[   rû   r÷  c                 C   s   d| j  d S rÂ  rž   r:  rs   rs   rt   r;  ™  r§   zMIP6MH_BA.<lambda>r<  rŽ   c                 C   s   dS rµ  rs   rÝ   rs   rs   rt   r÷   œ  s    zMIP6MH_BA.hashretc                 C   s<   t |tƒr8|jdkr8| jdkr8|jd@ r8| j|jkr8dS dS )Nr)  r‚   r[   r   )rw   rÀ  r°  rp  r×  rÌ  rs   rs   rt   r  Ÿ  s    
ÿþý
üzMIP6MH_BA.answers)r¼   r½   r¾   rš   r   r  r   r³  r0   Úbastatusr    r.   rZ  rN  r«  r  rk   rd  r÷   r  rs   rs   rs   rt   rÃ  ‹  s&   




ÿõrÃ  z3Unknown binding for Home Address destination optionzUnrecognized MH Type valuer�  c                   @   sz   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d„ d�g	ZeddiiZdS )Ú	MIP6MH_BEz$IPv6 Mobility Header - Binding Errorr€   rŠ   rŸ   Nr°  r^  rr   r   rÉ  rÄ  rg  Zharv   rû   r  c                 C   s   d| j d  S r½  rž   r:  rs   rs   rt   r;  º  r§   zMIP6MH_BE.<lambda>r<  rŽ   )r¼   r½   r¾   rš   r   r  r   r³  r0   Ú	_bestatusr"   rN  r«  r  rk   rd  rs   rs   rs   rt   rÇ  ¯  s   



ÿø
rÇ  c                   @   s   e Zd Zdd„ ZdS )ÚAS_resolver6c                 C   s’   t |ƒr*ttj|ƒ}ttj|dd… ƒ}nt|ƒr@t|ƒd }n|}t 	| |¡\}}}| 
d¡rˆzt|dd… ƒ}W n ty†   Y n0 |||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‚   ZASN)rK   rG   ri   rj   rH   r`  rN   rR   r   Ú_resolve_oneÚ
startswithr^  Ú
ValueError)r™   rz  r�  rn   r  ZasnÚdescrs   rs   rt   rÊ  Ï  s    
zAS_resolver6._resolve_oneN)r¼   r½   r¾   rÊ  rs   rs   rs   rt   rÉ  Î  s   rÉ  c                   @   s.   e Zd Zg Zdd„ Zdd„ Zeƒ fdd„ZdS )ÚTracerouteResult6c                 C   s   |   dd„ ¡S )Nc                 S   s   |   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Ù  r_   )r©   r   rs   rs   rt   r;  í  s   þz(TracerouteResult6.show.<locals>.<lambda>)Z
make_tablerÝ   rs   rs   rt   Úshowì  s    zTracerouteResult6.showc           	   	   C   sÚ   i }| j D ]j\}}t|vrq
|t j}||vr6i ||< t|v pTt|v pTt|v pTt|v  }|t j|f|| |t j< q
t	 
|¡D ]T}ztdd„ t	 |¡D ƒƒ}W n ty¶   Y q€Y n0 t|ƒD ]}||krÀ||= qÀq€|S )Nc                 s   s   | ]\}}|d  r|V  qdS )r[   Nrs   )r�  r´   rµ   rs   rs   rt   r;    r§   z.TracerouteResult6.get_trace.<locals>.<genexpr>)rr   rk   r\   r¡  rŸ  r   r¢  r^   r_   rq  Ú
itervaluesr  Ú	iteritemsrÌ  r¥   )	r™   Útracer©   r   ro   rÒ   Úkr…  Zlirs   rs   rt   Ú	get_traceô  s0    
ÿþý

zTracerouteResult6.get_tracec                 K   s   t j| fd|i|¤Ž d S )NÚASres)r5   Úgraph)r™   rÕ  r  rs   rs   rt   rÖ    s    zTracerouteResult6.graphN)r¼   r½   r¾   r¿   rÏ  rÔ  rÉ  rÖ  rs   rs   rs   rt   rÎ  é  s   rÎ  éP   é   rÂ   c                 K   s˜   |du rt j}|du rPtt| ||fd�ttƒ ||d� f|d|dœ|¤Ž\}	}
n*tt| ||fd�| f||dœ|¤Ž\}	}
t|	jƒ}	|r�|	 ¡  |	|
fS )zkInstant TCP traceroute using IPv6
    traceroute6(target, [maxttl=30], [dport=80], [sport=80]) -> None
    N)r\   r_   )r×  ÚsportÚdportzicmp6 or tcp)rf   Úfilterrg   )rf   rg   )	r   ÚverbrB   rk   r3   rS   rÎ  rr   rÏ  )ÚtargetrÚ  ZminttlZmaxttlrÙ  Úl4rf   rg   r  r   Úbrs   rs   rt   Útraceroute6  s"    "ÿÿÿÿ

rà  )ÚL3RawSocketc                   @   s    e Zd Zeddddfdd„ZdS )ÚL3RawSocket6Nr   c                 C   s:   t   t jt jt j¡| _t   t jt jt  |¡¡| _|| _d S r—   )	ri   rj   ÚSOCK_RAWÚIPPROTO_RAWZoutsÚ	AF_PACKETÚhtonsZinsre   )r™   rd   rÛ  re   ZpromiscZnofilterrs   rs   rt   r˜   6  s    zL3RawSocket6.__init__)r¼   r½   r¾   r   r˜   rs   rs   rs   rt   râ  5  s   râ  ú203.178.135.36c                 C   s(   | t _|t _tjt ks tjt _nt`t S r—   )Ú	_IPv6inIPr\   r^   r   ZL3socketr
  )r\   r^   rs   rs   rt   ÚIPv6inIP=  s    

ré  c                   @   sZ   e Zd ZdZdZdZejejdfdd„Z	ddd„Z
dd	„ Zd
d„ Zefdd„Zdd„ ZdS )rè  z	127.0.0.1Nr   c                 K   s&   t  | |||¡ | jf i |¤Ž| _d S r—   )rD   r˜   r
  Úworker)r™   Úfamilyrd   r  rA  rs   rs   rt   r˜   L  s    z_IPv6inIP.__init__c                 C   s   |t _|t _d S r—   )rè  r^   r\   )r™   r\   r^   rs   rs   rt   ÚsetP  s    z_IPv6inIP.setc                 C   s   | j  ¡ }|  |¡S r—   )rê  Únonblock_recvÚ_recvrC  rs   rs   rt   rí  T  s    
z_IPv6inIP.nonblock_recvc                 C   s   | j  |¡}|  ||¡S r—   )rê  Úrecvrî  )r™   r´   rq   rs   rs   rt   rï  X  s    z_IPv6inIP.recvc                 C   sD   |d u r|S t |tƒr@|j| jkr@|jtjkr@t |jtƒr@|jS |S r—   )	rw   r1   r^   r\   r  ri   rU   rõ   rk   )r™   rq   r´   rs   rs   rt   rî  \  s    
z_IPv6inIP._recvc                 C   s    | j  t| j| jtjd�| ¡S )N)r\   r^   r  )rê  Úsendr1   r\   r^   ri   rU   )r™   r´   rs   rs   rt   rð  f  s    z_IPv6inIP.send)N)r¼   r½   r¾   r\   r^   r
  ri   rj   ÚSOCK_STREAMr˜   rì  rí  rï  r   rî  rð  rs   rs   rs   rt   rè  G  s   

rè  c                    sT   dd„ ‰ˆ st j‰ ˆstˆ ƒ‰dˆ }td|‡‡‡fdd„‡ ‡‡fdd„ˆ 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                 S   s”   t | v rt| v rt| v sdS | t  j}|r6||kr6dS | t jdkrHdS ttj| t jƒ}|rj||krjdS ttj| t jƒ}t	|ƒ}||kr�dS dS )ú2
        Check if packet req is a request
        r   rv   r[   )
r9   rk   rl   r^   rG   ri   rj   ra   r\   rI   )ÚreqÚmac_src_filterÚ
tgt_filterÚmac_srcra   Úreceived_snmaÚexpected_snmars   rs   rt   Ú
is_requestw  s    
z'_NDP_Attack_DAD_DoS.<locals>.is_requestúicmp6 and not ether src %sr   c                    s   ˆ | ˆˆƒS r—   rs   rs  ©rù  rô  rõ  rs   rt   r;  Ÿ  r§   z%_NDP_Attack_DAD_DoS.<locals>.<lambda>c                    s   ˆ| ˆˆ ƒS r—   rs   rs  )re   Úreply_callbackÚ	reply_macrs   rt   r;     r§   ©ÚstorerÛ  ZlfilterZprnre   N©r   re   r   rA   )rü  re   rô  rõ  rý  Úsniff_filterrs   )re   rù  rô  rü  rý  rõ  rt   Ú_NDP_Attack_DAD_DoSp  s    ür  c                 C   s   d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                 S   s`   | t  j}| t j}| t j}t |d�td|d� t|d� }t||dd� td||f ƒ dS )	zE
        Callback that reply to a NS by sending a similar NS
        ©r^   rv   r˜  r`   r   ©re   rg   z1Reply NS for target address %s (received from %s)N)r9   r^   rk   r\   rl   ra   r@   Úprint©ró  rý  re   r~   r\   ra   Úreprs   rs   rt   Úns_reply_callbackÊ  s    


 z4NDP_Attack_DAD_DoS_via_NS.<locals>.ns_reply_callbackN©r  )re   rô  rõ  rý  r  rs   rs   rt   ÚNDP_Attack_DAD_DoS_via_NS¤  s    &ÿr
  c                 C   s   d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                 S   sx   | t  j}| t j}| t j}t |d�t||d� }|t|dddd� }|t|d� }t||dd� t	d||f ƒ d	S )
z7
        Callback that reply to a NS with a NA
        r  r˜  r   r[   ©ra   rä  r  rA  rb   r  ú1Reply NA for target address %s (received from %s)N)
r9   r^   rk   r\   rl   ra   rª  r}   r@   r  r  rs   rs   rt   Úna_reply_callback  s    


z4NDP_Attack_DAD_DoS_via_NA.<locals>.na_reply_callbackNr	  )re   rô  rõ  rý  r  rs   rs   rt   ÚNDP_Attack_DAD_DoS_via_NAÜ  s    )ÿr  Fc                    sj   dd„ ‰dd„ ‰ˆ st j‰ ˆs&tˆ ƒ‰dˆ }ˆr6dnd‰td|‡‡‡fdd	„‡ ‡‡‡fd
d	„ˆ 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                 S   s¨   t | v rt| v rt| v sdS | t  j}|r6||kr6dS | t jdkrHdS ttj| t jƒ}|rj||krjdS | t j}t	|ƒr¤ttj|ƒ}t
|ƒ}||kr¤tdƒ dS dS )rò  r   rv   z3solicited node multicast @ does not match target @!r[   )r9   rk   rl   r^   rG   ri   rj   ra   r\   rO   rI   r  )ró  rô  rõ  rö  ra   r\   r÷  rø  rs   rs   rt   rù  U  s$    

z*NDP_Attack_NA_Spoofing.<locals>.is_requestc           	      S   s~   | t  j}| t }|j}| t j}t ||d�t||d� }|t|d|dd� }|t|d� }t||dd� td||f ƒ dS )	z?
        Callback that reply to a NS with a spoofed NA
        r˜  r[   r  rb   r   r  r  N)	r9   r^   rk   rl   ra   rª  r}   r@   r  )	ró  rý  Úrouterre   r~   r¡   r^   ra   r  rs   rs   rt   rü  {  s    

z.NDP_Attack_NA_Spoofing.<locals>.reply_callbackrú  r[   r   c                    s   ˆ | ˆˆƒS r—   rs   rs  rû  rs   rt   r;  ž  r§   z(NDP_Attack_NA_Spoofing.<locals>.<lambda>c                    s   ˆ| ˆˆˆ ƒS r—   rs   rs  )re   rü  rý  r  rs   rt   r;  Ÿ  r§   rþ  Nr   )re   rô  rõ  rý  r  r  rs   )re   rù  rô  rü  rý  r  rõ  rt   ÚNDP_Attack_NA_Spoofing  s    <&ür  ú2001:db8::1Tc	                 C   sÂ   |s
t j}| st|ƒ} i }	|r&||	d< |r2||	d< i }
|rB||
d< |rP||
d< n ttjtttj|ƒƒƒ}||
d< tf i |	¤Ž}|t	f i |
¤Ž }|t
|d� }|t| d� }t||||d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.
    r^   r\   r`   rb   r   )ÚinterÚloopre   rg   N)r   re   r   rH   ri   rj   rI   rG   r9   rk   rl   rm   r@   )Z
src_lladdrr^   rÝ  r\   Zsrc_macZdst_macr  r  re   Úether_paramsZipv6_paramsr�  r¡   rs   rs   rt   ÚNDP_Attack_NS_Spoofing£  s.    G
ÿr  c                    s^   dd„ ‰dd„ ‰ˆ st j‰ ˆs&tˆ ƒ‰dˆ }td|‡‡‡fdd„‡ ‡‡‡fd	d„ˆ 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                 S   sf   t | v rt| v rt| v sdS | t  j}|r6||kr6dS | t j}|rP||krPdS | t jdkrbdS dS ©rò  r   r[   )r9   rk   r©  r^   rD  ©ró  rô  Úip_src_filterrö  Zip_srcrs   rs   rt   rù  ;  s    

z2NDP_Attack_Kill_Default_Router.<locals>.is_requestc           
      S   sÂ   | t  j}i }|r||d< |r&||d< tf i |¤Žt |dd� }|tddd� }| }t|v rx|t }|j}|`|| }qTt| v rŒ| t j}	n
| t j}	|t|	d� }t||dd	� t	d
| ƒ dS )z=
        Callback that sends an RA with a 0 lifetime
        r^   r\   rÞ  r˜  r[   r   )r,  rD  rb   r  z#Fake RA sent with source address %sN)
rk   r^   r9   r©  rþ  rõ   rm   rc   r@   r  )
ró  rý  Útgt_macre   r^   r  r  r�  Zpior~   rs   rs   rt   Úra_reply_callbackR  s(    


z9NDP_Attack_Kill_Default_Router.<locals>.ra_reply_callbackrú  r   c                    s   ˆ| ˆˆ ƒS r—   rs   rs  ©r  rù  rô  rs   rt   r;  ƒ  r§   z0NDP_Attack_Kill_Default_Router.<locals>.<lambda>c                    s   ˆ| ˆˆˆ ƒS r—   rs   rs  )re   r  rý  r  rs   rt   r;  „  r§   rþ  Nr   )re   rô  r  rý  r  r  rs   )re   r  rù  rô  r  rý  r  rt   ÚNDP_Attack_Kill_Default_Router  s    -(ür  c                    sN   dd„ ‰‡fdd„‰ˆ st j‰ d}td|‡‡‡fdd„‡ ‡fd	d„ˆ 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                 S   sT   t | v rt| v rt| v sdS | t  j}|r6||kr6dS | t j}|rP||krPdS dS r  )r9   rk   r¨  r^   r  rs   rs   rt   rù  ³  s    

z*NDP_Attack_Fake_Router.<locals>.is_requestc                    s(   | t  j}tˆ |dd� td| ƒ 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)rk   r^   r@   r  )ró  re   r^   )Úrars   rt   r  Å  s    
z1NDP_Attack_Fake_Router.<locals>.ra_reply_callbackZicmp6r   c                    s   ˆ| ˆˆ ƒS r—   rs   rs  r  rs   rt   r;  Ô  r§   z(NDP_Attack_Fake_Router.<locals>.<lambda>c                    s
   ˆ| ˆ ƒS r—   rs   rs  )re   r  rs   rt   r;  Õ  r§   rþ  N)r   re   rA   )r  re   rô  r  r  rs   )re   r  rù  rô  r  r  rt   ÚNDP_Attack_Fake_Routerˆ  s    +	ür  c                 C   s   t ƒ  | t¡S r—   )Úglobalsr|   r?   )rš   rs   rs   rt   Ú_get_clsÝ  s    r   c                 C   s"   |   ¡ D ]\}}t|ƒ| |< qd S r—   )Úitemsr   )ro   rÓ  Úvrs   rs   rt   Ú
_load_dictá  s    r#  r  iÝ†  )rd   )r  )rË  r—  )r[   r   )r   )rç  N)NNNN)NNNN)NNNN)NNNNF)	NNr  NNNTr[   N)NNNNN)NNN(4  r  Ú
__future__r   r   Úhashlibr   rš  ri   rá   Útimer   r   Z
scapy.archr   Zscapy.as_resolversr   Zscapy.base_classesr	   Zscapy.compatr
   r   r   r   r   Zscapy.constsr   Zscapy.configr   Z
scapy.datar   r   r   r   r   r   r   Zscapy.errorr   r   Zscapy.fieldsr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   Zscapy.layers.inetr1   r2   r3   r4   r5   r6   r7   Zscapy.layers.l2r8   r9   r:   r;   r<   Zscapy.libs.sixZlibsrq  Zscapy.packetr=   r>   r?   Zscapy.sendrecvr@   rA   rB   rC   Zscapy.supersocketrD   Zscapy.utilsrE   rF   Zscapy.pton_ntoprG   rH   Zscapy.utils6rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   Zscapy.volatilerS   rT   Úhas_ipv6ÚerrorÚhasattrrU   rW   ry   Zscapy.route6Zscapyr{   Z	new_cacheÚcommandsÚregisterru   r�   r  rÑ   r”   rÁ   rk   r	  r  ZneighborZregister_l3r  r  r"  r#  r  rD  r+  r1  r$  r%  rE  rM  rü   r@  rN  rZ  r�   r“   r�   rm  ri  rn  rr  rs  rv  rw  rÐ   r‘   r–  rž  rÍ   rÊ   rÏ  rö   rÍ  r’   rŸ  r   r¡  r¢  r£  r¤  rÚ  r¥  r¦  r§  rÌ   rê  r®  r³  r´  rµ  Zicmp6ndoptsr  r-  r  r  rm   r}   rþ  r  rÿ  r   r  r  r  r  r  r&  r  r	  r(  r
  r  r  r1  r  r¨  r©  rl   rª  r«  r  r  r¬  r­  rh  rK  rM  rN  rT  rX  rY  rZ  rd  rg  re  ri  rk  rm  r}  Z_nireply_flagsrn  r|  r~  r  r€  r�  rƒ  rÉ   r„  r¶  r¯  r°  r±  r²  rŽ  rŠ  r‹  r�  r‘  r’  r”  r•  r—  r›  rž  r¡  r£  r¥  r¦  r¨  r©  rª  r«  r­  r³  rÆ  r¯  rÏ   r´  r¶  r¹  rº  r¾  r¿  rÀ  rÃ  rÈ  rÇ  rÎ   rÉ  rÎ  rà  rá  râ  ré  rè  r  r
  r  r  r  r  r  r   r#  Zl3typesZregister_num2layerZl2typesrj   ÚIPPROTO_TCPÚIPPROTO_UDPÚIPPROTO_GRErs   rs   rs   rt   Ú<module>
   s@  $	d$0
0ñö= 1U	9ú	ü	2ú


@9kâ!æß$

&çäý

 	
ù
'1	
ý"O
þû øò		
		



ð
ö
è
ÿ
ù
+ÿ
) ÿ4 ÿ8 ÿ= ÿ   þk  þz ÿU


