130 lines
5.5 KiB
C
130 lines
5.5 KiB
C
/*
|
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.openairinterface.org/?page_id=698
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*-------------------------------------------------------------------------------
|
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
* contact@openairinterface.org
|
|
*/
|
|
|
|
#include "mac_rrc_dl_handler.h"
|
|
|
|
#include "mac_proto.h"
|
|
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
|
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
|
|
|
#include "NR_RRCSetup.h"
|
|
#include "NR_DL-CCCH-Message.h"
|
|
#include "NR_CellGroupConfig.h"
|
|
|
|
int dl_rrc_message_rrcSetup(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc, NR_RRCSetup_t *rrcSetup);
|
|
|
|
int dl_rrc_message(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
|
|
{
|
|
/* dispatch message to dl_rrc_message_rrcSetup() and others, similar to as is
|
|
* done in the DU (should be the same here) */
|
|
|
|
if (dl_rrc->srb_id == 0) {
|
|
|
|
NR_DL_CCCH_Message_t *dl_ccch_msg = NULL;
|
|
asn_dec_rval_t dec_rval = uper_decode(NULL,
|
|
&asn_DEF_NR_DL_CCCH_Message,
|
|
(void **) &dl_ccch_msg,
|
|
dl_rrc->rrc_container,
|
|
dl_rrc->rrc_container_length,
|
|
0,
|
|
0);
|
|
AssertFatal(dec_rval.code == RC_OK, "could not decode F1AP message\n");
|
|
|
|
switch (dl_ccch_msg->message.choice.c1->present) {
|
|
case NR_DL_CCCH_MessageType__c1_PR_NOTHING:
|
|
LOG_W(NR_MAC, "Received NOTHING on DL-CCCH-Message\n");
|
|
break;
|
|
case NR_DL_CCCH_MessageType__c1_PR_rrcReject:
|
|
LOG_D(NR_MAC, "DL-CCCH/SRB0, received rrcReject for RNTI %04x\n", dl_rrc->rnti);
|
|
AssertFatal(0, "rrcReject not implemented yet\n");
|
|
break;
|
|
case NR_DL_CCCH_MessageType__c1_PR_rrcSetup:
|
|
LOG_I(NR_MAC, "DL-CCCH/SRB0, received rrcSetup for RNTI %04x\n", dl_rrc->rnti);
|
|
return dl_rrc_message_rrcSetup(module_id, dl_rrc, dl_ccch_msg->message.choice.c1->choice.rrcSetup);
|
|
break;
|
|
case NR_DL_CCCH_MessageType__c1_PR_spare2:
|
|
LOG_W(NR_MAC, "DL-CCCH/SRB0, received spare2\n");
|
|
break;
|
|
case NR_DL_CCCH_MessageType__c1_PR_spare1:
|
|
LOG_W(NR_MAC, "DL-CCCH/SRB0, received spare1\n");
|
|
break;
|
|
default:
|
|
AssertFatal(0 == 1, "Unknown DL-CCCH/SRB0 message %d\n", dl_ccch_msg->message.choice.c1->present);
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
return -1; /* not handled yet */
|
|
}
|
|
|
|
int dl_rrc_message_rrcSetup(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc, NR_RRCSetup_t *rrcSetup)
|
|
{
|
|
DevAssert(rrcSetup != NULL);
|
|
|
|
NR_RRCSetup_IEs_t *rrcSetup_ies = rrcSetup->criticalExtensions.choice.rrcSetup;
|
|
AssertFatal(rrcSetup_ies->masterCellGroup.buf != NULL,"masterCellGroup is NULL\n");
|
|
NR_CellGroupConfig_t *cellGroup = NULL;
|
|
asn_dec_rval_t dec_rval = uper_decode(NULL,
|
|
&asn_DEF_NR_CellGroupConfig,
|
|
(void **)&cellGroup,
|
|
rrcSetup_ies->masterCellGroup.buf,
|
|
rrcSetup_ies->masterCellGroup.size,
|
|
0,
|
|
0);
|
|
AssertFatal(dec_rval.code == RC_OK, "could not decode masterCellGroup\n");
|
|
|
|
/* there might be a memory leak for the cell group if we call this multiple
|
|
* times. Also, the first parameters of rrc_mac_config_req_gNB() are only
|
|
* relevant when setting the scc, which we don't do (and cannot do) here. */
|
|
rrc_pdsch_AntennaPorts_t pap = {0};
|
|
rrc_mac_config_req_gNB(module_id,
|
|
pap, /* only when scc != NULL */
|
|
0, /* only when scc != NULL */
|
|
0, /* only when scc != NULL */
|
|
0, /* only when scc != NULL */
|
|
NULL, /* scc */
|
|
NULL, /* mib */
|
|
NULL, /* sib1 */
|
|
0, /* add_ue */
|
|
dl_rrc->rnti,
|
|
cellGroup);
|
|
|
|
/* TODO: drop the RRC context */
|
|
gNB_RRC_INST *rrc = RC.nrrrc[module_id];
|
|
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, dl_rrc->rnti);
|
|
gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
|
ue_p->SRB_configList = rrcSetup_ies->radioBearerConfig.srb_ToAddModList;
|
|
ue_p->masterCellGroup = cellGroup;
|
|
|
|
nr_rlc_srb0_recv_sdu(dl_rrc->rnti, dl_rrc->rrc_container, dl_rrc->rrc_container_length);
|
|
|
|
protocol_ctxt_t ctxt = { .module_id = module_id, .rnti = dl_rrc->rnti };
|
|
nr_rrc_rlc_config_asn1_req(&ctxt,
|
|
ue_context_p->ue_context.SRB_configList,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
cellGroup->rlc_BearerToAddModList);
|
|
|
|
return 0;
|
|
}
|