
    h.                       d 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l.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z> d Z?ddddddddddddd d!Z@d" ZAd#ZBd$ZCi d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFi dGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhi didjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddiZDi d%dd'dd)dd+dd-dd/dd1dd3dd5dd7dd9dd;dd=dd?ddAddCddEdi dGddIddKddMddOddQddSddUddWddYdd[dd]dd_ddaddcddeddidi dkddmddoddqddsdddduddwddydd{dd}dddddddddddddddiZEdddddddddddddd!ZFdddddӜZGi ddԓd%dՓd'd֓d)dדd+dؓd-dٓd/dړd1dۓd3dܓd5dݓddߓd7dd9dd;dd=dd?ddAdi dCddEddGddIddKddMddOddQddSddUddWddYdd[dd]dd_ddaddcdZH G d de"          ZI G d de          ZJ G d de4          ZK G d de4          ZL G d de4          ZM G d d e4          ZNdddd dӜZO G d de4          ZP G d deP          ZQ G d deP          ZRd ZS G d deP          ZT G d	 deT          ZU G d
 deP          ZV G d deP          ZW G d deP          ZX G d de!          ZY G d deP          ZZ G d deP          Z[ G d de          Z\ G d deP          Z]dddddZ^dddZ_ddiZ` G d deP          Za G d de0          Zb G d deP          Zcd d!d"d#d$d%d&d'Zd G d( deP          Ze G d) deP          Zf G d* d+e          Zg G d, d-e4          Zh G d. deP          Zi G d/ d0eg          Zj G d1 d2eh          Zk G d3 deP          Zl G d4 d5eP          Zm G d6 deP          Zn G d7 deP          Zo G d8 deP          Zp G d9 deP          Zq G d: deP          Zr G d; deP          Zs G d< deP          Zt G d= deP          Zu G d> deP          Zv G d? deP          Zw G d@ deP          Zx G dA deP          Zy G dB deP          Zz G dC deP          Z{ G dD deP          Z|dEZ}dFZ~ G dG deP          Z G dH deP          Z G dI deP          ZdJdKdLdMZ G dN dOe4          Z G dP dQeP          Z G dR deP          Z G dS deP          Z G dT deP          Z G dU deP          Z G dV deP          Z G dW deP          Z G dX deP          Z G dY deP          Z G dZ d[e4          Z G d\ d]e4          Z G d^ d_e4          Zeeed`Zda Z G db deP          Z G dc deP          Z G dd deP          Z G de deP          Z G df deP          Z G dg deP          Z G dh deP          Z G di deP          Z G dj deP          Z G dk deP          ZdlZdlZdlZdlZdlZdlZdlZdlZdlZdlZdlZdlZ G dm dneP          Z G do deP          Z G dp de          Z G dq de          Z G dr de          Z G ds de          Z G dt de          Z G du de          Z G dv de          Z G dw de          Z G dx de          Z G dy de          Z G dz de          Z G d{ dePe4          Z G d| d e          Z e5e-eAd}d~i            e5e-eAd}di            G d de          ZdS (  zG
DHCPv6: Dynamic Host Configuration Protocol for IPv6. [RFC 3315,8415]
    N)AnsweringMachine)get_if_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)send)Color)in6_addrtovendorin6_islladdrc                 F    t                                          | |          S N)globalsget)namefallback_clss     V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/dhcp6.pyget_clsr6   ,   s    99==|,,,    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                     t           j        }t          |           dk    rFt          t                              t          | d                   d          t           j                  } || g|R i |S )NrF   r   Raw)r   	raw_layerlenr6   dhcp6_cls_by_typer2   r
   )xargskargsclss       r5   _dhcp6_dispatcherr[   ?   sd    
.C
1vv{{'++C!IIu==t~NN3q!4!!!5!!!r7   z	ff02::1:2z	ff05::1:3rE   CLIENTIDrF   SERVERIDrG   IA_NArH   IA_TArI   IAADDRrJ   OROrK   
PREFERENCErL   ELAPSED_TIMErM   	RELAY_MSGrO   AUTHrP   UNICASTrQ   STATUS_CODE   RAPID_COMMIT   
USER_CLASS   VENDOR_CLASS   VENDOR_OPTS   INTERFACE_ID   
RECONF_MSG   RECONF_ACCEPT   zSIP Servers Domain Name List   zSIP Servers IPv6 Address List   z DNS Recursive Name Server Option   zDomain Search List option   OPTION_IA_PD   OPTION_IAPREFIX   OPTION_NIS_SERVERS   OPTION_NISP_SERVERS   OPTION_NIS_DOMAIN_NAME   OPTION_NISP_DOMAIN_NAME   OPTION_SNTP_SERVERS    OPTION_INFORMATION_REFRESH_TIME!   OPTION_BCMCS_SERVER_D"   OPTION_BCMCS_SERVER_A$   OPTION_GEOCONF_CIVIC%   OPTION_REMOTE_ID&   OPTION_SUBSCRIBER_ID'   OPTION_CLIENT_FQDN(   OPTION_PANA_AGENT)   OPTION_NEW_POSIX_TIMEZONE*   OPTION_NEW_TZDB_TIMEZONE0   OPTION_LQ_CLIENT_LINK8   OPTION_NTP_SERVER;   OPT_BOOTFILE_URL<   OPT_BOOTFILE_PARAM=   OPTION_CLIENT_ARCH_TYPE>   
OPTION_NIIA   OPTION_ERP_LOCAL_DOMAIN_NAMEB   OPTION_RELAY_SUPPLIED_OPTIONSD   
OPTION_VSSO   OPTION_CLIENT_LINKLAYER_ADDRg   OPTION_CAPTIVE_PORTALp   OPTION_MUD_URL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DHCP6OptNTPServerDHCP6OptBootFileUrlDHCP6OptBootFileParamDHCP6OptClientArchTypeDHCP6OptClientNetworkInterIdDHCP6OptERPDomainDHCP6OptRelaySuppliedOptDHCP6OptVSSDHCP6OptClientLinkLayerAddrDHCP6OptCaptivePortalDHCP6OptMudUrlSOLICIT	ADVERTISEREQUESTCONFIRMRENEWREBINDREPLYRELEASEDECLINERECONFIGUREzINFORMATION-REQUESTz
RELAY-FORWz
RELAY-REPLzLink-layer address plus timez4Vendor-assigned unique ID based on Enterprise NumberzLink-layer AddressUUID)rE   rF   rG   rH   zNET/ROM pseudozEthernet (10Mb)zExperimental Ethernet (3Mb)zAmateur Radio AX.25zProteon ProNET Token RingChaoszIEEE 802 NetworksARCNETHyperchannelLanstarrN   zAutonet Short Address	LocalTalkz&LocalNet (IBM PCNet or SYTEK LocalNET)z
Ultra linkSMDSzFrame Relayz$Asynchronous Transmission Mode (ATM)HDLCzFibre ChannelzSerial LinezMIL-STD-188-220MetricomzIEEE 1394.1995MAPOS	TwinaxialzEUI-64HIPARPzIP and ARP over ISO 7816-3ARPSeczIPsec tunnelzInfiniBand (TM)z-TIA-102 Project 25 Common Air Interface (CAI)c                       e Zd Zd ZdS )_UTCTimeFieldc                 8    d}t          j        | g|R d|i| d S )N	i  rE   rE   r   r   r   rI   rE   r   epoch)r   __init__)selfrX   rY   
epoch_2000s       r5   r  z_UTCTimeField.__init__  s3    3
dEtEEE*EuEEEEEr7   N)__name__
__module____qualname__r   r7   r5   r  r    s(        F F F F Fr7   r  c                       e Zd ZdS )_LLAddrFieldNr  r	  r
  r  r7   r5   r  r            Dr7   r  c                   r    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typerE   hwtypetimevalr   lladdrN)r  r	  r
  r3   r   	duidtypesr   duidhwtypesr  r  r   fields_descr  r7   r5   r  r    sZ        0D!>&!Y77"?8Q<< =A..<)446KKKr7   r  c                   \    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  rF   enterprisenumi7  id N)
r  r	  r
  r3   r   r  r   r!   r   r  r  r7   r5   r  r    sL        AD!>&!Y77<6MNN8D"%%'KKKr7   r  c                   \    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  rG   r  rE   r  N)r  r	  r
  r3   r   r  r   r  r  r   r  r  r7   r5   r  r    sK        /D!>&!Y77"?8Q<<<)446KKKr7   r  c                   R    e Zd ZdZ edde           eddej                  gZdS )	DUID_UUIDzDUID - Based on UUIDr  rH   uuidN)uuid_fmt)	r  r	  r
  r3   r   r  r   	FORMAT_BEr  r  r7   r5   r!  r!  $  sC        !D!>&!Y779VTI4GHHHJKKKr7   r!  c                   *    e Zd Zed             Zd ZdS )_DHCP6OptGuessPayloadc                     t          |          dk    rt          j        S t          j        d|d d                   d         }t
                              |d           }|| S t          ||           S NrF   !Hr   )rU   r   rT   structunpackdhcp6opts_by_coder2   r6   )rZ   payloadoptclsnames       r5   _just_guess_payload_classz/_DHCP6OptGuessPayload._just_guess_payload_class5  sj     w<<1>!mD'"1"+..q1#''T22?Jw$$$r7   c                 B    t                               t          |          S r0   )r&  r0  DHCP6OptUnknownr  r-  s     r5   guess_payload_classz)_DHCP6OptGuessPayload.guess_payload_class@  s"     %>>
 
 	
r7   N)r  r	  r
  staticmethodr0  r4  r  r7   r5   r&  r&  4  s<        % % \%
 
 
 
 
r7   r&  c                   0    e Zd ZdZedd            Z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                 B    |                      t          j        |          S r0   )r0  r   rT   )rZ   r-  rX   rY   s       r5   dispatch_hookz&_DHCP6OptGuessPayloadElt.dispatch_hookO  s    ,,T^WEEEr7   c                 
    d|fS Nr7   r  r  ss     r5   extract_paddingz(_DHCP6OptGuessPayloadElt.extract_paddingS      Avr7   r0   )r  r	  r
  __doc__classmethodr9  r>  r  r7   r5   r7  r7  I  sQ         
 F F F [F    r7   r7  c                   f    e Zd ZdZ edde           edddd           edd	d
           gZdS )r2  zUnknown DHCPv6 Optionoptcoder   optlenNdatar)  	length_offmtr  c                     | j         S r0   rD  pkts    r5   <lambda>zDHCP6OptUnknown.<lambda>\      sz r7   length_from	r  r	  r
  r3   r   	dhcp6optsr   r   r  r  r7   r5   r2  r2  W  sc        "D!>)Q	:: =46tLLL;vr+A+AC C CDKKKr7   r2  c                    t           j        }t          |           dk    r`t          j        d| d d                   d         }t          t                              |t           j                  t           j                  } ||           S )NrH   r)  rF   r   )r   rT   rU   r*  r+  r6   duid_clsr2   )rW   rZ   os      r5   _duid_dispatcherrV  _  sd    
.C
1vvzzM$"1"&&q)hll1dn55t~FF3q66Mr7   c                   h    e Zd ZdZ edde           edddd           edd	ed
           gZ	dS )r   zDHCP6 Client Identifier OptionrC  rE   rD  Nduidr)  rF  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptClientId.<lambda>l      #* r7   rO  )
r  r	  r
  r3   r   rR  r   r   rV  r  r  r7   r5   r   r   g  sf        +D!>)Q	:: =46tLLL!>&".>.D.DF F FGKKKr7   c                       e Zd ZdZdZdS )r   zDHCP6 Server Identifier OptionrF   N)r  r	  r
  r3   rC  r  r7   r5   r   r   o  s        +DGGGr7   c                       e Zd ZdZ edde           e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           gZd ZdS )r   z2DHCP6 IA Address Option (IA_TA or IA_NA suboption)rC  rI   rD  N
iaaddroptsr)  c                     |dz   S Nry   r  rL  rW   s     r5   rM  zDHCP6OptIAAddress.<lambda>{  
    R r7   rG  rH  adjustaddr::preflftr       infinityvalidlftc                     | j         dz
  S r_  rJ  rK  s    r5   rM  zDHCP6OptIAAddress.<lambda>      3:? r7   rO  c                     t           j        S r0   r   padding_layerr3  s     r5   r4  z%DHCP6OptIAAddress.guess_payload_class      !!r7   )r  r	  r
  r3   r   rR  r   r%   r   r   r7  r  r4  r  r7   r5   r   r   w  s        ?D!>)Q	:: =4<%)2G2GI I I8FD))<	1z:.FGG<
A
J/GHH #?<#;/J/JL L LMK" " " " "r7   c                       e Zd ZdZ edde           eddddd 	           ed
d           edd           edd           e	dg e
d           gZdS )r   z=DHCP6 Identity Association for Non-temporary Addresses OptionrC  rG   rD  Nianaoptsr)  c                     |dz   S NrP   r  r`  s     r5   rM  zDHCP6OptIA_NA.<lambda>  ra  r7   rb  iaidT1T2c                     | j         dz
  S rs  rJ  rK  s    r5   rM  zDHCP6OptIA_NA.<lambda>  rk  r7   rO  r  r	  r
  r3   r   rR  r   r   r   r   r7  r  r  r7   r5   r   r     s        JD!>)Q	:: =4:%)2G2GI I I9VT**8D$''8D$''"?:r3K/J/JL L LMKKKr7   c            	           e Zd ZdZ edde           eddddd 	           ed
d           edg e	d           gZ
dS )r   z9DHCP6 Identity Association for Temporary Addresses OptionrC  rH   rD  Niataoptsr)  c                     |dz   S NrH   r  r`  s     r5   rM  zDHCP6OptIA_TA.<lambda>  s
    Q r7   rb  rt  c                     | j         dz
  S r|  rJ  rK  s    r5   rM  zDHCP6OptIA_TA.<lambda>      3:> r7   rO  )r  r	  r
  r3   r   rR  r   r   r   r7  r  r  r7   r5   r   r     s        FD!>)Q	:: =4:%)2F2FH H H9VT**"?:r3K/I/IK K K	LKKKr7   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	_OptReqListFieldrE   c                     |sg S |S r0   r  r  rL  rW   s      r5   i2hz_OptReqListField.i2h  s     	Ir7   c                 &    dt          |          z  S NrF   rU   r  s      r5   i2lenz_OptReqListField.i2len  s    3q66zr7   c                     |S r0   r  r  s      r5   any2iz_OptReqListField.any2i  s    r7   c                     g }|                      ||          D ]D}|t          v r!|                    t          |                    ,|                    d|z             Edd                    |          z  S )Nz%dz[%s], )r  rR  appendjoin)r  rL  rW   r=  ys        r5   i2reprz_OptReqListField.i2repr  st    #q!! 	# 	#AI~~1&&&&""""		!$$r7   c                    g }t          |          dk    rwt          |          dk     rt          d           |S |                    t          j        d|d d                   d                    |dd          }t          |          dk    w|S )Nr   rF   z:Odd length for requested option field. Rejecting last byter)  )rU   r   r  r*  r+  )r  rL  rW   rs       r5   m2iz_OptReqListField.m2i  s    !ffkk1vvzzTUUUHHV]42A2//2333!""A !ffkk r7   c                 @    d                     d |D                       S )Nr7   c              3   @   K   | ]}t          j        d |          V  dS )r)  N)r*  pack).0r  s     r5   	<genexpr>z'_OptReqListField.i2m.<locals>.<genexpr>  s.      88D!,,888888r7   )r  r  s      r5   i2mz_OptReqListField.i2m  s#    xx88a888888r7   N)
r  r	  r
  islistr  r  r  r  r  r  r  r7   r5   r  r    ss        F  
    % % %  9 9 9 9 9r7   r  c                   j    e Zd ZdZ edde           edddd           edd	d
gd           gZdS )r   zDHCP6 Option Request OptionrC  rJ   rD  Nreqoptsr)  rF  rx   ry   c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptOptReq.<lambda>      CJ r7   rO  	r  r	  r
  r3   r   rR  r   r  r  r  r7   r5   r   r     sh        (D!>)Q	:: =49$OOO##IBx0F0FH H HIKKKr7   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	r   zDHCP6 Preference OptionrC  rK   rD  rE   prefval   N	r  r	  r
  r3   r   rR  r   r   r  r  r7   r5   r   r     sI        $D!>)Q	:::h**9Y,,.KKKr7   c                       e Zd Zd ZdS )_ElapsedTimeFieldc                 J    |dk    rdS d|                      ||          dz  z  S )Ni  zinfinity (0xffff)z%.2f secg      Y@)r  r  s      r5   r  z_ElapsedTimeField.i2repr  s/    ;;&&TXXc1--455r7   N)r  r	  r
  r  r  r7   r5   r  r    s#        6 6 6 6 6r7   r  c                   Z    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 OptionrC  rL   rD  rF   elapsedtimer   N)	r  r	  r
  r3   r   rR  r   r  r  r  r7   r5   r   r     sJ        &D!>)Q	:::h**$$]A668KKKr7   zconfiguration tokenzdelayed authenticationz!delayed authentication (obsolete)zreconfigure key)r   rE   rF   rG   zHMAC-MD5)r   rE   z'use of a monotonically increasing valuec                       e Zd ZdZ edde           e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           gZdS )r   zDHCP6 Option - AuthenticationrC  rO   rD  Nauthinfor)  c                     |dz   S NrO   r  r`  s     r5   rM  zDHCP6OptAuth.<lambda>#  ra  r7   rb  protorG   algrE   rdmr   replays           rL   r  c                     | j         dz
  S r  rJ  rK  s    r5   rM  zDHCP6OptAuth.<lambda>)  s    szB r7   rO  )r  r	  r
  r3   r   rR  r   r   _dhcp6_auth_proto_dhcp6_auth_alg_dhcp6_auth_rdmr   r   r  r  r7   r5   r   r     s        *D!>)R;; =4:%)2G2GI I I =!->?? =?;; =?;;##Hk1==;z2+F+FH H HIKKKr7   c                       e Zd Zd Zd ZdS )_SrvAddrFieldc                     |dS |S )Nre  r  r  s      r5   r  z_SrvAddrField.i2h/  s    94r7   c                 ^    t          t          j        |                     ||                    S r0   )r*   socketAF_INET6r  r  s      r5   r  z_SrvAddrField.i2m4  s"    $((3*:*:;;;r7   N)r  r	  r
  r  r  r  r7   r5   r  r  .  s2          
< < < < <r7   r  c                   Z    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 OptionrC  rP   rD  rl   srvaddrN)	r  r	  r
  r3   r   rR  r   r  r  r  r7   r5   r   r   8  sI        (D!>)R;;:h++ =D113KKKr7   Success
UnspecFailNoAddrsAvail	NoBinding	NotOnLinkUseMulticastNoPrefixAvail)r   rE   rF   rG   rH   rI   rJ   c                       e Zd ZdZ edde           eddddd 	           ed
de           eddd           gZ	dS )r   zDHCP6 Status Code OptionrC  rQ   rD  N	statusmsgr)  c                     |dz   S r  r  r`  s     r5   rM  zDHCP6OptStatusCode.<lambda>N  s
    A r7   rb  
statuscoder  c                     | j         dz
  S r  rJ  rK  s    r5   rM  zDHCP6OptStatusCode.<lambda>Q      szA~ r7   rO  )
r  r	  r
  r3   r   rR  r   dhcp6statuscodesr   r  r  r7   r5   r   r   J  s        %D!>)R;; =4;%)2E2EG G G!>,6FGG;{B+E+EG G G	HKKKr7   c                   D    e Zd ZdZ edde           edd          gZdS )r   zDHCP6 Rapid Commit OptionrC  rh   rD  r   Nr  r	  r
  r3   r   rR  r   r  r  r7   r5   r   r   V  s:        &D!>)R;;:h**,KKKr7   c                       e Zd Zd Zd ZdS )_UserClassDataFieldc                 H    ||g k    rdS t          d |D                       S )Nr   c              3   N   K   | ] }t          t          |                    V  !d S r0   )rU   r	   r  rW   s     r5   r  z,_UserClassDataField.i2len.<locals>.<genexpr>b  s.      **13s1vv;;******r7   )sum)r  rL  zs      r5   r  z_UserClassDataField.i2len_  s1    9R1********r7   c                 d   |                      |          }g }|d |         ||d          }}t          |          dk    ro|                     ||          }t          j        |v r!|t          j                 }|j        }|j        `nd}|                    |           t          |          dk    o||fS )Nr   r  )	rP  rU   r  r   rn  load
underlayerr-  r  )	r  rL  r=  tmp_lenlstremainpaylppads	            r5   getfieldz_UserClassDataField.getfieldd  s    ""3'''{AghhK&kkAoof%%A!Q&&*+N**JJqMMM &kkAoo Syr7   N)r  r	  r
  r  r  r  r7   r5   r  r  ^  s2        + + +
    r7   r  c                   R    e Zd ZdZ eddd           eddd           gZd	 ZdS )
USER_CLASS_DATAzuser class datarU   NrE  rG  r  c                     | j         S r0   r  rK  s    r5   rM  zUSER_CLASS_DATA.<lambda>x  s    sw r7   rO  c                     t           j        S r0   rm  r3  s     r5   r4  z#USER_CLASS_DATA.guess_payload_classz  ro  r7   )r  r	  r
  r3   r   r   r  r4  r  r7   r5   r  r  t  se        D =???;vr+>+>@ @ @AK" " " " "r7   r  c                   h    e Zd ZdZ edde           edddd           edg ed	 
          gZ	dS )r   zDHCP6 User Class OptionrC  rj   rD  Nr)  userclassdatarH  rG  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptUserClass.<lambda>      sz r7   rO  )
r  r	  r
  r3   r   rR  r   r  r  r  r  r7   r5   r   r   ~  sm        $D!>)R;; =4T+:< < <&&O3I3IK K KLKKKr7   c                       e Zd ZdS )_VendorClassDataFieldNr  r  r7   r5   r  r    r  r7   r  c                       e Zd ZdZdS )VENDOR_CLASS_DATAzvendor class dataN)r  r	  r
  r3   r  r7   r5   r  r    s        DDDr7   r  c            	           e Zd ZdZ edde           eddddd 	           ed
de           e	dg e
d           gZdS )r   zDHCP6 Vendor Class OptionrC  rl   rD  Nvcdatar)  c                     |dz   S r|  r  r`  s     r5   rM  zDHCP6OptVendorClass.<lambda>  
    q1u r7   rb  r  c                     | j         dz
  S r|  rJ  rK  s    r5   rM  zDHCP6OptVendorClass.<lambda>      a r7   rO  )r  r	  r
  r3   r   rR  r   r   r!   r  r  r  r  r7   r5   r   r     s        &D!>)R;; =48(<(<> > >< 79 9((27H5O5OQ Q QRKKKr7   c                   h    e Zd ZdZ edd           eddd           eddd 	          gZd
 ZdS )VENDOR_SPECIFIC_OPTIONzvendor specific option datarC  NrD  optdatar  r  c                     | j         S r0   rJ  rK  s    r5   rM  zVENDOR_SPECIFIC_OPTION.<lambda>  rN  r7   rO  c                     t           j        S r0   rm  r3  s     r5   r4  z*VENDOR_SPECIFIC_OPTION.guess_payload_class  ro  r7   )	r  r	  r
  r3   r   r   r   r  r4  r  r7   r5   r  r    st        (D:i.. =49EEE;y"+A+AC C CDK
" " " " "r7   r  c            	           e Zd ZdZ edde           eddddd 	           ed
de           e	dg e
d           gZdS )r   z(DHCP6 Vendor-specific Information OptionrC  rn   rD  Nvsor)  c                     |dz   S r|  r  r`  s     r5   rM  z#DHCP6OptVendorSpecificInfo.<lambda>  r  r7   rb  r  c                     | j         dz
  S r|  rJ  rK  s    r5   rM  z#DHCP6OptVendorSpecificInfo.<lambda>  r  r7   rO  )r  r	  r
  r3   r   rR  r   r   r!   r  r  r  r  r7   r5   r   r     s        5D!>)R;; =45d(<(<> > >< 79 9((4J5O5OQ Q QRKKKr7   c                   f    e Zd ZdZ edde           edddd           edd	d
           gZdS )r   zDHCP6 Interface-Id OptionrC  rp   rD  Nr)  ifaceidr  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptIfaceId.<lambda>  rN  r7   rO  rQ  r  r7   r5   r   r     sj        &D!>)R;; =4T+46 6 6;y"+A+AC C CDKKKr7   c            	       b    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 OptionrC  rr   rD  rE   msgtyperO   zRenew MessagezInformation Request)rI   rO   N)	r  r	  r
  r3   r   rR  r   r   r  r  r7   r5   r   r     sa        -D!>)R;;:h** =BO5J1L 1L M MNKKKr7   c                   D    e Zd ZdZ edde           edd          gZdS )r   zDHCP6 Reconfigure Accept OptionrC  rt   rD  r   Nr  r  r7   r5   r   r     s:        ,D!>)R;;:h**,KKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z+DHCP6 Option - SIP Servers Domain Name ListrC  rv   rD  N
sipdomainsr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptSIPDomains.<lambda>  r  r7   rO  	r  r	  r
  r3   r   rR  r   r$   r  r  r7   r5   r   r     sb        8D!>)R;; =4<HHH&&|R3I3IK K KLKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z,DHCP6 Option - SIP Servers IPv6 Address ListrC  rw   rD  N
sipserversr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptSIPServers.<lambda>      
 r7   rO  	r  r	  r
  r3   r   rR  r   r&   r  r  r7   r5   r   r     sa        9D!>)R;; =4<HHH<b,B,BD D DEKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z(DHCP6 Option - DNS Recursive Name ServerrC  rx   rD  N
dnsserversr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptDNSServers.<lambda>  r  r7   rO  r  r  r7   r5   r   r     sa        5D!>)R;; =4<HHH<b,B,BD D DEKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z(DHCP6 Option - Domain Search List optionrC  ry   rD  N
dnsdomainsr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptDNSDomains.<lambda>  r  r7   rO  r  r  r7   r5   r   r     sb        5D!>)R;; =4<HHH&&|R3I3IK K KLKKKr7   c                       e Zd ZdZ edde           e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           gZd ZdS )r   zDHCP6 Option - IA Prefix optionrC  r|   rD  N
iaprefoptsc                     |dz   S Nrz   r  r`  s     r5   rM  zDHCP6OptIAPrefix.<lambda>  s
    q2v r7   rG  rc  rf  r   rg  rh  ri  plenr   prefixz
2001:db8::c                     | j         dz
  S r  rJ  rK  s    r5   rM  zDHCP6OptIAPrefix.<lambda>  rk  r7   rO  c                     t           j        S r0   rm  r3  s     r5   r4  z$DHCP6OptIAPrefix.guess_payload_class  ro  r7   )r  r	  r
  r3   r   rR  r   r   r   r%   r   r7  r  r4  r  r7   r5   r   r      s        ,D!>)R;; =4<(=(=? ? ?<	1z:.FGG<
A
J/GHH9VR((8Hl33 #?<#;/J/JL L LMK" " " " "r7   c                       e Zd ZdZ edde           eddddd 	           ed
d           edd           edd           e	dg e
d           gZdS )r   z9DHCP6 Option - Identity Association for Prefix DelegationrC  rz   rD  Niapdoptr)  c                     |dz   S rs  r  r`  s     r5   rM  zDHCP6OptIA_PD.<lambda>  ra  r7   rb  rt  ru  rv  c                     | j         dz
  S rs  rJ  rK  s    r5   rM  zDHCP6OptIA_PD.<lambda>  rk  r7   rO  rx  r  r7   r5   r   r     s        FD!>)R;; =49%)2G2GI I I9VT**8D$''8D$''"?9b2J/J/JL L LMKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   zDHCP6 Option - NIS ServersrC  r~   rD  N
nisserversr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptNISServers.<lambda>%  r  r7   rO  r  r  r7   r5   r   r      sa        'D!>)R;; =4<HHH<b,B,BD D DEKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   zDHCP6 Option - NIS+ ServersrC  r   rD  Nnispserversr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptNISPServers.<lambda>-  r  r7   rO  r  r  r7   r5   r   r   (  a        (D!>)R;; =4=III<r,B,BD D DEKKKr7   c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )r   zDHCP6 Option - NIS Domain NamerC  r   rD  N	nisdomainr  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptNISDomain.<lambda>5  rN  r7   rO  	r  r	  r
  r3   r   rR  r   r"   r  r  r7   r5   r   r   0  sa        +D!>)R;; =4;GGG;{B+A+AC C CDKKKr7   c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )r   zDHCP6 Option - NIS+ Domain NamerC  r   rD  N
nispdomainr  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptNISPDomain.<lambda>=  rN  r7   rO  r&  r  r7   r5   r   r   8  sa        ,D!>)R;; =4<HHH;|R+A+AC C CDKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   zDHCP6 option - SNTP ServersrC  r   rD  Nsntpserversr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptSNTPServers.<lambda>E  r  r7   rO  r  r  r7   r5   r   r   @  r"  r7   iQ iX  c                   Z    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 TimerC  r   rD  rH   reftimeN)
r  r	  r
  r3   r   rR  r   r   IRT_DEFAULTr  r  r7   r5   r   r   L  sI        4D!>)R;;:h**8I{335KKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z%DHCP6 Option - BCMCS Domain Name ListrC  r   rD  Nbcmcsdomainsr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptBCMCSDomains.<lambda>X  r  r7   rO  r  r  r7   r5   r   r   S  sb        2D!>)R;; =4>JJJ&&~r3I3IK K KLKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z#DHCP6 Option - BCMCS Addresses ListrC  r   rD  Nbcmcsserversr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptBCMCSServers.<lambda>`  r  r7   rO  r  r  r7   r5   r   r   [  sa        0D!>)R;; =4>JJJ<,B,BD D DEKKKr7   zDHCP serverzclosest network elementclient)r   rE   rF   c                   ^    e Zd Z edd           eddd           eddd 	          gZdS )
DHCP6OptGeoConfElementCAtyper   CAlengthNCAvaluer  r  c                     | j         S r0   )r:  rK  s    r5   rM  zDHCP6OptGeoConfElement.<lambda>n  s    s| r7   rO  )r  r	  r
  r   r   r   r  r  r7   r5   r8  r8  j  sZ        9Xq)) =TYGGG;y"+C+CE E EFKKKr7   r8  c            
           e Zd ZdZ edde           edddd            ed	d
e           e	ddd
           e
dg ed           gZdS )DHCP6OptGeoConfzDHCP6 Option - Civic LocationrC  r   rD  Nca_eltsc                     | dz   S NrG   r  rW   s    r5   rM  zDHCP6OptGeoConf.<lambda>u  s
    !a% r7   r  whatrF   country_codeFRc                     | j         dz
  S rA  rJ  rK  s    r5   rM  zDHCP6OptGeoConf.<lambda>y  r~  r7   rO  )r  r	  r
  r3   r   rR  r   r   _dhcp6_geoconf_whatr   r   r8  r  r  r7   r5   r>  r>  q  s        *D!>)R;; =49(79 9 9 =,?@@##ND!<<"?9b2H/I/IK K KLKKKr7   r>  c                       e Zd ZdZ edde           edddd            ed	de           e	dd
d           gZ
dS )r   z$DHCP6 Option - Relay Agent Remote-IDrC  r   rD  Nremoteidc                     |dz   S r|  r  r`  s     r5   rM  zDHCP6OptRemoteID.<lambda>  r  r7   r  r  r  c                     | j         dz
  S r|  rJ  rK  s    r5   rM  zDHCP6OptRemoteID.<lambda>  r  r7   rO  )r  r	  r
  r3   r   rR  r   r   r!   r   r  r  r7   r5   r   r   ~  s        1D!>)R;; =4:(<(<> > >< 79 9;z2+E+EG G GHKKKr7   c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )r   zDHCP6 Option - Subscriber IDrC  r   rD  Nsubscriberidr  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptSubscriberID.<lambda>  rN  r7   rO  rQ  r  r7   r5   r   r     sc        )D!>)R;; =4>JJJ ;~r+A+AC C C	DKKKr7   c            	           e Zd ZdZ edde           edddd            ed	d
d           edd
dd           e	ddd           gZ
dS )r   zDHCP6 Option - Client FQDNrC  r   rD  Nfqdnc                     |dz   S NrE   r  r`  s     r5   rM  zDHCP6OptClientFQDN.<lambda>  r  r7   r  resr   rI   flagsrG   SONr  c                     | j         dz
  S rR  rJ  rK  s    r5   rM  zDHCP6OptClientFQDN.<lambda>  r  r7   rO  )r  r	  r
  r3   r   rR  r   r   r   r"   r  r  r7   r5   r   r     s        'D!>)R;; =46(<(<> > >8E1a((:gq!U33;vr+E+EG G GHKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z&DHCP6 PANA Authentication Agent OptionrC  r   rD  Npaaaddrr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptPanaAuthAgent.<lambda>  r  r7   rO  r  r  r7   r5   r   r     sa        3D!>)R;; =49EEE<	2,B,BD D DEKKKr7   c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )r   zDHCP6 POSIX Timezone OptionrC  r   rD  Nr  r  r  c                     | j         S r0   rJ  rK  s    r5   rM  z!DHCP6OptNewPOSIXTimeZone.<lambda>  rN  r7   rO  rQ  r  r7   r5   r   r     sa        (D!>)R;; =49EEE;y"+A+AC C CDKKKr7   c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )r   zDHCP6 TZDB Timezone OptionrC  r   rD  Nr  r  r  c                     | j         S r0   rJ  rK  s    r5   rM  z DHCP6OptNewTZDBTimeZone.<lambda>  rN  r7   rO  rQ  r  r7   r5   r   r     a        'D!>)R;; =49EEE;y"+A+AC C CDKKKr7   c                   j    e Zd ZdZ edde           edddd           edd	d
gd           gZdS )r   z"DHCP6 Option - RelayRequest OptionrC  r   rD  Nr  r)  rF  rx   ry   c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptRelayAgentERO.<lambda>  r  r7   rO  r  r  r7   r5   r   r     so        /D!>)R;; =49%)+ + +##IBx0F0FH H HIKKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   zDHCP6 Client Link OptionrC  r   rD  Nlinkaddressr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptLQClientLink.<lambda>  r  r7   rO  r  r  r7   r5   r   r     sa        %D!>)R;; =4=III<r,B,BD D DEKKKr7   c                   ^    e Zd ZdZ edd           edd           edd          gZd Zd	S )
DHCP6NTPSubOptSrvAddrz"DHCP6 NTP Server Address SuboptionrC  rE   rD  rl   rd  re  c                 
    d|fS r;  r  r<  s     r5   r>  z%DHCP6NTPSubOptSrvAddr.extract_padding  r?  r7   Nr  r	  r
  r3   r   r%   r  r>  r  r7   r5   re  re    s\        /D:i++:h++8FD))+K    r7   re  c                   ^    e Zd ZdZ edd           edd           edd          gZd Zd	S )
DHCP6NTPSubOptMCAddrz%DHCP6 NTP Multicast Address SuboptionrC  rF   rD  rl   rd  re  c                 
    d|fS r;  r  r<  s     r5   r>  z$DHCP6NTPSubOptMCAddr.extract_padding  r?  r7   Nrg  r  r7   r5   ri  ri    s\        2D:i++:h++8FD))+K    r7   ri  c                   h    e Zd ZdZ edd           eddd           eddd	 
          gZd ZdS )DHCP6NTPSubOptSrvFQDNzDHCP6 NTP Server FQDN SuboptionrC  rG   rD  NrP  r  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6NTPSubOptSrvFQDN.<lambda>  rN  r7   rO  c                 
    d|fS r;  r  r<  s     r5   r>  z%DHCP6NTPSubOptSrvFQDN.extract_padding  r?  r7   )	r  r	  r
  r3   r   r   r"   r  r>  r  r7   r5   rl  rl    st        ,D:i++ =46BBB;vr+A+AC C CDK
    r7   rl  )rE   rF   rG   c                     t           j        }t          |           dk    rHt          j        d| d d                   d         }t
                              |t           j                  } || fi |S r(  )r   rT   rU   r*  r+  _ntp_suboptsr2   )r  kwargsrZ   rU  s       r5   _ntp_subopt_dispatcherrr    se    
.C
1vv{{M$"1"&&q)q$.113qFr7   c                   h    e Zd ZdZ edde           edddd           edg ed	 
          gZ	dS )r   zDHCP6 NTP Server OptionrC  r   rD  N	ntpserverr)  rF  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptNTPServer.<lambda>      3: r7   rO  )
r  r	  r
  r3   r   rR  r   r   rr  r  r  r7   r5   r   r     sm        $D!>)R;; =4;%)+ + +"?;#9/E/EG G GHKKKr7   c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )r   zDHCP6 Boot File URL OptionrC  r   rD  Nr  r  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptBootFileUrl.<lambda>  rN  r7   rO  rQ  r  r7   r5   r   r     r^  r7   c            
       |    e Zd ZdZ edde           edddd           edg  ed	d
          d           gZ	dS )r   z,DHCP6 Client System Architecture Type OptionrC  r   rD  N	archtypesr)  rF  archtyper   c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptClientArchType.<lambda>  rZ  r7   rO  )
r  r	  r
  r3   r   rR  r   r    r   r  r  r7   r5   r   r     sy        9D!>)R;; =4;%)+ + +!>+r",*Z";";.D.DF F FGKKKr7   c                       e Zd ZdZ edde           edd           edd           edd           ed	d          gZd
S )r   z0DHCP6 Client Network Interface Identifier OptionrC  r   rD  rG   iityper   iimajoriiminorNr  r  r7   r5   r   r     sg        =D!>)R;;:h**9Xq))9Y**9Y**	,KKKr7   c                   d    e Zd ZdZ edde           eddd           edg d 	          gZdS )
r   z#DHCP6 Option - ERP Domain Name ListrC  r   rD  N	erpdomainr  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptERPDomain.<lambda>  r  r7   rO  r  r  r7   r5   r   r     sb        0D!>)R;; =4;GGG&&{B3I3IK K KLKKKr7   c                   h    e Zd ZdZ edde           edddd           edg ed	 
          gZ	dS )r   z#DHCP6 Relay-Supplied Options OptionrC  r   rD  Nrelaysuppliedr)  rF  c                     | j         S r0   rJ  rK  s    r5   rM  z!DHCP6OptRelaySuppliedOpt.<lambda>'  rv  r7   rO  )
r  r	  r
  r3   r   rR  r   r   r7  r  r  r7   r5   r   r      sm        0D!>)R;; =4?%)+ + +"??B#;/E/EG G GHKKKr7   c                   ~    e Zd ZdZ edde           edddd            ed	d
           eddd           gZ	dS )r   z'DHCP6 Option - Virtual Subnet SelectionrC  r   rD  NrE  c                     |dz   S rR  r  r`  s     r5   rM  zDHCP6OptVSS.<lambda>/  r  r7   r  r  r  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptVSS.<lambda>2  rN  r7   rO  )
r  r	  r
  r3   r   rR  r   r   r   r  r  r7   r5   r   r   +  s|        4D!>)R;; =46(<(<> > >9VS));vr+A+AC C C	DKKKr7   c                   x    e Zd ZdZ edde           edddd            ed	d
           ede	          gZ
dS )r   z(DHCP6 Option - Client Link Layer addressrC  r   rD  Nclladdrc                     |dz   S r  r  r`  s     r5   rM  z$DHCP6OptClientLinkLayerAddr.<lambda>;  r  r7   r  lltyperE   )r  r	  r
  r3   r   rR  r   r   r  r   r  r  r7   r5   r   r   7  si        5D!>)R;; =49(<(<> > >:h**<	955	7KKKr7   c                   d    e Zd ZdZ edde           eddd           eddd	 
          gZdS )r   zDHCP6 Option - Captive-PortalrC  r   rD  NURIr  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptCaptivePortal.<lambda>E  rN  r7   rO  rQ  r  r7   r5   r   r   @  sa        *D!>)S)<< =45AAA;ub+A+AC C CDKKKr7   c                   f    e Zd ZdZ edde           eddd           eddd	 d
          gZdS )r   zDHCP6 Option - MUD URLrC  r   rD  N	mudstringr  r  c                     | j         S r0   rJ  rK  s    r5   rM  zDHCP6OptMudUrl.<lambda>M  rN  r7      )rP  
max_lengthrQ  r  r7   r5   r   r   H  s`        #D!>)S)<< =4;GGG;{B+A+A*-! ! !"KKKr7   r  c                   X    e Zd ZdZ edde           edd          gZedddiZ	d	 Z
dS )
DHCP6zDHCPv6 Generic Messager  Ntridr   "  #  sportdportc                 F    t          j        d| j                  dd         S )Nz!IrE   rH   )r*  r  r  r  s    r5   hashretzDHCP6.hashret|  s    {4++AaC00r7   )r  r	  r
  r3   r   
dhcp6typesr   r  r#   overload_fieldsr  r  r7   r5   r  r  v  sa        #D =D*==<113KcC889O1 1 1 1 1r7   r  c                   x    e Zd ZdZ edde           edddd           ed e            e	d	 
          gZ
dS )r   zDHCP6 Relay Message OptionrC  rM   rD  Nr)  messager  c                     | j         S r0   rJ  )r  s    r5   rM  zDHCP6OptRelayMsg.<lambda>  s     r7   rO  )r  r	  r
  r3   r   rR  r   r   r  r[   r  r  r7   r5   r   r     ss        'D!>)Q	:: =4T+46 6 6!>)UUWW6G.@.@B B BCKKKr7   c                   $    e Zd ZdZdZedddiZdS )r8   zDHCPv6 Solicit MessagerE   r  r  r  Nr  r	  r
  r3   r  r#   r  r  r7   r5   r8   r8     s*        #DGcC889OOOr7   c                   *    e Zd ZdZdZedddiZd ZdS )r9   zDHCPv6 Advertise MessagerF   r  r  r  c                 b    t          |t                    o|j        dk    o| j        |j        k    S rR  )
isinstancer8   r  r  r  others     r5   answerszDHCP6_Advertise.answers  s4    5-00 ("(	UZ'	)r7   Nr  r	  r
  r3   r  r#   r  r  r  r7   r5   r9   r9     s?        %DGcC889O) ) ) ) )r7   c                       e Zd ZdZdZdS )r:   zDHCPv6 Request MessagerG   Nr  r	  r
  r3   r  r  r7   r5   r:   r:             #DGGGr7   c                       e Zd ZdZdZdS )r;   zDHCPv6 Confirm MessagerH   Nr  r  r7   r5   r;   r;     r  r7   c                       e Zd ZdZdZdS )r<   zDHCPv6 Renew MessagerI   Nr  r  r7   r5   r<   r<     s        !DGGGr7   c                       e Zd ZdZdZdS )r=   zDHCPv6 Rebind MessagerJ   Nr  r  r7   r5   r=   r=     s        "DGGGr7   c                   *    e Zd ZdZdZedddiZd ZdS )r>   zDHCPv6 Reply MessagerK   r  r  r  c                     t           t          t          t          t          t
          t          t          f}t          ||          o| j	        |j	        k    S r0   )
r8   rB   r;   r=   r@   r:   r?   r<   r  r  )r  r  typess      r5   r  zDHCP6_Reply.answers!  s=     1=,}kK 5%((DTY%*-DEr7   Nr  r  r7   r5   r>   r>     sD        !DGcC889OF F F F Fr7   c                       e Zd ZdZdZdS )r?   zDHCPv6 Release MessagerL   Nr  r  r7   r5   r?   r?   /  r  r7   c                       e Zd ZdZdZdS )r@   zDHCPv6 Decline MessagerM   Nr  r  r7   r5   r@   r@   >  r  r7   c                   $    e Zd ZdZdZedddiZdS )rA   zDHCPv6 Reconfigure MessagerN   r  r  r  Nr  r  r7   r5   rA   rA   P  s*        'DGcC889OOOr7   c                       e Zd ZdZdZdS )rB   z"DHCPv6 Information Request MessagerO   Nr  r  r7   r5   rB   rB   b  s        /DGGGr7   c                       e Zd ZdZ edde           edd           edd           edd          gZe	d	d	d
iZ
d ZdS )rC   z9DHCPv6 Relay Forward Message (Relay Agent/Server Message)r  rP   hopcountNlinkaddrre  peeraddrr  r  c                 @    t          t          j        | j                  S r0   r*   r  r  r  r  s    r5   r  zDHCP6_RelayForward.hashret|      $-888r7   )r  r	  r
  r3   r   r  r   r%   r  r#   r  r  r  r7   r5   rC   rC   t  s        FD =B
;;9Z..8J--8J--/K cC889O9 9 9 9 9r7   c                   "    e Zd ZdZdZd Zd ZdS )rD   z7DHCPv6 Relay Reply Message (Relay Agent/Server Message)rQ   c                 @    t          t          j        | j                  S r0   r  r  s    r5   r  zDHCP6_RelayReply.hashret  r  r7   c                     t          |t                    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r0   )r  rC   r  r  r  r  s     r5   r  zDHCP6_RelayReply.answers  sJ    5"455 0/0/0 /	1r7   N)r  r	  r
  r3   r  r  r  r  r7   r5   rD   rD     s<        DDG9 9 91 1 1 1 1r7   r  r  r  c                   X    e Zd ZdZdZ ee          Zd Z	 	 	 	 	 	 ddZ	d Z
d Zd ZdS )	DHCPv6_amdhcp6dzudp and port 546 and port 547c                 (    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  msgs     r5   usagezDHCPv6_am.usage  s    >F~ 	c




r7   2001:500::1035localdomain, local2001:db8::12001:db8::20Nr   r  c                      fd}t           j        | _        i  _        |ddd f|ddd f|dd	d
 f|ddd f|ddd f|
ddd f|	ddd f|ddd f|ddd f|ddd f|d d!d" ffD ]E} ||d#         |d$                   }|d%k    r d&S |& |d'         |           j        |d(         <   F j        rTt	          d)           t           j                  }|D ].}t	          d*|t           j        |                   fz             /| _        | _        | _	         _        || _
        nYd+}t          j        |          t          z
  }t          j                    |z
  }t                    }t          ||,           _
         j        r*t	          d-            j
                            d./           d  _        	 t%          fd0t'                      D                       }|d#          _        n'# t(          t*          f$ r t-          d1           Y d S w xY wi  _         j        rt	          d2 j        z             d S d S )3Nc                     | d S t          | t                    r| S t          | t                    r!|                     d          }d |D             S t	          d|z                                              dS )N,c                 6    g | ]}|                                 S r  )stripr  s     r5   
<listcomp>z>DHCPv6_am.parse_options.<locals>.norm_list.<locals>.<listcomp>  s     333a		333r7   zBad '%s' parameter provided.)r  liststrsplitr  r  )val
param_namer  r  s      r5   	norm_listz*DHCPv6_am.parse_options.<locals>.norm_list  s    {t#t$$ 
C%% ))C..33733334zABBB

rr7   dnsrx   c                 "    t          |           S )N)r
  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>  s    -?1-M-M-M r7   domainry   c                 "    t          |           S )N)r  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>  s    3EQR3S3S3S r7   r+  r   c                 "    t          |           S )N)r+  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>      =P]^=_=_=_ r7   r  rw   c                 "    t          |           S )N)r  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>	      ;MYZ;[;[;[ r7   r  rv   c                 "    t          |           S )N)r  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>
  r  r7   r  r~   c                 "    t          |           S )N)r  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>  r  r7   r$  r   c                 6    t          | dgz   d                   S )Nr  r   )r$  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>  s"    9JVW[]Z^V^`aUb9c9c9c r7   r   r   c                 "    t          |           S )N)r   )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>  r  r7   r(  r   c                 6    t          | dgz   d                   S )Nr  r   )r(  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>  s"    ;MZ[_a^bZbdeYf;g;g;g r7   r4  r   c                 "    t          |           S )N)r4  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>      ?Sab?c?c?c r7   r1  r   c                 "    t          |           S )N)r1  )r   rB  s    r5   rM  z)DHCPv6_am.parse_options.<locals>.<lambda>  r  r7   r   rE   r  FrG   rF   z#
[+] List of active DHCPv6 options:z
    %d: %sr  )r  r  z
[+] Our server DUID:z    )	label_lvlc              3   ^   K   | ]'}|d          k    t          |d                   #|V  (dS )rF   r   N)r.   )r  rW   ifaces     r5   r  z*DHCPv6_am.parse_options.<locals>.<genexpr>C  s>      [[aademmUVWXUYHZHZmmmmm[[r7   z"Unable to get a Link-Local addressz#
[+] Starting DHCPv6 service on %s:)r   r  debugdhcpv6_optionsr  sortedrepradvprefstartipendiprX  timemktimer   r   r  showsrc_addrnextr   StopIterationRuntimeErrorr   leases)r  r  r  r  r  rX  r+  r  r  r$  r  r(  r   r4  r1  r  r  r  r  rU  r.  optsir  deltar  macrd  s   `              `            r5   parse_optionszDHCPv6_am.parse_options  s   	 	 	 	 	 =JE
 !r#M#MN8R)S)STr3_3_`|R1[1[\|R1[1[\|R1[1[\k2/c/cdr3_3_`|R1g1gh5c5cd5c5cd
f 	6 	6A )AaD!A$''Cbyyuu,0AaDII#AaD)): 	H8999$-..D H Hlad.A!.D)E)E%FFGGGG  

 
 DII 3EK&&.EikkE)G  &&C ===DI: 	.*+++INNWN--- 	$[[[[=??[[[[[D
 !GDMM	 |, 	 	 	8999FF	 : 	G84:EFFFFF	G 	Gs   'G6 6 HHc                    t           |vrdS |t                    j        }|t                    j        }t          |t                    r|j        dk    s|j        dk    rdS |j        }t          |t                    sdS |j        dvrd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    rt          |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    s|j        d
k    rdS n|j        dk    r;| j        sdS t          j        t          j        z   }t          j        z   }t          j        t          j        }t+          |          }|r|dk    rd|z   |z   z   dz   }nd}|z   z   }|}g }	|rSg }
t          |t,                    r|j        }
nt          |t0                    r|j        }
|	d |
D             z  }	|j        }|Sfd|	D             }	| j        rO|dz   z   dz   |z   dz   z   }|dz   |z   |z   dz   z  }|d                    |	          z   z  }t7          |           dS |j        dk    rt          |v r]|t                   j        }t          |t          | j                            sdS t          |          t          | j                  k    rdS t,          |v st0          |v s	t8          |v rdS ndS dS )NFr  r  )rE   rG   rH   rI   rJ   rL   rM   rO   rE   rJ   rH   rG   rI   rL   rM   UNKNOWN []r  c                 F    g | ]}t          |t                    |j        S r  )r  r   rd  r  s     r5   r  z(DHCPv6_am.is_request.<locals>.<listcomp>  s*    RRRQA?P1Q1QR!&RRRr7   c                      g | ]
}|z   z   S r  r  )r  rW   bons     r5   r  z(DHCPv6_am.is_request.<locals>.<listcomp>  s!    ///AR!VaZ///r7   z[DEBUG]z
 Received Decline from z for r  rO   T)r'   srcr-  r  r#   r  r  r  r  r   r   rX  r  r	   r  r,   boldgreenbluenormalredr-   r   rq  r   rz  r  r  r   )r  r  r  rX  gbr  vendoritaddrsr  r  r  r  s               @@r5   
is_requestzDHCPv6_am.is_requestQ  s   q==5gkdGO!S!! 	QW^^qw#~~5I!U## 	5
 	6665 Y!^^Y!^^a!**$))u	QINN u #
 i1nni1nni1nn "**%Q..u%&+DdDOO44 u4yyC	NN**u	QINN u #
 Y!^^: uBb A
RAA	A%c**F 6Y..F*Q.4s(Q,CBE  b-00 &+CCM22 &+CRR#RRRRZ    0///////Ez )ma',6:YFJx"}s*V3g==tyy''!++c


 5Y"__1$$)*/!$TY88 ! 5t99DI.. 5!##!##"a''u ( 5tr7   c           	         d }|d S t           j        }t           j        |z   }t           j        |z   }t           j        }| ||                    t                    j        j                  z   |z   }|                    t                    j
        }	t          |	          }
|
r|
dk    rd|z   |
z   |z   dz   }
nd}
||	z   |z   }	| ||                    t                    j        j                  z   |z   }t          d|d|d|	|
           d S )	Nc                     |                      d          r
| dd          } |                     d          r
| d d         } | S )NzDHCPv6 rK   z Messagei)
startswithendswith)r=  s    r5   normz#DHCPv6_am.print_reply.<locals>.norm  sI    ||I&& abbEzz*%% crcFHr7   r  r  r  r  zSent z answering to r  )r,   r  r  r  r  getlayerr#   r-  r3   r'   r  r-   r  )r  reqreplyr  r  r  r  r  reqtypereqsrcr  reptypes               r5   print_replyzDHCPv6_am.print_reply  s"   	 	 	 =FZK"JOLdd3<<,,49:::Q>d##'!&)) 	v**AX&*S0FFFfqdd5>>#..6;<<<q@WWWgggvvvvVWWWWWr7   c                     |t                    }|j        }|j        j        }|j        }|j        } fd}|dk    r|t
                   j        }t           j        |          }|t          dd          z  }|	                    t                    rQ|t          |          z  }|t                      z  }|t           j                  z  }|t          |          z  }nk|	                    t                    s|	                    t                    rUd	}	|t          |          z  }|t!          d
|	          z  }|t           j                  z  }|t          |          z  }n|	                    t"                    rUd}	|t          |          z  }|t!          d|	          z  }|t           j                  z  }|t          |          z  }ns|t          |          z  }|t%           j                  z  }|t           j                  z  }|t          |          z  }|t)                      z  } |||           |S |dk    r|t
                   j        }t           j        |          }|t          dd          z  }|t+          |          z  }|t           j                  z  }|t          |          z  } |||           |S |dk    rd S |dk    rd S |dk    rd S |dk    rd S |dk    rd S |dk    rd }|	                    t
                    s j        rt/          d           n|t
                   j        }t           j        |          }|t          dd          z  }|t          |          z  }|t           j                  z  }|r|t          |          z  } j                                        D ]
\  }
}||z  }|S d S )Nc                     g }|                      t                    r<| t                   j        }j                                        D ]\  }}||v r||z  }dS j                                        D ]
\  }}||z  }dS )z?
            Include options from the DHCPv6 query
            N)haslayerr   r  r  items)queryanswerr  rU  r.  r  s        r5   _include_optionsz.DHCPv6_am.make_reply.<locals>._include_options  s     G~~n-- 
"/7"17799 & &FAsG||#& & #17799 " "FAscMFF" "r7   rE   )r  dstr  r  r  )r  )rX  z1Scapy6 dhcp6d does not support address assignmentrF   )r  r  z0Scapy6 dhcp6d does not support prefix assignmentrJ   )r  rG   rH   rI   rL   rM   rO   z6Received Info Request message without Client Id option)r'   r  r-  r  r  r   rX  r  r#   r)  r   r>   r   r   r   r9   r   r   r   r  r   r8   r  r   r  r*  )r  r!  r  req_srcr  r  r-  client_duidrespr  rU  r.  s   `           r5   
make_replyzDHCPv6_am.make_reply  sg   I%I)v	" 	" 	" 	" 	"& a<<
 ,-2KDMw777DCc----Dzz-.. !.....+---(di8888(k:::: JJ}-- .

=11. NCO6666D.!sKKKKD,$)<<<<D,+>>>>DDZZ.. .LCO6666D.!sKKKKD,$)<<<<D,+>>>>DD O6666DL>>>>D,$)<<<<D,+>>>>D0222D$$Q---K\\,-2KDMw777DCc----DMt,,,,D$$)4444D$+6666DQ%%%K\\ D\\ D\\ D\\ D\\D]]K::.// 7: VTUUU 016DMw777DCc----DKT****D$$)4444D ;(k:::: -3355  3K Dr7   )r  r  r  r  NNNNNNNNNNNr   r  )r  r	  r
  function_namefilterr5  r+   send_functionr  r  r  r&  r2  r  r7   r5   r  r    s        M,F L&&M@ @ @D :NHLDHBFHL36dG dG dG dGLy y yvX X X6n n n n nr7   r  )r@  r  r*  r  scapy.ansmachiner   
scapy.archr   r   scapy.configr   
scapy.datar   r   scapy.compatr	   r
   scapy.errorr   scapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   scapy.layers.dnsr"   scapy.layers.inetr#   scapy.layers.inet6r$   r%   r&   r'   scapy.packetr(   r)   scapy.pton_ntopr*   scapy.sendrecvr+   scapy.themesr,   scapy.utils6r-   r.   r6   rV   r[   !All_DHCP_Relay_Agents_and_ServersAll_DHCP_ServersrR  r,  r  r  r  r  r  r  r  r  r!  rT  r&  r7  r2  rV  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/  IRT_MINIMUMr   r   r   rG  r8  r>  r   r   r   r   r   r   r   r   re  ri  rl  rp  rr  r   r   r   r   r   r   r   r   r   r   DHCP6RelayAgentUnicastAddrDHCP6RelayHopCountDHCP6ServerUnicastAddrDHCP6ClientUnicastAddrDHCP6ClientIA_TADHCP6ClientIA_NADHCP6ClientIAIDru  rv  DHCP6ServerDUIDDHCP6CurrentTransactionIDDHCP6PrefValr  r   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   r  r  r7   r5   <module>rR     s%       - - - - - - 3 3 3 3 3 3 3 3       ' ' ' ' ' ' ' ' ! ! ! ! ! ! ! !      . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
 / . . . . . ( ( ( ( ( ( ! ! ! ! ! !	 	 	 	 	 	 	 	 	 	 	 	 / / / / / / / / % % % % % %             7 7 7 7 7 7 7 7- - - ()''%&%''',-+- - " " " %0 ! 4Q
 4
44 4 	4
 4 4 4 4 4 4 4 4 4 4 4  !4 4" #4$ %4& /'4( 0)4* 3+4, ,-4. /40 "142 %344 &546 )748 *94: &;4< 2=4> (?4@ (A4B 'C4 4 4D #E4F 'G4H %I4J $K4L ,M4N +O4P (Q4R $S4T #U4V %W4X *Y4Z [4\ /]4^ 0_4` a4b /c4d )e4 4f "g4 4	l9Q* 9*99 9 +	9
 (9 9 -9 *9 9 09 -9 .9 ,9 .9 59  *!9 9" ,#9$ /%9& -'9( -)9* -+9, --9. /90 +192 -394 .596 ,798 -99: .;9< 2=9> /?9@ /A9D +E9 9 9F /G9H -I9J 0K9L 3M9N 2O9P 0Q9Z /[9\ ,]9^ ._9` 0a9b 1c9d 7e9f ,g9h 3i9j k9l 6m9n 1o9 9p *q9 9 z '   
& /F$ 	!Dq" !D#!D/!D '!D -	!D
 '!D %!D (!D .!D )!D *!D ;!D ;!D <!D 6!D =!D  9!!D !D" 6#!D$ ?%!D& 9'!D( =)!D* 9+!D, $-!D. :/!D0 #1!D2 73!D4 ;5!D6 87!D8 89!D: /;!D< 8=!D> >?!D@ $A!DB BC!D !DHF F F F FL F F F	 	 	 	 	8 	 	 	6 6 6 6 6v 6 6 6' ' ' ' 'f ' ' '6 6 6 6 6f 6 6 6J J J J J J J J  
 
 
 
 
F 
 
 
*    4   D D D D D+ D D D  G G G G G, G G G    '   " " " " "- " " "&	M 	M 	M 	M 	M) 	M 	M 	ML L L L L) L L L"9 "9 "9 "9 "9{ "9 "9 "9PI I I I I* I I I. . . . .( . . .6 6 6 6 6
 6 6 68 8 8 8 8/ 8 8 8V *	    
 0

I 
I 
I 
I 
I( 
I 
I 
I< < < < <H < < <3 3 3 3 31 3 3 3 !#%""%&( ( H H H H H. H H H, , , , ,/ , , ,    /   ," " " " "f " " "L L L L L- L L L	 	 	 	 	/ 	 	 	       R R R R R/ R R R" " " " "2 " " "R R R R R!6 R R R D D D D D+ D D DN N N N N- N N N", , , , ,0 , , ,L L L L L. L L LE E E E E. E E EE E E E E. E E EL L L L L. L L L" " " " ", " " "(	M 	M 	M 	M 	M) 	M 	M 	ME E E E E. E E EE E E E E/ E E ED D D D D- D D DD D D D D. D D DE E E E E/ E E E 5 5 5 5 53 5 5 5L L L L L0 L L LE E E E E0 E E E    F F F F FV F F FL L L L L+ L L LH H H H H, H H HD D D D D0 D D DH H H H H. H H HE E E E E1 E E ED D D D D4 D D DD D D D D3 D D DI I I I I1 I I IE E E E E0 E E E    F       6       F    )'(* *
  H H H H H- H H HD D D D D/ D D DG G G G G2 G G G, , , , ,#8 , , ,L L L L L- L L LH H H H H4 H H HD D D D D' D D D7 7 7 7 7"7 7 7 7D D D D D1 D D D" " " " "* " " "           "1 1 1 1 1! 1 1 1C C C C C, C C CF: : : : :E : : :) ) ) ) )e ) ) )8    E       E   ,    %       5   8F F F F F% F F F(    E       E   $: : : : :5 : : :$       $	9 	9 	9 	9 	9. 	9 	9 	9<1 1 1 1 1) 1 1 1 s%~ 6 6 6 s%~ 6 6 6q q q q q  q q q q qr7   