implement RRC release
This commit is contained in:
@@ -786,10 +786,14 @@ uint8_t do_NR_SecurityModeCommand(
|
|||||||
asn_enc_rval_t enc_rval;
|
asn_enc_rval_t enc_rval;
|
||||||
memset(&dl_dcch_msg,0,sizeof(NR_DL_DCCH_Message_t));
|
memset(&dl_dcch_msg,0,sizeof(NR_DL_DCCH_Message_t));
|
||||||
dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
|
dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
|
||||||
|
dl_dcch_msg.message.choice.c1=CALLOC(1,sizeof(struct NR_DL_DCCH_MessageType__c1));
|
||||||
dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_securityModeCommand;
|
dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_securityModeCommand;
|
||||||
|
dl_dcch_msg.message.choice.c1->choice.securityModeCommand = CALLOC(1, sizeof(struct NR_SecurityModeCommand));
|
||||||
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->rrc_TransactionIdentifier = Transaction_id;
|
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->rrc_TransactionIdentifier = Transaction_id;
|
||||||
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.present = NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand;
|
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.present = NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand;
|
||||||
|
|
||||||
|
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.choice.securityModeCommand =
|
||||||
|
CALLOC(1, sizeof(struct NR_SecurityModeCommand_IEs));
|
||||||
// the two following information could be based on the mod_id
|
// the two following information could be based on the mod_id
|
||||||
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm
|
dl_dcch_msg.message.choice.c1->choice.securityModeCommand->criticalExtensions.choice.securityModeCommand->securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm
|
||||||
= (NR_CipheringAlgorithm_t)cipheringAlgorithm;
|
= (NR_CipheringAlgorithm_t)cipheringAlgorithm;
|
||||||
@@ -932,3 +936,27 @@ uint8_t do_NR_UECapabilityEnquiry_nr( const protocol_ctxt_t *const ctxt_pP,
|
|||||||
|
|
||||||
return((enc_rval.encoded+7)/8);
|
return((enc_rval.encoded+7)/8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t do_NR_RRCConnectionRelease(uint8_t *buffer,
|
||||||
|
uint8_t Transaction_id) {
|
||||||
|
asn_enc_rval_t enc_rval;
|
||||||
|
NR_DL_DCCH_Message_t dl_dcch_msg;
|
||||||
|
NR_RRCRelease_t *rrcConnectionRelease;
|
||||||
|
memset(&dl_dcch_msg,0,sizeof(NR_DL_DCCH_Message_t));
|
||||||
|
dl_dcch_msg.message.present = NR_DL_DCCH_MessageType_PR_c1;
|
||||||
|
dl_dcch_msg.message.choice.c1=CALLOC(1,sizeof(struct NR_DL_DCCH_MessageType__c1));
|
||||||
|
dl_dcch_msg.message.choice.c1->present = NR_DL_DCCH_MessageType__c1_PR_rrcRelease;
|
||||||
|
dl_dcch_msg.message.choice.c1->choice.rrcRelease = CALLOC(1, sizeof(struct NR_RRCRelease));
|
||||||
|
rrcConnectionRelease = dl_dcch_msg.message.choice.c1->choice.rrcRelease;
|
||||||
|
// RRCConnectionRelease
|
||||||
|
rrcConnectionRelease->rrc_TransactionIdentifier = Transaction_id;
|
||||||
|
rrcConnectionRelease->criticalExtensions.present = NR_RRCRelease__criticalExtensions_PR_rrcRelease;
|
||||||
|
rrcConnectionRelease->criticalExtensions.choice.rrcRelease = NULL;
|
||||||
|
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_DL_DCCH_Message,
|
||||||
|
NULL,
|
||||||
|
(void *)&dl_dcch_msg,
|
||||||
|
buffer,
|
||||||
|
RRC_BUF_SIZE);
|
||||||
|
return((enc_rval.encoded+7)/8);
|
||||||
|
}
|
||||||
|
|||||||
@@ -98,3 +98,6 @@ uint8_t do_NR_SecurityModeCommand(
|
|||||||
const uint8_t Transaction_id,
|
const uint8_t Transaction_id,
|
||||||
const uint8_t cipheringAlgorithm,
|
const uint8_t cipheringAlgorithm,
|
||||||
NR_IntegrityProtAlgorithm_t *integrityProtAlgorithm);
|
NR_IntegrityProtAlgorithm_t *integrityProtAlgorithm);
|
||||||
|
|
||||||
|
uint8_t do_NR_RRCConnectionRelease(uint8_t *buffer,
|
||||||
|
uint8_t Transaction_id);
|
||||||
|
|||||||
@@ -1097,7 +1097,7 @@ rrc_gNB_generate_SecurityModeCommand(
|
|||||||
size = do_NR_SecurityModeCommand(
|
size = do_NR_SecurityModeCommand(
|
||||||
ctxt_pP,
|
ctxt_pP,
|
||||||
buffer,
|
buffer,
|
||||||
rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id),
|
rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
|
||||||
ue_context_pP->ue_context.ciphering_algorithm,
|
ue_context_pP->ue_context.ciphering_algorithm,
|
||||||
&integrity_algorithm);
|
&integrity_algorithm);
|
||||||
LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Security Mode Command\n");
|
LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Security Mode Command\n");
|
||||||
@@ -1176,3 +1176,63 @@ rrc_gNB_generate_UECapabilityEnquiry(
|
|||||||
buffer,
|
buffer,
|
||||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
* Generate the RRC Connection Release to UE.
|
||||||
|
* If received, UE should switch to RRC_IDLE mode.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
rrc_gNB_generate_RRCConnectionRelease(
|
||||||
|
const protocol_ctxt_t *const ctxt_pP,
|
||||||
|
rrc_gNB_ue_context_t *const ue_context_pP
|
||||||
|
)
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
{
|
||||||
|
uint8_t buffer[RRC_BUF_SIZE];
|
||||||
|
uint16_t size = 0;
|
||||||
|
|
||||||
|
memset(buffer, 0, RRC_BUF_SIZE);
|
||||||
|
|
||||||
|
size = do_NR_RRCConnectionRelease(buffer,rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id));
|
||||||
|
ue_context_pP->ue_context.ue_reestablishment_timer = 0;
|
||||||
|
ue_context_pP->ue_context.ue_release_timer = 0;
|
||||||
|
LOG_I(NR_RRC,
|
||||||
|
PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate RRCConnectionRelease (bytes %d)\n",
|
||||||
|
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||||
|
size);
|
||||||
|
LOG_D(NR_RRC,
|
||||||
|
PROTOCOL_RRC_CTXT_UE_FMT" --- PDCP_DATA_REQ/%d Bytes (rrcConnectionRelease MUI %d) --->[PDCP][RB %u]\n",
|
||||||
|
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||||
|
size,
|
||||||
|
rrc_gNB_mui,
|
||||||
|
DCCH);
|
||||||
|
MSC_LOG_TX_MESSAGE(
|
||||||
|
MSC_RRC_GNB,
|
||||||
|
MSC_RRC_UE,
|
||||||
|
buffer,
|
||||||
|
size,
|
||||||
|
MSC_AS_TIME_FMT" LTE_RRCConnectionRelease UE %x MUI %d size %u",
|
||||||
|
MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
|
ue_context_pP->ue_context.rnti,
|
||||||
|
rrc_gNB_mui,
|
||||||
|
size);
|
||||||
|
|
||||||
|
if (NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
||||||
|
MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, F1AP_UE_CONTEXT_RELEASE_CMD);
|
||||||
|
F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rnti;
|
||||||
|
F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK;
|
||||||
|
F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release
|
||||||
|
F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = buffer;
|
||||||
|
F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = size;
|
||||||
|
itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m);
|
||||||
|
} else {
|
||||||
|
rrc_data_req(ctxt_pP,
|
||||||
|
DCCH,
|
||||||
|
rrc_gNB_mui++,
|
||||||
|
SDU_CONFIRM_NO,
|
||||||
|
size,
|
||||||
|
buffer,
|
||||||
|
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user