Multiple DRBs - RRC - Added function for DRB creation
This commit is contained in:
@@ -93,6 +93,7 @@
|
|||||||
|
|
||||||
#define NR_UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!!
|
#define NR_UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!!
|
||||||
#define NR_UE_INDEX_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1
|
#define NR_UE_INDEX_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1
|
||||||
|
#define MAX_DRB_PER_PDUSESSION 4
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NR_RRC_OK=0,
|
NR_RRC_OK=0,
|
||||||
|
|||||||
+115
-88
@@ -755,6 +755,87 @@ rrc_gNB_generate_defaultRRCReconfiguration(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NR_DRB_ToAddMod_t *generateDRB(rrc_gNB_ue_context_t *ue_context_pP,
|
||||||
|
int iter,
|
||||||
|
long drb_id,
|
||||||
|
boolean_t enable_sdap,
|
||||||
|
int do_drb_integrity,
|
||||||
|
int do_drb_ciphering)
|
||||||
|
{
|
||||||
|
NR_DRB_ToAddMod_t *DRB_config = NULL;
|
||||||
|
NR_SDAP_Config_t *SDAP_config = NULL;
|
||||||
|
|
||||||
|
DRB_config = CALLOC(1, sizeof(*DRB_config));
|
||||||
|
DRB_config->drb_Identity = drb_id;
|
||||||
|
DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation));
|
||||||
|
DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
|
||||||
|
|
||||||
|
/* SDAP Configuration */
|
||||||
|
SDAP_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
|
||||||
|
memset(SDAP_config, 0, sizeof(NR_SDAP_Config_t));
|
||||||
|
SDAP_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
|
||||||
|
memset(SDAP_config->mappedQoS_FlowsToAdd, 0, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
|
||||||
|
|
||||||
|
SDAP_config->pdu_Session = ue_context_pP->ue_context.pduSession[iter].param.pdusession_id;
|
||||||
|
|
||||||
|
if (enable_sdap) {
|
||||||
|
SDAP_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present;
|
||||||
|
SDAP_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_present;
|
||||||
|
} else {
|
||||||
|
SDAP_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent;
|
||||||
|
SDAP_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDAP_config->defaultDRB = true;
|
||||||
|
|
||||||
|
for (int qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pduSession[iter].param.nb_qos; qos_flow_index++)
|
||||||
|
{
|
||||||
|
NR_QFI_t *qfi = calloc(1, sizeof(NR_QFI_t));
|
||||||
|
*qfi = ue_context_pP->ue_context.pduSession[iter].param.qos[qos_flow_index].qfi;
|
||||||
|
ASN_SEQUENCE_ADD(&SDAP_config->mappedQoS_FlowsToAdd->list, qfi);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDAP_config->mappedQoS_FlowsToRelease = NULL;
|
||||||
|
DRB_config->cnAssociation->choice.sdap_Config = SDAP_config;
|
||||||
|
|
||||||
|
/* PDCP Configuration */
|
||||||
|
DRB_config->reestablishPDCP = NULL;
|
||||||
|
DRB_config->recoverPDCP = NULL;
|
||||||
|
DRB_config->pdcp_Config = calloc(1, sizeof(*DRB_config->pdcp_Config));
|
||||||
|
DRB_config->pdcp_Config->drb = calloc(1,sizeof(*DRB_config->pdcp_Config->drb));
|
||||||
|
|
||||||
|
DRB_config->pdcp_Config->drb->discardTimer = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->discardTimer));
|
||||||
|
*DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_infinity;
|
||||||
|
DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL));
|
||||||
|
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
|
||||||
|
DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL));
|
||||||
|
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits;
|
||||||
|
|
||||||
|
DRB_config->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
|
||||||
|
DRB_config->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
|
||||||
|
|
||||||
|
DRB_config->pdcp_Config->drb->integrityProtection = NULL;
|
||||||
|
DRB_config->pdcp_Config->drb->statusReportRequired = NULL;
|
||||||
|
DRB_config->pdcp_Config->drb->outOfOrderDelivery = NULL;
|
||||||
|
DRB_config->pdcp_Config->moreThanOneRLC = NULL;
|
||||||
|
|
||||||
|
DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
|
||||||
|
*DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
|
||||||
|
DRB_config->pdcp_Config->ext1 = NULL;
|
||||||
|
|
||||||
|
if (do_drb_integrity) {
|
||||||
|
DRB_config->pdcp_Config->drb->integrityProtection = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->integrityProtection));
|
||||||
|
*DRB_config->pdcp_Config->drb->integrityProtection = NR_PDCP_Config__drb__integrityProtection_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!do_drb_ciphering) {
|
||||||
|
DRB_config->pdcp_Config->ext1 = calloc(1, sizeof(*DRB_config->pdcp_Config->ext1));
|
||||||
|
DRB_config->pdcp_Config->ext1->cipheringDisabled = calloc(1, sizeof(*DRB_config->pdcp_Config->ext1->cipheringDisabled));
|
||||||
|
*DRB_config->pdcp_Config->ext1->cipheringDisabled = NR_PDCP_Config__ext1__cipheringDisabled_true;
|
||||||
|
}
|
||||||
|
return DRB_config;
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
rrc_gNB_generate_dedicatedRRCReconfiguration(
|
rrc_gNB_generate_dedicatedRRCReconfiguration(
|
||||||
@@ -765,9 +846,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
||||||
NR_DRB_ToAddMod_t *DRB_config = NULL;
|
|
||||||
NR_SRB_ToAddMod_t *SRB2_config = NULL;
|
NR_SRB_ToAddMod_t *SRB2_config = NULL;
|
||||||
NR_SDAP_Config_t *sdap_config = NULL;
|
|
||||||
NR_DRB_ToAddModList_t **DRB_configList = NULL;
|
NR_DRB_ToAddModList_t **DRB_configList = NULL;
|
||||||
NR_DRB_ToAddModList_t **DRB_configList2 = NULL;
|
NR_DRB_ToAddModList_t **DRB_configList2 = NULL;
|
||||||
NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
NR_SRB_ToAddModList_t **SRB_configList2 = NULL;
|
||||||
@@ -823,97 +902,45 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DRB_config = CALLOC(1, sizeof(*DRB_config));
|
for(long drb_id_add = 0; drb_id_add <= nb_drb_to_setup; drb_id_add++){
|
||||||
DRB_config->drb_Identity = i+1;
|
if(drb_id_add > MAX_DRB_PER_PDUSESSION)
|
||||||
if (drb_id_to_setup_start == 1) drb_id_to_setup_start = DRB_config->drb_Identity;
|
break;
|
||||||
nb_drb_to_setup++;
|
|
||||||
DRB_config->cnAssociation = CALLOC(1, sizeof(*DRB_config->cnAssociation));
|
|
||||||
DRB_config->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_sdap_Config;
|
|
||||||
// sdap_Config
|
|
||||||
sdap_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
|
|
||||||
memset(sdap_config, 0, sizeof(NR_SDAP_Config_t));
|
|
||||||
sdap_config->pdu_Session = ue_context_pP->ue_context.pduSession[i].param.pdusession_id;
|
|
||||||
if (rrc->configuration.enable_sdap) {
|
|
||||||
sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present;
|
|
||||||
sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_present;
|
|
||||||
} else {
|
|
||||||
sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent;
|
|
||||||
sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent;
|
|
||||||
}
|
|
||||||
sdap_config->defaultDRB = true;
|
|
||||||
sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
|
|
||||||
memset(sdap_config->mappedQoS_FlowsToAdd, 0, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
|
|
||||||
|
|
||||||
for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pduSession[i].param.nb_qos; qos_flow_index++) {
|
NR_DRB_ToAddMod_t *DRB_config = generateDRB(ue_context_pP,
|
||||||
NR_QFI_t *qfi = calloc(1, sizeof(NR_QFI_t));
|
i,
|
||||||
*qfi = ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].qfi;
|
drb_id_add,
|
||||||
ASN_SEQUENCE_ADD(&sdap_config->mappedQoS_FlowsToAdd->list, qfi);
|
rrc->configuration.enable_sdap,
|
||||||
}
|
rrc->security.do_drb_integrity,
|
||||||
sdap_config->mappedQoS_FlowsToRelease = NULL;
|
rrc->security.do_drb_ciphering);
|
||||||
DRB_config->cnAssociation->choice.sdap_Config = sdap_config;
|
|
||||||
|
|
||||||
// pdcp_Config
|
// Reference TS23501 Table 5.7.4-1: Standardized 5QI to QoS characteristics mapping
|
||||||
DRB_config->reestablishPDCP = NULL;
|
for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pduSession[i].param.nb_qos; qos_flow_index++) {
|
||||||
DRB_config->recoverPDCP = NULL;
|
switch (ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].fiveQI) {
|
||||||
DRB_config->pdcp_Config = calloc(1, sizeof(*DRB_config->pdcp_Config));
|
case 1: //100ms
|
||||||
DRB_config->pdcp_Config->drb = calloc(1,sizeof(*DRB_config->pdcp_Config->drb));
|
case 2: //150ms
|
||||||
DRB_config->pdcp_Config->drb->discardTimer = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->discardTimer));
|
case 3: //50ms
|
||||||
*DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_infinity;
|
case 4: //300ms
|
||||||
DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL));
|
case 5: //100ms
|
||||||
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
|
case 6: //300ms
|
||||||
DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL));
|
case 7: //100ms
|
||||||
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits;
|
case 8: //300ms
|
||||||
DRB_config->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
|
case 9: //300ms Video (Buffered Streaming)TCP-based (e.g., www, e-mail, chat, ftp, p2p file sharing, progressive video, etc.)
|
||||||
DRB_config->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
|
// TODO
|
||||||
|
break;
|
||||||
|
|
||||||
DRB_config->pdcp_Config->drb->integrityProtection = NULL;
|
default:
|
||||||
DRB_config->pdcp_Config->drb->statusReportRequired = NULL;
|
LOG_E(NR_RRC,"not supported 5qi %lu\n", ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].fiveQI);
|
||||||
DRB_config->pdcp_Config->drb->outOfOrderDelivery = calloc(1,sizeof(*DRB_config->pdcp_Config->drb->outOfOrderDelivery));
|
ue_context_pP->ue_context.pduSession[i].status = PDU_SESSION_STATUS_FAILED;
|
||||||
*DRB_config->pdcp_Config->drb->outOfOrderDelivery = NR_PDCP_Config__drb__outOfOrderDelivery_true;
|
ue_context_pP->ue_context.pduSession[i].xid = xid;
|
||||||
DRB_config->pdcp_Config->moreThanOneRLC = NULL;
|
pdu_sessions_done++;
|
||||||
|
free(DRB_config);
|
||||||
DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
|
continue;
|
||||||
*DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms20;
|
}
|
||||||
DRB_config->pdcp_Config->ext1 = NULL;
|
|
||||||
|
|
||||||
if (rrc->security.do_drb_integrity) {
|
|
||||||
DRB_config->pdcp_Config->drb->integrityProtection = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->integrityProtection));
|
|
||||||
*DRB_config->pdcp_Config->drb->integrityProtection = NR_PDCP_Config__drb__integrityProtection_enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rrc->security.do_drb_ciphering) {
|
|
||||||
DRB_config->pdcp_Config->ext1 = calloc(1, sizeof(*DRB_config->pdcp_Config->ext1));
|
|
||||||
DRB_config->pdcp_Config->ext1->cipheringDisabled = calloc(1, sizeof(*DRB_config->pdcp_Config->ext1->cipheringDisabled));
|
|
||||||
*DRB_config->pdcp_Config->ext1->cipheringDisabled = NR_PDCP_Config__ext1__cipheringDisabled_true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reference TS23501 Table 5.7.4-1: Standardized 5QI to QoS characteristics mapping
|
|
||||||
for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pduSession[i].param.nb_qos; qos_flow_index++) {
|
|
||||||
switch (ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].fiveQI) {
|
|
||||||
case 1: //100ms
|
|
||||||
case 2: //150ms
|
|
||||||
case 3: //50ms
|
|
||||||
case 4: //300ms
|
|
||||||
case 5: //100ms
|
|
||||||
case 6: //300ms
|
|
||||||
case 7: //100ms
|
|
||||||
case 8: //300ms
|
|
||||||
case 9: //300ms Video (Buffered Streaming)TCP-based (e.g., www, e-mail, chat, ftp, p2p file sharing, progressive video, etc.)
|
|
||||||
// TODO
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG_E(NR_RRC,"not supported 5qi %lu\n", ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].fiveQI);
|
|
||||||
ue_context_pP->ue_context.pduSession[i].status = PDU_SESSION_STATUS_FAILED;
|
|
||||||
ue_context_pP->ue_context.pduSession[i].xid = xid;
|
|
||||||
pdu_sessions_done++;
|
|
||||||
free(DRB_config);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config);
|
ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config);
|
||||||
ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config);
|
ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config);
|
||||||
|
}
|
||||||
|
|
||||||
ue_context_pP->ue_context.pduSession[i].status = PDU_SESSION_STATUS_DONE;
|
ue_context_pP->ue_context.pduSession[i].status = PDU_SESSION_STATUS_DONE;
|
||||||
ue_context_pP->ue_context.pduSession[i].xid = xid;
|
ue_context_pP->ue_context.pduSession[i].xid = xid;
|
||||||
|
|||||||
Reference in New Issue
Block a user