forked from 0xha0/df_datalink
190 lines
4.7 KiB
C
190 lines
4.7 KiB
C
/*****************************************************************************/
|
|
/**
|
|
* @file framing.h
|
|
* @author FanHao ([email protected])
|
|
* @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 <stdint.h>
|
|
#include <string.h>
|
|
#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*/
|