SRSUE: avoid negative SR transmission in NR

This commit is contained in:
Xavier Arteaga 2021-07-07 16:59:56 +02:00 committed by Andre Puschmann
parent 603c67e36d
commit 54a12870ec
5 changed files with 23 additions and 14 deletions

View File

@ -40,7 +40,6 @@ typedef struct {
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 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;
/**
@ -70,6 +69,7 @@ typedef struct SRSRAN_API {
/// Common Parameters
srsran_harq_ack_cfg_t ack; ///< HARQ-ACK configuration
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
uint32_t nof_csi; ///< Number of CSI reports
union {

View File

@ -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
// - up to 2 HARQ-ACK
// - 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) {
uint32_t sr_resource_id = uci_cfg->pucch.sr_resource_id;
if (sr_resource_id >= SRSRAN_PUCCH_MAX_NOF_SR_RESOURCES) {

View File

@ -980,7 +980,16 @@ uint32_t srsran_uci_nr_total_bits(const srsran_uci_cfg_nr_t* uci_cfg)
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)

View File

@ -316,7 +316,7 @@ public:
}
// 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;
// Iterate all opportunities and check if there is a pending SR
@ -335,7 +335,7 @@ public:
// Configure SR fields in UCI data
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.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;
}

View File

@ -538,7 +538,7 @@ bool cc_worker::work_ul()
}
// 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);
}