
    hjj                        d Z ddl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mZmZmZmZmZmZ  G d de          Z G d de          Z G d d	e          Z G d
 de          ZddddddddddddddddZddddd d!d"d#d$d%d&d'd(d)d*Z G d+ de          Z G d, de          Z  G d- de          Z! G d. de          Z" G d/ d0e          Z# G d1 d2e          Z$ G d3 de          Z% G d4 d5e          Z& G d6 de          Z' G d7 d8e          Z( G d9 de          Z) G d: de          Z* G d; d<e          Z+ G d= de          Z, G d> d?e          Z- G d@ d e          Z.dAdBdCZ/ G dD de          Z0 G dE dFe          Z1 G dG d!e          Z2 G dH dIe          Z3 G dJ de          Z4 G dK dLe          Z5 G dM d"e          Z6 G dN dOe          Z7 G dP de          Z8 G dQ d#e          Z9i ddRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpZ:dqdrdsZ; G dt due          Z< G dv de          Z= G dw d$e          Z> G dx de          Z? G dy d%e          Z@ G dz d{e          ZA G d| de          ZB G d} d&e          ZC G d~ de          ZD G d de          ZE G d d'e          ZF G d de          ZG G d d(e          ZH G d de          ZI G d de          ZJ G d d)e          ZK G d de          ZL G d de          ZM G d de          ZNd ZOd ZP G d de          ZQddiZRdddddZS G d de          ZT G d de          ZUddddZV G d de          ZWd ZX edddY          d f eddd]          d fgZY G d de          ZZ G d de          Z[dddddddddZ\ G d de          Z] G d de          Z^ G d de          Z_dS )zx
LoRa PHY to WAN Layer

Initially developed @PentHertz
and improved at @Trend Micro

Spec: lorawantm_specification v1.1
    )Packet)BitEnumFieldBitFieldBitFieldLenFieldByteEnumField	ByteFieldConditionalFieldIntFieldLEShortFieldMayEndMultipleTypeFieldPacketFieldPacketListFieldStrFieldStrFixedLenFieldX3BytesField	XBitField
XByteField	XIntFieldXLE3BytesFieldXLEIntFieldXShortFieldc            	           e Zd Zd Z eddd           eddd           eddd           eddd           eddd          gZd	 Zd
S )FCtrl_DownLinkADRr      	ADRACKReqACKFPendingFOptsLen   c                 
    d|fS N  selfps     ]/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/loraphy2wan.pyextract_paddingzFCtrl_DownLink.extract_padding4       1u    N__name__
__module____qualname__namer   r   fields_descr*   r%   r,   r)   r   r   ,   s        D8E1a((8KA..8E1a((8J1--##J155	7K    r,   r   c            	           e Zd ZdZ eddd           eddd           eddd           eddd           eddd	          gZd
 ZdS )
FCtrl_LinkFCtrl_UpLinkr   r   r   r   r   UpClassB_DownFPendingr    r!   c                 
    d|fS r#   r%   r&   s     r)   r*   zFCtrl_Link.extract_padding@   r+   r,   Nr-   r%   r,   r)   r4   r4   8   s        D8E1a((8KA..8E1a((83Q::##J155	7K    r,   r4   c            	           e Zd Zd Z eddd           eddd           eddd           eddd           eddd          gZd	 Zd
S )r5   r   r   r   r   r   ClassBr    r!   c                 
    d|fS r#   r%   r&   s     r)   r*   zFCtrl_UpLink.extract_paddingL   r+   r,   Nr-   r%   r,   r)   r5   r5   D   s        D8E1a((8KA..8E1a((8Ha++##J155	7K    r,   r5   c                   B    e Zd Zd Z edd           edd          gZdS )DevAddrElemNwkIDr   NwkAddrs      N)r.   r/   r0   r1   r   r   r2   r%   r,   r)   r<   r<   P   s8        D:gs++!>)[99;KKKr,   r<   ResetIndLinkCheckReq
LinkADRReqDutyCycleReqRXParamSetupReqDevStatusReqNewChannelReqRXTimingSetupReqTxParamSetupReqDlChannelReqRekeyIndADRParamSetupReqDeviceTimeReqForceRejoinReqRejoinParamSetupReq)r         r!               	   
                  	ResetConfLinkCheckAns
LinkADRAnsDutyCycleAnsRXParamSetupAnsDevStatusAnsNewChannelAnsRXTimingSetupAnsTxParamSetupAnsDlChannelAns	RekeyConfADRParamSetupAnsDeviceTimeAnsRejoinParamSetupAns)r   rN   rO   r!   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rZ   c                   ,    e Zd Zd Z edd          gZdS )r?   Dev_versionr   Nr.   r/   r0   r1   r   r2   r%   r,   r)   r?   r?   w   s'        D9]A../KKKr,   c                   ,    e Zd Zd Z edd          gZdS )r[   Serv_versionr   Nrk   r%   r,   r)   r[   r[   |   s'        D9^Q//0KKKr,   c                       e Zd Zd ZdS )r@   N)r.   r/   r0   r1   r%   r,   r)   r@   r@      s        DDDr,   c                   B    e Zd Zd Z edd           edd          gZdS )r\   Marginr   GwCntNrk   r%   r,   r)   r\   r\      s8        D9Xq))9Wa((*KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )DataRate_TXPowerDataRater   r!   TXPowerNr.   r/   r0   r1   r   r2   r%   r,   r)   rs   rs      s<        D9ZA..9Y1--/KKKr,   rs   c                   ^    e Zd Zd Z eddd           eddd           eddd          gZdS )	
RedundancyRFUr   r   
ChMaskCntlrO   NbTransr!   Nrv   r%   r,   r)   rx   rx      sM        D9UAq))9\1a009Y1--/KKKr,   rx   c                   0    e Zd Zd Ze edd          egZdS )rA   ChMaskr   N)r.   r/   r0   r1   rs   r   rx   r2   r%   r,   r)   rA   rA      s/        D#;x++KKKr,   c                   v    e Zd Zd Z eddd           eddd           eddd           eddd          gZdS )	LinkADRAns_Statusry   r   rP   PowerACKr   rt   ChannelMaskACKNr.   r/   r0   r1   r   r2   r%   r,   r)   r   r      s_        D8E1a((8J1--8J1--8,a335KKKr,   r   c                   >    e Zd Zd Z ed e            e          gZdS )r]   statusN)r.   r/   r0   r1   r   r   r2   r%   r,   r)   r]   r]      s:        D;x002202 2 3KKKr,   c                   .    e Zd Zd Z eddd          gZdS )DutyCyclePL	MaxDCycler   r!   Nr   r%   r,   r)   r   r      s)        D8KA../KKKr,   r   c                       e Zd Zd ZegZdS )rB   N)r.   r/   r0   r1   r   r2   r%   r,   r)   rB   rB      s        D-KKKr,   c                       e Zd Zd Zg ZdS )r^   Nr.   r/   r0   r1   r2   r%   r,   r)   r^   r^      s        DKKKr,   c                   ^    e Zd Zd Z eddd           eddd           eddd          gZdS )	
DLsettingsOptNegr   r   RX1DRoffsetrO   RX2_Data_rater!   N)r.   r/   r0   r1   r   r   r2   r%   r,   r)   r   r      sM        D8Ha++9]Aq119_a335KKKr,   r   c                   .    e Zd Zd Ze edd          gZdS )rC   	Frequencyr   N)r.   r/   r0   r1   r   r   r2   r%   r,   r)   rC   rC      s,        D<Q//1KKKr,   c                   v    e Zd Zd Z eddd           eddd           eddd           eddd          gZdS )	RXParamSetupAns_Statusry   r   rP   RX1DRoffsetACKr   RX2DatarateACK
ChannelACKNr.   r/   r0   r1   r   r   r2   r%   r,   r)   r   r      s`        #D9UAq))8,a338,a338L!Q//1KKKr,   r   c                       e Zd Zd ZegZdS )r_   N)r.   r/   r0   r1   r   r2   r%   r,   r)   r_   r_      s        D)*KKKr,   z'End-device connected to external sourcezBattery level unknown)r      c                   D    e Zd Zd Z edde           edd          gZdS )rD   Batteryr   rp   N)r.   r/   r0   r1   r   Battery_stater   r2   r%   r,   r)   rD   rD      s:        D =A}==9Xq))+KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )DevStatusAns_Statusry   r   rN   rp   rQ   Nrv   r%   r,   r)   r   r      s<         D9UAq))9Xq!,,.KKKr,   r   c                       e Zd Zd ZegZdS )r`   N)r.   r/   r0   r1   r   r2   r%   r,   r)   r`   r`      s        D&'KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )DrRangeMaxDRr   r!   MinDRNrv   r%   r,   r)   r   r      s<        D9Wa++9Wa++-KKKr,   r   c                   D    e Zd Zd Z edd           edd          egZdS )rE   ChIndexr   FreqN)r.   r/   r0   r1   r   r   r   r2   r%   r,   r)   rE   rE      s;        D9Y**<**KKKr,   c                   ^    e Zd Zd Z eddd           eddd           eddd          gZdS )NewChannelAns_Statusry   r   rQ   Dataraterangeokr   ChannelfrequencyokNr   r%   r,   r)   r   r      sO        !D9UAq))8-q!4480!Q779KKKr,   r   c                       e Zd Zd ZegZdS )ra   N)r.   r/   r0   r1   r   r2   r%   r,   r)   ra   ra      s        D'(KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )RXTimingSetupReq_Settingsry   r   r!   DelNrv   r%   r,   r)   r   r     s<        &D9UAq))9UAq))+KKKr,   r   c                       e Zd Zd ZegZdS )rF   N)r.   r/   r0   r1   r   r2   r%   r,   r)   rF   rF     s        D,-KKKr,   c                       e Zd Zd Zg ZdS )rb   Nr   r%   r,   r)   rb   rb             DKKKr,   z8 dbmr   z10 dbmrN   z12 dbmrO   z13 dbmr!   z14 dbmrP   z16 dbmrQ   z18 dbmrR   z20 dbmrS   z21 dbmrT   z24 dbmrU   z26 dbmrV   z27 dbmrW   z29 dbmrX   z30 dbmrY   z33 dbmrZ   z36 dbmzNo limitz400 ms)r   r   c            	       |    e Zd Zd Z eddd           eddde           eddde           eddde          gZd	S )
EIRP_DwellTimery   r   rN   DownlinkDwellTimer   UplinkDwellTimeMaxEIRPr!   N)	r.   r/   r0   r1   r   r   
DwellTimesMaxEIRPsr2   r%   r,   r)   r   r   -  sg        D8E3**< 3S!ZHH< 13:FF<	61h??AKKKr,   r   c                       e Zd Zd ZegZdS )rG   N)r.   r/   r0   r1   r   r2   r%   r,   r)   rG   rG   5  s        D!"KKKr,   c                       e Zd Zd Zg ZdS )rc   Nr   r%   r,   r)   rc   rc   :  s        DKKKr,   c                   B    e Zd Zd Z edd           edd          gZdS )rH   r   r   r   N)r.   r/   r0   r1   r   r   r2   r%   r,   r)   rH   rH   ?  s8        D9Y**<**,KKKr,   c                   ,    e Zd Zd Z edd          gZdS )rd   Statusr   Nrk   r%   r,   r)   rd   rd   E  s'        D9Xq))*KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )DevLoraWANversionry   r   r!   Minorr   Nr   r%   r,   r)   r   r   J  s<        D8E61--8GVQ//1KKKr,   r   c                   4    e Zd Zd Z edded           gZdS )rI   LoRaWANversionr,   c                     dS Nr   r%   pkts    r)   <lambda>zRekeyInd.<lambda>S  s    Q r,   length_fromN)r.   r/   r0   r1   r   r   r2   r%   r,   r)   rI   rI   P  s>        D"?#3S$,,@ @ @ AKKKr,   c                   ,    e Zd Zd Z edd          gZdS )re   ServerVersionr   Nrk   r%   r,   r)   re   re   V  s'        D9_a001KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )ADRparam	Limit_expr   r!   	Delay_expNr   r%   r,   r)   r   r   [  s<        D8K338K335KKKr,   r   c                       e Zd Zd ZegZdS )rJ   N)r.   r/   r0   r1   r   r2   r%   r,   r)   rJ   rJ   a  s        D*KKKr,   c                       e Zd ZdZg ZdS )rf   rJ   Nr   r%   r,   r)   rf   rf   f  r   r,   c                       e Zd Zd Zg ZdS )rK   Nr   r%   r,   r)   rK   rK   k  s        DKKKr,   c                   B    e Zd Zd Z edd           edd          gZdS )rg   SecondsSinceEpochr   
FracSecondN)r.   r/   r0   r1   r
   r   r2   r%   r,   r)   rg   rg   p  s9        D8/339\4002KKKr,   c            
           e Zd Zd Z eddd           eddd           eddd           eddd           ed	dd           ed
dd          gZdS )rL   ry   r   rN   PeriodrO   Max_RetriesRFU2r   
RejoinTypeDRr!   Nr   r%   r,   r)   rL   rL   v  s        D8E1a((8Ha++8M1a008FAq))8L!Q//8D!Q'')KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )rM   MaxTimeNr   r!   	MaxCountNNr   r%   r,   r)   rM   rM     s<         D8J1--8KA..0KKKr,   c                   F    e Zd Zd Z eddd           eddd          gZdS )rh   ry   r   rR   TimeOKr   Nr   r%   r,   r)   rh   rh     s<         D8E1a((8Ha++-KKKr,   c                   @   e Zd Zd Z edde           e edded           d            e edde	d	           d
            e edde
d           d            e edded           d            e edded           d            e edded           d            e edded           d            e edded           d            e edded           d            e ed ded!           d"            e ed#ded$           d%            e ed&ded'           d(            e ed)ded*           d+            e ed,ded-           d.            e ed/ded0           d1           gZd2 Zd3S )4MACCommand_upCIDr   Resetr,   c                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>      1 r,   r   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_up.<lambda>      4 r,   	LinkCheckc                     dS Nr   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrN   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   LinkADRc                     dS Nr!   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrO   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   	DutyCyclec                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   RXParamSetupc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrP   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   	DevStatusc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrQ   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   
NewChannelc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrR   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   RXTimingSetupc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrS   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   TxParamSetupc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrT   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   	DlChannelc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrU   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   Rekeyc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrV   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   ADRParamSetupc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrW   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   
DeviceTimec                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrX   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   ForceRejoinc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrY   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   RejoinParamSetupc                     dS r   r%   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                     | j         dk    S NrZ   r   r   s    r)   r   zMACCommand_up.<lambda>  r   r,   c                 
    d|fS r#   r%   r&   s     r)   r*   zMACCommand_up.extract_padding  r+   r,   N)r.   r/   r0   r1   r   CIDs_upr	   r   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r2   r*   r%   r,   r)   r   r     s       D =733##OOGS4<@L%N %N %N %A$@B B $#OOK4@@L%N %N %N %A$@B B $#OOIs4>@L%N %N %N %A$@B B $#OOK4@@L%N %N %N %A$@B B $#OONC4C@L%N %N %N %A$@B B $#OOK4@@L%N %N %N %A$@B B $#OOL#4A@L%N %N %N %A$@B B $#OOOS4D@L%N %N %N %A$@B B
 $#OONC4C@L%N %N %N %A$@B B $#OOK4@@L%N %N %N %A$@B B $#OOGS4<@L%N %N %N %A$@B B $#OOOS4D@L%N %N %N %A$@B B $#OOL#4A@L%N %N %N %A$@B B $#OOM34B@L%N %N %N %A$@B B $#OO4F4G@L%N %N %N %A$@B Bu=CK@    r,   r   c                      e Zd Zd Z edde           e edded           d            e edde	d	           d
            e edde
d           d            e edded           d            e edded           d            e edded           d            e edded           d            e edded           d            e edded           d            e ed ded!           d"            e ed#ded$           d%            e ed&ded'           d(            e ed)ded*           d+            e ed,ded-           d.           gZd/S )0MACCommand_downr   r   r   r,   c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r   c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r   c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r   c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r   c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r`   c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r   r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r   c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r  c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r  c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r
  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r  c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r  c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r  c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r  c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>
  r   r,   c                     | j         dk    S r  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   r  c                     dS r   r%   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   c                     | j         dk    S r"  r   r   s    r)   r   zMACCommand_down.<lambda>  r   r,   N)r.   r/   r0   r1   r   r$  r	   r   r[   r\   r]   r^   r_   ra   rb   rc   rd   re   rf   rg   rh   r2   r%   r,   r)   r&  r&    s       D =733##OOGS4=@L%N %N %N %A$@B B $#OOK4@@L%N %N %N %A$@B B $#OOIs4>@L%N %N %N %A$@B B $#OOK4@@L%N %N %N %A$@B B $#OONC4C@L%N %N %N %A$@B B $#OONC4C@L%N %N %N %A$@B B $#OOL#4A@L%N %N %N %A$@B B $#OOOS4D@L%N %N %N %A$@B B $#OONC4C@L%N %N %N %A$@B B $#OOK4@@L%N %N %N %A$@B B $#OOGS4=@L%N %N %N %A$@B B $#OOOS4D@L%N %N %N %A$@B B $#OOL#4A@L%N %N %N %A$@B B $#OO4F4G@L%N %N %N %A$@B Bk8CKKKr,   r&  c            	       ~    e Zd Zd Z e edded           d            e edded           d           gZd	S )
FOptsFOpts_upr,   c                 &    | j         d         j        S r   FCtrlr    r   s    r)   r   zFOpts.<lambda>      39UV<K` r,   r   c                 `    | j         d         j        dk    o| j        dz  dk    o
| j        dk    S )Nr   r   rN   rH  r    MTyper   s    r)   r   zFOpts.<lambda>  ;    	!0E0I 1C03	C10D1C03	U0B r,   
FOpts_downc                 &    | j         d         j        S r   rG  r   s    r)   r   zFOpts.<lambda>  rI  r,   c                 `    | j         d         j        dk    o| j        dz  dk    o
| j        dk    S )Nr   r   rP   rK  r   s    r)   r   zFOpts.<lambda>  rM  r,   N)	r.   r/   r0   r1   r	   r   r   r&  r2   r%   r,   r)   rD  rD    s        D##OOJ4A@`@`%b %b %b%D %D	E E $#OOL#4C@`@`%b %b %b%D %D	E EFKKKr,   rD  c                     	 | j         d         j        dk    r)| j        dz  dk    r| j        dk    r| j        dz  dk    rdS dS # t          $ r Y dS w xY w)Nr   r   rP   TFrH  r    rL  	Exceptionr   s    r)   FOptsDownShowrT  $  x    9Q< 1$$SA)=)=#)uBTBTZ]ZcfkZknoZoZo4u   uu   =A 
AAc                     	 | j         d         j        dk    r)| j        dz  dk    r| j        dk    r| j        dz  dk    rdS dS # t          $ r Y dS w xY w)Nr   r   rN   rQ   TFrR  r   s    r)   FOptsUpShowrX  -  rU  rV  c                      e Zd Zd Z e edded           d            e edded           d            e ed	d
          d            e edde	d           e
           e edded           e          gZdS )FHDRDevAddrr,   c                     dS r   r%   r   s    r)   r   zFHDR.<lambda>9  r   r,   r   c                 .    | j         dk    o
| j         dk    S NrN   rP   rL  r   s    r)   r   zFHDR.<lambda>:       	U0B 1C03	U0B r,   rH  c                     dS r   r%   r   s    r)   r   zFHDR.<lambda>>  r   r,   c                     | j         dz  dk    r| j         dk    r| j         dz  dk    p| j         dz  dk    o
| j         dk    S )Nr   rP   rN   r   r_  r   s    r)   r   zFHDR.<lambda>?  s_    SA1E 2G03	U0B2G14T1AA1E1D 25SA1E 2C03	U0B	 r,   FCntr   c                 .    | j         dk    o
| j         dk    S r^  r_  r   s    r)   r   zFHDR.<lambda>E  r`  r,   rE  c                 &    | j         d         j        S r   rG  r   s    r)   r   zFHDR.<lambda>I  rI  r,   rN  c                 &    | j         d         j        S r   rG  r   s    r)   r   zFHDR.<lambda>M  rI  r,   N)r.   r/   r0   r1   r	   r   r<   r4   r   r   rX  r&  rT  r2   r%   r,   r)   rZ  rZ  6  s=       D##OOIsK@L%N %N %N%D %DE E $#OOGS4>@L%N %N %N%E %EF F $#LL$;$;%D %DE E $#OOJ4A@`@`%b %b %b %01 1 $#OOL#4C@`@`%b %b %b %23 3'4KKKr,   rZ  NwkSKeyzJoin-requestzRejoin-request type 0zRejoin-request type 1zRejoin-request type 2)r   r   r   rN   c                   \    e Zd Zd Z eddd           eddd           edd          gZdS )Join_RequestAppEUI           rS   DevEUIDevNoncer   N)r.   r/   r0   r1   r   r   r2   r%   r,   r)   ri  ri  Z  sM        D##Hk1==##Hj!<<<
F335KKKr,   ri  c                        e Zd Zd ZdZ edd           edd           edd          e edd           e	 e
ddd	          d
           gZd Zd fd	Z xZS )Join_AcceptFJoinAppNoncer   NetIDr[  RxDelayCFLists                      c                     t           j        du S )NT)ro  dcflistr   s    r)   r   zJoin_Accept.<lambda>j  s    0Ct0K r,   c                 
    d|fS r#   r%   r&   s     r)   r*   zJoin_Accept.extract_paddingl  r+   r,   r$   c                     t          |          dk    rdt          _        t          t          |                               |           d S )N   T)lenro  rv  super__init__)r'   packet	__class__s     r)   r|  zJoin_Accept.__init__o  s@    v;;"&Kk4  ))&11111r,   )r$   )r.   r/   r0   r1   rv  r   r   r   r   r	   r   r2   r*   r|  __classcell__)r~  s   @r)   ro  ro  a  s        DG!>.!44!>'1--;y!,,:i++##$4$4X|R$P$P$L$LN NOK  2 2 2 2 2 2 2 2 2 2r,   ro  zNetID+DevEUIzJoinEUI+DevEUI)r   r   rN   c                   n    e Zd Zd Z edd           edd           edd           edd          gZdS )	RejoinReqTyper   rq  rl  rk  RJcount0N)	r.   r/   r0   r1   r   r   r   r   r2   r%   r,   r)   r  r  z  sW        D9VQ''<++##Hk::;z1--/KKKr,   r  c                 f    | j         dk    s| j         dk    rdS | j         dk    s| j         dk    rdS d S )NrP   rO   r   r!   rN   r   r_  r   s    r)   dpload_typer    sC    	Uci500q
)u

	U 2 2q4r,   DataPayloadr$   remainc                 (    t          |           dk    S r   r  r   s    r)   r   r         S!1!1Q!6 r,   c                 (    t          |           dk    S r   r  r   s    r)   r   r     r  r,   c                   "   e Zd Zd Z e ee eddd                    d            e edde	d 	          d
            e edde
d           d            e edd          d            e edded 	          d           gZdS )
FRMPayloadr  r$   r!   r  c                 $    t          |           d uS )Nr  r   s    r)   r   zFRMPayload.<lambda>  s    C0@0@0L r,   Join_Request_Fieldr,   c                     dS )Nry  r%   r   s    r)   r   zFRMPayload.<lambda>      2 r,   r   c                     | j         dk    S r   r_  r   s    r)   r   zFRMPayload.<lambda>      	U0B r,   Join_Accept_Fieldc                     dS r   r%   r   s    r)   r   zFRMPayload.<lambda>  s    ! r,   )
count_fromc                 4    | j         dk    ot          j        du S Nr   FrL  LoRa	encryptedr   s    r)   r   zFRMPayload.<lambda>  s     	U0B 1H04%0G r,   Join_Accept_Encryptedr   c                 4    | j         dk    ot          j        du S )Nr   Tr  r   s    r)   r   zFRMPayload.<lambda>  s    	U0B0]t~Y]G] r,   ReJoin_Request_Fieldc                     dS r  r%   r   s    r)   r   zFRMPayload.<lambda>  r  r,   c                     | j         dk    S r  r_  r   s    r)   r   zFRMPayload.<lambda>  r  r,   N)r.   r/   r0   r1   r	   r   datapayload_listr   r   ri  ro  r  r2   r%   r,   r)   r  r    sS       D##$5$56F6>h}?A!7M 7M 7M%N %N %N$MO O $#OO4H#4@@M%O %O %O %D$CE E $#OO4G4??K|%M %M %M%I %IJ J
 $#HH-Da$H$H$^$^` `##OO4JC4=@M%O %O %O %D$CE EFKKKr,   r  c                   L    e Zd Zd ZdZe e edde          d           e	gZ
dS )
MACPayloadFFPortr   c                 Z    | j         dk    o | j         dk    o| j        d         j        dk    S )NrN   rP   r   )rL  rH  r    r   s    r)   r   zMACPayload.<lambda>  s7    	U0B 1K03	U0B1K03	!0E0J r,   N)r.   r/   r0   r1   eFPortrZ  r	   r   FPortsr  r2   r%   r,   r)   r  r    sU        DF##MM'1f$E$E%L %LM M KKKr,   r  zJoin-acceptzUnconfirmed Data UpzUnconfirmed Data DownzConfirmed Data UpzConfirmed Data DownzRejoin-requestProprietary)r   r   rN   rO   r!   rP   rQ   rR   c                   `    e Zd Zd Z eddde           eddd           eddd          gZdS )MHDRrL  r   rO   ry   MajorrN   N)r.   r/   r0   r1   r   MTypesr   r2   r%   r,   r)   r  r    sO        D<6::8E5!,,8GT1--/KKKr,   r  c            
       X    e Zd Zd Zee e e edd          d                     gZ	dS )
PHYPayloadMICr   c                 4    | j         dk    pt          j        du S r  r  r   s    r)   r   zPHYPayload.<lambda>  s     	U8J 9P8<%8O r,   N)
r.   r/   r0   r1   r  r  r   r	   r   r2   r%   r,   r)   r  r    s^        D6**99UA+>+>,Q ,QR R S STKKKr,   r  c            
           e Zd Zd ZdZdZ eddd           eddd           eddd          e e e	d	d          d
           gZ
dS )r  z1.1TPreambler   r!   PHDRrt  PHDR_CRCCRCc                     | j         dz  dk    S )Nr   r   r_  r   s    r)   r   zLoRa.<lambda>  s    	C10D r,   N)r.   r/   r0   r1   versionr  r   r  r	   r   r2   r%   r,   r)   r  r    s        DGI9ZA..9VQ++9ZA..##KKq$9$9$E$EG G	HKKKr,   r  N)`__doc__scapy.packetr   scapy.fieldsr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r5   r<   r$  	CIDs_downr?   r[   r@   r\   rs   rx   rA   r   r]   r   rB   r^   r   rC   r   r_   r   rD   r   r`   r   rE   r   ra   r   rF   rb   r   r   r   rG   rc   rH   rd   r   rI   re   r   rJ   rf   rK   rg   rL   rM   rh   r   r&  rD  rT  rX  rZ  r  JoinReqTypesri  ro  r   r  r  r  r  r  r  r  r  r  r%   r,   r)   <module>r     s                                                       2	 	 	 	 	V 	 	 		 	 	 	 	 	 	 		 	 	 	 	6 	 	 	; ; ; ; ;& ; ; ; " #"# !&( (" !!$!"%$!%"(* *	 0 0 0 0 0v 0 0 0
1 1 1 1 1 1 1 1
    6   * * * * *6 * * */ / / / /v / / // / / / / / / /       5 5 5 5 5 5 5 53 3 3 3 3 3 3 30 0 0 0 0& 0 0 0
         6      
    6   
5 5 5 5 5 5 5 51 1 1 1 1f 1 1 11 1 1 1 1V 1 1 1+ + + + +f + + +
 >-/ /+ + + + +6 + + +. . . . .& . . .( ( ( ( (6 ( ( (
- - - - -f - - -    F   9 9 9 9 96 9 9 9) ) ) ) )F ) ) )
+ + + + + + + +. . . . .v . . .
    v   Aw xx x x	
 x x x x x      $  
A A A A AV A A A# # # # #f # # #
    f   
, , , , ,6 , , ,+ + + + +6 + + +
1 1 1 1 1 1 1 1A A A A Av A A A2 2 2 2 2 2 2 2
5 5 5 5 5v 5 5 5    v   
    v   
    F   
2 2 2 2 2F 2 2 2) ) ) ) )V ) ) )0 0 0 0 0& 0 0 0- - - - -& - - -C C C C CF C C CL:C :C :C :C :Cf :C :C :CzF F F F FF F F F$    4 4 4 4 46 4 4 46 Y %---/ /5 5 5 5 56 5 5 52 2 2 2 2& 2 2 2(  !! !

/ / / / / / / /   XmR:::779XmR:::779: F F F F F F F F.         &($&!
  
 / / / / /6 / / /T T T T T T T T
H 
H 
H 
H 
H6 
H 
H 
H 
H 
Hr,   