
    h                        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Z4 G d de           Z5 G d de
          Z6 G d de
          Z7 G d de
          Z8d Z9 G d de
          Z: G d d e
          Z; G d! d"e
          Z< G d# d$e
          Z=d%Z>dZ?dZ@d& ZAd' ZBdEd)ZC G d* d+e
          ZD G d, d-e
          ZE G d. d/eE          ZFd0d1d2d3d4d5d6ZG G d7 d8eE          ZH G d9 d:e
          ZI G d; d<e
          ZJ G d= d>e
          ZKd?ZLdFdAZMdB ZN ee:e!            eeDeId@C            ee;eK            ee7eK            ee=eK            ee'eKdD           dS )Ga  
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BitLenField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)	RandShort6LoWPANi  s                 c                   (    e Zd ZdgZddZd Zd ZdS )IP6FieldLenField	length_ofNc                 @    t          j        | ||           || _        d S N)r   __init__r*   )selfnamedefaultr*   s       Z/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/sixlowpan.pyr-   zIP6FieldLenField.__init__k   s"    $g..."    c                     |                      |          }|dk    r|S |                     ||          | d         }|t          j        d|z  |          z   S )z"Add an internal value  to a stringr   Nz!%ds)r*   i2mstructpack)r.   pktsvaltmp_leninternals         r1   addfieldzIP6FieldLenField.addfieldo   s[    ..%%a<<H88C%%whii06;v/::::r2   c                     |                      |          }|dk    r|dk    sJ |dk    r|dfS ||d          |                     |dd|z
  z  |d |         z             fS )Nr      r2       )r*   m2i)r.   r7   r8   r:   s       r1   getfieldzIP6FieldLenField.getfieldw   sx    ..%%!||2a<<c6M'((gg68G8DEEG 	Gr2   r,   )__name__
__module____qualname__	__slots__r-   r<   rA    r2   r1   r)   r)   h   sR        I# # # #; ; ;G G G G Gr2   r)   c                   4    e Zd ZdZ eddd          gZd ZdS )LoWPANUncompressedIPv6z6LoWPAN Uncompressed IPv6_typeA      c                     t           S r,   )r   )r.   pays     r1   default_payload_classz,LoWPANUncompressedIPv6.default_payload_class   s    r2   N)rB   rC   rD   r/   r   fields_descrN   rF   r2   r1   rH   rH      s@        &D$""K    r2   rH   c                      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 fg e	dd
                     e edd
          d fg e	dd
                    gZ
dS )
LoWPANMeshz6LoWPAN Mesh Packet)v2.4.4)frS   srcrS   dstrS   )_v_f_sourceAddr_destinyAddrreserved   rR   r      zEUI-64ShortrT   hopsLeft   rV   c                     | j         dk    S Nr_   rR   r7   s    r1   <lambda>zLoWPANMesh.<lambda>       35A: r2   rX   c                     | j         dk    S rd   re   rf   s    r1   rg   zLoWPANMesh.<lambda>   rh   r2   N)rB   rC   rD   r/   deprecated_fieldsr   r
   r   r   r   rO   rF   r2   r1   rQ   rQ      s         D'(	  	S!$$S#q8W"566S#q8W"566S!$$k%%%'='=>?Juc""	
 	
 	k%%%'='=>?Juc""	
 	
KKKr2   rQ   c            	           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 ZdS )LoWPAN_HC2_UDPz6LoWPAN HC1 UDP encodingscr   r_   In-line
Compresseddclcres   c                     t           j        S r,   )r!   padding_layer)r.   payloads     r1   rN   z$LoWPAN_HC2_UDP.default_payload_class   s    !!r2   N)rB   rC   rD   r/   r
   r   rO   rN   rF   r2   r1   rl   rl      s        %DT1a)\!:;;T1a)\!:;;T1a)\!:;;1	K" " " " "r2   rl   c                     d}| j         s|dz  }| j        r/| j        dk    r$|| j        j        dz  z  }|| j        j        dz  z  }| dz  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      r_   rb   rK   )tc_flhc2nhhc2Fieldrm   rp   )r7   lengths     r1   _get_hc1_padr~      sc     F9 "
w *6Q;;clo))Fclo))FGq=r2   c                   r   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 fg e
ddd                    d            edd           edd d!            ed"d d#            e ed$d          d%            e ed&dd'          d(            e e ed)dd*d+,          d- fg ed)dd.                    d/            e e ed0dd*d+,          d1 fg ed0dd.                    d2            e ed3dd.          d4            e ed5dd.          d6            ed7de          gZd8 Zd9 Zd: Zd; Zd< Zd=S )>
LoWPAN_HC1zLoWPAN_HC1 Compressed IPv6r]   B   spr   r_   rn   ro   siElideddpdiry   zNot compressedzeror{   r^   znot compressedr   ICMPTCPr   r_   r^      rz   zNo more header compression bitszHC2 Presentr|   c                     | j         dk    S rd   r{   rf   s    r1   rg   zLoWPAN_HC1.<lambda>   s    CFaK r2   r2   c                     | j         S r,   )rz   rf   s    r1   rg   zLoWPAN_HC1.<lambda>   s     r2   hopLimitrV   ::c                 0    | j         rdnd| j        rdndz   S Nr   rK   )r   r   rf   s    r1   rg   zLoWPAN_HC1.<lambda>   $    36&8aaq+.6&8aaq&: r2   rX   c                 0    | j         rdnd| j        rdndz   S r   )r   r   rf   s    r1   rg   zLoWPAN_HC1.<lambda>   r   r2   traffic_classc                     | j          S r,   ry   rf   s    r1   rg   zLoWPAN_HC1.<lambda>   
    CI r2   
flow_labelrx   c                     | j          S r,   r   rf   s    r1   rg   zLoWPAN_HC1.<lambda>   r   r2   udpSourcePortrb     )offsetc                 .    t          | j        dd          S )Nrm   r   getattrr|   rf   s    r1   rg   zLoWPAN_HC1.<lambda>      dA > > r2   r>   c                 &    | j         dk    o| j        S rd   r{   rz   rf   s    r1   rg   zLoWPAN_HC1.<lambda>
      !/ r2   udpDestPortc                 .    t          | j        dd          S )Nrp   r   r   rf   s    r1   rg   zLoWPAN_HC1.<lambda>  r   r2   c                 &    | j         dk    o| j        S rd   r   rf   s    r1   rg   zLoWPAN_HC1.<lambda>  r   r2   	udpLengthc                 @    | j         dk    o| j        o| j        j         S rd   )r{   rz   r|   rq   rf   s    r1   rg   zLoWPAN_HC1.<lambda>  s    !GG4G r2   udpChecksumc                 &    | j         dk    o| j        S rd   r   rf   s    r1   rg   zLoWPAN_HC1.<lambda>  r   r2   padc                    t                      }t          |_        | j        |_        | j        |_        t          j        t          j	        t          j
        d}| j        r|                    | j                  |_        | j        |_        |                                 |_        |                                 |_        | j        rv| j        dk    rkt)                      }| j        |_        | j        |_        | j        pd |_        | j        |_        |                    |           |                    |           n|                    |           t=          |          }t?          j         | |          S )N)r_   r^   r   r_   )!r   IPHC_DEFAULT_VERSIONversionr   tcr   flsocketIPPROTO_UDPIPPROTO_ICMPIPPROTO_TCPr{   getr   hlimdecompressSourceAddrrV   decompressDestAddrrX   rz   r   r   sportr   dportr   lenr   chksumadd_payloadr   r   post_dissect)r.   datapacketnh_matchudps        r1   r   zLoWPAN_HC1.post_dissect   s7   -&	O	!"!
 

 7 	. TW--FIm..00
,,..
8 		%1%%C*CI(CIn,CG)CJOOD!!!s####t$$$6{{"4...r2   c                    | j         s| j        s| j        S | j        s:t          t          j        | j                  dd          }t          d d         |z   }nt          | d          }t          t          j        |          | _        | j        S )NrK   Tsource)	r   r   rV   r$   r   AF_INET6LINK_LOCAL_PREFIX_extract_upperaddressr%   r.   addrs     r1   r   zLoWPAN_HC1.decompressSourceAddr?  s    w 		<tw 		<8O 	<V_dh77<D$RaR(4/DD )d;;;DV_d33xr2   c                    | j         s| j        s| j        S | j        s:t          t          j        | j                  dd          }t          d d         |z   }nt          | d          }t          t          j        |          | _        | j        S )Nr   rK   Fr   )	r   r   rX   r$   r   r   r   r   r%   r   s     r1   r   zLoWPAN_HC1.decompressDestAddrM  s    w 		=tw 		=8O 	=V_dh77<D$RaR(4/DD )e<<<DV_d33xr2   c                    t          | j        t                    st          j        |           S | j        }|j        | _        |j        | _        |j        | _        |j	        | _
        |j        | _        t          |j        t                    rod| _        d| _        |j        }|j        | _        |j        | _        |j        r|j        st          t-          |                    }|j        | _        |j        | _        t          j        |           S rd   )
isinstancerv   r   r   do_buildrV   rX   r   r   r   r   r   r   r   r{   rz   r   r   r   r   r   r   r   r   r   )r.   ipv6r   s      r1   r   zLoWPAN_HC1.do_build[  s    $,-- 	)?4(((|88'!W	dlC(( 		*DGDH,C!$D"yD7 $#* $#c((mm WDN"zDt$$$r2   c                 
   t          | j        t                    rVt          | j        j        t                    rt	          | j        j        j                  S t	          | j        j                  S t          j        |           S r,   r   rv   r   r   r   r   do_build_payloadr.   s    r1   r   zLoWPAN_HC1.do_build_payloadq  sg    dlD)) 	-$,.44 94</7888t|+,,,&t,,,r2   N)rB   rC   rD   r/   r   r
   r   r   r   rl   r   r)   r   r   r   r   r~   rO   r   r   r   r   r   rF   r2   r1   r   r      s{       'D 		*d##T1a)\!:;;T1a)X!677T1a)\!:;;T1a)X!677Wa%5v$>??T1a%5%*%+%*", ", 	- 	- 	UAq#D#0#2 	3 	3 	 [^^-=-=!/1 1//1 ! S!44   !	
 	
( 		*c"": :	; 	; 	: :	; 	; 	Ioq))%%	
 	
 	H\1b))%%	
 	
 	!//1aGGG>>@ A!R00 
 0/	
 	
 	!/-AfEEE>>@ A2.. 
 0/	
 	
 	H[!R((GG	
 	
 	ImQ++//	
 	

 	E1l++[NK`/ / />    % % %,- - - - -r2   r   c                   \    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 Packetr]      rs   datagramSizer      datagramTagN)rB   rC   rD   r/   r   r   rO   rF   r2   r1   r   r   |  sK        /DT1%%b))M3''KKKr2   r   c                       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 Packetr]      rs   r   r   r   r   datagramOffsetN)	rB   rC   rD   r/   r   r   r&   r   rO   rF   r2   r1   r   r     sa        4DT1%%b))M99;;//	"C((	KKKr2   r   c                   B    e Zd ZdZ edd           edd          gZdS )LoWPANBroadcastz6LoWPAN Broadcastr]   P   seqr   NrB   rC   rD   r/   r   rO   rF   r2   r1   r   r     s8        D	*d##	%KKKr2   r      c                     | j         dk    r6| 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 | 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 )zSource 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   r>   r_   rK   r^   r   N)sacsamrf   s    r1   source_addr_sizer     s     w#~~7c>>2W^^1W^^1W^^1 ^ 7c>>1W^^1W^^1W^^1 ^r2   c                 6   | j         dk    r4| j        dk    r)| j        dk    rdS | j        dk    rdS | j        dk    rdS dS | j         dk    r4| j        dk    r)| j        dk    rdS | j        dk    rdS | j        dk    rdS dS | j         dk    rA| j        dk    r6| 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 | j         dk    r?| j        dk    r6| 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 d	S d	S )
zDestination 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   r>   r_   rK   r^   r   rb   r   N)mdacdamrf   s    r1   dest_addr_sizer     s[    uzzcgll7c>>2W^^1W^^11	!17c>>1W^^1W^^11	!17c>>2W^^1W^^1W^^1 ^	!17c>>1W^^1W^^1W^^1 
 ^r2   Tc                    t           t          f}| j        }|r)t          ||          s|j        }|rt          ||          t	          |          t           k    rEt          |r|j        n|j                  }t          dd         |dd         z   dz   |dd         z   S t	          |          t          k    r|r|j	        n|j
        }t          j        d|          }|j        j        dk    rSt          dd         |z   }|dd         t          j        dt          |d                   dz            z   |d	d
         z   S |j        j        dk    rt          dd         dz   |dd         z   S dS t          dt	          |          z             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)
    NrK   r   s   z>Qr   Br^   	   r>          r   z*Unimplemented: Unsupported upper layer: %s                   )r   r   
underlayerr   typer    rV   rX   r   src_addr	dest_addrr5   r6   fcf_destaddrmoder   r"   )r7   r   SUPPORTED_LAYERSr   r   tmp_ips         r1   r   r     s    {+J
 +Z
4DEE +*
  +Z
4DEE + J5  Cz~~Z^DD !$tBQBx/+=QRRHH	j		[	(	(&,Fz""*2F{4&& 1Q66&qs+d2F!A#;S3vay>>C3G!I!IIFSTUWSWLXX"3q88!!A#&+,QRR 98 	84
;K;KK	
 	
 	
 |r2   c                   `   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%            e e	d&dd$          d'            e e	d(dd          d)            e e	d*dd+          d,            e e e	d-dd$          d. fg e	d-dd                    d/            e e	d0dd1          d2            e ed3de          d4            e ed5d          d6            ed7d8e9           ed:d8e9          gZd; Zd< Zd= Zd> Zd? Zd@ ZdA ZdB ZdC ZdDS )E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))nhFieldrS   )r   rS   rU   rW   )r   rS   )_nhField	_hopLimit
sourceAddrdestinyAddrudpDestinyPort	_reservedr   tfr   r^   r{   r_   Inlinero   r   zCompressed/HL1zCompressed/HL64zCompressed/HL255r   cidzPresent (1)r   r   r   zmulticast (1)r   r   scirb   c                     | j         dk    S rd   r  rf   s    r1   rg   zLoWPAN_IPHC.<lambda>C      3 r2   dcic                     | j         dk    S rd   r  rf   s    r1   rg   zLoWPAN_IPHC.<lambda>G  r  r2   tc_ecnc                     | j         dv S )N)r   r_   r^   r  rf   s    r1   rg   zLoWPAN_IPHC.<lambda>L  s    )+ r2   tc_dscpr   c                     | j         dv S N)r   r^   r  rf   s    r1   rg   zLoWPAN_IPHC.<lambda>P      &( r2   rsvc                     | j         dk    S Nr   r  rf   s    r1   rg   zLoWPAN_IPHC.<lambda>T  s    SVq[ r2   c                     | j         dv S N)r   r_   r  rf   s    r1   rg   zLoWPAN_IPHC.<lambda>W  r  r2   	flowlabelrx   c                     | j         dv S r  r  rf   s    r1   rg   zLoWPAN_IPHC.<lambda>[  r  r2   r   c                     | j         dk    S r  r   rf   s    r1   rg   zLoWPAN_IPHC.<lambda>`  s    # r2   r   c                     | j         dk    S r  )r   rf   s    r1   rg   zLoWPAN_IPHC.<lambda>d  s    C r2   rV   r   )r*   rX   c                 P   t                      }|                                 \  |_        |_        | j        s| j        |_        | j        dk    r| j        |_        n-| j        dk    rd|_        n| j        dk    rd|_        nd|_        |                     |          |_	        | 
                    |          |_        |                     |          }|t           k    r%|                    |           t          |          }n|t          k    r|| _        t#          j        | |          S )zdissect 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   r_   r^   @      )r   _getTrafficClassAndFlowLabelr   r   r{   r   r   r   r   rV   r   rX   guess_payload_classr   r   
LoWPAN_NHCr   r   r   )r.   r   r   pay_clss       r1   r   zLoWPAN_IPHC.post_dissectl  s    #@@BB	69w 	%FI9>>-FKKY#FKKY#FKKFK..v66
,,V44
**400d??t$$$v;;DD
""DJ"4...r2   c                    	 t          t          j        | j                  }n# t          j        $ r d}Y nw xY w| j        dk    r| j        dk    r|| j        dk    rn| j        dk    rt          dd         |dd          z   }n| j        dk    rt          dd         dz   |dd          z   }nz| j        d	k    rt          | d
          }n\| j        dk    rB| j        dk    r7| j        dk    rn9| j        d	k    rt          | d
          }n| j        dvr	 n| j        dk    r| j        dk    r| j        dk    rn| j        dk    r9dt          |dt          |           z
                     z   }|dz   |dd          z   }n| j        dk    r9dt          |dt          |           z
                     z   }|dz   |dd          z   }ned|dd          z   }nW| j        dk    rL| j        dk    rA| j        dk    r5d}d}|dd          }d|d d         z   |z   |d d         z   |dd         z   }n	 t          t          j        |          | _        | j        S )Nr   r   r_   rK   r   r^   r   r   Fr   )r_   r^      r>   s	            s              s                r?   ir   )r$   r   r   rX   errorr   r   r   r   r   r   r   r%   )r.   r   r   tmpPLXs          r1   r   zLoWPAN_IPHC.decompressDestAddr  s   	"v99FF| 	" 	" 	"!FFF	" 6Q;;48q==x1}}Q*1Q3/&+=Q*1Q3/2MMPVWYWZWZP[[Q.tEBBBVq[[TX]]x1}}S.tEBBB++ Vq[[TX]]x1}}QF2t0D0D+D$E F FF{*VBCC[8QF2t0D0D+D$E F FF|+fRSSk93fRSSkAVq[[TX]]x3
 !233K 1RaR51,q!u4q1v=V_f55x   " 66c                    t          t          j        |j                  }| j        dk    r9| j        dk    rnf| j        dk    r|dd         }nP| j        dk    r|dd         }n:n9| j        dk    rd}n+| j        dk    r|dd         }n| j        dk    r
|dd         }t          t          j        ddt          |          z
  z  |z             | _        | j        S )	Nr   r_   rK   r>   r^      r   r?   )r$   r   r   rV   r   r   r%   r   r.   r   r   s      r1   compressSourceAddrzLoWPAN_IPHC.compressSourceAddr  s    6?DH558q==x3S"S2x3%S"S2V_gc&kk9I.JV.STTxr2   c                 8   t          t          j        |j                  }| j        dk    rL| j        dk    rA| j        dk    rn8| j        dk    rd|dd         z   }n| j        dk    rd|dd         z   }n| j        dk    r=| j        dk    r2| j        dk    rd|dd         z   }n| j        dk    rd|dd         z   }n| j        dk    rx| j        dk    rm| j        dk    r	 | j        dk    rd	|dd         z   |d
d         z   }nv| j        dk    rd|dd         z   |dd         z   }nR| j        dk    rd|dd         z   }n9| j        dk    r.| j        dk    r#| j        dk    rd	|dd         z   |dd         z   }t          t          j        |          | _        d S )Nr   r_              rK   r>   r^   s                 r3  s
             r   s                  r   s                        )r$   r   r   rX   r   r   r   r%   r4  s      r1   compressDestAddrzLoWPAN_IPHC.compressDestAddr  s   6?DH556Q;;48q==x3S$vad|3S%r"u5Vq[[TX]]x3$vad|3S%r"u5Vq[[TX]]x3x3%qs3fRUmCS%qs3fRUmCS%r"u5Vq[[TX]]x1}}%qs3fRUmCV_f55r2   c                    	 t          t          j        | j                  }n# t          j        $ r d}Y nw xY w| j        dk    r| j        dk    rn| j        dk    r+t          dd         |dt          |           z
  d         z   }n| j        dk    r0t          dd         dz   }||dt          |           z
  d         z   }n| j        dk    rt          | d	
          }np| j        dk    rnd| j        dk    rnX| j        dk    r0t          dd         dz   }||dt          |           z
  d         z   }n| j        dk    rt          dd         dz   }t          t          j        |          | _        | j        S )Nr   r   r_   rK   r>   r^   r   r   Tr   r7  )r$   r   r   rV   r,  r   r   r   r   r   r%   )r.   r   r   r-  s       r1   r   z LoWPAN_IPHC.decompressSourceAddr  s   	"v99FF| 	" 	" 	"!FFF	" 8q==x3S*1Q3/&>Nt>T>T9TUW9W2XXS'!,/JJvb+;D+A+A&A"&DEES.tDAAAx3SS'!,/JJvb+;D+A+A&A"&DEES*1Q3/+=V_f55xr1  c                     | j         rt          S | j        }|r#t          |t          t
          f          rt          S t          S r,   )r{   r$  r   r   r   r   r#   r   r.   rv   us      r1   r#  zLoWPAN_IPHC.guess_payload_class!  sK    7 	O 	A 8 = ? @ @ 	Jr2   c                    | }t          |j        t                    r|j        }t          |j        t                    st	          j        |           S |j        }d| _        | j        dk    r+|j        dz	  | _	        |j        dz  | _
        |j        | _        nR| j        dk    r|j        dz	  | _	        |j        | _        n+| j        dk    r|j        dz	  | _	        |j        dz  | _
        n	 | j        dk    r|j        | _        n| j        dk    r	 | j        dk    r|j        | _        n	 | j        dk    rn	 |                     |           |                     |           t	          j        |           S )Nr   r   r   ?   r_   r^   )r   rv   r$  r   r   r   r  r  r   r  r  r   r  r{   r   r   r   r  r5  r;  )r.   _curr   s      r1   r   zLoWPAN_IPHC.do_build*  se   dlJ// 	 <D$,-- 	)?4(((| 7c>>'Q,DK7T>DL!WDNNW^^'Q,DK!WDNNW^^'Q,DK7T>DLL 7c>>7DLLW\\ 9 IDMM 8s??  	%%%d###t$$$r2   c                     t          | j        t                    rt          | j        j                  S t	          j        |           S r,   )r   rv   r   r   r   r   r   s    r1   r   zLoWPAN_IPHC.do_build_payload_  s:    dlD)) 	-t|+,,,&t,,,r2   c                     | j         dk    r| j        dz  | j        z   | j        fS | j         dk    r| j        dz  | j        fS | j         dk    r| j        dz  | j        z   dfS dS )zPage 6, draft feb 2011 r   r   r_   r^   )r   r   )r  r  r  r  r   s    r1   r"  z(LoWPAN_IPHC._getTrafficClassAndFlowLabele  sp    7c>>K1$4dnDDW^^K1$t~55W^^K1$4a774r2   N)rB   rC   rD   __doc__rE   r/   _address_modes_state_moderj   r   r
   r   r   r   r   r   r)   r   r   rO   r   r   r5  r;  r   r#  r   r   r"  rF   r2   r1   r   r     s}         	I0D( ( (N"N3K(*&'2  	dA&&sAT3Hl#;<<VS!)9):);&= &= 	> 	> 	UCQ$677UCK00UCN33S#q1o"677UCK00UCN33 	HUAq!!&&	
 	
 	HUAq!!&&	
 	

 	HXq!$$++	
 	
 	HY1%%((	
 	
 	(5!Q'')@)@AB1%%  )(	
 	
 	H[!R((((	
 	

 	M)S&11%%	
 	
 	Ij#&&''	
 	
 	0@AAA???s:Kx/ / /B7 7 7r  06 6 6>" " "H  3% 3% 3%j- - -	 	 	 	 	r2   r   c                   B    e Zd Zed             Zedd            Zd ZdS )LoWPAN_NHC_Hdrc                     |rJt          |          dk    r7t          |d d                   }|dz	  dk    rt          S |dz	  dk    rt          S d S )Nr^   r_   r      rb   r3  )r   ordLoWPAN_NHC_UDPLoWPAN_NHC_IPv6Ext)clsr8   fbs      r1   get_next_clszLoWPAN_NHC_Hdr.get_next_clsx  sV     	*Q1QrrUBQw$%%Qw#~~))tr2   r2   c                 D    t                               |          pt           S r,   rI  rQ  )rO  _pktargskargss       r1   dispatch_hookzLoWPAN_NHC_Hdr.dispatch_hook  s    **400BNBr2   c                 
    d|fS )Nr2   rF   )r.   r8   s     r1   extract_paddingzLoWPAN_NHC_Hdr.extract_padding  s    Avr2   Nr2   )rB   rC   rD   classmethodrQ  rW  rY  rF   r2   r1   rI  rI  w  s`          [ C C C [C    r2   rI  c                      e Zd Z eddd           eddd           eddd           e ed	dd
          d f ed	dd          d f ed	dd          d fg ed	dd
                     e eddd
          d f eddd          d f eddd          d fg eddd
                     e edd          d           gZdS )rM  rr   rK  rs   Cr   r_   r.  r^   r   r>   c                     | j         dv S r  r.  rf   s    r1   rg   zLoWPAN_NHC_UDP.<lambda>      CEVO r2   rK   c                     | j         dk    S )Nr^   r_  rf   s    r1   rg   zLoWPAN_NHC_UDP.<lambda>      SUaZ r2   rb   c                     | j         dk    S Nr   r_  rf   s    r1   rg   zLoWPAN_NHC_UDP.<lambda>  rb  r2   r   c                     | j         dv S r  r_  rf   s    r1   rg   zLoWPAN_NHC_UDP.<lambda>  r`  r2   c                     | j         dk    S rd   r_  rf   s    r1   rg   zLoWPAN_NHC_UDP.<lambda>  rb  r2   c                     | j         dk    S rd  r_  rf   s    r1   rg   zLoWPAN_NHC_UDP.<lambda>  rb  r2   r   c                     | j         dk    S r  )r]  rf   s    r1   rg   zLoWPAN_NHC_UDP.<lambda>  s    
 r2   N)rB   rC   rD   r   r   r   r   rO   rF   r2   r1   rM  rM    si       a  aah2..++-h1--'')h1--'')	* H_c2..	
 	
 	h}a,,++-h}a++'')h}a++'')	* H]C,,	
 	
 	Ks++""	
 	
-KKKr2   rM  zHop-by-hop Options HeaderzIPv6 Routing HeaderzIPv6 Fragment HeaderzIPv6 Destination Options HeaderzIPv6 Mobility HeaderzIPv6 Header)r   r_   r^   r   rb      c            
           e Zd Z eddd           eddde           eddd           e ed	d          d
            edddd           e	ddd           gZ
d ZdS )rN  rr   r3  rb   eidr   r   r{   r_   r   c                     | j         dk    S r  r   rf   s    r1   rg   zLoWPAN_NHC_IPv6Ext.<lambda>  s    ! r2   r   Nr   r   )r*   fmtr2   c                     | j         S r,   )r   rf   s    r1   rg   zLoWPAN_NHC_IPv6Ext.<lambda>  s    cg r2   )length_fromc                     | j         I| j         dz   }|d |         t          j        dt          |          |z
            z   ||dz   d          z   }||z   S )Nr_   z!B)r   r{   r5   r6   )r.   prM   offss       r1   
post_buildzLoWPAN_NHC_IPv6Ext.post_build  sZ    8K1$D%4%6;tSVVd];;;aq		lJA3wr2   )rB   rC   rD   r   r
   _lowpan_nhc_ipv6ext_eidr   r   r   r   rO   rs  rF   r2   r1   rN  rN    s        QUAq"9::q!Ii####	
 	
 	eTV===2E2EFFF
K    r2   rN  c                   L    e Zd ZdZ edg ed           gZd Zd Zd Z	d Z
d	S )
r$  
LOWPAN_NHCextsc                  B    t                               | d                   S rd  rS  )r8   s    r1   rg   zLoWPAN_NHC.<lambda>  s    >#>#>qt#D#D r2   )pkt_clsnext_cls_cbc                    | j         rt          | j         d          s|S |                     |          t          k    r|S | j         j        }	 t          d | j        D                       }n# t          $ r d }Y nw xY w|r	 	 t          d | j        D                       }n# t          $ r d }Y nw xY w|rd|_        t                      }|j
        dk    r|j        |_        |j        dk    r|j        |_        |j        |_        nw|j        dk    r|j        |_        d|j        z   |_        nP|j        dk    rd|j        z   |_        |j        |_        n)|j        d	k    rd
|j        z   |_        d
|j        z   |_        |                                                    ||z             n'|                                                    |           t)          |          }t+          j        | |          S )Nr   c              3   D   K   | ]}t          |t                    |V  d S r,   )r   rN  .0xs     r1   	<genexpr>z*LoWPAN_NHC.post_dissect.<locals>.<genexpr>  sF        
16H(I(I     r2   c              3   D   K   | ]}t          |t                    |V  d S r,   r   rM  r}  s     r1   r  z*LoWPAN_NHC.post_dissect.<locals>.<genexpr>  sE        
1n(E(E     r2      r   r_   i   r^   r   r   )r   hasattrr#  r   r   nextrw  StopIterationr{   r   r]  r   r   r.  r   r   r   r   	lastlayerr   r   r   r   )r.   r   r   ipv6_hdrudp_hdrr   s         r1   r   zLoWPAN_NHC.post_dissect  s5    	gdow&G&G 	K##D))T11K&	  9    HH  	 	 	HHH	 	 	  9    GG  	 	 	GGG	 	1FI%%CyA~~$0
yA~~#1	#/		a#1	"W%88		a"W%::	#/		a"W%::	"W%88	**3:6666**40006{{"4...s$   A+ +A:9A:B   B/.B/c                 X   t          | j        t                    st          j        |           S | j        j        }|r=t          |j        t
                    r#|j        }|rt          |j        t
                    #t          |t                    r	 t          d | j        D                       }n# t          $ r{ t                      }|j        dz	  dk    r|j        dz	  dk    rd|_        n+|j        dz	  dk    rd|_        n|j        dz	  dk    rd|_        | j                            d	|           Y nw xY w|j        d	k    r|j        |_        |j        |_        nw|j        dk    r|j        |_        |j        d
z  |_        nP|j        dk    r|j        d
z  |_        |j        |_        n)|j        dk    r|j        dz  |_        |j        dz  |_        |j        d	k    r:|j        r|j        |_        n&t          t)          |                    j        |_        t          j        |           S )Nc              3   D   K   | ]}t          |t                    |V  d S r,   r  r}  s     r1   r  z&LoWPAN_NHC.do_build.<locals>.<genexpr>  sE        Jq.,I,I     r2   rb   i  r   rK      r^   r_   r   r!  r9  )r   rv   r   r   r   r   r   r  rw  r  rM  r   r   r.  insertr   r   r]  r   r   r   )r.   rM   r  s      r1   r   zLoWPAN_NHC.do_build  s9   $,-- 	)?4(((l" 	jk:: 	+C  	jk:: 	 c3  	?-  #y     ! 	- 	- 	-(**9>U**syA~/F/F !GIIY!^t++ !GIIY!^t++ !GI	  G,,,,,	- yA~~(+	%&)i##a(+	%&)i#o##a(+	C%&)i##a(+	B%&)i"n#yA~~: ?*-*G''*-c#hh--*>G't$$$s   B0 0BD54D5c                    t          | j        t                    rY| j        }|rAt          |t          t          f          r%|j        }|rt          |t          t          f          %t	          |          S t          j        |           S r,   r   )r.   curs     r1   r   zLoWPAN_NHC.do_build_payload(  s|    dlD)) 	,C "*S4+66 "k  "*S4+66 "s88O&t,,,r2   c                 |    | j         r/| j         j         }t          |t          t          f          rt          S t
          S r,   )r   r   r   r   r#   r   r>  s      r1   r#  zLoWPAN_NHC.guess_payload_class1  s?    ? 	*A!6;= > > 
r2   N)rB   rC   rD   r/   r   rI  rO   r   r   r   r#  rF   r2   r1   r$  r$    s        DBDD	
 	
 	
K-/ -/ -/^(% (% (%T- - -    r2   r$  c                   ,    e Zd ZdZ edd          gZdS )SixLoWPAN_ESCzSixLoWPAN Dispatcher ESCdispatchr   Nr   rF   r2   r1   r  r  @  s'        %D9Z++,KKKr2   r  c                   *    e Zd ZdZedd            ZdS )	SixLoWPANzSixLoWPAN Dispatcherr2   c                 F   |rt          |          dk    rt          |dd                   }|dk    rt          S |dk    rt          S |dk    rt          S |dk    rt
          S |dz	  dk    rt          S |dz	  d	k    rt          S |d
z	  dk    rt          S |d
z	  dk    rt          S | S )zDDepending on the payload content, the frame type we should interpretr_   NrJ   r   r      r   r   r   r   r^   )
r   rL  rH   r   r   r  r   r   rQ   r   )rO  rT  rU  rV  rP  s        r1   rW  zSixLoWPAN.dispatch_hookH  s      	#CIINNT"1"XBTzz--Tzz!!Tzz&&Tzz$$Qw$//Qw$44Qw$!!Qw$""
r2   NrZ  )rB   rC   rD   r/   r[  rW  rF   r2   r1   r  r  E  s7        !D   [  r2   r  `   r_   c                    |                      t                    st          d          t          | t                             }t	          |          t
          k    r| gS d } ||t
                    }t          |t	          |                    |d         z  |d<   d}|t	          |          k     rNt          |t	          |          t
          dz  |z            ||         z  ||<   |dz  }|t	          |          k     N|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                 \      fdt          dt                               D             S )Nc                 *    g | ]}||z            S rF   rF   )r~  ilins     r1   
<listcomp>z6sixlowpan_fragment.<locals>.chunks.<locals>.<listcomp>z  s%    :::1QU7:::r2   r   )ranger   )r  r  s   ``r1   chunksz"sixlowpan_fragment.<locals>.chunksy  s3    :::::U1c"ggq%9%9::::r2   )r   r   r   r_   rK   )r   r   r   )haslayerr   	Exceptionr   r   MAX_SIZEr   r   )r   datagram_tag
str_packetr  
new_packetr  s         r1   sixlowpan_fragmentr  h  s@    ??4   CABBBVD\""J
:(""x; ; ; 
H--J,TWXbTcTcdddgqrsgttJqM	A
c*oo

5,]`ak]l]l  ~F  JK  ~K  NO  ~O  P  P  P  S]  ^_  S`  `
1	Q c*oo

 r2   c                    i }| D ]`}d }t           |v rt           }nt          |v rt          }|r9||         j        }|                    |d          ||         j        j        z   ||<   ad |                                D             S )Nr2   c                 4    i | ]\  }}|t          |          S rF   )r  )r~  tagr  s      r1   
<dictcomp>z(sixlowpan_defragment.<locals>.<dictcomp>  s$    <<<&#qC1<<<r2   )r   r   r   r   rv   loaditems)packet_listresultsrq  rO  r  s        r1   sixlowpan_defragmentr    s    G G G#q((*CC*a///C 	GC&$C";;sC001S6>3FFGCL<<GMMOO<<<<r2   r   )r   )T)r_   )OrE  r   r5   scapy.compatr   r   r   
scapy.datar   scapy.packetr   r   r	   scapy.fieldsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.layers.dot15d4r   scapy.layers.inet6r   r   r   r   scapy.layers.inetr   scapy.layers.l2r   scapy.utilsr    scapy.configr!   scapy.errorr"   r#   scapy.pton_ntopr$   r%   scapy.volatiler&   r   r)   rH   rQ   rl   r~   r   r   r   r   r   IPHC_DEFAULT_TFIPHC_DEFAULT_FLr   r   r   r   rI  rM  rt  rN  r$  r  r  r  r  r  rF   r2   r1   <module>r     s  * *X   & & & & & & & & & & " " " " " " ; ; ; ; ; ; ; ; ; ;                                 $ - , , , , ,            " ! ! ! ! ! ! ! ! ! ! !                         0 0 0 0 0 0 0 0 $ $ $ $ $ $F W G G G G Gx G G G<    V          8
" 
" 
" 
" 
"V 
" 
" 
"  &i- i- i- i- i- i- i- i-\    v       F       f       :0 0 0f( ( ( (VP P P P P& P P Pr
    V   &    ^   > #(         (q q q q q q q qt- - - - -F - - -
       @    >= = =$ J    k:! , , , , $i 0 0 0 J	 " " " OY ' ' ' E96 * * * * * *r2   