SRSUE: avoid negative SR transmission in NR

master
Xavier Arteaga 3 years ago committed by Andre Puschmann
parent 603c67e36d
commit 54a12870ec

@ -35,12 +35,11 @@
* @brief Uplink Control Information bits configuration for PUCCH transmission * @brief Uplink Control Information bits configuration for PUCCH transmission
*/ */
typedef struct { typedef struct {
uint16_t rnti; ///< RNTI uint16_t rnti; ///< RNTI
uint32_t resource_id; ///< PUCCH resource indicator field in the DCI format 1_0 or DCI format 1_1 uint32_t resource_id; ///< PUCCH resource indicator field in the DCI format 1_0 or DCI format 1_1
uint32_t n_cce_0; ///< index of a first CCE for the PDCCH reception uint32_t n_cce_0; ///< index of a first CCE for the PDCCH reception
uint32_t N_cce; ///< number of CCEs in a CORESET of a PDCCH reception with DCI format 1_0 or 1_1 uint32_t N_cce; ///< number of CCEs in a CORESET of a PDCCH reception with DCI format 1_0 or 1_1
uint32_t sr_resource_id; ///< Scheduling request resource identifier, only valid if positive SR uint32_t sr_resource_id; ///< Scheduling request resource identifier, only valid if positive SR
bool sr_positive_present; ///< Set to true if there is at least one positive SR
} srsran_uci_nr_pucch_cfg_t; } srsran_uci_nr_pucch_cfg_t;
/** /**
@ -70,6 +69,7 @@ typedef struct SRSRAN_API {
/// Common Parameters /// Common Parameters
srsran_harq_ack_cfg_t ack; ///< HARQ-ACK configuration srsran_harq_ack_cfg_t ack; ///< HARQ-ACK configuration
uint32_t o_sr; ///< Number of SR bits uint32_t o_sr; ///< Number of SR bits
bool sr_positive_present; ///< Set to true if there is at least one positive SR
srsran_csi_report_cfg_t csi[SRSRAN_CSI_MAX_NOF_REPORT]; ///< CSI report configuration srsran_csi_report_cfg_t csi[SRSRAN_CSI_MAX_NOF_REPORT]; ///< CSI report configuration
uint32_t nof_csi; ///< Number of CSI reports uint32_t nof_csi; ///< Number of CSI reports
union { union {

@ -530,7 +530,7 @@ int srsran_ra_ul_nr_pucch_resource(const srsran_pucch_nr_hl_cfg_t* pucch_cfg,
// - At least one positive SR // - At least one positive SR
// - up to 2 HARQ-ACK // - up to 2 HARQ-ACK
// - No CSI report // - No CSI report
if (uci_cfg->pucch.sr_positive_present > 0 && uci_cfg->ack.count <= SRSRAN_PUCCH_NR_FORMAT1_MAX_NOF_BITS && if (uci_cfg->sr_positive_present > 0 && uci_cfg->ack.count <= SRSRAN_PUCCH_NR_FORMAT1_MAX_NOF_BITS &&
uci_cfg->nof_csi == 0) { uci_cfg->nof_csi == 0) {
uint32_t sr_resource_id = uci_cfg->pucch.sr_resource_id; uint32_t sr_resource_id = uci_cfg->pucch.sr_resource_id;
if (sr_resource_id >= SRSRAN_PUCCH_MAX_NOF_SR_RESOURCES) { if (sr_resource_id >= SRSRAN_PUCCH_MAX_NOF_SR_RESOURCES) {

@ -980,7 +980,16 @@ uint32_t srsran_uci_nr_total_bits(const srsran_uci_cfg_nr_t* uci_cfg)
return 0; return 0;
} }
return uci_cfg->ack.count + uci_cfg->o_sr + srsran_csi_part1_nof_bits(uci_cfg->csi, uci_cfg->nof_csi); uint32_t o_csi = srsran_csi_part1_nof_bits(uci_cfg->csi, uci_cfg->nof_csi);
// According to 38.213 9.2.4 UE procedure for reporting SR
// The UE transmits a PUCCH in the PUCCH resource for the corresponding SR configuration only when the UE transmits a
// positive SR
if (uci_cfg->ack.count == 0 && o_csi == 0 && !uci_cfg->sr_positive_present) {
return 0;
}
return uci_cfg->ack.count + uci_cfg->o_sr + o_csi;
} }
uint32_t srsran_uci_nr_info(const srsran_uci_data_nr_t* uci_data, char* str, uint32_t str_len) uint32_t srsran_uci_nr_info(const srsran_uci_data_nr_t* uci_data, char* str, uint32_t str_len)

@ -316,7 +316,7 @@ public:
} }
// Initialise counters // Initialise counters
uint32_t sr_count_all = (uint32_t)n; uint32_t sr_count_all = (uint32_t)n; // Number of opportunities in this TTI
uint32_t sr_count_positive = 0; uint32_t sr_count_positive = 0;
// Iterate all opportunities and check if there is a pending SR // Iterate all opportunities and check if there is a pending SR
@ -333,10 +333,10 @@ public:
} }
// Configure SR fields in UCI data // Configure SR fields in UCI data
uci_data.cfg.pucch.sr_resource_id = sr_resource_id[0]; uci_data.cfg.pucch.sr_resource_id = sr_resource_id[0];
uci_data.cfg.o_sr = srsran_ra_ul_nr_nof_sr_bits(sr_count_all); uci_data.cfg.o_sr = srsran_ra_ul_nr_nof_sr_bits(sr_count_all);
uci_data.cfg.pucch.sr_positive_present = sr_count_positive > 0; uci_data.cfg.sr_positive_present = sr_count_positive > 0;
uci_data.value.sr = sr_count_positive; uci_data.value.sr = sr_count_positive;
} }
void get_periodic_csi(const uint32_t& tti, srsran_uci_data_nr_t& uci_data) void get_periodic_csi(const uint32_t& tti, srsran_uci_data_nr_t& uci_data)

@ -538,7 +538,7 @@ bool cc_worker::work_ul()
} }
// Add SR to UCI data only if there is no UL grant! // Add SR to UCI data only if there is no UL grant!
if (!has_ul_ack) { if (not has_pusch_grant) {
phy.get_pending_sr(ul_slot_cfg.idx, uci_data); phy.get_pending_sr(ul_slot_cfg.idx, uci_data);
} }

Loading…
Cancel
Save