a
    kÄ#dDV  ã                y   @   s  d Z ddlmZ ddlmZ zddlmZ W n eyJ   ddlmZ Y n0 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/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ddl@mA  mBZB ddlCmDZD dZEG dd„ deƒZFG dd„ de*ƒZGG dd„ deƒZHG dd„ de4ƒZIG dd„ deƒZJG dd„ deƒZKd d!d"d#d$d%d&d'd(d)d*d+d,d-œZLd.ed/d0ƒed1d2ƒed3d0ƒed4d0ƒed5d0ƒed6d0ƒed7d0ƒed8d0ƒed9d0ƒed:d0ƒed;d0ƒd<ed=d>ƒd?d@edAd0ƒdBdCedDdƒedEdƒedFd0ƒedGdHƒedIdJƒedKd>ƒedLd>ƒedMdJƒedNdƒedOd0ƒedPdƒedQdƒedRdƒedSd0ƒedTd0ƒedUdƒedVd>ƒedWdƒedXdYƒedZd>ƒed[dƒed\d]ƒed^d0ƒed_d0ƒd`edad0ƒedbd0ƒedcdYƒddeded0ƒedfd0ƒedgd0ƒedhdiƒedjdYƒedkdleLƒedmd0ƒeHdng edodƒƒdpedqdrƒedsdtƒedudvƒedwdxƒedydzƒd{d|ed}d0ƒd~eddzƒed€d0ƒed�d0ƒed‚d0ƒedƒd0ƒed„d0ƒed…d0ƒed†d0ƒed‡d0ƒedˆd0ƒd‰dŠd‹dŒd�edŽd0ƒed�dzƒed�dzƒd‘ed’d0ƒed“d>ƒed”d0ƒd•d–d—ed˜dzƒed™dzƒedšdzƒed›d0ƒedœdzƒed�dzƒedždƒedŸdƒed d0ƒeJd¡g eKd¢dƒƒd£d¤ed¥d0ƒed¦d0ƒd§ed¨d0ƒd©dªed«d0ƒd¬ed­dzƒed®dzƒd¯d°d±d²d³d´dµd¶œxZMi ZNeB OeM¡D ]2\ZPZQeReQeSƒ�rFeQZTdZQneQjUZTePeQfeNeT< �q([T[Q[PG d·d¸„ d¸e4ƒZVG d¹dº„ dºeƒZWG d»d¼„ d¼e*ƒZXe(e"eGd½d¾d¿� e(e"eGd¾d½d¿� e)e"eGd½d½d¿� e(eGeXddÀ� eDjYjZdÇdÁdÂ„ƒZ[G dÃdÄ„ dÄeƒZ\G dÅdÆ„ dÆe\ƒZ]dS )È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
é    )Úabsolute_import)Úprint_function)Ú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)ÚRandBinÚRandByteÚ	RandFieldÚRandIPÚRandIntÚRandNumÚRandNumExpo)Úget_if_raw_hwaddr)Úsrp1Úsendp)Úwarning)Úconfs   c‚Scc                       s   e Zd Z‡ fdd„Z‡  ZS )Ú_BOOTP_chaddrc                    s`   |j dkrN|dd … dkr.dt|d d… ƒ S dt|d d… ƒ|dd … f S tt| ƒ ||¡S )Né   é   s
             z%s (+ 10 nul pad)z%s (pad: %s))Úhtyper!   Úsuperr.   Úi2repr)ÚselfÚpktÚv©Ú	__class__© úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/dhcp.pyr3   E   s
    
 z_BOOTP_chaddr.i2repr)Ú__name__Ú
__module__Ú__qualname__r3   Ú__classcell__r9   r9   r7   r:   r.   D   s   r.   c                   @   sÌ   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d�edddd�edddd�eddediƒgZdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&S )'ÚBOOTPÚopr/   ZBOOTREQUESTÚ	BOOTREPLY)r/   é   r1   Zhlenr0   Zhopsr   ÚxidZsecsÚflagsé   z???????????????BÚciaddrú0.0.0.0ÚyiaddrÚsiaddrÚgiaddrÚchaddró    )ÚlengthZsnameé@   Úfileé€   Úoptionsz
DHCP magicc                 C   s*   | j d ttƒ… tkrtS t | |¡S d S ©N)rQ   ÚlenÚ	dhcpmagicÚDHCPr   Úguess_payload_class)r4   Úpayloadr9   r9   r:   rV   a   s    zBOOTP.guess_payload_classc                 C   sL   | j d ttƒ… tkrD| j ttƒd … }| j d ttƒ… | _ |d fS dS d S )N©rL   N)rQ   rS   rT   )r4   ÚsrW   r9   r9   r:   Úextract_paddingg   s
    zBOOTP.extract_paddingc                 C   s   t  d| j¡S )Nz!I)ÚstructÚpackrC   ©r4   r9   r9   r:   Úhashretp   s    zBOOTP.hashretc                 C   s   t |tƒsdS | j|jkS )Nr   )Ú
isinstancer?   rC   )r4   Úotherr9   r9   r:   Úanswerss   s    
zBOOTP.answersN)r;   r<   r=   Únamer
   r   r   r   r   r   r   r.   r   r   rT   Úfields_descrV   rZ   r^   ra   r9   r9   r9   r:   r?   N   s*   
ñ	r?   c                   @   s   e Zd Zdd„ ZdS )Ú_DHCPParamReqFieldListFieldc                 C   s   G dd„ dt ƒ}|ƒ S )Nc                   @   s   e Zd Zdd„ ZdS )z>_DHCPParamReqFieldListField.randval.<locals>._RandReqFieldListc                 S   s   t ƒ gtt ƒ ƒ S rR   )r#   Úintr]   r9   r9   r:   Ú_fix|   s    zC_DHCPParamReqFieldListField.randval.<locals>._RandReqFieldList._fixN©r;   r<   r=   rf   r9   r9   r9   r:   Ú_RandReqFieldList{   s   rh   ©r$   )r4   rh   r9   r9   r:   Úrandvalz   s    z#_DHCPParamReqFieldListField.randvalN©r;   r<   r=   rj   r9   r9   r9   r:   rd   y   s   rd   c                   @   s   e Zd ZdZdd„ ZdS )ÚRandClasslessStaticRoutesFieldz1
    A RandValue for classless static routes
    c                 C   s   dt ƒ tddƒt ƒ f S )Nz%s/%d:%sr   é    )r%   r'   r]   r9   r9   r:   rf   †   s    z#RandClasslessStaticRoutesField._fixN)r;   r<   r=   Ú__doc__rf   r9   r9   r9   r:   rl   �   s   rl   c                   @   s   e Zd Zdd„ ZdS )ÚClasslessFieldListFieldc                 C   s   G dd„ dt ƒ}|ƒ S )Nc                   @   s   e Zd Zdd„ ZdS )z<ClasslessFieldListField.randval.<locals>._RandClasslessFieldc                 S   s   t ƒ gttddƒƒ S )Nr/   é   )rl   re   r'   r]   r9   r9   r:   rf   �   s    zAClasslessFieldListField.randval.<locals>._RandClasslessField._fixNrg   r9   r9   r9   r:   Ú_RandClasslessFieldŒ   s   rq   ri   )r4   rq   r9   r9   r:   rj   ‹   s    zClasslessFieldListField.randvalNrk   r9   r9   r9   r:   ro   Š   s   ro   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
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                 C   sp   t |d ƒ}|d d }|dd| … }t | dd¡¡}|d| d| … }t |¡}|d t|ƒ d	 | S )
Nr   é   é   r/   é   ó    é   ú/ú:)r   ÚsocketÚ	inet_ntoaÚljustÚstr)r4   r5   ÚxÚprefixÚoctetsÚdestÚrouterr9   r9   r:   Úm2iŸ   s    
zClasslessStaticRoutesField.m2ic                 C   sˆ   |sdS t  dt|ƒ¡}t|d ƒ}|dks4|dk rDtd||ƒ dS |d d }t |d ¡d |… }t |d	 ¡}t d
|¡| | S )NrL   z/|:r/   rm   r   úInvalid prefix value: %d (0x%x)rs   rt   rB   Úb)	ÚreÚsplitr}   re   r,   rz   Ú	inet_atonr[   r\   )r4   r5   r~   Zspxr   r€   r�   r‚   r9   r9   r:   Úi2m¯   s    zClasslessStaticRoutesField.i2mc                 C   sh   |sd S t |d ƒ}|dks$|dk r8td||ƒ |g fS d|d d  }||d … |  ||d |… ¡fS )Nr   rm   r„   rw   rs   rt   )r   r,   rƒ   )r4   r5   rY   r   Z	route_lenr9   r9   r:   ÚgetfieldÀ   s    z#ClasslessStaticRoutesField.getfieldc                 C   s   ||   ||¡ S rR   )r‰   )r4   r5   rY   Úvalr9   r9   r:   ÚaddfieldÍ   s    z#ClasslessStaticRoutesField.addfieldc                 C   s   t ƒ S rR   )rl   r]   r9   r9   r:   rj   Ð   s    z"ClasslessStaticRoutesField.randvalN)	r;   r<   r=   rn   rƒ   r‰   rŠ   rŒ   rj   r9   r9   r9   r:   rr   ’   s   rr   ÚdiscoverZofferÚrequestZdeclineZackZnakÚreleaseZinformZforce_renewZlease_queryZlease_unassignedZlease_unknownZlease_active)r/   rB   é   ru   rw   r0   rs   rt   é	   é
   é   é   é   ÚpadÚsubnet_maskrG   Z	time_zoneiô  r‚   Ztime_serverZIEN_name_serverÚname_serverZ
log_serverZcookie_serverZ
lpr_serverzimpress-serverszresource-location-serversÚhostnamez	boot-sizeiè  Z	dump_pathÚdomainzswap-serverZroot_disk_pathzextensions-pathzip-forwardingznon-local-source-routingzpolicy-filterZmax_dgram_reass_sizei,  Zdefault_ttlé2   Zpmtu_timeoutzpath-mtu-plateau-tablezinterface-mtuzall-subnets-localÚbroadcast_addresszperform-mask-discoveryzmask-supplierzrouter-discoveryzrouter-solicitation-addresszstatic-routesztrailer-encapsulationZarp_cache_timeoutzieee802-3-encapsulationZtcp_ttléd   Ztcp_keepalive_intervalZtcp_keepalive_garbageZ
NIS_domainzwww.example.comZ
NIS_serverZ
NTP_serverZvendor_specificZNetBIOS_serverZNetBIOS_dist_serverZNetBIOS_node_typeznetbios-scopezfont-serverszx-display-managerÚrequested_addrÚ
lease_timeiÀ¨  zdhcp-option-overloadúmessage-typer/   Ú	server_idÚparam_req_listÚopcodeÚerror_messageZmax_dhcp_sizeiÜ  Úrenewal_timei`T  Zrebinding_timei¨“  Úvendor_class_idÚidÚ	client_idÚ znwip-domain-nameZNISplus_domainZNISplus_serverZtftp_server_namezboot-file-namezmobile-ip-home-agentZSMTP_serverZPOP3_serverZNNTP_serverZ
WWW_serverZFinger_serverZ
IRC_serverZStreetTalk_serverZStreetTalk_Dir_AssistanceZ
user_classZslp_service_agentZslp_service_scopeÚclient_FQDNZrelay_agent_informationz
nds-serverznds-tree-nameznds-contextzbcms-controller-namesizbcms-controller-addresszclient-last-transaction-timezassociated-ipZpxe_client_architectureZpxe_client_network_interfaceZpxe_client_machine_identifierzuap-serversZpcodeZtcodeznetinfo-server-addressznetinfo-server-tagzdefault-urlzauto-configzname-service-searchzsubnet-selectionZclassless_static_routesZrouteZvendor_classZvendor_specific_informationZtftp_server_ip_addressz
pana-agentzv4-lostzcapwap-ac-v4Zsip_ua_service_domainszrdnss-selectionZtftp_server_addresszv4-portparamszv4-captive-portalzmud-urlZpxelinux_magicZpxelinux_configuration_fileZpxelinux_path_prefixZpxelinux_reboot_timez
option-6rdzv4-access-domainÚend)xr   r/   rB   r�   ru   rw   r0   rs   rt   r‘   r’   r“   r”   r•   é   é   rE   é   é   é   é   é   é   é   é   é   é   é   rp   é   é   é   rm   é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   r›   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   rN   éA   éB   éC   éD   éE   éF   éG   éH   éI   éJ   éK   éL   éM   éN   éO   éQ   éR   éU   éV   éW   éX   éY   é[   é\   é]   é^   éa   éb   r�   ée   ép   éq   ér   ét   éu   év   éy   é|   é}   rP   éˆ   é‰   éŠ   é�   é’   é–   éŸ   é    é¡   éÐ   éÑ   éÒ   éÓ   éÔ   éÕ   éÿ   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚRandDHCPOptionsNc                 C   s^   |d u rt dƒ}|| _|d u r,ttddƒƒ}|| _tt t¡ƒ| _	| j	 
d¡ | j	 
d¡ d S )Ngš™™™™™©?r   r  r–   r«   )r(   Úsizer"   r'   ÚrndstrÚlistÚsixÚ
itervaluesÚDHCPOptionsÚ_optsÚremove)r4   r  r  r9   r9   r:   Ú__init__z  s    zRandDHCPOptions.__init__c                 C   sv   g }t | jƒD ]b}t | j¡}t|tƒr>| || jd f¡ q| 	¡  
¡ }t|tƒr`|d d… }| |j|f¡ q|S )Nr/   r  )Úranger  ÚrandomÚchoicer  r_   r}   Úappendr  rj   rf   Úbytesrb   )r4   r@   ÚkÚoÚrr9   r9   r:   rf   …  s    

zRandDHCPOptions._fix)NN)r;   r<   r=   r  rf   r9   r9   r9   r:   r  y  s   
r  c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zd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`
    r/   c                    sÊ   g }|D ]²}t |tƒr¬t|ƒdkr¬|d tv rxt t|d  d tƒrxt|d  d ‰ d ‡ ‡fdd„|dd … D ƒ¡}nd dd„ |dd … D ƒ¡}| d|d |f ¡ q| t|ƒ¡ qd	d
 |¡ S )NrB   r   r/   ú,c                 3   s   | ]}ˆ   ˆ|¡V  qd S rR   )r3   ©Ú.0r‹   ©Úfr5   r9   r:   Ú	<genexpr>¢  rL   z*DHCPOptionsField.i2repr.<locals>.<genexpr>c                 s   s   | ]}t |ƒV  qd S rR   )Úreprr#  r9   r9   r:   r'  ¤  rL   z%s=%sz[%s]ú )r_   ÚtuplerS   ÚDHCPRevOptionsr   Újoinr  r    )r4   r5   r~   rY   r6   Úvvr9   r%  r:   r3   œ  s    "$zDHCPOptionsField.i2reprc                 C   s   d|   ||¡fS )NrL   )rƒ   )r4   r5   rY   r9   r9   r:   rŠ   ª  s    zDHCPOptionsField.getfieldc                 C   s°  g }|�r¬t |d ƒ}|dkr6| d¡ |dd … }q|dkrV| d¡ |dd … }qt|ƒdk szt|ƒt |d ƒd k rŠ| |¡ �q¬q|tv �rtt| }t|tƒrÞt |d ƒ}| ||d|d … f¡ ||d d … }n”t |d ƒ}|jg}z8|d|d … }|�r(| ||¡\}}	| |	¡ �qW n$ t�yN   | |¡ Y �q¬Y n
0 t	|ƒ}
| |
¡ ||d d … }qt |d ƒ}| ||d|d … f¡ ||d d … }q|S )Nr   r  r«   r/   r–   rB   )
r   r  rS   r  r_   r}   rb   rŠ   Ú	Exceptionr*  )r4   r5   r~   Úoptr  r&  ZolenÚlvalÚleftr‹   Zotupler9   r9   r:   rƒ   ­  sJ    

$




zDHCPOptionsField.m2ic           	         sd  t |tƒr|S d}|D �]F}t |tƒrÚt|ƒdkrÚ|d }|dd … }t |tƒrb|d |¡ }}nX|tv r®t| \}‰ ˆ d ur”‡ ‡fdd„|D ƒ}ndd„ |D ƒ}d |¡}ntd|ƒ q|t 	d	|t|ƒ¡7 }||7 }qt |tƒ�r|tv �rt| d d u �r|t
t| d ƒ7 }qt |tƒ�r6|t
|ƒd
 7 }qt |ttfƒ�rT|t|ƒ7 }qtd|ƒ q|S )NrL   rB   r   r/   c              	   3   s$   | ]}ˆ   ˆd ˆ  ˆ|¡¡V  qdS rX   )rŒ   Zany2ir#  r%  r9   r:   r'  æ  rL   z'DHCPOptionsField.i2m.<locals>.<genexpr>c                 s   s   | ]}t |ƒV  qd S rR   )r	   ©r$  r~   r9   r9   r:   r'  è  rL   zUnknown field option %sz!BBrv   zMalformed option %s)r_   r}   r*  rS   re   r,  r+  r,   r[   r\   r   r  r	   )	r4   r5   r~   rY   r  rb   r0  ZonumZovalr9   r%  r:   r‰   Ø  s:    




ÿzDHCPOptionsField.i2mc                 C   s   t ƒ S rR   )r  r]   r9   r9   r:   rj   ü  s    zDHCPOptionsField.randvalN)
r;   r<   r=   rn   Zislistr3   rŠ   rƒ   r‰   rj   r9   r9   r9   r:   r!  “  s   +$r!  c                       s,   e Zd ZdZeddƒgZ‡ fdd„Z‡  ZS )rU   zDHCP optionsrQ   rL   c                    sL   | j D ]6}t|tƒr|d dkrdt |d d¡ ¡    S qtt| ƒ ¡ S )Nr   r    zDHCP %sr/   r©   )	rQ   r_   r*  Ú	DHCPTypesÚgetÚ
capitalizer2   rU   Ú	mysummary)r4   r§   r7   r9   r:   r6    s    
zDHCP.mysummary)r;   r<   r=   rb   r!  rc   r6  r>   r9   r9   r7   r:   rU      s   rU   rÛ   rÜ   )ÚdportÚsport©rQ   c           	      K   s  t jrtdƒ | du r0|du r$t j}t|ƒ\}} d|fdd|  fg}|dur\| d|f¡ n|dkrltdƒ |dur‚| d	|f¡ |dur¨| d
|fddt|ƒ fg¡ | ddg d¢fdg¡ tt	d| d�t
ddd� tddd� t| tƒ dd� t|d� 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™   rª   s      )r¦   s   MSFT 5.0r¢   )r/   r�   r0   r­   r»   r¼   rÆ   rÇ   rÉ   rÊ   éw   rü   éù   éü   r«   zff:ff:ff:ff:ff:ff)ÚdstÚsrcrG   z255.255.255.255)r?  r>  rÜ   rÛ   ©r8  r7  ÚB)rK   rC   rD   r9  Úiface)r-   ZcheckIPaddrr,   rB  r)   r  Úextendr	   r*   r   r   r   r?   r&   rU   )	ZhwZreq_typer¡   rž   r™   rB  ZkargsÚ_Údhcp_optionsr9   r9   r:   Údhcp_request  sT    ÿ
þþ
û

ÿ
þýüÿúúrF  c                   @   sP   e Zd ZdZdZeeƒZedƒdddddd	fd
d„Z	dd„ Z
dd„ Zdd„ ZdS )ÚBOOTP_amZbootpdzudp and port 68 and port 67z192.168.1.128/25z192.168.1.0/24z192.168.1.1NZlocalnetrÖ   i  c           
         sÜ   |ˆ_ | d¡dg dd… \}}	tt|	ƒƒ}	t|	ƒˆ_tt|ƒ|	@ ƒˆ_ttˆjƒd|	 @ B ƒˆ_ˆ ˆ_	|ppˆ ˆ_
t|tjƒrˆt|ƒ}t|tƒr®‡ ‡fd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)
        rx   Z32NrB   l   ÿÿ c                    s"   g | ]}|ˆ ˆj ˆjfvr|‘qS r9   )ÚnetworkÚ	broadcast)r$  r  ©Úgwr4   r9   r:   Ú
<listcomp>j  rL   z*BOOTP_am.parse_options.<locals>.<listcomp>r/   )rš   r‡   r   re   r   Únetmaskr   rH  rI  rK  Ú
nameserverr_   r  Ústring_typesr   r   ÚreverserS   ÚpoolrŸ   r¥   Úleases)
r4   rQ  rH  rK  rN  rš   r¥   rŸ   ZnetwZmskr9   rJ  r:   Úparse_optionsO  s&    


zBOOTP_am.parse_optionsc                 C   s*   |  t¡sdS | t¡}|jdkr&dS dS )Nr   r/   )Zhaslayerr?   Úgetlayerr@   )r4   ÚreqZreqbr9   r9   r:   Ú
is_requests  s    


zBOOTP_am.is_requestc                 C   s   t d| t¡j|jf ƒ d S )NzReply %s to %s)ÚprintrT  r   r>  )r4   rD  Zreplyr9   r9   r:   Úprint_reply{  s    zBOOTP_am.print_replyc                 C   s¤   |t  j}t| jtƒr<|| jvr0| j ¡ | j|< | j| }n| j}| t¡ 	¡ }d|_
||_| j|_| j|_| j|_|`t |d�t|d� t|j|jd� | }|S )NrA   )r>  r@  )r   r?  r_   rQ  r  rR  ÚpoprT  r?   Úcopyr@   rH   rK  rI   rF   rJ   rW   r   r   r7  r8  )r4   rU  ÚmacÚipZrepbÚrepr9   r9   r:   Ú
make_reply~  s    

(zBOOTP_am.make_reply)r;   r<   r=   Úfunction_nameÚfilterÚstaticmethodr+   Zsend_functionr   rS  rV  rX  r^  r9   r9   r9   r:   rG  J  s   ù
$rG  c                   @   s   e Zd ZdZdd„ ZdS )ÚDHCP_amZdhcpdc                 C   s–   t  | |¡}t|v r’dd„ |t jD ƒ}|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 ƒ7 }| d¡ |t|d� }|S )Nc                 S   sD   g | ]<}t |tƒr|d  dkr|d  dddœ |d |d ¡f‘qS )r   r    rB   rw   )r/   r�   r/   )r_   r*  r4  )r$  r@   r9   r9   r:   rL  ˜  s   þz&DHCP_am.make_reply.<locals>.<listcomp>c                 S   s   g | ]}|d  dur|‘qS )r/   Nr9   r2  r9   r9   r:   rL  �  s   
ör¡   rš   r‚   r˜   rœ   r—   r¥   rŸ   r«   r9  )rG  r^  rU   rQ   rK  rš   rN  rI  rM  r¥   rŸ   r  )r4   rU  ÚresprE  r9   r9   r:   r^  •  s&    þøÿ
zDHCP_am.make_replyN)r;   r<   r=   r_  r^  r9   r9   r9   r:   rb  ’  s   rb  )Nr�   NNNN)^rn   Ú
__future__r   r   Úcollections.abcr   ÚImportErrorÚcollectionsr  r[   rz   r†   Zscapy.ansmachiner   Zscapy.base_classesr   Zscapy.compatr   r   r	   Zscapy.fieldsr
   r   r   r   r   r   r   r   r   r   r   r   Zscapy.layers.inetr   r   Zscapy.layers.l2r   r   Zscapy.packetr   r   r   Zscapy.utilsr   r   r   r    r!   Zscapy.volatiler"   r#   r$   r%   r&   r'   r(   Z
scapy.archr)   Zscapy.sendrecvr*   r+   Zscapy.errorr,   Zscapy.libs.sixZlibsr  Zscapy.configr-   rT   r.   r?   rd   rl   ro   rr   r3  r  r+  Ú	iteritemsr  r6   r_   r}   Únrb   r  r!  rU   ÚcommandsÚregisterrF  rG  rb  r9   r9   r9   r:   Ú<module>   s’  	8$

+	Jó
þýƒ m      û8H