diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 80bb00cfac..e3a3b175c7 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -126,6 +126,51 @@ bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) { return (bitmap >> (slot % 64)) & 0x01; } +/** + * @brief Returns true for: + * (1) FDD + * (2) Mixed slot with UL symbols + * (3) Full UL slot + */ +bool is_ul_slot(const slot_t slot, const frame_structure_t *fs) +{ + if (!fs->is_tdd) + return true; + const tdd_period_config_t *pc = &fs->period_cfg; + slot_t s = get_slot_idx_in_period(slot, fs); + return ((is_mixed_slot(s, fs) && pc->tdd_slot_bitmap[s].num_ul_symbols) + || (pc->tdd_slot_bitmap[s].slot_type == TDD_NR_UPLINK_SLOT)); +} + +/** + * @brief Returns true for: + * (1) FDD + * (2) Mixed slot with DL symbols + * (3) Full DL slot + */ +bool is_dl_slot(const slot_t slot, const frame_structure_t *fs) +{ + if (!fs->is_tdd) + return true; + const tdd_period_config_t *pc = &fs->period_cfg; + slot_t s = get_slot_idx_in_period(slot, fs); + return ((is_mixed_slot(s, fs) && pc->tdd_slot_bitmap[s].num_dl_symbols) + || (pc->tdd_slot_bitmap[s].slot_type == TDD_NR_DOWNLINK_SLOT)); +} + +/** + * @brief Returns true for: + * (1) Mixed slot with DL and/or UL symbols + */ +bool is_mixed_slot(const slot_t slot, const frame_structure_t *fs) +{ + if (!fs->is_tdd) + return false; + slot_t s = get_slot_idx_in_period(slot, fs); + const tdd_period_config_t *pc = &fs->period_cfg; + return pc->tdd_slot_bitmap[s].slot_type == TDD_NR_MIXED_SLOT; +} + /* the structure nfapi_nr_ul_tti_request_t is very big, let's copy only what is necessary */ static void copy_ul_tti_req(nfapi_nr_ul_tti_request_t *to, nfapi_nr_ul_tti_request_t *from) { diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 5e2f2761e8..99bc2259ea 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -353,6 +353,9 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, int binomial(int n, int k); bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot); +bool is_ul_slot(const slot_t slot, const frame_structure_t *fs); +bool is_dl_slot(const slot_t slot, const frame_structure_t *fs); +bool is_mixed_slot(const slot_t slot, const frame_structure_t *fs); /* \brief Function to indicate a received SDU on ULSCH. @param Mod_id Instance ID of gNB