a
    kÄ#dµa  ã                   @   s  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 ddlmZmZ ddlmZ ddlmZ d	Zd
Z dZ!dZ"dee"< G dd„ deƒZ#G dd„ deƒZ$G dd„ deƒZ%G dd„ deƒZ&G dd„ deƒZ'dd„ Z(dd„ Z)G dd„ de'ƒZ*G dd„ de'ƒZ+G d d!„ d!e'ƒZ,G d"d#„ d#e'ƒZ-G d$d%„ d%e'ƒZ.G d&d'„ d'e'ƒZ/G d(d)„ d)e'ƒZ0G d*d+„ d+e'ƒZ1G d,d-„ d-e'ƒZ2G d.d/„ d/eeƒZ3G d0d1„ d1e'ƒZ4e-e*e+e,e.e/e0e1e2e4d2œ
Z5G d3d4„ d4e6ƒZ7e7ƒ ej8d< eee'e"d5� eee'e"d5� d6S )7a²  
    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)ÚPacketÚbind_layers)ÚETHER_TYPES)Úorbz01:80:c2:00:00:0ez01:80:c2:00:00:03z01:80:c2:00:00:00iÌˆ  ÚLLDPc                   @   s   e Zd ZdZdS )ÚLLDPInvalidFrameStructureze
    basic frame structure not standard conform
    (missing TLV, invalid order or multiplicity)
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r    r    úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/lldp.pyr   :   s   r   c                   @   s   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"   B   s   r"   c                   @   s   e Zd ZdZdS )ÚLLDPInvalidTLVCountz;
    invalid number of entries for a specific TLV type
    Nr   r    r    r    r!   r#   I   s   r#   c                   @   s   e Zd ZdZdS )ÚLLDPInvalidLengthFieldz'
    invalid value of length field
    Nr   r    r    r    r!   r$   P   s   r$   c                        sò   e Zd ZdZ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 d!d"d#d$d%d&d'd(d)d*d+d,œZd-Zd.Zd-Zd/Z	g Z
i Zd0d1„ Zed2d3„ ƒZd4d5„ Zed6d7„ ƒZed8d9„ ƒZd:d;„ Z‡ fd<d=„Zd>d?„ Z‡ fd@dA„Z‡ fdBdC„Z‡  ZS )DÚ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   é   é   é   é   é   é   é   é   é   ÚotherZIPv4ZIPv6ZNSAPZHDLCZBBNZ802zE.163zE.164zF.69zX.121ZIPXZ	Appletalkz	Decnet IVzBanyan Vinesz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 NameZ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)r   r'   r(   r)   r*   r+   r,   r-   r.   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   r*   r7   é@   c                 C   s>   z t |d ƒd }t |tj¡W S  ty8   tj Y S 0 d S )Nr   r(   )r   ÚLLDPDU_CLASS_TYPESÚgetr   Z	raw_layerÚ
IndexError)ÚselfÚpayloadZlldpdu_tlv_typer    r    r!   Úguess_payload_class’   s
    zLLDPDU.guess_payload_classc                 C   s0   d}| }|r(t |tƒr(|tj7 }|j}q||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   )Ú
isinstancer   r%   ÚDOT1Q_HEADER_LENÚ
underlayer)ÚlayerZvlan_headers_sizeÚunder_layerr    r    r!   Ú_dot1q_headers_sizeš   s    
zLLDPDU._dot1q_headers_sizec                 C   sÈ   | j }|d u r.tjd  ¡ r&tdƒ‚n|| S t|tƒr@|| S t |¡\}}|r\t|tƒs|tjd  ¡ rttdƒ‚n|| S |tj	7 }|t
|ƒt
|ƒ tj 7 }|tjk rÀ|| dtj|   S || S )Nr   z,No lower layer (Ethernet or Dot1Q) provided.zNo Ethernet layer provided.ó    )rQ   r   ÚcontribsÚstrict_moder"   rO   r%   rT   r   ÚETHER_HEADER_LENÚlenÚETHER_FSC_LENÚETHER_FRAME_MIN_LEN)rL   ÚpktZpayrS   Ú
frame_sizer    r    r!   Ú
post_build«   s"    




zLLDPDU.post_buildc                 C   s„   t jtjtjdg}t| ƒdk r:td d | ¡d |¡¡ƒ‚t|ƒD ]<\}}|dkrV q€|| | krBtd d | ¡d |¡¡ƒ‚qBd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<...>r)   z-Invalid frame structure.
got: {}
expected: {}ú N)	ÚLLDPDUChassisIDr   ÚLLDPDUPortIDÚLLDPDUTimeToLiverY   r   ÚformatÚjoinÚ	enumerate)Zstructure_descriptionZstandard_frame_structureÚidxZ
layer_namer    r    r!   Ú_frame_structure_checkÇ   s,    ýþÿþÿzLLDPDU._frame_structure_checkc                 C   s˜   t jdtjdtjdtjdtdtdtdtdt	di	}|D ]^}|| }|dkrJq4z&| | |krnt
d ||| | ¡ƒ‚W q4 ty�   t
d |¡ƒ‚Y q40 q4dS )zŽ
        check if multiplicity of present TLVs conforms to the standard
        :param tlv_type_count: dict containing counte-per-TLV
        Ú*r'   zGInvalid number of entries for TLV type {} - expected {} entries, got {}zMissing TLV layer of type {}.N)ÚLLDPDUEndOfLLDPDUr   r`   ra   rb   ÚLLDPDUPortDescriptionÚLLDPDUSystemNameÚLLDPDUSystemDescriptionÚLLDPDUSystemCapabilitiesÚLLDPDUManagementAddressr#   rc   ÚKeyError)Ztlv_type_countZstandard_multiplicitiesZtlv_type_nameZstandard_tlv_multiplicityr    r    r!   Ú_tlv_multiplicities_checkä   s8    	÷ÿüÿÿz LLDPDU._tlv_multiplicities_checkc                 C   sx   t jd  ¡ rt| jjdkr(g t_i t_nLtj | jj¡ ztj| jj  d7  < W n  t	yr   dtj| jj< Y n0 |S )Nr   r%   r'   )
r   rV   rW   Ú	__class__r   r%   ÚLAYER_STACKÚLAYER_MULTIPLICITIESÚappendro   ©rL   Úsr    r    r!   Úpre_dissect  s    zLLDPDU.pre_dissectc                    sF   | j jdkr2tjd  ¡ r2t tj¡ t tj	¡ t
t| ƒ |¡ d S )Nr%   r   )rq   r   r   rV   rW   r%   rg   rr   rp   rs   ÚsuperÚdissection_done)rL   r\   ©rq   r    r!   ry     s    ÿzLLDPDU.dissection_donec                 C   s   dS )zOverwritten by LLDPU objectsNr    ©rL   r    r    r!   Ú_check$  s    zLLDPDU._checkc                    s   |   ¡  tt| ƒ |¡S ©N)r|   rx   r%   Úpost_dissectru   rz   r    r!   r~   (  s    zLLDPDU.post_dissectc                    s   |   ¡  tt| ƒ ¡ S r}   )r|   rx   r%   Údo_buildr{   rz   r    r!   r   ,  s    zLLDPDU.do_build)r   r   r   r   ÚTYPESÚIANA_ADDRESS_FAMILY_NUMBERSrP   rX   rZ   r[   rr   rs   rN   ÚstaticmethodrT   r^   rg   rp   rw   ry   r|   r~   r   Ú__classcell__r    r    rz   r!   r%   W   s~   öá"


'	r%   c                 C   sR   |   d¡\}}| | |¡d }t| tƒr2| jdksFt| tƒrN| jdkrN|d7 }|S )zKReturn the length of the `id` field,
    according to its real encoded typeÚidr'   r*   r+   )Zgetfield_and_valZi2lenrO   ra   Úsubtyper`   )r\   ÚxÚfÚvÚlengthr    r    r!   Ú_ldp_id_adjustlen1  s    ÿÿrŠ   c                 C   sN   | j }|d u rdS |d8 }t| tƒr.| jdksBt| tƒrJ| jdkrJ|d8 }|S )Nr   r'   r*   r+   )Ú_lengthrO   ra   r…   r`   )r\   r‰   r    r    r!   Ú_ldp_id_lengthfrom=  s    ÿÿrŒ   c                   @   sÖ   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d„ d�eddeƒeeddejƒdd„ ƒeeddƒdd„ feddƒdd„ feddƒd d„ fgedd!ed"�ƒgZd#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   r'   r(   r)   r*   r+   r,   r-   r   r'   r(   r)   r*   r+   r,   r-   Ú_typer‹   Nr2   r„   c                 C   s
   t | |ƒS r}   ©rŠ   ©r\   r†   r    r    r!   Ú<lambda>e  ó    zLLDPDUChassisID.<lambda>©Ú	length_ofÚadjustr…   Úfamilyc                 C   s
   | j dkS )Nr+   ©r…   ©r\   r    r    r!   r˜   i  r™   c                 C   s
   | j dkS ©Nr*   rž   rŸ   r    r    r!   r˜   n  r™   c                 C   s   | j dko| jdkS )Nr+   r'   ©r…   r�   rŸ   r    r    r!   r˜   r  r™   c                 C   s   | j dko| jdkS )Nr+   r(   r¡   rŸ   r    r    r!   r˜   v  r™   Ú ©Zlength_fromc                 C   s    t jd  ¡ r| jstdƒ‚dS ©ú+
        run layer specific checks
        r   zid must be >= 1 characters longN©r   rV   rW   r„   r$   r{   r    r    r!   r|   |  s    zLLDPDUChassisID._check)r   r   r   r   ZLLDP_CHASSIS_ID_TLV_SUBTYPESÚSUBTYPE_RESERVEDZSUBTYPE_CHASSIS_COMPONENTÚSUBTYPE_INTERFACE_ALIASÚSUBTYPE_PORT_COMPONENTÚSUBTYPE_MAC_ADDRESSÚSUBTYPE_NETWORK_ADDRESSÚSUBTYPE_INTERFACE_NAMEÚSUBTYPE_LOCALLY_ASSIGNEDr   r%   r€   r   r   r   r�   r   r   r   r   r
   rŒ   Úfields_descr|   r    r    r    r!   r`   J  sT   ø
ÿ
þþþþ÷ó÷r`   c                   @   sÖ   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d„ d�eddeƒeeddejƒdd„ ƒeeddƒdd„ feddƒdd„ feddƒd d„ fgedd!ed"�ƒgZd#d$„ ZdS )%ra   z4
        ieee 802.1ab-2016 - sec. 8.5.3 / p. 26
    r�   rŽ   r�   r�   r‘   r’   zagent circuit IDr“   r”   r   r'   r(   r)   r*   r+   r,   r-   r•   r‹   Nr2   r„   c                 C   s
   t | |ƒS r}   r–   r—   r    r    r!   r˜   Ÿ  r™   zLLDPDUPortID.<lambda>rš   r…   r�   c                 C   s
   | j dkS r    rž   rŸ   r    r    r!   r˜   £  r™   c                 C   s
   | j dkS )Nr)   rž   rŸ   r    r    r!   r˜   ¨  r™   c                 C   s   | j dko| jdkS )Nr*   r'   r¡   rŸ   r    r    r!   r˜   ¬  r™   c                 C   s   | j dko| jdkS )Nr*   r(   r¡   rŸ   r    r    r!   r˜   °  r™   r¢   r£   c                 C   s    t jd  ¡ r| jstdƒ‚dS r¤   r¦   r{   r    r    r!   r|   ¶  s    zLLDPDUPortID._check)r   r   r   r   ZLLDP_PORT_ID_TLV_SUBTYPESr§   r¨   r©   rª   r«   r¬   ZSUBTYPE_AGENT_CIRCUIT_IDr­   r   r%   r€   r   r   r   r�   r   r   r   r   r
   rŒ   r®   r|   r    r    r    r!   ra   „  sT   ø
ÿ
þþþþ÷ó÷ra   c                   @   s<   e Zd ZdZedddejƒedddƒedd	ƒgZ	d
d„ Z
dS )rb   z4
        ieee 802.1ab-2016 - sec. 8.5.4 / p. 29
    r•   r)   r-   r‹   r(   r2   Úttlr=   c                 C   s,   t jd  ¡ r(| jdkr(td | j¡ƒ‚dS )r¥   r   r(   zlength must be 2 - got {}N©r   rV   rW   r‹   r$   rc   r{   r    r    r!   r|   È  s    ÿzLLDPDUTimeToLive._checkN)r   r   r   r   r   r%   r€   r	   r   r®   r|   r    r    r    r!   rb   ¾  s   
ýrb   c                   @   s<   e Zd ZdZedddejƒedddƒgZdd„ Z	d	d
„ Z
dS )ri   z4
        ieee 802.1ab-2016 - sec. 8.5.1 / p. 26
    r•   r   r-   r‹   r2   c                 C   s   d|fS )Nr¢   r    ru   r    r    r!   Úextract_paddingÚ  s    z!LLDPDUEndOfLLDPDU.extract_paddingc                 C   s,   t jd  ¡ r(| jdkr(td | j¡ƒ‚dS )r¥   r   r   zlength must be 0 - got {}Nr°   r{   r    r    r!   r|   Ý  s    ÿzLLDPDUEndOfLLDPDU._checkN)r   r   r   r   r   r%   r€   r	   r®   r±   r|   r    r    r    r!   ri   Ñ  s   
þri   c                   @   s@   e Zd ZdZedddejƒeddddd	�edd
dd„ d�gZ	dS )rj   z4
        ieee 802.1ab-2016 - sec. 8.5.5 / p. 29
    r•   r*   r-   r‹   Nr2   Údescription©r›   r¢   c                 C   s   | j S r}   ©r‹   rŸ   r    r    r!   r˜   í  r™   zLLDPDUPortDescription.<lambda>r£   ©
r   r   r   r   r   r%   r€   r   r
   r®   r    r    r    r!   rj   æ  s
   ýrj   c                   @   s@   e Zd ZdZedddejƒeddddd	�edd
dd„ d�gZ	dS )rk   z4
        ieee 802.1ab-2016 - sec. 8.5.6 / p. 30
    r•   r+   r-   r‹   Nr2   Zsystem_namer³   r¢   c                 C   s   | j S r}   r´   rŸ   r    r    r!   r˜   ø  r™   zLLDPDUSystemName.<lambda>r£   rµ   r    r    r    r!   rk   ñ  s
   ýrk   c                   @   s@   e Zd ZdZedddejƒeddddd	�edd
dd„ d�gZ	dS )rl   z4
        ieee 802.1ab-2016 - sec. 8.5.7 / p. 31
    r•   r,   r-   r‹   Nr2   r²   r³   r¢   c                 C   s   | j S r}   r´   rŸ   r    r    r!   r˜     r™   z LLDPDUSystemDescription.<lambda>r£   rµ   r    r    r    r!   rl   ü  s
   ýrl   c                %   @   st  e Zd ZdZ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	ƒg"Z	d)d*„ Z
d+S ),rm   z4
        ieee 802.1ab-2016 - sec. 8.5.8 / p. 31
    r•   r-   r‹   r*   r2   Zreserved_5_availabler   r'   Zreserved_4_availableZreserved_3_availableZreserved_2_availableZreserved_1_availableZtwo_port_mac_relay_availableZs_vlan_component_availableZc_vlan_component_availableZstation_only_availableZdocsis_cable_device_availableZtelephone_availableZrouter_availableZwlan_access_point_availableZmac_bridge_availableZrepeater_availableZother_availableZreserved_5_enabledZreserved_4_enabledZreserved_3_enabledZreserved_2_enabledZreserved_1_enabledZtwo_port_mac_relay_enabledZs_vlan_component_enabledZc_vlan_component_enabledZstation_only_enabledZdocsis_cable_device_enabledZtelephone_enabledZrouter_enabledZwlan_access_point_enabledZmac_bridge_enabledZrepeater_enabledZother_enabledc                 C   s,   t jd  ¡ r(| jdkr(td | j¡ƒ‚dS )r¥   r   r*   zlength must be 4 - got {}Nr°   r{   r    r    r!   r|   0  s    ÿzLLDPDUSystemCapabilities._checkN)r   r   r   r   r   r%   r€   r   r	   r®   r|   r    r    r    r!   rm     sJ   
































Þ%rm   c                   @   s4  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)d*„ d+�e*d,d'd
d(d-d*„ d+�e+d.de(j,ƒe-d(d/d0d*„ d1�e+d2e$e#ƒe.d3dd4ƒe*d5d'd
d6d7�e-d6d/d8d*„ d1�g	Z/d9d:„ Z0d'S );rn   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   r'   r(   r)   r*   r+   r,   r-   r.   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   ÚunknownZifIndexzsystem port number)r'   r(   r)   r•   r‹   NÚmanagement_addressc                 C   s   dt | jƒ t | jƒ S )Nr.   )rY   r·   Ú	object_idr—   r    r    r!   r˜   }  s    z LLDPDUManagementAddress.<lambda>rš   Ú!_management_address_string_lengthc                 C   s   t | jƒd S )Nr'   )rY   r·   r—   r    r    r!   r˜   �  r™   Zmanagement_address_subtyper¢   c                 C   s   | j d u rdS | j d S )Nr   r'   )r¹   rŸ   r    r    r!   r˜   …  s    ÿr£   Zinterface_numbering_subtypeZinterface_numberé    Ú_oid_string_lengthr¸   r³   c                 C   s   | j S r}   )r»   rŸ   r    r    r!   r˜   Ž  r™   c                 C   s:   t jd  ¡ r6t| jƒ}|dks(|dkr6td |¡ƒ‚dS )r¥   r   r   é   zImanagement address must be  1..31 characters long - got string of size {}N)r   rV   rW   rY   r·   r$   rc   )rL   Zmanagement_address_lenr    r    r!   r|   ‘  s    
ÿÿzLLDPDUManagementAddress._check)1r   r   r   r   Z SUBTYPE_MANAGEMENT_ADDRESS_OTHERZSUBTYPE_MANAGEMENT_ADDRESS_IPV4ZSUBTYPE_MANAGEMENT_ADDRESS_IPV6ZSUBTYPE_MANAGEMENT_ADDRESS_NSAPZSUBTYPE_MANAGEMENT_ADDRESS_HDLCZSUBTYPE_MANAGEMENT_ADDRESS_BBNZSUBTYPE_MANAGEMENT_ADDRESS_802Z SUBTYPE_MANAGEMENT_ADDRESS_E_163Z SUBTYPE_MANAGEMENT_ADDRESS_E_164ZSUBTYPE_MANAGEMENT_ADDRESS_F_69Z SUBTYPE_MANAGEMENT_ADDRESS_X_121ZSUBTYPE_MANAGEMENT_ADDRESS_IPXZ$SUBTYPE_MANAGEMENT_ADDRESS_APPLETALKZ$SUBTYPE_MANAGEMENT_ADDRESS_DECNET_IVZ'SUBTYPE_MANAGEMENT_ADDRESS_BANYAN_VINESZ*SUBTYPE_MANAGEMENT_ADDRESS_E_164_WITH_NSAPZSUBTYPE_MANAGEMENT_ADDRESS_DNSZ-SUBTYPE_MANAGEMENT_ADDRESS_DISTINGUISHED_NAMEZ$SUBTYPE_MANAGEMENT_ADDRESS_AS_NUMBERZ(SUBTYPE_MANAGEMENT_ADDRESS_XTP_OVER_IPV4Z(SUBTYPE_MANAGEMENT_ADDRESS_XTP_OVER_IPV6Z.SUBTYPE_MANAGEMENT_ADDRESS_XTP_NATIVE_MODE_XTPZ=SUBTYPE_MANAGEMENT_ADDRESS_FIBER_CHANNEL_WORLD_WIDE_PORT_NAMEZ=SUBTYPE_MANAGEMENT_ADDRESS_FIBER_CHANNEL_WORLD_WIDE_NODE_NAMEZSUBTYPE_MANAGEMENT_ADDRESS_GWIDZ(SUBTYPE_MANAGEMENT_ADDRESS_AFI_FOR_L2VPNZ6SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_SECTION_ENDPOINT_IDZ2SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_LSP_ENDPOINT_IDZ9SUBTYPE_MANAGEMENT_ADDRESS_MPLS_TP_PSEUDOWIRE_ENDPOINT_IDZ4SUBTYPE_MANAGEMENT_ADDRESS_MT_IP_MULTI_TOPOLOGY_IPV4Z4SUBTYPE_MANAGEMENT_ADDRESS_MT_IP_MULTI_TOPOLOGY_IPV6ZINTERFACE_NUMBERING_SUBTYPESZ SUBTYPE_INTERFACE_NUMBER_UNKNOWNZ!SUBTYPE_INTERFACE_NUMBER_IF_INDEXZ+SUBTYPE_INTERFACE_NUMBER_SYSTEM_PORT_NUMBERr   r%   r€   r   r   r�   r   r	   r®   r|   r    r    r    r!   rn   9  s€   
ý
ÿþÿÿþ
ÿírn   c                   @   s   e Zd Zdd„ ZdS )ÚThreeBytesEnumFieldc                 C   s   t  | |||d¡ d S )Nz!I)r   Ú__init__)rL   ÚnameÚdefaultÚenumr    r    r!   r¾   Ÿ  s    zThreeBytesEnumField.__init__N)r   r   r   r¾   r    r    r    r!   r½   �  s   r½   c                
   @   s€   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d„ d�eddeƒeddƒedddd„ d�g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‹   Nr2   Údatac                 C   s   t | jƒd S r    )rY   rÃ   r—   r    r    r!   r˜   µ  r™   z*LLDPDUGenericOrganisationSpecific.<lambda>rš   Zorg_coder   r…   r¢   c                 C   s   | j d u rdS | j d S )Nr   r*   r´   rŸ   r    r    r!   r˜   ¹  s   r£   )r   r   r   ZORG_UNIQUE_CODE_PNOZORG_UNIQUE_CODE_IEEE_802_1ZORG_UNIQUE_CODE_IEEE_802_3ZORG_UNIQUE_CODE_TIA_TR_41_MEDZORG_UNIQUE_CODE_HYTECZORG_UNIQUE_CODESr   r%   r€   r   r½   r   r   r®   r    r    r    r!   rÂ   £  s&   û	
ÿûrÂ   r&   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚLLDPConfigurationz,
    basic configuration for LLDP layer
    c                 C   s   d| _ |  ¡  d S )NT)Ú_strict_modeÚstrict_mode_enabler{   r    r    r!   r¾   Ò  s    zLLDPConfiguration.__init__c                 C   s
   d| _ dS )z<
        enable strict mode and dissector debugging
        TN©rÅ   r{   r    r    r!   rÆ   Ö  s    z$LLDPConfiguration.strict_mode_enablec                 C   s
   d| _ dS )z=
        disable strict mode and dissector debugging
        FNrÇ   r{   r    r    r!   Ústrict_mode_disableÜ  s    z%LLDPConfiguration.strict_mode_disablec                 C   s   | j S )z/
        get current strict mode state
        rÇ   r{   r    r    r!   rW   â  s    zLLDPConfiguration.strict_modeN)r   r   r   r   r¾   rÆ   rÈ   rW   r    r    r    r!   rÄ   Í  s
   rÄ   )ÚtypeN)9r   Zscapy.configr   Zscapy.errorr   Zscapy.layers.l2r   r   Zscapy.fieldsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zscapy.packetr   r   Z
scapy.datar   Zscapy.compatr   ZLLDP_NEAREST_BRIDGE_MACZ LLDP_NEAREST_NON_TPMR_BRIDGE_MACZ LLDP_NEAREST_CUSTOMER_BRIDGE_MACZLLDP_ETHER_TYPEr   r"   r#   r$   r%   rŠ   rŒ   r`   ra   rb   ri   rj   rk   rl   rm   rn   r½   rÂ   rI   ÚobjectrÄ   rV   r    r    r    r!   Ú<module>   s\   D [::2dö