
    hW                     J   d Z 	 ddlmZ n# e$ r	 ddlmZ Y nw xY wddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZm Z  dd	l!m"Z"m#Z# dd
l$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> dZ? G d de          Z@ G d de'          ZA G d de          ZB G d de2          ZC G d de          ZD G d de          ZEddd d!d"d#d$d%d&d'd(d)d*d+ZFi dd,d- ed.d/          d0 ed1d2          d3 ed4d/          d5 ed6d/          d7 ed8d/          d9 ed:d/          d; ed<d/          d= ed>d/          d? ed@d/          dA edBd/          dC edDd/          dEdFdG edHdI          dJdKdLdMdN edOd/          i dPdQdRdSdT edUd          dV edWd          dX edYd/          dZ ed[d\          d] ed^d_          d` edadI          db edcdI          dd eded_          df edgd          dh edid/          dj edkd          dl edmd          dn edod          dp edqd/          dr edsd/          i dt edud          dv edwdI          dx edyd          dz ed{d|          d} ed~dI          d edd          d edd          d edd/          d edd/          ddd edd/          d edd/          d edd|          ddd edd/          d edd/          d_ edd/          i d edd          d edd|          d edd-eF          d edd/          d eBdg  edd                    ddd edd          d edd          d edd          d edd          d edd          ddddd edd/          ddd edd          d edd/          i d edd/          d edd/          d edd/          d edd/          d edd/          d edd/          d edd/          d edd/          ddѓddӓddՓddדddٓddۓd edd/          d edd          d edd          i ddd edd/          d eddI          d edd/          ddddddd edd          d| edd          d edd          d edd          d edd/          d edd          d edd          d edd          d ed d          d edd/          i d eDdg  eEdd                    dddd	d
 edd/          d edd/          ddd edd/          ddddd edd/          ddd edd          d edd          ddd d!d"d#d$d%d&d'd(d)ZGi ZHeGI                                D ]$\  ZJZK eLeKeM          reKZNdZKneKjO        ZNeJeKfeHeN<   %[N[K[J G d* d+e2          ZP G d, d-e          ZQ G d. d/e'          ZR e%eeAdd0            e%eeAdd0            e&eeAdd0            e%eAeRd1           e>jS        jT        	 	 	 	 	 	 d7d2            ZU G d3 d4e
          ZV G d5 d6eV          ZWdS (8  z
DHCP (Dynamic Host Configuration Protocol) and BOOTP

Implements:
- rfc951 - BOOTSTRAP PROTOCOL (BOOTP)
- rfc1542 - Clarifications and Extensions for the Bootstrap Protocol
- rfc1533 - DHCP Options and BOOTP Vendor Extensions
    )IterableN)AnsweringMachine)Net)chborbbytes_encode)ByteEnumField	ByteFieldFieldFieldListField
FlagsFieldIntFieldIPField
ShortFieldStrEnumFieldStrFieldStrFixedLenField	XIntField)UDPIP)EtherHARDWARE_TYPES)bind_layersbind_bottom_upPacket)atolitomltoasanestr2macmac2str)RandBinRandByte	RandFieldRandIPRandIntRandNumRandNumExpo)get_if_hwaddr)srp1)warning)confs   cScc                        e Zd Z fdZ xZS )_BOOTP_chaddrc                    |j         dk    rM|dd          dk    rdt          |d d                   z  S t          |d d                   d|dd          dS t          t          |                               ||          S )N      s
             z%s (+ 10 nul pad)z (pad: ))htyper    superr.   i2repr)selfpktv	__class__s      U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/dhcp.pyr5   z_BOOTP_chaddr.i2reprB   s    9>>u$$*WQrrU^^;;)02A2122??]D))00a888    )__name__
__module____qualname__r5   __classcell__r9   s   @r:   r.   r.   A   s8        9 9 9 9 9 9 9 9 9r;   r.   c                      e Zd Zd Z eddddd           edde           edd           ed	d
           edd
           edd
           e	dd
dd           e
dd           e
dd           e
dd           e
dd           eddd           eddd           eddd           eddedi          gZd Zd Zd  Zd! Zd"S )#BOOTPopr0   BOOTREQUEST	BOOTREPLY)r0      r3   hlenr1   hopsr   xidsecsflags   z???????????????Bciaddr0.0.0.0yiaddrsiaddrgiaddrchaddrr;   )lengthsname@   file   optionsz
DHCP magicc                     | j         d t          t                             t          k    rt          S t	          j        | |          S N)rX   len	dhcpmagicDHCPr   guess_payload_class)r6   payloads     r:   r^   zBOOTP.guess_payload_class^   s6    <Y(I55K-dG<<<r;   c                     | j         d t          t                             t          k    rK| j         t          t                    d          }| j         d t          t                             | _         |d fS dS )Nr;   N)rX   r[   r\   )r6   sr_   s      r:   extract_paddingzBOOTP.extract_paddingd   s[    <Y(I55l3y>>??3G<Y8DLD= 9r;   c                 6    t          j        d| j                  S )Nz!I)structpackrI   r6   s    r:   hashretzBOOTP.hashretm   s    {4***r;   c                 P    t          |t                    sdS | j        |j        k    S )Nr   )
isinstancerB   rI   )r6   others     r:   answerszBOOTP.answersp   s(    %'' 	1x59$$r;   N)r<   r=   r>   namer	   r   r
   r   r   r   r   r.   r   r   r\   fields_descr^   rc   rh   rl    r;   r:   rB   rB   K   sg       DdA=[AABBgq.11	&!	&!	%
61
7Ar#566)$$)$$)$$)$$hB///#b111S111Yi%>??AK"= = =  + + +% % % % %r;   rB   c                       e Zd Zd ZdS )_DHCPParamReqFieldListFieldc                 <     G d dt                     } |            S )Nc                       e Zd Zd ZdS )>_DHCPParamReqFieldListField.randval.<locals>._RandReqFieldListc                 X    t                      gt          t                                z  S rZ   )r#   intrg   s    r:   _fixzC_DHCPParamReqFieldListField.randval.<locals>._RandReqFieldList._fixy   s     

|c(**oo55r;   Nr<   r=   r>   rw   ro   r;   r:   _RandReqFieldListrt   x   s#        6 6 6 6 6r;   ry   r$   )r6   ry   s     r:   randvalz#_DHCPParamReqFieldListField.randvalw   s=    	6 	6 	6 	6 	6	 	6 	6 	6 ! """r;   Nr<   r=   r>   r{   ro   r;   r:   rq   rq   v   s#        # # # # #r;   rq   c                       e Zd ZdZd ZdS )RandClasslessStaticRoutesFieldz1
    A RandValue for classless static routes
    c                 ^    dt                      t          dd          t                      fz  S )Nz%s/%d:%sr       )r%   r'   rg   s    r:   rw   z#RandClasslessStaticRoutesField._fix   s$    VXXwq"~~vxx@@@r;   N)r<   r=   r>   __doc__rw   ro   r;   r:   r~   r~   ~   s2         A A A A Ar;   r~   c                       e Zd Zd ZdS )ClasslessFieldListFieldc                 <     G d dt                     } |            S )Nc                       e Zd Zd ZdS )<ClasslessFieldListField.randval.<locals>._RandClasslessFieldc                 \    t                      gt          t          dd                    z  S )Nr0      )r~   rv   r'   rg   s    r:   rw   zAClasslessFieldListField.randval.<locals>._RandClasslessField._fix   s&    6889C2<O<OOOr;   Nrx   ro   r;   r:   _RandClasslessFieldr      s(        P P P P Pr;   r   rz   )r6   r   s     r:   r{   zClasslessFieldListField.randval   sE    	P 	P 	P 	P 	P) 	P 	P 	P #"$$$r;   Nr|   ro   r;   r:   r   r      s#        % % % % %r;   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )ClasslessStaticRoutesFielda  
    RFC 3442 defines classless static routes as up to 9 bytes per entry:

    # Code Len Destination 1    Router 1
    +-----+---+----+-----+----+----+----+----+----+
    | 121 | n | d1 | ... | dN | r1 | r2 | r3 | r4 |
    +-----+---+----+-----+----+----+----+----+----+

    Destination first byte contains one octet describing the width followed
    by all the significant octets of the subnet.
    c                 $   t          |d                   }|dz   dz  }|dd|z            }t          j        |                    dd                    }|d|z   d|z            }t          j        |          }|dz   t	          |          z   d	z   |z   S )
Nr         r0             /:)r   socket	inet_ntoaljuststr)r6   r7   xprefixoctetsdestrouters          r:   m2izClasslessStaticRoutesField.m2i   s     QqT1*" 1v:

1g 6 6771v:a&j()!&))czCKK'#-66r;   c                 t   |sdS t          j        dt          |                    }t          |d                   }|dk    s|dk     rt	          d||           dS |dz   dz  }t          j        |d                   d |         }t          j        |d	                   }t          j        d
|          |z   |z   S )Nr;   z/|:r0   r   r   zInvalid prefix value: %d (0x%x)r   r   rF   b)	resplitr   rv   r+   r   	inet_atonre   rf   )r6   r7   r   spxr   r   r   r   s           r:   i2mzClasslessStaticRoutesField.i2m   s      	3huc!ff%%SVB;;&1**5vvFFF31*"A''0!#a&)){3''$.77r;   c                     t          |d                   }d|dz   dz  z   }||d          |                     ||d |                   fS )Nr   r   r   r   )r   r   )r6   r7   rb   r   	route_lens        r:   getfieldz#ClasslessStaticRoutesField.getfield   sM    QqT!))	}dhhsAjyjM::::r;   c                 4    ||                      ||          z   S rZ   )r   )r6   r7   rb   vals       r:   addfieldz#ClasslessStaticRoutesField.addfield   s    488C%%%%r;   c                     t                      S rZ   )r~   rg   s    r:   r{   z"ClasslessStaticRoutesField.randval   s    -///r;   N)	r<   r=   r>   r   r   r   r   r   r{   ro   r;   r:   r   r      si        
 
7 7 7 8 8 8"; ; ;
& & &0 0 0 0 0r;   r   discoverofferrequestdeclineacknakreleaseinformforce_renewlease_querylease_unassignedlease_unknownlease_active)r0   rF      r   r   r1   r   r   	   
            padr0   subnet_maskrN   rF   	time_zonei  r   r   r   time_serverr   IEN_name_serverr1   name_serverr   
log_serverr   cookie_serverr   
lpr_serverr   zimpress-serversr   zresource-location-serversr   hostnamer   z	boot-sizei     	dump_path   domainrL   zswap-server   root_disk_path   zextensions-path   zip-forwarding   znon-local-source-routing   zpolicy-filter   max_dgram_reass_sizei,     default_ttl2      pmtu_timeout   zpath-mtu-plateau-table   zinterface-mtu   zall-subnets-localr   broadcast_address   zperform-mask-discovery   zmask-supplier   zrouter-discoveryr   zrouter-solicitation-address!   zstatic-routes"   ztrailer-encapsulation#   arp_cache_timeout$   zieee802-3-encapsulation%   tcp_ttld   &   tcp_keepalive_interval'   tcp_keepalive_garbage(   
NIS_domainzwww.example.com)   
NIS_server*   
NTP_server+   vendor_specific,   NetBIOS_server-   NetBIOS_dist_server.   NetBIOS_node_type/   znetbios-scope0   zfont-servers1   zx-display-managerrequested_addr3   
lease_timei  4   zdhcp-option-overload5   message-type6   	server_id7   param_req_listopcode8   error_message9   max_dhcp_sizei  :   renewal_timei`T  ;   rebinding_timei  <   vendor_class_idid=   	client_id >   znwip-domain-namerU   NISplus_domainA   NISplus_serverB   tftp_server_nameC   zboot-file-nameD   zmobile-ip-home-agentE   SMTP_serverF   POP3_serverG   NNTP_serverH   
WWW_serverI   Finger_serverJ   
IRC_serverK   StreetTalk_serverL   StreetTalk_Dir_AssistanceM   
user_classN   slp_service_agentO   slp_service_scopeP   rapid_commitQ   client_FQDNR   relay_agent_informationU   z
nds-serverV   znds-tree-nameW   znds-contextX   zbcms-controller-namesiY   zbcms-controller-address[   zclient-last-transaction-time\   zassociated-ip]   pxe_client_architecture^   pxe_client_network_interfacea   pxe_client_machine_identifierb   zuap-serverspcodee   tcodel   zipv6-only-preferredp   znetinfo-server-addressq   znetinfo-server-tagr   zcaptive-portalt   zauto-configu   zname-service-searchv   zsubnet-selectiony   classless_static_routesroute|   vendor_class}   vendor_specific_informationrW   tftp_server_ip_address   z
pana-agent   zv4-lost   zcapwap-ac-v4   sip_ua_service_domains   zrdnss-selection   tftp_server_address   zv4-portparams   zv4-captive-portal   zmud-url   pxelinux_magic   pxelinux_configuration_file   pxelinux_path_prefix   pxelinux_reboot_timez
option-6rdzv4-access-domainend)         c                       e Zd ZddZd ZdS )RandDHCPOptionsNc                 @   |t          d          }|| _        |t          t          dd                    }|| _        t          t                                                    | _        | j        	                    d           | j        	                    d           d S )Ng?r   rq  r   rn  )
r(   sizer"   r'   rndstrlistDHCPOptionsvalues_optsremove)r6   ru  rv  s      r:   __init__zRandDHCPOptions.__init__q  s    <t$$D	>WQ__--F+,,..//

%   
%     r;   c                    g }t          | j                  D ]}t          j        | j                  }t          |t                    r |                    || j        dz  f           P|	                                
                                }t          |t                    r
|d d         }|                    |j        |f           |S )Nr0   rq  )rangeru  randomchoicerz  rj   r   appendrv  r{   rw   bytesrm   )r6   rC   kors        r:   rw   zRandDHCPOptions._fix|  s    ty!! 	' 	'Adj))A!S!! '		1dkAo.////IIKK$$&&a''  $3$A		161+&&&&	r;   )NN)r<   r=   r>   r|  rw   ro   r;   r:   rs  rs  p  s7        	! 	! 	! 	!    r;   rs  c                   4    e Zd ZdZdZd Zd Zd Zd Zd Z	dS )	DHCPOptionsFieldz
    A field that builds and dissects DHCP options.
    The internal value is a list of tuples with the format
    [("option_name", <option_value>), ...]
    Where expected names and values can be found using `DHCPOptions`
    r0   c                 j   g }|D ]}t          |t                    rt          |          dk    r|d         t          v rpt          t          |d                  d         t                    rDt          |d                  d         d                    fd|dd          D                       }n'd                    d |dd          D                       }|                    |d         d|           |                    t          |                     dd	                    |          z  S )
NrF   r   r0   ,c              3   D   K   | ]}                     |          V  d S rZ   )r5   .0r   fr7   s     r:   	<genexpr>z*DHCPOptionsField.i2repr.<locals>.<genexpr>  s1      !F!F!((3"4"4!F!F!F!F!F!Fr;   c              3   4   K   | ]}t          |          V  d S rZ   )repr)r  r   s     r:   r  z*DHCPOptionsField.i2repr.<locals>.<genexpr>  s(      !=!=$s))!=!=!=!=!=!=r;   =z[%s] )rj   tupler[   DHCPRevOptionsr   joinr  r   )r6   r7   r   rb   r8   vvr  s    `    @r:   r5   zDHCPOptionsField.i2repr  s'    		" 		"A!U## "A!Q4>))j!9Ma9PRW.X.X)&qt,Q/A!F!F!F!F!F!""!F!F!FFFBB!=!=qu!=!=!===BAaDDD""-....a!!!!!%%r;   c                 2    d|                      ||          fS )Nr;   )r   )r6   r7   rb   s      r:   r   zDHCPOptionsField.getfield  s    DHHS!$$$$r;   c                 
   g }|r}t          |d                   }|dk    r |                    d           |dd          }>|dk    r |                    d           |dd          }dt          |          dk     s)t          |          t          |d                   dz   k     r|                    |           n|t          v rxt          |         }t	          |t
                    rFt          |d                   }|                    ||d|dz            f           ||dz   d          }nTt          |d                   }|j        g}|dk    rU	 |                    |d          \  }}	|                    |	           n%# t          $ r |                    |           Y nw xY w	 |d|dz            }
|
r0|                    ||
          \  }
}	|                    |	           |
0t          |          }n%# t          $ r |                    |           Y nnw xY w|                    |           ||dz   d          }nDt          |d                   }|                    ||d|dz            f           ||dz   d          }|}|S )Nr   rq  rn  r0   r   rF   r;   )
r   r  r[   rx  rj   r   rm   r   	Exceptionr  )r6   r7   r   optr  r  olenlval_r   leftotuples               r:   r   zDHCPOptionsField.m2i  s    0	!AaD		ACxx

5!!!abbEAvv

5!!!abbE1vvzzSVVc!A$ii!m33

1k!!Na%% %qt99DJJ1QtaxZ=1222$())AAqt99DF8Dqyy-%&ZZS%9%9FAs
 !KK,,,,	  ) " " "JJqMMM!E"	- 4!8}" -()

3(=(=ID# KK,,, # - "'t	 %   

1
 JJv&&&$())AA1Q4yy

Aq4!8}-...dQhiiLa  0	!b 
s$   E? ?F! F!%?G4 4HHc           	        	 t          |t                    r|S d}|D ]}t          |t                    rt          |          dk    r|d         }|dd          }t          |t                    r|d                    |          }}n^|t          v rDt          |         \  }			fd|D             }nd |D             }d                    |          }nt          d|           |t          j	        d|t          |                    z  }||z  }t          |t                    rA|t          v r8t          |         d         %|t          t          |         d                   z  }Jt          |t                    r|t          |          d	z   z  }vt          |t          t          f          r|t          |          z  }t          d
|           |S )Nr;   rF   r   r0   c           	   3   n   K   | ]/}                     d                     |                    V  0dS ra   )r   any2ir  s     r:   r  z'DHCPOptionsField.i2m.<locals>.<genexpr>  sA      XXC

3QWWS#5F5F G GXXXXXXr;   c              3   4   K   | ]}t          |          V  d S rZ   )r   r  r   s     r:   r  z'DHCPOptionsField.i2m.<locals>.<genexpr>  s(      >>AQ>>>>>>r;   zUnknown field option %sz!BBr   zMalformed option %s)rj   r   r  r[   rv   r  r  r+   re   rf   r   r  r   )
r6   r7   r   rb   r  rm   r  onumovalr  s
    `       @r:   r   zDHCPOptionsField.i2m  s   a 	H 	2 	2A!U## 2A!tudC(( !%sxx~~$DD^++,T2GD!}XXXXXSWXXX>>>>>88D>>DD5t<<<V[c$ii888T	Q$$ 2n)<)< #A&.S*1-...As## 2SVVe^#AU|,, 2\!__$-q1111r;   c                     t                      S rZ   )rs  rg   s    r:   r{   zDHCPOptionsField.randval  s       r;   N)
r<   r=   r>   r   islistr5   r   r   r   r{   ro   r;   r:   r  r    sr          F& & &% % %3 3 3j" " "H! ! ! ! !r;   r  c                   <     e Zd ZdZ edd          gZ fdZ xZS )r]   zDHCP optionsrX   r;   c                    | j         D ][}t          |t                    rD|d         dk    r8dt                              |d         d                                          z  c S \t          t          |                                           S )Nr   r  zDHCP %sr0   r  )	rX   rj   r  	DHCPTypesget
capitalizer4   r]   	mysummary)r6   r  r9   s     r:   r  zDHCP.mysummary  s    , 	I 	IB"e$$ IA.)@)@ 9==A#;#;#F#F#H#HHHHHT4  **,,,r;   )r<   r=   r>   rm   r  rn   r  r?   r@   s   @r:   r]   r]     sR        D##Is334K- - - - - - - - -r;   r]   )dportsportrX   c                    t           j        rt          d           | |t           j        }t	          |          } d|fddt          |           z   fg}||                    d|f           n|dk    rt          d           ||                    d	|f           |+|                    d
|fddt          |          z   fg           |                    ddg dfdg           t          t          d|           t          dd          z  t          dd          z  t          | t                      d          z  t          |          z  fd|i|S )z
    Send a DHCP discover request and return the answer.

    Usage::

        >>> dhcp_request()  # send DHCP discover
        >>> dhcp_request(req_type='request',
        ...              requested_addr='10.53.4.34')  # send DHCP request
    z@conf.checkIPaddr is enabled, may not be able to match the answerNr  r     r   r   z:DHCP Request without requested_addr will likely be ignoredr  r   r8  s      )r  s   MSFT 5.0r  )r0   r   r1   r   r   r   r   r   r   r   w   rS        rn  zff:ff:ff:ff:ff:ff)dstsrcrN   z255.255.255.255)r  r  r  r  r  r  B)rR   rI   rK   r  iface)r,   checkIPaddrr+   r  r)   r!   r  extendr   r*   r   r   r   rB   r&   r]   )hwreq_typer  r   r   r  kargsdhcp_optionss           r:   dhcp_requestr    s   "  
N	
 	
 	
 
z=JE5!!	"	g+,L !-~>????	Y		LMMM[)4555"Ol8.D.DDE
 	 	 	 (	 
 
 
 	 	    %2...
y/000	1"B	  	RWYYc222	3 	\"""		#     r;   c                   P    e Zd ZdZdZ ed          ddddddfd	Zd
 Zd Zd Z	dS )BOOTP_ambootpdzudp and port 68 and port 67z192.168.1.128/25z192.168.1.0/24z192.168.1.1Nr  i  c                     | _         |                    d          dgz   dd         \  }	}
t          t          |
                    }
t	          |
           _        t	          t          |	          |
z             _        t	          t           j                  d|
 z  z             _         _	        |p _
        t          |t                    rt          |          }t          |t                    r# fd|D             }|                                 t!          |          dk    r|\  }| _        | _        | _        i  _        | _        dS )a{  
        :param pool: the range of addresses to distribute. Can be a Net,
                     a list of IPs or a string (always gives the same IP).
        :param network: the subnet range
        :param gw: the gateway IP (can be None)
        :param nameserver: the DNS server IP (by default, same than gw)
        :param domain: the domain to advertise (can be None)

        Other DHCP parameters can be passed as kwargs. See DHCPOptions in dhcp.py.
        For instance::

            dhcpd(pool=Net("10.0.10.0/24"), network="10.0.0.0/8", gw="10.0.10.1",
                  classless_static_routes=["1.2.3.4/32:9.8.7.6"])
        r   32NrF   l    c                 6    g | ]}|j         j        fv|S ro   )network	broadcast)r  r  gwr6   s     r:   
<listcomp>z*BOOTP_am.parse_options.<locals>.<listcomp>q  s.    SSS!qT\4>0R'R'RA'R'R'Rr;   r0   )r   r   r   rv   r   netmaskr   r  r  r  
nameserverrj   r   r   r   reverser[   poolr   r  leaseskwargs)r6   r  r  r  r  r   r  r   r  netwmsks   `  `       r:   parse_optionszBOOTP_am.parse_optionsO  s8   . ]]3''4&0"1"5	c3s88nnCyyDJJ,--d4<00J#4EFGG$*dC   	t99DdH%% 	SSSSStSSSDLLNNNt99>>ED	$(r;   c                     |                     t                    sdS |                    t                    }|j        dk    rdS dS )Nr   r0   )haslayerrB   getlayerrC   )r6   reqreqbs      r:   
is_requestzBOOTP_am.is_request{  sA    ||E"" 	1||E""7a<<1qr;   c                 t    t          d|                    t                    j        d|j                   d S )NzReply z to )printr  r   r  )r6   r  replys      r:   print_replyzBOOTP_am.print_reply  s6    %.."4"4"8"8"8%))DEEEEEr;   c                    |t                    j        }t          | j        t                    r8|| j        vr!| j                                        | j        |<   | j        |         }n| j        }|                    t                    	                                }d|_
        ||_        | j        |_        | j        |_        | j        |_        |`t          |          t#          |          z  t%          |j        |j                  z  |z  }|S )NrE   )r  r  )r   r  rj   r  rw  r  popr  rB   copyrC   rO   r  rP   rM   rQ   r_   r   r   r  r  )r6   r  maciprepbreps         r:   
make_replyzBOOTP_am.make_reply  s    %jndi&& 	$+%%#'9==??C S!BBB||E""''))gggLnnnrbzzz)Ccisy,Q,Q,QQTXX
r;   )
r<   r=   r>   function_namefilterr   r  r  r  r  ro   r;   r:   r  r  K  s        M*F 3122.&!%!#%!%* * * *X  F F F    r;   r  c                       e Zd ZdZd ZdS )DHCP_amdhcpdc                    t                               | |          }t          |v rd |t                   j        D             }|d d| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd	| j	        fd
| j
        ffD             z  }| j        r|| j                                        z  }|                    d           |t          |          z  }|S )Nc                     g | ]P}t          |t                    r9|d          dk    #|d          ddd                    |d         |d                   fQS )r   r  rF   r   )r0   r   r0   )rj   r  r  )r  rC   s     r:   r  z&DHCP_am.make_reply.<locals>.<listcomp>  sl       b%(( .0Un-D-D AA!((A1667-D-D-Dr;   c                 "    g | ]}|d          
|S )r0   ro   r  s     r:   r  z&DHCP_am.make_reply.<locals>.<listcomp>  s0        Q4#  $##r;   r  r   r   r   r   r   r  r   rn  r  )r  r  r]   rX   r  r   r  r  r  r  r   r  itemsr  )r6   r  respr  s       r:   r  zDHCP_am.make_reply  s   ""4--3;; d)+  L
    $'*t{+tw'"DO4($.9"DL1#T%67!4?3	   L { 4 1 1 3 33&&&D....Dr;   N)r<   r=   r>   r  r  ro   r;   r:   r  r    s(        M    r;   r  )Nr   NNNN)Xr   collections.abcr   ImportErrorcollectionsr  re   r   r   scapy.ansmachiner   scapy.base_classesr   scapy.compatr   r   r   scapy.fieldsr	   r
   r   r   r   r   r   r   r   r   r   r   scapy.layers.inetr   r   scapy.layers.l2r   r   scapy.packetr   r   r   scapy.utilsr   r   r   r   r    r!   scapy.volatiler"   r#   r$   r%   r&   r'   r(   
scapy.archr)   scapy.sendrecvr*   scapy.errorr+   scapy.configr,   r\   r.   rB   rq   r~   r   r   r  rx  r  r  r  r8   rj   r   nrm   rs  r  r]   commandsregisterr  r  r  ro   r;   r:   <module>r     sP   %((((((( % % %$$$$$$$$%    				 - - - - - - " " " " " " / / / / / / / / / /                            & % % % % % % % 1 1 1 1 1 1 1 1 < < < < < < < < < < @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @                  % $ $ $ $ $                  	9 9 9 9 9$ 9 9 9(% (% (% (% (%F (% (% (%V# # # # #. # # #A A A A AY A A A% % % % %n % % %70 70 70 70 70 70 70 70D  	 @u@ww}i((@ xxS!!@ wwx##	@
 ww}i((@ ww ),,@ ww}i((@ ww|Y''@ ww	**@ ww|Y''@ !9--@ +Y77@ 
@ 

;%%@ @  !@" y))#@ @$ %@& '@( 		/1%%)@* 		,a00+@, ++-@. 

)3///@0 		-$$1@2 &&3@4 

+T225@6 

?B''7@8 		%q))9@: #Y//;@< 		*A..=@> 		/1%%?@@ 		$a((A@B -y99C@D ++E@ @ @F 		)1--G@H $d++I@J 		+Q//K@L 		)S!!M@N )400O@P 		)1--Q@R 011S@T i((U@V i((W@X Y@Z  ),,[@\ %y11]@^ 		%s++_@` a@b 	**c@d #Y//e@f  ),,g@ @ @h u%%i@j 		(#..k@l na33m@n Y''o@p ##"	(A	  	 q@v w@x 

?D))y@z ''{@| !5))}@~ "D))@@ b!!A@B C@D E@F  ),,G@H I@J !2&&K@L &	22M@ @ @N y))O@P y))Q@R y))S@T i((U@V ++W@X i((Y@Z #Y//[@\ +Y77]@^ _@` a@b c@d e@f g@h !i@j i((k@l "%%m@n ##o@ @ @p  q@r )955s@t /66u@v ++w@x !y@z &{@| '}@~ ##@@ '2		A@B '2		C@D '	+	+E@F )9	5	5G@H &	+	+I@J "B	'	'K@L =!	$	$M@N )1	.	.O@P #Y	/	/Q@ @ @R 	 	 !
""7A..
0 
0S@Z [@\ 	&]@^ )9	5	5_@` y	)	)a@b c@d 	+	+e@f 	!g@h 	i@j &		2	2k@l m@n %r	*	*o@p )R	 	 q@r 	s@t 	&u@v 	w@x 	y@ @z 
		@ @ @D   DAqz!S FAN1    i   4t! t! t! t! t!x t! t! t!n- - - - -6 - - - Cb + + + + Cb + + + + sE2 . . . . E4 , , , , $ $5 5 5 5pL L L L L L L L^    h     s    