a
    kÄ#dj  ã                   @   s  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 G dd„ deƒZG dd„ deƒZG dd	„ d	eƒZG d
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„ deƒZG d,d„ deƒZG d-d„ deƒZ G d.d„ deƒZ!G d/d0„ d0eƒZ"G d1d2„ d2eƒZ#G d3d„ deƒZ$G d4d5„ d5eƒZ%G d6d„ deƒZ&G d7d8„ d8eƒZ'G d9d„ deƒZ(G d:d„ deƒZ)G d;d<„ d<eƒZ*G d=d„ deƒZ+G d>d?„ d?eƒZ,G d@d „ d eƒZ-dAdBdCœZ.G dDd„ deƒZ/G dEdF„ dFeƒZ0G dGd!„ d!eƒZ1G dHdI„ dIeƒZ2G dJd„ deƒZ3G dKdL„ dLeƒZ4G dMd"„ d"eƒZ5G dNdO„ dOeƒZ6G dPd„ deƒZ7G dQd#„ d#eƒZ8dRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbœZ9dcdddeœZ:G dfdg„ dgeƒZ;G dhd„ deƒZ<G did$„ d$eƒZ=G djd„ deƒZ>G dkd%„ d%eƒZ?G dldm„ dmeƒZ@G dnd„ deƒZAG dod&„ d&eƒZBG dpdq„ dqeƒZCG drd„ deƒZDG dsd'„ d'eƒZEG dtd„ deƒZFG dud(„ d(eƒZGG dvd„ deƒZHG dwd„ deƒZIG dxd)„ d)eƒZJG dydz„ dzeƒZKG d{d|„ d|eƒZLG d}d~„ d~eƒZMdd€„ ZNd�d‚„ ZOG dƒd„„ d„eƒZPdd…iZQd†d‡dˆd‰dŠœZRG d‹dŒ„ dŒeƒZSG d�dŽ„ dŽeƒZTd�d�d�d‘œZUG d’d“„ d“eƒZVd”d•„ ZWed–d—d˜d™�dšd›„ fed–d—dœd™�d�d›„ fgZXG dždŸ„ dŸeƒZYG d d¡„ d¡eƒZZd†d¢d£d¤d¥d¦d§d¨d©œZ[G dªd«„ d«eƒZ\G d¬d­„ d­eƒZ]G d®d¯„ d¯eƒZ^d°S )±zx
LoRa PHY to WAN Layer

Initially developed @PentHertz
and improved at @Trend Micro

Spec: lorawantm_specification v1.1
é    )ÚPacket)ÚBitFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚIntFieldÚLEShortFieldÚPacketListFieldÚStrFixedLenFieldÚX3BytesFieldÚ
XByteFieldÚ	XIntFieldÚXShortFieldÚBitFieldLenFieldÚLEX3BytesFieldÚ	XBitFieldÚBitEnumFieldÚXLEIntFieldÚStrFieldÚPacketFieldÚMultipleTypeFieldc                   @   sN   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	d
„ ZdS )ÚFCtrl_DownLinkÚADRr   é   Ú	ADRACKReqÚACKZFPendingÚFOptsLené   c                 C   s   d|fS ©NÚ © ©ÚselfÚpr    r    úP/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/loraphy2wan.pyÚextract_padding#   s    zFCtrl_DownLink.extract_paddingN©Ú__name__Ú
__module__Ú__qualname__Únamer   r   Úfields_descr%   r    r    r    r$   r      s   




ür   c                   @   sN   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
d„ ZdS )Ú
FCtrl_LinkÚFCtrl_UpLinkr   r   r   r   r   ZUpClassB_DownFPendingr   r   c                 C   s   d|fS r   r    r!   r    r    r$   r%   /   s    zFCtrl_Link.extract_paddingNr&   r    r    r    r$   r,   '   s   




ür,   c                   @   sN   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	d
„ ZdS )r-   r   r   r   r   r   ZClassBr   r   c                 C   s   d|fS r   r    r!   r    r    r$   r%   ;   s    zFCtrl_UpLink.extract_paddingNr&   r    r    r    r$   r-   3   s   




ür-   c                   @   s$   e Zd Zd ZeddƒeddƒgZdS )ÚDevAddrElemZNwkIDr   ZNwkAddrs      N)r'   r(   r)   r*   r   r   r+   r    r    r    r$   r.   ?   s   ÿ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   r>   r?   r   r@   rA   rB   rC   rD   rE   rF   rG   rH   rJ   c                   @   s   e Zd Zd ZeddƒgZdS )r/   ZDev_versionr   N©r'   r(   r)   r*   r   r+   r    r    r    r$   r/   f   s   c                   @   s   e Zd Zd ZeddƒgZdS )rK   ZServ_versionr   NrY   r    r    r    r$   rK   k   s   c                   @   s   e Zd Zd ZdS )r0   N)r'   r(   r)   r*   r    r    r    r$   r0   p   s   c                   @   s$   e Zd Zd ZeddƒeddƒgZdS )rL   ÚMarginr   ZGwCntNrY   r    r    r    r$   rL   t   s   ÿc                   @   s(   e Zd Zd ZedddƒedddƒgZdS )ÚDataRate_TXPowerÚDataRater   r   ZTXPowerN©r'   r(   r)   r*   r   r+   r    r    r    r$   r[   z   s   

ÿr[   c                   @   s2   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   Z
ChMaskCntlr?   ZNbTransr   Nr]   r    r    r    r$   r^   €   s
   


þr^   c                   @   s    e Zd Zd ZeeddƒegZdS )r1   ZChMaskr   N)r'   r(   r)   r*   r[   r   r^   r+   r    r    r    r$   r1   ‡   s
   þc                   @   s<   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_Statusr_   r   r@   ZPowerACKr   r\   ZChannelMaskACKN©r'   r(   r)   r*   r   r+   r    r    r    r$   r`   Ž   s   



ýr`   c                   @   s    e Zd Zd Zedeƒ eƒgZdS )rM   ÚstatusN)r'   r(   r)   r*   r   r`   r+   r    r    r    r$   rM   –   s
   þc                   @   s   e Zd Zd ZedddƒgZdS )ÚDutyCyclePLZ	MaxDCycler   r   Nra   r    r    r    r$   rc   �   s   rc   c                   @   s   e Zd Zd ZegZdS )r2   N)r'   r(   r)   r*   rc   r+   r    r    r    r$   r2   ¢   s   c                   @   s   e Zd Zd Zg ZdS )rN   N©r'   r(   r)   r*   r+   r    r    r    r$   rN   §   s   c                   @   s2   e Zd Zd ZedddƒedddƒedddƒgZdS )	Ú
DLsettingsZOptNegr   r   ZRX1DRoffsetr?   ZRX2_Data_rater   N)r'   r(   r)   r*   r   r   r+   r    r    r    r$   re   ¬   s
   


þre   c                   @   s   e Zd Zd ZeeddƒgZdS )r3   Z	Frequencyr   N)r'   r(   r)   r*   re   r   r+   r    r    r    r$   r3   ³   s   ÿc                   @   s<   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_Statusr_   r   r@   ZRX1DRoffsetACKr   ZRX2DatarateACKZ
ChannelACKN©r'   r(   r)   r*   r   r   r+   r    r    r    r$   rf   ¹   s   



ýrf   c                   @   s   e Zd Zd ZegZdS )rO   N)r'   r(   r)   r*   rf   r+   r    r    r    r$   rO   Á   s   z'End-device connected to external sourcezBattery level unknown)r   éÿ   c                   @   s&   e Zd Zd ZeddeƒeddƒgZdS )r4   ZBatteryr   rZ   N)r'   r(   r)   r*   r   ÚBattery_stater   r+   r    r    r    r$   r4   Ê   s   
ÿc                   @   s(   e Zd Zd ZedddƒedddƒgZdS )ÚDevStatusAns_Statusr_   r   r>   rZ   rA   Nr]   r    r    r    r$   rj   Ð   s   

ÿrj   c                   @   s   e Zd Zd ZegZdS )rP   N)r'   r(   r)   r*   rj   r+   r    r    r    r$   rP   Ö   s   c                   @   s(   e Zd Zd ZedddƒedddƒgZdS )ÚDrRangeZMaxDRr   r   ZMinDRNr]   r    r    r    r$   rk   Û   s   

ÿrk   c                   @   s&   e Zd Zd ZeddƒeddƒegZdS )r5   ÚChIndexr   ÚFreqN)r'   r(   r)   r*   r   r   rk   r+   r    r    r    r$   r5   á   s
   þc                   @   s2   e Zd Zd ZedddƒedddƒedddƒgZdS )ÚNewChannelAns_Statusr_   r   rA   ZDataraterangeokr   ZChannelfrequencyokNrg   r    r    r    r$   rn   è   s
   


þrn   c                   @   s   e Zd Zd ZegZdS )rQ   N)r'   r(   r)   r*   rn   r+   r    r    r    r$   rQ   ï   s   c                   @   s(   e Zd Zd ZedddƒedddƒgZdS )ÚRXTimingSetupReq_Settingsr_   r   r   ÚDelNr]   r    r    r    r$   ro   ô   s   

ÿro   c                   @   s   e Zd Zd ZegZdS )r6   N)r'   r(   r)   r*   ro   r+   r    r    r    r$   r6   ú   s   c                   @   s   e Zd Zd Zg ZdS )rR   Nrd   r    r    r    r$   rR   ÿ   s   z8 dbmz10 dbmz12 dbmz13 dbmz14 dbmz16 dbmz18 dbmz20 dbmz21 dbmz24 dbmz26 dbmz27 dbmz29 dbmz30 dbmz33 dbmz36 dbm)r   r   r>   r?   r   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   zNo limitz400 ms)r   r   c                   @   sB   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_DwellTimer_   r   r>   ZDownlinkDwellTimer   ZUplinkDwellTimeZMaxEIRPr   N)	r'   r(   r)   r*   r   r   Ú
DwellTimesÚMaxEIRPsr+   r    r    r    r$   rq     s   
ýrq   c                   @   s   e Zd Zd ZegZdS )r7   N)r'   r(   r)   r*   rq   r+   r    r    r    r$   r7   $  s   c                   @   s   e Zd Zd Zg ZdS )rS   Nrd   r    r    r    r$   rS   )  s   c                   @   s$   e Zd Zd ZeddƒeddƒgZdS )r8   rl   r   rm   N)r'   r(   r)   r*   r   r   r+   r    r    r    r$   r8   .  s   ÿc                   @   s   e Zd Zd ZeddƒgZdS )rT   ÚStatusr   NrY   r    r    r    r$   rT   4  s   c                   @   s(   e Zd Zd ZedddƒedddƒgZdS )ÚDevLoraWANversionr_   r   r   ZMinorr   Nra   r    r    r    r$   ru   9  s   

ÿru   c                   @   s&   e Zd Zd Zeddedd„ d�gZdS )r9   ZLoRaWANversionó    c                 C   s   dS ©Nr   r    ©Zpktr    r    r$   Ú<lambda>B  rv   zRekeyInd.<lambda>©Zlength_fromN)r'   r(   r)   r*   r	   ru   r+   r    r    r    r$   r9   ?  s   ÿc                   @   s   e Zd Zd ZeddƒgZdS )rU   ZServerVersionr   NrY   r    r    r    r$   rU   E  s   c                   @   s(   e Zd Zd ZedddƒedddƒgZdS )ÚADRparamZ	Limit_expr   r   Z	Delay_expNra   r    r    r    r$   r{   J  s   

ÿr{   c                   @   s   e Zd Zd ZegZdS )r:   N)r'   r(   r)   r*   r{   r+   r    r    r    r$   r:   P  s   c                   @   s   e Zd ZdZg ZdS )rV   r:   Nrd   r    r    r    r$   rV   U  s   c                   @   s   e Zd Zd Zg ZdS )r;   Nrd   r    r    r    r$   r;   Z  s   c                   @   s$   e Zd Zd ZeddƒeddƒgZdS )rW   ZSecondsSinceEpochr   Z
FracSecondN)r'   r(   r)   r*   r   r   r+   r    r    r    r$   rW   _  s   ÿc                	   @   sP   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 )r<   r_   r   r>   ZPeriodr?   ZMax_RetriesZRFU2r   Ú
RejoinTypeZDRr   Nra   r    r    r    r$   r<   e  s   





ûc                   @   s(   e Zd Zd ZedddƒedddƒgZdS )r=   ZMaxTimeNr   r   Z	MaxCountNNra   r    r    r    r$   r=   o  s   

ÿc                   @   s(   e Zd Zd ZedddƒedddƒgZdS )rX   r_   r   rB   ZTimeOKr   Nra   r    r    r    r$   rX   u  s   

ÿc                   @   sÊ  e Zd Zd Zeddeƒeeddedd„ d�dd„ ƒeed	de	d
d„ d�dd„ ƒeedde
dd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�d d„ ƒeed!ded"d„ d�d#d„ ƒeed$ded%d„ d�d&d„ ƒeed'ded(d„ d�d)d„ ƒeed*ded+d„ d�d,d„ ƒeed-ded.d„ d�d/d„ ƒeed0ded1d„ d�d2d„ ƒgZd3d4„ Zd5S )6ÚMACCommand_upÚCIDr   ÚResetrv   c                 C   s   dS rw   r    rx   r    r    r$   ry   ƒ  rv   zMACCommand_up.<lambda>rz   c                 C   s
   | j dkS rw   ©r~   rx   r    r    r$   ry   „  rv   Ú	LinkCheckc                 C   s   dS ©Nr   r    rx   r    r    r$   ry   ‡  rv   c                 C   s
   | j dkS ©Nr>   r€   rx   r    r    r$   ry   ˆ  rv   ÚLinkADRc                 C   s   dS ©Nr   r    rx   r    r    r$   ry   ‹  rv   c                 C   s
   | j dkS ©Nr?   r€   rx   r    r    r$   ry   Œ  rv   Ú	DutyCyclec                 C   s   dS r…   r    rx   r    r    r$   ry   �  rv   c                 C   s
   | j dkS r…   r€   rx   r    r    r$   ry   �  rv   ÚRXParamSetupc                 C   s   dS r…   r    rx   r    r    r$   ry   “  rv   c                 C   s
   | j dkS ©Nr@   r€   rx   r    r    r$   ry   ”  rv   Z	DevStatusc                 C   s   dS rƒ   r    rx   r    r    r$   ry   —  rv   c                 C   s
   | j dkS ©NrA   r€   rx   r    r    r$   ry   ˜  rv   Ú
NewChannelc                 C   s   dS r‰   r    rx   r    r    r$   ry   ›  rv   c                 C   s
   | j dkS ©NrB   r€   rx   r    r    r$   ry   œ  rv   ÚRXTimingSetupc                 C   s   dS rw   r    rx   r    r    r$   ry   Ÿ  rv   c                 C   s
   | j dkS ©NrC   r€   rx   r    r    r$   ry      rv   ÚTxParamSetupc                 C   s   dS rw   r    rx   r    r    r$   ry   ¤  rv   c                 C   s
   | j dkS ©NrD   r€   rx   r    r    r$   ry   ¥  rv   Ú	DlChannelc                 C   s   dS r…   r    rx   r    r    r$   ry   ¨  rv   c                 C   s
   | j dkS ©NrE   r€   rx   r    r    r$   ry   ©  rv   ÚRekeyc                 C   s   dS rw   r    rx   r    r    r$   ry   ¬  rv   c                 C   s
   | j dkS ©NrF   r€   rx   r    r    r$   ry   ­  rv   ÚADRParamSetupc                 C   s   dS rw   r    rx   r    r    r$   ry   °  rv   c                 C   s
   | j dkS ©NrG   r€   rx   r    r    r$   ry   ±  rv   Ú
DeviceTimec                 C   s   dS r‚   r    rx   r    r    r$   ry   ´  rv   c                 C   s
   | j dkS ©NrH   r€   rx   r    r    r$   ry   µ  rv   ZForceRejoinc                 C   s   dS rƒ   r    rx   r    r    r$   ry   ¸  rv   c                 C   s
   | j dkS ©NrI   r€   rx   r    r    r$   ry   ¹  rv   ÚRejoinParamSetupc                 C   s   dS rw   r    rx   r    r    r$   ry   ¼  rv   c                 C   s
   | j dkS ©NrJ   r€   rx   r    r    r$   ry   ½  rv   c                 C   s   d|fS r   r    r!   r    r    r$   r%   À  s    zMACCommand_up.extract_paddingN)r'   r(   r)   r*   r   ÚCIDs_upr   r	   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r+   r%   r    r    r    r$   r}   ~  s¼   
þýþýþýþýþýþýþýþýþýþýþýþýþýþýþýÆ@r}   c                   @   s¦  e Zd Zd Zeddeƒeeddedd„ d�dd„ ƒeed	de	d
d„ d�dd„ ƒeedde
dd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�dd„ ƒeeddedd„ d�d d„ ƒeed!ded"d„ d�d#d„ ƒeed$ded%d„ d�d&d„ ƒeed'ded(d„ d�d)d„ ƒeed*ded+d„ d�d,d„ ƒeed-ded.d„ d�d/d„ ƒgZd0S )1ÚMACCommand_downr~   r   r   rv   c                 C   s   dS rw   r    rx   r    r    r$   ry   É  rv   zMACCommand_down.<lambda>rz   c                 C   s
   | j dkS rw   r€   rx   r    r    r$   ry   Ê  rv   r�   c                 C   s   dS rƒ   r    rx   r    r    r$   ry   Í  rv   c                 C   s
   | j dkS rƒ   r€   rx   r    r    r$   ry   Î  rv   r„   c                 C   s   dS r‚   r    rx   r    r    r$   ry   Ñ  rv   c                 C   s
   | j dkS r†   r€   rx   r    r    r$   ry   Ò  rv   r‡   c                 C   s   dS r…   r    rx   r    r    r$   ry   Õ  rv   c                 C   s
   | j dkS r…   r€   rx   r    r    r$   ry   Ö  rv   rˆ   c                 C   s   dS rw   r    rx   r    r    r$   ry   Ù  rv   c                 C   s
   | j dkS r‰   r€   rx   r    r    r$   ry   Ú  rv   rP   c                 C   s   dS rw   r    rx   r    r    r$   ry   Ý  rv   c                 C   s
   | j dkS rŠ   r€   rx   r    r    r$   ry   Þ  rv   r‹   c                 C   s   dS rw   r    rx   r    r    r$   ry   á  rv   c                 C   s
   | j dkS rŒ   r€   rx   r    r    r$   ry   â  rv   r�   c                 C   s   dS r‚   r    rx   r    r    r$   ry   å  rv   c                 C   s
   | j dkS rŽ   r€   rx   r    r    r$   ry   æ  rv   r�   c                 C   s   dS r‚   r    rx   r    r    r$   ry   é  rv   c                 C   s
   | j dkS r�   r€   rx   r    r    r$   ry   ê  rv   r‘   c                 C   s   dS rw   r    rx   r    r    r$   ry   í  rv   c                 C   s
   | j dkS r’   r€   rx   r    r    r$   ry   î  rv   r“   c                 C   s   dS rw   r    rx   r    r    r$   ry   ñ  rv   c                 C   s
   | j dkS r”   r€   rx   r    r    r$   ry   ò  rv   r•   c                 C   s   dS r‚   r    rx   r    r    r$   ry   õ  rv   c                 C   s
   | j dkS r–   r€   rx   r    r    r$   ry   ö  rv   r—   c                 C   s   dS r‰   r    rx   r    r    r$   ry   ù  rv   c                 C   s
   | j dkS r˜   r€   rx   r    r    r$   ry   ú  rv   rš   c                 C   s   dS rw   r    rx   r    r    r$   ry   ý  rv   c                 C   s
   | j dkS r›   r€   rx   r    r    r$   ry   þ  rv   N)r'   r(   r)   r*   r   rœ   r   r	   rK   rL   rM   rN   rO   rQ   rR   rS   rT   rU   rV   rW   rX   r+   r    r    r    r$   r�   Ä  s®   
þýþýþýþýþýþýþýþýþýþýþýþýþýþýËr�   c                   @   sL   e Zd Zd Zeeddedd„ d�dd„ ƒeeddedd„ d�d	d„ ƒgZd
S )ÚFOptsÚFOpts_uprv   c                 C   s   | j d jS r‚   ©ÚFCtrlr   rx   r    r    r$   ry     rv   zFOpts.<lambda>rz   c                 C   s(   | j d jdko&| jd@ dko&| jdkS )Nr   r   r>   ©r¡   r   ÚMTyperx   r    r    r$   ry     s   ÿÚ
FOpts_downc                 C   s   | j d jS r‚   r    rx   r    r    r$   ry     rv   c                 C   s(   | j d jdko&| jd@ dko&| jdkS )Nr   r   r@   r¢   rx   r    r    r$   ry     s   ÿN)	r'   r(   r)   r*   r   r	   r}   r�   r+   r    r    r    r$   rž     s   ýüýüùrž   c                 C   s\   zB| j d jdkr>| jd@ dkr>| jdkr>| jd@ dkr>W dS W dS  tyV   Y dS 0 d S )Nr   r   r@   TF©r¡   r   r£   Ú	Exceptionrx   r    r    r$   ÚFOptsDownShow  s    6r§   c                 C   s\   zB| j d jdkr>| jd@ dkr>| jdkr>| jd@ dkr>W dS W dS  tyV   Y dS 0 d S )Nr   r   r>   rA   TFr¥   rx   r    r    r$   ÚFOptsUpShow  s    6r¨   c                   @   sŽ   e Zd Zd Zeeddedd„ d�dd„ ƒeeddedd„ d�d	d„ ƒeed
dƒdd„ ƒeedde	dd„ d�e
ƒeeddedd„ d�eƒgZdS )ÚFHDRÚDevAddrrv   c                 C   s   dS r…   r    rx   r    r    r$   ry   (  rv   zFHDR.<lambda>rz   c                 C   s   | j dko| j dkS ©Nr>   r@   ©r£   rx   r    r    r$   ry   )  s   
r¡   c                 C   s   dS rw   r    rx   r    r    r$   ry   -  rv   c                 C   s>   | j d@ dkr&| j dkr&| j d@ dkp<| j d@ dko<| j dkS )Nr   r@   r>   r   r¬   rx   r    r    r$   ry   .  s   ÿþZFCntr   c                 C   s   | j dko| j dkS r«   r¬   rx   r    r    r$   ry   4  s   
rŸ   c                 C   s   | j d jS r‚   r    rx   r    r    r$   ry   8  rv   r¤   c                 C   s   | j d jS r‚   r    rx   r    r    r$   ry   <  rv   N)r'   r(   r)   r*   r   r	   r.   r,   r   r}   r¨   r�   r§   r+   r    r    r    r$   r©   %  s8   
ÿþþý
ÿþýþýír©   ZNwkSKeyzJoin-requestzRejoin-request type 0zRejoin-request type 1zRejoin-request type 2)rh   r   r   r>   c                   @   s0   e Zd Zd ZedddƒedddƒeddƒgZdS )ÚJoin_RequestZAppEUIó           rC   ÚDevEUIZDevNoncer   N)r'   r(   r)   r*   r
   r   r+   r    r    r    r$   r­   I  s
   

þr­   c                
       sh   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
d„ ƒgZdd„ Zd‡ fdd„	Z‡  ZS )ÚJoin_AcceptFZJoinAppNoncer   ÚNetIDrª   ZRxDelayZCFLists                   é   c                 C   s
   t jdu S )NT)r°   Údcflistrx   r    r    r$   ry   Y  rv   zJoin_Accept.<lambda>c                 C   s   d|fS r   r    r!   r    r    r$   r%   [  s    zJoin_Accept.extract_paddingr   c                    s&   t |ƒdkrdt_tt| ƒ |¡ d S )Né   T)Úlenr°   r³   ÚsuperÚ__init__)r"   Úpacket©Ú	__class__r    r$   r·   ^  s    zJoin_Accept.__init__)r   )r'   r(   r)   r*   r³   r   r   re   r   r   r
   r+   r%   r·   Ú__classcell__r    r    r¹   r$   r°   P  s   ÿûr°   zNetID+DevEUIzJoinEUI+DevEUI)r   r   r>   c                   @   s4   e Zd Zd ZeddƒeddƒeddƒeddƒgZdS )Ú	RejoinReqÚTyper   r±   r¯   r®   ZRJcount0N)	r'   r(   r)   r*   r   r   r
   r   r+   r    r    r    r$   r¼   i  s   ýr¼   c                 C   s4   | j dks| j dkrdS | j dks,| j dkr0dS d S )Nr@   r?   r   r   r>   r   r¬   rx   r    r    r$   Údpload_typeq  s
    r¾   ÚDataPayloadr   r   ©Zremainc                 C   s   t | ƒdkS r‚   ©r¾   rx   r    r    r$   ry   z  rv   ry   rA   c                 C   s   t | ƒdkS rw   rÁ   rx   r    r    r$   ry   |  rv   c                   @   s–   e Zd Zd Zeeeedddd�ƒdd„ ƒeedde	d	d„ d
�dd„ ƒeedde
dd„ d�dd„ ƒeeddƒdd„ ƒeeddedd„ d
�dd„ ƒgZdS )Ú
FRMPayloadr¿   r   r   rÀ   c                 C   s   t | ƒd uS )NrÁ   rx   r    r    r$   ry   „  rv   zFRMPayload.<lambda>ZJoin_Request_Fieldrv   c                 C   s   dS )Nr´   r    rx   r    r    r$   ry   ‡  rv   rz   c                 C   s
   | j dkS r‚   r¬   rx   r    r    r$   ry   ˆ  rv   ZJoin_Accept_Fieldc                 C   s   dS rw   r    rx   r    r    r$   ry   ‹  rv   )Z
count_fromc                 C   s   | j dkotjdu S ©Nr   F©r£   ÚLoRaÚ	encryptedrx   r    r    r$   ry   Œ  s   
ZJoin_Accept_Encryptedr   c                 C   s   | j dkotjdu S )Nr   TrÄ   rx   r    r    r$   ry   �  rv   ZReJoin_Request_Fieldc                 C   s   dS r™   r    rx   r    r    r$   ry   ’  rv   c                 C   s
   | j dkS rŒ   r¬   rx   r    r    r$   ry   “  rv   N)r'   r(   r)   r*   r   r   Údatapayload_listr   r	   r­   r°   r¼   r+   r    r    r    r$   rÂ     s<   ÿÿýþýþý
ÿþýñrÂ   c                   @   s0   e Zd Zd ZdZeeeddeƒdd„ ƒe	gZ
dS )Ú
MACPayloadFZFPortr   c                 C   s$   | j dko"| j dko"| jd jdkS )Nr>   r@   r   )r£   r¡   r   rx   r    r    r$   ry   ›  s   
ÿzMACPayload.<lambda>N)r'   r(   r)   r*   ZeFPortr©   r   r   ÚFPortsrÂ   r+   r    r    r    r$   rÈ   –  s   ÿûrÈ   zJoin-acceptzUnconfirmed Data UpzUnconfirmed Data DownzConfirmed Data UpzConfirmed Data DownzRejoin-requestZProprietary)r   r   r>   r?   r   r@   rA   rB   c                   @   s4   e Zd Zd ZedddeƒedddƒedddƒgZdS )ÚMHDRr£   r   r?   r_   ZMajorr>   N)r'   r(   r)   r*   r   ÚMTypesr   r+   r    r    r    r$   rÊ   «  s
   

þrÊ   c                   @   s*   e Zd Zd Zeeeeddƒdd„ ƒgZdS )Ú
PHYPayloadZMICr   c                 C   s   | j dkptjdu S rÃ   rÄ   rx   r    r    r$   ry   ¸  s   
zPHYPayload.<lambda>N)	r'   r(   r)   r*   rÊ   rÈ   r   r   r+   r    r    r    r$   rÌ   ³  s   
ÿþrÌ   c                   @   sN   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
d„ ƒgZ
dS )rÅ   z1.1TZPreambler   r   ZPHDRr²   ZPHDR_CRCÚCRCc                 C   s   | j d@ dkS )Nr   r   r¬   rx   r    r    r$   ry   Æ  rv   zLoRa.<lambda>N)r'   r(   r)   r*   ÚversionrÆ   r   rÌ   r   r   r+   r    r    r    r$   rÅ   ¼  s   



ÿürÅ   N)_Ú__doc__Zscapy.packetr   Zscapy.fieldsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r-   r.   rœ   Z	CIDs_downr/   rK   r0   rL   r[   r^   r1   r`   rM   rc   r2   rN   re   r3   rf   rO   ri   r4   rj   rP   rk   r5   rn   rQ   ro   r6   rR   rs   rr   rq   r7   rS   r8   rT   ru   r9   rU   r{   r:   rV   r;   rW   r<   r=   rX   r}   r�   rž   r§   r¨   r©   rÉ   ZJoinReqTypesr­   r°   r|   r¼   r¾   rÇ   rÂ   rÈ   rË   rÊ   rÌ   rÅ   r    r    r    r$   Ú<module>	   s  	Xòóÿñÿ
	F=		ýþÿÿþù
	