
    h}2                     	   d Z ddlmZmZmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddl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Z0dZ1d Z2d!Z3d"Z4d#Z5dZ6d	Z7d
Z8d$Z9dZ:d	Z;d
Z<d$Z=dZ>d	Z?d
Z@d$ZA G d% d&e          ZB G d' d(e          ZCi ed)ed*ed+ed,ed-ed.e d/e!d0e"d1e#d2e$d3e%d4e&d5e'd6e(d7e)d8e*d9e+d:e,d;e-d<e.d=e/d>e0d?e1d@e2dAe3dBe4dCe5dDiZDe6dEe7dFe8dGe9dHiZEe:dIe;dJe<dKe=dLiZFe>dMe?dNe@dOeAdPiZG edQdd	           edRe6d
eE           edSdd	           edTdd	           edUdd	           edVe:d
eF          gZHdW ZIdX ZJ G dY dZe          ZK G d[ d\e          ZL G d] d^e          ZM G d_ d`e          ZN G da dbe          ZO G dc dde          ZP G de dfe          ZQ G dg dhe          ZR G di dje          ZS G dk dle          ZT G dm dne          ZU G do dpe          ZV G dq dre          ZW G ds dte          ZX G du dve          ZY G dw dxe          ZZ G dy dze          Z[ G d{ d|e          Z\ G d} d~e          Z] G d de          Z^ G d de          Z_ G d de          Z` G d de          Za G d de          Zb G d de          Zc G d de          Zd G d de          Ze G d de          Zf G d de          Zg eeeKd            eeeKd            eeeKdd            eeKeLe            eeKeMe            eeKeNe            eeKeOe            eeKePe            eeKeQe            eeKeRe             eeKeSe!            eeKeTe"            eeKeUe#            eeKeVe$            eeKeWe%            eeKeXe&            eeKeYe'            eeKeZe(            eeKe[e)            eeKe\e*            eeKe]e+            eeKe^e,            eeKe_e-            eeKe`e.            eeKeae/            eeKebe0            eeKece1            eeKede2            eeKeee3            eeKefe4            eeKege5            eegeK           dS )z}
MQTT for Sensor Networks (MQTT-SN)

Specification:
http://www.mqtt.org/new/wp-content/uploads/2009/06/MQTT-SN_spec_v1.2.pdf
    )Packetbind_layersbind_bottom_up)
BitFieldBitEnumField	ByteFieldByteEnumFieldConditionalFieldFieldLenField
ShortFieldStrFixedLenFieldStrLenFieldXByteEnumField)UDP)Scapy_Exception)chborb)RandNumN                     	   
                                                            c                   4     e Zd ZdZd Zd Zd Z fdZ xZS )VariableFieldLenFielda  
    MQTT-SN length field either has 1 byte for values [0x02, 0xff] or 3 bytes
    for values [0x0100, 0xffff]. If the first byte is 0x01 the length value
    comes in network byte-order in the next 2 bytes. MQTT-SN packets are at
    least 2 bytes long (length field + type field).
    c                     |                      ||          }|dk     s|dk    rt          d| j        j        z            |dk    r|dz   t	          j        d|          z   S |t          |          z   S )Nr     z%s: invalid length field value      z!H)i2mr   	__class____name__structpackr   )selfpktsvals       X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/mqttsn.pyaddfieldzVariableFieldLenField.addfieldS   s|    hhsC  !GGv!"B"&."9#: ; ; ;4ZZw;T3!7!777s3xx<    c                 @   t          |d                   dk    rgt          |          dk     rt          d| j        j        z            |dd          t          |d                   dz  t          |d                   z  fS |dd          t          |d                   fS )Nr   r   r0   z%s: malformed length fieldr   r   )r   lenr   r8   r9   )r<   r=   r>   s      r@   getfieldzVariableFieldLenField.getfield]   s    qt991vvzz%&B&*n&='> ? ? ?QRR53qt99>S1YY666QRR5#ad))##rB   c                     t                      S N)RandVariableFieldLen)r<   s    r@   randvalzVariableFieldLenField.randvalf   s    #%%%rB   c                 H     t          t          |           j        |i | d S rG   )superr2   __init__)r<   argskwargsr8   s      r@   rL   zVariableFieldLenField.__init__i   s,    3#T**3TDVDDDDDrB   )	r9   
__module____qualname____doc__rA   rE   rI   rL   __classcell__r8   s   @r@   r2   r2   L   sx              $ $ $& & &E E E E E E E E ErB   r2   c                        e Zd Z fdZ xZS )rH   c                 Z    t          t          |                               dd           d S )Nr   r4   )rK   rH   rL   )r<   r8   s    r@   rL   zRandVariableFieldLen.__init__n   s*    "D))221f=====rB   )r9   rO   rP   rL   rR   rS   s   @r@   rH   rH   m   s8        > > > > > > > > >rB   rH   	ADVERTISESEARCHGWGWINFOCONNECTCONNACKWILLTOPICREQ	WILLTOPIC
WILLMSGREQWILLMSGREGISTERREGACKPUBLISHPUBACKPUBCOMPPUBRECPUBREL	SUBSCRIBESUBACKUNSUBSCRIBEUNSUBACKPINGREQPINGRESP
DISCONNECTWILLTOPICUPDWILLTOPICRESP
WILLMSGUPDWILLMSGRESPzEncapsulated messagezFire and ForgetzAcknowledged deliverzAssured DeliveryzNo Connection requiredz	Normal IDzPre-defined IDzShort Topic NameReservedAcceptedzRejected: congestionzRejected: invalid topic IDzRejected: not supporteddupqosretainwill	cleansesstid_typec                       fd}|S )Nc                 
   t          | j        d          rT| j        j        dk    r| j        j        z
  dz
  S | j        j        dk    r"| j        j        dk     r| j        j        z
  dz
  S t          | j                  z
  dz   S )NrD   r5   r   r   r4   r   )hasattr
underlayerrD   payload)r=   
size_untils    r@   funz _mqttsn_length_from.<locals>.fun   s    CNE** 	;~!D((~)J6::.$q((s~/AF/J/J~)J6::3;*,q00rB    )r~   r   s   ` r@   _mqttsn_length_fromr      s#    1 1 1 1 1 JrB   c                 ,   |t          | j                  z   }| j        t          k    rt	          | j        dd           |dz  }nE| j        t
          k    r5t	          | j        dd           |t          | j        j                  z   dz   }|dk    r|dz  }|S )Ndurationr   	w_node_idr   r5   )rD   r}   typerl   getattr
ENCAPS_MSGr   )r=   xress      r@   _mqttsn_len_adjustr      s    
c#+
CJZ..6q
(j
 
 
#+{D
1
1
=#ck+,,,q0
TzzqJrB   c                   J    e Zd ZdZ eddde           edde          gZdS )MQTTSNzMQTT-SN headerrD   N)	length_ofadjustr   r   )	r9   rO   rP   namer2   r   r   PACKET_TYPEfields_descr   rB   r@   r   r      sK        D
 	eTU%7	9 	9 	9vq+..KKKrB   r   c                   B    e Zd ZdZ edd           edd          gZdS )MQTTSNAdvertisezMQTT-SN advertise gatewaygw_idr   r   N)r9   rO   rP   r   r   r   r   r   rB   r@   r   r      s8        &D	'1
:q!!KKKrB   r   c                   ,    e Zd ZdZ edd          gZdS )MQTTSNSearchGWzMQTT-SN search gatewayradiusr   N)r9   rO   rP   r   r   r   r   rB   r@   r   r      s)        #D	(AKKKrB   r   c                   X    e Zd ZdZ edd           edd ed                    gZdS )	MQTTSNGwInfozMQTT-SN gateway infor   r   gw_addr r   length_fromN)r9   rO   rP   r   r   r   r   r   r   rB   r@   r   r      sI        !D	'1Ir/B/B1/E/EFFFKKKrB   r   c            
       t    e Zd ZdZe edd           edd           edd ed          	          gz   Z	d
S )MQTTSNConnectzMQTT-SN connect commandprot_idr   r   r   	client_idr   r   r   N)
r9   rO   rP   r   FLAG_FIELDSr   r   r   r   r   r   rB   r@   r   r      s`        $D	)Q
:q!!K1D1DQ1G1GHHH! KKKrB   r   c                   .    e Zd ZdZ edee          gZdS )MQTTSNConnackzMQTT-SN connect ACKreturn_codeNr9   rO   rP   r   r	   ACCEPTEDRETURN_CODESr   r   rB   r@   r   r      s+         DmX|<<KKKrB   r   c                       e Zd ZdZdS )MQTTSNWillTopicReqzMQTT-SN will topic requestNr9   rO   rP   r   r   rB   r@   r   r     s        'DDDrB   r   c                   H    e Zd ZdZe edd ed                    gz   ZdS )MQTTSNWillTopiczMQTT-SN will topic
will_topicr   r   r   Nr9   rO   rP   r   r   r   r   r   r   rB   r@   r   r     sB        DL"2E2Ea2H2HIII! KKKrB   r   c                       e Zd ZdZdS )MQTTSNWillMsgReqzMQTT-SN will message requestNr   r   rB   r@   r   r     s        )DDDrB   r   c                   B    e Zd ZdZ edd ed                    gZdS )MQTTSNWillMsgzMQTT-SN will messagewill_msgr   r   r   Nr9   rO   rP   r   r   r   r   r   rB   r@   r   r     s:        !DJ0C0CA0F0FGGGKKKrB   r   c            	       n    e Zd ZdZ edd           edd           edd ed                    gZd	S )
MQTTSNRegisterzMQTT-SN registertidr   mid
topic_namer   r   r   N)r9   rO   rP   r   r   r   r   r   r   rB   r@   r   r     sX        D
5!
5!L"2E2Ea2H2HIIIKKKrB   r   c                   Z    e Zd ZdZ edd           edd           edee          gZdS )MQTTSNRegackzMQTT-SN register ACKr   r   r   r   N	r9   rO   rP   r   r   r	   r   r   r   r   rB   r@   r   r      sI        !D
5!
5!mX|<<KKKrB   r   c            
       t    e Zd ZdZe edd           edd           edd ed                    gz   Zd	S )
MQTTSNPublishzMQTT-SN publish messager   r   r   datar   r   r   N)	r9   rO   rP   r   r   r   r   r   r   r   rB   r@   r   r   )  s`        $D
5!
5!FB,?,?,B,BCCC! KKKrB   r   c                   Z    e Zd ZdZ edd           edd           edee          gZdS )MQTTSNPubackzMQTT-SN publish ACKr   r   r   r   Nr   r   rB   r@   r   r   2  sI         D
5!
5!mX|<<KKKrB   r   c                   ,    e Zd ZdZ edd          gZdS )MQTTSNPubcompzMQTT-SN publish completer   r   Nr9   rO   rP   r   r   r   r   rB   r@   r   r   ;  )        %D
5!KKKrB   r   c                   ,    e Zd ZdZ edd          gZdS )MQTTSNPubreczMQTT-SN publish receivedr   r   Nr   r   rB   r@   r   r   B  r   rB   r   c                   ,    e Zd ZdZ edd          gZdS )MQTTSNPubrelzMQTT-SN publish releaser   r   Nr   r   rB   r@   r   r   I  )        $D
5!KKKrB   r   c                       e Zd ZdZe edd           e edd          d            e eddd	          d
            e edd e	d                    d           gz   Z
dS )MQTTSNSubscribezMQTT-SN subscribe requestr   r   r   Nc                     | j         dk    S Nr   rx   r=   s    r@   <lambda>zMQTTSNSubscribe.<lambda>U      S\T%9 rB   short_topicr   lengthc                     | j         dk    S Nr   r   r   s    r@   r   zMQTTSNSubscribe.<lambda>W  r   rB   r   r0   r   c                     | j         dvS N)r   r   r   r   s    r@   r   zMQTTSNSubscribe.<lambda>Z      S\%E rB   r9   rO   rP   r   r   r   r
   r   r   r   r   r   rB   r@   r   r   P  s        &D
5!E40099	; 	;))-aHHH99	; 	;\41D1DQ1G1GI I IEE	G 	G	! 	KKKrB   r   c                   `    e Zd ZdZe edd           edd           edee          gz   Z	dS )MQTTSNSubackzMQTT-SN subscribe ACKr   r   r   r   N)
r9   rO   rP   r   r   r   r	   r   r   r   r   rB   r@   r   r   ^  sQ        "D
5!
5!mX|<<! KKKrB   r   c                       e Zd ZdZe edd           e edd          d            e eddd	          d
            e edd e	d                    d           gz   Z
dS )MQTTSNUnsubscribezMQTT-SN unsubscribe requestr   r   r   Nc                     | j         dk    S r   r   r   s    r@   r   zMQTTSNUnsubscribe.<lambda>l  r   rB   r   r   r   c                     | j         dk    S r   r   r   s    r@   r   zMQTTSNUnsubscribe.<lambda>n  r   rB   r   r0   r   c                     | j         dvS r   r   r   s    r@   r   zMQTTSNUnsubscribe.<lambda>q  r   rB   r   r   rB   r@   r   r   g  s        (D
5!E40099	; 	;))-aHHH99	; 	;\41D1DQ1G1GI I IEE	G 	G	! 	KKKrB   r   c                   ,    e Zd ZdZ edd          gZdS )MQTTSNUnsubackzMQTT-SN unsubscribe ACKr   r   Nr   r   rB   r@   r   r   u  r   rB   r   c                   B    e Zd ZdZ edd ed                    gZdS )MQTTSNPingReqzMQTT-SN ping requestr   r   r   r   Nr   r   rB   r@   r   r   |  s:        !DK1D1DQ1G1GHHHKKKrB   r   c                       e Zd ZdZdS )MQTTSNPingRespzMQTT-SN ping responseNr   r   rB   r@   r   r     s        "DDDrB   r   c                   B    e Zd ZdZ e edd          d           gZdS )MQTTSNDisconnectzMQTT-SN disconnect requestr   Nc                 h    t          | j        d          o| j        j        d u p| j        j        dk    S )NrD   r   )r{   r|   rD   r   s    r@   r   zMQTTSNDisconnect.<lambda>  s7    66 Gn D(Ecn.@1.D rB   )r9   rO   rP   r   r
   r   r   r   rB   r@   r   r     sE        'DJz4((G G	
 	
KKKrB   r   c                   H    e Zd ZdZe edd ed                    gz   ZdS )MQTTSNWillTopicUpdzMQTT-SN will topic updater   r   r   r   Nr   r   rB   r@   r   r     sB        &DL"2E2Ea2H2HIII! KKKrB   r   c                   .    e Zd ZdZ edee          gZdS )MQTTSNWillTopicRespzMQTT-SN will topic responser   Nr   r   rB   r@   r   r     s+        (DmX|<<KKKrB   r   c                   B    e Zd ZdZ edd ed                    gZdS )MQTTSNWillMsgUpdzMQTT-SN will message updater   r   r   r   Nr   r   rB   r@   r   r     s:        (DJ0C0CA0F0FGGGKKKrB   r   c                   .    e Zd ZdZ edee          gZdS )MQTTSNWillMsgRespzMQTT-SN will message responser   Nr   r   rB   r@   r   r     s+        *DmX|<<KKKrB   r   c            	       r    e Zd ZdZ eddd           eddd           edd ed	          
          gZdS )MQTTSNEncapszMQTT-SN encapsulated messageresvdr   r   r   r   r   r   r   r   N)r9   rO   rP   r   r   r   r   r   r   rB   r@   r   r     sc        )D!Q1a  ++A..	
 	
 	
KKKrB   r   i[  )sport)dport)r   r   )r   )hrQ   scapy.packetr   r   r   scapy.fieldsr   r   r   r	   r
   r   r   r   r   r   scapy.layers.inetr   scapy.errorr   scapy.compatr   r   scapy.volatiler   r:   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   r   QOS_0QOS_1QOS_2QOS_NEG1
TID_NORMAL
TID_PREDEF	TID_SHORT	TID_RESVDr   REJ_CONJREJ_TID
REJ_NOTSUPr2   rH   r   
QOS_LEVELSTOPIC_ID_TYPESr   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   rB   r@   <module>r     s    = < < < < < < < < <                                                " ! ! ! ! ! ' ' ' ' ' ' ! ! ! ! ! ! ! ! " " " " " "  		

	

	
	
				





		 

E E E E EM E E EB> > > > >7 > > >{j H Y	
 Y . {  Y j H Y H Y H  H!" {#$ HjYj.?&9 B 
	!	&	
  !z	 j$))	 HUAqLq*--HXq!HVQH[!QLZN;;	 	 	
 
 
	 	 	 	 	V 	 	 	    f       V       6       F       F   ( ( ( ( ( ( ( (    f   * * * * *v * * *    F       V       6       F       6       F       6       6       f       6              V       F   # # # # #V # # #    v              &       v          	 	 	 	 	6 	 	 	 sF$ ' ' ' ' sF$ ' ' ' ' Ct4 0 0 0 0 FO) 4 4 4 4 FN 2 2 2 2 FLv . . . . FM 0 0 0 0 FM 0 0 0 0 F&\ : : : : FO) 4 4 4 4 F$: 6 6 6 6 FM 0 0 0 0 FN 2 2 2 2 FLv . . . . FM 0 0 0 0 FLv . . . . FM 0 0 0 0 FLv . . . . FLv . . . . FO) 4 4 4 4 FLv . . . . F%K 8 8 8 8 FN 2 2 2 2 FM 0 0 0 0 FN 2 2 2 2 F$: 6 6 6 6 F&\ : : : : F'm < < < < F$: 6 6 6 6 F%K 8 8 8 8 FLz 2 2 2 2 L& ! ! ! ! !rB   