LoRaMacSerializer.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. / _____) _ | |
  3. ( (____ _____ ____ _| |_ _____ ____| |__
  4. \____ \| ___ | (_ _) ___ |/ ___) _ \
  5. _____) ) ____| | | || |_| ____( (___| | | |
  6. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  7. (C)2013 Semtech
  8. ___ _____ _ ___ _ _____ ___ ___ ___ ___
  9. / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
  10. \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
  11. |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
  12. embedded.connectivity.solutions===============
  13. Description: LoRa MAC layer message serializer 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 "LoRaMacSerializer.h"
  19. #include "utilities.h"
  20. LoRaMacSerializerStatus_t LoRaMacSerializerJoinRequest( LoRaMacMessageJoinRequest_t* macMsg )
  21. {
  22. if( ( macMsg == 0 ) || ( macMsg->Buffer == 0 ) )
  23. {
  24. return LORAMAC_SERIALIZER_ERROR_NPE;
  25. }
  26. uint16_t bufItr = 0;
  27. // Check macMsg->BufSize
  28. if( macMsg->BufSize < LORAMAC_JOIN_REQ_MSG_SIZE )
  29. {
  30. return LORAMAC_SERIALIZER_ERROR_BUF_SIZE;
  31. }
  32. macMsg->Buffer[bufItr++] = macMsg->MHDR.Value;
  33. memcpyr( &macMsg->Buffer[bufItr], macMsg->JoinEUI, LORAMAC_JOIN_EUI_FIELD_SIZE );
  34. bufItr += LORAMAC_JOIN_EUI_FIELD_SIZE;
  35. memcpyr( &macMsg->Buffer[bufItr], macMsg->DevEUI, LORAMAC_DEV_EUI_FIELD_SIZE );
  36. bufItr += LORAMAC_DEV_EUI_FIELD_SIZE;
  37. macMsg->Buffer[bufItr++] = macMsg->DevNonce & 0xFF;
  38. macMsg->Buffer[bufItr++] = ( macMsg->DevNonce >> 8 ) & 0xFF;
  39. macMsg->Buffer[bufItr++] = macMsg->MIC & 0xFF;
  40. macMsg->Buffer[bufItr++] = ( macMsg->MIC >> 8 ) & 0xFF;
  41. macMsg->Buffer[bufItr++] = ( macMsg->MIC >> 16 ) & 0xFF;
  42. macMsg->Buffer[bufItr++] = ( macMsg->MIC >> 24 ) & 0xFF;
  43. macMsg->BufSize = bufItr;
  44. return LORAMAC_SERIALIZER_SUCCESS;
  45. }
  46. LoRaMacSerializerStatus_t LoRaMacSerializerReJoinType1( LoRaMacMessageReJoinType1_t* macMsg )
  47. {
  48. if( ( macMsg == 0 ) || ( macMsg->Buffer == 0 ) )
  49. {
  50. return LORAMAC_SERIALIZER_ERROR_NPE;
  51. }
  52. uint16_t bufItr = 0;
  53. // Check macMsg->BufSize
  54. if( macMsg->BufSize < LORAMAC_RE_JOIN_1_MSG_SIZE )
  55. {
  56. return LORAMAC_SERIALIZER_ERROR_BUF_SIZE;
  57. }
  58. macMsg->Buffer[bufItr++] = macMsg->MHDR.Value;
  59. macMsg->Buffer[bufItr++] = macMsg->ReJoinType;
  60. memcpyr( &macMsg->Buffer[bufItr], macMsg->JoinEUI, LORAMAC_JOIN_EUI_FIELD_SIZE );
  61. bufItr += LORAMAC_JOIN_EUI_FIELD_SIZE;
  62. memcpyr( &macMsg->Buffer[bufItr], macMsg->DevEUI, LORAMAC_DEV_EUI_FIELD_SIZE );
  63. bufItr += LORAMAC_DEV_EUI_FIELD_SIZE;
  64. macMsg->Buffer[bufItr++] = macMsg->RJcount1 & 0xFF;
  65. macMsg->Buffer[bufItr++] = ( macMsg->RJcount1 >> 8 ) & 0xFF;
  66. return LORAMAC_SERIALIZER_SUCCESS;
  67. }
  68. LoRaMacSerializerStatus_t LoRaMacSerializerReJoinType0or2( LoRaMacMessageReJoinType0or2_t* macMsg )
  69. {
  70. if( ( macMsg == 0 ) || ( macMsg->Buffer == 0 ) )
  71. {
  72. return LORAMAC_SERIALIZER_ERROR_NPE;
  73. }
  74. uint16_t bufItr = 0;
  75. // Check macMsg->BufSize
  76. if( macMsg->BufSize < LORAMAC_RE_JOIN_0_2_MSG_SIZE )
  77. {
  78. return LORAMAC_SERIALIZER_ERROR_BUF_SIZE;
  79. }
  80. macMsg->Buffer[bufItr++] = macMsg->MHDR.Value;
  81. macMsg->Buffer[bufItr++] = macMsg->ReJoinType;
  82. memcpy1( &macMsg->Buffer[bufItr], macMsg->NetID, LORAMAC_NET_ID_FIELD_SIZE );
  83. bufItr += LORAMAC_NET_ID_FIELD_SIZE;
  84. memcpyr( &macMsg->Buffer[bufItr], macMsg->DevEUI, LORAMAC_DEV_EUI_FIELD_SIZE );
  85. bufItr += LORAMAC_DEV_EUI_FIELD_SIZE;
  86. macMsg->Buffer[bufItr++] = macMsg->RJcount0 & 0xFF;
  87. macMsg->Buffer[bufItr++] = ( macMsg->RJcount0 >> 8 ) & 0xFF;
  88. return LORAMAC_SERIALIZER_SUCCESS;
  89. }
  90. LoRaMacSerializerStatus_t LoRaMacSerializerData( LoRaMacMessageData_t* macMsg )
  91. {
  92. if( ( macMsg == 0 ) || ( macMsg->Buffer == 0 ) )
  93. {
  94. return LORAMAC_SERIALIZER_ERROR_NPE;
  95. }
  96. uint16_t bufItr = 0;
  97. // Check macMsg->BufSize
  98. uint16_t computedBufSize = LORAMAC_MHDR_FIELD_SIZE
  99. + LORAMAC_FHDR_DEV_ADD_FIELD_SIZE
  100. + LORAMAC_FHDR_F_CTRL_FIELD_SIZE
  101. + LORAMAC_FHDR_F_CNT_FIELD_SIZE;
  102. computedBufSize += macMsg->FHDR.FCtrl.Bits.FOptsLen;
  103. if( macMsg->FRMPayloadSize > 0 )
  104. {
  105. computedBufSize += LORAMAC_F_PORT_FIELD_SIZE;
  106. }
  107. computedBufSize += macMsg->FRMPayloadSize;
  108. computedBufSize += LORAMAC_MIC_FIELD_SIZE;
  109. if( macMsg->BufSize < computedBufSize )
  110. {
  111. return LORAMAC_SERIALIZER_ERROR_BUF_SIZE;
  112. }
  113. macMsg->Buffer[bufItr++] = macMsg->MHDR.Value;
  114. macMsg->Buffer[bufItr++] = ( macMsg->FHDR.DevAddr ) & 0xFF;
  115. macMsg->Buffer[bufItr++] = ( macMsg->FHDR.DevAddr >> 8 ) & 0xFF;
  116. macMsg->Buffer[bufItr++] = ( macMsg->FHDR.DevAddr >> 16 ) & 0xFF;
  117. macMsg->Buffer[bufItr++] = ( macMsg->FHDR.DevAddr >> 24 ) & 0xFF;
  118. macMsg->Buffer[bufItr++] = macMsg->FHDR.FCtrl.Value;
  119. macMsg->Buffer[bufItr++] = macMsg->FHDR.FCnt & 0xFF;
  120. macMsg->Buffer[bufItr++] = ( macMsg->FHDR.FCnt >> 8 ) & 0xFF;
  121. memcpy1( &macMsg->Buffer[bufItr], macMsg->FHDR.FOpts, macMsg->FHDR.FCtrl.Bits.FOptsLen );
  122. bufItr = bufItr + macMsg->FHDR.FCtrl.Bits.FOptsLen;
  123. if( macMsg->FRMPayloadSize > 0 )
  124. {
  125. macMsg->Buffer[bufItr++] = macMsg->FPort;
  126. }
  127. memcpy1( &macMsg->Buffer[bufItr], macMsg->FRMPayload, macMsg->FRMPayloadSize );
  128. bufItr = bufItr + macMsg->FRMPayloadSize;
  129. macMsg->Buffer[bufItr++] = macMsg->MIC & 0xFF;
  130. macMsg->Buffer[bufItr++] = ( macMsg->MIC >> 8 ) & 0xFF;
  131. macMsg->Buffer[bufItr++] = ( macMsg->MIC >> 16 ) & 0xFF;
  132. macMsg->Buffer[bufItr++] = ( macMsg->MIC >> 24 ) & 0xFF;
  133. macMsg->BufSize = bufItr;
  134. return LORAMAC_SERIALIZER_SUCCESS;
  135. }