a
    kÄ#dë  ã                   @   s  d Z ddlmZmZmZmZmZmZ ddlm	Z	m
Z
mZ ddlmZmZ ddlm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G dd„ de	ƒZdd„ ZG dd„ de	ƒZG dd„ deƒZeeeƒ dD ]Ze
eeed� qâe
eeƒ e
eeƒ dS )a  
    GARP - Generic Attribute Register Protocol
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    :author:    Sergey Matsievskiy, matsievskiysv@gmail.com

    :description:

        This module provides Scapy layers for the GARP protocol and its
        two applications: GARP VLAN Registration Protocol (GVRP) and
        GARP Multicast Registration Protocol (GMRP)

        normative references:
            - IEEE 802.1D 2004 - Media Access Control (MAC) Bridges
            - IEEE 802.1Q 1998 - Virtual Bridged Local Area Networks

é    )ÚLenFieldÚ	EnumFieldÚ	ByteFieldÚPacketListFieldÚ
ShortFieldÚMACField)ÚPacketÚbind_layersÚsplit_layers)ÚLLCÚDot3)Úwarningc                   @   s(   e Zd ZdZd ZeddƒgZdd„ ZdS )ÚGVRPz
    GVRP
    Zvlané   c                 C   s   d|fS ©Nó    © ©ÚselfÚsr   r   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/gxrp.pyÚextract_padding0   s    zGVRP.extract_paddingN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer   Úfields_descr   r   r   r   r   r   &   s   r   c                   @   s(   e Zd ZdZdZeddƒgZdd„ ZdS )Ú
GMRP_GROUPz
    GMRP Group
    z
GMRP GroupÚaddrNc                 C   s   d|fS r   r   r   r   r   r   r   >   s    zGMRP_GROUP.extract_padding)r   r   r   r   r   r   r   r   r   r   r   r   r   4   s   r   c                   @   s4   e Zd ZdZdZedddddœdd	�gZd
d„ ZdS )ÚGMRP_SERVICEz
    GMRP Service
    zGMRP ServiceÚeventr   z
All GroupszAll Unregistered Groups)r   r   ÚB©Úfmtc                 C   s   d|fS r   r   r   r   r   r   r   S   s    zGMRP_SERVICE.extract_paddingN)r   r   r   r   r   r   r   r   r   r   r   r   r    B   s   üÿ	r    c                       sj   e Zd ZdZdZeddddd„ d�ed	d
dddddddœdd�gZ‡ fdd„Zdd„ Z	‡ fdd„Z
‡  ZS )ÚGARP_ATTRIBUTEz"
    GARP attribute container
    zGARP AttributeÚlenNr"   c                 C   s   | d S ©Né   r   )Úlr   r   r   Ú<lambda>`   r   zGARP_ATTRIBUTE.<lambda>)r$   Úadjustr!   r   ZLeaveAllZ	JoinEmptyZJoinInZ
LeaveEmptyZLeaveInÚEmpty)r   r   r(   é   é   é   r#   c                    s:   t t| ƒ |¡}| jd ur6| jdkr6| jdkr6tdƒ |S )Nr   r(   z#Non-empty payload at LeaveAll event)Úsuperr%   Ú
do_dissectr&   r!   r   r   ©Ú	__class__r   r   r1   p   s    zGARP_ATTRIBUTE.do_dissectc                 C   s"   | j d }|d |… ||d … fS r'   )r&   )r   r   Úboundaryr   r   r   r   v   s    
zGARP_ATTRIBUTE.extract_paddingc                    sz   zV| j }|j }|j}|j}|jdkr*tW S |jdkrT|jdkrDtW S |jdkrTtW S W n tyh   Y n0 tt	| ƒ 
|¡S )Nú01:80:c2:00:00:21ú01:80:c2:00:00:20r   r(   )ÚparentZ
underlayerÚdstr   Útyper   r    ÚAttributeErrorr0   r%   Úguess_payload_class)r   ÚpayloadZgarp_messageZgarpZllcZdot3r2   r   r   r;   z   s"    ÿÿ


z"GARP_ATTRIBUTE.guess_payload_class)r   r   r   r   r   r   r   r   r1   r   r;   Ú__classcell__r   r   r2   r   r%   W   s&   úõþr%   c                 C   sD   |r t |ƒdks |dd… dkr$d S t|dd… ƒdkr<tS d S d S )Nr   r   ó    r(   )r&   Úordr%   ©ZpktÚlstÚcurZremainr   r   r   Úparse_next_attr�   s
     rC   c                   @   s<   e Zd ZdZdZeddƒedg ed�eddƒgZd	d
„ Z	dS )ÚGARP_MESSAGEz 
    GARP message container
    zGARP Messager9   r   Úattrs©Znext_cls_cbÚend_markr   c                 C   s   d|fS r   r   r   r   r   r   r   ¦   s    zGARP_MESSAGE.extract_paddingN)
r   r   r   r   r   r   r   rC   r   r   r   r   r   r   rD   š   s   ýrD   c                 C   s,   |st |ƒdks |dd… dkr$d S tS d S )Nr   r   r>   )r&   rD   r@   r   r   r   Úparse_next_msgª   s     rH   c                   @   s4   e Zd ZdZd Zeddƒedg ed�eddƒgZ	dS )	ÚGARPz
    GARP packet
    Zproto_idr   ZmsgsrF   rG   r   N)
r   r   r   r   r   r   r   rH   r   r   r   r   r   r   rI   ²   s   ýrI   c                   @   s   e Zd ZdZg ZdS )ÚLLC_GARPz'
    Dummy class for layer binding
    N)r   r   r   r   Zpayload_guessr   r   r   r   rJ   À   s   rJ   )r6   r5   z01:80:c2:00:00:22z01:80:c2:00:00:23z01:80:c2:00:00:24z01:80:c2:00:00:25z01:80:c2:00:00:26z01:80:c2:00:00:27z01:80:c2:00:00:28z01:80:c2:00:00:29z01:80:c2:00:00:2az01:80:c2:00:00:2bz01:80:c2:00:00:2cz01:80:c2:00:00:2dz01:80:c2:00:00:2ez01:80:c2:00:00:2f)r8   N)r   Zscapy.fieldsr   r   r   r   r   r   Zscapy.packetr   r	   r
   Zscapy.layers.l2r   r   Zscapy.errorr   r   r   r    r%   rC   rD   rH   rI   rJ   Úmacr   r   r   r   Ú<module>   s$    9


