move nr_rrc_ue_process_ueCapabilityEnquiry before usage
This commit is contained in:
+67
-70
@@ -134,7 +134,6 @@ static const char nr_nas_attach_req_imsi_dummy_NSA_case[] = {
|
|||||||
0x11,
|
0x11,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECapabilityEnquiry_t *UECapabilityEnquiry);
|
|
||||||
static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc,
|
static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc,
|
||||||
OCTET_STRING_t *masterCellGroup,
|
OCTET_STRING_t *masterCellGroup,
|
||||||
long *fullConfig,
|
long *fullConfig,
|
||||||
@@ -2373,6 +2372,73 @@ static void nr_rrc_ue_process_rrcReestablishment(NR_UE_RRC_INST_t *rrc,
|
|||||||
nr_rrc_ue_generate_rrcReestablishmentComplete(rrc, rrcReestablishment);
|
nr_rrc_ue_generate_rrcReestablishmentComplete(rrc, rrcReestablishment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECapabilityEnquiry_t *UECapabilityEnquiry)
|
||||||
|
{
|
||||||
|
NR_UL_DCCH_Message_t ul_dcch_msg = {0};
|
||||||
|
LOG_I(NR_RRC, "Receiving from SRB1 (DL-DCCH), Processing UECapabilityEnquiry\n");
|
||||||
|
|
||||||
|
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
|
||||||
|
asn1cCalloc(ul_dcch_msg.message.choice.c1, c1);
|
||||||
|
c1->present = NR_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation;
|
||||||
|
asn1cCalloc(c1->choice.ueCapabilityInformation, info);
|
||||||
|
info->rrc_TransactionIdentifier = UECapabilityEnquiry->rrc_TransactionIdentifier;
|
||||||
|
if (!rrc->UECap.UE_NR_Capability) {
|
||||||
|
rrc->UECap.UE_NR_Capability = CALLOC(1, sizeof(NR_UE_NR_Capability_t));
|
||||||
|
asn1cSequenceAdd(rrc->UECap.UE_NR_Capability->rf_Parameters.supportedBandListNR.list, NR_BandNR_t, nr_bandnr);
|
||||||
|
nr_bandnr->bandNR = 1;
|
||||||
|
}
|
||||||
|
xer_fprint(stdout, &asn_DEF_NR_UE_NR_Capability, (void *)rrc->UECap.UE_NR_Capability);
|
||||||
|
|
||||||
|
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_NR_Capability,
|
||||||
|
NULL,
|
||||||
|
(void *)rrc->UECap.UE_NR_Capability,
|
||||||
|
&rrc->UECap.sdu[0],
|
||||||
|
MAX_UE_NR_CAPABILITY_SIZE);
|
||||||
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
||||||
|
rrc->UECap.sdu_size = (enc_rval.encoded + 7) / 8;
|
||||||
|
LOG_I(PHY, "[RRC]UE NR Capability encoded, %d bytes (%zd bits)\n", rrc->UECap.sdu_size, enc_rval.encoded + 7);
|
||||||
|
/* RAT Container */
|
||||||
|
NR_UE_CapabilityRAT_Container_t *ue_CapabilityRAT_Container = CALLOC(1, sizeof(NR_UE_CapabilityRAT_Container_t));
|
||||||
|
ue_CapabilityRAT_Container->rat_Type = NR_RAT_Type_nr;
|
||||||
|
OCTET_STRING_fromBuf(&ue_CapabilityRAT_Container->ue_CapabilityRAT_Container, (const char *)rrc->UECap.sdu, rrc->UECap.sdu_size);
|
||||||
|
NR_UECapabilityEnquiry_IEs_t *ueCapabilityEnquiry_ie = UECapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry;
|
||||||
|
if (get_softmodem_params()->nsa == 1) {
|
||||||
|
OCTET_STRING_t *requestedFreqBandsNR = ueCapabilityEnquiry_ie->ue_CapabilityEnquiryExt;
|
||||||
|
nsa_sendmsg_to_lte_ue(requestedFreqBandsNR->buf, requestedFreqBandsNR->size, UE_CAPABILITY_INFO);
|
||||||
|
}
|
||||||
|
// ue_CapabilityRAT_Container.ueCapabilityRAT_Container.buf = UE_rrc_inst[ue_mod_idP].UECapability;
|
||||||
|
// ue_CapabilityRAT_Container.ueCapabilityRAT_Container.size = UE_rrc_inst[ue_mod_idP].UECapability_size;
|
||||||
|
AssertFatal(UECapabilityEnquiry->criticalExtensions.present == NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry,
|
||||||
|
"UECapabilityEnquiry->criticalExtensions.present (%d) != UECapabilityEnquiry__criticalExtensions_PR_c1 (%d)\n",
|
||||||
|
UECapabilityEnquiry->criticalExtensions.present,NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry);
|
||||||
|
|
||||||
|
NR_UECapabilityInformation_t *ueCapabilityInformation = ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation;
|
||||||
|
ueCapabilityInformation->criticalExtensions.present = NR_UECapabilityInformation__criticalExtensions_PR_ueCapabilityInformation;
|
||||||
|
asn1cCalloc(ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation, infoIE);
|
||||||
|
asn1cCalloc(infoIE->ue_CapabilityRAT_ContainerList, UEcapList);
|
||||||
|
UEcapList->list.count = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.count; i++) {
|
||||||
|
if (ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.array[i]->rat_Type == NR_RAT_Type_nr) {
|
||||||
|
asn1cSeqAdd(&UEcapList->list, ue_CapabilityRAT_Container);
|
||||||
|
uint8_t buffer[500];
|
||||||
|
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message, NULL, (void *)&ul_dcch_msg, buffer, 500);
|
||||||
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", enc_rval.failed_type->name, enc_rval.encoded);
|
||||||
|
|
||||||
|
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
|
||||||
|
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
|
||||||
|
}
|
||||||
|
LOG_I(NR_RRC, "UECapabilityInformation Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded + 7) / 8);
|
||||||
|
int srb_id = 1; // UECapabilityInformation on SRB1
|
||||||
|
nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Free struct members after it's done
|
||||||
|
including locally allocated ue_CapabilityRAT_Container */
|
||||||
|
ASN_STRUCT_RESET(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int nr_rrc_ue_decode_dcch(NR_UE_RRC_INST_t *rrc,
|
static int nr_rrc_ue_decode_dcch(NR_UE_RRC_INST_t *rrc,
|
||||||
const srb_id_t Srb_id,
|
const srb_id_t Srb_id,
|
||||||
const uint8_t *const Buffer,
|
const uint8_t *const Buffer,
|
||||||
@@ -2858,75 +2924,6 @@ void nr_rrc_ue_process_sidelink_radioResourceConfig(NR_SetupRelease_SL_ConfigDed
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECapabilityEnquiry_t *UECapabilityEnquiry)
|
|
||||||
{
|
|
||||||
NR_UL_DCCH_Message_t ul_dcch_msg = {0};
|
|
||||||
//
|
|
||||||
LOG_I(NR_RRC, "Receiving from SRB1 (DL-DCCH), Processing UECapabilityEnquiry\n");
|
|
||||||
|
|
||||||
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
|
|
||||||
asn1cCalloc(ul_dcch_msg.message.choice.c1, c1);
|
|
||||||
c1->present = NR_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation;
|
|
||||||
asn1cCalloc(c1->choice.ueCapabilityInformation, info);
|
|
||||||
info->rrc_TransactionIdentifier = UECapabilityEnquiry->rrc_TransactionIdentifier;
|
|
||||||
if (!rrc->UECap.UE_NR_Capability) {
|
|
||||||
rrc->UECap.UE_NR_Capability = CALLOC(1, sizeof(NR_UE_NR_Capability_t));
|
|
||||||
asn1cSequenceAdd(rrc->UECap.UE_NR_Capability->rf_Parameters.supportedBandListNR.list, NR_BandNR_t, nr_bandnr);
|
|
||||||
nr_bandnr->bandNR = 1;
|
|
||||||
}
|
|
||||||
xer_fprint(stdout, &asn_DEF_NR_UE_NR_Capability, (void *)rrc->UECap.UE_NR_Capability);
|
|
||||||
|
|
||||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_NR_Capability,
|
|
||||||
NULL,
|
|
||||||
(void *)rrc->UECap.UE_NR_Capability,
|
|
||||||
&rrc->UECap.sdu[0],
|
|
||||||
MAX_UE_NR_CAPABILITY_SIZE);
|
|
||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
|
||||||
enc_rval.failed_type->name, enc_rval.encoded);
|
|
||||||
rrc->UECap.sdu_size = (enc_rval.encoded + 7) / 8;
|
|
||||||
LOG_I(PHY, "[RRC]UE NR Capability encoded, %d bytes (%zd bits)\n", rrc->UECap.sdu_size, enc_rval.encoded + 7);
|
|
||||||
/* RAT Container */
|
|
||||||
NR_UE_CapabilityRAT_Container_t *ue_CapabilityRAT_Container = CALLOC(1, sizeof(NR_UE_CapabilityRAT_Container_t));
|
|
||||||
ue_CapabilityRAT_Container->rat_Type = NR_RAT_Type_nr;
|
|
||||||
OCTET_STRING_fromBuf(&ue_CapabilityRAT_Container->ue_CapabilityRAT_Container, (const char *)rrc->UECap.sdu, rrc->UECap.sdu_size);
|
|
||||||
NR_UECapabilityEnquiry_IEs_t *ueCapabilityEnquiry_ie = UECapabilityEnquiry->criticalExtensions.choice.ueCapabilityEnquiry;
|
|
||||||
if (get_softmodem_params()->nsa == 1) {
|
|
||||||
OCTET_STRING_t *requestedFreqBandsNR = ueCapabilityEnquiry_ie->ue_CapabilityEnquiryExt;
|
|
||||||
nsa_sendmsg_to_lte_ue(requestedFreqBandsNR->buf, requestedFreqBandsNR->size, UE_CAPABILITY_INFO);
|
|
||||||
}
|
|
||||||
// ue_CapabilityRAT_Container.ueCapabilityRAT_Container.buf = UE_rrc_inst[ue_mod_idP].UECapability;
|
|
||||||
// ue_CapabilityRAT_Container.ueCapabilityRAT_Container.size = UE_rrc_inst[ue_mod_idP].UECapability_size;
|
|
||||||
AssertFatal(UECapabilityEnquiry->criticalExtensions.present == NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry,
|
|
||||||
"UECapabilityEnquiry->criticalExtensions.present (%d) != UECapabilityEnquiry__criticalExtensions_PR_c1 (%d)\n",
|
|
||||||
UECapabilityEnquiry->criticalExtensions.present,NR_UECapabilityEnquiry__criticalExtensions_PR_ueCapabilityEnquiry);
|
|
||||||
|
|
||||||
NR_UECapabilityInformation_t *ueCapabilityInformation = ul_dcch_msg.message.choice.c1->choice.ueCapabilityInformation;
|
|
||||||
ueCapabilityInformation->criticalExtensions.present = NR_UECapabilityInformation__criticalExtensions_PR_ueCapabilityInformation;
|
|
||||||
asn1cCalloc(ueCapabilityInformation->criticalExtensions.choice.ueCapabilityInformation, infoIE);
|
|
||||||
asn1cCalloc(infoIE->ue_CapabilityRAT_ContainerList, UEcapList);
|
|
||||||
UEcapList->list.count = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.count; i++) {
|
|
||||||
if (ueCapabilityEnquiry_ie->ue_CapabilityRAT_RequestList.list.array[i]->rat_Type == NR_RAT_Type_nr) {
|
|
||||||
asn1cSeqAdd(&UEcapList->list, ue_CapabilityRAT_Container);
|
|
||||||
uint8_t buffer[500];
|
|
||||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message, NULL, (void *)&ul_dcch_msg, buffer, 500);
|
|
||||||
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
|
|
||||||
enc_rval.failed_type->name, enc_rval.encoded);
|
|
||||||
|
|
||||||
if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
|
|
||||||
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
|
|
||||||
}
|
|
||||||
LOG_I(NR_RRC, "UECapabilityInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
|
|
||||||
int srb_id = 1; // UECapabilityInformation on SRB1
|
|
||||||
nr_pdcp_data_req_srb(rrc->ue_id, srb_id, 0, (enc_rval.encoded + 7) / 8, buffer, deliver_pdu_srb_rlc, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Free struct members after it's done
|
|
||||||
including locally allocated ue_CapabilityRAT_Container */
|
|
||||||
ASN_STRUCT_RESET(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void nr_rrc_initiate_rrcReestablishment(NR_UE_RRC_INST_t *rrc, NR_ReestablishmentCause_t cause)
|
static void nr_rrc_initiate_rrcReestablishment(NR_UE_RRC_INST_t *rrc, NR_ReestablishmentCause_t cause)
|
||||||
{
|
{
|
||||||
rrc->reestablishment_cause = cause;
|
rrc->reestablishment_cause = cause;
|
||||||
|
|||||||
Reference in New Issue
Block a user