
    h8                     <   d 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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 i d	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-Zi d	d.dd/dd0dd1dd2dd3d4d5dd6dd7dd8dd9d:d;d<d;dd=dd>d!d?d#d@dAdBdCdDdEdFd;dGdHdI	ZdJ Z  G dK dLe          Z! G dM d
e!          Z"dNdOdPZ#dQZ$dRZ% G dS dTe          Z& G dU dVe&          Z' G dW dXe&          Z(dY Z) G dZ de!          Z* G d[ de!          Z+g d\d]  e,d^dd_          D             z   Z- G d` de!          Z. G da de!          Z/ G db de!          Z0dcdddeZ1 G df dge!          Z2 G dh die!          Z3 G dj de!          Z4 G dk de!          Z5 G dl de!          Z6 G dm de!          Z7 G dn de!          Z8 G do d e!          Z9 G dp dqe          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!          ZA G dy dze!          ZB G d{ d|          ZC G d} d~eCe!          ZD eeeDdd:d           dS )z4
Cisco Discovery Protocol (CDP) extension for Scapy
    N)Packetbind_layers)ByteEnumField	ByteFieldFieldLenFieldFieldListField
FlagsFieldIntField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CDPMsgPowerRequestCDPMsgPowerAvailable)      	Device ID	AddressesPort IDCapabilitiesSoftware VersionPlatform   	IP PrefixProtocol HelloVTP Management DomainNative VLANDuplex   z)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 AddressLocationPower RequestPower Available)	r5   r7         r9         r=   r>   c                    t           j        }t          |           dk    rt          j        d| d d                   d         }|dk    rBt          |           dk    r/t          j        d| dd                   d         }|dk    rd}nd}nt
                              |d	          }t                      |         } || fi |S )
Nr   !Hr   rE   r   r%   CDPMsgIPGatewayCDPMsgIPPrefixCDPMsgGeneric)r   	raw_layerlenstructunpack_cdp_tlv_clsgetglobals)pkargsclsttmp_lenclsnames         U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/cdp.py_CDPGuessPayloadClassrn   d   s    
.C
1vv{{M$"1"&&q);;3q66A::mD!AaC&11!4G!||+*"&&q/::Gii 3q??E??    c                   r    e Zd ZdZ edde           eddddd            edd	d
 d          gZd Z	dS )r_   zCDP Generic MessagetypeNra   valr\   c                     |dz   S Nr    pktxs     rm   <lambda>zCDPMsgGeneric.<lambda>y   
    q1u ro   adjust c                     | j         dz
  S rt   ra   rx   s    rm   ry   zCDPMsgGeneric.<lambda>z       quqy ro     length_from
max_lengthc                     t           j        S Nr   padding_layerselfrg   s     rm   guess_payload_classz!CDPMsgGeneric.guess_payload_class}       !!ro   )
__name__
__module____qualname__namer   _cdp_tlv_typesr   r   fields_descr   ru   ro   rm   r_   r_   u   s         D"?64@@ =eT(<(<> > >;ub6H6H*/1 1 12K" " " " "ro   r_   c                       e Zd ZdZdZdS )r   r?   r   Nr   r   r   r   rq   ru   ro   rm   r   r      s        DDDDro   NLPIDz802.2)r   r      s      c            
           e Zd ZdZ edde           edddd           eddd d	
           eddd            eddd d
          gZd Z	dS )CDPAddrRecordzCDP Addressptyper   plenNprotoBc                     | j         S r   r   r   s    rm   ry   zCDPAddrRecord.<lambda>   s    16 ro      r   addrlenc                     | j         S r   )addrr   s    rm   ry   zCDPAddrRecord.<lambda>   s    QV ro   )	length_ofr   c                     | j         S r   )r   r   s    rm   ry   zCDPAddrRecord.<lambda>   s    !) ro   i  c                     t           j        S r   r   r   s     rm   r   z!CDPAddrRecord.guess_payload_class   r   ro   )
r   r   r   r   r   _cdp_addr_record_ptyper   r   r   r   ru   ro   rm   r   r      s        D =$0FGG =w<<;w//*-/ / / =DOOLLL;vt9K9K*/1 1 12K" " " " "ro   r   c                       e Zd ZdZ edde           edddd           eded d	           e	d
d           e
dd          gZdS )CDPAddrRecordIPv4zCDP Address IPv4r   r   r   r   r   c                     | j         S r   r   r   s    rm   ry   zCDPAddrRecordIPv4.<lambda>   s    QV ro   r   r   r   r   r   z0.0.0.0N)r   r   r   r   r   r   r   r   _cdp_addrrecord_proto_ipr   r   r   ru   ro   rm   r   r      s        D =$0FGG =GS99;w(@+;+;M M M:i++769--/KKKro   r   c                       e Zd ZdZ edde           edddd           eded d	
           e	dd           e
dd          gZdS )CDPAddrRecordIPv6zCDP Address IPv6r   r   r   r%   r   r   c                     | j         S r   r   r   s    rm   ry   zCDPAddrRecordIPv6.<lambda>   s    AF ro   r   r   r   r1   r   z::1N)r   r   r   r   r   r   r   r   _cdp_addrrecord_proto_ipv6r   r   r   ru   ro   rm   r   r      s        D =$0FGG =GS99;w(B+:?sL L L:i,,8FE**,KKKro   r   c                     t           j        }t          |           dk    rTt          | d                   }| d|dz            }|t          k    rd}n|t
          k    rd}nd}t                      |         } || fi |S )Nr   r   r   r   r   )r   r`   ra   r   r   r   rf   )rg   rh   ri   r   r   rl   s         rm   _CDPGuessAddrRecordr      s    
.C
1vv{{1Q4yy!D1H*,,,)GG000)GG%Gii 3q??E??ro   c            	           e Zd ZdZ edde           edd           edddd	           edg e	d
           gZ
d ZdS )r   r@   rq   r   ra   Nnaddrz!Ir   )fmtcount_ofc                     | j         dz
  S Nr%   r   r   s    rm   ry   zCDPMsgAddr.<lambda>   s    	 ro   r   c                     | j         8|d d         t          j        dt          |                    z   |dd          z   }||z   }|S Nr   r\   r   )ra   rb   pack)r   rw   payrg   s       rm   
post_buildzCDPMsgAddr.post_build   sI    8bqb'FKc#hh777#abb'AC#Iro   )r   r   r   r   r   r   r   r   r   r   r   r   ru   ro   rm   r   r      s        D"?66>BB:eT** =$D6JJJ"?62/B/A/AC C CDK    ro   c                   j    e Zd ZdZ edde           eddddd 	           edd
d           gZdS )r   rA   rq   r   ra   Nifacer\   c                     |dz   S rt   ru   rv   s     rm   ry   zCDPMsgPortID.<lambda>   rz   ro   r{   zPort 1c                     | j         dz
  S rt   r   r   s    rm   ry   zCDPMsgPortID.<lambda>   s    quqy ro   r   	r   r   r   r   r   r   r   r   r   ru   ro   rm   r   r      sf        D"?66>BB =gt(<(<> > >;w>P>PQQQSKKKro   )RouterTransparentBridgeSourceRouteBridgeSwitchHostIGMPCapableRepeaterc                     g | ]}d |z  S )zBit%dru   ).0rx   s     rm   
<listcomp>r      s    #J#J#JAGaK#J#J#Jro   r=   c                   ^    e Zd ZdZ edde           edd           eddde          gZ	d	S )
r    rB   rq   r   ra   r%   capr       N)
r   r   r   r   r   r   r   r	   _cdp_capabilitiesr   ru   ro   rm   r    r       sO        D"?66>BB:eQ'':eQ,=>>@KKKro   c                       e Zd ZdZdZdS )r"   rC   r!   Nr   ru   ro   rm   r"   r"      s        DDDDro   c                       e Zd ZdZdZdS )r$   rD   r#   Nr   ru   ro   rm   r$   r$      s        DDDDro   HalfFull)r   r   c                   ^    e Zd ZdZdZ edde           edd           edd          gZ	dS )	r]   z
IP GatewayrE   rq   ra   r%   	defaultgw192.168.0.1N)
r   r   r   r   rq   r   r   r   r   r   ru   ro   rm   r]   r]      sN        DD"?66>BB:eQ''7;668KKKro   r]   c                   t    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 )r^   rF   rE   rq   ra   r'   prefixr   r   rZ   N)r   r   r   r   rq   r   r   r   r   r   r   ru   ro   rm   r^   r^      s]        DD"?66>BB:eQ''78]339VR((*KKKro   r^   c            	           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           gZdS )r&   rG   r%   rq   ra   r   ouirK   protocol_idr   datar}   c                     | j         dz
  S )Nr'   r   rg   s    rm   ry   zCDPMsgProtoHello.<lambda>  s     ro   r   N)r   r   r   r   rq   r   r   r   r   r   r   r   ru   ro   rm   r&   r&     sx        DD"?66>BB:eR((8E8,,;}c22 ;vr7J7JKKKMKKKro   c                       e Zd ZdZdZdS )r(   rH   r'   Nr   ru   ro   rm   r(   r(     s        "DDDDro   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	r*   rI   rq   r)   ra   r#   vlanr   Nr   r   r   r   r   r   r   r   ru   ro   rm   r*   r*     sI        D"?66>BB:eQ'':fa((*KKKro   c                   \    e Zd ZdZ edde           edd           edde          gZ	dS )	r,   rJ   rq   r+   ra   r!   duplexr   N)
r   r   r   r   r   r   r   r   _cdp_duplexr   ru   ro   rm   r,   r,     sK        D"?66>BB:eQ'' =4==?KKKro   c                   p    e Zd ZdZ edde           edd           edd           edd          gZd	S )
r.   rM   rq   r-   ra   rE   statusr   r   N)	r   r   r   r   r   r   r   r   r   ru   ro   rm   r.   r.   %  sX        D"?66>BB:eQ''9Xq)):fa((*KKKro   c            
           e Zd ZdZdZ edde           eddddd 	           ed
d           e	dd           e
ddd d          gZdS )r0   rN   r/   rq   ra   Nunknown2r\   c                     |dz   S NrE   ru   rv   s     rm   ry   zCDPMsgVoIPVLANQuery.<lambda>2  rz   ro   r   r|   unknown1r   r   r   r}   c                     | j         dz
  S r   r   r   s    rm   ry   zCDPMsgVoIPVLANQuery.<lambda>6  s    QUQY ro   i  r   )r   r   r   r   rq   r   r   r   r   r   r   r   ru   ro   rm   r0   r0   -  s        DD"?66>BB =jd(<(<> > >:j!,,:fa((;z2;N;N*/1 1 12KKKro   c                       e Zd Zd ZdS )_CDPPowerFieldc                     |d}d|z  S )Nr   z%d mWru   )r   rw   rx   s      rm   i2reprz_CDPPowerField.i2repr;  s    9A{ro   N)r   r   r   r   ru   ro   rm   r   r   :  s#            ro   r   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	r2   rO   rq   r1   ra   r#   poweri9  N)	r   r   r   r   r   r   r   r   r   ru   ro   rm   r2   r2   A  sI        D"?66>BB:eQ''!>'4002KKKro   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	r4   rP   rq   r3   ra   r#   mtui  Nr   ru   ro   rm   r4   r4   I  sI        D"?66>BB:eQ'':eT**,KKKro   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	r6   rQ   rq   r5   ra   r!   trust_bitmapr   N	r   r   r   r   r   r   r   r   r   ru   ro   rm   r6   r6   Q  sI        D"?66>BB:eQ'':nc224KKKro   c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	r8   rR   rq   r7   ra   r!   untrusted_port_cosr   Nr   ru   ro   rm   r8   r8   X  sJ        D"?66>BB:eQ'':2C88:KKKro   c                       e Zd ZdZdZdS )r:   rS   r9   Nr   ru   ro   rm   r:   r:   _  s        DDDDro   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g  e	dd          d           gZ
dS )r;   rU   rq   r=   ra   Npower_requested_listr\   c                     |dz   S r   ru   rv   s     rm   ry   zCDPMsgPowerRequest.<lambda>h  rz   ro   r   req_idr   mgmt_idpower_requestedc                     | j         dz
  dz  S Nr%   r   r   rw   s    rm   ry   zCDPMsgPowerRequest.<lambda>m      #'A+!9K ro   
count_fromr   r   r   r   r   r   r   r   r   r
   r   ru   ro   rm   r;   r;   d  s        D"?66>BB =.D$(<(<> > >:h**:i++!>"8""*(+<a"@"@-K-KM M MNKKKro   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g  e	dd          d           gZ
dS )r<   rV   rq   r>   ra   Npower_available_listr\   c                     |dz   S r   ru   rv   s     rm   ry   zCDPMsgPowerAvailable.<lambda>t  rz   ro   r   r  r   r  power_availablec                     | j         dz
  dz  S r  r   r  s    rm   ry   zCDPMsgPowerAvailable.<lambda>y  r  ro   r	  r  ru   ro   rm   r<   r<   p  s        D"?66>BB =.D$(<(<> > >:h**:i++!>"8""*(+<a"@"@-K-KM M MNKKKro   c                   l    e Zd ZdZ edde           eddddd            edd	d
 d          gZdS )CDPMsgzCDP rq   Nra   rr   r\   c                     |dz   S rt   ru   rv   s     rm   ry   zCDPMsg.<lambda>  rz   ro   r   r}   c                     | j         dz
  S rt   r   r   s    rm   ry   zCDPMsg.<lambda>  r   ro   r   r   r   ru   ro   rm   r  r  |  sn        D"?64@@ =e(<(<> > >;ub6H6H*/1 1 12KKKro   r  c                       e Zd Zd Zd ZdS )_CDPChecksumc                     t          |          dz  ret          |d                   }|dk    r|dd         dz   t          |          z   S |dd         dz   t          t          |          dz
            z   S |S )zCheck 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   )ra   r   r   )r   rw   last_chrs      rm   
_check_lenz_CDPChecksum._check_len  s~     s88a< 	3r7||H43B3x')CMM993B3x')CH0A,B,BBBJro   c                     ||z   }| j         Mt          |                     |                    }|d d         t          j        d|          z   |dd          z   }|S r   )cksumr   r  rb   r   )r   rw   r   rg   r  s        rm   r   z_CDPChecksum.post_build  s\    #I:T__Q//00E"1"D%0001QRR58Aro   N)r   r   r   r  r   ru   ro   rm   r  r    s2              ro   r  c                   p    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   rn   r   ru   ro   rm   r   r     sZ        /D9VQ''9UC((;w--"?5".CDDFKKKro   r   i    )codeOUI)E__doc__rb   scapy.packetr   r   scapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   scapy.layers.inetr   scapy.layers.l2r   scapy.compatr   r   scapy.configr   rd   r   rn   r_   r   r   r   r   r   r   r   r   r   r   ranger   r    r"   r$   r   r]   r^   r&   r(   r*   r,   r.   r0   r   r2   r4   r6   r8   r:   r;   r<   r  r  r   ru   ro   rm   <module>r/     s     , , , , , , , ,                                 " ' & & & & &             ! ! ! ! ! ! ! !      (  , /	
 ( * - *  - -    +!" 0#( (), -./  4-&+ -+-)- .- ,	-
 *- +- *- 1- -- (- E- E- +- +- '-  %!-" ).'&.$E)+3- - -8  "	" 	" 	" 	" 	"F 	" 	" 	"    ]   
 !(w77 " @ " " " " "F " " "/ / / / / / / /, , , , , , , ,  $       S S S S S= S S S! ! ! $K#Jr1b9I9I#J#J#JK @ @ @ @ @ @ @ @    M   
    ]   
 6**
8 8 8 8 8m 8 8 8* * * * *] * * *	M 	M 	M 	M 	M} 	M 	M 	M    -   
* * * * *} * * *? ? ? ? ?= ? ? ?* * * * *- * * *
2 
2 
2 
2 
2- 
2 
2 
2    Z   2 2 2 2 2- 2 2 2, , , , , , , ,4 4 4 4 4 4 4 4: : : : :] : : :    Z   
	N 	N 	N 	N 	N 	N 	N 	N	N 	N 	N 	N 	N= 	N 	N 	N2 2 2 2 2] 2 2 2       ,F F F F Fm F F F D)fS99 : : : : :ro   