Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MinimouseSrc/MacLayer.h@0:2325d1d28df3, 2017-12-15 (annotated)
- Committer:
- fholin
- Date:
- Fri Dec 15 13:15:04 2017 +0000
- Revision:
- 0:2325d1d28df3
- Child:
- 1:eda561b01daf
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fholin | 0:2325d1d28df3 | 1 | /* |
fholin | 0:2325d1d28df3 | 2 | |
fholin | 0:2325d1d28df3 | 3 | __ __ _ _ |
fholin | 0:2325d1d28df3 | 4 | | \/ ( _) ( _) |
fholin | 0:2325d1d28df3 | 5 | | \ / |_ _ __ _ _ __ ___ ___ _ _ ___ ___ |
fholin | 0:2325d1d28df3 | 6 | | |\/| | | '_ \| | '_ ` _ \ / _ \| | | / __|/ _ \ |
fholin | 0:2325d1d28df3 | 7 | | | | | | | | | | | | | | | ( _) | |_| \__ \ __/ |
fholin | 0:2325d1d28df3 | 8 | |_| |_|_|_| |_|_|_| |_| |_|\___/ \__,_|___/\___| |
fholin | 0:2325d1d28df3 | 9 | |
fholin | 0:2325d1d28df3 | 10 | |
fholin | 0:2325d1d28df3 | 11 | Description : LoraWan Mac Layer objets. |
fholin | 0:2325d1d28df3 | 12 | |
fholin | 0:2325d1d28df3 | 13 | |
fholin | 0:2325d1d28df3 | 14 | License : Revised BSD License, see LICENSE.TXT file include in the project |
fholin | 0:2325d1d28df3 | 15 | |
fholin | 0:2325d1d28df3 | 16 | Maintainer : Fabien Holin ( SEMTECH) |
fholin | 0:2325d1d28df3 | 17 | */ |
fholin | 0:2325d1d28df3 | 18 | #include "mbed.h" |
fholin | 0:2325d1d28df3 | 19 | #include "Define.h" |
fholin | 0:2325d1d28df3 | 20 | #include "PhyLayer.h" |
fholin | 0:2325d1d28df3 | 21 | #include "sx1276-hal.h" |
fholin | 0:2325d1d28df3 | 22 | #include "LoraMacDataStoreInFlash.h" |
fholin | 0:2325d1d28df3 | 23 | #ifndef MAC_LAYER_H |
fholin | 0:2325d1d28df3 | 24 | #define MAC_LAYER_H |
fholin | 0:2325d1d28df3 | 25 | |
fholin | 0:2325d1d28df3 | 26 | #define LORA_MAC_SYNCWORD 0x34 |
fholin | 0:2325d1d28df3 | 27 | static uint8_t LoRaMacNwkSKey[] = |
fholin | 0:2325d1d28df3 | 28 | { 0x94, 0x02, 0x9E, 0xAB, 0xE9, 0x0C, 0xE3, 0xCF, 0x51, 0xA2, 0x31, 0x7F, 0x03, 0x27, 0xEF, 0xA6 }; |
fholin | 0:2325d1d28df3 | 29 | |
fholin | 0:2325d1d28df3 | 30 | /*! |
fholin | 0:2325d1d28df3 | 31 | * AES encryption/decryption cipher application session key |
fholin | 0:2325d1d28df3 | 32 | */ |
fholin | 0:2325d1d28df3 | 33 | static uint8_t LoRaMacAppSKey[] = |
fholin | 0:2325d1d28df3 | 34 | { 0xBB, 0xEB, 0xEB, 0x4D, 0x5C, 0xAF, 0x95, 0x5D, 0x33, 0xD1, 0xC0, 0xC4, 0x41, 0x55, 0xB5, 0xA1 }; |
fholin | 0:2325d1d28df3 | 35 | |
fholin | 0:2325d1d28df3 | 36 | |
fholin | 0:2325d1d28df3 | 37 | static uint8_t LoRaMacAppKey[] = |
fholin | 0:2325d1d28df3 | 38 | { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}; |
fholin | 0:2325d1d28df3 | 39 | static uint8_t AppEui[] = |
fholin | 0:2325d1d28df3 | 40 | { 0x70, 0xB3, 0xD5, 0x7E, 0xF0, 0x00, 0x36, 0x12 }; |
fholin | 0:2325d1d28df3 | 41 | |
fholin | 0:2325d1d28df3 | 42 | |
fholin | 0:2325d1d28df3 | 43 | static uint8_t DevEui[] = |
fholin | 0:2325d1d28df3 | 44 | { 0x33, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33 }; |
fholin | 0:2325d1d28df3 | 45 | |
fholin | 0:2325d1d28df3 | 46 | //@note find the right place of the keys |
fholin | 0:2325d1d28df3 | 47 | |
fholin | 0:2325d1d28df3 | 48 | |
fholin | 0:2325d1d28df3 | 49 | class LoraWanContainer { |
fholin | 0:2325d1d28df3 | 50 | public: |
fholin | 0:2325d1d28df3 | 51 | LoraWanContainer( PinName interrupt ); |
fholin | 0:2325d1d28df3 | 52 | ~LoraWanContainer( ); |
fholin | 0:2325d1d28df3 | 53 | void BuildTxLoraFrame ( void ); |
fholin | 0:2325d1d28df3 | 54 | void BuildJoinLoraFrame ( void ); |
fholin | 0:2325d1d28df3 | 55 | void EncryptTxFrame ( void ); |
fholin | 0:2325d1d28df3 | 56 | void ConfigureRadioAndSend( void ); |
fholin | 0:2325d1d28df3 | 57 | void ConfigureRadioForRx1 ( void ); |
fholin | 0:2325d1d28df3 | 58 | void ConfigureRadioForRx2 ( void ); |
fholin | 0:2325d1d28df3 | 59 | void ConfigureTimerForRx ( int type ); |
fholin | 0:2325d1d28df3 | 60 | int DecodeRxFrame ( void ); |
fholin | 0:2325d1d28df3 | 61 | void UpdateMacLayer ( void ); |
fholin | 0:2325d1d28df3 | 62 | void ParseManagementPacket( void ); |
fholin | 0:2325d1d28df3 | 63 | void UpdateJoinProcedure ( void ); |
fholin | 0:2325d1d28df3 | 64 | uint8_t IsFrameToSend; |
fholin | 0:2325d1d28df3 | 65 | /* LoraWan Context */ |
fholin | 0:2325d1d28df3 | 66 | /* Only 16 ch mask => ChMaskCntl not used */ |
fholin | 0:2325d1d28df3 | 67 | /* Duty cycle is not managed */ |
fholin | 0:2325d1d28df3 | 68 | |
fholin | 0:2325d1d28df3 | 69 | /*******************************************/ |
fholin | 0:2325d1d28df3 | 70 | /* Update by Link ADR command */ |
fholin | 0:2325d1d28df3 | 71 | /*******************************************/ |
fholin | 0:2325d1d28df3 | 72 | uint8_t MacTxSf; |
fholin | 0:2325d1d28df3 | 73 | uint8_t MacTxPower; |
fholin | 0:2325d1d28df3 | 74 | uint16_t MacChMask; |
fholin | 0:2325d1d28df3 | 75 | uint8_t MacNbRepUnconfirmedTx; |
fholin | 0:2325d1d28df3 | 76 | /********************************************/ |
fholin | 0:2325d1d28df3 | 77 | /* Update by TxParamaSetupRequest */ |
fholin | 0:2325d1d28df3 | 78 | /********************************************/ |
fholin | 0:2325d1d28df3 | 79 | uint32_t MacRx2Frequency ; |
fholin | 0:2325d1d28df3 | 80 | uint8_t MacRx2Sf; |
fholin | 0:2325d1d28df3 | 81 | uint8_t MacRx1SfOffset; |
fholin | 0:2325d1d28df3 | 82 | /********************************************/ |
fholin | 0:2325d1d28df3 | 83 | /* Update by NewChannelReq command */ |
fholin | 0:2325d1d28df3 | 84 | /********************************************/ |
fholin | 0:2325d1d28df3 | 85 | uint32_t MacTxFrequency[16]; |
fholin | 0:2325d1d28df3 | 86 | uint32_t MacMinMaxSFChannel[16]; |
fholin | 0:2325d1d28df3 | 87 | uint8_t NbOfActiveChannel; |
fholin | 0:2325d1d28df3 | 88 | /********************************************/ |
fholin | 0:2325d1d28df3 | 89 | /* Update by RXTimingSetupReq command */ |
fholin | 0:2325d1d28df3 | 90 | /********************************************/ |
fholin | 0:2325d1d28df3 | 91 | int MacRx1Delay; |
fholin | 0:2325d1d28df3 | 92 | /********************************************/ |
fholin | 0:2325d1d28df3 | 93 | /* Other Data To store */ |
fholin | 0:2325d1d28df3 | 94 | /********************************************/ |
fholin | 0:2325d1d28df3 | 95 | uint16_t FcntUp; |
fholin | 0:2325d1d28df3 | 96 | uint32_t FcntDwn; // Wrapping 16 to 32 bits is managed in AcceptFcntDwn Method |
fholin | 0:2325d1d28df3 | 97 | uint32_t DevAddr; |
fholin | 0:2325d1d28df3 | 98 | uint8_t nwkSKey[16]; |
fholin | 0:2325d1d28df3 | 99 | uint8_t appSKey[16]; |
fholin | 0:2325d1d28df3 | 100 | |
fholin | 0:2325d1d28df3 | 101 | /*******************************************/ |
fholin | 0:2325d1d28df3 | 102 | /* what about keys: AppEUI:Nwskey:AppSkey */ |
fholin | 0:2325d1d28df3 | 103 | /*******************************************/ |
fholin | 0:2325d1d28df3 | 104 | |
fholin | 0:2325d1d28df3 | 105 | /* LoRaWan Mac Data for uplink*/ |
fholin | 0:2325d1d28df3 | 106 | uint8_t fPort; |
fholin | 0:2325d1d28df3 | 107 | uint8_t MType; |
fholin | 0:2325d1d28df3 | 108 | uint8_t MajorBits; |
fholin | 0:2325d1d28df3 | 109 | uint8_t Fctrl; |
fholin | 0:2325d1d28df3 | 110 | uint8_t AckBitForTx; |
fholin | 0:2325d1d28df3 | 111 | uint8_t UserPayloadSize; |
fholin | 0:2325d1d28df3 | 112 | uint8_t MacPayloadSize; |
fholin | 0:2325d1d28df3 | 113 | |
fholin | 0:2325d1d28df3 | 114 | |
fholin | 0:2325d1d28df3 | 115 | |
fholin | 0:2325d1d28df3 | 116 | /* LoRaWan Mac Data for downlink*/ |
fholin | 0:2325d1d28df3 | 117 | uint8_t fRxPort; |
fholin | 0:2325d1d28df3 | 118 | uint8_t MtypeRx; |
fholin | 0:2325d1d28df3 | 119 | uint8_t MajorRx; |
fholin | 0:2325d1d28df3 | 120 | uint8_t FctrlRx; |
fholin | 0:2325d1d28df3 | 121 | uint8_t FoptsLength; |
fholin | 0:2325d1d28df3 | 122 | uint8_t Fopts[16]; |
fholin | 0:2325d1d28df3 | 123 | uint8_t FportRx; |
fholin | 0:2325d1d28df3 | 124 | uint8_t MacRxPayloadSize; //@note Have to by replace by a fifo objet to manage class c |
fholin | 0:2325d1d28df3 | 125 | uint8_t MacRxPayload[255]; //@note Have to by replace by a fifo objet to manage class c |
fholin | 0:2325d1d28df3 | 126 | uint8_t AvailableRxPacketForUser ; |
fholin | 0:2325d1d28df3 | 127 | |
fholin | 0:2325d1d28df3 | 128 | /* LoRaWan Mac Data for join */ |
fholin | 0:2325d1d28df3 | 129 | uint16_t DevNonce; |
fholin | 0:2325d1d28df3 | 130 | uint8_t JoinedStatus; |
fholin | 0:2325d1d28df3 | 131 | |
fholin | 0:2325d1d28df3 | 132 | /* LoRaWan Mac Data for nwk Ans */ |
fholin | 0:2325d1d28df3 | 133 | uint8_t MacNwkAns[255]; //@note reuse user payload data or at least reduce size or use opt byte |
fholin | 0:2325d1d28df3 | 134 | uint8_t MacNwkAnsSize; |
fholin | 0:2325d1d28df3 | 135 | |
fholin | 0:2325d1d28df3 | 136 | /* LoraWan Config */ |
fholin | 0:2325d1d28df3 | 137 | uint8_t AdrModeSelect; |
fholin | 0:2325d1d28df3 | 138 | |
fholin | 0:2325d1d28df3 | 139 | |
fholin | 0:2325d1d28df3 | 140 | /* Objet RadioContainer*/ |
fholin | 0:2325d1d28df3 | 141 | RadioContainer Phy; |
fholin | 0:2325d1d28df3 | 142 | |
fholin | 0:2325d1d28df3 | 143 | /* Timer */ |
fholin | 0:2325d1d28df3 | 144 | Timeout TimerLora ; |
fholin | 0:2325d1d28df3 | 145 | void IsrTimerRx( void ); |
fholin | 0:2325d1d28df3 | 146 | int StateTimer; |
fholin | 0:2325d1d28df3 | 147 | |
fholin | 0:2325d1d28df3 | 148 | /* Flash */ |
fholin | 0:2325d1d28df3 | 149 | void LoadFromFlash ( void ); |
fholin | 0:2325d1d28df3 | 150 | |
fholin | 0:2325d1d28df3 | 151 | private : |
fholin | 0:2325d1d28df3 | 152 | void SetMacHeader ( void ); |
fholin | 0:2325d1d28df3 | 153 | void SetFrameHeader ( void );// no opts |
fholin | 0:2325d1d28df3 | 154 | void GiveNextSf ( void ); |
fholin | 0:2325d1d28df3 | 155 | uint8_t GiveNextChannel ( void ); |
fholin | 0:2325d1d28df3 | 156 | int ExtractRxMhdr ( void ); |
fholin | 0:2325d1d28df3 | 157 | int CheckRxPayloadLength ( void ); |
fholin | 0:2325d1d28df3 | 158 | int ExtractRxFhdr ( uint16_t *FcntDwnTemp ) ; |
fholin | 0:2325d1d28df3 | 159 | int AcceptFcntDwn ( uint16_t FcntDwnTmp ) ; |
fholin | 0:2325d1d28df3 | 160 | void SetAlarm ( uint32_t alarmInMs ); |
fholin | 0:2325d1d28df3 | 161 | void LinkCheckParser ( void ); |
fholin | 0:2325d1d28df3 | 162 | void LinkADRParser ( void ); |
fholin | 0:2325d1d28df3 | 163 | void DutyCycleParser ( void ); |
fholin | 0:2325d1d28df3 | 164 | void RXParamSetupParser ( void ); |
fholin | 0:2325d1d28df3 | 165 | void DevStatusParser ( void ); |
fholin | 0:2325d1d28df3 | 166 | void NewChannelParser ( void ); |
fholin | 0:2325d1d28df3 | 167 | void RXTimingSetupParser ( void ); |
fholin | 0:2325d1d28df3 | 168 | uint8_t isValidRx1SfOffset ( uint8_t ); |
fholin | 0:2325d1d28df3 | 169 | uint8_t isValidMacRx2Sf ( uint8_t ); |
fholin | 0:2325d1d28df3 | 170 | uint8_t isValidMacRx2Frequency ( uint32_t ); |
fholin | 0:2325d1d28df3 | 171 | uint8_t isValidDataRate ( uint8_t ); |
fholin | 0:2325d1d28df3 | 172 | uint8_t isValidTxPower ( uint8_t ); |
fholin | 0:2325d1d28df3 | 173 | uint8_t isValidChannelMask ( uint16_t ); |
fholin | 0:2325d1d28df3 | 174 | uint8_t isValidNbRep ( uint8_t ) ; |
fholin | 0:2325d1d28df3 | 175 | void SaveInFlash ( void ); |
fholin | 0:2325d1d28df3 | 176 | uint8_t crypto_verifyMICandDecrypt ( uint8_t *frame_header, const uint8_t *encrypted_payload ,uint32_t micIn, uint8_t keySet, uint8_t *decrypted_payload, uint8_t PayloadSize); |
fholin | 0:2325d1d28df3 | 177 | sBackUpFlash BackUpFlash; |
fholin | 0:2325d1d28df3 | 178 | }; |
fholin | 0:2325d1d28df3 | 179 | |
fholin | 0:2325d1d28df3 | 180 | |
fholin | 0:2325d1d28df3 | 181 | #endif |