
    h                        d Z ddlmZ ddlm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mZmZmZmZ ddlmZmZ ddlm Z  ddl!m"Z"m#Z# d	Z$d
Z%dZ&dZ'de e'<    G d de          Z( G d de          Z) G d de          Z* G d de          Z+ G d de          Z, G d de          Z-d Z.d Z/ G d de-          Z0 G d de-          Z1 G d  d!e-          Z2 G d" d#e-          Z3 G d$ d%e-          Z4 G d& d'e-          Z5 G d( d)e-          Z6 G d* d+e-          Z7 G d, d-e-          Z8 G d. d/ee          Z9 G d0 d1e-          Z: G d2 d3e:          Z; G d4 d5e;          Z< G d6 d7e<          Z= G d8 d9e:          Z>e3e0e1e2e4e5e6e7e8e;e<e=e>e:gd:
Z? G d; d<e@          ZA eA            ejB        d<    eee-e'=            eee-e'=           d>S )?a  
    LLDP - Link Layer Discovery Protocol
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    :author:    Thomas Tannhaeuser, hecke@naberius.de

    :description:

        This module provides Scapy layers for the LLDP protocol.

        normative references:
            - IEEE 802.1AB 2016 - LLDP protocol, topology and MIB description

    :TODO:
        - | organization specific TLV e.g. ProfiNet
          | (see LLDPDUGenericOrganisationSpecific for a starting point)
        - Ignore everything after EndofLLDPDUTLV

    :NOTES:
        - you can find the layer configuration options at the end of this file
        - default configuration enforces standard conform:

          * | frame structure
            | (ChassisIDTLV/PortIDTLV/TimeToLiveTLV/...)
          * multiplicity of TLVs (if given by the standard)
          * min sizes of strings used by the TLVs

        - conf.contribs['LLDP'].strict_mode_disable() -> disable strict mode

    )conf)Scapy_Exception)EtherDot1Q)MACFieldIPFieldIP6FieldBitFieldStrLenFieldByteEnumFieldBitEnumField	EnumFieldThreeBytesFieldBitFieldLenField
ShortFieldXStrLenField	ByteFieldConditionalFieldMultipleTypeField
FlagsFieldShortEnumFieldScalingFieldBitScalingField)Packetbind_layers)ETHER_TYPES)orb	bytes_intz01:80:c2:00:00:0ez01:80:c2:00:00:03z01:80:c2:00:00:00ï  LLDPc                       e Zd ZdZdS )LLDPInvalidFieldValuez-
    field value is out of allowed range
    N__name__
__module____qualname____doc__     V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/lldp.pyr!   r!   ;             	Dr(   r!   c                       e Zd ZdZdS )LLDPInvalidFrameStructureze
    basic frame structure not standard conform
    (missing TLV, invalid order or multiplicity)
    Nr"   r'   r(   r)   r,   r,   B   s          	Dr(   r,   c                       e Zd ZdZdS )LLDPMissingLowerLayerzB
    first layer below first LLDPDU must be Ethernet or Dot1q
    Nr"   r'   r(   r)   r.   r.   J   r*   r(   r.   c                       e Zd ZdZdS )LLDPInvalidTLVCountz;
    invalid number of entries for a specific TLV type
    Nr"   r'   r(   r)   r0   r0   Q   r*   r(   r0   c                       e Zd ZdZdS )LLDPInvalidLengthFieldz'
    invalid value of length field
    Nr"   r'   r(   r)   r2   r2   X   r*   r(   r2   c                   N    e Zd ZdZdddddddd	d
dd
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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=ZdZd)ZdZd>Z	g Z
i Zd? Zed@             ZdA ZedB             ZedC             ZdD Z fdEZdF Z fdGZ fdHZ xZS )ILLDPDUz,
    base class for all LLDP data units
    zend of LLDPDUz
chassis idzport idztime to livezport descriptionzsystem namezsystem descriptionzsystem capabilitieszmanagement addresszorganisation specific TLV
r                              r   otherr6   IPv4r7   IPv6r8   NSAPr9   HDLCr:   BBNr;   802r<   zE.163r=   zE.164	   zF.69
   zX.121   IPX   	Appletalk   z	Decnet IV   zBanyan Vines   zE.164 with NSAP   DNSzDistinguished Namez	AS NumberzXTP over IPv4zXTP over IPv6zXTP native mode XTPz"Fiber Channel World-Wide Port Namez"Fiber Channel World-Wide Node NameGWIDzAFI for L2VPNzMPLS-TP Section Endpoint IDzMPLS-TP LSP Endpoint IDzMPLS-TP Pseudowire Endpoint IDzMT IP Multi-Topology IPv4zMT IP Multi-Topology IPv6)                                          @   c                 $   	 t          |d                   dz  }t                              |t          j                  }t          |t                    r |D ]}|                    |          r|c S d S |S # t          $ r t          j        cY S w xY w)Nr   r7   )	r   LLDPDU_CLASS_TYPESgetr   	raw_layer
isinstancelist_match_organization_specific
IndexError)selfpayloadlldpdu_tlv_type
class_typeclss        r)   guess_payload_classzLLDPDU.guess_payload_class   s    
	"!'!*oo2O+//PPJ*d++ "% # #C77@@ #"


## # "! 	" 	" 	">!!!	"s   A.A6 1A6 4A6 6BBc                     d}| }|rBt          |t                    r-|t          j        z  }|j        }|rt          |t                    -||fS )z
        calculate size of lower dot1q layers (if present)
        :param layer: the layer to start at
        :return: size of vlan headers, layer below lowest vlan header
        r   )re   r   r4   DOT1Q_HEADER_LEN
underlayer)layervlan_headers_sizeunder_layers      r)   _dot1q_headers_sizezLLDPDU._dot1q_headers_size   sf      	1je<< 	1!88%0K  	1je<< 	1 !+--r(   c                 f   | j         }|8t          j        d                                         rt	          d          ||z   S t          |t                    r||z   S t                              |          \  }}|rt          |t                    s8t          j        d                                         rt	          d          ||z   S |t          j	        z  }|t          |          t          |          z   t          j        z   z  }|t          j        k     r||z   dt          j        |z
  z  z   S ||z   S )Nr   z,No lower layer (Ethernet or Dot1Q) provided.zNo Ethernet layer provided.    )rq   r   contribsstrict_moder.   re   r4   ru   r   ETHER_HEADER_LENlenETHER_FSC_LENETHER_FRAME_MIN_LEN)ri   pktpayrt   
frame_sizes        r)   
post_buildzLLDPDU.post_build   s6   o}V$0022 !+ -B C C C Sy k6** 	9"("<"<["I"I
K 	!*[%"@"@ 	!}V$0022 !+,IJJJSy f--
c#hhS)F,@@@
2229w&*Dz*QRRRSyr(   c           	         t           j        t          j        t          j        dg}t	          |           dk     rIt          d                    d                    |           d                    |                              t          |          D ]c\  }}|dk    r dS || |         k    rIt          d                    d                    |           d                    |                              ddS )z
        check if the structure of the frame is conform to the basic
        frame structure defined by the standard
        :param structure_description: string-list reflecting LLDP-msg structure
        z<...>r8   z-Invalid frame structure.
got: {}
expected: {} N)	LLDPDUChassisIDr#   LLDPDUPortIDLLDPDUTimeToLiver{   r,   formatjoin	enumerate)structure_descriptionstandard_frame_structureidx
layer_names       r)   _frame_structure_checkzLLDPDU._frame_structure_check   s    %4$<$0$9$4$=$+$- 
 $%%))+VCHH%:;;HH%=>>@ @A A A
  ))ABB 	E 	EOCW$$23777/)> ? ? #)A B BD DE E E 8		E 	Er(   c                    t           j        dt          j        dt          j        dt          j        dt
          dt          dt          dt          dt          di	}|D ]x}||         }|dk    r	 | |         |k    r*t          d                    ||| |                             I# t          $ r# t          d                    |                    w xY wdS )z
        check if multiplicity of present TLVs conforms to the standard
        :param tlv_type_count: dict containing counte-per-TLV
        *r6   zGInvalid number of entries for TLV type {} - expected {} entries, got {}zMissing TLV layer of type {}.N)LLDPDUEndOfLLDPDUr#   r   r   r   LLDPDUPortDescriptionLLDPDUSystemNameLLDPDUSystemDescriptionLLDPDUSystemCapabilitiesLLDPDUManagementAddressr0   r   KeyError)tlv_type_countstandard_multiplicitiestlv_type_namestandard_tlv_multiplicitys       r)   _tlv_multiplicities_checkz LLDPDU._tlv_multiplicities_check   s    &$a!1%q!3c#S$c#S
#
 5 	G 	GM (6 &(C//G!-04MMM-#VM$=$2=$AC CD D D N  G G G) +006}0E0EG G GG!	G 	Gs   *6B!!-Cc                    t           j        d                                         r| j        j        dk    rg t
          _        i t
          _        nxt
          j                            | j        j                   	 t
          j        | j        j        xx         dz  cc<   n)# t          $ r dt
          j        | j        j        <   Y nw xY w|S )Nr   r4   r6   )
r   rx   ry   	__class__r#   r4   LAYER_STACKLAYER_MULTIPLICITIESappendr   ri   ss     r)   pre_dissectzLLDPDU.pre_dissect  s    = ,,.. 		M~&(22%'".0++"))$.*ABBBM/0GHHHAMHHHH M M MKLF/0GHHHM s   8$B #CCc                 P   | j         j        dk    rlt          j        d                                         rHt
                              t
          j                   t
                              t
          j	                   t          t
          |                               |           d S )Nr4   r   )r   r#   r   rx   ry   r4   r   r   r   r   superdissection_done)ri   r~   r   s     r)   r   zLLDPDU.dissection_done)  s    >"h..f%1133 /))&*<===,,V-HIIIfd++C00000r(   c                     dS )zOverwritten by LLDPU objectsNr'   ri   s    r)   _checkzLLDPDU._check2  s    r(   c                 |    |                                   t          t          |                               |          S N)r   r   r4   post_dissectri   r   r   s     r)   r   zLLDPDU.post_dissect6  s.    VT""//222r(   c                 z    |                                   t          t          |                                           S r   )r   r   r4   do_build)ri   r   s    r)   r   zLLDPDU.do_build:  s,    VT""++---r(   )r#   r$   r%   r&   TYPESIANA_ADDRESS_FAMILY_NUMBERSrp   rz   r|   r}   r   r   rn   staticmethodru   r   r   r   r   r   r   r   r   __classcell__r   s   @r)   r4   r4   _   se          "#"( E #g #f # 	f # 	f	 #
 	f # 	e # 	e # 	g # 	g # 	f # 	g # 	e # 	k # 	k # 	n #  	! #" 	e# #$ ##22+'.))? #  #  #D MK" " " . . \.   8 E E \E8 %G %G \%GN  1 1 1 1 1  3 3 3 3 3. . . . . . . . .r(   r4   c                     |                      d          \  }}|                    | |          dz   }t          | t                    r| j        dk    s t          | t
                    r| j        dk    r|dz  }|S )zKReturn the length of the `id` field,
    according to its real encoded typeidr6   r9   r:   )getfield_and_vali2lenre   r   subtyper   )r~   xfvlengths        r)   _ldp_id_adjustlenr   ?  s|     %%DAqWWS!__q F3%% #+*<*<_-- +=25+2D2D!Mr(   c                     | j         }|dS |dz  }t          | t                    r| j        dk    s t          | t                    r| j        dk    r|dz  }|S )Nr   r6   r9   r:   )_lengthre   r   r   r   )r~   r   s     r)   _ldp_id_lengthfromr   K  sg    [F~q
aKF3%% #+*<*<_-- +=25+2D2D!Mr(   c                   h   e Zd ZdZdddddddd	d
ZdZdZdZdZdZ	dZ
dZdZ edddej                   eddddd            edde           e eddej                  d            e edd          d f edd          d f edd          d fg edd e!                    gZd" ZdS )#r   z4
        ieee 802.1ab-2016 - sec. 8.5.2 / p. 26
    reservedzchassis componentinterface aliasport componentMAC addressnetwork addressinterface namelocally assignedr   r6   r7   r8   r9   r:   r;   r<   r   r6   r7   r8   r9   r:   r;   r<   _typer   NrF   r   c                 "    t          | |          S r   r   r~   r   s     r)   <lambda>zLLDPDUChassisID.<lambda>s      /@a/H/H r(   	length_ofadjustr   familyc                     | j         dk    S )Nr:   r   r~   s    r)   r   zLLDPDUChassisID.<lambda>w      t+ r(   c                     | j         dk    S Nr9   r   r   s    r)   r   zLLDPDUChassisID.<lambda>|      CK4/ r(   c                 .    | j         dk    o
| j        dk    S )Nr:   r6   r   r   r   s    r)   r   zLLDPDUChassisID.<lambda>      CK4/FCJ$4F r(   c                 .    | j         dk    o
| j        dk    S )Nr:   r7   r   r   s    r)   r   zLLDPDUChassisID.<lambda>  r   r(    length_fromc                 ~    t           j        d                                         r| j        st	          d          dS dS +
        run layer specific checks
        r   zid must be >= 1 characters longNr   rx   ry   r   r2   r   s    r)   r   zLLDPDUChassisID._check  Q     = ,,.. 	Ltw 	L()JKKK	L 	L 	L 	Lr(   )r#   r$   r%   r&   LLDP_CHASSIS_ID_TLV_SUBTYPESSUBTYPE_RESERVEDSUBTYPE_CHASSIS_COMPONENTSUBTYPE_INTERFACE_ALIASSUBTYPE_PORT_COMPONENTSUBTYPE_MAC_ADDRESSSUBTYPE_NETWORK_ADDRESSSUBTYPE_INTERFACE_NAMESUBTYPE_LOCALLY_ASSIGNEDr   r4   r   r   r   r   r   r   r   r   r	   r   r   fields_descr   r'   r(   r)   r   r   X  s         ! 	$ 	$   $"!"!# 	WdAv|44D!t H H	J 	J 	Ji'CDDM(Av'IJJ++	
 	
 	t$$//
 d##FF
 t$$FF
 ;tR-?@@@	
 	
K4L L L L Lr(   r   c                   h   e Zd ZdZdddddddd	d
ZdZdZdZdZdZ	dZ
dZdZ edddej                   eddddd            edde           e eddej                  d            e edd          d f edd          d f edd          d fg edd e!                    gZd" ZdS )#r   z4
        ieee 802.1ab-2016 - sec. 8.5.3 / p. 26
    r   r   r   r   r   r   zagent circuit IDr   r   r   r6   r7   r8   r9   r:   r;   r<   r   r   NrF   r   c                 "    t          | |          S r   r   r   s     r)   r   zLLDPDUPortID.<lambda>  r   r(   r   r   r   c                     | j         dk    S r   r   r   s    r)   r   zLLDPDUPortID.<lambda>  r   r(   c                     | j         dk    S )Nr8   r   r   s    r)   r   zLLDPDUPortID.<lambda>  r   r(   c                 .    | j         dk    o
| j        dk    S )Nr9   r6   r   r   s    r)   r   zLLDPDUPortID.<lambda>  r   r(   c                 .    | j         dk    o
| j        dk    S )Nr9   r7   r   r   s    r)   r   zLLDPDUPortID.<lambda>  r   r(   r   r   c                 ~    t           j        d                                         r| j        st	          d          dS dS r   r   r   s    r)   r   zLLDPDUPortID._check  r   r(   )r#   r$   r%   r&   LLDP_PORT_ID_TLV_SUBTYPESr   r   r   r   r   r   SUBTYPE_AGENT_CIRCUIT_IDr   r   r4   r   r   r   r   r   r   r   r   r	   r   r   r   r   r'   r(   r)   r   r     s           	! 	! "!"!## 	WdAv|44D!t H H	J 	J 	Ji'@AAM(Av'IJJ++	
 	
 	t$$//
 d##FF
 t$$FF
 ;tR-?@@@	
 	
K4L L L L Lr(   r   c                   n    e Zd ZdZ edddej                   eddd           edd	          gZ	d
 Z
dS )r   z4
        ieee 802.1ab-2016 - sec. 8.5.4 / p. 29
    r   r8   r<   r   r7   rF   ttlrU   c                     t           j        d                                         r2| j        dk    r)t	          d                    | j                            dS dS )r   r   r7   zlength must be 2 - got {}Nr   rx   ry   r   r2   r   r   s    r)   r   zLLDPDUTimeToLive._check  g     = ,,.. 	D4<13D3D( *..4fT\.B.BD D D	D 	D3D3Dr(   N)r#   r$   r%   r&   r   r4   r   r
   r   r   r   r'   r(   r)   r   r     sp          	WdAv|44D!$$
5"KD D D D Dr(   r   c                   ^    e Zd ZdZ edddej                   eddd          gZd Z	d Z
d	S )
r   z4
        ieee 802.1ab-2016 - sec. 8.5.1 / p. 26
    r   r   r<   r   rF   c                 
    d|fS )Nr   r'   r   s     r)   extract_paddingz!LLDPDUEndOfLLDPDU.extract_padding  s    1ur(   c                     t           j        d                                         r2| j        dk    r)t	          d                    | j                            dS dS )r   r   r   zlength must be 0 - got {}Nr   r   s    r)   r   zLLDPDUEndOfLLDPDU._check  r   r(   N)r#   r$   r%   r&   r   r4   r   r
   r   r  r   r'   r(   r)   r   r     sp          	WdAv|44D!$$K
  D D D D Dr(   r   c                   r    e Zd ZdZ edddej                   edddd	           edd
d           gZ	dS )r   z4
        ieee 802.1ab-2016 - sec. 8.5.5 / p. 29
    r   r9   r<   r   NrF   descriptionr   r   c                     | j         S r   r   r   s    r)   r   zLLDPDUPortDescription.<lambda>      s{ r(   r   
r#   r$   r%   r&   r   r4   r   r   r   r   r'   r(   r)   r   r     e          	WdAv|44D!}EEEM23J3JKKKKKKr(   r   c                   r    e Zd ZdZ edddej                   edddd	           edd
d           gZ	dS )r   z4
        ieee 802.1ab-2016 - sec. 8.5.6 / p. 30
    r   r:   r<   r   NrF   system_namer  r   c                     | j         S r   r	  r   s    r)   r   zLLDPDUSystemName.<lambda>  r
  r(   r   r  r'   r(   r)   r   r     r  r(   r   c                   r    e Zd ZdZ edddej                   edddd	           edd
d           gZ	dS )r   z4
        ieee 802.1ab-2016 - sec. 8.5.7 / p. 31
    r   r;   r<   r   NrF   r  r  r   c                     | j         S r   r	  r   s    r)   r   z LLDPDUSystemDescription.<lambda>  r
  r(   r   r  r'   r(   r)   r   r   
  r  r(   r   c                      e Zd ZdZg  edddej                   eddd           eddd	           ed
dd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           ed dd	           ed!dd	           ed"dd	           ed#dd	           ed$dd	           ed%dd	           ed&dd	           ed'dd	           ed(dd	          Z	d) Z
d*S )+r   z4
        ieee 802.1ab-2016 - sec. 8.5.8 / p. 31
    r   r<   r   r9   rF   reserved_5_availabler   r6   reserved_4_availablereserved_3_availablereserved_2_availablereserved_1_availabletwo_port_mac_relay_availables_vlan_component_availablec_vlan_component_availablestation_only_availabledocsis_cable_device_availabletelephone_availablerouter_availablewlan_access_point_availablemac_bridge_availablerepeater_availableother_availablereserved_5_enabledreserved_4_enabledreserved_3_enabledreserved_2_enabledreserved_1_enabledtwo_port_mac_relay_enableds_vlan_component_enabledc_vlan_component_enabledstation_only_enableddocsis_cable_device_enabledtelephone_enabledrouter_enabledwlan_access_point_enabledmac_bridge_enabledrepeater_enabledother_enabledc                     t           j        d                                         r2| j        dk    r)t	          d                    | j                            dS dS )r   r   r9   zlength must be 4 - got {}Nr   r   s    r)   r   zLLDPDUSystemCapabilities._check>  r   r(   N)r#   r$   r%   r&   r   r4   r   r   r
   r   r   r'   r(   r)   r   r     s        #WdAv|44#Aq))# 	'A..# 	'A..	#
 	'A..# 	'A..# 	'A..# 	/A66# 	-q!44# 	-q!44# 	)1a00# 	0!Q77# 	&1--# 	#Q**# 	.155#  	'A..!#" 	%q!,,##$ 	"Aq))%#& 	%q!,,'#( 	%q!,,)#* 	%q!,,+#, 	%q!,,-#. 	%q!,,/#0 	-q!441#2 	+Q223#4 	+Q225#6 	'A..7#8 	.1559#: 	$a++;#< 	!1a((=#> 	,a33?#@ 	%q!,,A#B 	#Q**C#D 	!Q''E#KJD D D D Dr(   r   c                      e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!d"d#d$Z#dZ$dZ%dZ&	  e'd%d
d	e(j)                   e*d&d'dd(d) *           e*d+d'd
d(d, *           e+d-de(j,                   e-d(d.d/ 0           e+d1e$e#           e.d2dd3           e*d4d'd
d56           e-d5d.d7 0          g	Z/d8 Z0d'S )9r   a-  
    ieee 802.1ab-2016 - sec. 8.5.9 / p. 32

    currently only 0x00..0x1e are used by standards, no way to
    use anything > 0xff as management address subtype is only
    one octet wide

    see https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml  # noqa: E501
    r   r6   r7   r8   r9   r:   r;   r<   r=   rF   rG   rH   rJ   rL   rM   rN   rO   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   unknownifIndexzsystem port number)r6   r7   r8   r   r   Nmanagement_addressc                 Z    dt          | j                  z   t          | j                  z   S )Nr=   )r{   r7  	object_idr   s     r)   r   z LLDPDUManagementAddress.<lambda>  s)    S!78883s};M;MM r(   r   !_management_address_string_lengthc                 0    t          | j                  dz   S Nr6   )r{   r7  r   s     r)   r   z LLDPDUManagementAddress.<lambda>  s    s33I/J/JQ/N r(   management_address_subtyper   c                 (    | j         dn	| j         dz
  S )Nr   r6   )r:  r   s    r)   r   z LLDPDUManagementAddress.<lambda>  s"    =E ./Q:Q> r(   r   interface_numbering_subtypeinterface_number    _oid_string_lengthr9  r  c                     | j         S r   )rB  r   s    r)   r   z LLDPDUManagementAddress.<lambda>  s	    S-C r(   c                     t           j        d                                         rBt          | j                  }|dk    s|dk    r$t          d                    |                    dS dS )r   r   r      zImanagement address must be  1..31 characters long - got string of size {}N)r   rx   ry   r{   r7  r2   r   )ri   management_address_lens     r)   r   zLLDPDUManagementAddress._check  s     = ,,.. 	L%()@%A%A"%**.Dr.I.I,,,2F3I,J,JL L L	L 	L.I.Ir(   )1r#   r$   r%   r&    SUBTYPE_MANAGEMENT_ADDRESS_OTHERSUBTYPE_MANAGEMENT_ADDRESS_IPV4SUBTYPE_MANAGEMENT_ADDRESS_IPV6SUBTYPE_MANAGEMENT_ADDRESS_NSAPSUBTYPE_MANAGEMENT_ADDRESS_HDLCSUBTYPE_MANAGEMENT_ADDRESS_BBNSUBTYPE_MANAGEMENT_ADDRESS_802 SUBTYPE_MANAGEMENT_ADDRESS_E_163 SUBTYPE_MANAGEMENT_ADDRESS_E_164SUBTYPE_MANAGEMENT_ADDRESS_F_69 SUBTYPE_MANAGEMENT_ADDRESS_X_121SUBTYPE_MANAGEMENT_ADDRESS_IPX$SUBTYPE_MANAGEMENT_ADDRESS_APPLETALK$SUBTYPE_MANAGEMENT_ADDRESS_DECNET_IV'SUBTYPE_MANAGEMENT_ADDRESS_BANYAN_VINES*SUBTYPE_MANAGEMENT_ADDRESS_E_164_WITH_NSAPSUBTYPE_MANAGEMENT_ADDRESS_DNS-SUBTYPE_MANAGEMENT_ADDRESS_DISTINGUISHED_NAME$SUBTYPE_MANAGEMENT_ADDRESS_AS_NUMBER(SUBTYPE_MANAGEMENT_ADDRESS_XTP_OVER_IPV4(SUBTYPE_MANAGEMENT_ADDRESS_XTP_OVER_IPV6.SUBTYPE_MANAGEMENT_ADDRESS_XTP_NATIVE_MODE_XTP=SUBTYPE_MANAGEMENT_ADDRESS_FIBER_CHANNEL_WORLD_WIDE_PORT_NAME=SUBTYPE_MANAGEMENT_ADDRESS_FIBER_CHANNEL_WORLD_WIDE_NODE_NAMESUBTYPE_MANAGEMENT_ADDRESS_GWID(SUBTYPE_MANAGEMENT_ADDRESS_AFI_FOR_L2VPN6SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_SECTION_ENDPOINT_ID2SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_LSP_ENDPOINT_ID9SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_PSEUDOWIRE_ENDPOINT_ID4SUBTYPE_MANAGEMENT_ADDRESS_MT_IP_MULTI_TOPOLOGY_IPV44SUBTYPE_MANAGEMENT_ADDRESS_MT_IP_MULTI_TOPOLOGY_IPV6INTERFACE_NUMBERING_SUBTYPES SUBTYPE_INTERFACE_NUMBER_UNKNOWN!SUBTYPE_INTERFACE_NUMBER_IF_INDEX+SUBTYPE_INTERFACE_NUMBER_SYSTEM_PORT_NUMBERr   r4   r   r   r   r   r   r
   r   r   r'   r(   r)   r   r   G  s=         (,$&*#&*#&*#&*#%)"%)"'+$'+$&*#'+$%)"+/(+/(.2+15.%)"481+/(/3,/3,592DHADHA&*#/3,=A:9=6@D=;?8;?8 "$ $  (,$(,%26/
 	WdAv|44D!7K!N !N	O 	O 	O 	<dA#7 N N	P 	P 	P 	2D8	: 	:)2"? "?	@ 	@ 	@ 	362	4 	4 	#Q++-tQ+NNN["!C!C	E 	E 	E'K.	L 	L 	L 	L 	Lr(   r   c                       e Zd Zd ZdS )ThreeBytesEnumFieldc                 6    t          j        | |||d           d S )Nz!I)r   __init__)ri   namedefaultenums       r)   rm  zThreeBytesEnumField.__init__  s!    4wd;;;;;r(   N)r#   r$   r%   rm  r'   r(   r)   rk  rk    s#        < < < < <r(   rk  c            
           e Zd ZdZdZdZdZdZedededed	ed
iZ e	ddde
j                   eddddd            edde           edd           eddd           gZed             ZdS )!LLDPDUGenericOrganisationSpecifici  i  i  i  i0 zPROFIBUS International (PNO)z
IEEE 802.1z
IEEE 802.3z.TIA TR-41 Committee . Media Endpoint DiscoveryzHytec Geraetebau GmbHr   r>   r<   r   NrF   datac                 0    t          | j                  dz   S r   )r{   rs  r   s     r)   r   z*LLDPDUGenericOrganisationSpecific.<lambda>  s    UXY\YaUbUbefUf r(   r   org_coder   r   r   c                 (    | j         dn	| j         dz
  S )Nr   r9   r	  r   s    r)   r   z*LLDPDUGenericOrganisationSpecific.<lambda>  s    #+2EQQ[1_ r(   r   c                     dS NTr'   rj   s    r)   rg   z>LLDPDUGenericOrganisationSpecific._match_organization_specific  s    tr(   )r#   r$   r%   ORG_UNIQUE_CODE_PNOORG_UNIQUE_CODE_IEEE_802_1ORG_UNIQUE_CODE_IEEE_802_3ORG_UNIQUE_CODE_TIA_TR_41_MEDORG_UNIQUE_CODE_HYTECORG_UNIQUE_CODESr   r4   r   r   rk  r   r   r   r   rg   r'   r(   r)   rr  rr    s        "!)!)$,!$ 	;"L"L%'W6 	Wc1fl33D!vFfFfgggJ+;<<	)T""VR"% "%	& 	& 	&K   \  r(   rr  c                      e Zd ZdZdddddZddd	Zd
dddddZ edddej	                   e
ddd           edej                   edd           eddde           edde           edde          gZed             Zd Zd S )!LLDPDUPowerViaMDIzt
    Legacy PoE TLV originally defined in IEEE Std 802.1AB-2005 Annex G.3.

    IEEE802.3bt-2018 - sec. 79.3.2.
    zPSE pairs controlledzPSE MDI power enabledzPSE MDI power supportedzport class PSEr=   r9   r7   r6   alt Aalt B)r6   r7   zclass 0class 1class 2class 3zclass 4 and above)r6   r7   r8   r9   r:   r   r>   r<   r   rF   ru  r   r7   MDI_power_supportr   r=   PSE_power_pairr6   power_classc                     t          | d                   dk    o=t          | d                   dk    o$t          | dd                   t          j        k    S )1
        match organization specific TLV
        r:   r7   r6   r<   r   r   rr  r|  ry  s    r)   rg   z.LLDPDUPowerViaMDI._match_organization_specific  sX    
 GAJ1$ MWQZA)= Mgacl++1LM	Nr(   c                     t           j        d                                         r2| j        dk    r)t	          d                    | j                            dS dS )r   r   r<   zlength must be 7 - got {}Nr   r   s    r)   r   zLLDPDUPowerViaMDI._check  r   r(   N)r#   r$   r%   r&   MDI_POWER_SUPPORTPSE_POWER_PAIRPOWER_CLASSr   r4   r   r
   r   rr  r|  r   r   r   r   r   rg   r   r'   r(   r)   r  r    s%         ))+"	   N  K 	Wc1fl33Aq!!
$E$`aa	)Q
&1.?@@&>::mQ44K N N \ND D D D Dr(   r  c                   |   e Zd ZdZdddZdddZdddd	d
Zdddd	d
ZdddZdddd	d
Z	 e
dddej                   eddd           edej                   edd           edddej                   edd ej                   ed!d ej                   e
d"d d e           e
d#d d e           e e
d$d de          d% fg e
d$d de                     e e
d&dde          d' fg ed&dd                     e
d(dde	           ed)dd*d+d d,-           ed.dd*d+d d,-          gZed/             Zd0 Zd1S )2LLDPDUPowerViaMDIDDLz
    PoE TLV with DLL classification extension specified in IEEE802.3at-2009

    Note: power values are expressed in units of Watts,
    converted to tenth of Watts internally

    IEEE802.3bt-2018 - sec. 79.3.2
    ztype 1ztype 2r6   r   PDPSEzPSE and localr   r5  r8   r7   r6   r   zbackup sourcezprimary sourceznot supported	supported)r   r6   lowhighcriticalr   r>   r<   r   rJ   rF   ru  r   r7   r  r   r=   r  r6   r  power_type_nopower_type_dirpower_sourcec                     | j         dk    S r<  r  r   s    r)   r   zLLDPDUPowerViaMDIDDL.<lambda>K      C.!3 r(   PD_4PIDc                     | j         dk    S r<  r  r   s    r)   r   zLLDPDUPowerViaMDIDDL.<lambda>Q  r  r(   
power_prioPD_requested_power皙?WHscalingunitndigitsfmtPSE_allocated_powerc                     t          | d                   dk    o=t          | d                   dk    o$t          | dd                   t          j        k    S )r  r:   r7   r6   rJ   r  ry  s    r)   rg   z1LLDPDUPowerViaMDIDDL._match_organization_specific[  X    
 GAJ1$ MWQZB)> Mgacl++1LM	Nr(   c                    t           j        d                                         r2| j        dk    r't	          d                    | j                            dD ]d\  }}}t          | |          }t           j        d                                         r*||k    r$t          d                    |||                    edS )r   r   rJ   zlength must be 12 - got {})r  zPSE requested power皙X@r  zPSE allocated powerr  "exceeded maximum {} of {} - got {}Nr   rx   ry   r   r2   r   getattrr!   ri   fieldr  	max_valuevals        r)   r   zLLDPDUPowerViaMDIDDL._checkd  s     = ,,.. 	D4<23E3E( *..4fT\.B.BD D D.6 
	> 
	>)E;	 $&&Cf%1133 >i+Y<<> > >
	> 
	>r(   N)r#   r$   r%   r&   POWER_TYPE_NOPOWER_TYPE_DIRPOWER_SOURCE_PDPOWER_SOURCE_PSEPD_4PID_SUP
POWER_PRIOr   r4   r   r
   r   rr  r|  r   r   r  r  r   r  r  r   r   r   r   rg   r   r'   r(   r)   r  r  
  s}          M  N 	 O 	   K 	 J 	Wc1fl33B""
$E$`aa	)Q
&1.?.QRR&+<+KLLmQ(9(EFF_aM::%q!^<<^T1oFF33

 <a1ABB	D 	D 	Y1k::33

 8Iq!$$	& 	& 	\1a44)1cqc	3 	3 	3*Asqc	3 	3 	33K: N N \N> > > > >r(   r  c            #       
   e Zd ZdZdddddZddd	ddZd
ddddZddddddddd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Zddd(d)d*d+d,d-dZ	d.d/d0Z
d1d2d3d4Zd5dd6Z ed7d8dej                   ed9d:d           ed;ej                   ed<d%           ed=d'dej                   ed>d&ej                   ed?d&ej                   ed@d&d&ej                   edAd&d&ej                   e edBd&d%ej                  dC fg edBd&d%ej                              e edDd'd%ej!                  dE fg edDd'd%                     edFd'd%ej"                   e#dGd'dHdId&dJK           e#dLd'dHdId&dJK           e#dMd'dHdId&dJK           e#dNd'dHdId&dJK           e#dOd'dHdId&dJK           e#dPd'dHdId&dJK           edQd'd%e           edRd'd%e           edSd'd%e           edTdd$e           edUdd$e           edVd'd#e           edWd'de	           edXd'd&e
           e#dYd'dHdId&dJK           edZd'de           ed[d'd e           e$d\d'd]d^_          gZ%e&d`             Z'da Z(dbS )cLLDPDUPowerViaMDIType34z
    PoE TLV with DLL classification and type 3 and 4 extensions
    specified in IEEE802.3bt-2018

    Note: power values are expressed in units of Watts,
    converted to tenth of Watts internally

    IEEE802.3bt-2018 - sec. 79.3.2
    z!4-pair powering dual-signature PDz#4-pair powering single-signature PDz2-pair poweringignorer  z 4-pair powered dual-signature PDz 2-pair powered dual-signature PDzpowered single-signature PDz	both altsr  r  z&single-signature PD or 2-pair only PSEzclass 5zclass 4r  r  r  )r<   r;   r:   r9   r8   r7   r6   r   rN   zdual-signature pdrM   rL   rJ   rH   rG   rF   r=   zclass 8r<   zclass 7r;   zclass 6r:   r9   r8   r7   r6   r   ztype 4 dual-signature PDztype 4 single-signature PDztype 3 dual-signature PDztype 3 single-signature PDz
type 4 PSEz
type 3 PSEz(dual-signature and electrically isolatedz-single-signature or not electrically isolatedr  zPSE autoclass supportzautoclass completedzautoclass request)r9   r7   r6   z
power down)r^   r   r   r>   r   r^   ru  r   r  r  r  r  r  r  c                     | j         dk    S r<  r  r   s    r)   r   z LLDPDUPowerViaMDIType34.<lambda>  r  r(   r  c                     | j         dk    S r<  r  r   s    r)   r   z LLDPDUPowerViaMDIType34.<lambda>  r  r(   r  r  r  r  r  r  r  PD_requested_power_mode_APD_requested_power_mode_BPD_allocated_power_alt_APD_allocated_power_alt_BPSE_powering_statusPD_powered_statusPD_power_pair_extdual_signature_class_mode_Adual_signature_class_mode_Bpower_class_extpower_type_extPD_loadPSE_max_available_power	autoclasspower_down_reqpower_down_timerS   r   )r  c                     t          | d                   dk    o=t          | d                   dk    o$t          | dd                   t          j        k    S )r  r:   r7   r6   r^   r  ry  s    r)   rg   z4LLDPDUPowerViaMDIType34._match_organization_specific  r  r(   c                    t           j        d                                         r2| j        dk    r't	          d                    | j                            dD ]f\  }}}t          | |          pd}t           j        d                                         r*||k    r$t          d                    |||                    gdS )r   r   r^   zlength must be 29 - got {})r  r  )r  zPD requested power mode A33333H@)r  zPD requested power mode Br  )r  zPD allocated power alt Ar  )r  zPD allocated power alt Br  )r  zPSE maximum available powerr  )r  zpower down timei r   r  Nr  r  s        r)   r   zLLDPDUPowerViaMDIType34._check  s     = ,,.. 	D4<23E3E( *..4fT\.B.BD D D.8 	> 	>)E;	0 $&&+!Cf%1133 >i+Y<<> > >5	> 	>r(   N))r#   r$   r%   r&   PSE_POWERING_STATUSPD_POWERED_STATUSPSE_POWER_PAIRS_EXTDUAL_SIGNATURE_POWER_CLASSPOWER_CLASS_EXTPOWER_TYPE_EXTPD_LOAD	AUTOCLASSPOWER_DOWN_REQr   r4   r   r
   r   rr  r|  r   r   r  r  r   r  r  r  r  r  r   r  r  r  r  r   r   r   r   rg   r   r'   r(   r)   r  r  y  sB         23	  10+	  	  8	" 	"# 	 		
 	 	 	 		 		 		 		 		 		 		 		  	!O* )+)+	 	N 6: G *'% I  N 	Wc1fl33B""
$E$`aa	)Q
&1.?.QRR&+<+KLLmQ(9(EFF_a,@,NOO%q!-A-PQQ^T16J6Z[[33

 <a1E1VWW	Y 	Y 	Y1.B.NOO33

 8Iq!$$	& 	& 	\1a)=)HII)1cqc	3 	3 	3*Asqc	3 	3 	30!Sqc	3 	3 	30!Sqc	3 	3 	3/Cqc	3 	3 	3/Cqc	3 	3 	3*Aq2EFF(!Q0ABB(!Q0CDD2A9	; 	;2A9	; 	;&1o>>%q!^<<Y1g...3qc	3 	3 	3
;1i00%q!^<<)1bs;;;c2Kh N N \N$> $> $> $> $>r(   r  c                       e Zd ZdZdddddZddd	d
dZddiZed             Zed             Z	 e
dddej                   eddd           edej                   edd           eddde           e
ddde           eddde           eddde           eddd d!d"d#$           ed%dd&d'dd#$           ed(dd)d*d+d#$           ed,dd-d.dd#$           ed/dd d!d"d#$           ed0dd&d'dd#$           ed1dd)d*d+d#$           ed2dd-d.dd3$           ed4de          gZ fd5Z fd6Zed7             Zd8 Z xZS )9LLDPDUPowerViaMDIMeasurea  
    PoE TLV measurements in IEEE802.3bt-2018

    Note: power values are expressed in units of Watts,
    converted to hundredths of Watts internally;
    energy values are expressed in units of Joules,
    converted to tenths of kilo-Joules internally;
    voltage values are expressed in units of Volts,
    converted to milli-Volts internally;
    current values are expressed in units of Amperes,
    converted to tenths of milli-Amperes internally.
    PSE price index is converted internally.

    IEEE802.3bt-2018 - sec. 79.3.8
    voltagecurrentpowerenergyr  z
no requestzmode Azmode Bz
port total)r   r6   r7   r8     znot availablec                 2    t          d| dz  z  dz
            S )Ng    ,@g?>'  )intr  s    r)   _encode_ppiz$LLDPDUPowerViaMDIMeasure._encode_ppib  s      =CEN3e;<<<r(   c                     | dz   dz  dz  dz  S )Nr  gjt@i&% r:   r'   r  s    r)   _decode_ppiz$LLDPDUPowerViaMDIMeasure._decode_ppig  s     u%-!33r(   r   r>   r<   r   r[   rF   ru  r   r=   supportr   r9   sourcerequestvalidvoltage_uncertaintygMbP?Vr8   r  r  current_uncertaintyg-C6?Apower_uncertaintyg{Gz?r  r7   energy_uncertaintyd   Jvoltage_measurementcurrent_measurementpower_measurementenergy_measurementIpower_price_indexc                     | j         }| j         dk    rdnt                              | j                   | _         t          t          |                                           }|| _         |S Nr  )r  r  r  r   r   )ri   
backup_ppir   r   s      r)   r   z!LLDPDUPowerViaMDIMeasure.do_build  sb    +
+/+AV+K+K)55d6LMM 	*D11::<<!+r(   c                     t          t          |                               |          }| j        dk    rdnt                              | j                  | _        |S r  )r   r  r   r  r  r   s     r)   r   z%LLDPDUPowerViaMDIMeasure.post_dissect  sT    *D11>>qAA+/+AV+K+K)55d6LMM 	r(   c                     t          | d                   dk    o=t          | d                   dk    o$t          | dd                   t          j        k    S )r  r:   r=   r6   r[   r7   r  ry  s    r)   rg   z5LLDPDUPowerViaMDIMeasure._match_organization_specific  r  r(   c           	      T   t           j        d                                         r2| j        dk    r't	          d                    | j                            dD ]\  }}}t          | |          pd}t           j        d                                         r*||k    r$t          d                    |||                    | j        pd}|dk    rY|dk    rSt          d	                    t          
                    d          t          
                    |                              d
S )r   r   r[   zlength must be 26 - got {}))r  zvoltage uncertaintyA   )r  zvoltage measurementr	  )r  zcurrent uncertainty      @)r  zcurrent measurementr
  )r  zenergy uncertaintyi.c )r  zpower uncertainty  )r  zpower measurementr  r   r  r  i  z1exceeded maximum power price index of {} - got {}N)r   rx   ry   r   r2   r   r  r!   r  r  r  r  s        r)   r   zLLDPDUPowerViaMDIMeasure._check  sJ    = ,,.. 	D4<23E3E( *..4fT\.B.BD D D.5 	L 	L)E;	* $&&+!Cf%1133 >i+Y<<> > > (2FCU{{sf}}+ 8 D DU K K 8 D DS I IK KL L L9	L 	Lr(   )r#   r$   r%   r&   MEASURE_TYPEMEASURE_SOURCEPOWER_PRICE_INDEXr   r  r  r   r4   r   r
   r   rr  r|  r   r   r   r   r   r   r   rg   r   r   r   s   @r)   r  r  ?  s        " 	 L 	 N 	 = = \= 4 4 \4
 	Wc1fl33B""
$E$`aa	)Q
9aL11Xq!^44
9aL11
7Aq,//*Auqc	3 	3 	3*Avqc	3 	3 	3(!Tqc	3 	3 	3)1cqc	3 	3 	3*Auqc	3 	3 	3*Avqc	3 	3 	3(!Tqc	3 	3 	3)1cqc	3 	3 	3*F4EFF3K8         N N \N'L 'L 'L 'L 'L 'L 'Lr(   r  r5   c                   *    e Zd ZdZd Zd Zd Zd ZdS )LLDPConfigurationz,
    basic configuration for LLDP layer
    c                 <    d| _         |                                  d S rx  )_strict_modestrict_mode_enabler   s    r)   rm  zLLDPConfiguration.__init__  s"     !!!!!r(   c                     d| _         dS )z<
        enable strict mode and dissector debugging
        TNr  r   s    r)   r  z$LLDPConfiguration.strict_mode_enable  s     !r(   c                     d| _         dS )z=
        disable strict mode and dissector debugging
        FNr  r   s    r)   strict_mode_disablez%LLDPConfiguration.strict_mode_disable  s     "r(   c                     | j         S )z/
        get current strict mode state
        r  r   s    r)   ry   zLLDPConfiguration.strict_mode  s       r(   N)r#   r$   r%   r&   rm  r  r  ry   r'   r(   r)   r  r    sZ         " " "! ! !" " "! ! ! ! !r(   r  )typeN)Cr&   scapy.configr   scapy.errorr   scapy.layers.l2r   r   scapy.fieldsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.packetr   r   
scapy.datar   scapy.compatr   r   LLDP_NEAREST_BRIDGE_MAC LLDP_NEAREST_NON_TPMR_BRIDGE_MAC LLDP_NEAREST_CUSTOMER_BRIDGE_MACLLDP_ETHER_TYPEr!   r,   r.   r0   r2   r4   r   r   r   r   r   r   r   r   r   r   r   rk  rr  r  r  r  r  rb   objectr  rx   r'   r(   r)   <module>r&     s>   <       ' ' ' ' ' ' ( ( ( ( ( ( ( (                                          - , , , , , , , " " " " " " ' ' ' ' ' ' ' '- #6  #6  %O 	 	 	 	 	O 	 	 		 	 	 	 	 	 	 		 	 	 	 	O 	 	 		 	 	 	 	/ 	 	 		 	 	 	 	_ 	 	 	]. ]. ]. ]. ].V ]. ]. ].@	 	 	
 
 
7L 7L 7L 7L 7Lf 7L 7L 7Lt7L 7L 7L 7L 7L6 7L 7L 7LtD D D D Dv D D D&D D D D D D D D*    F       v       f   /D /D /D /D /Dv /D /D /DdaL aL aL aL aLf aL aL aLH< < < < <)_ < < <       >7D 7D 7D 7D 7D9 7D 7D 7Dtl> l> l> l> l>, l> l> l>^C> C> C> C> C>2 C> C> C>LGL GL GL GL GL@ GL GL GLX 





!
"
! )
  (! ! ! ! ! ! ! !8 *)++f  E6 0 0 0 0 E6 0 0 0 0 0 0r(   