Trigger F1 UE context release if no UE context in RRC
This commit is contained in:
@@ -145,6 +145,9 @@ f1ap_cudu_inst_t *getCxt(instance_t instanceP)
|
|||||||
return &fake;
|
return &fake;
|
||||||
}
|
}
|
||||||
configmodule_interface_t *uniqCfg = NULL;
|
configmodule_interface_t *uniqCfg = NULL;
|
||||||
|
|
||||||
|
void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, uint32_t gNB_ue_ngap_id) { };
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
/// static configuration for NR at the moment
|
/// static configuration for NR at the moment
|
||||||
|
|||||||
+27
-16
@@ -106,6 +106,21 @@ extern RAN_CONTEXT_t RC;
|
|||||||
|
|
||||||
mui_t rrc_gNB_mui = 0;
|
mui_t rrc_gNB_mui = 0;
|
||||||
|
|
||||||
|
typedef struct deliver_ue_ctxt_release_data_t {
|
||||||
|
gNB_RRC_INST *rrc;
|
||||||
|
f1ap_ue_context_release_cmd_t *release_cmd;
|
||||||
|
sctp_assoc_t assoc_id;
|
||||||
|
} deliver_ue_ctxt_release_data_t;
|
||||||
|
|
||||||
|
static void rrc_deliver_ue_ctxt_release_cmd(void *deliver_pdu_data, ue_id_t ue_id, int srb_id, char *buf, int size, int sdu_id)
|
||||||
|
{
|
||||||
|
DevAssert(deliver_pdu_data != NULL);
|
||||||
|
deliver_ue_ctxt_release_data_t *data = deliver_pdu_data;
|
||||||
|
data->release_cmd->rrc_container = (uint8_t*) buf;
|
||||||
|
data->release_cmd->rrc_container_length = size;
|
||||||
|
data->rrc->mac_rrc.ue_context_release_command(data->assoc_id, data->release_cmd);
|
||||||
|
}
|
||||||
|
|
||||||
///---------------------------------------------------------------------------------------------------------------///
|
///---------------------------------------------------------------------------------------------------------------///
|
||||||
///---------------------------------------------------------------------------------------------------------------///
|
///---------------------------------------------------------------------------------------------------------------///
|
||||||
|
|
||||||
@@ -1974,8 +1989,18 @@ static void rrc_CU_process_ue_context_release_request(MessageDef *msg_p, sctp_as
|
|||||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, req->gNB_CU_ue_id);
|
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, req->gNB_CU_ue_id);
|
||||||
// TODO what happens if no AMF connected? should also handle, set an_release true
|
// TODO what happens if no AMF connected? should also handle, set an_release true
|
||||||
if (!ue_context_p) {
|
if (!ue_context_p) {
|
||||||
LOG_E(RRC, "could not find UE context for CU UE ID %u, aborting transaction\n", req->gNB_CU_ue_id);
|
LOG_W(RRC, "could not find UE context for CU UE ID %u: auto-generate release command\n", req->gNB_CU_ue_id);
|
||||||
// TODO just request the DU to release to make it happy
|
uint8_t buffer[RRC_BUF_SIZE] = {0};
|
||||||
|
int size = do_NR_RRCRelease(buffer, RRC_BUF_SIZE, rrc_gNB_get_next_transaction_identifier(0));
|
||||||
|
f1ap_ue_context_release_cmd_t ue_context_release_cmd = {
|
||||||
|
.gNB_CU_ue_id = req->gNB_CU_ue_id,
|
||||||
|
.gNB_DU_ue_id = req->gNB_DU_ue_id,
|
||||||
|
.cause = F1AP_CAUSE_RADIO_NETWORK,
|
||||||
|
.cause_value = 10, // 10 = F1AP_CauseRadioNetwork_normal_release
|
||||||
|
.srb_id = DCCH,
|
||||||
|
};
|
||||||
|
deliver_ue_ctxt_release_data_t data = {.rrc = rrc, .release_cmd = &ue_context_release_cmd};
|
||||||
|
nr_pdcp_data_req_srb(req->gNB_CU_ue_id, DCCH, rrc_gNB_mui++, size, buffer, rrc_deliver_ue_ctxt_release_cmd, &data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2645,20 +2670,6 @@ void rrc_gNB_generate_SecurityModeCommand(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p)
|
|||||||
nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
|
nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct deliver_ue_ctxt_release_data_t {
|
|
||||||
gNB_RRC_INST *rrc;
|
|
||||||
f1ap_ue_context_release_cmd_t *release_cmd;
|
|
||||||
sctp_assoc_t assoc_id;
|
|
||||||
} deliver_ue_ctxt_release_data_t;
|
|
||||||
static void rrc_deliver_ue_ctxt_release_cmd(void *deliver_pdu_data, ue_id_t ue_id, int srb_id, char *buf, int size, int sdu_id)
|
|
||||||
{
|
|
||||||
DevAssert(deliver_pdu_data != NULL);
|
|
||||||
deliver_ue_ctxt_release_data_t *data = deliver_pdu_data;
|
|
||||||
data->release_cmd->rrc_container = (uint8_t*) buf;
|
|
||||||
data->release_cmd->rrc_container_length = size;
|
|
||||||
data->rrc->mac_rrc.ue_context_release_command(data->assoc_id, data->release_cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/*
|
/*
|
||||||
* Generate the RRC Connection Release to UE.
|
* Generate the RRC Connection Release to UE.
|
||||||
|
|||||||
Reference in New Issue
Block a user