LTE and NR NFAPI integration

This commit is contained in:
Mahesh
2020-11-11 15:10:32 +05:30
parent 643fc632d6
commit e6bf90e2dd
35 changed files with 5371 additions and 454 deletions
@@ -187,7 +187,6 @@ typedef enum {
NFAPI_DL_NODE_SYNC,
NFAPI_TIMING_INFO,
NFAPI_RSSI_REQUEST = 0x0200,
NFAPI_RSSI_RESPONSE,
NFAPI_RSSI_INDICATION,
@@ -1125,12 +1124,12 @@ typedef struct {
uint32_t error_code;
nfapi_pnf_param_general_t pnf_param_general;
nfapi_pnf_phy_t pnf_phy;
// nfapi_pnf_rf_t pnf_rf;
// nfapi_pnf_phy_rel10_t pnf_phy_rel10;
// nfapi_pnf_phy_rel11_t pnf_phy_rel11;
// nfapi_pnf_phy_rel12_t pnf_phy_rel12;
// nfapi_pnf_phy_rel13_t pnf_phy_rel13;
// nfapi_pnf_phy_rel13_nb_iot_t pnf_phy_rel13_nb_iot;
nfapi_pnf_rf_t pnf_rf;
nfapi_pnf_phy_rel10_t pnf_phy_rel10;
nfapi_pnf_phy_rel11_t pnf_phy_rel11;
nfapi_pnf_phy_rel12_t pnf_phy_rel12;
nfapi_pnf_phy_rel13_t pnf_phy_rel13;
nfapi_pnf_phy_rel13_nb_iot_t pnf_phy_rel13_nb_iot;
nfapi_pnf_phy_rel15_t pnf_phy_rel15;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_pnf_param_response_t;
@@ -2498,8 +2497,7 @@ typedef struct {
typedef struct {
nfapi_p7_message_header_t header;
uint32_t t1;
//int32_t delta_sfn_sf;
int32_t delta_sfn_slot;
int32_t delta_sfn_sf;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_dl_node_sync_t;
@@ -2514,35 +2512,49 @@ typedef struct {
typedef struct {
nfapi_p7_message_header_t header;
uint32_t last_sfn_sf;
uint32_t last_sfn;
uint32_t last_slot;
uint32_t time_since_last_timing_info;
uint32_t dl_config_jitter;
uint32_t tx_request_jitter;
uint32_t ul_config_jitter;
uint32_t hi_dci0_jitter;
uint32_t dl_tti_jitter;
uint32_t tx_data_request_jitter;
uint32_t ul_tti_jitter;
uint32_t ul_dci_jitter;
int32_t dl_config_latest_delay;
int32_t tx_request_latest_delay;
int32_t ul_config_latest_delay;
int32_t hi_dci0_latest_delay;
int32_t dl_tti_latest_delay;
int32_t tx_data_request_latest_delay;
int32_t ul_tti_latest_delay;
int32_t ul_dci_latest_delay;
int32_t dl_config_earliest_arrival;
int32_t tx_request_earliest_arrival;
int32_t ul_config_earliest_arrival;
int32_t hi_dci0_earliest_arrival;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_timing_info_t;
typedef struct {
nfapi_p7_message_header_t header;
uint32_t last_sfn;
uint32_t last_slot;
uint32_t time_since_last_timing_info;
uint32_t dl_tti_jitter;
uint32_t tx_data_request_jitter;
uint32_t ul_tti_jitter;
uint32_t ul_dci_jitter;
int32_t dl_tti_latest_delay;
int32_t tx_data_request_latest_delay;
int32_t ul_tti_latest_delay;
int32_t ul_dci_latest_delay;
int32_t dl_tti_earliest_arrival;
int32_t tx_data_request_earliest_arrival;
int32_t ul_tti_earliest_arrival;
int32_t ul_dci_earliest_arrival;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_timing_info_t;
} nfapi_nr_timing_info_t;
typedef struct {
nfapi_tl_t tl;
@@ -3955,7 +3967,7 @@ int nfapi_p4_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUn
*
*/
int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config);
//int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config);
int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config);
/*! \brief Decodes an NFAPI P5 message header
* \param pMessageBuf A pointer to an encoded P5 message header
@@ -3979,7 +3991,7 @@ int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, vo
*
* The function will decode a byte stream pointed to by pMessageBuf into a nfapi p5 message structure pointer to by pUnpackedBuf
*/
//int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config);
int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config);
int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config);
/*! \brief Encodes an NFAPI P7 message to a buffer
@@ -3993,6 +4005,7 @@ int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUn
*
*/
int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config);
int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config);
/*! \brief Decodes an NFAPI P7 message header
* \param pMessageBuf A pointer to an encoded P7 message header
@@ -4018,6 +4031,7 @@ int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, vo
* The function will decode a byte stream pointed to by pMessageBuf into a nfapi p7 message structure pointer to by pUnpackedBuf
*/
int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config);
int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config);
/*! \brief Calculates the checksum of a message
*
@@ -78,7 +78,11 @@ typedef enum {
NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST= 0x0104,
NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE= 0x0105,
NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST= 0x0106,
NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE= 0x0107
NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE= 0x0107,
NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC = 0x0180,
NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC,
NFAPI_NR_PHY_MSG_TYPE_TIMING_INFO
} nfapi_nr_phy_msg_type_e;
// SCF222_5G-FAPI_PHY_SPI_Specificayion.pdf Section 3.3
@@ -88,10 +92,6 @@ typedef enum {
//same with nfapi_param_request_t
typedef struct {
nfapi_p4_p5_message_header_t header;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_nr_param_request_t;
/*typedef struct {
@@ -1049,6 +1049,22 @@ typedef struct {
} nfapi_nr_dl_tti_request_body_t;
*/
typedef struct {
nfapi_p7_message_header_t header;
uint32_t t1;
int32_t delta_sfn_slot;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_nr_dl_node_sync_t;
typedef struct {
nfapi_p7_message_header_t header;
uint32_t t1;
uint32_t t2;
uint32_t t3;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_nr_ul_node_sync_t;
typedef struct {
nfapi_p7_message_header_t header;
/// System Frame Number (0-1023)
File diff suppressed because it is too large Load Diff
+612 -72
View File
@@ -3260,15 +3260,34 @@ static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint
pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
}
static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
}
static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
}
static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
}
static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
@@ -3283,6 +3302,27 @@ static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *
{
nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg;
return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
}
static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
{
nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
@@ -3299,30 +3339,13 @@ static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *
pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
#if LTE
return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
#endif
}
// Main pack function - public
int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
{
nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
uint8_t *pWritePackedMessage = pPackedBuf;
@@ -3374,7 +3397,172 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
break;
#if 0
case NFAPI_UE_RELEASE_REQUEST:
result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_UE_RELEASE_RESPONSE:
result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_HARQ_INDICATION:
result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_CRC_INDICATION:
result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_RX_ULSCH_INDICATION:
//printf("RX ULSCH\n");
result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_RACH_INDICATION:
result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_SRS_INDICATION:
result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_RX_SR_INDICATION:
result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_RX_CQI_INDICATION:
result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_LBT_DL_CONFIG_REQUEST:
result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_LBT_DL_INDICATION:
result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_NB_HARQ_INDICATION:
result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_NRACH_INDICATION:
result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
break;
case NFAPI_TIMING_INFO:
result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
break;
default:
{
if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
{
if(config && config->pack_p7_vendor_extension)
{
result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
}
else
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
}
}
else
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
}
}
break;
}
if(result == 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
return -1;
}
// check for a valid message length
uintptr_t msgHead = (uintptr_t)pPackedBuf;
uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
uint32_t packedMsgLen = msgEnd - msgHead;
uint16_t packedMsgLen16;
if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
return -1;
}
else
{
packedMsgLen16 = (uint16_t)packedMsgLen;
}
// Update the message length in the header
pMessageHeader->message_length = packedMsgLen16;
if(!push16(packedMsgLen16, &pPackedLengthField, end))
return -1;
if(1)
{
//quick test
if(pMessageHeader->message_length != packedMsgLen)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
}
}
return (packedMsgLen);
}
int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
{
nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
uint8_t *pWritePackedMessage = pPackedBuf;
uint8_t *pPackedLengthField = &pWritePackedMessage[4];
uint8_t *end = pPackedBuf + packedBufLen;
if (pMessageBuf == NULL || pPackedBuf == NULL)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
return -1;
}
/*
printf("\n P7 MESSAGE SENT: \n");
for(int i=0; i< packedBufLen; i++){
printf("%d", *(uint8_t *)(pMessageBuf + i));
}
printf("\n");
*/
// process the header
if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
return -1;
}
if (pMessageHeader->message_id != NFAPI_TIMING_INFO)
{
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
}
// look for the specific message
uint8_t result = 0;
switch (pMessageHeader->message_id)
{
case NFAPI_DL_CONFIG_REQUEST:
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__);
result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
@@ -3390,7 +3578,6 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
case NFAPI_HI_DCI0_REQUEST:
result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
break;
#endif
case NFAPI_UE_RELEASE_REQUEST:
result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
@@ -3518,8 +3705,6 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
return (packedMsgLen);
}
// Unpack routines
// NR:
static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
@@ -7228,9 +7413,9 @@ static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end,
unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
}
static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
{
nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
unpack_p7_tlv_t unpack_fns[] =
{
@@ -7241,6 +7426,35 @@ static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void
unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
}
static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
{
nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
unpack_p7_tlv_t unpack_fns[] =
{
};
return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
}
static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
{
nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
unpack_p7_tlv_t unpack_fns[] =
{
};
return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
}
static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
{
nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
@@ -7263,6 +7477,32 @@ static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void
{
};
return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
}
static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
{
nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
unpack_p7_tlv_t unpack_fns[] =
{
};
return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
@@ -7279,27 +7519,10 @@ static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void
pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
#if LTE
return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
#endif
}
// unpack length check
static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
@@ -7421,6 +7644,126 @@ static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen
return retLen;
}
static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
{
int retLen = 0;
switch (msgId)
{
case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
retLen = sizeof(nfapi_nr_dl_tti_request_t);
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
retLen = sizeof(nfapi_nr_ul_tti_request_t);
break;
case NFAPI_SUBFRAME_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
retLen = sizeof(nfapi_subframe_indication_t);
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
retLen = sizeof(nfapi_nr_ul_dci_request_t);
break;
case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
retLen = sizeof(nfapi_nr_tx_data_request_t);
break;
case NFAPI_HARQ_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
retLen = sizeof(nfapi_harq_indication_t);
break;
case NFAPI_CRC_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
retLen = sizeof(nfapi_crc_indication_t);
break;
case NFAPI_RX_ULSCH_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
retLen = sizeof(nfapi_rx_indication_t);
break;
case NFAPI_RACH_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
retLen = sizeof(nfapi_rach_indication_t);
break;
case NFAPI_SRS_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
retLen = sizeof(nfapi_srs_indication_t);
break;
case NFAPI_RX_SR_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
retLen = sizeof(nfapi_sr_indication_t);
break;
case NFAPI_RX_CQI_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
retLen = sizeof(nfapi_cqi_indication_t);
break;
case NFAPI_LBT_DL_CONFIG_REQUEST:
if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
retLen = sizeof(nfapi_lbt_dl_config_request_t);
break;
case NFAPI_LBT_DL_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
retLen = sizeof(nfapi_lbt_dl_indication_t);
break;
case NFAPI_NB_HARQ_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
retLen = sizeof(nfapi_nb_harq_indication_t);
break;
case NFAPI_NRACH_INDICATION:
if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
retLen = sizeof(nfapi_nrach_indication_t);
break;
case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
retLen = sizeof(nfapi_nr_dl_node_sync_t);
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
retLen = sizeof(nfapi_nr_ul_node_sync_t);
break;
case NFAPI_TIMING_INFO:
if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
retLen = sizeof(nfapi_timing_info_t);
break;
case NFAPI_UE_RELEASE_REQUEST:
if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
retLen = sizeof(nfapi_ue_release_request_t);
break;
case NFAPI_UE_RELEASE_RESPONSE:
if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
retLen = sizeof(nfapi_ue_release_response_t);
break;
default:
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
break;
}
return retLen;
}
// Main unpack functions - public
@@ -7513,32 +7856,6 @@ int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUn
// look for the specific message
switch (pMessageHeader->message_id)
{
case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
if (check_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
result = unpack_dl_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
if (check_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
result = unpack_ul_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
if (check_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
result = unpack_tx_data_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
if (check_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
result = unpack_ul_dci_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
#if 0
case NFAPI_DL_CONFIG_REQUEST:
if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
result = unpack_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
@@ -7564,8 +7881,6 @@ int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUn
else
return -1;
break;
#endif
case NFAPI_UE_RELEASE_REQUEST:
if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
@@ -7706,3 +8021,228 @@ int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUn
return 0;
}
int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
{
int result = 0;
nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
uint8_t *pReadPackedMessage = pMessageBuf;
uint8_t *end = pMessageBuf + messageBufLen;
if (pMessageBuf == NULL || pUnpackedBuf == NULL)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
return -1;
}
if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
return -1;
}
/*
uint8_t *ptr = pMessageBuf;
printf("\n Read P7 message unpack: ");
while(ptr < end){
printf(" %d ", *ptr);
ptr++;
}
printf("\n");
*/
// clean the supplied buffer for - tag value blanking
(void)memset(pUnpackedBuf, 0, unpackedBufLen);
// process the header
if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
return -1;
}
if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
return -1;
}
/*
if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
return -1;
}
*/
// look for the specific message
switch (pMessageHeader->message_id)
{
case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
result = unpack_dl_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
result = unpack_ul_tti_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
result = unpack_tx_data_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
result = unpack_ul_dci_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_UE_RELEASE_REQUEST:
if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
result = unpack_ue_release_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_HARQ_INDICATION:
if (check_nr_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
result = unpack_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_CRC_INDICATION:
if (check_nr_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config);
else
return -1;
break;
case NFAPI_RX_ULSCH_INDICATION:
if (check_nr_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
result = unpack_rx_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_RACH_INDICATION:
if (check_nr_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
result = unpack_rach_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_SRS_INDICATION:
if (check_nr_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
result = unpack_srs_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_RX_SR_INDICATION:
if (check_nr_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
result = unpack_sr_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_RX_CQI_INDICATION:
if (check_nr_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
result = unpack_cqi_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_LBT_DL_CONFIG_REQUEST:
if (check_nr_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
result = unpack_lbt_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_LBT_DL_INDICATION:
if (check_nr_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
result = unpack_lbt_dl_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NB_HARQ_INDICATION:
if (check_nr_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
result = unpack_nb_harq_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NRACH_INDICATION:
if (check_nr_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
result = unpack_nrach_indication(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
result = unpack_nr_dl_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
else
return -1;
break;
case NFAPI_TIMING_INFO:
if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
case NFAPI_UE_RELEASE_RESPONSE:
if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
result = unpack_ue_release_resp(&pReadPackedMessage, end, pMessageHeader, config);
else
return -1;
break;
default:
if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
{
if(config && config->unpack_p7_vendor_extension)
{
result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
}
else
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
}
}
else
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
}
break;
}
if(result == 0)
return -1;
else
return 0;
}