o
    àý°j\ ã                   @   s´  d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ ejd  dkrCejd dkrCd	d
„ Zdd
„ Zndd
„ Zdd
„ Z	 G dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ deƒZG dd„ de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G d(d)„ d)eƒZG d*d+„ d+eƒZG d,d-„ d-eƒZ G d.d/„ d/eƒZ!d0d1„ Z"dS )2é    )Údivision)Úprint_functionN)Úhexlify©Úreduceé   é   é   c                 C   ó   |   ¡ S ©N)Útobytes©Úarray_object© r   úˆ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/ImpactPacket.pyÚ<lambda>"   ó    r   c                 C   ó
   |   |¡S r   )Ú	frombytes©r   Úbytesr   r   r   r   #   ó   
 c                 C   r
   r   )Útostringr   r   r   r   r   %   r   c                 C   r   r   )Ú
fromstringr   r   r   r   r   &   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚImpactPacketExceptionc                 C   s
   || _ d S r   )Úvalue©Úselfr   r   r   r   Ú__init__4   ó   
zImpactPacketException.__init__c                 C   ó
   t | jƒS r   )Úreprr   ©r   r   r   r   Ú__str__6   r   zImpactPacketException.__str__N)Ú__name__Ú
__module__Ú__qualname__r   r#   r   r   r   r   r   3   s    r   c                   @   s¶   e Zd ZdZd*dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
d+dd„Zd+dd„Zd+dd„Zd+dd„Zd+dd„Zd+dd„Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZdS ),ÚPacketBuffera)  Implement the basic operations utilized to operate on a
    packet's raw buffer. All the packet classes derive from this one.

    The byte, word, long and ip_address getters and setters accept
    negative indexes, having these the a similar effect as in a
    regular Python sequence slice.
    Nc                 C   s*   |rt   dd| ¡| _dS t   d¡| _dS )zCIf 'length' is specified the buffer is created with an initial sizeÚBó    N©ÚarrayÚ_PacketBuffer__bytes©r   Úlengthr   r   r   r   B   s   zPacketBuffer.__init__c                 C   s   t   d|¡| _dS )z:Sets the value of the packet buffer from the string 'data'r(   Nr*   ©r   Údatar   r   r   Úset_bytes_from_stringI   ó   z"PacketBuffer.set_bytes_from_stringc                 C   r    )z,Returns the packet buffer as a string object)Úarray_tobytesr,   r"   r   r   r   Úget_buffer_as_stringM   ó   
z!PacketBuffer.get_buffer_as_stringc                 C   ó   | j S )z%Returns the packet buffer as an array)r,   r"   r   r   r   Ú	get_bytesQ   ó   zPacketBuffer.get_bytesc                 C   s   t   d| ¡ ¡| _dS )z#Set the packet buffer from an arrayr(   N)r+   Útolistr,   )r   r   r   r   r   Ú	set_bytesU   s   zPacketBuffer.set_bytesc                 C   s   |   |d¡}|| j|< dS )zSet byte at 'index' to 'value'r   N©Ú_PacketBuffer__validate_indexr,   )r   Úindexr   r   r   r   Úset_byteZ   s   zPacketBuffer.set_bytec                 C   s   |   |d¡}| j| S )zReturn byte at 'index'r   r;   ©r   r=   r   r   r   Úget_byte_   s   
zPacketBuffer.get_byteú!c                 C   óT   |   |d¡}t dt |d |¡¡}d|kr|| j|d…< dS || j||d …< dS )znSet 2-byte word at 'index' to 'value'. See struct module's documentation to understand the meaning of 'order'.r	   r(   ÚHéþÿÿÿN©r<   r+   ÚstructÚpackr,   ©r   r=   r   ÚorderÚaryr   r   r   Úset_wordd   ó
   zPacketBuffer.set_wordc                 C   óP   |   |d¡}d|kr| j|d… }n	| j||d … }t |d t|ƒ¡\}|S )zfReturn 2-byte word at 'index'. See struct module's documentation to understand the meaning of 'order'.r	   rD   NrC   ©r<   r,   rF   Úunpackr3   ©r   r=   rI   r   r   r   r   r   Úget_wordm   ó   zPacketBuffer.get_wordc                 C   rB   )zfSet 4-byte 'value' at 'index'. See struct module's documentation to understand the meaning of 'order'.é   r(   ÚLéüÿÿÿNrE   rH   r   r   r   Úset_longw   rL   zPacketBuffer.set_longc                 C   rM   )zgReturn 4-byte value at 'index'. See struct module's documentation to understand the meaning of 'order'.rS   rU   NrT   rN   rP   r   r   r   Úget_long€   rR   zPacketBuffer.get_longc                 C   rB   )zfSet 8-byte 'value' at 'index'. See struct module's documentation to understand the meaning of 'order'.é   r(   ÚQéøÿÿÿNrE   rH   r   r   r   Úset_long_longŠ   rL   zPacketBuffer.set_long_longc                 C   rM   )zgReturn 8-byte value at 'index'. See struct module's documentation to understand the meaning of 'order'.rX   rZ   NrY   rN   rP   r   r   r   Úget_long_long“   rR   zPacketBuffer.get_long_longc                 C   sD   |   |d¡}d|kr| j|d… }n	| j||d … }t t|ƒ¡S )z.Return 4-byte value at 'index' as an IP stringrS   rU   N)r<   r,   ÚsocketÚ	inet_ntoar3   )r   r=   r   r   r   r   Úget_ip_addressž   s
   zPacketBuffer.get_ip_addressc                 C   sj   |   |d¡}t |¡}t d|¡\}}}}|  ||¡ |  |d |¡ |  |d |¡ |  |d |¡ dS )z,Set 4-byte value at 'index' from 'ip_string'rS   ÚBBBBr   r	   r   N)r<   r]   Ú	inet_atonrF   rO   r>   )r   r=   Ú	ip_stringÚrawÚb1Úb2Úb3Úb4r   r   r   Úset_ip_address§   s   
zPacketBuffer.set_ip_addressc                 C   s   |   ||  |¡¡ dS )z@Set 16-bit checksum at 'index' by calculating checksum of 'data'N)rK   Úcompute_checksum)r   r=   r0   r   r   r   Úset_checksum_from_data±   s   z#PacketBuffer.set_checksum_from_datac                 C   sn   t |ƒ}d}d}|dkr&|| d ||d  |  }|d }|d }|dks|dkr2||| d  }|  |¡S )z\Return the one's complement of the one's complement sum of all the 16-bit words in 'anArray'r   r   é   r	   )ÚlenÚnormalize_checksum)r   ÚanArrayÚnleftÚsumÚposr   r   r   ri   µ   s   ý
zPacketBuffer.compute_checksumc                 C   s.   |}|d? |d@  }||d? 7 }| d@ }|S )Né   iÿÿ  r   )r   ÚaValuerp   r   r   r   rm   Â   s
   
zPacketBuffer.normalize_checksumc                 C   sV   |}t | jƒ}|dk r|| }|| | }|dkr)t| jd| ƒ |dk r)||8 }|S )zÉThis method performs two tasks: to allocate enough space to
        fit the elements at positions index through index+size, and to
        adjust negative indexes to their absolute equivalent.
        r   r)   )rl   r,   Úarray_frombytes)r   r=   ÚsizeÚ
orig_indexÚcurlenÚdiffr   r   r   Ú__validate_indexÉ   s   
zPacketBuffer.__validate_indexr   )rA   )r$   r%   r&   Ú__doc__r   r1   r4   r7   r:   r>   r@   rK   rQ   rV   rW   r[   r\   r_   rh   rj   ri   rm   r<   r   r   r   r   r'   9   s*    


	


	


		
r'   c                   @   s@   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dS )ÚProtocolLayerzDProtocol Layer Manager for insertion and removal of protocol layers.Nc                 C   s   || _ | | ¡ dS )z1Set 'aHeader' as the child of this protocol layerN©Ú_ProtocolLayer__childÚ
set_parent)r   ÚaHeaderr   r   r   Úcontainsã   s   zProtocolLayer.containsc                 C   s
   || _ dS )z?Set the header 'my_parent' as the parent of this protocol layerN©Ú_ProtocolLayer__parent)r   Ú	my_parentr   r   r   r~   è   r5   zProtocolLayer.set_parentc                 C   r6   )z'Return the child of this protocol layer)r}   r"   r   r   r   Úchildì   r8   zProtocolLayer.childc                 C   r6   )z(Return the parent of this protocol layerr�   r"   r   r   r   Úparentð   r8   zProtocolLayer.parentc                 C   s    | j r| j  d¡ d| _ dS dS )z-Break the hierarchy parent/child child/parentNr|   r"   r   r   r   Úunlink_childô   s   
þzProtocolLayer.unlink_child)r$   r%   r&   rz   r}   r‚   r€   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dZdd„ Z	dd„ Z
dd„ ZeeƒZd	d
„ ZeeƒZdd„ ZeeƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZeeƒZd'd(„ Z ee ƒZ!d)d*„ Z"dS )+ÚProtocolPacketr   Nc                 C   s0   || _ || _t| j ƒ| _tƒ | _t| jƒ| _d S r   )Ú_ProtocolPacket__HEADER_SIZEÚ_ProtocolPacket__TAIL_SIZEr'   Ú_ProtocolPacket__headerÚ_ProtocolPacket__bodyÚ_ProtocolPacket__tail)r   Úheader_sizeÚ	tail_sizer   r   r   r     s
   zProtocolPacket.__init__c                 C   s2   |   ¡ r|   ¡  ¡ }t|ƒ| _| j |¡ d S d S r   )r„   Ú
get_packetrl   Ú_ProtocolPacket__BODY_SIZEr‹   r1   )r   Úbodyr   r   r   Ú__update_body_from_child
  s
   
ýz'ProtocolPacket.__update_body_from_childc                 C   r6   r   )rŠ   r"   r   r   r   Ú__get_header  ó   zProtocolPacket.__get_headerc                 C   ó   |   ¡  | jS r   )Ú'_ProtocolPacket__update_body_from_childr‹   r"   r   r   r   Ú
__get_body  s   zProtocolPacket.__get_bodyc                 C   r6   r   )rŒ   r"   r   r   r   Ú
__get_tail  r”   zProtocolPacket.__get_tailc                 C   r6   )zReturn frame header size)rˆ   r"   r   r   r   Úget_header_size!  r8   zProtocolPacket.get_header_sizec                 C   r6   )zReturn frame tail size)r‰   r"   r   r   r   Úget_tail_size%  r8   zProtocolPacket.get_tail_sizec                 C   r•   )zReturn frame body size)r–   r�   r"   r   r   r   Úget_body_size)  s   zProtocolPacket.get_body_sizec                 C   s   |   ¡ |  ¡  |  ¡  S )zReturn frame total size)r™   r›   rš   r"   r   r   r   Úget_size.  s   zProtocolPacket.get_sizec                 C   ó   t |ƒ| _| j |¡ d S r   )rl   rˆ   rŠ   r1   ©r   ÚaBufferr   r   r   Úload_header2  ó   
zProtocolPacket.load_headerc                 C   s"   |   ¡  t|ƒ| _| j |¡ dS )zsLoad the packet body from string. WARNING: Using this function will break the hierarchy of preceding protocol layerN)r†   rl   r�   r‹   r1   rž   r   r   r   Ú	load_body6  s   
zProtocolPacket.load_bodyc                 C   r�   r   )rl   r‰   rŒ   r1   rž   r   r   r   Ú	load_tail=  r¡   zProtocolPacket.load_tailc                 C   s   |   |d | j… ¡ d S r   )r    rˆ   rž   r   r   r   Ú__extract_headerA  s   zProtocolPacket.__extract_headerc                 C   sF   | j dkrd }n| j  }t|| j|… ƒ| _| j || j|… ¡ d S ©Nr   )r‰   rl   rˆ   r�   r‹   r1   )r   rŸ   Úendr   r   r   Ú__extract_bodyD  s
   
zProtocolPacket.__extract_bodyc                 C   s.   | j dkrd S | j  }| j ||d … ¡ d S r¥   )r‰   rŒ   r1   )r   rŸ   Ústartr   r   r   Ú__extract_tailL  s   
zProtocolPacket.__extract_tailc                 C   s*   |   ¡  |  |¡ |  |¡ |  |¡ dS )ztLoad the whole packet from a stringWARNING: Using this function will break the hierarchy of preceding protocol layerN)r†   Ú_ProtocolPacket__extract_headerÚ_ProtocolPacket__extract_bodyÚ_ProtocolPacket__extract_tailrž   r   r   r   Úload_packetT  s   

zProtocolPacket.load_packetc                 C   ó
   | j  ¡ S r   )rŠ   r4   r"   r   r   r   Úget_header_as_string]  r   z#ProtocolPacket.get_header_as_stringc                 C   s   |   ¡  | j ¡ S r   )r–   r‹   r4   r"   r   r   r   Úget_body_as_string`  s   
z!ProtocolPacket.get_body_as_stringc                 C   r®   r   )rŒ   r4   r"   r   r   r   Úget_tail_as_stringe  r   z!ProtocolPacket.get_tail_as_stringc                 C   sL   |   ¡  d}|  ¡ }|r||7 }|  ¡ }|r||7 }|  ¡ }|r$||7 }|S )Nó    )r–   r¯   r°   r±   )r   ÚretÚheaderr‘   Útailr   r   r   r�   i  s   zProtocolPacket.get_packet)#r$   r%   r&   rˆ   r�   r‰   rŠ   r‹   rŒ   r   r–   Ú_ProtocolPacket__get_headerÚpropertyr´   Ú_ProtocolPacket__get_bodyr‘   Ú_ProtocolPacket__get_tailrµ   r™   rš   r›   rœ   r    r¢   r£   rª   r«   r¬   r­   r¯   r°   Úbody_stringr±   Útail_stringr�   r   r   r   r   r‡   ú   s@    	r‡   c                   @   s€   e Zd ZdZdd„ ejD ƒdg ZdZdZddd„Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚHeaderzBThis is the base class from which all protocol definitions extend.c                 C   s   g | ]	}|t jvr|‘qS r   )ÚstringÚ
whitespace)Ú.0Úcr   r   r   Ú
<listcomp>  s    zHeader.<listcomp>ú Nc                 C   s   t  | |¡ d| _d S ©Nr   )r'   r   Úauto_checksumr-   r   r   r   r   ƒ  ó   
zHeader.__init__c                 C   s   |   ¡ r
|   ¡  ¡ S dS )z7Returns all data from children of this header as stringN)r„   r�   r"   r   r   r   Úget_data_as_string‡  s   zHeader.get_data_as_stringc                 C   s(   |   ¡  |  ¡ }|r|  ¡ | S |  ¡ S )z³Returns the raw representation of this packet and its
        children as a string. The output from this method is a packet
        ready to be transmitted over the wire.
        )Úcalculate_checksumrÆ   r4   r/   r   r   r   r�   �  s
   zHeader.get_packetc                 C   s$   |   ¡ }|  ¡ r||  ¡  ¡  }|S )z7Return the size of this header and all of it's children)r™   r„   rœ   ©r   Ú	tmp_valuer   r   r   rœ   œ  s   zHeader.get_sizec                 C   ó   dS )z.Calculate and set the checksum for this headerNr   r"   r   r   r   rÇ   £  ó   zHeader.calculate_checksumc                 C   s
   t   d¡S )zWPseudo headers can be used to limit over what content will the checksums be calculated.r(   )r+   r"   r   r   r   Úget_pseudo_header§  s   
zHeader.get_pseudo_headerc                 C   sX   |   |¡ |  ¡ }t|ƒ|k r!|t|ƒ }td|ƒD ]}|d7 }q|   |d|… ¡ dS )z]Properly set the state of this instance to reflect that of the raw packet passed as argument.r   r)   N)r1   r™   rl   Úrange)r   rŸ   Úhdr_lenrx   Úir   r   r   r    ¬  s   

zHeader.load_headerc                 C   s   t d| j ƒ‚)zjReturn the size of this header, that is, not counting neither the size of the children nor of the parents.z-Method %s.get_header_size must be overridden.)ÚRuntimeErrorÚ	__class__r"   r   r   r   r™   ¶  ó   zHeader.get_header_sizec                 C   sô   t |ƒrxg }g }d}|D ]C}|d s0|d r| d¡ n| d¡ | d |¡¡ | d¡ g }t|ƒtjv r?| t|ƒ¡ n| d¡ | d	| ¡ |d
7 }q|d rvd|d  }| dd|d  |d   ¡ | d |¡¡ | d¡ |S g S )Nr   r	   rr   rÂ   z    Ú Ú
Ú.z%.2xr   rS   )rl   ÚappendÚjoinÚchrr¼   Úpacket_printable)r   ÚaListÚltmpÚlineÚcountÚbyteÚleftr   r   r   Úlist_as_hexº  s0   




zHeader.list_as_hexc                 C   sJ   |   |  ¡  ¡ ¡}|  ¡ r| dt|  ¡ ƒg¡ t|ƒdkr#d |¡S dS )NrÔ   r   rÓ   )rà   r7   r9   r„   rÖ   Ústrrl   r×   )r   rÛ   r   r   r   r#   ×  s   
zHeader.__str__r   )r$   r%   r&   rz   r½   Ú	printablerÙ   Ú	ethertypeÚprotocolr   rÆ   r�   rœ   rÇ   rÌ   r    r™   rà   r#   r   r   r   r   r¼   |  s    

r¼   c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
ÚDataaó  This packet type can hold raw data. It's normally employed to
    hold a packet's innermost layer's contents in those cases for
    which the protocol details are unknown, and there's a copy of a
    valid packet available.

    For instance, if all that's known about a certain protocol is that
    a UDP packet with its contents set to "HELLO" initiate a new
    session, creating such packet is as simple as in the following code
    fragment:
    packet = UDP()
    packet.contains('HELLO')
    Nc                 C   s    t  | ¡ |r|  |¡ d S d S r   )r¼   r   Úset_datarž   r   r   r   r   ò  s   
ÿzData.__init__c                 C   s   |   |¡ d S r   )r1   r/   r   r   r   ræ   ÷  s   zData.set_datac                 C   ó   t |  ¡ ƒS r   ©rl   r7   r"   r   r   r   rœ   ú  ó   zData.get_sizer   )r$   r%   r&   rz   r   ræ   rœ   r   r   r   r   rå   ä  s
    
rå   c                   @   sb   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚEthernetTagz†Represents a VLAN header specified in IEEE 802.1Q and 802.1ad.
       Provides methods for convenient manipulation with header fields.ì       c                 C   s   t  | d¡ |  d|¡ d S )NrS   r   )r'   r   rV   r   r   r   r   r     s   zEthernetTag.__init__c                 C   ó
   |   d¡S )zReturns Tag Protocol Identifierr   ©rQ   r"   r   r   r   Úget_tpid  r5   zEthernetTag.get_tpidc                 C   ó   |   d|¡S )zSets Tag Protocol Identifierr   ©rK   r   r   r   r   Úset_tpid
  s   zEthernetTag.set_tpidc                 C   ó   |   d¡d@ d? S )zReturns Priority Code Pointr	   éà   é   ©r@   r"   r   r   r   Úget_pcp  r2   zEthernetTag.get_pcpc                 C   s*   |   d¡}|  d|d@ |d@ d> B ¡ dS )zSets Priority Code Pointr	   é   é   rô   N©r@   r>   ©r   r   Ú
orig_valuer   r   r   Úset_pcp  s   
 zEthernetTag.set_pcpc                 C   rò   )zReturns Drop Eligible Indicatorr	   rr   rS   rõ   r"   r   r   r   Úget_dei  r2   zEthernetTag.get_deic                 C   s0   |   d¡}|  d|r|dB ¡ dS |d@ ¡ dS )zSets Drop Eligible Indicatorr	   rr   éï   Nrù   rú   r   r   r   Úset_dei  s   
&zEthernetTag.set_deic                 C   s   |   d¡d@ S )zReturns VLAN Identifierr	   éÿ  rí   r"   r   r   r   Úget_vid   rÒ   zEthernetTag.get_vidc                 C   s&   |   d¡}|  d|d@ |d@ B ¡ dS )zSets VLAN Identifierr	   i ð  r   N)rQ   rK   rú   r   r   r   Úset_vid$  s   
zEthernetTag.set_vidc              	   C   sJ   d}|   ¡ }d d |  d¡¡d ||| ¡d |  ¡ ¡d |  ¡ ¡f¡S )N)zBest EffortÚ
BackgroundzExcellent EffortzCritical Applicationsz"Video, < 100 ms latency and jitterz!Voice, < 10 ms latency and jitterzInternetwork ControlzNetwork ControlrÔ   z802.1Q header: 0x{0:08X}r   zPriority Code Point: {0} ({1})zDrop Eligible Indicator: {0}zVLAN Identifier: {0})rö   r×   ÚformatrW   rý   r  )r   Ú
prioritiesÚpcpr   r   r   r#   )  s   
üzEthernetTag.__str__N)rë   )r$   r%   r&   rz   r   rî   rñ   rö   rü   rý   rÿ   r  r  r#   r   r   r   r   rê   þ  s    
rê   c                   @   sž   e Zd Zd%dd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zd&dd„Zd&dd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd „ ƒZd!d"„ Zd#d$„ ZdS )'ÚEthernetNc                 C   s(   t  | d¡ d| _|r|  |¡ d S d S )Né   r   )r¼   r   Útag_cntr    rž   r   r   r   r   =  s
   ÿzEthernet.__init__c                 C   s   |   dd| j  |¡ dS )ú(Set ethernet data type field to 'aValue'é   rS   N)rK   r	  ©r   rs   r   r   r   Úset_ether_typeC  s   zEthernet.set_ether_typec                 C   s   |   dd| j  ¡S )úReturn ethernet data type fieldr  rS   )rQ   r	  r"   r   r   r   Úget_ether_typeG  ó   zEthernet.get_ether_typec                 C   s    |   |¡}t|  dd|  ¡ƒS )zÌReturns an EthernetTag initialized from index-th VLAN tag.
           The tags are numbered from 0 to self.tag_cnt-1 as they appear in the frame.
           It is possible to use negative indexes as well.r  rS   )Ú_Ethernet__validate_tag_indexrê   rW   r?   r   r   r   Úget_tagK  s   
zEthernet.get_tagc                 C   s@   |   |¡}dd|  }t| ¡ ƒD ]\}}|  || |¡ qdS )zÒSets the index-th VLAN tag to contents of an EthernetTag object.
           The tags are numbered from 0 to self.tag_cnt-1 as they appear in the frame.
           It is possible to use negative indexes as well.r  rS   N)r  Ú	enumerater7   r>   )r   r=   Útagrq   rÏ   Úvalr   r   r   Úset_tagR  s
   
ÿzEthernet.set_tagr   c                 C   s`   |dk r	|| j 7 }ddtdt|| j ƒƒ  }|  ¡ }| ¡ |||…< |  |¡ |  j d7  _ dS )z~Inserts contents of an EthernetTag object before the index-th VLAN tag.
           Index defaults to 0 (the top of the stack).r   r  rS   r   N)r	  ÚmaxÚminr7   r:   )r   r  r=   rq   r0   r   r   r   Úpush_tag[  s   

zEthernet.push_tagc                 C   sV   |   |¡}dd|  }|  |¡}|  ¡ }|||d …= |  |¡ |  jd8  _t|ƒS )z}Removes the index-th VLAN tag and returns it as an EthernetTag object.
           Index defaults to 0 (the top of the stack).r  rS   r   )r  rW   r7   r:   r	  rê   )r   r=   rq   r  r0   r   r   r   Úpop_tagf  s   


zEthernet.pop_tagc                 C   sš   d| _ |dd| j   dd| j   … dv r.|  j d7  _ |dd| j   dd| j   … dv s|  ¡ }|t|ƒ }|dkrB|d| 7 }|  |d |… ¡ d S )Nr   r  rS   r  )s   � s   ˆ¨s   ‘ r   r)   )r	  r™   rl   r1   )r   rŸ   rÎ   rx   r   r   r   r    r  s   $$ÿzEthernet.load_headerc                 C   s   dd| j   S )zReturn size of Ethernet headerr  rS   )r	  r"   r   r   r   r™   }  rÒ   zEthernet.get_header_sizec                 C   s2   |   ¡ rz
|  |   ¡ j¡ W n   	 Y t | ¡S r   ©r„   r  rã   r¼   r�   r"   r   r   r   r�   �  s   
zEthernet.get_packetc                 C   ó   |   ¡ dd… S )z<Return 48 bit destination ethernet address as a 6 byte arrayr   é   ©r7   r"   r   r   r   Úget_ether_dhost‹  ó   zEthernet.get_ether_dhostc                 C   s$   t ddƒD ]
}|  ||| ¡ qdS )z;Set destination ethernet address from 6 byte array 'aValue'r   r  N©rÍ   r>   ©r   rs   rÏ   r   r   r   Úset_ether_dhost�  s   ÿzEthernet.set_ether_dhostc                 C   r  )z7Return 48 bit source ethernet address as a 6 byte arrayr  r  r  r"   r   r   r   Úget_ether_shost”  r   zEthernet.get_ether_shostc                 C   s(   t ddƒD ]}|  |d || ¡ qdS )z6Set source ethernet address from 6 byte array 'aValue'r   r  Nr!  r"  r   r   r   Úset_ether_shost˜  s   ÿzEthernet.set_ether_shostc                 C   s    dd„ | D ƒ}dt dd„ |ƒ S )Nc                 S   s$   g | ]}|d krd| pd| ‘qS )é   ú%xz0%xr   )r¿   Úxr   r   r   rÁ   Ÿ  s   $ z(Ethernet.as_eth_addr.<locals>.<listcomp>rÓ   c                 S   s   | d | S )Nú:r   )r(  Úyr   r   r   r      s    z&Ethernet.as_eth_addr.<locals>.<lambda>r   )rn   Útmp_listr   r   r   Úas_eth_addr�  s   zEthernet.as_eth_addrc                 C   sH   d|   |  ¡ ¡ d }||   |  ¡ ¡7 }|  ¡ r"|dt|  ¡ ƒ 7 }|S )NzEther: ú -> rÔ   )r,  r$  r  r„   rá   ©r   Útmp_strr   r   r   r#   ¢  s
   zEthernet.__str__c                 C   s0   |dk r	|| j 7 }|dk s|| j krtdƒ‚|S )z{Adjusts negative indices to their absolute equivalents.
           Raises IndexError when out of range <0, self.tag_cnt-1>.r   zTag index out of range)r	  Ú
IndexErrorr?   r   r   r   Ú__validate_tag_index©  s
   
zEthernet.__validate_tag_indexr   )r   )r$   r%   r&   r   r  r  r  r  r  r  r    r™   r�   r  r#  r$  r%  Ústaticmethodr,  r#   r  r   r   r   r   r  <  s&    

	


r  c                   @   sŽ   e Zd Zg d¢Zd!dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ ZdS )"ÚLinuxSLL)zsent to us by somebody elsezbroadcast by somebody elsezmulticast by somebody elsez&sent to somebody else to somebody elsez
sent by usNc                 C   ó"   t  | d¡ |r|  |¡ d S d S ©Nrr   ©r¼   r   r    rž   r   r   r   r   ½  ó   ÿzLinuxSLL.__init__c                 C   ó   |   d|¡ dS )z"Sets the packet type field to typer   Nrð   ©r   Útyper   r   r   Úset_typeÂ  r   zLinuxSLL.set_typec                 C   rì   )zReturns the packet type fieldr   rí   r"   r   r   r   Úget_typeÆ  r5   zLinuxSLL.get_typec                 C   r8  )z4Sets the ARPHDR value for the link layer device typer	   Nrð   r   r   r   r   Ú
set_arphdrÊ  r   zLinuxSLL.set_arphdrc                 C   rì   )z7Returns the ARPHDR value for the link layer device typer	   rí   r"   r   r   r   Ú
get_arphdrÎ  r5   zLinuxSLL.get_arphdrc                 C   r8  )z4Sets the length of the sender's address field to lenrS   Nrð   ©r   rl   r   r   r   Úset_addr_lenÒ  r   zLinuxSLL.set_addr_lenc                 C   rì   )z0Returns the length of the sender's address fieldrS   rí   r"   r   r   r   Úget_addr_lenÖ  r5   zLinuxSLL.get_addr_lenc                 C   sJ   t   d|dd… ¡}t|ƒdk r| ddt|ƒ  ¡ ||  ¡ dd…< dS )zJSets the sender's address field to addr. Addr must be at most 8-byte long.r(   NrX   r)   r  r  )r+   rl   Úextendr7   )r   Úaddrr   r   r   Úset_addrÚ  s   zLinuxSLL.set_addrc                 C   s   t |  ¡ dd… ƒS )z"Returns the sender's address fieldr  r  )r3   r7   r"   r   r   r   Úget_addrá  r  zLinuxSLL.get_addrc                 C   r8  )r
  r  Nrð   r  r   r   r   r  å  r   zLinuxSLL.set_ether_typec                 C   rì   )r  r  rí   r"   r   r   r   r  é  r5   zLinuxSLL.get_ether_typec                 C   rÊ   )zReturn size of packet headerrr   r   r"   r   r   r   r™   í  rË   zLinuxSLL.get_header_sizec                 C   s"   |   ¡ r|  |   ¡ j¡ t | ¡S r   r  r"   r   r   r   r�   ñ  s   
zLinuxSLL.get_packetc                 C   s$   |   ¡ }|ttjƒk rtj| S dS )NÚUnknown)r<  rl   r3  Útype_descriptionsr9  r   r   r   Úget_type_descö  s   
zLinuxSLL.get_type_descc                 C   sZ   g }|   ¡ }t|  ¡ d|… ƒ}| d||  ¡ f ¡ |  ¡ r(| t|  ¡ ƒ¡ d |¡S )Nr   zLinux SLL: addr=%s type=`%s'rÔ   )rA  r   rE  rÖ   rH  r„   rá   r×   )r   ÚssÚalenrC  r   r   r   r#   ý  s   
zLinuxSLL.__str__r   )r$   r%   r&   rG  r   r;  r<  r=  r>  r@  rA  rD  rE  r  r  r™   r�   rH  r#   r   r   r   r   r3  ´  s"    
r3  c                   @   sR  e Zd ZdZdSdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dS )TÚIPi   Nc                 C   sd   t  | d¡ |  d¡ |  d¡ |  d¡ g | _|r"d| _|  |¡ tj	 
d¡r-d| _d S d| _d S )	Né   rS   rô   éÿ   r   ÚbsdTF)r¼   r   Úset_ip_vÚ	set_ip_hlÚ
set_ip_ttlÚ_IP__option_listrÄ   r    ÚsysÚplatformrÝ   Úis_BSDrž   r   r   r   r   
  s   





zIP.__init__c                 C   sê   |   ¡ dkr|  ¡ r|  |  ¡ j¡ |  ¡ dkr|  |  ¡ ¡ |  ¡ }| jr*|  	¡  |  
¡ }| jD ]	}| | 
¡ ¡ q1dt|ƒd  d }|rNt|d| ƒ t| jƒr\|  t|ƒd ¡ | jrg|  |  |¡¡ |d u rot|ƒS t|ƒ| S )Nr   rS   r)   )Úget_ip_pr„   Úset_ip_prä   Ú
get_ip_lenÚ
set_ip_lenrœ   rÆ   rÄ   Úreset_ip_sumr7   rR  rB  rl   rt   rP  Ú
set_ip_sumri   r3   )r   Ú
child_dataÚmy_bytesÚopÚnum_padr   r   r   r�     s(   

zIP.get_packetc                 C   sh   t   d¡}| |  ¡ dd… ¡ | dg¡ | |  ¡ dd… ¡ |  ¡  ¡ }t d|¡}t||ƒ |S )Nr(   r  rL  r   é	   é
   z!H)	r+   rB  r7   Úfromlistr„   rœ   rF   rG   rt   )r   Ú
pseudo_bufÚtmp_sizeÚsize_strr   r   r   rÌ   N  s   

zIP.get_pseudo_headerc                 C   s@   | j  |¡ d}| j D ]}|| ¡ 7 }q|dkrtd| ƒ‚d S )Nr   é(   z/Options overflowed in IP packet with length: %d)rR  rÖ   Úget_lenr   ©r   Úoptionrp   r^  r   r   r   Ú
add_optionZ  s   
ÿzIP.add_optionc                 C   s   |   d¡}|d? S )Nr   rS   rõ   ©r   Únr   r   r   Úget_ip_vc  ó   
zIP.get_ip_vc                 C   s6   |   d¡}|d@ }|d@ }||d> B }|  d|¡ d S )Nr   r&  rS   rù   )r   r   rl  Úversionr   r   r   rO  g  s
   
zIP.set_ip_vc                 C   s   |   d¡}|d@ S )Nr   r&  rõ   rk  r   r   r   Ú	get_ip_hln  rn  zIP.get_ip_hlc                 C   s2   |   d¡}|d@ }|d@ }||B }|  d|¡ d S )Nr   r&  éð   rù   )r   r   rl  rl   r   r   r   rP  r  s
   
zIP.set_ip_hlc                 C   rì   rÃ   rõ   r"   r   r   r   Ú
get_ip_tosy  r   zIP.get_ip_tosc                 C   ó   |   d|¡ d S rÃ   ©r>   r   r   r   r   Ú
set_ip_tos|  ó   zIP.set_ip_tosc                 C   ó   | j r
| jddd�S |  d¡S ©Nr	   ú=©rI   ©rU  rQ   r"   r   r   r   rX    ó   
zIP.get_ip_lenc                 C   ó*   | j r| jd|dd� d S |  d|¡ d S rx  ©rU  rK   r   r   r   r   rY  …  ó   zIP.set_ip_lenc                 C   rì   ©NrS   rí   r"   r   r   r   Ú	get_ip_id‹  r   zIP.get_ip_idc                 C   rï   r€  rð   r   r   r   r   Ú	set_ip_id�  ré   zIP.set_ip_idc                 C   rw  ©Nr  ry  rz  r{  r"   r   r   r   Ú
get_ip_off�  r|  zIP.get_ip_offc                 C   r}  rƒ  r~  r  r   r   r   Ú
set_ip_off–  r  zIP.set_ip_offc                 C   ó   |   ¡ d@ S )Niÿ  ©r„  r"   r   r   r   Úget_ip_offmaskœ  ré   zIP.get_ip_offmaskc                 C   s"   |   ¡ d@ }||O }|  |¡ d S )Ni Ð  ©r„  r…  ©r   rs   rÉ   r   r   r   Úset_ip_offmaskŸ  s   zIP.set_ip_offmaskc                 C   r†  )Né €  r‡  r"   r   r   r   Ú	get_ip_rf¤  ré   zIP.get_ip_rfc                 C   ó0   |   ¡ }|r|dO }nd}||M }|  |¡ d S )NrŒ  iÿ  r‰  ©r   rs   rÉ   Úmy_notr   r   r   Ú	set_ip_rf§  ó   
zIP.set_ip_rfc                 C   r†  )Né @  r‡  r"   r   r   r   Ú	get_ip_df°  ré   zIP.get_ip_dfc                 C   rŽ  )Nr“  iÿ¿  r‰  r�  r   r   r   Ú	set_ip_df³  r’  zIP.set_ip_dfc                 C   r†  )Né    r‡  r"   r   r   r   Ú	get_ip_mf¼  ré   zIP.get_ip_mfc                 C   rŽ  )Nr–  iÿß  r‰  r�  r   r   r   Ú	set_ip_mf¿  r’  zIP.set_ip_mfc           
      C   sZ  |   ¡ r|   ¡ jd ur|   ¡ j}n|  ¡ }|  ¡ }|s| gS |  ¡ }d}g }|D ]\}tƒ }| |¡ | |¡ |d rC|d|d  7 }| |d ¡ ||7 }t	|d |… ƒ}	||d … }| 
d|	 ¡  ¡ | |	¡ |rw| d¡ | |¡ q(| d¡ | |¡ |  S |r«tƒ }| |¡ | |¡ | 
dt|ƒ ¡ t	|ƒ}	| |	¡ | |¡ |S )Nr   rX   rL  r   )r„   rä   rV  rÆ   r7   rK  r:   rW  r‹  rå   rY  rœ   r€   r˜  rÖ   rl   )
r   rÚ   Úprotor\  Úip_header_bytesÚcurrent_offsetÚfragment_listÚ	frag_sizeÚipr0   r   r   r   Úfragment_by_listÉ  sH   









zIP.fragment_by_listc                 C   sZ   |   ¡ }|s	| gS t|ƒ}|| }|| r|d7 }g }td|ƒD ]}| |¡ q |  |¡S ©Nr   r   )rÆ   rl   rÍ   rÖ   rŸ  )r   ÚaSizer0   Údata_lenÚ	num_fragsÚ	size_listrÏ   r   r   r   Úfragment_by_size  s   
zIP.fragment_by_sizec                 C   rì   ©NrX   rõ   r"   r   r   r   Ú
get_ip_ttl  r   zIP.get_ip_ttlc                 C   rs  r¦  rt  r   r   r   r   rQ    rv  zIP.set_ip_ttlc                 C   rì   ©Nr`  rõ   r"   r   r   r   rV    r   zIP.get_ip_pc                 C   rs  r¨  rt  r   r   r   r   rW    rv  zIP.set_ip_pc                 C   rì   )Nra  rí   r"   r   r   r   Ú
get_ip_sum  r   zIP.get_ip_sumc                 C   s   d| _ |  d|¡ d S )Nr   ra  )rÄ   rK   r   r   r   r   r[  !  s   zIP.set_ip_sumc                 C   s   |   d¡ d| _d S )Nr   r   )r[  rÄ   r"   r   r   r   rZ  %  s   

zIP.reset_ip_sumc                 C   rì   ©Nr  ©r_   r"   r   r   r   Ú
get_ip_src)  r   zIP.get_ip_srcc                 C   rs  rª  ©rh   r   r   r   r   Ú
set_ip_src+  rv  zIP.set_ip_srcc                 C   rì   r5  r«  r"   r   r   r   Ú
get_ip_dst.  r   zIP.get_ip_dstc                 C   rs  r5  r­  r   r   r   r   Ú
set_ip_dst1  rv  zIP.set_ip_dstc                 C   s8   d}| j D ]}|| ¡ 7 }qd|d  d }d| | S )Nr   rS   rL  )rR  rg  )r   Úop_lenr^  r_  r   r   r   r™   4  s
   
zIP.get_header_sizec                 C   sì   |   |d d… ¡ |  ¡ d d }t d|dd| … ¡}t|ƒ|kr'tdƒ‚|rt|d }|tjks7|tjkr>t|ƒ}d}n|d }|t|ƒkrLtdƒ‚t||ƒ}| |d |… ¡ ||d … }||8 }|  	|¡ |tjkrpd S |s)d S d S )	NrL  rô   rS   r(   ú)Cannot load options from truncated packetr   r   zIP Option length is too high)
r1   rp  r+   rl   r   ÚIPOptionÚ	IPOPT_EOLÚ	IPOPT_NOPr:   rj  )r   rŸ   Úopt_leftÚ	opt_bytesÚop_typeÚ
new_optionr±  r   r   r   r    =  s*   


ïzIP.load_headerc                 C   s†   d}|   ¡ r
|d7 }|  ¡ r|d7 }|  ¡ r|d7 }d||  ¡ |  ¡ f }| jD ]
}|dt|ƒ 7 }q(|  ¡ rA|dt|  ¡ ƒ 7 }|S )NrÂ   zDF zMF zRF zIP%s%s -> %s rÔ   )r”  r—  r�  r¬  r¯  rR  rá   r„   )r   Úflagsr/  r^  r   r   r   r#   Y  s   
z
IP.__str__r   ),r$   r%   r&   rã   r   r�   rÌ   rj  rm  rO  rp  rP  rr  ru  rX  rY  r�  r‚  r„  r…  rˆ  r‹  r�  r‘  r”  r•  r—  r˜  rŸ  r¥  r§  rQ  rV  rW  r©  r[  rZ  r¬  r®  r¯  r°  r™   r    r#   r   r   r   r   rK    sT    
3			
;	rK  c                   @   s†   e Zd ZdZdZdZdZdZdZd dd	„Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!r³  r   r   rø   éD   éƒ   é‰   Nc                 C   sª  |r|dk s
|dkrt dƒ‚|tjkr!t | d¡ |  tj¡ d S |tjkr4t | d¡ |  tj¡ d S |tjkrU|s=d}t | |¡ |  tj¡ |  |¡ |  	d¡ d S |tj
krv|s^d}t | |¡ |  tj
¡ |  |¡ |  	d¡ d S |tjkr—|sd}t | |¡ |  tj¡ |  |¡ |  	d¡ d S |tjkr½|s d}t | |¡ |  tj¡ |  |¡ |  	d¡ |  d¡ d S |sÃt d	ƒ‚t | |¡ |  |¡ |  |¡ d S )
Nr   rf  z2IP Options must have a size between 3 and 40 bytesr   é'   rS   rô   r   zSize required for this type)r   r³  r´  r'   r   Úset_coderµ  ÚIPOPT_RRÚset_lenÚset_ptrÚ
IPOPT_LSRRÚ
IPOPT_SSRRÚIPOPT_TSÚ	set_flags)r   Úopcoderu   r   r   r   r   q  sT   











zIPOption.__init__c                 C   s�   |   ¡ }|tjks|tjks|tjks|tjkstd| j ƒ‚|  ¡ }|s)tdƒ‚|d |  	¡ kr5tdƒ‚|  
|d |¡ |d7 }|  |¡ d S )Nz*append_ip() not support for option type %dz,append_ip() failed, option ptr uninitializedrS   z!append_ip() would overflow optionr   )Úget_coder³  rÀ  rÃ  rÄ  rÅ  r   Úopt_typeÚget_ptrrg  rh   rÂ  )r   rž  r^  Úpr   r   r   Ú	append_ip£  s   (zIPOption.append_ipc                 C   rs  r¥   rt  r   r   r   r   r¿  ´  rv  zIPOption.set_codec                 C   rì   r¥   rõ   r"   r   r   r   rÈ  ·  r   zIPOption.get_codec                 C   s&   |   ¡ tjkstdƒ‚|  d|¡ d S ©Nz,Operation only supported on Timestamp optionr   )rÈ  r³  rÅ  r   r>   ©r   rº  r   r   r   rÆ  »  ó   zIPOption.set_flagsc                 C   s    |   ¡ tjkstdƒ‚|  d¡S rÍ  )rÈ  r³  rÅ  r   r@   rÎ  r   r   r   Ú	get_flagsÀ  ó   
zIPOption.get_flagsc                 C   rs  rÃ   rt  r?  r   r   r   rÁ  Æ  rv  zIPOption.set_lenc                 C   rs  ©Nr	   rt  )r   Úptrr   r   r   rÂ  Ê  rv  zIPOption.set_ptrc                 C   rì   rÒ  rõ   r"   r   r   r   rÊ  Í  r   zIPOption.get_ptrc                 C   rç   r   rè   r"   r   r   r   rg  Ð  ré   zIPOption.get_lenc                 C   s„   t jdt jdt jdt jdt jdt jdi}d}|  ¡ }||v r%||| 7 }n|d| 7 }|t jks:|t jks:|t jkr@||  ¡ 7 }|S )	NúEnd of List úNo Operation zRecord Route ú
Timestamp zLoose Source Route zStrict Source Route z	IP Option: z	Code: %d )	r³  r´  rµ  rÀ  rÅ  rÃ  rÄ  rÈ  Úprint_addresses©r   Úmapr/  r^  r   r   r   r#   Ô  s   ûzIPOption.__str__c                 C   s„   d}d}|   ¡ dkr.	 |d |  ¡ kr|d7 }||  |¡7 }|d7 }||   ¡ kr)n|d7 }q|d7 }|  ¡ d r@|d	|  ¡  7 }|S )
Nr   ú[rø   r   ú#rS   z, z] znonsense ptr field: %d )rg  rÊ  r_   )r   rË  r/  r   r   r   r×  ê  s    ø	zIPOption.print_addresses)r   N)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   r³  i  s&    
2r³  c                   @   óz   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚUDPé   Nc                 C   r4  r¦  r6  rž   r   r   r   r   ÿ  r7  zUDP.__init__c                 C   rì   r¥   rí   r"   r   r   r   Úget_uh_sport  r   zUDP.get_uh_sportc                 C   rs  r¥   rð   r   r   r   r   Úset_uh_sport  rv  zUDP.set_uh_sportc                 C   rì   rÒ  rí   r"   r   r   r   Úget_uh_dport	  r   zUDP.get_uh_dportc                 C   rs  rÒ  rð   r   r   r   r   Úset_uh_dport  rv  zUDP.set_uh_dportc                 C   rì   r€  rí   r"   r   r   r   Úget_uh_ulen  r   zUDP.get_uh_ulenc                 C   rs  r€  rð   r   r   r   r   Úset_uh_ulen  rv  zUDP.set_uh_ulenc                 C   rì   ©Nr  rí   r"   r   r   r   Ú
get_uh_sum  r   zUDP.get_uh_sumc                 C   ó   |   d|¡ d| _d S )Nr  r   ©rK   rÄ   r   r   r   r   Ú
set_uh_sum  rÅ   zUDP.set_uh_sumc                 C   sd   | j r.|  ¡ s0|  ¡ sd S |  ¡  ¡ }||  ¡ 7 }|  ¡ }|r$t||ƒ |  |  |¡¡ d S d S d S r   )	rÄ   ræ  r…   rÌ   r7   rÆ   rt   ré  ri   )r   Úbufferr0   r   r   r   rÇ     s   
ôzUDP.calculate_checksumc                 C   rÊ   r¦  r   r"   r   r   r   r™   *  ó   zUDP.get_header_sizec                 C   s4   d|   ¡ |  ¡ f }|  ¡ r|dt|  ¡ ƒ 7 }|S )NzUDP %d -> %drÔ   )rß  rá  r„   rá   r.  r   r   r   r#   -  s   zUDP.__str__c                 C   s$   |   ¡ dkr|  |  ¡ ¡ t | ¡S r¥   )rã  rä  rœ   r¼   r�   r"   r   r   r   r�   3  s   
zUDP.get_packetr   )r$   r%   r&   rä   r   rß  rà  rá  râ  rã  rä  ræ  ré  rÇ   r™   r#   r�   r   r   r   r   rÝ  ý  s    
rÝ  c                   @   sÖ  e Zd ZdZdZdtdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dXdY„ Z/dZd[„ Z0d\d]„ Z1d^d_„ Z2d`da„ Z3dbdc„ Z4ddde„ Z5dfdg„ Z6dhdi„ Z7djdk„ Z8dldm„ Z9dndo„ Z:dpdq„ Z;drds„ Z<dS )uÚTCPr  rM  Nc                 C   s2   t  | d¡ |  d¡ g | _|r|  |¡ d S d S )NrL  rô   )r¼   r   Ú
set_th_offÚ_TCP__option_listr    rž   r   r   r   r   <  s   
ÿzTCP.__init__c                 C   s<   | j  |¡ d}| j D ]}|| ¡ 7 }q|dkrtdƒ‚d S )Nr   rf  z2Cannot add TCP option, would overflow option space)rî  rÖ   rœ   r   rh  r   r   r   rj  C  s   
ÿzTCP.add_optionc                 C   r6   r   )rî  r"   r   r   r   Úget_optionsM  r”   zTCP.get_optionsc                 C   s$   |   ¡ }|  |  ¡ ¡ |  |¡ d S r   )Úget_th_sportÚset_th_sportÚget_th_dportÚset_th_dport)r   Ú	oldSourcer   r   r   ÚswapSourceAndDestinationP  s   zTCP.swapSourceAndDestinationc                 C   rs  r¥   rð   r  r   r   r   rñ  Y  rv  zTCP.set_th_sportc                 C   rì   r¥   rí   r"   r   r   r   rð  \  r   zTCP.get_th_sportc                 C   rì   rÒ  rí   r"   r   r   r   rò  _  r   zTCP.get_th_dportc                 C   rs  rÒ  rð   r  r   r   r   ró  b  rv  zTCP.set_th_dportc                 C   rì   r€  ©rW   r"   r   r   r   Ú
get_th_seqe  r   zTCP.get_th_seqc                 C   rs  r€  ©rV   r  r   r   r   Ú
set_th_seqh  rv  zTCP.set_th_seqc                 C   rì   r¦  rö  r"   r   r   r   Ú
get_th_ackk  r   zTCP.get_th_ackc                 C   rs  r¦  rø  r  r   r   r   Ú
set_th_ackn  rv  zTCP.set_th_ackc                 C   s   |   d¡| j@ S rª  )rQ   ÚTCP_FLAGS_MASKr"   r   r   r   Úget_th_flagsq  rv  zTCP.get_th_flagsc                 C   s.   |   d¡| j @ }||| j@ B }|  d|d¡S )Nr  ú>)rQ   rü  rK   )r   rs   ÚmaskedÚnbr   r   r   Úset_th_flagst  s   zTCP.set_th_flagsc                 C   rì   ©Nr  rí   r"   r   r   r   Ú
get_th_winy  r   zTCP.get_th_winc                 C   rs  r  rð   r  r   r   r   Ú
set_th_win|  rv  zTCP.set_th_winc                 C   rç  )Nrr   r   rè  r  r   r   r   Ú
set_th_sum  rÅ   zTCP.set_th_sumc                 C   rì   r5  rí   r"   r   r   r   Ú
get_th_sumƒ  r   zTCP.get_th_sumc                 C   rì   ©Né   rí   r"   r   r   r   Ú
get_th_urp†  r   zTCP.get_th_urpc                 C   rï   r  rð   r  r   r   r   Ú
set_th_urp‰  ré   zTCP.set_th_urpc                 C   s   |   d¡d@ }|S )Nr  r&  rõ   rÈ   r   r   r   Úget_th_reservedŽ  ó   zTCP.get_th_reservedc                 C   s   |   d¡d? }|S )Nr  rS   rõ   rÈ   r   r   r   Ú
get_th_off“  r  zTCP.get_th_offc                 C   s0   d}|   d¡| @ }||d> |@ B }|  d|¡S )Nrq  r  rS   rù   )r   rs   Úmaskrÿ  r   r   r   r   rí  —  s   zTCP.set_th_offc                 C   rì   ©Né€   ©Úget_flagr"   r   r   r   Úget_CWR�  r   zTCP.get_CWRc                 C   rì   r  ©rÆ  r"   r   r   r   Úset_CWRŸ  r   zTCP.set_CWRc                 C   rì   r  ©Úreset_flagsr"   r   r   r   Ú	reset_CWR¡  r   zTCP.reset_CWRc                 C   rì   ©Né@   r  r"   r   r   r   Úget_ECE¤  r   zTCP.get_ECEc                 C   rì   r  r  r"   r   r   r   Úset_ECE¦  r   zTCP.set_ECEc                 C   rì   r  r  r"   r   r   r   Ú	reset_ECE¨  r   zTCP.reset_ECEc                 C   rì   ©Né    r  r"   r   r   r   Úget_URG«  r   zTCP.get_URGc                 C   rì   r  r  r"   r   r   r   Úset_URG­  r   zTCP.set_URGc                 C   rì   r  r  r"   r   r   r   Ú	reset_URG¯  r   zTCP.reset_URGc                 C   rì   r5  r  r"   r   r   r   Úget_ACK²  r   zTCP.get_ACKc                 C   rì   r5  r  r"   r   r   r   Úset_ACK´  r   zTCP.set_ACKc                 C   rì   r5  r  r"   r   r   r   Ú	reset_ACK¶  r   zTCP.reset_ACKc                 C   rì   r¦  r  r"   r   r   r   Úget_PSH¹  r   zTCP.get_PSHc                 C   rì   r¦  r  r"   r   r   r   Úset_PSH»  r   zTCP.set_PSHc                 C   rì   r¦  r  r"   r   r   r   Ú	reset_PSH½  r   zTCP.reset_PSHc                 C   rì   r€  r  r"   r   r   r   Úget_RSTÀ  r   zTCP.get_RSTc                 C   rì   r€  r  r"   r   r   r   Úset_RSTÂ  r   zTCP.set_RSTc                 C   rì   r€  r  r"   r   r   r   Ú	reset_RSTÄ  r   zTCP.reset_RSTc                 C   rì   rÒ  r  r"   r   r   r   Úget_SYNÇ  r   zTCP.get_SYNc                 C   rì   rÒ  r  r"   r   r   r   Úset_SYNÉ  r   zTCP.set_SYNc                 C   rì   rÒ  r  r"   r   r   r   Ú	reset_SYNË  r   zTCP.reset_SYNc                 C   rì   rÃ   r  r"   r   r   r   Úget_FINÎ  r   zTCP.get_FINc                 C   rì   rÃ   r  r"   r   r   r   Úset_FINÐ  r   zTCP.set_FINc                 C   rì   rÃ   r  r"   r   r   r   Ú	reset_FINÒ  r   zTCP.reset_FINc                 C   s   dt |  ¡ ƒ S )NrL  )rl   Úget_padded_optionsr"   r   r   r   r™   ×  rv  zTCP.get_header_sizec                 C   st   | j r|  ¡ s	d S |  d¡ |  ¡  ¡ }||  ¡ 7 }||  ¡ 7 }|  ¡ }|r+t||ƒ |  |¡}|  |  |¡¡ d S r¥   )	rÄ   r…   r  rÌ   r7   r2  rÆ   rt   ri   )r   rê  r0   Úresr   r   r   rÇ   Ú  s   


zTCP.calculate_checksumc                 C   sT   t | jƒr|  |  ¡ d ¡ |  ¡  |  ¡ |  ¡  }|  ¡ }|r&t|ƒ| S t|ƒS )znReturns entire packet including child data as a string.  This is the function used to extract the final packetrS   )	rl   rî  rí  r™   rÇ   r7   r2  rÆ   r3   )r   r   r0   r   r   r   r�   ë  s   
zTCP.get_packetc                 C   sú   |   |d d… ¡ |  ¡ d d }t d|dd| … ¡}t|ƒ|kr'tdƒ‚|r{|d }|tjks7|tjkr>t|ƒ}d}n#|d }|t|ƒkrLtdƒ‚|d	k rTtd
ƒ‚t|ƒ}| |d |… ¡ ||d … }||8 }|  	|¡ |tjkrwd S |s)d S d S )NrL  rô   rS   r(   r²  r   r   zTCP Option length is too highr	   zTCP Option length is too low)
r1   r  r+   rl   r   Ú	TCPOptionÚ
TCPOPT_EOLÚ
TCPOPT_NOPr:   rj  )r   rŸ   r¶  r·  Úop_kindr¹  r±  r   r   r   r    ü  s.   

ízTCP.load_headerc                 C   s   |   ¡ |@ rdS dS r   )rý  )r   Úbitr   r   r   r    s   zTCP.get_flagc                 C   s   |   ¡ | @ }|  |¡S r   ©rý  r  rŠ  r   r   r   r  "  s   
zTCP.reset_flagsc                 C   s   |   ¡ |B }|  |¡S r   r9  rŠ  r   r   r   rÆ  &  rÅ   zTCP.set_flagsc                 C   sL   t   d¡}| jD ]}|| ¡ 7 }qdt|ƒd  d }|r$t|d| ƒ |S )zBReturn an array containing all options padded to a 4 byte boundaryr(   rS   r)   )r+   rî  r7   rl   rt   )r   Úop_bufr^  r_  r   r   r   r2  *  s   

zTCP.get_padded_optionsc                 C   sØ   d}|   ¡ r
|d7 }|  ¡ r|d7 }|  ¡ r|d7 }|  ¡ r"|d7 }|  ¡ r*|d7 }|  ¡ r2|d7 }|  ¡ r:|d7 }|  ¡ rB|d	7 }|d
|  ¡ |  	¡ f 7 }| j
D ]
}|dt|ƒ 7 }qQ|  ¡ rj|dt|  ¡ ƒ 7 }|S )NzTCP zece zcwr zack zfin zpush zrst zsyn zurg z%d -> %drÔ   )r  r  r#  r/  r&  r)  r,  r   rð  rò  rî  rá   r„   )r   r/  r^  r   r   r   r#   4  s.   
zTCP.__str__r   )=r$   r%   r&   rä   rü  r   rj  rï  rõ  rñ  rð  rò  ró  r÷  rù  rú  rû  rý  r  r  r  r  r  r	  r
  r  r  rí  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r™   rÇ   r�   r    r  r  rÆ  r2  r#   r   r   r   r   rì  9  sv    

	 
rì  c                   @   s¶   e Zd ZdZdZdZdZdZdZdZ	dZ
d,d
d„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd	S )-r4  r   r   r	   r   rS   rô   rX   é   Nc                 C   sŠ  |t jkrt | d¡ |  t j¡ d S |t jkr&t | d¡ |  t j¡ d S |t jkrLt | d¡ |  t j¡ |  d¡ |rE|  |¡ d S |  d¡ d S |t j	krrt | d¡ |  t j	¡ |  d¡ |rk|  
|¡ d S |  
d¡ d S |t jkr˜t | d¡ |  t j¡ |  d¡ |r‘|  |¡ d S |  d¡ d S |t jkr°t | d¡ |  t j¡ |  d¡ d S |t jkrÃt | d¡ |  t j¡ d S d S )Nr   rS   i   r   r   ra  r	   )r4  r5  r'   r   Úset_kindr6  ÚTCPOPT_MAXSEGrÁ  Úset_mssÚTCPOPT_WINDOWÚset_shift_cntÚTCPOPT_TIMESTAMPÚset_tsÚTCPOPT_SACK_PERMITTEDÚTCPOPT_SACK)r   Úkindr0   r   r   r   r   Z  sF   









þzTCPOption.__init__c                 C   rs  rÒ  rø  r  r   r   r   Úset_left_edgeƒ  rv  zTCPOption.set_left_edgec                 C   rs  rå  rø  r  r   r   r   Úset_right_edge†  rv  zTCPOption.set_right_edgec                 C   rs  r¥   rt  )r   rE  r   r   r   r<  ‰  rv  zTCPOption.set_kindc                 C   rì   r¥   rõ   r"   r   r   r   Úget_kind�  r   zTCPOption.get_kindc                 C   s$   |   ¡ dk r
tdƒ‚|  d|¡ d S )Nr	   zGCannot set length field on an option having a size smaller than 2 bytesr   )rœ   r   r>   r?  r   r   r   rÁ  ‘  s   zTCPOption.set_lenc                 C   s   |   ¡ dk r
tdƒ‚|  d¡S )Nr	   zNCannot retrieve length field from an option having a size smaller than 2 bytesr   )rœ   r   r@   r"   r   r   r   rg  –  s   
zTCPOption.get_lenc                 C   rç   r   rè   r"   r   r   r   rœ   ›  ré   zTCPOption.get_sizec                 C   ó&   |   ¡ tjkrtdƒ‚|  d|¡ d S )Nz(Can only set MSS on TCPOPT_MAXSEG optionr	   )rH  r4  r=  r   rK   r?  r   r   r   r>  Ÿ  rÏ  zTCPOption.set_mssc                 C   ó    |   ¡ tjkrtdƒ‚|  d¡S )Nz/Can only retrieve MSS from TCPOPT_MAXSEG optionr	   )rH  r4  r=  r   rQ   r"   r   r   r   Úget_mss¤  rÑ  zTCPOption.get_mssc                 C   rI  )Nz0Can only set Shift Count on TCPOPT_WINDOW optionr	   )rH  r4  r?  r   r>   )r   Úcntr   r   r   r@  ©  rÏ  zTCPOption.set_shift_cntc                 C   rJ  )Nz7Can only retrieve Shift Count from TCPOPT_WINDOW optionr	   )rH  r4  r?  r   r@   r"   r   r   r   Úget_shift_cnt®  rÑ  zTCPOption.get_shift_cntc                 C   rJ  )Nú8Can only retrieve timestamp from TCPOPT_TIMESTAMP optionr	   ©rH  r4  rA  r   rW   r"   r   r   r   Úget_ts³  rÑ  zTCPOption.get_tsc                 C   rI  )Nú1Can only set timestamp on TCPOPT_TIMESTAMP optionr	   ©rH  r4  rA  r   rV   ©r   Útsr   r   r   rB  ¸  rÏ  zTCPOption.set_tsc                 C   rJ  )NrN  r  rO  r"   r   r   r   Úget_ts_echo½  rÑ  zTCPOption.get_ts_echoc                 C   rI  )NrQ  r  rR  rS  r   r   r   Úset_ts_echoÂ  rÏ  zTCPOption.set_ts_echoc              
   C   sœ   t jdt jdt jdt jdt jdi}d}|  ¡ }||v r"||| 7 }n|d| 7 }|t jkr7|d|  ¡  7 }|S |t jkrF|d	|  ¡  7 }|S |t jkrL	 |S )
NrÔ  rÕ  zMaximum Segment Size zWindow Scale rÖ  z	TCP Option: z
 kind: %d z
 MSS : %d z Shift Count: %d )	r4  r5  r6  r=  r?  rA  rH  rK  rM  rØ  r   r   r   r#   Ç  s(   ü

ü
þzTCPOption.__str__r   )r$   r%   r&   r5  r6  r=  r?  rC  rD  rA  ÚTCPOPT_SIGNATUREr   rF  rG  r<  rH  rÁ  rg  rœ   r>  rK  r@  rM  rP  rB  rU  rV  r#   r   r   r   r   r4  O  s4    
)r4  c                   @   s  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Z#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dkdd„Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dd „ Z2d!d"„ Z3d#d$„ Z4d%d&„ Z5d'd(„ Z6d)d*„ Z7d+d,„ Z8d-d.„ Z9d/d0„ Z:d1d2„ Z;d3d4„ Z<d5d6„ Z=d7d8„ Z>d9d:„ Z?d;d<„ Z@d=d>„ ZAd?d@„ ZBdAdB„ ZCdCdD„ ZDdEdF„ ZEdGdH„ ZFdIdJ„ ZGdKdL„ ZHdMdN„ ZIdOdP„ ZJdQdR„ ZKdSdT„ ZLdUdV„ ZMdWdX„ ZNdYdZ„ ZOd[d\„ ZPd]d^„ ZQd_d`„ ZRdadb„ ZSdcdd„ ZTdedf„ ZUdgdh„ ZVdidj„ ZWdS )lÚICMPr   r   r   r	   rS   rô   r  rø   rX   r`  ra  é   r  é   r  r&  rr   rÞ  r  Nc                 C   r4  r¦  r6  rž   r   r   r   r     r7  zICMP.__init__c                 C   s8   t jdt jdt jdt jdi}|  ¡ |v r||  ¡  S dS )NrL  r  rX   )rX  ÚICMP_TSTAMPÚICMP_TSTAMPREPLYÚICMP_MASKREQÚICMP_MASKREPLYÚget_icmp_type)r   Ú	anamoliesr   r   r   r™     s   zICMP.get_header_sizec                 C   rì   r¥   rõ   r"   r   r   r   r_    r   zICMP.get_icmp_typec                 C   rs  r¥   rt  r  r   r   r   Úset_icmp_type  rv  zICMP.set_icmp_typec                 C   rì   rÃ   rõ   r"   r   r   r   Úget_icmp_code  r   zICMP.get_icmp_codec                 C   rs  rÃ   rt  r  r   r   r   Úset_icmp_code  rv  zICMP.set_icmp_codec                 C   rì   rÒ  rí   r"   r   r   r   Úget_icmp_cksum   r   zICMP.get_icmp_cksumc                 C   rç  )Nr	   r   rè  r  r   r   r   Úset_icmp_cksum#  rÅ   zICMP.set_icmp_cksumc                 C   rì   r€  r«  r"   r   r   r   Úget_icmp_gwaddr'  r   zICMP.get_icmp_gwaddrc                 C   rs  r€  r­  )r   rž  r   r   r   Úset_icmp_gwaddr*  rv  zICMP.set_icmp_gwaddrc                 C   rì   r€  rí   r"   r   r   r   Úget_icmp_id-  r   zICMP.get_icmp_idc                 C   rs  r€  rð   r  r   r   r   Úset_icmp_id0  rv  zICMP.set_icmp_idc                 C   rì   rå  rí   r"   r   r   r   Úget_icmp_seq3  r   zICMP.get_icmp_seqc                 C   rs  rå  rð   r  r   r   r   Úset_icmp_seq6  rv  zICMP.set_icmp_seqc                 C   rì   r€  rö  r"   r   r   r   Úget_icmp_void9  r   zICMP.get_icmp_voidc                 C   rs  r€  rø  r  r   r   r   Úset_icmp_void<  rv  zICMP.set_icmp_voidc                 C   rì   rå  rí   r"   r   r   r   Úget_icmp_nextmtu@  r   zICMP.get_icmp_nextmtuc                 C   rs  rå  rð   r  r   r   r   Úset_icmp_nextmtuC  rv  zICMP.set_icmp_nextmtuc                 C   rì   r€  rõ   r"   r   r   r   Úget_icmp_num_addrsF  r   zICMP.get_icmp_num_addrsc                 C   rs  r€  rt  r  r   r   r   Úset_icmp_num_addrsI  rv  zICMP.set_icmp_num_addrsc                 C   rì   ©Nrô   rõ   r"   r   r   r   Úget_icmp_wpaL  r   zICMP.get_icmp_wpac                 C   rs  rr  rt  r  r   r   r   Úset_icmp_wpaO  rv  zICMP.set_icmp_wpac                 C   rì   rå  rí   r"   r   r   r   Úget_icmp_lifetimeR  r   zICMP.get_icmp_lifetimec                 C   rs  rå  rð   r  r   r   r   Úset_icmp_lifetimeU  rv  zICMP.set_icmp_lifetimec                 C   rì   r¦  rö  r"   r   r   r   Úget_icmp_otimeX  r   zICMP.get_icmp_otimec                 C   rs  r¦  rø  r  r   r   r   Úset_icmp_otime[  rv  zICMP.set_icmp_otimec                 C   rì   rª  rö  r"   r   r   r   Úget_icmp_rtime^  r   zICMP.get_icmp_rtimec                 C   rs  rª  rø  r  r   r   r   Úset_icmp_rtimea  rv  zICMP.set_icmp_rtimec                 C   rì   r5  rö  r"   r   r   r   Úget_icmp_ttimed  r   zICMP.get_icmp_ttimec                 C   rs  r5  rø  r  r   r   r   Úset_icmp_ttimeg  rv  zICMP.set_icmp_ttimec                 C   rì   r¦  r«  r"   r   r   r   Úget_icmp_maskj  r   zICMP.get_icmp_maskc                 C   rs  r¦  r­  )r   r  r   r   r   Úset_icmp_maskm  rv  zICMP.set_icmp_maskc                 C   sR   | j r%|  ¡ s'|  ¡ }|  ¡ }|r||7 }t d|¡}|  |  |¡¡ d S d S d S )Nr(   )rÄ   rd  r4   rÆ   r+   re  ri   )r   rê  r0   Ú	tmp_arrayr   r   r   rÇ   q  s   ùzICMP.calculate_checksumc              
   C   s�   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#d$d%d&d'd(d)d*d+œ¥}|  |d,¡}|S )-Nr   Ú	ECHOREPLYr   ÚUNREACHrS   ÚSOURCEQUENCHrô   ÚREDIRECTr  ÚALTHOSTADDRrX   ÚECHOr`  ÚROUTERADVERTra  ÚROUTERSOLICITrY  ÚTIMXCEEDr  Ú	PARAMPROBrZ  ÚTSTAMPr  ÚTSTAMPREPLYr&  ÚIREQrr   Ú	IREQREPLYrÞ  ÚMASKREQr  Ú	MASKREPLYé   Ú
TRACEROUTEÚDATACONVERRzMOBILE REDIRECTzIPV6 WHEREAREYOUzIPV6 IAMHEREzMOBILE REGREQUESTzMOBILE REGREPLYÚSKIPÚPHOTURIS)r÷   r  é!   é"   é#   é$   r¾  rf  ÚUNKNOWN©Úget)r   ÚaTypeÚtmp_typeÚanswerr   r   r   Úget_type_name{  s   €zICMP.get_type_namec                 C   s€   dg d¢i}g d¢|d< g d¢|d< ddg|d	< g d
¢|d< g d¢|d< ||v r>|| }|d t |ƒks8|| s:dS || S dS )Nr   )zUNREACH NETzUNREACH HOSTzUNREACH PROTOCOLzUNREACH PORTzUNREACH NEEDFRAGzUNREACH SRCFAILzUNREACH NET UNKNOWNzUNREACH HOST UNKNOWNzUNREACH ISOLATEDzUNREACH NET PROHIBzUNREACH HOST PROHIBzUNREACH TOSNETzUNREACH TOSHOSTzUNREACH FILTER PROHIBzUNREACH HOST PRECEDENCEzUNREACH PRECEDENCE CUTOFFzUNKNOWN ICMP UNREACH)zREDIRECT NETzREDIRECT HOSTzREDIRECT TOSNETzREDIRECT TOSHOSTrô   )zROUTERADVERT NORMALNNNNNNNNNNNNNNNzROUTERADVERT NOROUTE COMMONr`  zTIMXCEED INTRANS zTIMXCEED REASSrY  )zPARAMPROB ERRATPTR zPARAMPROB OPTABSENTzPARAMPROB LENGTHr  )NzPHOTURIS UNKNOWN INDEXzPHOTURIS AUTH FAILEDzPHOTURIS DECRYPT FAILEDrf  r   r™  )rl   )r   rœ  ÚaCodeÚtmp_coder+  r   r   r   Úget_code_name€  s   zICMP.get_code_namec                 C   sR   |   ¡ }|  ¡ }d|  |¡ }|d|  ||¡ 7 }|  ¡ r'|dt|  ¡ ƒ 7 }|S )NzICMP type: z code: rÔ   )r_  rb  rŸ  r¢  r„   rá   )r   r�  r¡  r/  r   r   r   r#   �  s   zICMP.__str__c                 C   s   |   ¡ dkS ©Nr   ©r_  r"   r   r   r   ÚisDestinationUnreachable™  ré   zICMP.isDestinationUnreachablec                 C   s
   |   ¡  S r   )ÚisQueryr"   r   r   r   ÚisErrorœ  r   zICMP.isErrorc                 C   ó   |   ¡ o	|  ¡ dkS rÃ   ©r¥  rb  r"   r   r   r   ÚisHostUnreachableŸ  ó   zICMP.isHostUnreachablec                 C   r¨  r¥   r©  r"   r   r   r   ÚisNetUnreachable¢  r«  zICMP.isNetUnreachablec                 C   r¨  r£  r©  r"   r   r   r   ÚisPortUnreachable¥  r«  zICMP.isPortUnreachablec                 C   r¨  rÒ  r©  r"   r   r   r   ÚisProtocolUnreachable¨  r«  zICMP.isProtocolUnreachablec              
   C   s$   ddddddddddœ	}|   ¡ |v S )NrÓ   )	rX   r`  ra  rZ  r  r&  rr   rÞ  r  r¤  )r   Útmp_dictr   r   r   r¦  «  s   zICMP.isQueryr   )Xr$   r%   r&   rä   ÚICMP_ECHOREPLYÚICMP_UNREACHÚICMP_UNREACH_NETÚICMP_UNREACH_HOSTÚICMP_UNREACH_PROTOCOLÚICMP_UNREACH_PORTÚICMP_UNREACH_NEEDFRAGÚICMP_UNREACH_SRCFAILÚICMP_UNREACH_NET_UNKNOWNÚICMP_UNREACH_HOST_UNKNOWNÚICMP_UNREACH_ISOLATEDÚICMP_UNREACH_NET_PROHIBÚICMP_UNREACH_HOST_PROHIBÚICMP_UNREACH_TOSNETÚICMP_UNREACH_TOSHOSTÚICMP_UNREACH_FILTERPROHIBÚICMP_UNREACH_HOST_PRECEDENCEÚICMP_UNREACH_PRECEDENCE_CUTOFFÚICMP_SOURCEQUENCHÚICMP_REDIRECTÚICMP_REDIRECT_NETÚICMP_REDIRECT_HOSTÚICMP_REDIRECT_TOSNETÚICMP_REDIRECT_TOSHOSTÚICMP_ALTHOSTADDRÚ	ICMP_ECHOÚICMP_ROUTERADVERTÚICMP_ROUTERSOLICITÚICMP_TIMXCEEDÚICMP_TIMXCEED_INTRANSÚICMP_TIMXCEED_REASSÚICMP_PARAMPROBÚICMP_PARAMPROB_ERRATPTRÚICMP_PARAMPROB_OPTABSENTÚICMP_PARAMPROB_LENGTHr[  r\  Ú	ICMP_IREQÚICMP_IREQREPLYr]  r^  r   r™   r_  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  rÇ   rŸ  r¢  r#   r¥  r§  rª  r¬  r­  r®  r¦  r   r   r   r   rX  Ü  s¬    

	rX  c                   @   rÜ  )ÚIGMPr	   Nc                 C   r4  r¦  r6  rž   r   r   r   r   ±  r7  zIGMP.__init__c                 C   rì   r¥   rõ   r"   r   r   r   Úget_igmp_type¶  r   zIGMP.get_igmp_typec                 C   rs  r¥   rt  r  r   r   r   Úset_igmp_type¹  rv  zIGMP.set_igmp_typec                 C   rì   rÃ   rõ   r"   r   r   r   Úget_igmp_code¼  r   zIGMP.get_igmp_codec                 C   rs  rÃ   rt  r  r   r   r   Úset_igmp_code¿  rv  zIGMP.set_igmp_codec                 C   rì   rÒ  rí   r"   r   r   r   Úget_igmp_cksumÂ  r   zIGMP.get_igmp_cksumc                 C   rs  rÒ  rð   r  r   r   r   Úset_igmp_cksumÅ  rv  zIGMP.set_igmp_cksumc                 C   rì   r€  rö  r"   r   r   r   Úget_igmp_groupÈ  r   zIGMP.get_igmp_groupc                 C   rs  r€  rø  r  r   r   r   Úset_igmp_groupË  rv  zIGMP.set_igmp_groupc                 C   rÊ   r¦  r   r"   r   r   r   r™   Î  rë  zIGMP.get_header_sizec              	   C   s&   ddddddddd	œ}|  |d
¡}|S )NzHOST MEMBERSHIP QUERY zv1 HOST MEMBERSHIP REPORT zIGMP DVMRP z PIM zv2 HOST MEMBERSHIP REPORT zHOST LEAVE MESSAGE zMTRACE REPLY zMTRACE QUERY )rÞ  r  r;  rL  é   é   r�  r÷   zUNKNOWN TYPE OR VERSION rš  )r   rœ  r¯  rž  r   r   r   rŸ  Ñ  s   zIGMP.get_type_namec                 C   s.   | j r|  ¡ s|  |  |  ¡ ¡¡ d S d S d S r   )rÄ   rÚ  rÛ  ri   r7   r"   r   r   r   rÇ   Ö  s   ÿzIGMP.calculate_checksumc              	   C   sP   d|   |  ¡ ¡ }|dt t d|  ¡ ¡¡ 7 }|  ¡ r&|dt|  ¡ ƒ 7 }|S )NzIGMP: zGroup: z!LrÔ   )	rŸ  rÖ  r]   r^   rF   rG   rÜ  r„   rá   r.  r   r   r   r#   Ú  s
   zIGMP.__str__r   )r$   r%   r&   rä   r   rÖ  r×  rØ  rÙ  rÚ  rÛ  rÜ  rÝ  r™   rŸ  rÇ   r#   r   r   r   r   rÕ  ¯  s    
rÕ  c                   @   sÚ   e Zd ZdZd5dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ ZdS )6ÚARPi  Nc                 C   r4  )Nrø   r6  rž   r   r   r   r   å  r7  zARP.__init__c                 C   rì   r¥   rí   r"   r   r   r   Ú
get_ar_hrdê  r   zARP.get_ar_hrdc                 C   rs  r¥   rð   r  r   r   r   Ú
set_ar_hrdí  rv  zARP.set_ar_hrdc                 C   rì   rÒ  rí   r"   r   r   r   Ú
get_ar_proð  r   zARP.get_ar_proc                 C   rs  rÒ  rð   r  r   r   r   Ú
set_ar_proó  rv  zARP.set_ar_proc                 C   rì   r€  rõ   r"   r   r   r   Ú
get_ar_hlnö  r   zARP.get_ar_hlnc                 C   rs  r€  rt  r  r   r   r   Ú
set_ar_hlnù  rv  zARP.set_ar_hlnc                 C   rì   rr  rõ   r"   r   r   r   Ú
get_ar_plnü  r   zARP.get_ar_plnc                 C   rs  rr  rt  r  r   r   r   Ú
set_ar_plnÿ  rv  zARP.set_ar_plnc                 C   rì   rå  rí   r"   r   r   r   Ú	get_ar_op  r   zARP.get_ar_opc                 C   rs  rå  rð   r  r   r   r   Ú	set_ar_op  rv  zARP.set_ar_opc                 C   s    |   ¡ }|  ¡  ¡ dd| … S r¦  )rå  r7   r9   ©r   rd  r   r   r   Ú
get_ar_sha  s   zARP.get_ar_shac                 C   s,   t d|  ¡ ƒD ]}|  |d || ¡ qd S ©Nr   rX   )rÍ   rå  r>   r"  r   r   r   Ú
set_ar_sha  s   ÿzARP.set_ar_shac                 C   s0   |   ¡ }|  ¡  ¡ d|  ¡  d|  ¡  | … S r¦  )rç  r7   r9   rå  rë  r   r   r   Ú
get_ar_spa  s   (zARP.get_ar_spac                 C   s4   t d|  ¡ ƒD ]}|  |d |  ¡  || ¡ qd S rí  )rÍ   rç  r>   rå  r"  r   r   r   Ú
set_ar_spa  s   ÿzARP.set_ar_spac                 C   s4   |   ¡ }d|   ¡  |  ¡  }|  ¡  ¡ ||| … S r¦  )rå  rç  r7   r9   ©r   rd  Útmp_fromr   r   r   Ú
get_ar_tha  s   zARP.get_ar_thac                 C   s@   d|   ¡  |  ¡  }td|   ¡ ƒD ]}|  || || ¡ qd S )NrX   r   ©rå  rç  rÍ   r>   ©r   rs   rò  rÏ   r   r   r   Ú
set_ar_tha  s   ÿzARP.set_ar_thac                 C   s8   |   ¡ }dd|  ¡   |   ¡  }|  ¡  ¡ ||| … S ©NrX   r	   )rç  rå  r7   r9   rñ  r   r   r   Ú
get_ar_tpa"  s   zARP.get_ar_tpac                 C   sD   dd|   ¡   |  ¡  }td|  ¡ ƒD ]}|  || || ¡ qd S )NrX   r	   r   rô  rõ  r   r   r   Ú
set_ar_tpa'  s   ÿzARP.set_ar_tpac                 C   s   dd|   ¡   d|  ¡   S r÷  )rå  rç  r"   r   r   r   r™   ,  s   zARP.get_header_sizec                 C   s"   dddddddœ}|  |d¡}|S )	NÚREQUESTÚREPLYÚ
REVREQUESTÚREVREPLYÚ
INVREQUESTÚINVREPLY)r   r	   r   rS   rX   r`  r™  rš  )r   Úar_opr¯  rž  r   r   r   Úget_op_name/  s   zARP.get_op_namec                 C   s   ddddœ}|  |d¡}|S )NzARPHRD ETHERzARPHRD IEEE802zARPHRD FRELAY)r   r  r&  r™  rš  )r   Úar_hrdr¯  rž  r   r   r   Úget_hrd_name4  s   zARP.get_hrd_namec                 C   ó<   |sdS d|d  }t dt|ƒƒD ]
}|d||  7 }q|S )NrÓ   r'  r   r   z:%x©rÍ   rl   ©r   rn   r/  rÏ   r   r   r   Úas_hrd:  ó   z
ARP.as_hrdc                 C   r  )NrÓ   z%dr   r   z.%dr  r  r   r   r   Úas_proB  r  z
ARP.as_proc                 C   s¨   |   ¡ }d|  |  ¡ ¡ d }|d|  |¡ 7 }|d|  |  ¡ ¡ d 7 }||  |  ¡ ¡7 }|d|  |  ¡ ¡ d 7 }||  |  	¡ ¡7 }|  
¡ rR|dt|  
¡ ƒ 7 }|S )NzARP format: rÂ   zopcode: rÔ   r-  )ré  r  rá  r  r  rì  ró  r	  rï  rø  r„   rá   )r   Útmp_opr/  r   r   r   r#   J  s   zARP.__str__r   )r$   r%   r&   rã   r   rá  râ  rã  rä  rå  ræ  rç  rè  ré  rê  rì  rî  rï  rð  ró  rö  rø  rù  r™   r  r  r  r	  r#   r   r   r   r   rà  ã  s6    
rà  c                  C   sˆ   t ƒ } tƒ }tdƒ}| d¡ | d¡ |  |¡ | |¡ | d¡ | d¡ | d¡ | 	d¡ |  
d¡ |  d	¡ td
|  ƒ d S )NzHola loco!!!r  rS   r	   r   )éÀ   é¨   rÞ  r  )r  r  éB   é«   )r   ró   é}   éŠ   rþ   é=   )r   r  éß   r  rô   r  zbeto %s)r  rà  rå   ræ  rè  r€   rê  râ  rð  rù  r%  r#  Úprint)ÚaÚbrÀ   r   r   r   ÚexampleV  s   









r  )#Ú
__future__r   r   r+   rF   r]   r½   rS  Úbinasciir   Ú	functoolsr   Úversion_infor3   rt   Ú	Exceptionr   Úobjectr'   r{   r‡   r¼   rå   rê   r  r3  rK  r³  rÝ  rì  r4  rX  rÕ  rà  r  r   r   r   r   Ú<module>   sT   

 % h>xT  c <    T4s