Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

273 lines
7.2 KiB

  1. /*!
  2. * \file NvmDataMgmt.c
  3. *
  4. * \brief NVM context management implementation
  5. *
  6. * \copyright Revised BSD License, see section \ref LICENSE.
  7. *
  8. * \code
  9. * ______ _
  10. * / _____) _ | |
  11. * ( (____ _____ ____ _| |_ _____ ____| |__
  12. * \____ \| ___ | (_ _) ___ |/ ___) _ \
  13. * _____) ) ____| | | || |_| ____( (___| | | |
  14. * (______/|_____)_|_|_| \__)_____)\____)_| |_|
  15. * (C)2013-2017 Semtech
  16. *
  17. * ___ _____ _ ___ _ _____ ___ ___ ___ ___
  18. * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
  19. * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
  20. * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
  21. * embedded.connectivity.solutions===============
  22. *
  23. * \endcode
  24. *
  25. * \author Miguel Luis ( Semtech )
  26. *
  27. * \author Gregory Cristian ( Semtech )
  28. *
  29. * \author Daniel Jaeckle ( STACKFORCE )
  30. *
  31. * \author Johannes Bruder ( STACKFORCE )
  32. */
  33. #include <stdio.h>
  34. #include "utilities.h"
  35. #include "nvmm.h"
  36. #include "LoRaMac.h"
  37. #include "NvmDataMgmt.h"
  38. /*!
  39. * Enables/Disables the context storage management storage.
  40. * Must be enabled for LoRaWAN 1.0.4 or later.
  41. */
  42. #ifndef CONTEXT_MANAGEMENT_ENABLED
  43. #define CONTEXT_MANAGEMENT_ENABLED 1
  44. #endif
  45. static uint16_t NvmNotifyFlags = 0;
  46. void NvmDataMgmtEvent( uint16_t notifyFlags )
  47. {
  48. NvmNotifyFlags = notifyFlags;
  49. }
  50. uint16_t NvmDataMgmtStore( void )
  51. {
  52. #if( CONTEXT_MANAGEMENT_ENABLED == 1 )
  53. uint16_t offset = 0;
  54. uint16_t dataSize = 0;
  55. MibRequestConfirm_t mibReq;
  56. mibReq.Type = MIB_NVM_CTXS;
  57. LoRaMacMibGetRequestConfirm( &mibReq );
  58. LoRaMacNvmData_t* nvm = mibReq.Param.Contexts;
  59. // Input checks
  60. if( NvmNotifyFlags == LORAMAC_NVM_NOTIFY_FLAG_NONE )
  61. {
  62. // There was no update.
  63. return 0;
  64. }
  65. if( LoRaMacStop( ) != LORAMAC_STATUS_OK )
  66. {
  67. return 0;
  68. }
  69. // Crypto
  70. if( ( NvmNotifyFlags & LORAMAC_NVM_NOTIFY_FLAG_CRYPTO ) ==
  71. LORAMAC_NVM_NOTIFY_FLAG_CRYPTO )
  72. {
  73. dataSize += NvmmWrite( ( uint8_t* ) &nvm->Crypto, sizeof( nvm->Crypto ),
  74. offset );
  75. }
  76. offset += sizeof( nvm->Crypto );
  77. // MacGroup1
  78. if( ( NvmNotifyFlags & LORAMAC_NVM_NOTIFY_FLAG_MAC_GROUP1 ) ==
  79. LORAMAC_NVM_NOTIFY_FLAG_MAC_GROUP1 )
  80. {
  81. dataSize += NvmmWrite( ( uint8_t* ) &nvm->MacGroup1,
  82. sizeof( nvm->MacGroup1 ), offset );
  83. }
  84. offset += sizeof( nvm->MacGroup1 );
  85. // MacGroup2
  86. if( ( NvmNotifyFlags & LORAMAC_NVM_NOTIFY_FLAG_MAC_GROUP2 ) ==
  87. LORAMAC_NVM_NOTIFY_FLAG_MAC_GROUP2 )
  88. {
  89. dataSize += NvmmWrite( ( uint8_t* ) &nvm->MacGroup2,
  90. sizeof( nvm->MacGroup2 ), offset );
  91. }
  92. offset += sizeof( nvm->MacGroup2 );
  93. // Secure element
  94. if( ( NvmNotifyFlags & LORAMAC_NVM_NOTIFY_FLAG_SECURE_ELEMENT ) ==
  95. LORAMAC_NVM_NOTIFY_FLAG_SECURE_ELEMENT )
  96. {
  97. dataSize += NvmmWrite( ( uint8_t* ) &nvm->SecureElement, sizeof( nvm->SecureElement ),
  98. offset );
  99. }
  100. offset += sizeof( nvm->SecureElement );
  101. // Region group 1
  102. if( ( NvmNotifyFlags & LORAMAC_NVM_NOTIFY_FLAG_REGION_GROUP1 ) ==
  103. LORAMAC_NVM_NOTIFY_FLAG_REGION_GROUP1 )
  104. {
  105. dataSize += NvmmWrite( ( uint8_t* ) &nvm->RegionGroup1,
  106. sizeof( nvm->RegionGroup1 ), offset );
  107. }
  108. offset += sizeof( nvm->RegionGroup1 );
  109. // Region group 2
  110. if( ( NvmNotifyFlags & LORAMAC_NVM_NOTIFY_FLAG_REGION_GROUP2 ) ==
  111. LORAMAC_NVM_NOTIFY_FLAG_REGION_GROUP2 )
  112. {
  113. dataSize += NvmmWrite( ( uint8_t* ) &nvm->RegionGroup2,
  114. sizeof( nvm->RegionGroup2 ), offset );
  115. }
  116. offset += sizeof( nvm->RegionGroup2 );
  117. // Class b
  118. if( ( NvmNotifyFlags & LORAMAC_NVM_NOTIFY_FLAG_CLASS_B ) ==
  119. LORAMAC_NVM_NOTIFY_FLAG_CLASS_B )
  120. {
  121. dataSize += NvmmWrite( ( uint8_t* ) &nvm->ClassB, sizeof( nvm->ClassB ),
  122. offset );
  123. }
  124. offset += sizeof( nvm->ClassB );
  125. // Reset notification flags
  126. NvmNotifyFlags = LORAMAC_NVM_NOTIFY_FLAG_NONE;
  127. // Resume LoRaMac
  128. LoRaMacStart( );
  129. return dataSize;
  130. #else
  131. return 0;
  132. #endif
  133. }
  134. uint16_t NvmDataMgmtRestore( void )
  135. {
  136. #if( CONTEXT_MANAGEMENT_ENABLED == 1 )
  137. MibRequestConfirm_t mibReq;
  138. mibReq.Type = MIB_NVM_CTXS;
  139. LoRaMacMibGetRequestConfirm( &mibReq );
  140. LoRaMacNvmData_t* nvm = mibReq.Param.Contexts;
  141. uint16_t offset = 0;
  142. // Crypto
  143. if( NvmmCrc32Check( sizeof( LoRaMacCryptoNvmData_t ), offset ) == false )
  144. {
  145. return 0;
  146. }
  147. offset += sizeof( LoRaMacCryptoNvmData_t );
  148. // Mac Group 1
  149. if( NvmmCrc32Check( sizeof( LoRaMacNvmDataGroup1_t ), offset ) == false )
  150. {
  151. return 0;
  152. }
  153. offset += sizeof( LoRaMacNvmDataGroup1_t );
  154. // Mac Group 2
  155. if( NvmmCrc32Check( sizeof( LoRaMacNvmDataGroup2_t ), offset ) == false )
  156. {
  157. return 0;
  158. }
  159. offset += sizeof( LoRaMacNvmDataGroup2_t );
  160. // Secure element
  161. if( NvmmCrc32Check( sizeof( SecureElementNvmData_t ), offset ) == false )
  162. {
  163. return 0;
  164. }
  165. offset += sizeof( SecureElementNvmData_t );
  166. // Region group 1
  167. if( NvmmCrc32Check( sizeof( RegionNvmDataGroup1_t ), offset ) == false )
  168. {
  169. return 0;
  170. }
  171. offset += sizeof( RegionNvmDataGroup1_t );
  172. // Region group 2
  173. if( NvmmCrc32Check( sizeof( RegionNvmDataGroup2_t ), offset ) == false )
  174. {
  175. return 0;
  176. }
  177. offset += sizeof( RegionNvmDataGroup2_t );
  178. // Class b
  179. if( NvmmCrc32Check( sizeof( LoRaMacClassBNvmData_t ), offset ) == false )
  180. {
  181. return 0;
  182. }
  183. offset += sizeof( LoRaMacClassBNvmData_t );
  184. if( NvmmRead( ( uint8_t* ) nvm, sizeof( LoRaMacNvmData_t ), 0 ) ==
  185. sizeof( LoRaMacNvmData_t ) )
  186. {
  187. return sizeof( LoRaMacNvmData_t );
  188. }
  189. #endif
  190. return 0;
  191. }
  192. bool NvmDataMgmtFactoryReset( void )
  193. {
  194. uint16_t offset = 0;
  195. #if( CONTEXT_MANAGEMENT_ENABLED == 1 )
  196. // Crypto
  197. if( NvmmReset( sizeof( LoRaMacCryptoNvmData_t ), offset ) == false )
  198. {
  199. return false;
  200. }
  201. offset += sizeof( LoRaMacCryptoNvmData_t );
  202. // Mac Group 1
  203. if( NvmmReset( sizeof( LoRaMacNvmDataGroup1_t ), offset ) == false )
  204. {
  205. return false;
  206. }
  207. offset += sizeof( LoRaMacNvmDataGroup1_t );
  208. // Mac Group 2
  209. if( NvmmReset( sizeof( LoRaMacNvmDataGroup2_t ), offset ) == false )
  210. {
  211. return false;
  212. }
  213. offset += sizeof( LoRaMacNvmDataGroup2_t );
  214. // Secure element
  215. if( NvmmReset( sizeof( SecureElementNvmData_t ), offset ) == false )
  216. {
  217. return false;
  218. }
  219. offset += sizeof( SecureElementNvmData_t );
  220. // Region group 1
  221. if( NvmmReset( sizeof( RegionNvmDataGroup1_t ), offset ) == false )
  222. {
  223. return false;
  224. }
  225. offset += sizeof( RegionNvmDataGroup1_t );
  226. // Region group 2
  227. if( NvmmReset( sizeof( RegionNvmDataGroup2_t ), offset ) == false )
  228. {
  229. return false;
  230. }
  231. offset += sizeof( RegionNvmDataGroup2_t );
  232. // Class b
  233. if( NvmmReset( sizeof( LoRaMacClassBNvmData_t ), offset ) == false )
  234. {
  235. return false;
  236. }
  237. offset += sizeof( LoRaMacClassBNvmData_t );
  238. #endif
  239. return true;
  240. }