Added guru softbuffer interface

This commit is contained in:
Xavier Arteaga 2020-11-05 18:48:41 +01:00 committed by Andre Puschmann
parent 8e8889032e
commit 30037d9223
2 changed files with 111 additions and 61 deletions

View File

@ -36,6 +36,7 @@
typedef struct SRSLTE_API {
uint32_t max_cb;
uint32_t max_cb_size;
int16_t** buffer_f;
uint8_t** data;
bool* cb_crc;
@ -44,6 +45,7 @@ typedef struct SRSLTE_API {
typedef struct SRSLTE_API {
uint32_t max_cb;
uint32_t max_cb_size;
uint8_t** buffer_b;
} srslte_softbuffer_tx_t;
@ -51,6 +53,15 @@ typedef struct SRSLTE_API {
SRSLTE_API int srslte_softbuffer_rx_init(srslte_softbuffer_rx_t* q, uint32_t nof_prb);
/**
* @brief Initialises Rx soft-buffer for a number of code blocks and their size
* @param q The Rx soft-buffer pointer
* @param max_cb The maximum number of code blocks to allocate
* @param max_cb_size The code block size to allocate
* @return It returns SRSLTE_SUCCESS if it allocates the soft-buffer succesfully, otherwise it returns SRSLTE_ERROR code
*/
SRSLTE_API int srslte_softbuffer_rx_init_guru(srslte_softbuffer_rx_t* q, uint32_t max_cb, uint32_t max_cb_size);
SRSLTE_API void srslte_softbuffer_rx_reset(srslte_softbuffer_rx_t* p);
SRSLTE_API void srslte_softbuffer_rx_reset_tbs(srslte_softbuffer_rx_t* q, uint32_t tbs);
@ -61,6 +72,15 @@ SRSLTE_API void srslte_softbuffer_rx_free(srslte_softbuffer_rx_t* p);
SRSLTE_API int srslte_softbuffer_tx_init(srslte_softbuffer_tx_t* q, uint32_t nof_prb);
/**
* @brief Initialises Tx soft-buffer for a number of code blocks and their size
* @param q The Tx soft-buffer pointer
* @param max_cb The maximum number of code blocks to allocate
* @param max_cb_size The code block size to allocate
* @return It returns SRSLTE_SUCCESS if it allocates the soft-buffer succesfully, otherwise it returns SRSLTE_ERROR code
*/
SRSLTE_API int srslte_softbuffer_tx_init_guru(srslte_softbuffer_tx_t* q, uint32_t max_cb, uint32_t max_cb_size);
SRSLTE_API void srslte_softbuffer_tx_reset(srslte_softbuffer_tx_t* p);
SRSLTE_API void srslte_softbuffer_tx_reset_tbs(srslte_softbuffer_tx_t* q, uint32_t tbs);

View File

@ -35,15 +35,32 @@
int srslte_softbuffer_rx_init(srslte_softbuffer_rx_t* q, uint32_t nof_prb)
{
int ret = SRSLTE_ERROR_INVALID_INPUTS;
int ret = srslte_ra_tbs_from_idx(SRSLTE_RA_NOF_TBS_IDX - 1, nof_prb);
if (q != NULL) {
if (ret == SRSLTE_ERROR) {
return SRSLTE_ERROR;
}
uint32_t max_cb = (uint32_t)ret / (SRSLTE_TCOD_MAX_LEN_CB - 24) + 1;
uint32_t max_cb_size = SOFTBUFFER_SIZE;
return srslte_softbuffer_rx_init_guru(q, max_cb, max_cb_size);
}
int srslte_softbuffer_rx_init_guru(srslte_softbuffer_rx_t* q, uint32_t max_cb, uint32_t max_cb_size)
{
int ret = SRSLTE_ERROR;
// Protect pointer
if (!q) {
return SRSLTE_ERROR_INVALID_INPUTS;
}
// Initialise object
bzero(q, sizeof(srslte_softbuffer_rx_t));
ret = srslte_ra_tbs_from_idx(SRSLTE_RA_NOF_TBS_IDX - 1, nof_prb);
if (ret != SRSLTE_ERROR) {
q->max_cb = (uint32_t)ret / (SRSLTE_TCOD_MAX_LEN_CB - 24) + 1;
ret = SRSLTE_ERROR;
// Set internal attributes
q->max_cb = max_cb;
q->max_cb_size = max_cb_size;
q->buffer_f = srslte_vec_malloc(sizeof(int16_t*) * q->max_cb);
if (!q->buffer_f) {
@ -62,11 +79,9 @@ int srslte_softbuffer_rx_init(srslte_softbuffer_rx_t* q, uint32_t nof_prb)
perror("malloc");
goto clean_exit;
}
bzero(q->cb_crc, sizeof(bool) * q->max_cb);
// TODO: Use HARQ buffer limitation based on UE category
for (uint32_t i = 0; i < q->max_cb; i++) {
q->buffer_f[i] = srslte_vec_i16_malloc(SOFTBUFFER_SIZE);
q->buffer_f[i] = srslte_vec_i16_malloc(q->max_cb_size);
if (!q->buffer_f[i]) {
perror("malloc");
goto clean_exit;
@ -78,13 +93,14 @@ int srslte_softbuffer_rx_init(srslte_softbuffer_rx_t* q, uint32_t nof_prb)
goto clean_exit;
}
}
// srslte_softbuffer_rx_reset(q);
srslte_softbuffer_rx_reset(q);
// Consider success
ret = SRSLTE_SUCCESS;
}
}
clean_exit:
if (ret != SRSLTE_SUCCESS) {
if (ret) {
srslte_softbuffer_rx_free(q);
}
@ -151,14 +167,29 @@ void srslte_softbuffer_rx_reset_cb(srslte_softbuffer_rx_t* q, uint32_t nof_cb)
int srslte_softbuffer_tx_init(srslte_softbuffer_tx_t* q, uint32_t nof_prb)
{
int ret = SRSLTE_ERROR_INVALID_INPUTS;
int ret = srslte_ra_tbs_from_idx(SRSLTE_RA_NOF_TBS_IDX - 1, nof_prb);
if (ret == SRSLTE_ERROR) {
return SRSLTE_ERROR;
}
uint32_t max_cb = (uint32_t)ret / (SRSLTE_TCOD_MAX_LEN_CB - 24) + 1;
uint32_t max_cb_size = SOFTBUFFER_SIZE;
if (q != NULL) {
return srslte_softbuffer_tx_init_guru(q, max_cb, max_cb_size);
}
int srslte_softbuffer_tx_init_guru(srslte_softbuffer_tx_t* q, uint32_t max_cb, uint32_t max_cb_size)
{
// Protect pointer
if (!q) {
return SRSLTE_ERROR_INVALID_INPUTS;
}
// Initialise object
bzero(q, sizeof(srslte_softbuffer_tx_t));
ret = srslte_ra_tbs_from_idx(SRSLTE_RA_NOF_TBS_IDX - 1, nof_prb);
if (ret != SRSLTE_ERROR) {
q->max_cb = (uint32_t)ret / (SRSLTE_TCOD_MAX_LEN_CB - 24) + 1;
// Set internal attributes
q->max_cb = max_cb;
q->max_cb_size = max_cb_size;
q->buffer_b = srslte_vec_malloc(sizeof(uint8_t*) * q->max_cb);
if (!q->buffer_b) {
@ -168,17 +199,16 @@ int srslte_softbuffer_tx_init(srslte_softbuffer_tx_t* q, uint32_t nof_prb)
// TODO: Use HARQ buffer limitation based on UE category
for (uint32_t i = 0; i < q->max_cb; i++) {
q->buffer_b[i] = srslte_vec_u8_malloc(SOFTBUFFER_SIZE);
q->buffer_b[i] = srslte_vec_u8_malloc(q->max_cb_size);
if (!q->buffer_b[i]) {
perror("malloc");
return SRSLTE_ERROR;
}
}
srslte_softbuffer_tx_reset(q);
ret = SRSLTE_SUCCESS;
}
}
return ret;
return SRSLTE_SUCCESS;
}
void srslte_softbuffer_tx_free(srslte_softbuffer_tx_t* q)