a
    kÄ#d–  ã                   @   sZ  d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZmZ dZd	ee< d
ZdZ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ƒZG dd„ deƒZG dd„ deƒZej eej!eej"eej#eej$eej%eej&eiZ'eeeed� eeeed� d S )!a-  
    MACControl
    ~~~~~~~~~~

    :author:    Thomas Tannhaeuser, hecke@naberius.de

    :description:

        This module provides Scapy layers for the MACControl protocol messages:
            - Pause
            - Gate
            - Report
            - Register/REQ/ACK
            - Class Based Flow Control

        normative references:
            - IEEE 802.3x


    :NOTES:
        - this is based on the MACControl dissector used by Wireshark
          (https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-maccontrol.c)

é    )Úorb)ÚETHER_TYPES)ÚScapy_Exception)ÚIntFieldÚ	ByteFieldÚByteEnumFieldÚ
ShortFieldÚBitField)ÚPacket)ÚEtherÚDot1QÚbind_layersiˆ  ZMAC_CONTROLé   é   é   c                   @   sˆ   e Zd ZdZdZdZdZdZdZdZ	dZ
ed	ed
ededede	de
diZdZdZdZdZedededediZdd„ Zdd„ Zdd„ ZdS )Ú
MACControlz01:80:c2:00:00:01r   r   é   r   é   é   i  ÚpauseZgateÚreportzregister reqÚregisterZregister_ackzclass based flow controlZ
deregisterZackZnackc                 C   sF   z&t |d ƒd> t |d ƒ }t| W S  ty8   Y n0 t | |¡S )Nr   é   r   )r   ÚMAC_CTRL_CLASSESÚKeyErrorr
   Úguess_payload_class)ÚselfÚpayloadZop_code© r   úP/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/mac_control.pyr   T   s    
zMACControl.guess_payload_classc                 C   sB   | j }d}|r(t|tƒr(|d7 }|j }q
|r>t|tƒr>|d7 }|S )zY
        get the total size of all under layers
        :return: number of bytes
        r   r   é   )Z
underlayerÚ
isinstancer   r   )r   Zunder_layerÚunder_layers_sizer   r   r   Ú_get_underlayers_size^   s    z MACControl._get_underlayers_sizec                 C   s8   |s0|   ¡ }t|ƒ| }|dk r0|dd|   S || S )zâ
        add padding to the frame if required.

        note that padding is only added if pay is None/empty. this allows us to add  # noqa: E501
        any payload after the MACControl* PDU if needed (piggybacking).
        é@   ó    )r#   Úlen)r   ZpktZpayr"   Ú
frame_sizer   r   r   Ú
post_buildr   s    zMACControl.post_buildN)Ú__name__Ú
__module__Ú__qualname__ZDEFAULT_DST_MACÚOP_CODE_PAUSEÚOP_CODE_GATEÚOP_CODE_REPORTÚOP_CODE_REGISTER_REQÚOP_CODE_REGISTERÚOP_CODE_REGISTER_ACKÚ OP_CODE_CLASS_BASED_FLOW_CONTROLZOP_CODESZFLAG_REGISTERZFLAG_DEREGISTERZFLAG_ACKZ	FLAG_NACKÚREGISTER_FLAGSr   r#   r(   r   r   r   r   r   0   s8   ùü
r   c                   @   s   e Zd ZdS )ÚMACControlInvalidSpeedExceptionN)r)   r*   r+   r   r   r   r   r4   …   s   r4   c                   @   s.   e Zd ZedejƒeddƒgZefdd„ZdS )ÚMACControlPauseÚ_op_codeÚ
pause_timer   c                 C   s<   z| j tdtdtdi|  W S  ty6   tdƒ‚Y n0 dS )a+  
        get pause time for given link speed in seconds

        :param speed: select link speed to get the pause time for, must be ETHER_SPEED_MBIT_[10,100,1000]  # noqa: E501
        :return: pause time in seconds
        :raises MACControlInvalidSpeedException: on invalid speed selector
        gH¯¼šò×
?g:Œ0âŽyÕ>g•Ö&è.±>zKInvalid speed selector given. Must be one of ETHER_SPEED_MBIT_[10,100,1000]N)r7   ÚETHER_SPEED_MBIT_10ÚETHER_SPEED_MBIT_100ÚETHER_SPEED_MBIT_1000r   r4   )r   Úspeedr   r   r   Úget_pause_time�   s    	ýüzMACControlPause.get_pause_timeN)	r)   r*   r+   r   r   r,   Úfields_descr:   r<   r   r   r   r   r5   ‰   s   
þr5   c                   @   s"   e Zd ZedejƒeddƒgZdS )ÚMACControlGater6   Ú	timestampr   N)r)   r*   r+   r   r   r-   r   r=   r   r   r   r   r>   £   s   
þr>   c                   @   s6   e Zd Zedejƒeddƒeddejƒe	ddƒgZ
dS )ÚMACControlReportr6   r?   r   ÚflagsZpending_grantsN)r)   r*   r+   r   r   r.   r   r   r3   r   r=   r   r   r   r   r@   ª   s
   
ür@   c                   @   sF   e Zd Zedejƒeddƒeddƒeddejƒeddƒe	ddƒgZ
dS )	ÚMACControlRegisterReqr6   r?   r   Zassigned_portrA   Z	sync_timeZechoed_pending_grantsN)r)   r*   r+   r   r   r/   r   r   r3   r   r=   r   r   r   r   rB   ³   s   
úrB   c                   @   s>   e Zd ZedejƒeddƒeddejƒeddƒeddƒgZ	dS )ÚMACControlRegisterr6   r?   r   rA   Úechoed_assigned_portÚechoed_sync_timeN)
r)   r*   r+   r   r   r0   r   r   r3   r=   r   r   r   r   rC   ¾   s   
ûrC   c                   @   s>   e Zd ZedejƒeddƒeddejƒeddƒeddƒgZ	dS )ÚMACControlRegisterAckr6   r?   r   rA   rD   rE   N)
r)   r*   r+   r   r   r1   r   r   r3   r=   r   r   r   r   rF   È   s   
ûrF   c                   @   s²   e Zd Zedejƒe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ƒeddƒeddƒeddƒeddƒeddƒeddƒeddƒgZdS )ÚMACControlClassBasedFlowControlr6   Ú	_reservedr   Z
c7_enabledr   Z
c6_enabledZ
c5_enabledZ
c4_enabledZ
c3_enabledZ
c2_enabledZ
c1_enabledZ
c0_enabledZc0_pause_timeZc1_pause_timeZc2_pause_timeZc3_pause_timeZc4_pause_timeZc5_pause_timeZc6_pause_timeZc7_pause_timeN)	r)   r*   r+   r   r   r2   r   r	   r=   r   r   r   r   rG   Ò   s&   








îrG   )ÚtypeN)(Ú__doc__Zscapy.compatr   Z
scapy.datar   Zscapy.errorr   Zscapy.fieldsr   r   r   r   r	   Zscapy.layers.dot11r
   Zscapy.layers.l2r   r   r   ZMAC_CONTROL_ETHER_TYPEr8   r9   r:   r   r4   r5   r>   r@   rB   rC   rF   rG   r,   r-   r.   r/   r0   r1   r2   r   r   r   r   r   Ú<module>   s<   U	

ù
