/*****************************************************************************/ /** * @file framing.h * @author FanHao (hao_fan_bit_ee@163.com) * @brief DF Linklayer framing functions. * @version 0.0 * @date 2023-05-06 * * @copyright Copyright(c) 2024 Beijing Institute of Technology.\n * Lab of Communication and Network * ******************************************************************************/ /** * @addtogroup LinkLayer * @{ */ /** * @addtogroup LinkLayer_Framing * @{ */ /***************************** Include Files *********************************/ #include #include #include "error.h" #include "common.h" #include "msg_def.h" #include "link_layer.h" /************************** Constant Definitions *****************************/ /*****************************************************************************/ /** * @brief Insert a data chunk to a bit array. * * @param frame pointer to target bit array. * @param offset offset of insert start position. * @param bytes number of insert bytes * @param chunk pointer to data chunk * * @return NONE * ******************************************************************************/ void L2_FrameInsertChunk(uint8_t *frame, size_t offset, size_t bytes, const void *chunk) { ASSERT(frame != NULL); ASSERT(chunk != NULL); memcpy(frame + offset, chunk, bytes); } /*****************************************************************************/ /** * @brief Get a data chunk to a frame buff. * * @param frame pointer to target bit array. * @param offset offset of data chunk start position. * @param bytes number of data bytes * @param chunk pointer to data chunk * * @return NONE * ******************************************************************************/ void L2_FrameGetChunk(uint8_t *frame, size_t offset, size_t bytes, void *chunk) { ASSERT(frame != NULL); ASSERT(chunk != NULL); memcpy(chunk, frame + offset, bytes); } /*****************************************************************************/ /** * @brief Generate crc of specified data. * * @param dataBuff pointer to data buffer. * @param dataLen length of specified data. * @param crcType type of crc * @param crc a pointer to 32 bit crc container. * * @return FAILURE crc type not support. * SUCCESS * ******************************************************************************/ int32_t L2_CrcGen(uint8_t *dataBuff, uint32_t dataLen, L2_CRC_TYPE crcType, uint32_t *crc) { ASSERT(dataBuff != NULL); int32_t Status; switch (crcType) { case L2_CRC16_1021: Status = crc16_gen(dataBuff, dataLen, 0x1021, (uint16_t *)crc); break; case L2_CRC16_8005: Status = crc16_gen(dataBuff, dataLen, 0x8005, (uint16_t *)crc); break; case L2_CRC8_31: Status = crc8_gen(dataBuff, dataLen, 0x31, (uint8_t *)crc); break; default: Status = EPARAM; break; } return Status; } /*****************************************************************************/ /** * @brief Append a crc of specified data, to a specified position. * * @param dataBuff pointer to data buffer. * @param dataLen length of specified data. * @param crcPos position of crc insert position * @param crcType type of crc * * @return FAILURE crc type not support. * SUCCESS * ******************************************************************************/ int32_t L2_CrcAppend(uint8_t *dataBuff, uint32_t dataLen, uint32_t crcPos, L2_CRC_TYPE crcType) { ASSERT(dataBuff != NULL); int32_t Status; uint32_t crcVal; uint8_t *crcPtr; crcPtr = dataBuff + crcPos; Status = L2_CrcGen(dataBuff, dataLen, crcType, &crcVal); if (Status != SUCCESS) { return Status; } switch (crcType) { case L2_CRC16_1021: *(crcPtr + 1) = (uint8_t)(crcVal >> 8); *crcPtr = (uint8_t)(crcVal); break; case L2_CRC16_8005: *(crcPtr + 1) = (uint8_t)(crcVal >> 8); *crcPtr = (uint8_t)(crcVal); break; case L2_CRC8_31: *crcPtr = (uint8_t)crcVal; break; default: Status = EPARAM; break; } return Status; } /*****************************************************************************/ /** * @brief Check data validation by crc. * * @param dataBuff pointer to data buffer. * @param dataLen length of specified data. * @param crcType type of crc * * @return FAILURE crc type not support. * SUCCESS * ******************************************************************************/ bool L2_CrcCheck(uint8_t *dataBuff, uint32_t dataLen, L2_CRC_TYPE crcType) { ASSERT(dataBuff != NULL); int32_t Status; uint32_t crcVal; crcVal = 0U; Status = L2_CrcGen(dataBuff, dataLen, crcType, &crcVal); if (Status == SUCCESS) { if (crcVal == 0) { return true; } else { return false; } } else { return false; } } /** @} LinkLayer_Framing*/ /** @} LinkLayer*/