a
    kÄ#d¶4  ã                   @   s  d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ d
ddddddddddddddddddœZdddd d!d"d#d$d%d&d'd(d(d)d*d+d,d-d.d/d0d1d2d(d(d3d4œZd5d6„ Z G d7d8„ d8eƒZ!G d9d
„ d
e!ƒZ"d:d;d<œZ#d=Z$d>Z%G d?d@„ d@eƒZ&G dAdB„ dBe&ƒZ'G dCdD„ dDe&ƒZ(dEdF„ Z)G dGd„ de!ƒZ*G dHd„ de!ƒZ+g dI¢dJdK„ e,dLddMƒD ƒ Z-G dNd„ de!ƒZ.G dOd„ de!ƒZ/G dPd„ de!ƒZ0dQdRdSœZ1G dTdU„ dUe!ƒZ2G dVdW„ dWe!ƒZ3G dXd„ de!ƒZ4G dYd„ de!ƒZ5G dZd„ de!ƒZ6G d[d„ de!ƒZ7G d\d„ de!ƒZ8G d]d„ de!ƒZ9G d^d_„ d_eƒZ:G d`d„ de!ƒZ;G dad„ de!ƒZ<G dbd„ de!ƒZ=G dcd„ de!ƒZ>G ddd„ de*ƒZ?G ded„ de!ƒZ@G dfdg„ dge!ƒZAG dhdi„ diƒZBG djdk„ dkeBe!ƒZCeeeCdldmdnœƒ dS )oz4
Cisco Discovery Protocol (CDP) extension for Scapy
é    )Úabsolute_importN)ÚPacketÚbind_layers)ÚByteEnumFieldÚ	ByteFieldÚFieldLenFieldÚ
FlagsFieldÚIP6FieldÚIPFieldÚOUIFieldÚPacketListFieldÚ
ShortFieldÚStrLenFieldÚ
XByteFieldÚXShortEnumFieldÚXShortField)Úchecksum)ÚSNAP)ÚorbÚchb)ÚconfÚCDPMsgDeviceIDÚ
CDPMsgAddrÚCDPMsgPortIDÚCDPMsgCapabilitiesÚCDPMsgSoftwareVersionÚCDPMsgPlatformÚCDPMsgProtoHelloÚCDPMsgVTPMgmtDomainÚCDPMsgNativeVLANÚCDPMsgDuplexÚCDPMsgVoIPVLANReplyÚCDPMsgVoIPVLANQueryÚCDPMsgPowerÚ	CDPMsgMTUÚCDPMsgTrustBitmapÚCDPMsgUntrustedPortCoSÚCDPMsgMgmtAddrÚCDPMsgUnknown19)é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   ú	Device IDÚ	AddressesúPort IDÚCapabilitiesúSoftware VersionÚPlatformú	IP PrefixúProtocol HelloúVTP Management DomainúNative VLANÚDuplexz)CDP Unknown command (send us a pcap file)úVoIP VLAN ReplyúVoIP VLAN QueryÚPowerÚMTUúTrust BitmapúUntrusted Port CoSzSystem Namez
System OIDúManagement AddressZLocationzPower Available)r)   r*   r+   r,   r-   r.   é   r/   r0   r1   r2   é   é   r3   r4   r5   r6   r7   r8   é   é   r9   é   é   r:   é   c                 K   s�   t j}t| ƒdkr€t d| d d… ¡d }|dkrjt| ƒdkrjt d| dd… ¡d }|dkrdd}qvd}nt |d	¡}tƒ | }|| fi |¤ŽS )
Nr*   ú!Hr   rM   r,   r/   ÚCDPMsgIPGatewayÚCDPMsgIPPrefixÚCDPMsgGeneric)r   Ú	raw_layerÚlenÚstructÚunpackÚ_cdp_tlv_clsÚgetÚglobals)ÚpÚkargsÚclsÚtZtmp_lenÚclsname© re   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/cdp.pyÚ_CDPGuessPayloadClassc   s    
rg   c                   @   sL   e Zd ZdZeddeƒedddddd„ d	�edd
dd„ dd�gZdd„ Z	dS )rX   zCDP Generic MessageÚtypeNrZ   ÚvalrU   c                 C   s   |d S ©Nr,   re   ©ÚpktÚxre   re   rf   Ú<lambda>x   ó    zCDPMsgGeneric.<lambda>©ÚadjustÚ c                 C   s
   | j d S rj   ©rZ   ©rm   re   re   rf   rn   y   ro   éûÿ  ©Úlength_fromÚ
max_lengthc                 C   s   t jS ©N©r   Zpadding_layer©Úselfr`   re   re   rf   Úguess_payload_class|   s    z!CDPMsgGeneric.guess_payload_class)
Ú__name__Ú
__module__Ú__qualname__Únamer   Ú_cdp_tlv_typesr   r   Úfields_descr}   re   re   re   rf   rX   t   s   

ÿÿýrX   c                   @   s   e Zd ZdZdZdS )r   r;   r)   N©r~   r   r€   r�   rh   re   re   re   rf   r   €   s   ZNLPIDz802.2)r)   r*   ó   Ìs   ªª   †Ýc                
   @   sf   e Zd ZdZeddeƒeddddƒedddd	„ d
d�edddd	„ d�edddd	„ dd�gZdd„ Z	dS )ÚCDPAddrRecordzCDP AddressÚptyper)   ÚplenNÚprotoÚBc                 C   s   | j S ry   ©rˆ   rt   re   re   rf   rn   Ž   ro   zCDPAddrRecord.<lambda>éÿ   rv   Úaddrlenc                 C   s   | j S ry   )Úaddrrt   re   re   rf   rn   �   ro   )Z	length_ofrŽ   c                 C   s   | j S ry   )r�   rt   re   re   rf   rn   ‘   ro   iÿÿ  c                 C   s   t jS ry   rz   r{   re   re   rf   r}   ”   s    z!CDPAddrRecord.guess_payload_class)
r~   r   r€   r�   r   Ú_cdp_addr_record_ptyper   r   rƒ   r}   re   re   re   rf   r†   Š   s   
ÿÿûr†   c                   @   sL   e Zd ZdZeddeƒeddddƒededd„ d	d
�e	ddƒe
ddƒgZdS )ÚCDPAddrRecordIPv4zCDP Address IPv4r‡   r)   rˆ   r‰   rŠ   c                 C   s   | j S ry   r‹   rt   re   re   rf   rn   �   ro   zCDPAddrRecordIPv4.<lambda>rŒ   rv   r�   r,   rŽ   z0.0.0.0N)r~   r   r€   r�   r   r�   r   r   Ú_cdp_addrrecord_proto_ipr   r
   rƒ   re   re   re   rf   r�   ˜   s   
ÿûr�   c                   @   sL   e Zd ZdZeddeƒeddddƒededd	„ d
d�e	ddƒe
ddƒgZdS )ÚCDPAddrRecordIPv6zCDP Address IPv6r‡   r*   rˆ   r/   r‰   rŠ   c                 C   s   | j S ry   r‹   rt   re   re   rf   rn   §   ro   zCDPAddrRecordIPv6.<lambda>rŒ   rv   r�   r5   rŽ   z::1N)r~   r   r€   r�   r   r�   r   r   Ú_cdp_addrrecord_proto_ipv6r   r	   rƒ   re   re   re   rf   r’   ¢   s   
ÿûr’   c                 K   sh   t j}t| ƒdkrXt| d ƒ}| d|d … }|tkr<d}n|tkrJd}nd}tƒ | }|| fi |¤ŽS )Nr*   r)   r�   r’   r†   )r   rY   rZ   r   r‘   r“   r_   )r`   ra   rb   rˆ   r‰   rd   re   re   rf   Ú_CDPGuessAddrRecord¬   s    
r”   c                	   @   sN   e Zd ZdZeddeƒeddƒeddddd	�edg e	d
d„ d�gZ
dd„ ZdS )r   r<   rh   r*   rZ   NZnaddrz!IrŽ   )ÚfmtZcount_ofc                 C   s
   | j d S )Nr/   rs   rt   re   re   rf   rn   Ä   ro   zCDPMsgAddr.<lambda>©rw   c                 C   s>   | j d u r2|d d… t dt |ƒ¡ |dd …  }|| }|S ©Nr*   rU   r,   )rZ   r[   Úpack)r|   rl   Úpayr`   re   re   rf   Ú
post_buildÆ   s    
(zCDPMsgAddr.post_build)r~   r   r€   r�   r   r‚   r   r   r   r”   rƒ   rš   re   re   re   rf   r   ¾   s   
ÿýc                   @   sB   e Zd ZdZeddeƒedddddd	„ d
�edddd	„ d�gZdS )r   r=   rh   r+   rZ   NZifacerU   c                 C   s   |d S rj   re   rk   re   re   rf   rn   Ñ   ro   zCDPMsgPortID.<lambda>rp   zPort 1c                 C   s
   | j d S rj   rs   rt   re   re   rf   rn   Ò   ro   r–   ©	r~   r   r€   r�   r   r‚   r   r   rƒ   re   re   re   rf   r   Í   s   

ÿý)ZRouterZTransparentBridgeZSourceRouteBridgeZSwitchÚHostZIGMPCapableZRepeaterc                 C   s   g | ]}d | ‘qS )zBit%dre   )Ú.0rm   re   re   rf   Ú
<listcomp>Û   ro   rž   r:   éÿÿÿÿc                   @   s2   e Zd ZdZeddeƒeddƒedddeƒgZ	d	S )
r   r>   rh   r,   rZ   r/   Úcapr   é    N)
r~   r   r€   r�   r   r‚   r   r   Ú_cdp_capabilitiesrƒ   re   re   re   rf   r   Þ   s
   
þc                   @   s   e Zd ZdZdZdS )r   r?   r-   Nr„   re   re   re   rf   r   å   s   c                   @   s   e Zd ZdZdZdS )r   r@   r.   Nr„   re   re   re   rf   r   ê   s   ZHalfÚFull)r   r)   c                   @   s2   e Zd ZdZdZeddeƒeddƒeddƒgZ	dS )	rV   z
IP GatewayrM   rh   rZ   r/   Z	defaultgwú192.168.0.1N)
r~   r   r€   r�   rh   r   r‚   r   r
   rƒ   re   re   re   rf   rV   ô   s   
þrV   c                   @   s:   e Zd ZdZdZeddeƒeddƒeddƒe	dd	ƒgZ
d
S )rW   rA   rM   rh   rZ   r0   Úprefixr¤   rˆ   rS   N)r~   r   r€   r�   rh   r   r‚   r   r
   r   rƒ   re   re   re   rf   rW   ü   s   
ýrW   c                	   @   sJ   e Zd ZdZdZeddeƒeddƒeddƒe	dd	ƒe
d
ddd„ d�gZdS )r   rB   r/   rh   rZ   r¡   ZouirN   Zprotocol_idr   Údatarr   c                 C   s
   | j d S )Nr0   rs   ©r`   re   re   rf   rn     ro   zCDPMsgProtoHello.<lambda>r–   N)r~   r   r€   r�   rh   r   r‚   r   r   r   r   rƒ   re   re   re   rf   r     s   
úc                   @   s   e Zd ZdZdZdS )r   rC   r0   Nr„   re   re   re   rf   r     s   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	r   rD   rh   r1   rZ   r.   Úvlanr)   N©r~   r   r€   r�   r   r‚   r   rƒ   re   re   re   rf   r     s
   
þc                   @   s0   e Zd ZdZeddeƒeddƒeddeƒgZ	dS )	r    rE   rh   r2   rZ   r-   Zduplexr   N)
r~   r   r€   r�   r   r‚   r   r   Ú_cdp_duplexrƒ   re   re   re   rf   r      s
   

þc                   @   s6   e Zd ZdZeddeƒeddƒeddƒeddƒgZd	S )
r!   rF   rh   r3   rZ   rM   Ústatusr)   r¨   N)	r~   r   r€   r�   r   r‚   r   r   rƒ   re   re   re   rf   r!   $  s   
ýc                
   @   sX   e Zd ZdZdZeddeƒedddddd	„ d
�eddƒe	ddƒe
dddd	„ dd�gZdS )r"   rG   r4   rh   rZ   NZunknown2rU   c                 C   s   |d S ©NrM   re   rk   re   re   rf   rn   1  ro   zCDPMsgVoIPVLANQuery.<lambda>©r•   rq   Zunknown1r   r¨   r)   rr   c                 C   s
   | j d S r¬   rs   r§   re   re   rf   rn   5  ro   iøÿ  rv   )r~   r   r€   r�   rh   r   r‚   r   r   r   r   rƒ   re   re   re   rf   r"   ,  s   

ÿÿúc                   @   s   e Zd Zdd„ ZdS )Ú_CDPPowerFieldc                 C   s   |d u rd}d| S )Nr   z%d mWre   )r|   rl   rm   re   re   rf   Úi2repr:  s    z_CDPPowerField.i2reprN)r~   r   r€   r¯   re   re   re   rf   r®   9  s   r®   c                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	r#   rH   rh   r5   rZ   r.   Úpoweri9  N)	r~   r   r€   r�   r   r‚   r   r®   rƒ   re   re   re   rf   r#   @  s
   
þc                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	r$   rI   rh   r6   rZ   r.   ZmtuiÜ  Nr©   re   re   re   rf   r$   H  s
   
þc                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	r%   rJ   rh   r7   rZ   r-   Ztrust_bitmapr   N©	r~   r   r€   r�   r   r‚   r   r   rƒ   re   re   re   rf   r%   P  s
   
þc                   @   s.   e Zd ZdZeddeƒeddƒeddƒgZdS )	r&   rK   rh   r8   rZ   r-   Zuntrusted_port_cosr   Nr±   re   re   re   rf   r&   W  s
   
þc                   @   s   e Zd ZdZdZdS )r'   rL   r9   Nr„   re   re   re   rf   r'   ^  s   c                   @   s   e Zd ZdZdZdS )r(   zUnknown CDP Messager:   Nr„   re   re   re   rf   r(   c  s   c                   @   sD   e Zd ZdZeddeƒedddddd„ d	�edd
dd„ dd�gZdS )ÚCDPMsgzCDP rh   NrZ   ri   rU   c                 C   s   |d S rj   re   rk   re   re   rf   rn   l  ro   zCDPMsg.<lambda>r­   rr   c                 C   s
   | j d S rj   rs   rt   re   re   rf   rn   m  ro   ru   rv   r›   re   re   re   rf   r²   h  s   

ÿÿýr²   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_CDPChecksumc                 C   sb   t |ƒd rZt|d ƒ}|dkr8|dd… d t|ƒ S |dd… d tt|ƒd ƒ S n|S dS )z¬Check for odd packet length and pad according to Cisco spec.
        This padding is only used for checksum computation.  The original
        packet should not be altered.r*   rŸ   é€   Nó    ó   ÿr)   )rZ   r   r   )r|   rl   Zlast_chrre   re   rf   Ú
_check_lenr  s    "z_CDPChecksum._check_lenc                 C   sH   || }| j d u rDt|  |¡ƒ}|d d… t d|¡ |dd …  }|S r—   )Úcksumr   r·   r[   r˜   )r|   rl   r™   r`   r¸   re   re   rf   rš     s
    
$z_CDPChecksum.post_buildN)r~   r   r€   r·   rš   re   re   re   rf   r³   q  s   r³   c                   @   s6   e Zd ZdZeddƒeddƒeddƒedg eƒgZdS )	Ú	CDPv2_HDRz"Cisco Discovery Protocol version 2Úversr*   Úttlé´   r¸   NÚmsg)	r~   r   r€   r�   r   r   r   rg   rƒ   re   re   re   rf   r¹   ‡  s   
ýr¹   i    rN   )ÚcodeZOUI)DÚ__doc__Ú
__future__r   r[   Zscapy.packetr   r   Zscapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   r   Zscapy.layers.inetr   Zscapy.layers.l2r   Zscapy.compatr   r   Zscapy.configr   r]   r‚   rg   rX   r   r�   r‘   r“   r†   r�   r’   r”   r   r   Úranger¢   r   r   r   rª   rV   rW   r   r   r   r    r!   r"   r®   r#   r$   r%   r&   r'   r(   r²   r³   r¹   re   re   re   rf   Ú<module>   s¸   <êç


ú	
		