a
    kÄ#d¥˜  ã                   @   s®  d Z ddlZddlZddlmZmZmZ ddlm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mZmZmZmZmZmZ ddlmZ ddlm Z m!Z!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,m-Z- ddl	m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ded< dZ4G dd„ de ƒZ5G dd„ de
ƒZ6G dd„ de
ƒZ7G dd„ de
ƒZ8dd„ Z9G dd„ de
ƒZ:G d d!„ d!e
ƒZ;G d"d#„ d#e
ƒZ<G d$d%„ d%e
ƒZ=d&Z>dZ?dZ@d'd(„ ZAd)d*„ ZBdKd,d-„ZCG d.d/„ d/e
ƒZDG d0d1„ d1e
ƒZEG d2d3„ d3eEƒZFd4d5d6d7d8d9d:œZGG d;d<„ d<eEƒZHG d=d>„ d>e
ƒZIG d?d@„ d@e
ƒZJG dAdB„ dBe
ƒZKdCZLdLdEdF„ZMdGdH„ ZNee:e!ƒ eeDeIdDdI� ee;eKƒ ee7eKƒ ee=eKƒ ee'eKddJ� dS )Maç  
6LoWPAN Protocol Stack
======================

This implementation follows the next documents:

- Transmission of IPv6 Packets over IEEE 802.15.4 Networks: RFC 4944
- Compression Format for IPv6 Datagrams in Low Power and Lossy
  networks (6LoWPAN): RFC 6282
- RFC 4291

+----------------------------+-----------------------+
|  Application               | Application Protocols |
+----------------------------+------------+----------+
|  Transport                 |   UDP      |   TCP    |
+----------------------------+------------+----------+
|  Network                   |          IPv6         |
+----------------------------+-----------------------+
|                            |         LoWPAN        |
+----------------------------+-----------------------+
|  Data Link Layer           |   IEEE 802.15.4 MAC   |
+----------------------------+-----------------------+
|  Physical                  |   IEEE 802.15.4 PHY   |
+----------------------------+-----------------------+

Note that:

 - Only IPv6 is supported
 - LoWPAN is in the middle between network and data link layer

The Internet Control Message protocol v6 (ICMPv6) is used for control
messaging.

Adaptation between full IPv6 and the LoWPAN format is performed by routers at
the edge of 6LoWPAN islands.

A LoWPAN support addressing; a direct mapping between the link-layer address
and the IPv6 address is used for achieving compression.

Known Issues:
    * Unimplemented context information
    * Unimplemented IPv6 extensions fields
é    N)ÚchbÚorbÚraw)ÚETHER_TYPES)ÚPacketÚbind_layersÚbind_top_down)ÚBitEnumFieldÚBitFieldÚBitFixedLenFieldÚBitScalingFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚFieldLenFieldÚMultipleTypeFieldÚPacketFieldÚPacketListFieldÚStrFixedLenFieldÚ	XBitFieldÚ
XLongFieldÚXShortField)ÚDot15d4Data)ÚIP6FieldÚIPv6Ú_IPv6ExtHdrÚipv6nh)ÚUDP)ÚEther)Úmac2str)Úconf)Úwarning)ÚRaw)Ú	inet_ptonÚ	inet_ntop)Ú	RandShortZ6LoWPANií   s   þ€              c                   @   s,   e Zd ZdgZd	dd„Zdd„ Zdd„ ZdS )
ÚIP6FieldLenFieldÚ	length_ofNc                 C   s   t  | ||¡ || _d S ©N)r   Ú__init__r'   )ÚselfÚnameÚdefaultr'   © r-   úM/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/sixlowpan.pyr)   k   s    zIP6FieldLenField.__init__c                 C   s@   |   |¡}|dkr|S |  ||¡| d… }|t d| |¡ S )z"Add an internal value  to a stringr   Nz!%ds)r'   Zi2mÚstructÚpack)r*   ÚpktÚsÚvalÚtmp_lenZinternalr-   r-   r.   Úaddfieldo   s
    
zIP6FieldLenField.addfieldc                 C   sZ   |   |¡}|dkr|dksJ ‚|dkr.|dfS ||d … |  |dd|  |d |…  ¡fS )Nr   é   ó    ó    )r'   Zm2i)r*   r1   r2   r4   r-   r-   r.   Úgetfieldw   s    

ÿzIP6FieldLenField.getfield)N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r)   r5   r9   r-   r-   r-   r.   r&   h   s   
r&   c                   @   s&   e Zd ZdZedddƒgZdd„ ZdS )ÚLoWPANUncompressedIPv6z6LoWPAN Uncompressed IPv6Ú_typeéA   é   c                 C   s   t S r(   )r   )r*   Úpayr-   r-   r.   Údefault_payload_classŒ   s    z,LoWPANUncompressedIPv6.default_payload_classN)r:   r;   r<   r+   r
   Úfields_descrC   r-   r-   r-   r.   r>   †   s   
ÿr>   c                
   @   s’   e Zd ZdZdddddœZedddƒed	d
dddgƒedd
dddgƒedd
dƒeedd
ƒdd„ fge	dd
ƒƒeedd
ƒdd„ fge	dd
ƒƒgZ
dS )Ú
LoWPANMeshz6LoWPAN Mesh Packet)Úvú2.4.4)ÚfrG   ©ÚsrcrG   ©ÚdstrG   )Ú_vÚ_fZ_sourceAddrZ_destinyAddrÚreservedé   rF   r   é   zEUI-64ZShortrH   ZhopsLefté   rJ   c                 C   s
   | j dkS ©NrQ   ©rF   ©r1   r-   r-   r.   Ú<lambda>    r7   zLoWPANMesh.<lambda>rL   c                 C   s
   | j dkS rS   rT   rU   r-   r-   r.   rV   ¤   r7   N)r:   r;   r<   r+   Údeprecated_fieldsr
   r	   r   r   r   rD   r-   r-   r-   r.   rE   ’   s&   ü

þþ÷rE   c                   @   sV   e Zd ZdZedddddgƒedddddgƒedddddgƒed	dd
ƒgZdd„ ZdS )ÚLoWPAN_HC2_UDPz6LoWPAN HC1 UDP encodingÚscr   rQ   úIn-lineÚ
CompressedÚdcÚlcÚresé   c                 C   s   t jS r(   )r    Zpadding_layer)r*   Úpayloadr-   r-   r.   rC   ·   s    z$LoWPAN_HC2_UDP.default_payload_classN)r:   r;   r<   r+   r	   r
   rD   rC   r-   r-   r-   r.   rX   ®   s   
ürX   c                 C   sL   d}| j s|d7 }| jrB| jdkrB|| jjd 7 }|| jjd 7 }| d S )a
  
    Get LoWPAN_HC1 padding

    LoWPAN_HC1 is not recommended for several reasons, one
    of them being that padding is a mess (not 8-bit regular)
    We therefore add padding bits that are not in the spec to restore
    8-bit parity. Wireshark seems to agree
    r   é   rQ   rR   rA   )Útc_flÚhc2ÚnhÚhc2FieldrY   r\   )r1   Úlengthr-   r-   r.   Ú_get_hc1_pad»   s    	
rg   c                   @   sÄ  e Zd ZdZeddƒedddddgƒed	dddd
gƒedddddgƒeddddd
gƒedddddgƒeddddddddœƒedddddgƒeeede	ƒ e	ƒdd„ fge
dddƒƒdd„ ƒeddƒed d!d"d„ ƒed#d!d$d„ ƒeed%dƒd&d„ ƒeed'dd(ƒd)d„ ƒeeed*dd+d,d-�d.d„ fged*dd/ƒƒd0d„ ƒeeed1dd+d,d-�d2d„ fged1dd/ƒƒd3d„ ƒeed4dd/ƒd5d„ ƒeed6dd/ƒd7d„ ƒed8deƒgZd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ ZdAdB„ ZdCS )DÚ
LoWPAN_HC1zLoWPAN_HC1 Compressed IPv6rO   éB   Úspr   rQ   rZ   r[   ÚsiZElidedÚdpÚdirb   zNot compressedÚzerord   rP   znot compressedr   ZICMPZTCP©r   rQ   rP   é   rc   zNo more header compression bitszHC2 Presentre   c                 C   s
   | j dkS rS   ©rd   rU   r-   r-   r.   rV   ä   r7   zLoWPAN_HC1.<lambda>r7   c                 C   s   | j S r(   )rc   rU   r-   r-   r.   rV   ï   r7   ÚhopLimitrJ   ú::c                 C   s   | j r
dnd| jrdnd S ©Nr   rA   )rj   rk   rU   r-   r-   r.   rV   õ   s   ÿrL   c                 C   s   | j r
dnd| jrdnd S rt   )rl   rm   rU   r-   r-   r.   rV   ø   s   ÿÚtraffic_classc                 C   s   | j  S r(   ©rb   rU   r-   r-   r.   rV   ü   r7   Ú
flow_labelra   c                 C   s   | j  S r(   rv   rU   r-   r-   r.   rV      r7   ÚudpSourcePortrR   é°ð  )Úoffsetc                 C   s   t | jddƒS )NrY   r   ©Úgetattrre   rU   r-   r-   r.   rV     r7   r6   c                 C   s   | j dko| jS rS   ©rd   rc   rU   r-   r-   r.   rV   
  r7   ÚudpDestPortc                 C   s   t | jddƒS )Nr\   r   r{   rU   r-   r-   r.   rV     r7   c                 C   s   | j dko| jS rS   r}   rU   r-   r-   r.   rV     r7   Ú	udpLengthc                 C   s   | j dko| jo| jj S rS   )rd   rc   re   r]   rU   r-   r-   r.   rV     r7   ÚudpChecksumc                 C   s   | j dko| jS rS   r}   rU   r-   r-   r.   rV     r7   Úpadc                 C   sÌ   t ƒ }t|_| j|_| j|_tjtj	tj
dœ}| jrB| | j¡|_| j|_|  ¡ |_|  ¡ |_| jr®| jdkr®tƒ }| j|_| j|_| jpŒd |_| j|_| |¡ | |¡ n
| |¡ t|ƒ}t  | |¡S )N)rQ   rP   rp   rQ   )!r   ÚIPHC_DEFAULT_VERSIONÚversionru   Útcrw   ÚflÚsocketÚIPPROTO_UDPÚIPPROTO_ICMPÚIPPROTO_TCPrd   Úgetrr   ÚhlimÚdecompressSourceAddrrJ   ÚdecompressDestAddrrL   rc   r   rx   Úsportr~   Údportr   Úlenr€   ÚchksumÚadd_payloadr   r   Úpost_dissect)r*   ÚdataÚpacketZnh_matchÚudpr-   r-   r.   r“      s0    ý



zLoWPAN_HC1.post_dissectc                 C   s`   | j s| js| jS | js@ttj| jƒdd … }td d… | }nt| dd�}ttj|ƒ| _| jS )NéøÿÿÿrA   T©Úsource)	rj   rk   rJ   r#   r†   ÚAF_INET6ÚLINK_LOCAL_PREFIXÚ_extract_upperaddressr$   ©r*   Úaddrr-   r-   r.   rŒ   ?  s    zLoWPAN_HC1.decompressSourceAddrc                 C   s`   | j s| js| jS | js@ttj| jƒdd … }td d… | }nt| dd�}ttj|ƒ| _| jS )Nr—   rA   Fr˜   )	rl   rm   rL   r#   r†   rš   r›   rœ   r$   r�   r-   r-   r.   r�   M  s    zLoWPAN_HC1.decompressDestAddrc                 C   s¤   t | jtƒst | ¡S | j}|j| _|j| _|j| _|j	| _
|j| _t |jtƒršd| _d| _|j}|j| _|j| _|jr~|jsŠtt|ƒƒ}|j| _|j| _t | ¡S rS   )Ú
isinstancer`   r   r   Údo_buildrJ   rL   r…   rw   r„   ru   r‹   rr   r   rd   rc   rŽ   rx   r�   r~   r�   r‘   r   r   r€   )r*   Úipv6r–   r-   r-   r.   r    [  s&    
zLoWPAN_HC1.do_buildc                 C   s>   t | jtƒr4t | jjtƒr(t| jjjƒS t| jjƒS t | ¡S r(   ©rŸ   r`   r   r   r   r   Údo_build_payload©r*   r-   r-   r.   r£   q  s
    zLoWPAN_HC1.do_build_payloadN)r:   r;   r<   r+   r   r	   r   r   r   rX   r   r&   r
   r   r   r   rg   rD   r“   rŒ   r�   r    r£   r-   r-   r-   r.   rh   Î   s–   
ý
ÿÿþÿ
óðÿÿþ
þÿ
ýúÿ
ýú
þ
þ
³Prh   c                   @   s0   e Zd ZdZedddƒedddƒeddƒgZd	S )
ÚLoWPANFragmentationFirstz"6LoWPAN First Fragmentation PacketrO   é   r_   ÚdatagramSizer   é   ÚdatagramTagN)r:   r;   r<   r+   r
   r   rD   r-   r-   r-   r.   r¥   |  s
   

ýr¥   c                   @   s:   e Zd ZdZedddƒedddƒedeƒ ƒed	dƒgZd
S )ÚLoWPANFragmentationSubsequentz'6LoWPAN Subsequent Fragmentation PacketrO   é   r_   r§   r   r¨   r©   ÚdatagramOffsetN)	r:   r;   r<   r+   r
   r   r%   r   rD   r-   r-   r-   r.   rª   …  s   


ürª   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚLoWPANBroadcastz6LoWPAN BroadcastrO   éP   Úseqr   N©r:   r;   r<   r+   r   rD   r-   r-   r-   r.   r­   ‘  s   þr­   é   c                 C   s€   | j dkrD| jdkrdS | jdkr&dS | jdkr4dS | jdkr|dS n8| jdkrRdS | jdkr`dS | jdkrndS | jdkr|dS dS )zÁSource address size

    This function depending on the arguments returns the amount of bits to be
    used by the source address.

    Keyword arguments:
    pkt -- packet object instance
    r   r6   rQ   rA   rP   rp   N)ÚsacÚsamrU   r-   r-   r.   Úsource_addr_size£  s"    	








r´   c                 C   s2  | j dkrD| jdkrD| jdkr"dS | jdkr0dS | jdkr>dS dS nê| j dkrˆ| jdkrˆ| jdkrfdS | jdkrtdS | jdkr‚dS dS n¦| j dkrÖ| jdkrÖ| jdkrªdS | jdkr¸dS | jdkrÆdS | jdkrÔdS nX| j dk�r.| jdk�r.| jdk� rþdS | jdk�rdS | jdk�rdS | jdk�r.dS d	S )
zËDestination address size

    This function depending on the arguments returns the amount of bits to be
    used by the destination address.

    Keyword arguments:
    pkt -- packet object instance
    r   r6   rQ   rA   rP   r±   rR   rp   N)ÚmÚdacÚdamrU   r-   r-   r.   Údest_addr_sizeÀ  sD    	









r¸   Tc                 C   s&  t tf}| j}|r$t||ƒs$|j}qt|ƒt krlt|r<|jn|jƒ}tdd… |dd…  d |dd…  S t|ƒtk�r|r„|j	n|j
}t d|¡}|jjdkrâtdd… | }|dd… t dt|d ƒdA ¡ |d	d
…  S |jjdk�r"tdd… d |dd…  S ntdt|ƒ ƒ dS dS )a8  This function extracts the source/destination address of a 6LoWPAN
    from its upper layer.

    (Upper layer could be 802.15.4 data, Ethernet...)

    params:
     - source: if True, the address is the source one. Otherwise, it is the
               destination.
    returns: (upper_address, ipv6_address)
    NrA   rp   s   ÿþz>Qr   ÚBrP   é	   r6   ó      ÿþ r±   z*Unimplemented: Unsupported upper layer: %só                   )r   r   Ú
underlayerrŸ   Útyper   rJ   rL   r›   Zsrc_addrZ	dest_addrr/   r0   Zfcf_destaddrmoder   r!   )r1   r™   ZSUPPORTED_LAYERSr½   rž   Útmp_ipr-   r-   r.   rœ   ó  s0    (0
ÿ
þÿ
ÿrœ   c                   @   sÞ  e Zd ZdZdgZdZg d¢ZddgZddd	d
ddœZe	dddƒe	dddƒe
dddddgƒe
ddddddddœƒe
dddddiƒe
dddeƒe
dddeƒe
ddddd iƒe
d!ddeƒe
d"ddeƒee	d#dd$ƒd%d&„ ƒee	d'dd$ƒd(d&„ ƒee	d)ddƒd*d&„ ƒee	d+dd,ƒd-d&„ ƒeee	d.dd$ƒd/d&„ fge	d.ddƒƒd0d&„ ƒee	d1dd2ƒd3d&„ ƒeed4deƒd5d&„ ƒeed6dƒd7d&„ ƒed8d9ed:�ed;d9ed:�gZd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ ZdFdG„ ZdHdI„ ZdJdK„ ZdLdM„ ZdNS )OÚLoWPAN_IPHCzY6LoWPAN IPv6 header compressed packets

    It follows the implementation of RFC6282
    Ú_ipv6z#LoWPAN IP Header Compression Packet)zUnspecified (0)Ú1z16-bits inline (3)zCompressed (3)zStateless (0)zStateful (1))ÚnhFieldrG   )rr   rG   rI   rK   )r~   rG   )Z_nhFieldZ	_hopLimitZ
sourceAddrZdestinyAddrZudpDestinyPortÚ	_reservedrp   Útfr   rP   rd   rQ   ZInliner[   r‹   zCompressed/HL1zCompressed/HL64zCompressed/HL255ro   ÚcidzPresent (1)r²   r³   rµ   zmulticast (1)r¶   r·   ZscirR   c                 C   s
   | j dkS rS   ©rÆ   rU   r-   r-   r.   rV   C  r7   zLoWPAN_IPHC.<lambda>Zdcic                 C   s
   | j dkS rS   rÇ   rU   r-   r-   r.   rV   G  r7   Útc_ecnc                 C   s
   | j dv S )N)r   rQ   rP   ©rÅ   rU   r-   r-   r.   rV   L  r7   Útc_dscpr±   c                 C   s
   | j dv S ©N)r   rP   rÉ   rU   r-   r-   r.   rV   P  r7   Zrsvc                 C   s
   | j dkS ©Nr   rÉ   rU   r-   r-   r.   rV   T  r7   c                 C   s
   | j dv S ©N)r   rQ   rÉ   rU   r-   r-   r.   rV   W  r7   Ú	flowlabelra   c                 C   s
   | j dv S rÍ   rÉ   rU   r-   r-   r.   rV   [  r7   rÃ   c                 C   s
   | j dkS rÌ   rq   rU   r-   r-   r.   rV   `  r7   rr   c                 C   s
   | j dkS rÌ   )r‹   rU   r-   r-   r.   rV   d  r7   rJ   rs   )r'   rL   c                 C   sº   t ƒ }|  ¡ \|_|_| js$| j|_| jdkr8| j|_n*| jdkrJd|_n| jdkr\d|_nd|_|  |¡|_	|  
|¡|_|  |¡}|t kr | |¡ t|ƒ}n|tkr®|| _t | |¡S )zÄdissect the IPv6 package compressed into this IPHC packet.

        The packet payload needs to be decompressed and depending on the
        arguments, several conversions should be done.
        r   rQ   rP   é@   éÿ   )r   Ú_getTrafficClassAndFlowLabelr„   r…   rd   rÃ   r‹   rr   rŒ   rJ   r�   rL   Úguess_payload_classr’   r   Ú
LoWPAN_NHCrÁ   r   r“   )r*   r”   r•   Zpay_clsr-   r-   r.   r“   l  s(    






zLoWPAN_IPHC.post_dissectc                 C   s  zt tj| jƒ}W n tjy*   d}Y n0 | jdkr²| jdkr²| jdkrLnb| jdkrptdd… |dd …  }n>| jdkr˜tdd… d |dd …  }n| jd	kr®t	| d
d�}�nX| jdkrø| jdkrø| jdkrÒn"| jd	krêt	| d
d�}n
| jdvrô�n| jdk�r¤| jdk�r¤| jdk�rn„| jdk�rXdt
|dt| ƒ  ƒ }|d |dd …  }nJ| jdk�r’dt
|dt| ƒ  ƒ }|d |dd …  }nd|dd …  }nf| jdk�r
| jdk�r
| jdk�r
d}d}|dd … }d|d d…  | |d d…  |dd…  }n ttj|ƒ| _| jS )Nr¼   r   rQ   rA   r—   rP   r»   éþÿÿÿrp   Fr˜   )rQ   rP   ó   ÿr6   s	            éûÿÿÿs              éýÿÿÿs   ÿ             éÿÿÿÿr8   iúÿÿÿr±   )r#   r†   rš   rL   Úerrorrµ   r¶   r·   r›   rœ   r   r¸   r$   )r*   r•   r¿   ÚtmpÚPÚLÚXr-   r-   r.   r�   �  sL    







.zLoWPAN_IPHC.decompressDestAddrc                 C   s¸   t tj|jƒ}| jdkrV| jdkr$q”| jdkr<|dd… }q”| jdkr”|dd… }q”n>| jdkrfd}n.| jdkr~|dd… }n| jdkr”|dd… }ttjddt|ƒ  | ƒ| _| jS )	Nr   rQ   rA   r6   rP   é   r¼   r8   )r#   r†   rš   rJ   r²   r³   r$   r�   ©r*   r¡   r¿   r-   r-   r.   ÚcompressSourceAddrÆ  s"    






zLoWPAN_IPHC.compressSourceAddrc                 C   s˜  t tj|jƒ}| jdkrh| jdkrh| jdkr.n6| jdkrJd|dd…  }n| jdkrdd|dd…  }�n| jdkr´| jdkr´| jdkr˜d|dd…  }n| jdkr²d|dd…  }nÒ| jdk�rF| jdk�rF| jdkrÖ| jdkrþd	|dd…  |d
d…  }nF| jdk�r(d|dd…  |dd…  }n| jdk�r†d|dd…  }n@| jdk�r†| jdk�r†| jdk�r†d	|dd…  |dd…  }ttj|ƒ| _d S )Nr   rQ   ó           rA   r6   rP   s                 rÞ   s
             r¨   s               é   rp   s                  é   é   )r#   r†   rš   rL   rµ   r¶   r·   r$   rß   r-   r-   r.   ÚcompressDestAddrÞ  s2    






zLoWPAN_IPHC.compressDestAddrc                 C   s8  zt tj| jƒ}W n tjy*   d}Y n0 | jdkrº| jdkrBnv| jdkrntdd… |dt| ƒ d…  }nJ| jdkr¢tdd… d }||dt| ƒ d…  }n| jdkr¸t	| d	d
�}nj| jdkrÆn^| jdkrÒnR| jdk�rtdd… d }||dt| ƒ d…  }n| jdk�r$tdd… d }t
tj|ƒ| _| jS )Nr¼   r   rQ   rA   r6   rP   r»   rp   Tr˜   rá   )r#   r†   rš   rJ   rÙ   r²   r³   r›   r´   rœ   r$   )r*   r•   r¿   rÚ   r-   r-   r.   rŒ   ý  s2    



"



z LoWPAN_IPHC.decompressSourceAddrc                 C   s*   | j r
tS | j}|r&t|ttfƒr&tS tS r(   )rd   rÓ   r½   rŸ   r¥   rª   r"   r   ©r*   r`   Úur-   r-   r.   rÒ   !  s    
ÿzLoWPAN_IPHC.guess_payload_classc                 C   s  | }t |jtƒr|j}t |jtƒs,t | ¡S |j}d| _| jdkrd|jd? | _	|jd@ | _
|j| _nD| jdkr„|jd? | _	|j| _n$| jdkr¨|jd? | _	|jd@ | _
n | jdkr¼|j| _n
| jdkrÆ| jdkrÚ|j| _n | jdkræn |  |¡ |  |¡ t | ¡S )Nrp   r   r±   é?   rQ   rP   )rŸ   r`   rÓ   r   r   r    rÄ   rÅ   r„   rÈ   rÊ   r…   rÎ   rd   rÃ   r‹   rr   rÆ   rà   rå   )r*   Ú_curr¡   r-   r-   r.   r    *  s6    













zLoWPAN_IPHC.do_buildc                 C   s"   t | jtƒrt| jjƒS t | ¡S r(   )rŸ   r`   r   r   r   r£   r¤   r-   r-   r.   r£   _  s    zLoWPAN_IPHC.do_build_payloadc                 C   s`   | j dkr | jd> | j | jfS | j dkr:| jd> | jfS | j dkrX| jd> | j dfS dS dS )zPage 6, draft feb 2011 r   r±   rQ   rP   )r   r   N)rÅ   rÈ   rÊ   rÎ   r¤   r-   r-   r.   rÑ   e  s    


z(LoWPAN_IPHC._getTrafficClassAndFlowLabelN)r:   r;   r<   Ú__doc__r=   r+   Z_address_modesZ_state_moderW   r
   r	   r   r   r   r   r   r&   r´   r¸   rD   r“   r�   rà   rå   rŒ   rÒ   r    r£   rÑ   r-   r-   r-   r.   rÀ     s�   û	


ý
þ
þ
þ
þ
þû
þ
þþÇ<!9$	5rÀ   c                   @   s.   e Zd Zedd„ ƒZed	dd„ƒZdd„ ZdS )
ÚLoWPAN_NHC_Hdrc                 C   sD   |r@t |ƒdkr@t|d d… ƒ}|d? dkr0tS |d? dkr@tS d S )NrP   rQ   rp   é   rR   rÞ   )r�   ÚordÚLoWPAN_NHC_UDPÚLoWPAN_NHC_IPv6Ext)Úclsr2   Úfbr-   r-   r.   Úget_next_clsx  s    zLoWPAN_NHC_Hdr.get_next_clsr7   c                 O   s   t  |¡pt S r(   ©rë   rò   )rð   Ú_pktÚargsÚkargsr-   r-   r.   Údispatch_hook‚  s    zLoWPAN_NHC_Hdr.dispatch_hookc                 C   s   d|fS )Nr7   r-   )r*   r2   r-   r-   r.   Úextract_padding†  s    zLoWPAN_NHC_Hdr.extract_paddingN)r7   )r:   r;   r<   Úclassmethodrò   r÷   rø   r-   r-   r-   r.   rë   w  s
   
	rë   c                   @   sÌ   e Zd Zedddƒedddƒedddƒeed	dd
ƒdd„ fed	ddƒdd„ fed	ddƒdd„ fged	dd
ƒƒeeddd
ƒdd„ fedddƒdd„ fedddƒdd„ fgeddd
ƒƒeeddƒdd„ ƒgZdS )rî   r^   rì   r_   ÚCr   rQ   rÛ   rP   rx   r6   c                 C   s
   | j dv S rÍ   ©rÛ   rU   r-   r-   r.   rV   ‘  r7   zLoWPAN_NHC_UDP.<lambda>rA   c                 C   s
   | j dkS )NrP   rû   rU   r-   r-   r.   rV   “  r7   rR   c                 C   s
   | j dkS ©Nrp   rû   rU   r-   r-   r.   rV   •  r7   r~   c                 C   s
   | j dv S rË   rû   rU   r-   r-   r.   rV   š  r7   c                 C   s
   | j dkS rS   rû   rU   r-   r-   r.   rV   œ  r7   c                 C   s
   | j dkS rü   rû   rU   r-   r-   r.   rV   ž  r7   r€   c                 C   s
   | j dkS rÌ   )rú   rU   r-   r-   r.   rV   £  r7   N)r:   r;   r<   r
   r   r   r   rD   r-   r-   r-   r.   rî   Š  sD   



ÿ
ÿ
ÿü
ù	
ÿ
ÿ
ÿü
ù	þêrî   zHop-by-hop Options HeaderzIPv6 Routing HeaderzIPv6 Fragment HeaderzIPv6 Destination Options HeaderzIPv6 Mobility HeaderzIPv6 Header)r   rQ   rP   rp   rR   é   c                
   @   sh   e Zd Zedddƒedddeƒedddƒeed	dƒd
d„ ƒeddddd�e	dddd„ d�gZ
dd„ ZdS )rï   r^   rÞ   rR   Zeidr   rp   rd   rQ   rÃ   c                 C   s
   | j dkS rÌ   rq   rU   r-   r-   r.   rV   ¹  r7   zLoWPAN_NHC_IPv6Ext.<lambda>r�   Nr”   r¹   )r'   Úfmtr7   c                 C   s   | j S r(   )r�   rU   r-   r-   r.   rV   ¼  r7   )Zlength_fromc                 C   sN   | j d u rF| j d }|d |… t dt |ƒ| ¡ ||d d …  }|| S )NrQ   z!B)r�   rd   r/   r0   )r*   ÚprB   Zoffsr-   r-   r.   Ú
post_build¿  s    
0zLoWPAN_NHC_IPv6Ext.post_build)r:   r;   r<   r
   r	   Ú_lowpan_nhc_ipv6ext_eidr   r   r   r   rD   r   r-   r-   r-   r.   rï   ²  s   

þ÷rï   c                   @   sF   e Zd ZdZedg edd„ d�gZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )rÓ   Z
LOWPAN_NHCÚextsc                  G   s   t  | d ¡S rü   ró   )r2   r-   r-   r.   rV   Ë  r7   zLoWPAN_NHC.<lambda>)Zpkt_clsZnext_cls_cbc                 C   sp  | j rt| j dƒs|S |  |¡tkr(|S | j j}ztdd„ | jD ƒƒ}W n ty^   d }Y n0 |rdztdd„ | jD ƒƒ}W n ty’   d }Y n0 |�rNd|_t	ƒ }|j
dkr¸|j|_|jdkrÔ|j|_|j|_nf|jdkrô|j|_d|j |_nF|jd	k�rd|j |_|j|_n$|jd
k�r:d|j |_d|j |_| ¡  || ¡ n| ¡  |¡ t|ƒ}t | |¡S )NrÁ   c                 s   s   | ]}t |tƒr|V  qd S r(   )rŸ   rï   ©Ú.0Úxr-   r-   r.   Ú	<genexpr>×  s   z*LoWPAN_NHC.post_dissect.<locals>.<genexpr>c                 s   s   | ]}t |tƒr|V  qd S r(   ©rŸ   rî   r  r-   r-   r.   r  á  s   é   r   rQ   i ð  rP   rp   ry   )r½   ÚhasattrrÒ   r   rÁ   Únextr  ÚStopIterationrd   r   rú   r€   r‘   rÛ   rx   rŽ   r~   r�   Z	lastlayerr’   r   r   r“   )r*   r”   r•   Zipv6_hdrÚudp_hdrr–   r-   r-   r.   r“   Ï  sN    ÿ
ÿ





zLoWPAN_NHC.post_dissectc                 C   sŒ  t | jtƒst | ¡S | jj}|r6t |jtƒr6|j}qt |tƒ�r‚ztdd„ | jD ƒƒ}W nt t	yÎ   t
ƒ }|jd? dkr’|jd? dkr’d|_n*|jd? dkr¨d|_n|jd? dkr¼d	|_| j d
|¡ Y n0 |jd
krì|j|_|j|_nh|jd	k�r|j|_|jd@ |_nF|jdk�r0|jd@ |_|j|_n$|jdk�rT|jd@ |_|jd@ |_|jd
k�r‚|j�rr|j|_ntt|ƒƒj|_t | ¡S )Nc                 s   s   | ]}t |tƒr|V  qd S r(   r  r  r-   r-   r.   r    s   z&LoWPAN_NHC.do_build.<locals>.<genexpr>rR   i  rp   rA   éð   rP   rQ   r   rÐ   rã   )rŸ   r`   r   r   r    r   r   r
  r  r  rî   rŽ   r�   rÛ   Úinsertrx   r~   rú   r‘   r€   r   )r*   rB   r  r-   r-   r.   r    þ  sH    
ÿ



zLoWPAN_NHC.do_buildc                 C   s>   t | jtƒr4| j}|r,t |ttfƒr,|j}qt|ƒS t | ¡S r(   r¢   )r*   Úcurr-   r-   r.   r£   (  s    zLoWPAN_NHC.do_build_payloadc                 C   s$   | j r | j j }t|ttfƒr tS tS r(   )r½   rŸ   r¥   rª   r"   r   ræ   r-   r-   r.   rÒ   1  s    ÿzLoWPAN_NHC.guess_payload_classN)r:   r;   r<   r+   r   rë   rD   r“   r    r£   rÒ   r-   r-   r-   r.   rÓ   Æ  s   þÿ/*	rÓ   c                   @   s   e Zd ZdZeddƒgZdS )ÚSixLoWPAN_ESCzSixLoWPAN Dispatcher ESCÚdispatchr   Nr°   r-   r-   r-   r.   r  @  s   r  c                   @   s   e Zd ZdZeddd„ƒZdS )Ú	SixLoWPANzSixLoWPAN Dispatcherr7   c                 O   s”   |r�t |ƒdkr�t|dd… ƒ}|dkr,tS |dkr8tS |dkrDtS |dkrPtS |d? dkr`tS |d? d	krptS |d
? dkr€tS |d
? dkr�t	S | S )zGDepending on the payload content, the frame type we should interpretaterQ   Nr@   ri   r®   é   rp   r¦   r«   r±   rP   )
r�   rí   r>   rh   r­   r  r¥   rª   rE   rÀ   )rð   rô   rõ   rö   rñ   r-   r-   r.   r÷   H  s&    zSixLoWPAN.dispatch_hookN)r7   )r:   r;   r<   r+   rù   r÷   r-   r-   r-   r.   r  E  s   r  é`   rQ   c                 C   s¢   |   t¡stdƒ‚t| t ƒ}t|ƒtkr0| gS dd„ }||tƒ}t|t|ƒd�|d  |d< d}|t|ƒk ržt|t|ƒtd | d�||  ||< |d7 }qb|S )	a  Split a packet into different links to transmit as 6lowpan packets.
    Usage example::

      >>> ipv6 = ..... (very big packet)
      >>> pkts = sixlowpan_fragment(ipv6, datagram_tag=0x17)
      >>> send = [Dot15d4()/Dot15d4Data()/x for x in pkts]
      >>> wireshark(send)
    z'SixLoWPAN only fragments IPv6 packets !c                    s    ‡ ‡fdd„t dtˆ ƒˆƒD ƒS )Nc                    s   g | ]}ˆ ||ˆ … ‘qS r-   r-   )r  Úi©ZliÚnr-   r.   Ú
<listcomp>z  r7   z6sixlowpan_fragment.<locals>.chunks.<locals>.<listcomp>r   )Úranger�   r  r-   r  r.   Úchunksy  s    z"sixlowpan_fragment.<locals>.chunks)r©   r§   r   rQ   rA   )r©   r§   r¬   )Zhaslayerr   Ú	Exceptionr   r�   ÚMAX_SIZEr¥   rª   )r•   Zdatagram_tagZ
str_packetr  Z
new_packetr  r-   r-   r.   Úsixlowpan_fragmenth  s    	

&
r  c                 C   sh   i }| D ]L}d }t |v rt }nt|v r*t}|r|| j}| |d¡|| jj ||< qdd„ | ¡ D ƒS )Nr7   c                 S   s   i | ]\}}|t |ƒ“qS r-   )r  )r  Útagr  r-   r-   r.   Ú
<dictcomp>’  r7   z(sixlowpan_defragment.<locals>.<dictcomp>)r¥   rª   r©   rŠ   r`   ÚloadÚitems)Zpacket_listÚresultsrÿ   rð   r  r-   r-   r.   Úsixlowpan_defragment‡  s    
r#  rq   )r¾   )T)rQ   )Orê   r†   r/   Zscapy.compatr   r   r   Z
scapy.datar   Zscapy.packetr   r   r   Zscapy.fieldsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscapy.layers.dot15d4r   Zscapy.layers.inet6r   r   r   r   Zscapy.layers.inetr   Zscapy.layers.l2r   Zscapy.utilsr   Zscapy.configr    Zscapy.errorr!   r"   Zscapy.pton_ntopr#   r$   Zscapy.volatiler%   r›   r&   r>   rE   rX   rg   rh   r¥   rª   r­   r‚   ZIPHC_DEFAULT_TFZIPHC_DEFAULT_FLr´   r¸   rœ   rÀ   rë   rî   r  rï   rÓ   r  r  r  r  r#  r-   r-   r-   r.   Ú<module>   sv   ,D /	3
+  [ú
z 




