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.
 
 
 
 
 
 

119 lines
4.1 KiB

  1. /*
  2. / _____) _ | |
  3. ( (____ _____ ____ _| |_ _____ ____| |__
  4. \____ \| ___ | (_ _) ___ |/ ___) _ \
  5. _____) ) ____| | | || |_| ____( (___| | | |
  6. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  7. (C)2013 Semtech
  8. ___ _____ _ ___ _ _____ ___ ___ ___ ___
  9. / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
  10. \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
  11. |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
  12. embedded.connectivity.solutions===============
  13. Description: LoRa MAC layer message parser functionality implementation
  14. License: Revised BSD License, see LICENSE.TXT file include in the project
  15. Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ),
  16. Daniel Jaeckle ( STACKFORCE ), Johannes Bruder ( STACKFORCE )
  17. */
  18. #include "LoRaMacParser.h"
  19. #include "utilities.h"
  20. LoRaMacParserStatus_t LoRaMacParserJoinAccept( LoRaMacMessageJoinAccept_t* macMsg )
  21. {
  22. if( ( macMsg == 0 ) || ( macMsg->Buffer == 0 ) )
  23. {
  24. return LORAMAC_PARSER_ERROR_NPE;
  25. }
  26. uint16_t bufItr = 0;
  27. macMsg->MHDR.Value = macMsg->Buffer[bufItr++];
  28. memcpy1( macMsg->JoinNonce, &macMsg->Buffer[bufItr], 3 );
  29. bufItr = bufItr + 3;
  30. memcpy1( macMsg->NetID, &macMsg->Buffer[bufItr], 3 );
  31. bufItr = bufItr + 3;
  32. macMsg->DevAddr = ( uint32_t ) macMsg->Buffer[bufItr++];
  33. macMsg->DevAddr |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 8 );
  34. macMsg->DevAddr |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 16 );
  35. macMsg->DevAddr |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 24 );
  36. macMsg->DLSettings.Value = macMsg->Buffer[bufItr++];
  37. macMsg->RxDelay = macMsg->Buffer[bufItr++];
  38. if( ( macMsg->BufSize - LORAMAC_MIC_FIELD_SIZE - bufItr ) == LORAMAC_CF_LIST_FIELD_SIZE )
  39. {
  40. memcpy1( macMsg->CFList, &macMsg->Buffer[bufItr], LORAMAC_CF_LIST_FIELD_SIZE );
  41. bufItr = bufItr + LORAMAC_CF_LIST_FIELD_SIZE;
  42. }
  43. else if( ( macMsg->BufSize - LORAMAC_MIC_FIELD_SIZE - bufItr ) > 0 )
  44. {
  45. return LORAMAC_PARSER_FAIL;
  46. }
  47. macMsg->MIC = ( uint32_t ) macMsg->Buffer[bufItr++];
  48. macMsg->MIC |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 8 );
  49. macMsg->MIC |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 16 );
  50. macMsg->MIC |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 24 );
  51. return LORAMAC_PARSER_SUCCESS;
  52. }
  53. LoRaMacParserStatus_t LoRaMacParserData( LoRaMacMessageData_t* macMsg )
  54. {
  55. if( ( macMsg == 0 ) || ( macMsg->Buffer == 0 ) )
  56. {
  57. return LORAMAC_PARSER_ERROR_NPE;
  58. }
  59. uint16_t bufItr = 0;
  60. macMsg->MHDR.Value = macMsg->Buffer[bufItr++];
  61. macMsg->FHDR.DevAddr = macMsg->Buffer[bufItr++];
  62. macMsg->FHDR.DevAddr |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 8 );
  63. macMsg->FHDR.DevAddr |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 16 );
  64. macMsg->FHDR.DevAddr |= ( ( uint32_t ) macMsg->Buffer[bufItr++] << 24 );
  65. macMsg->FHDR.FCtrl.Value = macMsg->Buffer[bufItr++];
  66. macMsg->FHDR.FCnt = macMsg->Buffer[bufItr++];
  67. macMsg->FHDR.FCnt |= macMsg->Buffer[bufItr++] << 8;
  68. if( macMsg->FHDR.FCtrl.Bits.FOptsLen <= 15 )
  69. {
  70. memcpy1( macMsg->FHDR.FOpts, &macMsg->Buffer[bufItr], macMsg->FHDR.FCtrl.Bits.FOptsLen );
  71. bufItr = bufItr + macMsg->FHDR.FCtrl.Bits.FOptsLen;
  72. }
  73. else
  74. {
  75. return LORAMAC_PARSER_FAIL;
  76. }
  77. // Initialize anyway with zero.
  78. macMsg->FPort = 0;
  79. macMsg->FRMPayloadSize = 0;
  80. if( ( macMsg->BufSize - bufItr - LORAMAC_MIC_FIELD_SIZE ) > 0 )
  81. {
  82. macMsg->FPort = macMsg->Buffer[bufItr++];
  83. macMsg->FRMPayloadSize = ( macMsg->BufSize - bufItr - LORAMAC_MIC_FIELD_SIZE );
  84. memcpy1( macMsg->FRMPayload, &macMsg->Buffer[bufItr], macMsg->FRMPayloadSize );
  85. bufItr = bufItr + macMsg->FRMPayloadSize;
  86. }
  87. macMsg->MIC = ( uint32_t ) macMsg->Buffer[( macMsg->BufSize - LORAMAC_MIC_FIELD_SIZE )];
  88. macMsg->MIC |= ( ( uint32_t ) macMsg->Buffer[( macMsg->BufSize - LORAMAC_MIC_FIELD_SIZE ) + 1] << 8 );
  89. macMsg->MIC |= ( ( uint32_t ) macMsg->Buffer[( macMsg->BufSize - LORAMAC_MIC_FIELD_SIZE ) + 2] << 16 );
  90. macMsg->MIC |= ( ( uint32_t ) macMsg->Buffer[( macMsg->BufSize - LORAMAC_MIC_FIELD_SIZE ) + 3] << 24 );
  91. return LORAMAC_PARSER_SUCCESS;
  92. }