From baa9cd0140629ea6bb3d69495fe49832c47467de Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Sun, 19 Apr 2020 13:44:15 +0200 Subject: [PATCH] rlc v2: mbms support --- openair2/LAYER2/rlc_v2/rlc_oai_api.c | 82 +++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c index fc738dd968..3d189a9da1 100644 --- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c +++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c @@ -117,6 +117,11 @@ tbs_size_t mac_rlc_data_req( default: rb = NULL; break; } + if (MBMS_flagP == MBMS_FLAG_YES) { + rb = ue->drb[channel_idP - 1]; + } + + if (rb != NULL) { rb->set_time(rb, rlc_current_time); maxsize = tb_sizeP; @@ -170,6 +175,10 @@ mac_rlc_status_resp_t mac_rlc_status_ind( default: rb = NULL; break; } + if (MBMS_flagP == MBMS_FLAG_YES) { + rb = ue->drb[channel_idP - 1]; + } + if (rb != NULL) { rlc_entity_buffer_status_t buf_stat; rb->set_time(rb, rlc_current_time); @@ -268,6 +277,9 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP, rlc_ue_t *ue; rlc_entity_t *rb; + if (MBMS_flagP == MBMS_FLAG_YES) + rnti = 0xfffd; + LOG_D(RLC, "%s rnti %d srb_flag %d rb_id %d mui %d confirm %d sdu_size %d MBMS_flag %d\n", __FUNCTION__, rnti, srb_flagP, (int)rb_idP, muiP, confirmP, sdu_sizeP, MBMS_flagP); @@ -288,6 +300,9 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP, if (rb_idP >= 1 && rb_idP <= 5) rb = ue->drb[rb_idP - 1]; } + if( MBMS_flagP == MBMS_FLAG_YES) { + rb = ue->drb[rb_idP - 1]; + } if (rb != NULL) { rb->set_time(rb, rlc_current_time); @@ -796,6 +811,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP int rnti = ctxt_pP->rnti; int module_id = ctxt_pP->module_id; int i; + int j; if (ctxt_pP->enb_flag == 1 && (ctxt_pP->module_id != 0 || ctxt_pP->instance != 0)) { @@ -814,8 +830,70 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP } if (pmch_InfoList_r9_pP != NULL) { - LOG_E(RLC, "%s: pmch_InfoList_r9_pP not handled\n", __FUNCTION__); - exit(1); + LTE_MBMS_SessionInfoList_r9_t *mbms_SessionInfoList_r9_p = NULL; + LTE_MBMS_SessionInfo_r9_t *MBMS_SessionInfo_p = NULL; + mbms_session_id_t mbms_session_id; + mbms_service_id_t mbms_service_id; + rb_id_t drb_id = 0; + logical_chan_id_t lc_id = 0; + //LTE_DRB_Identity_t drb_id = 0; + //LTE_DRB_Identity_t* pdrb_id = NULL; + + for (i=0; ilist.count; i++) { + mbms_SessionInfoList_r9_p = &(pmch_InfoList_r9_pP->list.array[i]->mbms_SessionInfoList_r9); + + for (j=0; jlist.count; j++) { + MBMS_SessionInfo_p = mbms_SessionInfoList_r9_p->list.array[j]; + if (0/*MBMS_SessionInfo_p->sessionId_r9*/) + mbms_session_id = MBMS_SessionInfo_p->sessionId_r9->buf[0]; + else + mbms_session_id = MBMS_SessionInfo_p->logicalChannelIdentity_r9; + lc_id = mbms_session_id; + mbms_service_id = MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string +// mbms_service_id = j; + + // can set the mch_id = i + if (ctxt_pP->enb_flag) { + drb_id = (mbms_service_id * LTE_maxSessionPerPMCH ) + mbms_session_id;//+ (LTE_maxDRB + 3) * MAX_MOBILES_PER_ENB; // 1 + } else { + drb_id = (mbms_service_id * LTE_maxSessionPerPMCH ) + mbms_session_id; // + (LTE_maxDRB + 3); // 15 + } + + LOG_I(RLC, PROTOCOL_CTXT_FMT" CONFIG REQ MBMS ASN1 LC ID %u RB ID %u SESSION ID %u SERVICE ID %u, rnti %x\n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + lc_id, + (int)drb_id, + mbms_session_id, + mbms_service_id, + rnti + ); + } + } + + rlc_entity_t *rlc_um; + rlc_ue_t *ue; + + //drb_id = rb_id; + + rlc_manager_lock(rlc_ue_manager); + ue = rlc_manager_get_ue(rlc_ue_manager, rnti); + if (ue->drb[drb_id-1] != NULL) { + LOG_D(RLC, "%s:%d:%s: warning DRB %d already exist for ue %d, do nothing\n", + __FILE__, __LINE__, __FUNCTION__, (int)drb_id, rnti); + } else { + rlc_um = new_rlc_entity_um(1000000, + 1000000, + deliver_sdu, ue, + 0,//LTE_T_Reordering_ms0,//t_reordering, + 5//LTE_SN_FieldLength_size5//sn_field_length + ); + rlc_ue_add_drb_rlc_entity(ue, drb_id, rlc_um); + + LOG_D(RLC, "%s:%d:%s: added drb %d to ue %d\n", + __FILE__, __LINE__, __FUNCTION__, (int)drb_id, rnti); + } + rlc_manager_unlock(rlc_ue_manager); + } if (drb2release_listP != NULL) {