a
    kÄ#d%& ã                3   @   sp	  d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddlm+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z> ddl?m@  mAZA dd„ ZBdddddddddddd d!d"œZCd#d$„ ZDd%ZEd&ZFd'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYœ2ZGdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒœ2ZHd�dŽd�d�d‘d’d“d”d•d–d—d˜d™d"œZIdšd›dœd�džœZJdŸ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¿œ"ZKG dÀdÁ„ dÁe$ƒZLG dÂdÃ„ dÃeƒZMG dÄdÅ„ dÅe6ƒZNG dÆdÇ„ dÇe6ƒZOG dÈdÉ„ dÉe6ƒZPG dÊdË„ dËe6ƒZQdÅdÇdÉdËdžœZRG dÌdÍ„ dÍe6ƒZSG dÎdÏ„ dÏeSƒZTG dÐdÑ„ dÑeSƒZUdÒdÓ„ ZVG dÔdZ„ dZeSƒZWG dÕd[„ d[eWƒZXG dÖd^„ d^eSƒZYG d×d\„ d\eSƒZZG dØd]„ d]eSƒZ[G dÙdÚ„ dÚe#ƒZ\G dÛd_„ d_eSƒZ]G dÜd`„ d`eSƒZ^G dÝdÞ„ dÞe ƒZ_G dßda„ daeSƒZ`dàdádâdãdäœZadàdådæœZbddçiZcG dèdc„ dceSƒZdG dédê„ dêe2ƒZeG dëdd„ ddeSƒZfdìdídîdïdðdñdòdóœZgG dôde„ deeSƒZhG dõdf„ dfeSƒZiG död÷„ d÷eƒZjG dødù„ dùe6ƒZkG dúdg„ dgeSƒZlG dûdü„ düejƒZmG dýdþ„ dþekƒZnG dÿdh„ dheSƒZoG �d �d„ �deSƒZpG �ddi„ dieSƒZqG �ddj„ djeSƒZrG �ddk„ dkeSƒZsG �ddl„ dleSƒZtG �ddm„ dmeSƒZuG �ddn„ dneSƒZvG �ddo„ doeSƒZwG �d	dp„ dpeSƒZxG �d
dr„ dreSƒZyG �ddq„ dqeSƒZzG �dds„ dseSƒZ{G �ddt„ dteSƒZ|G �ddu„ dueSƒZ}G �ddv„ dveSƒZ~G �ddw„ dweSƒZ�dZ€�dZ�G �ddx„ dxeSƒZ‚G �ddy„ dyeSƒZƒG �ddz„ dzeSƒZ„�d�d�d�dœZ…G �d�d„ �de6ƒZ†G �d�d„ �deSƒZ‡G �dd{„ d{eSƒZˆG �dd|„ d|eSƒZ‰G �d d}„ d}eSƒZŠG �d!d~„ d~eSƒZ‹G �d"d„ deSƒZŒG �d#d€„ d€eSƒZ�G �d$d�„ d�eSƒZŽG �d%d‚„ d‚eSƒZ�G �d&dƒ„ dƒeSƒZ�G �d'd…„ d…eSƒZ‘G �d(d†„ d†eSƒZ’G �d)d‡„ d‡eSƒZ“G �d*dˆ„ dˆeSƒZ”G �d+d‰„ d‰eSƒZ•G �d,dŠ„ dŠeSƒZ–G �d-d‹„ d‹eSƒZ—�d.Z˜�d.Z™�d.Zš�d.Z›�d.Zœ�d.Z��d.Zž�d.ZŸ�d.Z �d.Z¡�d.Z¢�d.Z£G �d/�d0„ �d0eSƒZ¤G �d1db„ dbeSƒZ¥G �d2d„ de¤ƒZ¦G �d3d„ de¤ƒZ§G �d4d„ de¤ƒZ¨G �d5d„ de¤ƒZ©G �d6d„ de¤ƒZªG �d7d„ de¤ƒZ«G �d8d„ de¤ƒZ¬G �d9d„ 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 eSe6ƒZ±G �d>d!„ d!e±ƒZ²e7e/eD�d?�d@iƒ e7e/eD�d?�dAiƒ G �dB�dC„ �dCeƒZ³dS (D  zG
DHCPv6: Dynamic Host Configuration Protocol for IPv6. [RFC 3315,8415]
é    )Úprint_functionN)ÚAnsweringMachine)Úget_if_raw_hwaddrÚin6_getifaddr)Úconf)ÚEPOCHÚ	ETHER_ANY)ÚrawÚorb)Úwarning)ÚBitFieldÚByteEnumFieldÚ	ByteFieldÚFieldLenFieldÚ
FlagsFieldÚIntEnumFieldÚIntFieldÚMACFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚStrFieldÚStrFixedLenFieldÚStrLenFieldÚUTCTimeFieldÚX3BytesFieldÚ	XIntFieldÚXShortEnumFieldÚPacketLenFieldÚ	UUIDFieldÚFieldListField)ÚIANA_ENTERPRISE_NUMBERS)ÚDNSStrField)ÚUDP)ÚDomainNameListFieldÚIP6FieldÚIP6ListFieldÚIPv6)ÚPacketÚbind_bottom_up)Ú	inet_pton)ÚColor)Úin6_addrtovendorÚin6_islladdrc                 C   s   t ƒ  | |¡S ©N)ÚglobalsÚget)ÚnameZfallback_cls© r2   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/dhcp6.pyÚget_cls-   s    r4   ÚDHCP6_SolicitÚDHCP6_AdvertiseÚDHCP6_RequestÚDHCP6_ConfirmÚDHCP6_RenewÚDHCP6_RebindÚDHCP6_ReplyÚDHCP6_ReleaseÚDHCP6_DeclineÚDHCP6_ReconfÚDHCP6_InfoRequestÚDHCP6_RelayForwardÚDHCP6_RelayReply)é   é   é   é   é   é   é   é   é	   é
   é   é   é   c                 O   sD   t j}t| ƒdkr.tt t| d ƒd¡t jƒ}|| g|¢R i |¤ŽS )NrC   r   ZRaw)r   Ú	raw_layerÚlenr4   Údhcp6_cls_by_typer0   r
   )ÚxÚargsÚkargsÚclsr2   r2   r3   Ú_dhcp6_dispatcher@   s    rV   z	ff02::1:2z	ff05::1:3ZCLIENTIDZSERVERIDZIA_NAZIA_TAZIAADDRZOROZ
PREFERENCEZELAPSED_TIMEZ	RELAY_MSGZAUTHZUNICASTZSTATUS_CODEZRAPID_COMMITZ
USER_CLASSZVENDOR_CLASSZVENDOR_OPTSZINTERFACE_IDZ
RECONF_MSGZRECONF_ACCEPTzSIP Servers Domain Name ListzSIP Servers IPv6 Address Listz DNS Recursive Name Server OptionzDomain Search List optionZOPTION_IA_PDZOPTION_IAPREFIXZOPTION_NIS_SERVERSZOPTION_NISP_SERVERSZOPTION_NIS_DOMAIN_NAMEZOPTION_NISP_DOMAIN_NAMEZOPTION_SNTP_SERVERSZOPTION_INFORMATION_REFRESH_TIMEZOPTION_BCMCS_SERVER_DZOPTION_BCMCS_SERVER_AZOPTION_GEOCONF_CIVICZOPTION_REMOTE_IDZOPTION_SUBSCRIBER_IDZOPTION_CLIENT_FQDNZOPTION_PANA_AGENTZOPTION_NEW_POSIX_TIMEZONEZOPTION_NEW_TZDB_TIMEZONEZOPTION_LQ_CLIENT_LINKZOPT_BOOTFILE_URLZOPT_BOOTFILE_PARAMZOPTION_CLIENT_ARCH_TYPEZ
OPTION_NIIZOPTION_ERP_LOCAL_DOMAIN_NAMEZOPTION_RELAY_SUPPLIED_OPTIONSZ
OPTION_VSSZOPTION_CLIENT_LINKLAYER_ADDRZOPTION_MUD_URL)2rB   rC   rD   rE   rF   rG   rH   rI   rJ   rL   rM   rN   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é$   é%   é&   é'   é(   é)   é*   é0   é;   é<   é=   é>   éA   éB   éD   éO   ép   ÚDHCP6OptClientIdÚDHCP6OptServerIdÚDHCP6OptIA_NAÚDHCP6OptIA_TAÚDHCP6OptIAAddressÚDHCP6OptOptReqÚDHCP6OptPrefÚDHCP6OptElapsedTimeÚDHCP6OptRelayMsgÚDHCP6OptAuthÚDHCP6OptServerUnicastÚDHCP6OptStatusCodeÚDHCP6OptRapidCommitÚDHCP6OptUserClassÚDHCP6OptVendorClassÚDHCP6OptVendorSpecificInfoÚDHCP6OptIfaceIdÚDHCP6OptReconfMsgÚDHCP6OptReconfAcceptÚDHCP6OptSIPDomainsÚDHCP6OptSIPServersÚDHCP6OptDNSServersÚDHCP6OptDNSDomainsÚDHCP6OptIA_PDÚDHCP6OptIAPrefixÚDHCP6OptNISServersÚDHCP6OptNISPServersÚDHCP6OptNISDomainÚDHCP6OptNISPDomainÚDHCP6OptSNTPServersÚDHCP6OptInfoRefreshTimeÚDHCP6OptBCMCSDomainsÚDHCP6OptBCMCSServersÚDHCP6OptRemoteIDÚDHCP6OptSubscriberIDÚDHCP6OptClientFQDNÚDHCP6OptPanaAuthAgentÚDHCP6OptNewPOSIXTimeZoneÚDHCP6OptNewTZDBTimeZoneÚDHCP6OptRelayAgentEROÚDHCP6OptLQClientLinkÚDHCP6OptBootFileUrlZDHCP6OptBootFileParamÚDHCP6OptClientArchTypeÚDHCP6OptClientNetworkInterIdÚDHCP6OptERPDomainÚDHCP6OptRelaySuppliedOptÚDHCP6OptVSSÚDHCP6OptClientLinkLayerAddrÚDHCP6OptMudUrl)2rB   rC   rD   rE   rF   rG   rH   rI   rJ   rL   rM   rN   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rm   rn   ro   rp   rq   rr   é+   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   ZSOLICITZ	ADVERTISEZREQUESTZCONFIRMZRENEWZREBINDZREPLYZRELEASEZDECLINEZRECONFIGUREzINFORMATION-REQUESTz
RELAY-FORWz
RELAY-REPLzLink-layer address plus timez4Vendor-assigned unique ID based on Enterprise NumberzLink-layer AddressÚUUID)rB   rC   rD   rE   zNET/ROM pseudozEthernet (10Mb)zExperimental Ethernet (3Mb)zAmateur Radio AX.25zProteon ProNET Token RingZChaoszIEEE 802 NetworksZARCNETZHyperchannelZLanstarzAutonet Short AddressZ	LocalTalkz&LocalNet (IBM PCNet or SYTEK LocalNET)z
Ultra linkZSMDSzFrame Relayz$Asynchronous Transmission Mode (ATM)ZHDLCzFibre ChannelzSerial LinezMIL-STD-188-220ZMetricomzIEEE 1394.1995ZMAPOSZ	TwinaxialzEUI-64ZHIPARPzIP and ARP over ISO 7816-3ZARPSeczIPsec tunnelzInfiniBand (TM)z-TIA-102 Project 25 Common Air Interface (CAI))"r   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   c                   @   s   e Zd Zdd„ ZdS )Ú_UTCTimeFieldc                 O   s$   d}t j| g|¢R d|i|¤Ž d S )N©	iÐ  rB   rB   r   r   r   rF   rB   r   Úepoch)r   Ú__init__)ÚselfrS   rT   Z
epoch_2000r2   r2   r3   r³   ÿ   s    z_UTCTimeField.__init__N)Ú__name__Ú
__module__Ú__qualname__r³   r2   r2   r2   r3   r°   þ   s   r°   c                   @   s   e Zd ZdS )Ú_LLAddrFieldN©rµ   r¶   r·   r2   r2   r2   r3   r¸     s   r¸   c                   @   s8   e Zd ZdZeddeƒeddeƒeddƒe	de
ƒgZdS )	ÚDUID_LLTz#DUID - Link-layer address plus timeÚtyperB   ÚhwtypeÚtimevalr   ÚlladdrN)rµ   r¶   r·   r1   r   Ú	duidtypesr   Úduidhwtypesr°   r¸   r   Úfields_descr2   r2   r2   r3   rº     s   

ýrº   c                   @   s0   e Zd ZdZeddeƒeddeƒeddƒgZ	dS )	ÚDUID_ENz4DUID - Assigned by Vendor Based on Enterprise Numberr»   rC   Úenterprisenumi7  ÚidÚ N)
rµ   r¶   r·   r1   r   r¿   r   r!   r   rÁ   r2   r2   r2   r3   rÂ     s
   

þrÂ   c                   @   s0   e Zd ZdZeddeƒeddeƒede	ƒgZ
dS )ÚDUID_LLz"DUID - Based on Link-layer Addressr»   rD   r¼   rB   r¾   N)rµ   r¶   r·   r1   r   r¿   r   rÀ   r¸   r   rÁ   r2   r2   r2   r3   rÆ     s
   

þrÆ   c                   @   s,   e Zd ZdZeddeƒeddejd�gZdS )Ú	DUID_UUIDzDUID - Based on UUIDr»   rE   ÚuuidN)Zuuid_fmt)	rµ   r¶   r·   r1   r   r¿   r   Z	FORMAT_BErÁ   r2   r2   r2   r3   rÇ   !  s   
ÿrÇ   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )Ú_DHCP6OptGuessPayloadc                 C   sL   t |ƒdkrtjS t d|d d… ¡d }t |d ¡}|d u rB| S t|| ƒS )NrC   ú!Hr   )rP   r   rO   ÚstructÚunpackÚdhcp6opts_by_coder0   r4   )rU   ÚpayloadÚoptÚclsnamer2   r2   r3   Ú_just_guess_payload_class2  s    z/_DHCP6OptGuessPayload._just_guess_payload_classc                 C   s   t  t|¡S r.   )rÉ   rÑ   ÚDHCP6OptUnknown©r´   rÎ   r2   r2   r3   Úguess_payload_class=  s    þz)_DHCP6OptGuessPayload.guess_payload_classN)rµ   r¶   r·   ÚstaticmethodrÑ   rÔ   r2   r2   r2   r3   rÉ   1  s   

rÉ   c                   @   s&   e Zd ZdZeddd„ƒZdd„ ZdS )Ú_DHCP6OptGuessPayloadEltzŽ
    Same than _DHCP6OptGuessPayload but made for lists
    in case of list of different suboptions
    e.g. in ianaopts in DHCP6OptIA_NA
    Nc                 O   s   |   tj|¡S r.   )rÑ   r   rO   )rU   rÎ   rS   rT   r2   r2   r3   Údispatch_hookL  s    z&_DHCP6OptGuessPayloadElt.dispatch_hookc                 C   s   d|fS )Nó    r2   )r´   Úsr2   r2   r3   Úextract_paddingP  s    z(_DHCP6OptGuessPayloadElt.extract_padding)N)rµ   r¶   r·   Ú__doc__Úclassmethodr×   rÚ   r2   r2   r2   r3   rÖ   F  s   rÖ   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 )rÒ   zUnknown DHCPv6 OptionÚoptcoder   ÚoptlenNÚdatarÊ   ©Ú	length_ofÚfmtrÅ   c                 C   s   | j S r.   ©rÞ   ©Úpktr2   r2   r3   Ú<lambda>Y  rØ   zDHCP6OptUnknown.<lambda>©Úlength_from©	rµ   r¶   r·   r1   r   Ú	dhcp6optsr   r   rÁ   r2   r2   r2   r3   rÒ   T  s   
ÿþrÒ   c                 C   sH   t j}t| ƒdkr@t d| d d… ¡d }tt |t j¡t jƒ}|| ƒS )NrE   rÊ   rC   r   )r   rO   rP   rË   rÌ   r4   Úduid_clsr0   )rR   rU   Úor2   r2   r3   Ú_duid_dispatcher\  s
    rí   c                   @   s>   e Zd ZdZeddeƒeddddd�edd	ed
d„ d�gZ	dS )r}   zDHCP6 Client Identifier OptionrÝ   rB   rÞ   NÚduidrÊ   rà   rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   i  rØ   zDHCP6OptClientId.<lambda>rç   )
rµ   r¶   r·   r1   r   rê   r   r   rí   rÁ   r2   r2   r2   r3   r}   d  s   
ÿþc                   @   s   e Zd ZdZdZdS )r~   zDHCP6 Server Identifier OptionrC   N)rµ   r¶   r·   r1   rÝ   r2   r2   r2   r3   r~   l  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ddiƒeddddiƒe	dg e
dd	„ d�gZdd„ ZdS )r�   z2DHCP6 IA Address Option (IA_TA or IA_NA suboption)rÝ   rF   rÞ   NZ
iaaddroptsrÊ   c                 C   s   |d S ©Nra   r2   ©rå   rR   r2   r2   r3   ræ   x  rØ   zDHCP6OptIAAddress.<lambda>©rá   râ   ÚadjustÚaddrú::Úpreflftr   ì   ÿÿ ÚinfinityÚvalidlftc                 C   s
   | j d S rï   rã   rä   r2   r2   r3   ræ   �  rØ   rç   c                 C   s   t jS r.   ©r   Úpadding_layerrÓ   r2   r2   r3   rÔ   ƒ  s    z%DHCP6OptIAAddress.guess_payload_class)rµ   r¶   r·   r1   r   rê   r   r%   r   r   rÖ   rÁ   rÔ   r2   r2   r2   r3   r�   t  s   
ÿþ÷c                   @   s\   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ƒe	dg e
dd	„ d�gZdS )r   z=DHCP6 Identity Association for Non-temporary Addresses OptionrÝ   rD   rÞ   NÚianaoptsrÊ   c                 C   s   |d S ©NrM   r2   rð   r2   r2   r3   ræ   ‹  rØ   zDHCP6OptIA_NA.<lambda>rñ   ÚiaidÚT1ÚT2c                 C   s
   | j d S rü   rã   rä   r2   r2   r3   ræ   �  rØ   rç   ©rµ   r¶   r·   r1   r   rê   r   r   r   r   rÖ   rÁ   r2   r2   r2   r3   r   ‡  s   
ÿÿúc                	   @   sL   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�gZ
dS )r€   z9DHCP6 Identity Association for Temporary Addresses OptionrÝ   rE   rÞ   NÚiataoptsrÊ   c                 C   s   |d S ©NrE   r2   rð   r2   r2   r3   ræ   —  rØ   zDHCP6OptIA_TA.<lambda>rñ   rý   c                 C   s
   | j d S r  rã   rä   r2   r2   r3   ræ   š  rØ   rç   )rµ   r¶   r·   r1   r   rê   r   r   r   rÖ   rÁ   r2   r2   r2   r3   r€   “  s   
ÿÿüc                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )Ú_OptReqListFieldrB   c                 C   s   |d u rg S |S r.   r2   ©r´   rå   rR   r2   r2   r3   Úi2h¢  s    z_OptReqListField.i2hc                 C   s   dt |ƒ S ©NrC   ©rP   r  r2   r2   r3   Úi2len§  s    z_OptReqListField.i2lenc                 C   s   |S r.   r2   r  r2   r2   r3   Úany2iª  s    z_OptReqListField.any2ic                 C   sJ   g }|   ||¡D ]*}|tv r,| t| ¡ q| d| ¡ qdd |¡ S )Nz%dz[%s]ú, )r  rê   ÚappendÚjoin)r´   rå   rR   rÙ   Úyr2   r2   r3   Úi2repr­  s    z_OptReqListField.i2reprc                 C   sX   g }t |ƒdkrTt |ƒdk r(tdƒ |S | t d|d d… ¡d ¡ |dd … }q|S )Nr   rC   z:Odd length for requested option field. Rejecting last byterÊ   )rP   r   r  rË   rÌ   )r´   rå   rR   Úrr2   r2   r3   Úm2i¶  s    z_OptReqListField.m2ic                 C   s   d  dd„ |D ƒ¡S )NrØ   c                 s   s   | ]}t  d |¡V  qdS )rÊ   N)rË   Úpack)Ú.0r  r2   r2   r3   Ú	<genexpr>Á  rØ   z'_OptReqListField.i2m.<locals>.<genexpr>)r  r  r2   r2   r3   Úi2mÀ  s    z_OptReqListField.i2mN)
rµ   r¶   r·   Zislistr  r  r	  r  r  r  r2   r2   r2   r3   r  Ÿ  s   	
r  c                   @   s@   e Zd ZdZeddeƒeddddd�edd	d
gdd„ d�gZdS )r‚   zDHCP6 Option Request OptionrÝ   rG   rÞ   NÚreqoptsrÊ   rà   r`   ra   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   Ì  rØ   zDHCP6OptOptReq.<lambda>rç   ©	rµ   r¶   r·   r1   r   rê   r   r  rÁ   r2   r2   r2   r3   r‚   Ç  s   

ÿþc                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	rƒ   zDHCP6 Preference OptionrÝ   rH   rÞ   rB   Úprefvaléÿ   N©	rµ   r¶   r·   r1   r   rê   r   r   rÁ   r2   r2   r2   r3   rƒ   Ó  s
   
þc                   @   s   e Zd Zdd„ ZdS )Ú_ElapsedTimeFieldc                 C   s    |dkrdS d|   ||¡d  S )Niÿÿ  zinfinity (0xffff)z%.2f secg      Y@)r  r  r2   r2   r3   r  Ý  s    z_ElapsedTimeField.i2reprN)rµ   r¶   r·   r  r2   r2   r2   r3   r  Ü  s   r  c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	r„   zDHCP6 Elapsed Time OptionrÝ   rI   rÞ   rC   Zelapsedtimer   N)	rµ   r¶   r·   r1   r   rê   r   r  rÁ   r2   r2   r2   r3   r„   ã  s
   
þzconfiguration tokenzdelayed authenticationz!delayed authentication (obsolete)zreconfigure key)r   rB   rC   rD   zHMAC-MD5)r   rB   z'use of a monotonically increasing valuec                   @   sj   e Zd ZdZeddeƒedddddd	„ d
�eddeƒedde	ƒedde
ƒedddƒedddd	„ d�gZdS )r†   zDHCP6 Option - AuthenticationrÝ   rL   rÞ   NÚauthinforÊ   c                 C   s   |d S ©NrL   r2   rð   r2   r2   r3   ræ      rØ   zDHCP6OptAuth.<lambda>rñ   ÚprotorD   ÚalgrB   Zrdmr   Zreplays           rI   rÅ   c                 C   s
   | j d S r  rã   rä   r2   r2   r3   ræ   &  rØ   rç   )rµ   r¶   r·   r1   r   rê   r   r   Ú_dhcp6_auth_protoÚ_dhcp6_auth_algÚ_dhcp6_auth_rdmr   r   rÁ   r2   r2   r2   r3   r†     s   
ÿ



ÿùc                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_SrvAddrFieldc                 C   s   |d u rdS |S )Nrô   r2   r  r2   r2   r3   r  ,  s    z_SrvAddrField.i2hc                 C   s   t tj|  ||¡ƒS r.   )r*   ÚsocketÚAF_INET6r  r  r2   r2   r3   r  1  s    z_SrvAddrField.i2mN)rµ   r¶   r·   r  r  r2   r2   r2   r3   r"  +  s   r"  c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )r‡   zDHCP6 Server Unicast OptionrÝ   rM   rÞ   rY   ZsrvaddrN)	rµ   r¶   r·   r1   r   rê   r   r"  rÁ   r2   r2   r2   r3   r‡   5  s
   
þZSuccessZ
UnspecFailZNoAddrsAvailZ	NoBindingZ	NotOnLinkZUseMulticastZNoPrefixAvail)r   rB   rC   rD   rE   rF   rG   c                   @   sL   e Zd ZdZeddeƒedddddd	„ d
�eddeƒedddd	„ d�gZ	dS )rˆ   zDHCP6 Status Code OptionrÝ   rN   rÞ   NÚ	statusmsgrÊ   c                 C   s   |d S r  r2   rð   r2   r2   r3   ræ   K  rØ   zDHCP6OptStatusCode.<lambda>rñ   Ú
statuscoderÅ   c                 C   s
   | j d S r  rã   rä   r2   r2   r3   ræ   N  rØ   rç   )
rµ   r¶   r·   r1   r   rê   r   Údhcp6statuscodesr   rÁ   r2   r2   r2   r3   rˆ   G  s   
ÿ
ÿüc                   @   s&   e Zd ZdZeddeƒeddƒgZdS )r‰   zDHCP6 Rapid Commit OptionrÝ   rW   rÞ   r   N©rµ   r¶   r·   r1   r   rê   r   rÁ   r2   r2   r2   r3   r‰   S  s   
ÿc                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_UserClassDataFieldc                 C   s&   |d u s|g krdS t dd„ |D ƒƒS )Nr   c                 s   s   | ]}t t|ƒƒV  qd S r.   )rP   r	   ©r  rR   r2   r2   r3   r  _  rØ   z,_UserClassDataField.i2len.<locals>.<genexpr>)Úsum)r´   rå   Úzr2   r2   r3   r  \  s    z_UserClassDataField.i2lenc           	      C   sz   |   |¡}g }|d |… ||d …  }}t|ƒdkrr|  ||¡}tj|v rb|tj }|j}|j`nd}| |¡ q(||fS )Nr   rÅ   )	rè   rP   r  r   rú   ÚloadZ
underlayerrÎ   r  )	r´   rå   rÙ   Útmp_lenÚlstZremainZpaylÚpÚpadr2   r2   r3   Úgetfielda  s    


z_UserClassDataField.getfieldN)rµ   r¶   r·   r  r2  r2   r2   r2   r3   r)  [  s   r)  c                   @   s8   e Zd ZdZedddd�edddd„ d	�gZd
d„ ZdS )ÚUSER_CLASS_DATAzuser class datarP   Nrß   ©rá   rÅ   c                 C   s   | j S r.   r  rä   r2   r2   r3   ræ   u  rØ   zUSER_CLASS_DATA.<lambda>rç   c                 C   s   t jS r.   rù   rÓ   r2   r2   r3   rÔ   w  s    z#USER_CLASS_DATA.guess_payload_class)rµ   r¶   r·   r1   r   r   rÁ   rÔ   r2   r2   r2   r3   r3  q  s   ÿÿr3  c                   @   s>   e Zd ZdZeddeƒeddddd�edg ed	d
„ d�gZ	dS )rŠ   zDHCP6 User Class OptionrÝ   rX   rÞ   NrÊ   Zuserclassdata©râ   rá   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   �  rØ   zDHCP6OptUserClass.<lambda>rç   )
rµ   r¶   r·   r1   r   rê   r   r)  r3  rÁ   r2   r2   r2   r3   rŠ   {  s   
ÿÿýc                   @   s   e Zd ZdS )Ú_VendorClassDataFieldNr¹   r2   r2   r2   r3   r6  †  s   r6  c                   @   s   e Zd ZdZdS )ÚVENDOR_CLASS_DATAzvendor class dataN)rµ   r¶   r·   r1   r2   r2   r2   r3   r7  Š  s   r7  c                	   @   sN   e Zd ZdZeddeƒedddddd	„ d
�eddeƒe	dg e
dd	„ d�gZdS )r‹   zDHCP6 Vendor Class OptionrÝ   rY   rÞ   NZvcdatarÊ   c                 C   s   |d S r  r2   rð   r2   r2   r3   ræ   ’  rØ   zDHCP6OptVendorClass.<lambda>rñ   rÃ   c                 C   s
   | j d S r  rã   rä   r2   r2   r3   ræ   –  rØ   rç   )rµ   r¶   r·   r1   r   rê   r   r   r!   r6  r7  rÁ   r2   r2   r2   r3   r‹   Ž  s   

ÿÿÿûc                   @   s@   e Zd ZdZeddƒedddd�edddd	„ d
�gZdd„ ZdS )ÚVENDOR_SPECIFIC_OPTIONzvendor specific option datarÝ   NrÞ   Úoptdatar4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ      rØ   zVENDOR_SPECIFIC_OPTION.<lambda>rç   c                 C   s   t jS r.   rù   rÓ   r2   r2   r3   rÔ   ¢  s    z*VENDOR_SPECIFIC_OPTION.guess_payload_class)	rµ   r¶   r·   r1   r   r   r   rÁ   rÔ   r2   r2   r2   r3   r8  ›  s   ÿþr8  c                	   @   sN   e Zd ZdZeddeƒedddddd	„ d
�eddeƒe	dg e
dd	„ d�gZdS )rŒ   z(DHCP6 Vendor-specific Information OptionrÝ   rZ   rÞ   NZvsorÊ   c                 C   s   |d S r  r2   rð   r2   r2   r3   ræ   ¬  rØ   z#DHCP6OptVendorSpecificInfo.<lambda>rñ   rÃ   c                 C   s
   | j d S r  rã   rä   r2   r2   r3   ræ   °  rØ   rç   )rµ   r¶   r·   r1   r   rê   r   r   r!   r6  r8  rÁ   r2   r2   r2   r3   rŒ   ¨  s   

ÿÿÿû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 )r�   zDHCP6 Interface-Id OptionrÝ   r[   rÞ   NrÊ   Zifaceidr5  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ¾  rØ   zDHCP6OptIfaceId.<lambda>rç   ré   r2   r2   r2   r3   r�   ¸  s   
ÿÿýc                   @   s6   e Zd ZdZeddeƒeddƒedddd	d
œƒgZdS )rŽ   z DHCP6 Reconfigure Message OptionrÝ   r\   rÞ   rB   ÚmsgtyperL   zRenew MessagezInformation Request)rF   rL   N)	rµ   r¶   r·   r1   r   rê   r   r   rÁ   r2   r2   r2   r3   rŽ   Æ  s   
ÿþc                   @   s&   e Zd ZdZeddeƒeddƒgZdS )r�   zDHCP6 Reconfigure Accept OptionrÝ   r]   rÞ   r   Nr(  r2   r2   r2   r3   r�   ×  s   
ÿc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r�   z+DHCP6 Option - SIP Servers Domain Name ListrÝ   r^   rÞ   NÚ
sipdomainsr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   â  rØ   zDHCP6OptSIPDomains.<lambda>rç   ©	rµ   r¶   r·   r1   r   rê   r   r$   rÁ   r2   r2   r2   r3   r�   Ý  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r‘   z,DHCP6 Option - SIP Servers IPv6 Address ListrÝ   r_   rÞ   NÚ
sipserversr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ê  rØ   zDHCP6OptSIPServers.<lambda>rç   ©	rµ   r¶   r·   r1   r   rê   r   r&   rÁ   r2   r2   r2   r3   r‘   å  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r’   z(DHCP6 Option - DNS Recursive Name ServerrÝ   r`   rÞ   NÚ
dnsserversr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ò  rØ   zDHCP6OptDNSServers.<lambda>rç   r>  r2   r2   r2   r3   r’   í  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r“   z(DHCP6 Option - Domain Search List optionrÝ   ra   rÞ   NÚ
dnsdomainsr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ú  rØ   zDHCP6OptDNSDomains.<lambda>rç   r<  r2   r2   r2   r3   r“   õ  s   
ÿþc                   @   sv   e Zd ZdZeddeƒeddddd„ d	�ed
dddiƒeddddiƒeddƒe	ddƒe
dg edd„ d�gZdd„ ZdS )r•   zDHCP6 Option - IA Prefix optionrÝ   rc   rÞ   NZ
iaprefoptsc                 C   s   |d S ©Nrb   r2   rð   r2   r2   r3   ræ     rØ   zDHCP6OptIAPrefix.<lambda>©rá   rò   rõ   r   rö   r÷   rø   Úplenrs   Úprefixz
2001:db8::c                 C   s
   | j d S rA  rã   rä   r2   r2   r3   ræ     rØ   rç   c                 C   s   t jS r.   rù   rÓ   r2   r2   r3   rÔ     s    z$DHCP6OptIAPrefix.guess_payload_class)rµ   r¶   r·   r1   r   rê   r   r   r   r%   r   rÖ   rÁ   rÔ   r2   r2   r2   r3   r•   ý  s   
ÿþöc                   @   s\   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ƒe	dg e
dd	„ d�gZdS )r”   z9DHCP6 Option - Identity Association for Prefix DelegationrÝ   rb   rÞ   NZiapdoptrÊ   c                 C   s   |d S rü   r2   rð   r2   r2   r3   ræ     rØ   zDHCP6OptIA_PD.<lambda>rñ   rý   rþ   rÿ   c                 C   s
   | j d S rü   rã   rä   r2   r2   r3   ræ     rØ   rç   r   r2   r2   r2   r3   r”     s   
ÿÿúc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r–   zDHCP6 Option - NIS ServersrÝ   rd   rÞ   NÚ
nisserversr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   "  rØ   zDHCP6OptNISServers.<lambda>rç   r>  r2   r2   r2   r3   r–     s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r—   zDHCP6 Option - NIS+ ServersrÝ   re   rÞ   NÚnispserversr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   *  rØ   zDHCP6OptNISPServers.<lambda>rç   r>  r2   r2   r2   r3   r—   %  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdS )r˜   zDHCP6 Option - NIS Domain NamerÝ   rf   rÞ   NÚ	nisdomainr4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   2  rØ   zDHCP6OptNISDomain.<lambda>rç   ©	rµ   r¶   r·   r1   r   rê   r   r"   rÁ   r2   r2   r2   r3   r˜   -  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdS )r™   zDHCP6 Option - NIS+ Domain NamerÝ   rg   rÞ   NÚ
nispdomainr4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   :  rØ   zDHCP6OptNISPDomain.<lambda>rç   rH  r2   r2   r2   r3   r™   5  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )rš   zDHCP6 option - SNTP ServersrÝ   rh   rÞ   NÚsntpserversr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   B  rØ   zDHCP6OptSNTPServers.<lambda>rç   r>  r2   r2   r2   r3   rš   =  s   
ÿþi€Q iX  c                   @   s.   e Zd ZdZeddeƒeddƒedeƒgZ	dS )r›   z'DHCP6 Option - Information Refresh TimerÝ   ri   rÞ   rE   ZreftimeN)
rµ   r¶   r·   r1   r   rê   r   r   ÚIRT_DEFAULTrÁ   r2   r2   r2   r3   r›   I  s
   
þc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )rœ   z%DHCP6 Option - BCMCS Domain Name ListrÝ   rj   rÞ   NÚbcmcsdomainsr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   U  rØ   zDHCP6OptBCMCSDomains.<lambda>rç   r<  r2   r2   r2   r3   rœ   P  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r�   z#DHCP6 Option - BCMCS Addresses ListrÝ   rk   rÞ   NÚbcmcsserversr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ]  rØ   zDHCP6OptBCMCSServers.<lambda>rç   r>  r2   r2   r2   r3   r�   X  s   
ÿþzDHCP serverzclosest network elementÚclient)r   rB   rC   c                   @   s4   e Zd Zeddƒedddd�edddd	„ d
�gZdS )ÚDHCP6OptGeoConfElementZCAtyper   ÚCAlengthNZCAvaluer4  rÅ   c                 C   s   | j S r.   )rP  rä   r2   r2   r3   ræ   k  rØ   zDHCP6OptGeoConfElement.<lambda>rç   )rµ   r¶   r·   r   r   r   rÁ   r2   r2   r2   r3   rO  g  s   ÿþrO  c                
   @   sV   e Zd ZdZeddeƒeddddd„ d	�ed
deƒe	dddƒe
dg edd„ d�gZdS )ÚDHCP6OptGeoConfzDHCP6 Option - Civic LocationrÝ   rl   rÞ   NZca_eltsc                 C   s   | d S ©NrD   r2   ©rR   r2   r2   r3   ræ   r  rØ   zDHCP6OptGeoConf.<lambda>rB  ÚwhatrC   Zcountry_codeZFRc                 C   s
   | j d S rR  rã   rä   r2   r2   r3   ræ   v  rØ   rç   )rµ   r¶   r·   r1   r   rê   r   r   Ú_dhcp6_geoconf_whatr   r   rO  rÁ   r2   r2   r2   r3   rQ  n  s   
ÿ

ÿûrQ  c                   @   sJ   e Zd ZdZeddeƒeddddd„ d	�ed
deƒe	dddd„ d�gZ
dS )rž   z$DHCP6 Option - Relay Agent Remote-IDrÝ   rm   rÞ   NZremoteidc                 C   s   |d S r  r2   rð   r2   r2   r3   ræ     rØ   zDHCP6OptRemoteID.<lambda>rB  rÃ   rÅ   c                 C   s
   | j d S r  rã   rä   r2   r2   r3   ræ   ƒ  rØ   rç   )rµ   r¶   r·   r1   r   rê   r   r   r!   r   rÁ   r2   r2   r2   r3   rž   {  s   
ÿÿÿûc                   @   s:   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdS )rŸ   zDHCP6 Option - Subscriber IDrÝ   rn   rÞ   NZsubscriberidr4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   �  rØ   zDHCP6OptSubscriberID.<lambda>rç   ré   r2   r2   r2   r3   rŸ   †  s   
ÿüc                	   @   sV   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dƒe	dddd„ d�gZ
dS )r    zDHCP6 Option - Client FQDNrÝ   ro   rÞ   NZfqdnc                 C   s   |d S ©NrB   r2   rð   r2   r2   r3   ræ   ”  rØ   zDHCP6OptClientFQDN.<lambda>rB  Úresr   rF   ÚflagsrD   ZSONrÅ   c                 C   s
   | j d S rV  rã   rä   r2   r2   r3   ræ   ˜  rØ   rç   )rµ   r¶   r·   r1   r   rê   r   r   r   r"   rÁ   r2   r2   r2   r3   r    �  s   
ÿ
ÿûc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r¡   z&DHCP6 PANA Authentication Agent OptionrÝ   rp   rÞ   NZpaaaddrr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ      rØ   zDHCP6OptPanaAuthAgent.<lambda>rç   r>  r2   r2   r2   r3   r¡   ›  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdS )r¢   zDHCP6 POSIX Timezone OptionrÝ   rq   rÞ   Nr9  r4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ¨  rØ   z!DHCP6OptNewPOSIXTimeZone.<lambda>rç   ré   r2   r2   r2   r3   r¢   £  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdS )r£   zDHCP6 TZDB Timezone OptionrÝ   rr   rÞ   Nr9  r4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   °  rØ   z DHCP6OptNewTZDBTimeZone.<lambda>rç   ré   r2   r2   r2   r3   r£   «  s   
ÿþc                   @   s@   e Zd ZdZeddeƒeddddd�edd	d
gdd„ d�gZdS )r¤   z"DHCP6 Option - RelayRequest OptionrÝ   r®   rÞ   Nr  rÊ   rà   r`   ra   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ¹  rØ   zDHCP6OptRelayAgentERO.<lambda>rç   r  r2   r2   r2   r3   r¤   ³  s   
ÿ
ÿýc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r¥   zDHCP6 Client Link OptionrÝ   rs   rÞ   NZlinkaddressr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   Á  rØ   zDHCP6OptLQClientLink.<lambda>rç   r>  r2   r2   r2   r3   r¥   ¼  s   
ÿþc                   @   s:   e Zd ZdZeddeƒedddd�eddd	d
„ d�gZdS )r¦   zDHCP6 Boot File URL OptionrÝ   rt   rÞ   Nr9  r4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   É  rØ   zDHCP6OptBootFileUrl.<lambda>rç   ré   r2   r2   r2   r3   r¦   Ä  s   
ÿþc                   @   sD   e Zd ZdZeddeƒeddddd�edg ed	d
ƒdd„ d�gZ	dS )r§   z,DHCP6 Client System Architecture Type OptionrÝ   rv   rÞ   NZ	archtypesrÊ   rà   Zarchtyper   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   Ó  rØ   zDHCP6OptClientArchType.<lambda>rç   )
rµ   r¶   r·   r1   r   rê   r   r    r   rÁ   r2   r2   r2   r3   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d
S )r¨   z0DHCP6 Client Network Interface Identifier OptionrÝ   rw   rÞ   rD   Ziityper   ZiimajorZiiminorNr  r2   r2   r2   r3   r¨   Ö  s   
üc                   @   s:   e Zd ZdZeddeƒedddd�edg dd	„ d
�gZdS )r©   z#DHCP6 Option - ERP Domain Name ListrÝ   rx   rÞ   NZ	erpdomainr4  c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ä  rØ   zDHCP6OptERPDomain.<lambda>rç   r<  r2   r2   r2   r3   r©   ß  s   
ÿþc                   @   s>   e Zd ZdZeddeƒeddddd�edg ed	d
„ d�gZ	dS )rª   z#DHCP6 Relay-Supplied Options OptionrÝ   ry   rÞ   NZrelaysuppliedrÊ   rà   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   î  rØ   z!DHCP6OptRelaySuppliedOpt.<lambda>rç   )
rµ   r¶   r·   r1   r   rê   r   r   rÖ   rÁ   r2   r2   r2   r3   rª   ç  s   
ÿþýc                   @   sH   e Zd ZdZeddeƒeddddd„ d	�ed
dƒedddd„ d�gZ	dS )r«   z'DHCP6 Option - Virtual Subnet SelectionrÝ   rz   rÞ   Nrß   c                 C   s   |d S rV  r2   rð   r2   r2   r3   ræ   ö  rØ   zDHCP6OptVSS.<lambda>rB  r»   r  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ   ù  rØ   rç   )
rµ   r¶   r·   r1   r   rê   r   r   r   rÁ   r2   r2   r2   r3   r«   ò  s   
ÿÿüc                   @   s@   e Zd ZdZeddeƒeddddd„ d	�ed
dƒede	ƒgZ
dS )r¬   z(DHCP6 Option - Client Link Layer addressrÝ   r{   rÞ   NZclladdrc                 C   s   |d S r  r2   rð   r2   r2   r3   ræ     rØ   z$DHCP6OptClientLinkLayerAddr.<lambda>rB  ZlltyperB   )rµ   r¶   r·   r1   r   rê   r   r   r¸   r   rÁ   r2   r2   r2   r3   r¬   þ  s   
ÿüc                   @   s<   e Zd ZdZeddeƒedddd�eddd	d
„ dd�gZdS )r­   zDHCP6 Option - MUD URLrÝ   r|   rÞ   NZ	mudstringr4  rÅ   c                 C   s   | j S r.   rã   rä   r2   r2   r3   ræ     rØ   zDHCP6OptMudUrl.<lambda>éý   )rè   Ú
max_lengthré   r2   r2   r2   r3   r­     s   
þþrÅ   c                   @   s<   e Zd ZdZeddeƒeddƒgZedddœiZ	d	d
„ Z
dS )ÚDHCP6zDHCPv6 Generic Messager:  NÚtridr   é"  é#  ©ÚsportÚdportc                 C   s   t  d| j¡dd… S )Nz!IrB   rE   )rË   r  r\  ©r´   r2   r2   r3   Úhashret;  s    zDHCP6.hashret)rµ   r¶   r·   r1   r   Ú
dhcp6typesr   rÁ   r#   Úoverload_fieldsrc  r2   r2   r2   r3   r[  5  s   
ÿr[  c                   @   s@   e Zd ZdZeddeƒeddddd�edeƒ e	d	d
„ d�gZ
dS )r…   zDHCP6 Relay Message OptionrÝ   rJ   rÞ   NrÊ   Úmessager5  c                 C   s   | j S r.   rã   )r0  r2   r2   r3   ræ   I  rØ   zDHCP6OptRelayMsg.<lambda>rç   )rµ   r¶   r·   r1   r   rê   r   r   r[  rV   rÁ   r2   r2   r2   r3   r…   C  s   
ÿ
ÿýc                   @   s"   e Zd ZdZdZedddœiZdS )r5   zDHCPv6 Solicit MessagerB   r]  r^  r_  N©rµ   r¶   r·   r1   r:  r#   re  r2   r2   r2   r3   r5   f  s   c                   @   s*   e Zd ZdZdZedddœiZdd„ ZdS )	r6   zDHCPv6 Advertise MessagerC   r^  r]  r_  c                 C   s    t |tƒo|jdko| j|jkS rV  )Ú
isinstancer5   r:  r\  ©r´   Úotherr2   r2   r3   Úanswersy  s
    
ÿ
þzDHCP6_Advertise.answersN©rµ   r¶   r·   r1   r:  r#   re  rk  r2   r2   r2   r3   r6   t  s   c                   @   s   e Zd ZdZdZdS )r7   zDHCPv6 Request MessagerD   N©rµ   r¶   r·   r1   r:  r2   r2   r2   r3   r7   �  s   c                   @   s   e Zd ZdZdZdS )r8   zDHCPv6 Confirm MessagerE   Nrm  r2   r2   r2   r3   r8   �  s   c                   @   s   e Zd ZdZdZdS )r9   zDHCPv6 Renew MessagerF   Nrm  r2   r2   r2   r3   r9   ³  s   c                   @   s   e Zd ZdZdZdS )r:   zDHCPv6 Rebind MessagerG   Nrm  r2   r2   r2   r3   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DHCPv6 Reply MessagerH   r^  r]  r_  c                 C   s*   t tttttttf}t||ƒo(| j	|j	kS r.   )
r5   r?   r8   r:   r=   r7   r<   r9   rh  r\  )r´   rj  Útypesr2   r2   r3   rk  à  s    ÿzDHCP6_Reply.answersNrl  r2   r2   r2   r3   r;   Ú  s   c                   @   s   e Zd ZdZdZdS )r<   zDHCPv6 Release MessagerI   Nrm  r2   r2   r2   r3   r<   î  s   c                   @   s   e Zd ZdZdZdS )r=   zDHCPv6 Decline MessagerJ   Nrm  r2   r2   r2   r3   r=   ý  s   c                   @   s"   e Zd ZdZdZedddœiZdS )r>   zDHCPv6 Reconfigure MessagerK   r^  r]  r_  Nrg  r2   r2   r2   r3   r>     s   c                   @   s   e Zd ZdZdZdS )r?   z"DHCPv6 Information Request MessagerL   Nrm  r2   r2   r2   r3   r?   !  s   c                   @   sL   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
œiZ
dd„ ZdS )r@   z9DHCPv6 Relay Forward Message (Relay Agent/Server Message)r:  rM   ÚhopcountNÚlinkaddrrô   Úpeeraddrr^  r_  c                 C   s   t tj| jƒS r.   ©r*   r#  r$  rq  rb  r2   r2   r3   rc  ;  s    zDHCP6_RelayForward.hashret)rµ   r¶   r·   r1   r   rd  r   r%   rÁ   r#   re  rc  r2   r2   r2   r3   r@   3  s   
ýc                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )rA   z7DHCPv6 Relay Reply Message (Relay Agent/Server Message)rN   c                 C   s   t tj| jƒS r.   rr  rb  r2   r2   r3   rc  U  s    zDHCP6_RelayReply.hashretc                 C   s.   t |tƒo,| j|jko,| j|jko,| j|jkS r.   )rh  r@   ro  rp  rq  ri  r2   r2   r3   rk  X  s    

ÿ
þ
ýzDHCP6_RelayReply.answersN)rµ   r¶   r·   r1   r:  rc  rk  r2   r2   r2   r3   rA   Q  s   ra  r^  r]  c                   @   s>   e Zd ZdZdZdd„ Zddd„Zdd„ Zdd„ Zdd„ Z	d	S )Ú	DHCPv6_amZdhcp6dzudp and port 546 and port 547c                 C   s   d}t |ƒ d S )Na·  
DHCPv6_am.parse_options( dns="2001:500::1035", domain="localdomain, local",
        duid=None, iface=conf.iface, advpref=255, sntpservers=None,
        sipdomains=None, sipservers=None,
        nisdomain=None, nisservers=None,
        nispdomain=None, nispservers=None,
        bcmcsdomains=None, bcmcsservers=None)

   debug : When set, additional debugging information is printed.

   duid   : some DUID class (DUID_LLT, DUID_LL or DUID_EN). If none
            is provided a DUID_LLT is constructed based on the MAC
            address of the sending interface and launch time of dhcp6d
            answering machine.

   iface : the interface to listen/reply on if you do not want to use
           conf.iface.

   advpref : Value in [0,255] given to Advertise preference field.
             By default, 255 is used. Be aware that this specific
             value makes clients stops waiting for further Advertise
             messages from other servers.

   dns : list of recursive DNS servers addresses (as a string or list).
         By default, it is set empty and the associated DHCP6OptDNSServers
         option is inactive. See RFC 3646 for details.
   domain : a list of DNS search domain (as a string or list). By default,
         it is empty and the associated DHCP6OptDomains option is inactive.
         See RFC 3646 for details.

   sntpservers : a list of SNTP servers IPv6 addresses. By default,
         it is empty and the associated DHCP6OptSNTPServers option
         is inactive.

   sipdomains : a list of SIP domains. By default, it is empty and the
         associated DHCP6OptSIPDomains option is inactive. See RFC 3319
         for details.
   sipservers : a list of SIP servers IPv6 addresses. By default, it is
         empty and the associated DHCP6OptSIPDomains option is inactive.
         See RFC 3319 for details.

   nisdomain : a list of NIS domains. By default, it is empty and the
         associated DHCP6OptNISDomains option is inactive. See RFC 3898
         for details. See RFC 3646 for details.
   nisservers : a list of NIS servers IPv6 addresses. By default, it is
         empty and the associated DHCP6OptNISServers option is inactive.
         See RFC 3646 for details.

   nispdomain : a list of NIS+ domains. By default, it is empty and the
         associated DHCP6OptNISPDomains option is inactive. See RFC 3898
         for details.
   nispservers : a list of NIS+ servers IPv6 addresses. By default, it is
         empty and the associated DHCP6OptNISServers option is inactive.
         See RFC 3898 for details.

   bcmcsdomain : a list of BCMCS domains. By default, it is empty and the
         associated DHCP6OptBCMCSDomains option is inactive. See RFC 4280
         for details.
   bcmcsservers : a list of BCMCS servers IPv6 addresses. By default, it is
         empty and the associated DHCP6OptBCMCSServers option is inactive.
         See RFC 4280 for details.

   If you have a need for others, just ask ... or provide a patch.)Úprint)r´   Úmsgr2   r2   r3   Úusageg  s    ?zDHCPv6_am.usageú2001:500::1035úlocaldomain, localú2001:db8::1ú2001:db8::20Nr   r  c                    sN  ‡fdd„}ˆ d u rt j‰ |ˆ_i ˆ_|dddd„ f|ddd	d„ f|d
ddd„ f|dddd„ f|dddd„ f|
dddd„ f|	dddd„ f|dddd„ f|dddd„ f|dd d!d„ f|d"d#d$d„ ffD ]D}||d% |d& ƒ}|d'krè d(S |d u ròqÄ|d) |ƒˆj|d* < qÄˆj�rJtd+ƒ tˆjƒ}|D ] }td,|tˆj| ƒf ƒ �q(|ˆ_|ˆ_|ˆ_	ˆ ˆ_|d u�rt|ˆ_
nLd-}t |¡t }t ¡ | }tˆ ƒd& }d. d/d0„ |D ƒ¡}t||d1�ˆ_
ˆj�rÞtd2ƒ ˆj
jd3d4� d ˆ_zt‡ fd5d0„tƒ D ƒƒ}W n" ttf�y"   td6ƒ Y d S 0 |d% ˆ_i ˆ_ˆj�rJtd7ˆj ƒ d S )8Nc                    sX   | d u rd S t | tƒr| S t | tƒr<|  d¡}dd„ |D ƒS td| ƒ ˆ  ¡  dS d S )Nú,c                 S   s   g | ]}|  ¡ ‘qS r2   )Ústripr*  r2   r2   r3   Ú
<listcomp>¶  rØ   z>DHCPv6_am.parse_options.<locals>.norm_list.<locals>.<listcomp>zBad '%s' parameter provided.éÿÿÿÿ)rh  ÚlistÚstrÚsplitrt  rv  )ÚvalÚ
param_namer.  rb  r2   r3   Ú	norm_list¯  s    


z*DHCPv6_am.parse_options.<locals>.norm_listÚdnsr`   c                 S   s
   t | d�S )N)r?  )r’   rS  r2   r2   r3   ræ   Ä  rØ   z)DHCPv6_am.parse_options.<locals>.<lambda>Údomainra   c                 S   s
   t | d�S )N)r@  )r“   rS  r2   r2   r3   ræ   Å  rØ   rJ  rh   c                 S   s
   t | d�S )N)rJ  )rš   rS  r2   r2   r3   ræ   Æ  rØ   r=  r_   c                 S   s
   t | d�S )N)r=  )r‘   rS  r2   r2   r3   ræ   Ç  rØ   r;  r^   c                 S   s
   t | d�S )N)r;  )r�   rS  r2   r2   r3   ræ   È  rØ   rE  rd   c                 S   s
   t | d�S )N)rE  )r–   rS  r2   r2   r3   ræ   É  rØ   rG  rf   c                 S   s   t | dg d d�S )NrÅ   r   )rG  )r˜   rS  r2   r2   r3   ræ   Ê  rØ   rF  re   c                 S   s
   t | d�S )N)rF  )r—   rS  r2   r2   r3   ræ   Ë  rØ   rI  rg   c                 S   s   t | dg d d�S )NrÅ   r   )rI  )r™   rS  r2   r2   r3   ræ   Ì  rØ   rM  rj   c                 S   s
   t | d�S )N)rM  )r�   rS  r2   r2   r3   ræ   Í  rØ   rL  rk   c                 S   s
   t | d�S )N)rL  )rœ   rS  r2   r2   r3   ræ   Î  rØ   r   rB   r~  FrD   rC   z#
[+] List of active DHCPv6 options:z
    %d: %sr±   ú:c                 s   s   | ]}d t |ƒ V  qdS )z%.02xN)r
   r*  r2   r2   r3   r  ö  rØ   z*DHCPv6_am.parse_options.<locals>.<genexpr>)r½   r¾   z
[+] Our server DUID:z    )Z	label_lvlc                 3   s*   | ]"}|d  ˆ krt |d ƒr|V  qdS )rC   r   N)r-   r*  )Úifacer2   r3   r    rØ   z"Unable to get a Link-Local addressz#
[+] Starting DHCPv6 service on %s:)r   rˆ  ÚdebugÚdhcpv6_optionsrt  ÚsortedÚreprÚadvprefÚstartipÚendiprî   ÚtimeÚmktimer   r   r  rº   ÚshowÚsrc_addrÚnextr   ÚStopIterationÚRuntimeErrorr   Zleases)r´   r…  r†  rŽ  r�  rî   rJ  r;  r=  rG  rE  rI  rF  rM  rL  rˆ  r‰  r�  r„  rì   rÏ   ÚoptsÚir²   Údeltar½   ZrawmacÚmacró   r2   )rˆ  r´   r3   Úparse_options©  sj    ö


zDHCPv6_am.parse_optionsc                    sö  t |vrdS |t  j}|t  j}t|tƒr>|jdks>|jdkrBdS |j}t|tƒsVdS |jdvrddS |jdks‚|jdks‚|jdkr²t	|vs’t
|v r–dS |jdksª|jdkr®dS �n@|jdksÒ|jd	ksÒ|jd
k�r>t
|vsât	|vrædS |t
 j}t|t| jƒƒ�sdS t|ƒt| jƒk�rdS |jd	k�s6|jd
k�ròdS �n´|jdk�r|| j�sVdS tj‰ tjˆ  }tjˆ  }tj‰tj}t|ƒ}|�rª|dk�rªd| | ˆ d }nd}ˆ | ˆ }|}g }	|�rg }
t|tƒ�rà|j}
nt|tƒ�rò|j}
|	dd„ |
D ƒ7 }	|j}�qÂ‡ ‡fdd„|	D ƒ}	| j�rx|d ˆ d | d ˆ }|dˆ  | | d 7 }|d |	¡ˆ 7 }t|ƒ dS |jdk�rît
|v �rÊ|t
 j}t|t| jƒƒ�s²dS t|ƒt| jƒk�rÊdS t|v �sèt|v �sèt|v �ròdS ndS dS )NFr]  r^  )rB   rD   rE   rF   rG   rI   rJ   rL   rB   rG   rE   rD   rF   rI   rJ   ÚUNKNOWNú [ú]rÅ   c                 S   s   g | ]}t |tƒr|j‘qS r2   )rh  r�   ró   r*  r2   r2   r3   r}  c  rØ   z(DHCPv6_am.is_request.<locals>.<listcomp>c                    s   g | ]}ˆ | ˆ ‘qS r2   r2   r*  ©ÚboÚnr2   r3   r}  f  rØ   z[DEBUG]z
 Received ZDeclinez from z for r
  rL   T)r'   ÚsrcrÎ   rh  r#   r`  ra  r[  r:  r}   r~   rî   r»   r	   r‰  r+   ÚboldÚgreenÚblueÚnormalÚredr,   r   rû   r€   r  r  rt  r”   )r´   r0  r¢  rî   ÚgÚbr  ÚvendorÚitÚaddrsr/  ru  r2   rŸ  r3   Ú
is_request  s®    




ÿþÿ
ÿ
ÿþÿ
ÿ





ÿþzDHCPv6_am.is_requestc                 C   sÆ   dd„ }|d u rd S t j}t j| }t j| }t j}||| t¡jjƒ | }| t	¡j
}	t|	ƒ}
|
r„|
dkr„d| |
 | d }
nd}
||	 | }	||| t¡jjƒ | }td|||	|
f ƒ d S )Nc                 S   s0   |   d¡r| dd … } |  d¡r,| d d… } | S )NzDHCPv6 rH   z Messageiøÿÿÿ)Ú
startswithÚendswith)rÙ   r2   r2   r3   ÚnormŒ  s
    

z#DHCPv6_am.print_reply.<locals>.normrœ  r�  rž  rÅ   z!Sent %s answering to %s from %s%s)r+   r£  r¤  r¥  r¦  Zgetlayerr#   rÎ   r1   r'   r¢  r,   rt  )r´   ÚreqZreplyr°  r   r¨  r©  r¡  ZreqtypeZreqsrcrª  Zreptyper2   r2   r3   Úprint_reply‹  s     

zDHCPv6_am.print_replyc                    sð  |t  }|j}|jj}|j}|j}‡ fdd„}|dk�rš|t j}t ˆ j|d�}|tddd� }| 	t
¡r¢|t|d� }|t
ƒ  }|tˆ jd	� }|t|d	� }nô| 	t¡s¶| 	t¡rød
}	|t|d� }|td|	d� }|tˆ jd	� }|t|d	� }nž| 	t¡�rFd}	|t|d� }|td|	d� }|tˆ jd	� }|t|d	� }nP|t|d� }|tˆ jd� }|tˆ jd	� }|t|d	� }|tƒ  }|||ƒ |S |dk�r|t j}t ˆ j|d�}|tddd� }|t|d� }|tˆ jd	� }|t|d	� }|||ƒ |S |dk�rnÚ|dk�rnÎ|dk�r*nÂ|dk�r6n¶|dk�rBnª|dk�rìd }| 	t¡�snˆ j�rxtdƒ n
|t j}t ˆ j|d�}|tddd� }|t|d� }|tˆ jd	� }|�rÈ|t|d	� }t ˆ j¡D ]\}
}|| }�qÔ|S d S )Nc                    sb   g }|   t¡r@| t j}t ˆ j¡D ]\}}||v r$|| }q$nt ˆ j¡D ]\}}|| }qLdS )z?
            Include options from the DHCPv6 query
            N)Úhaslayerr‚   r  ÚsixÚ	iteritemsrŠ  )ÚqueryZanswerr  rì   rÏ   rb  r2   r3   Ú_include_options¯  s    

z.DHCPv6_am.make_reply.<locals>._include_optionsrB   )r¢  Údstr^  r]  r_  )r\  )rî   z1Scapy6 dhcp6d does not support address assignmentrC   )r&  r%  z0Scapy6 dhcp6d does not support prefix assignmentrG   )r  rD   rE   rF   rI   rJ   rL   z6Received Info Request message without Client Id option)r'   r¢  rÎ   r:  r\  r}   rî   r“  r#   r³  r‰   r;   r~   r   r€   r6   rˆ   r”   rƒ   r�  r�   r5   r‰  r   r´  rµ  rŠ  )r´   r±  r0  Zreq_srcr:  r\  r·  Zclient_duidÚrespru  rì   rÏ   r2   rb  r3   Ú
make_reply¦  sŽ    




ÿ












zDHCPv6_am.make_reply)rw  rx  ry  rz  NNNNNNNNNNNr   r  )
rµ   r¶   r·   Zfunction_nameÚfilterrv  r›  r­  r²  rº  r2   r2   r2   r3   rs  c  s   B      û
g{rs  )´rÛ   Ú
__future__r   r#  rË   r�  Zscapy.ansmachiner   Z
scapy.archr   r   Zscapy.configr   Z
scapy.datar   r   Zscapy.compatr	   r
   Zscapy.errorr   Zscapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Zscapy.layers.dnsr"   Zscapy.layers.inetr#   Zscapy.layers.inet6r$   r%   r&   r'   Zscapy.packetr(   r)   Zscapy.pton_ntopr*   Zscapy.themesr+   Zscapy.utils6r,   r-   Zscapy.libs.sixZlibsr´  r4   rQ   rV   Z!All_DHCP_Relay_Agents_and_ServersZAll_DHCP_Serversrê   rÍ   rd  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)  r3  rŠ   r6  r7  r‹   r8  rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r•   r”   r–   r—   r˜   r™   rš   rK  ZIRT_MINIMUMr›   rœ   r�   rU  rO  rQ  rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   ZDHCP6RelayAgentUnicastAddrZDHCP6RelayHopCountZDHCP6ServerUnicastAddrZDHCP6ClientUnicastAddrZDHCP6ClientIA_TAZDHCP6ClientIA_NAZDHCP6ClientIAIDrþ   rÿ   ZDHCP6ServerDUIDZDHCP6CurrentTransactionIDZDHCP6PrefValr[  r…   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rs  r2   r2   r2   r3   Ú<module>	   s‚  \ôÏ4Ê;ôýß$ý
(	+üþÿ
	ú	
	ý
	
		#