mirror of https://github.com/pvnis/srsRAN_4G.git
Moved HARQ to MAC. Redesigned RA and DL/UL grant framework
parent
dc9464be9c
commit
addd786e5f
@ -0,0 +1,58 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "srslte/config.h"
|
||||||
|
|
||||||
|
#ifndef CBSEGM_H
|
||||||
|
#define CBSEGM_H
|
||||||
|
|
||||||
|
#define SRSLTE_NOF_TC_CB_SIZES 188
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct SRSLTE_API {
|
||||||
|
uint32_t F;
|
||||||
|
uint32_t C;
|
||||||
|
uint32_t K1;
|
||||||
|
uint32_t K2;
|
||||||
|
uint32_t C1;
|
||||||
|
uint32_t C2;
|
||||||
|
uint32_t tbs;
|
||||||
|
} srslte_cbsegm_t;
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_cbsegm(srslte_cbsegm_t *s,
|
||||||
|
uint32_t tbs);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_cbsegm_cbsize(uint32_t index);
|
||||||
|
|
||||||
|
SRSLTE_API bool srslte_cbsegm_cbsize_isvalid(uint32_t size);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_cbsegm_cbindex(uint32_t long_cb);
|
||||||
|
|
||||||
|
#endif
|
@ -1,98 +0,0 @@
|
|||||||
/**
|
|
||||||
*
|
|
||||||
* \section COPYRIGHT
|
|
||||||
*
|
|
||||||
* Copyright 2013-2014 The srsLTE Developers. See the
|
|
||||||
* COPYRIGHT file at the top-level directory of this distribution.
|
|
||||||
*
|
|
||||||
* \section LICENSE
|
|
||||||
*
|
|
||||||
* This file is part of the srsLTE library.
|
|
||||||
*
|
|
||||||
* srsLTE is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of
|
|
||||||
* the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* srsLTE is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* A copy of the GNU Lesser General Public License can be found in
|
|
||||||
* the LICENSE file in the top-level directory of this distribution
|
|
||||||
* and at http://www.gnu.org/licenses/.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* File: harq.h
|
|
||||||
*
|
|
||||||
* Description: Hybrid Automatic Repeat Request (HARQ)
|
|
||||||
*
|
|
||||||
* Reference:
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef HARQ_
|
|
||||||
#define HARQ_
|
|
||||||
|
|
||||||
#include "srslte/config.h"
|
|
||||||
#include "srslte/common/phy_common.h"
|
|
||||||
#include "srslte/phch/ra.h"
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct SRSLTE_API {
|
|
||||||
uint32_t F;
|
|
||||||
uint32_t C;
|
|
||||||
uint32_t K1;
|
|
||||||
uint32_t K2;
|
|
||||||
uint32_t C1;
|
|
||||||
uint32_t C2;
|
|
||||||
} srslte_harq_cbsegm_t;
|
|
||||||
|
|
||||||
typedef struct SRSLTE_API {
|
|
||||||
srslte_ra_mcs_t mcs;
|
|
||||||
uint32_t rv;
|
|
||||||
uint32_t sf_idx;
|
|
||||||
srslte_ra_dl_alloc_t dl_alloc;
|
|
||||||
srslte_ra_ul_alloc_t ul_alloc;
|
|
||||||
srslte_cell_t cell;
|
|
||||||
|
|
||||||
uint32_t nof_re; // Number of RE per subframe
|
|
||||||
uint32_t nof_bits; // Number of bits per subframe
|
|
||||||
uint32_t nof_symb; // Number of symbols per subframe
|
|
||||||
uint32_t nof_prb; // Number of allocated PRB per subframe.
|
|
||||||
|
|
||||||
uint32_t max_cb;
|
|
||||||
uint32_t w_buff_size;
|
|
||||||
float **pdsch_w_buff_f;
|
|
||||||
uint8_t **pdsch_w_buff_c;
|
|
||||||
|
|
||||||
srslte_harq_cbsegm_t cb_segm;
|
|
||||||
|
|
||||||
} srslte_harq_t;
|
|
||||||
|
|
||||||
SRSLTE_API int srslte_harq_init(srslte_harq_t * q,
|
|
||||||
srslte_cell_t cell);
|
|
||||||
|
|
||||||
SRSLTE_API int srslte_harq_setup_dl(srslte_harq_t *p,
|
|
||||||
srslte_ra_mcs_t mcs,
|
|
||||||
uint32_t rv,
|
|
||||||
uint32_t sf_idx,
|
|
||||||
srslte_ra_dl_alloc_t *prb_alloc);
|
|
||||||
|
|
||||||
SRSLTE_API int srslte_harq_setup_ul(srslte_harq_t *p,
|
|
||||||
srslte_ra_mcs_t mcs,
|
|
||||||
uint32_t rv,
|
|
||||||
uint32_t sf_idx,
|
|
||||||
srslte_ra_ul_alloc_t *prb_alloc);
|
|
||||||
|
|
||||||
SRSLTE_API void srslte_harq_reset(srslte_harq_t *p);
|
|
||||||
|
|
||||||
SRSLTE_API void srslte_harq_free(srslte_harq_t *p);
|
|
||||||
|
|
||||||
SRSLTE_API int srslte_harq_codeblock_segmentation(srslte_harq_cbsegm_t *s,
|
|
||||||
uint32_t tbs);
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* File: pdsch_cfg.h
|
||||||
|
*
|
||||||
|
* Description: Physical downlink shared channel configuration
|
||||||
|
*
|
||||||
|
* Reference: 3GPP TS 36.211 version 10.0.0 Release 10 Sec. 6.4
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef PDSCHCFG_
|
||||||
|
#define PDSCHCFG_
|
||||||
|
|
||||||
|
#include "srslte/phch/ra.h"
|
||||||
|
#include "srslte/phch/softbuffer.h"
|
||||||
|
#include "srslte/fec/cbsegm.h"
|
||||||
|
|
||||||
|
typedef struct SRSLTE_API {
|
||||||
|
srslte_cbsegm_t cb_segm;
|
||||||
|
srslte_ra_dl_grant_t grant;
|
||||||
|
uint32_t rv;
|
||||||
|
uint32_t sf_idx;
|
||||||
|
} srslte_pdsch_cfg_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* File: pdsch_cfg.h
|
||||||
|
*
|
||||||
|
* Description: Physical downlink shared channel configuration
|
||||||
|
*
|
||||||
|
* Reference: 3GPP TS 36.211 version 10.0.0 Release 10 Sec. 6.4
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef PUSCHCFG_
|
||||||
|
#define PUSCHCFG_
|
||||||
|
|
||||||
|
#include "srslte/phch/ra.h"
|
||||||
|
#include "srslte/phch/softbuffer.h"
|
||||||
|
#include "srslte/fec/cbsegm.h"
|
||||||
|
|
||||||
|
typedef struct SRSLTE_API {
|
||||||
|
srslte_cbsegm_t cb_segm;
|
||||||
|
srslte_ra_ul_grant_t grant;
|
||||||
|
uint32_t rv;
|
||||||
|
uint32_t sf_idx;
|
||||||
|
srslte_cp_t cp;
|
||||||
|
} srslte_pusch_cfg_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* File: softbuffer.h
|
||||||
|
*
|
||||||
|
* Description: Buffer for RX and TX soft bits. This should be provided by MAC.
|
||||||
|
* Provided here basically for the examples.
|
||||||
|
*
|
||||||
|
* Reference:
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef SOFTBUFFER_
|
||||||
|
#define SOFTBUFFER_
|
||||||
|
|
||||||
|
#include "srslte/config.h"
|
||||||
|
#include "srslte/common/phy_common.h"
|
||||||
|
|
||||||
|
typedef struct SRSLTE_API {
|
||||||
|
uint32_t max_cb;
|
||||||
|
uint32_t buff_size;
|
||||||
|
float **buffer_f;
|
||||||
|
} srslte_softbuffer_rx_t;
|
||||||
|
|
||||||
|
typedef struct SRSLTE_API {
|
||||||
|
uint32_t max_cb;
|
||||||
|
uint32_t buff_size;
|
||||||
|
uint8_t **buffer_b;
|
||||||
|
} srslte_softbuffer_tx_t;
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_softbuffer_rx_init(srslte_softbuffer_rx_t * q,
|
||||||
|
srslte_cell_t cell);
|
||||||
|
|
||||||
|
SRSLTE_API void srslte_softbuffer_rx_reset(srslte_softbuffer_rx_t *p);
|
||||||
|
|
||||||
|
SRSLTE_API void srslte_softbuffer_rx_free(srslte_softbuffer_rx_t *p);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_softbuffer_tx_init(srslte_softbuffer_tx_t * q,
|
||||||
|
srslte_cell_t cell);
|
||||||
|
|
||||||
|
SRSLTE_API void srslte_softbuffer_tx_reset(srslte_softbuffer_tx_t *p);
|
||||||
|
|
||||||
|
SRSLTE_API void srslte_softbuffer_tx_free(srslte_softbuffer_tx_t *p);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,94 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "srslte/srslte.h"
|
||||||
|
#include "srslte/ue_itf/sched_grant.h"
|
||||||
|
|
||||||
|
#ifndef UEDLSCHEDGRANT_H
|
||||||
|
#define UEDLSCHEDGRANT_H
|
||||||
|
|
||||||
|
namespace srslte {
|
||||||
|
namespace ue {
|
||||||
|
|
||||||
|
/* Uplink/Downlink scheduling grant generated by a successfully decoded PDCCH */
|
||||||
|
class SRSLTE_API dl_sched_grant : public sched_grant {
|
||||||
|
public:
|
||||||
|
|
||||||
|
dl_sched_grant(uint16_t rnti) : sched_grant(rnti) {}
|
||||||
|
|
||||||
|
uint32_t get_rv() {
|
||||||
|
return dl_dci.rv_idx;
|
||||||
|
}
|
||||||
|
void set_rv(uint32_t rv) {
|
||||||
|
dl_dci.rv_idx = rv;
|
||||||
|
}
|
||||||
|
bool get_ndi() {
|
||||||
|
return dl_dci.ndi;
|
||||||
|
}
|
||||||
|
void set_ndi(bool value) {
|
||||||
|
dl_dci.ndi = value;
|
||||||
|
}
|
||||||
|
uint32_t get_harq_process() {
|
||||||
|
return dl_dci.harq_process;
|
||||||
|
}
|
||||||
|
void get_dl_grant(srslte_ra_dl_grant_t *ul_grant) {
|
||||||
|
memcpy(ul_grant, &grant, sizeof(srslte_ra_dl_grant_t));
|
||||||
|
}
|
||||||
|
bool is_sps_release() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t get_tbs() {
|
||||||
|
return grant.mcs.tbs;
|
||||||
|
}
|
||||||
|
uint32_t get_ncce() {
|
||||||
|
return ncce;
|
||||||
|
}
|
||||||
|
bool create_from_dci(srslte_dci_msg_t *msg, srslte_cell_t cell, uint32_t cfi, uint32_t sf_idx, uint32_t ncce_) {
|
||||||
|
ncce = ncce_;
|
||||||
|
if (srslte_dci_msg_to_dl_grant(msg, rnti, cell, cfi, sf_idx, &dl_dci, &grant)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void get_pdsch_cfg(uint32_t sf_idx, srslte_pdsch_cfg_t *cfg) {
|
||||||
|
srslte_cbsegm(&cfg->cb_segm, grant.mcs.tbs);
|
||||||
|
memcpy(&cfg->grant, &grant, sizeof(srslte_ra_dl_grant_t));
|
||||||
|
cfg->sf_idx = sf_idx;
|
||||||
|
cfg->rv = dl_dci.rv_idx;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
srslte_ra_dl_grant_t grant;
|
||||||
|
srslte_ra_dl_dci_t dl_dci;
|
||||||
|
uint32_t ncce;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,117 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "srslte/srslte.h"
|
||||||
|
#include "srslte/ue_itf/sched_grant.h"
|
||||||
|
|
||||||
|
#ifndef UEULSCHEDGRANT_H
|
||||||
|
#define UEULSCHEDGRANT_H
|
||||||
|
|
||||||
|
namespace srslte {
|
||||||
|
namespace ue {
|
||||||
|
|
||||||
|
/* Uplink/Downlink scheduling grant generated by a successfully decoded PDCCH */
|
||||||
|
class SRSLTE_API ul_sched_grant : public sched_grant {
|
||||||
|
public:
|
||||||
|
|
||||||
|
ul_sched_grant(uint16_t rnti) : sched_grant(rnti) {}
|
||||||
|
|
||||||
|
uint32_t get_rv() {
|
||||||
|
return ul_dci.rv_idx;
|
||||||
|
}
|
||||||
|
void set_rv(uint32_t rv) {
|
||||||
|
ul_dci.rv_idx = rv;
|
||||||
|
}
|
||||||
|
bool get_ndi() {
|
||||||
|
return ul_dci.ndi;
|
||||||
|
}
|
||||||
|
void set_ndi(bool value) {
|
||||||
|
ul_dci.ndi = value;
|
||||||
|
}
|
||||||
|
bool get_cqi_request() {
|
||||||
|
return ul_dci.cqi_request;
|
||||||
|
}
|
||||||
|
void get_ul_grant(srslte_ra_ul_grant_t *ul_grant) {
|
||||||
|
memcpy(ul_grant, &grant, sizeof(srslte_ra_ul_grant_t));
|
||||||
|
}
|
||||||
|
bool is_sps_release() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32_t get_tbs() {
|
||||||
|
return grant.mcs.tbs;
|
||||||
|
}
|
||||||
|
uint32_t get_current_tx_nb() {
|
||||||
|
return current_tx_nb;
|
||||||
|
}
|
||||||
|
void set_current_tx_nb(uint32_t current_tx_nb) {
|
||||||
|
current_tx_nb = current_tx_nb;
|
||||||
|
}
|
||||||
|
uint32_t get_I_lowest() {
|
||||||
|
return grant.n_prb[0];
|
||||||
|
}
|
||||||
|
uint32_t get_n_dmrs() {
|
||||||
|
return ul_dci.n_dmrs;
|
||||||
|
}
|
||||||
|
bool create_from_dci(srslte_dci_msg_t *msg, srslte_cell_t cell, uint32_t N_srs, uint32_t n_rb_ho) {
|
||||||
|
if (srslte_dci_msg_to_ul_grant(msg, cell, N_srs, n_rb_ho, &ul_dci, &grant)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (SRSLTE_VERBOSE_ISINFO()) {
|
||||||
|
srslte_ra_pusch_fprint(stdout, &ul_dci, cell.nof_prb);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool create_from_rar(srslte_dci_rar_grant_t *rar, srslte_cell_t cell, uint32_t N_srs, uint32_t n_rb_ho) {
|
||||||
|
if (srslte_dci_rar_to_ul_grant(rar, cell, N_srs, n_rb_ho, &ul_dci, &grant)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (SRSLTE_VERBOSE_ISINFO()) {
|
||||||
|
srslte_ra_pusch_fprint(stdout, &ul_dci, cell.nof_prb);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void to_pusch_cfg(uint32_t sf_idx, srslte_cp_t cp, srslte_pusch_cfg_t *cfg) {
|
||||||
|
srslte_cbsegm(&cfg->cb_segm, grant.mcs.tbs);
|
||||||
|
cfg->cp = cp;
|
||||||
|
memcpy(&cfg->grant, &grant, sizeof(srslte_ra_ul_grant_t));
|
||||||
|
cfg->rv = ul_dci.rv_idx;
|
||||||
|
cfg->sf_idx = sf_idx;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
srslte_ra_ul_grant_t grant;
|
||||||
|
srslte_ra_ul_dci_t ul_dci;
|
||||||
|
uint32_t current_tx_nb;
|
||||||
|
uint16_t rnti;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,137 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <strings.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "srslte/fec/turbodecoder.h"
|
||||||
|
#include "srslte/fec/cbsegm.h"
|
||||||
|
#include "srslte/utils/debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
const uint32_t tc_cb_sizes[SRSLTE_NOF_TC_CB_SIZES] = { 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120,
|
||||||
|
128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232,
|
||||||
|
240, 248, 256, 264, 272, 280, 288, 296, 304, 312, 320, 328, 336, 344,
|
||||||
|
352, 360, 368, 376, 384, 392, 400, 408, 416, 424, 432, 440, 448, 456,
|
||||||
|
464, 472, 480, 488, 496, 504, 512, 528, 544, 560, 576, 592, 608, 624,
|
||||||
|
640, 656, 672, 688, 704, 720, 736, 752, 768, 784, 800, 816, 832, 848,
|
||||||
|
864, 880, 896, 912, 928, 944, 960, 976, 992, 1008, 1024, 1056, 1088,
|
||||||
|
1120, 1152, 1184, 1216, 1248, 1280, 1312, 1344, 1376, 1408, 1440, 1472,
|
||||||
|
1504, 1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856,
|
||||||
|
1888, 1920, 1952, 1984, 2016, 2048, 2112, 2176, 2240, 2304, 2368, 2432,
|
||||||
|
2496, 2560, 2624, 2688, 2752, 2816, 2880, 2944, 3008, 3072, 3136, 3200,
|
||||||
|
3264, 3328, 3392, 3456, 3520, 3584, 3648, 3712, 3776, 3840, 3904, 3968,
|
||||||
|
4032, 4096, 4160, 4224, 4288, 4352, 4416, 4480, 4544, 4608, 4672, 4736,
|
||||||
|
4800, 4864, 4928, 4992, 5056, 5120, 5184, 5248, 5312, 5376, 5440, 5504,
|
||||||
|
5568, 5632, 5696, 5760, 5824, 5888, 5952, 6016, 6080, 6144 };
|
||||||
|
|
||||||
|
/* Calculate Codeblock Segmentation as in Section 5.1.2 of 36.212 */
|
||||||
|
int srslte_cbsegm(srslte_cbsegm_t *s, uint32_t tbs) {
|
||||||
|
uint32_t Bp, B, idx1;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (tbs == 0) {
|
||||||
|
bzero(s, sizeof(srslte_cbsegm_t));
|
||||||
|
ret = SRSLTE_SUCCESS;
|
||||||
|
} else {
|
||||||
|
B = tbs + 24;
|
||||||
|
s->tbs = tbs;
|
||||||
|
|
||||||
|
/* Calculate CB sizes */
|
||||||
|
if (B <= SRSLTE_TCOD_MAX_LEN_CB) {
|
||||||
|
s->C = 1;
|
||||||
|
Bp = B;
|
||||||
|
} else {
|
||||||
|
s->C = (uint32_t) ceilf((float) B / (SRSLTE_TCOD_MAX_LEN_CB - 24));
|
||||||
|
Bp = B + 24 * s->C;
|
||||||
|
}
|
||||||
|
ret = srslte_cbsegm_cbindex((Bp-1) / s->C + 1);
|
||||||
|
if (ret != SRSLTE_ERROR) {
|
||||||
|
idx1 = (uint32_t) ret;
|
||||||
|
ret = srslte_cbsegm_cbsize(idx1);
|
||||||
|
if (ret != SRSLTE_ERROR) {
|
||||||
|
s->K1 = (uint32_t) ret;
|
||||||
|
if (idx1 > 0) {
|
||||||
|
ret = srslte_cbsegm_cbsize(idx1 - 1);
|
||||||
|
}
|
||||||
|
if (ret != SRSLTE_ERROR) {
|
||||||
|
if (s->C == 1) {
|
||||||
|
s->K2 = 0;
|
||||||
|
s->C2 = 0;
|
||||||
|
s->C1 = 1;
|
||||||
|
} else {
|
||||||
|
s->K2 = (uint32_t) ret;
|
||||||
|
s->C2 = (s->C * s->K1 - Bp) / (s->K1 - s->K2);
|
||||||
|
s->C1 = s->C - s->C2;
|
||||||
|
}
|
||||||
|
s->F = s->C1 * s->K1 + s->C2 * s->K2 - Bp;
|
||||||
|
INFO("CB Segmentation: TBS: %d, C=%d, C+=%d K+=%d, C-=%d, K-=%d, F=%d, Bp=%d\n",
|
||||||
|
tbs, s->C, s->C1, s->K1, s->C2, s->K2, s->F, Bp);
|
||||||
|
ret = SRSLTE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finds index of minimum K>=long_cb in Table 5.1.3-3 of 36.212
|
||||||
|
*/
|
||||||
|
int srslte_cbsegm_cbindex(uint32_t long_cb) {
|
||||||
|
int j = 0;
|
||||||
|
while (j < SRSLTE_NOF_TC_CB_SIZES && tc_cb_sizes[j] < long_cb) {
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == SRSLTE_NOF_TC_CB_SIZES) {
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
} else {
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns Turbo coder interleaver size for Table 5.1.3-3 (36.212) index
|
||||||
|
*/
|
||||||
|
int srslte_cbsegm_cbsize(uint32_t index) {
|
||||||
|
if (index < SRSLTE_NOF_TC_CB_SIZES) {
|
||||||
|
return (int) tc_cb_sizes[index];
|
||||||
|
} else {
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool srslte_cbsegm_cbsize_isvalid(uint32_t size) {
|
||||||
|
for (int i=0;i<SRSLTE_NOF_TC_CB_SIZES;i++) {
|
||||||
|
if (tc_cb_sizes[i] == size) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
@ -1,248 +0,0 @@
|
|||||||
/**
|
|
||||||
*
|
|
||||||
* \section COPYRIGHT
|
|
||||||
*
|
|
||||||
* Copyright 2013-2014 The srsLTE Developers. See the
|
|
||||||
* COPYRIGHT file at the top-level directory of this distribution.
|
|
||||||
*
|
|
||||||
* \section LICENSE
|
|
||||||
*
|
|
||||||
* This file is part of the srsLTE library.
|
|
||||||
*
|
|
||||||
* srsLTE is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of
|
|
||||||
* the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* srsLTE is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* A copy of the GNU Lesser General Public License can be found in
|
|
||||||
* the LICENSE file in the top-level directory of this distribution
|
|
||||||
* and at http://www.gnu.org/licenses/.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <strings.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "srslte/common/phy_common.h"
|
|
||||||
#include "srslte/phch/ra.h"
|
|
||||||
#include "srslte/phch/harq.h"
|
|
||||||
#include "srslte/fec/turbodecoder.h"
|
|
||||||
#include "srslte/utils/vector.h"
|
|
||||||
#include "srslte/utils/debug.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define MAX_PDSCH_RE(cp) (2 * SRSLTE_CP_NSYMB(cp) * 12)
|
|
||||||
|
|
||||||
/* Calculate Codeblock Segmentation as in Section 5.1.2 of 36.212 */
|
|
||||||
int srslte_harq_codeblock_segmentation(srslte_harq_cbsegm_t *s, uint32_t tbs) {
|
|
||||||
uint32_t Bp, B, idx1;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (tbs == 0) {
|
|
||||||
bzero(s, sizeof(srslte_harq_cbsegm_t));
|
|
||||||
ret = SRSLTE_SUCCESS;
|
|
||||||
} else {
|
|
||||||
B = tbs + 24;
|
|
||||||
|
|
||||||
/* Calculate CB sizes */
|
|
||||||
if (B <= MAX_LONG_CB) {
|
|
||||||
s->C = 1;
|
|
||||||
Bp = B;
|
|
||||||
} else {
|
|
||||||
s->C = (uint32_t) ceilf((float) B / (MAX_LONG_CB - 24));
|
|
||||||
Bp = B + 24 * s->C;
|
|
||||||
}
|
|
||||||
ret = srslte_find_cb_index((Bp-1) / s->C + 1);
|
|
||||||
if (ret != SRSLTE_ERROR) {
|
|
||||||
idx1 = (uint32_t) ret;
|
|
||||||
ret = srslte_cb_size(idx1);
|
|
||||||
if (ret != SRSLTE_ERROR) {
|
|
||||||
s->K1 = (uint32_t) ret;
|
|
||||||
if (idx1 > 0) {
|
|
||||||
ret = srslte_cb_size(idx1 - 1);
|
|
||||||
}
|
|
||||||
if (ret != SRSLTE_ERROR) {
|
|
||||||
if (s->C == 1) {
|
|
||||||
s->K2 = 0;
|
|
||||||
s->C2 = 0;
|
|
||||||
s->C1 = 1;
|
|
||||||
} else {
|
|
||||||
s->K2 = (uint32_t) ret;
|
|
||||||
s->C2 = (s->C * s->K1 - Bp) / (s->K1 - s->K2);
|
|
||||||
s->C1 = s->C - s->C2;
|
|
||||||
}
|
|
||||||
s->F = s->C1 * s->K1 + s->C2 * s->K2 - Bp;
|
|
||||||
INFO("CB Segmentation: TBS: %d, C=%d, C+=%d K+=%d, C-=%d, K-=%d, F=%d, Bp=%d\n",
|
|
||||||
tbs, s->C, s->C1, s->K1, s->C2, s->K2, s->F, Bp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int srslte_harq_init(srslte_harq_t *q, srslte_cell_t cell) {
|
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
|
||||||
|
|
||||||
if (q != NULL) {
|
|
||||||
uint32_t i;
|
|
||||||
bzero(q, sizeof(srslte_harq_t));
|
|
||||||
|
|
||||||
memcpy(&q->cell, &cell, sizeof(srslte_cell_t));
|
|
||||||
|
|
||||||
ret = srslte_ra_tbs_from_idx(26, cell.nof_prb);
|
|
||||||
if (ret != SRSLTE_ERROR) {
|
|
||||||
q->max_cb = (uint32_t) ret / (MAX_LONG_CB - 24) + 1;
|
|
||||||
|
|
||||||
q->pdsch_w_buff_f = srslte_vec_malloc(sizeof(float*) * q->max_cb);
|
|
||||||
if (!q->pdsch_w_buff_f) {
|
|
||||||
perror("malloc");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
q->pdsch_w_buff_c = srslte_vec_malloc(sizeof(uint8_t*) * q->max_cb);
|
|
||||||
if (!q->pdsch_w_buff_c) {
|
|
||||||
perror("malloc");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: Use HARQ buffer limitation based on UE category
|
|
||||||
q->w_buff_size = cell.nof_prb * MAX_PDSCH_RE(cell.cp) * 6 * 10;
|
|
||||||
for (i=0;i<q->max_cb;i++) {
|
|
||||||
q->pdsch_w_buff_f[i] = srslte_vec_malloc(sizeof(float) * q->w_buff_size);
|
|
||||||
if (!q->pdsch_w_buff_f[i]) {
|
|
||||||
perror("malloc");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
q->pdsch_w_buff_c[i] = srslte_vec_malloc(sizeof(uint8_t) * q->w_buff_size);
|
|
||||||
if (!q->pdsch_w_buff_c[i]) {
|
|
||||||
perror("malloc");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
bzero(q->pdsch_w_buff_c[i], sizeof(uint8_t) * q->w_buff_size);
|
|
||||||
}
|
|
||||||
ret = SRSLTE_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void srslte_harq_free(srslte_harq_t *q) {
|
|
||||||
if (q) {
|
|
||||||
uint32_t i;
|
|
||||||
if (q->pdsch_w_buff_f) {
|
|
||||||
for (i=0;i<q->max_cb;i++) {
|
|
||||||
if (q->pdsch_w_buff_f[i]) {
|
|
||||||
free(q->pdsch_w_buff_f[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(q->pdsch_w_buff_f);
|
|
||||||
}
|
|
||||||
if (q->pdsch_w_buff_c) {
|
|
||||||
for (i=0;i<q->max_cb;i++) {
|
|
||||||
if (q->pdsch_w_buff_c[i]) {
|
|
||||||
free(q->pdsch_w_buff_c[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(q->pdsch_w_buff_c);
|
|
||||||
}
|
|
||||||
bzero(q, sizeof(srslte_harq_t));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void srslte_harq_reset(srslte_harq_t *q) {
|
|
||||||
int i;
|
|
||||||
if (q->pdsch_w_buff_f) {
|
|
||||||
for (i=0;i<q->max_cb;i++) {
|
|
||||||
if (q->pdsch_w_buff_f[i]) {
|
|
||||||
bzero(q->pdsch_w_buff_f[i], sizeof(float) * q->w_buff_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (q->pdsch_w_buff_c) {
|
|
||||||
for (i=0;i<q->max_cb;i++) {
|
|
||||||
if (q->pdsch_w_buff_c[i]) {
|
|
||||||
bzero(q->pdsch_w_buff_c[i], sizeof(uint8_t) * q->w_buff_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bzero(&q->mcs, sizeof(srslte_ra_mcs_t));
|
|
||||||
bzero(&q->cb_segm, sizeof(srslte_harq_cbsegm_t));
|
|
||||||
bzero(&q->dl_alloc, sizeof(srslte_ra_dl_alloc_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int harq_setup_common(srslte_harq_t *q, srslte_ra_mcs_t mcs, uint32_t rv, uint32_t sf_idx) {
|
|
||||||
if (mcs.tbs != q->mcs.tbs) {
|
|
||||||
srslte_harq_codeblock_segmentation(&q->cb_segm, mcs.tbs);
|
|
||||||
if (q->cb_segm.C > q->max_cb) {
|
|
||||||
fprintf(stderr, "Codeblock segmentation returned more CBs (%d) than allocated (%d)\n",
|
|
||||||
q->cb_segm.C, q->max_cb);
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q->mcs = mcs;
|
|
||||||
q->sf_idx = sf_idx;
|
|
||||||
q->rv = rv;
|
|
||||||
return SRSLTE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int srslte_harq_setup_dl(srslte_harq_t *q, srslte_ra_mcs_t mcs, uint32_t rv, uint32_t sf_idx, srslte_ra_dl_alloc_t *dl_alloc) {
|
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
|
||||||
|
|
||||||
if (q != NULL &&
|
|
||||||
rv < 4 &&
|
|
||||||
sf_idx < 10)
|
|
||||||
{
|
|
||||||
ret = harq_setup_common(q, mcs, rv, sf_idx);
|
|
||||||
if (ret) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
memcpy(&q->dl_alloc, dl_alloc, sizeof(srslte_ra_dl_alloc_t));
|
|
||||||
|
|
||||||
// Number of symbols, RE and bits per subframe for DL
|
|
||||||
q->nof_re = q->dl_alloc.re_sf[q->sf_idx];
|
|
||||||
q->nof_symb = 2*SRSLTE_CP_NSYMB(q->cell.cp)-q->dl_alloc.lstart;
|
|
||||||
q->nof_bits = q->nof_re * srslte_mod_bits_x_symbol(q->mcs.mod);
|
|
||||||
q->nof_prb = q->dl_alloc.slot[0].nof_prb;
|
|
||||||
|
|
||||||
ret = SRSLTE_SUCCESS;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int srslte_harq_setup_ul(srslte_harq_t *q, srslte_ra_mcs_t mcs, uint32_t rv, uint32_t sf_idx, srslte_ra_ul_alloc_t *ul_alloc) {
|
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
|
||||||
|
|
||||||
if (q != NULL &&
|
|
||||||
rv < 4 &&
|
|
||||||
sf_idx < 10)
|
|
||||||
{
|
|
||||||
ret = harq_setup_common(q, mcs, rv, sf_idx);
|
|
||||||
if (ret) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
memcpy(&q->ul_alloc, ul_alloc, sizeof(srslte_ra_ul_alloc_t));
|
|
||||||
|
|
||||||
// Number of symbols, RE and bits per subframe for UL
|
|
||||||
q->nof_symb = 2*(SRSLTE_CP_NSYMB(q->cell.cp)-1);
|
|
||||||
q->nof_re = q->nof_symb*q->ul_alloc.L_prb*SRSLTE_NRE;
|
|
||||||
q->nof_bits = q->nof_re * srslte_mod_bits_x_symbol(q->mcs.mod);
|
|
||||||
q->nof_prb = q->ul_alloc.L_prb;
|
|
||||||
|
|
||||||
ret = SRSLTE_SUCCESS;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
@ -0,0 +1,164 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2014 The srsLTE Developers. See the
|
||||||
|
* COPYRIGHT file at the top-level directory of this distribution.
|
||||||
|
*
|
||||||
|
* \section LICENSE
|
||||||
|
*
|
||||||
|
* This file is part of the srsLTE library.
|
||||||
|
*
|
||||||
|
* srsLTE is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* srsLTE is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* A copy of the GNU Lesser General Public License can be found in
|
||||||
|
* the LICENSE file in the top-level directory of this distribution
|
||||||
|
* and at http://www.gnu.org/licenses/.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "srslte/common/phy_common.h"
|
||||||
|
#include "srslte/phch/ra.h"
|
||||||
|
#include "srslte/fec/turbodecoder.h"
|
||||||
|
#include "srslte/phch/softbuffer.h"
|
||||||
|
#include "srslte/utils/vector.h"
|
||||||
|
#include "srslte/utils/debug.h"
|
||||||
|
|
||||||
|
#define MAX_PDSCH_RE(cp) (2 * SRSLTE_CP_NSYMB(cp) * 12)
|
||||||
|
|
||||||
|
int srslte_softbuffer_rx_init(srslte_softbuffer_rx_t *q, srslte_cell_t cell) {
|
||||||
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
|
||||||
|
if (q != NULL) {
|
||||||
|
ret = SRSLTE_ERROR;
|
||||||
|
|
||||||
|
bzero(q, sizeof(srslte_softbuffer_rx_t));
|
||||||
|
|
||||||
|
ret = srslte_ra_tbs_from_idx(26, cell.nof_prb);
|
||||||
|
if (ret != SRSLTE_ERROR) {
|
||||||
|
q->max_cb = (uint32_t) ret / (SRSLTE_TCOD_MAX_LEN_CB - 24) + 1;
|
||||||
|
|
||||||
|
q->buffer_f = srslte_vec_malloc(sizeof(float*) * q->max_cb);
|
||||||
|
if (!q->buffer_f) {
|
||||||
|
perror("malloc");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: Use HARQ buffer limitation based on UE category
|
||||||
|
q->buff_size = cell.nof_prb * MAX_PDSCH_RE(cell.cp) * 6 * 10;
|
||||||
|
for (uint32_t i=0;i<q->max_cb;i++) {
|
||||||
|
q->buffer_f[i] = srslte_vec_malloc(sizeof(float) * q->buff_size);
|
||||||
|
if (!q->buffer_f[i]) {
|
||||||
|
perror("malloc");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
srslte_softbuffer_rx_reset(q);
|
||||||
|
ret = SRSLTE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void srslte_softbuffer_rx_free(srslte_softbuffer_rx_t *q) {
|
||||||
|
if (q) {
|
||||||
|
if (q->buffer_f) {
|
||||||
|
for (uint32_t i=0;i<q->max_cb;i++) {
|
||||||
|
if (q->buffer_f[i]) {
|
||||||
|
free(q->buffer_f[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(q->buffer_f);
|
||||||
|
}
|
||||||
|
bzero(q, sizeof(srslte_softbuffer_rx_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void srslte_softbuffer_rx_reset(srslte_softbuffer_rx_t *q) {
|
||||||
|
int i;
|
||||||
|
if (q->buffer_f) {
|
||||||
|
for (i=0;i<q->max_cb;i++) {
|
||||||
|
if (q->buffer_f[i]) {
|
||||||
|
bzero(q->buffer_f[i], sizeof(float) * q->buff_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int srslte_softbuffer_tx_init(srslte_softbuffer_tx_t *q, srslte_cell_t cell) {
|
||||||
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
|
||||||
|
if (q != NULL) {
|
||||||
|
ret = SRSLTE_ERROR;
|
||||||
|
|
||||||
|
bzero(q, sizeof(srslte_softbuffer_tx_t));
|
||||||
|
|
||||||
|
ret = srslte_ra_tbs_from_idx(26, cell.nof_prb);
|
||||||
|
if (ret != SRSLTE_ERROR) {
|
||||||
|
q->max_cb = (uint32_t) ret / (SRSLTE_TCOD_MAX_LEN_CB - 24) + 1;
|
||||||
|
|
||||||
|
q->buffer_b = srslte_vec_malloc(sizeof(uint8_t*) * q->max_cb);
|
||||||
|
if (!q->buffer_b) {
|
||||||
|
perror("malloc");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: Use HARQ buffer limitation based on UE category
|
||||||
|
q->buff_size = cell.nof_prb * MAX_PDSCH_RE(cell.cp) * 6 * 10;
|
||||||
|
for (uint32_t i=0;i<q->max_cb;i++) {
|
||||||
|
q->buffer_b[i] = srslte_vec_malloc(sizeof(float) * q->buff_size);
|
||||||
|
if (!q->buffer_b[i]) {
|
||||||
|
perror("malloc");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
srslte_softbuffer_tx_reset(q);
|
||||||
|
ret = SRSLTE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void srslte_softbuffer_tx_free(srslte_softbuffer_tx_t *q) {
|
||||||
|
if (q) {
|
||||||
|
if (q->buffer_b) {
|
||||||
|
for (uint32_t i=0;i<q->max_cb;i++) {
|
||||||
|
if (q->buffer_b[i]) {
|
||||||
|
free(q->buffer_b[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(q->buffer_b);
|
||||||
|
}
|
||||||
|
bzero(q, sizeof(srslte_softbuffer_tx_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void srslte_softbuffer_tx_reset(srslte_softbuffer_tx_t *q) {
|
||||||
|
int i;
|
||||||
|
if (q->buffer_b) {
|
||||||
|
for (i=0;i<q->max_cb;i++) {
|
||||||
|
if (q->buffer_b[i]) {
|
||||||
|
bzero(q->buffer_b[i], sizeof(uint8_t) * q->buff_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,147 +0,0 @@
|
|||||||
/**
|
|
||||||
*
|
|
||||||
* \section COPYRIGHT
|
|
||||||
*
|
|
||||||
* Copyright 2013-2014 The srsLTE Developers. See the
|
|
||||||
* COPYRIGHT file at the top-level directory of this distribution.
|
|
||||||
*
|
|
||||||
* \section LICENSE
|
|
||||||
*
|
|
||||||
* This file is part of the srsLTE library.
|
|
||||||
*
|
|
||||||
* srsLTE is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of
|
|
||||||
* the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* srsLTE is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* A copy of the GNU Lesser General Public License can be found in
|
|
||||||
* the LICENSE file in the top-level directory of this distribution
|
|
||||||
* and at http://www.gnu.org/licenses/.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <strings.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include "srslte/srslte.h"
|
|
||||||
|
|
||||||
#include "srslte/ue_itf/sched_grant.h"
|
|
||||||
|
|
||||||
namespace srslte {
|
|
||||||
namespace ue {
|
|
||||||
|
|
||||||
sched_grant::sched_grant(direction_t direction, uint16_t rnti_)
|
|
||||||
{
|
|
||||||
rnti = rnti_;
|
|
||||||
dir = direction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns the RNTI associated with the UL/DL scheduling grant */
|
|
||||||
uint16_t sched_grant::get_rnti() {
|
|
||||||
return rnti;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t sched_grant::get_rv() {
|
|
||||||
if (dir == UPLINK) {
|
|
||||||
return ul_grant.rv_idx;
|
|
||||||
} else {
|
|
||||||
return dl_grant.rv_idx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t sched_grant::get_tbs() {
|
|
||||||
if (dir == UPLINK) {
|
|
||||||
return ul_grant.mcs.tbs;
|
|
||||||
} else {
|
|
||||||
return dl_grant.mcs.tbs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t sched_grant::get_ncce()
|
|
||||||
{
|
|
||||||
return ncce;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool srslte::ue::sched_grant::is_sps_release()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sched_grant::set_ncce(uint32_t ncce_)
|
|
||||||
{
|
|
||||||
ncce = ncce_;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t sched_grant::get_current_tx_nb()
|
|
||||||
{
|
|
||||||
return current_tx_nb;
|
|
||||||
}
|
|
||||||
|
|
||||||
void sched_grant::set_current_tx_nb(uint32_t current_tx_nb_)
|
|
||||||
{
|
|
||||||
current_tx_nb = current_tx_nb_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void sched_grant::set_rv(uint32_t rv) {
|
|
||||||
if (dir == UPLINK) {
|
|
||||||
ul_grant.rv_idx = rv;
|
|
||||||
} else {
|
|
||||||
dl_grant.rv_idx = rv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sched_grant::get_ndi() {
|
|
||||||
if (dir == UPLINK) {
|
|
||||||
return ul_grant.ndi;
|
|
||||||
} else {
|
|
||||||
return dl_grant.ndi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void sched_grant::set_ndi(bool value) {
|
|
||||||
if (dir == UPLINK) {
|
|
||||||
ul_grant.ndi = value;
|
|
||||||
} else {
|
|
||||||
dl_grant.ndi = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sched_grant::get_cqi_request() {
|
|
||||||
if (dir == UPLINK) {
|
|
||||||
return ul_grant.ndi;
|
|
||||||
} else {
|
|
||||||
return dl_grant.ndi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int sched_grant::get_harq_process() {
|
|
||||||
if (dir == UPLINK) {
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
return dl_grant.harq_process;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sched_grant::is_uplink() {
|
|
||||||
return dir == UPLINK;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sched_grant::is_downlink() {
|
|
||||||
return dir == DOWNLINK;
|
|
||||||
}
|
|
||||||
void* sched_grant::get_grant_ptr() {
|
|
||||||
if (is_uplink()) {
|
|
||||||
return (void*) &ul_grant;
|
|
||||||
} else {
|
|
||||||
return (void*) &dl_grant;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace ue
|
|
||||||
} // namespace srslte
|
|
||||||
|
|
Loading…
Reference in New Issue