a
    kÄ#d  ã                ;   @   s`  d Z ddlmZ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 ddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lZdd
lmZ 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#œZd$Zd%d&„ Ze e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'd0ƒed'd1ƒed'd2ƒed'd3ƒed'd4ƒed'd5ƒed'd6ƒed'd7ƒed'd8ƒed'd9ƒe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-ƒed=d.ƒed=d/ƒed=d0ƒed=d1ƒed=d2ƒed=d3ƒe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>d0ƒed>d1ƒed>d2ƒed>d3ƒed>d4ƒed>d5ƒed>d6ƒed>d7ƒed>d8ƒed>d9ƒed>d:ƒed>d;ƒed>d<ƒed?d,ƒed?d-ƒed@fg9ƒZ!G dAdB„ dBeƒZ"G dCdD„ dDeƒZ#dEdF„ Z$G dGdH„ dHeƒZ%G dIdJ„ dJeƒZ&ee"e#edK� eee%dLdM� ee%e"ƒ ee"e&ed'd9ƒd dK� ee"e&ed>d9ƒd dK� eee"dNdO� d	S )Pz$
RoCE: RDMA over Converged Ethernet
é    )ÚPacketÚbind_layersÚRaw)	ÚByteEnumFieldÚ	ByteFieldÚ
XByteFieldÚ
ShortFieldÚXShortFieldÚ
XLongFieldÚBitFieldÚ	XBitFieldÚFCSField)ÚIPÚUDP)ÚEther)Úraw)Úwarning)Úcrc32N)ÚTupleé    é@   é`   )ÚRCÚUCÚRDÚUDé   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   )Ú
SEND_FIRSTÚSEND_MIDDLEÚ	SEND_LASTÚSEND_LAST_WITH_IMMEDIATEÚ	SEND_ONLYÚSEND_ONLY_WITH_IMMEDIATEÚRDMA_WRITE_FIRSTÚRDMA_WRITE_MIDDLEÚRDMA_WRITE_LASTÚRDMA_WRITE_LAST_WITH_IMMEDIATEÚRDMA_WRITE_ONLYÚRDMA_WRITE_ONLY_WITH_IMMEDIATEÚRDMA_READ_REQUESTÚRDMA_READ_RESPONSE_FIRSTÚRDMA_READ_RESPONSE_MIDDLEÚRDMA_READ_RESPONSE_LASTÚRDMA_READ_RESPONSE_ONLYÚACKNOWLEDGEÚATOMIC_ACKNOWLEDGEÚCOMPARE_SWAPÚ	FETCH_ADDé�   c                 C   s   t |  t|  d | |¡fS )Nz{}_{})Ú_transportsÚ_opsÚformat)Ú	transportÚop© rK   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/roce.pyÚopcode;   s    rM   r   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   r   r   r   ZCNPc                   @   s¼   e Zd Zd Zeddeƒedddƒedddƒedddƒeddd	ƒ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d�gZ	e
dd„ ƒZdd„ Zdd„ ZdS ) ÚBTHrM   r   Z	solicitedr   ZmigreqZpadcountr   Úversionr   Úpkeyéÿÿ  ÚfecnÚbecnÚresv6r!   Údqpné   ZackreqZresv7r"   ZpsnÚicrcNú!I)Úfmtc                 C   s   t  d| d@ ¡d d d… S )NrX   ì   ÿÿ éÿÿÿÿ)ÚstructÚpack)rW   rK   rK   rL   Ú	pack_icrc”   s    zBTH.pack_icrcc           	      C   s   | j }|d u st|tƒs2td|o$|jƒ |  d¡S |j }t|tƒrâtdƒ| ¡  }d|_	d|_
d|_d|t _	d|t _d|t _d|t _|t  ¡ }t|t jƒ}d}t|| | ƒ|t _tt|ƒd d… ƒd	@ }|  |¡S td
|oî|jƒ |  d¡S d S )Nz5Expecting UDP underlayer to compute checksum. Got %s.r   s   ÿÿÿÿÿÿÿÿrQ   éÿ   r   s   ÿÿÿÿéüÿÿÿrZ   z,The underlayer protocol %s is not supported.)Z
underlayerÚ
isinstancer   r   Únamer^   r   r   ÚcopyÚchksumÚttlZtosrN   rR   rS   rT   Z
self_buildr   Úpayloadr   )	ÚselfÚpZudpÚipZpshdrZbthrf   Zicrc_placeholderrW   rK   rK   rL   Úcompute_icrc™   s4    ÿ






ÿzBTH.compute_icrcc                 C   s,   ||7 }| j d u r(|d d… |  |¡ }|S )Nr`   )rW   rj   )rg   rh   ZpayrK   rK   rL   Ú
post_build¼   s    
zBTH.post_build)Ú__name__Ú
__module__Ú__qualname__rb   r   Ú_bth_opcodesr   r	   r   Úfields_descÚstaticmethodr^   rj   rk   rK   rK   rK   rL   rN   �   s(   











ñ
#rN   c                   @   s$   e Zd Zd ZeddƒeddƒgZdS )Ú
CNPPaddingZ	reserved1r   Z	reserved2N)rl   rm   rn   rb   r
   rp   rK   rK   rK   rL   rr   Ä   s   þrr   c                 C   s   t td| d�tƒ  S )Nr   )rM   rS   rU   )rN   Ú
CNP_OPCODErr   )rU   rK   rK   rL   ÚcnpÌ   s    rt   c                   @   s^   e Zd Zd Zedddƒedddƒedddƒed	dƒed
dƒeddƒedddƒedddƒgZdS )ÚGRHZipverr!   r   Ztclassr   r#   Z	flowlabelr/   ZpaylenZnexthdrZhoplmtZsgidé€   ZdgidN)	rl   rm   rn   rb   r   r   r   r   rp   rK   rK   rK   rL   ru   Ñ   s   




øru   c                   @   s&   e Zd Zd ZeddƒedddƒgZdS )ÚAETHZsyndromer   ZmsnrV   N)rl   rm   rn   rb   r   r   rp   rK   rK   rK   rL   rw   ß   s   
þrw   )rM   i‰  )Útypei·  )Údport)'Ú__doc__Zscapy.packetr   r   r   Zscapy.fieldsr   r   r   r   r	   r
   r   r   r   Zscapy.layers.inetr   r   Zscapy.layers.l2r   Zscapy.compatr   Zscapy.errorr   Úzlibr   r\   r   rF   rG   rs   rM   Údictro   rN   rr   rt   ru   rw   rK   rK   rK   rL   Ú<module>	   sØ   ,üëÃAC
