remove most of globale variables, remain data model inconsistency and race conditions
This commit is contained in:
@@ -85,7 +85,6 @@ char * split73_config;
|
|||||||
int split73;
|
int split73;
|
||||||
AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]= {0};
|
AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]= {0};
|
||||||
AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]= {0};
|
AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]= {0};
|
||||||
uint8_t proto_agent_flag = 0;
|
|
||||||
void flexran_agent_slice_update(mid_t module_idP) {
|
void flexran_agent_slice_update(mid_t module_idP) {
|
||||||
}
|
}
|
||||||
int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p){
|
int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p){
|
||||||
|
|||||||
@@ -303,7 +303,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
|
|||||||
uint16_t crnti;
|
uint16_t crnti;
|
||||||
uint8_t *rrc_container;
|
uint8_t *rrc_container;
|
||||||
int rrc_container_length;
|
int rrc_container_length;
|
||||||
int8_t *du2cu_rrc_container;
|
char *du2cu_rrc_container;
|
||||||
int du2cu_rrc_container_length;
|
int du2cu_rrc_container_length;
|
||||||
} f1ap_initial_ul_rrc_message_t;
|
} f1ap_initial_ul_rrc_message_t;
|
||||||
|
|
||||||
|
|||||||
@@ -1910,6 +1910,7 @@ int RCconfig_DU_F1(MessageDef *msg_p, uint32_t i) {
|
|||||||
AssertFatal(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr != NULL,
|
AssertFatal(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr != NULL,
|
||||||
"eNB id %u is not defined in configuration file\n",i);
|
"eNB id %u is not defined in configuration file\n",i);
|
||||||
F1AP_SETUP_REQ (msg_p).num_cells_available = 0;
|
F1AP_SETUP_REQ (msg_p).num_cells_available = 0;
|
||||||
|
F1AP_SETUP_REQ (msg_p).cell_type = CELL_MACRO_ENB;
|
||||||
|
|
||||||
for (k=0; k <num_enbs ; k++) {
|
for (k=0; k <num_enbs ; k++) {
|
||||||
if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[k], *(ENBParamList.paramarray[i][ENB_ENB_NAME_IDX].strptr) )== 0) {
|
if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[k], *(ENBParamList.paramarray[i][ENB_ENB_NAME_IDX].strptr) )== 0) {
|
||||||
|
|||||||
+58
-13
@@ -32,6 +32,9 @@
|
|||||||
|
|
||||||
#include "f1ap_common.h"
|
#include "f1ap_common.h"
|
||||||
|
|
||||||
|
static f1ap_cudu_inst_t *f1_du_inst[NUMBER_OF_eNB_MAX]= {0};
|
||||||
|
static f1ap_cudu_inst_t *f1_cu_inst[NUMBER_OF_eNB_MAX]= {0};
|
||||||
|
|
||||||
#if defined(EMIT_ASN_DEBUG_EXTERN)
|
#if defined(EMIT_ASN_DEBUG_EXTERN)
|
||||||
int asn_debug = 0;
|
int asn_debug = 0;
|
||||||
int asn1_xer_print = 0;
|
int asn1_xer_print = 0;
|
||||||
@@ -61,11 +64,30 @@ uint8_t F1AP_get_next_transaction_identifier(module_id_t enb_mod_idP, module_id_
|
|||||||
return transaction_identifier[enb_mod_idP+cu_mod_idP];
|
return transaction_identifier[enb_mod_idP+cu_mod_idP];
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_add_ue(f1ap_cudu_inst_t *f1_inst,
|
f1ap_cudu_inst_t *getCxt(bool isCU, module_id_t module_idP) {
|
||||||
|
AssertFatal( module_idP < sizeofArray(f1_cu_inst), "");
|
||||||
|
return isCU? f1_cu_inst[ module_idP]: f1_du_inst[ module_idP];
|
||||||
|
}
|
||||||
|
|
||||||
|
void createF1inst(bool isCU, module_id_t module_idP, f1ap_setup_req_t *req) {
|
||||||
|
if (isCU) {
|
||||||
|
AssertFatal(f1_cu_inst[module_idP] == NULL, "Double call to F1 CU init\n");
|
||||||
|
f1_cu_inst[module_idP]=( f1ap_cudu_inst_t *) calloc(1, sizeof( f1ap_cudu_inst_t));
|
||||||
|
//memcpy(f1_cu_inst[module_idP]->setupReq, req, sizeof(f1ap_setup_req_t) );
|
||||||
|
} else {
|
||||||
|
AssertFatal(f1_du_inst[module_idP] == NULL, "Double call to F1 DU init\n");
|
||||||
|
f1_du_inst[module_idP]=( f1ap_cudu_inst_t *) calloc(1, sizeof(f1ap_cudu_inst_t));
|
||||||
|
memcpy(&f1_du_inst[module_idP]->setupReq, req, sizeof(f1ap_setup_req_t) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int f1ap_add_ue(bool isCu,
|
||||||
module_id_t module_idP,
|
module_id_t module_idP,
|
||||||
int CC_idP,
|
int CC_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
rnti_t rntiP) {
|
rnti_t rntiP) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
||||||
f1_inst->f1ap_ue[i].f1ap_uid = i;
|
f1_inst->f1ap_ue[i].f1ap_uid = i;
|
||||||
@@ -92,8 +114,10 @@ int f1ap_add_ue(f1ap_cudu_inst_t *f1_inst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int f1ap_remove_ue(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_remove_ue(bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP) {
|
rnti_t rntiP) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
||||||
f1_inst->f1ap_ue[i].rnti = 0;
|
f1_inst->f1ap_ue[i].rnti = 0;
|
||||||
@@ -105,8 +129,10 @@ int f1ap_remove_ue(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_get_du_ue_f1ap_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_du_ue_f1ap_id(bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP) {
|
rnti_t rntiP) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
||||||
return f1_inst->f1ap_ue[i].du_ue_f1ap_id;
|
return f1_inst->f1ap_ue[i].du_ue_f1ap_id;
|
||||||
@@ -116,8 +142,10 @@ int f1ap_get_du_ue_f1ap_id(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_get_cu_ue_f1ap_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_cu_ue_f1ap_id(bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP) {
|
rnti_t rntiP) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
||||||
return f1_inst->f1ap_ue[i].cu_ue_f1ap_id;
|
return f1_inst->f1ap_ue[i].cu_ue_f1ap_id;
|
||||||
@@ -127,8 +155,10 @@ int f1ap_get_cu_ue_f1ap_id(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_get_rnti_by_du_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_rnti_by_du_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t du_ue_f1ap_id ) {
|
module_id_t du_ue_f1ap_id ) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].du_ue_f1ap_id == du_ue_f1ap_id) {
|
if (f1_inst->f1ap_ue[i].du_ue_f1ap_id == du_ue_f1ap_id) {
|
||||||
return f1_inst->f1ap_ue[i].rnti;
|
return f1_inst->f1ap_ue[i].rnti;
|
||||||
@@ -138,8 +168,10 @@ int f1ap_get_rnti_by_du_id(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_get_rnti_by_cu_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_rnti_by_cu_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t cu_ue_f1ap_id ) {
|
module_id_t cu_ue_f1ap_id ) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].cu_ue_f1ap_id == cu_ue_f1ap_id) {
|
if (f1_inst->f1ap_ue[i].cu_ue_f1ap_id == cu_ue_f1ap_id) {
|
||||||
return f1_inst->f1ap_ue[i].rnti;
|
return f1_inst->f1ap_ue[i].rnti;
|
||||||
@@ -149,8 +181,10 @@ int f1ap_get_rnti_by_cu_id(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_get_du_uid(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_du_uid(bool isCu, module_id_t module_idP,
|
||||||
module_id_t du_ue_f1ap_id ) {
|
module_id_t du_ue_f1ap_id ) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].du_ue_f1ap_id == du_ue_f1ap_id) {
|
if (f1_inst->f1ap_ue[i].du_ue_f1ap_id == du_ue_f1ap_id) {
|
||||||
return i;
|
return i;
|
||||||
@@ -160,8 +194,10 @@ int f1ap_get_du_uid(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_get_cu_uid(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_cu_uid(bool isCu, module_id_t module_idP,
|
||||||
module_id_t cu_ue_f1ap_id ) {
|
module_id_t cu_ue_f1ap_id ) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].cu_ue_f1ap_id == cu_ue_f1ap_id) {
|
if (f1_inst->f1ap_ue[i].cu_ue_f1ap_id == cu_ue_f1ap_id) {
|
||||||
return i;
|
return i;
|
||||||
@@ -171,8 +207,10 @@ int f1ap_get_cu_uid(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_get_uid_by_rnti(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_uid_by_rnti(bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP ) {
|
rnti_t rntiP ) {
|
||||||
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
if (f1_inst->f1ap_ue[i].rnti == rntiP) {
|
||||||
return i;
|
return i;
|
||||||
@@ -182,10 +220,11 @@ int f1ap_get_uid_by_rnti(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_du_add_cu_ue_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_du_add_cu_ue_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t du_ue_f1ap_id,
|
module_id_t du_ue_f1ap_id,
|
||||||
module_id_t cu_ue_f1ap_id) {
|
module_id_t cu_ue_f1ap_id) {
|
||||||
module_id_t f1ap_uid = f1ap_get_du_uid(f1_inst,du_ue_f1ap_id);
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
module_id_t f1ap_uid = f1ap_get_du_uid(isCu, module_idP,du_ue_f1ap_id);
|
||||||
|
|
||||||
if (f1ap_uid < 0 || f1ap_uid >= MAX_MOBILES_PER_ENB)
|
if (f1ap_uid < 0 || f1ap_uid >= MAX_MOBILES_PER_ENB)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -195,10 +234,11 @@ int f1ap_du_add_cu_ue_id(f1ap_cudu_inst_t *f1_inst,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f1ap_cu_add_du_ue_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_cu_add_du_ue_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t cu_ue_f1ap_id,
|
module_id_t cu_ue_f1ap_id,
|
||||||
module_id_t du_ue_f1ap_id) {
|
module_id_t du_ue_f1ap_id) {
|
||||||
module_id_t f1ap_uid = f1ap_get_cu_uid(f1_inst,cu_ue_f1ap_id);
|
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, module_idP);
|
||||||
|
module_id_t f1ap_uid = f1ap_get_cu_uid(isCu,module_idP,cu_ue_f1ap_id);
|
||||||
|
|
||||||
if (f1ap_uid < 0 || f1ap_uid >= MAX_MOBILES_PER_ENB)
|
if (f1ap_uid < 0 || f1ap_uid >= MAX_MOBILES_PER_ENB)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -207,3 +247,8 @@ int f1ap_cu_add_du_ue_id(f1ap_cudu_inst_t *f1_inst,
|
|||||||
LOG_I(F1AP, "Adding du_ue_f1ap_id %d for UE with RNTI %x\n", du_ue_f1ap_id, f1_inst->f1ap_ue[f1ap_uid].rnti);
|
LOG_I(F1AP, "Adding du_ue_f1ap_id %d for UE with RNTI %x\n", du_ue_f1ap_id, f1_inst->f1ap_ue[f1ap_uid].rnti);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int f1ap_assoc_id(bool isCu, module_id_t module_idP) {
|
||||||
|
f1ap_setup_req_t *f1_inst=f1ap_req(isCu, module_idP);
|
||||||
|
return f1_inst->assoc_id;
|
||||||
|
}
|
||||||
|
|||||||
+28
-14
@@ -426,6 +426,12 @@ typedef struct f1ap_cudu_ue_inst_s {
|
|||||||
} f1ap_cudu_ue_t;
|
} f1ap_cudu_ue_t;
|
||||||
|
|
||||||
typedef struct f1ap_cudu_inst_s {
|
typedef struct f1ap_cudu_inst_s {
|
||||||
|
f1ap_setup_req_t setupReq;
|
||||||
|
instance_t du_ue_f1ap_id;
|
||||||
|
uint16_t sctp_in_streams;
|
||||||
|
uint16_t sctp_out_streams;
|
||||||
|
uint16_t default_sctp_stream_id;
|
||||||
|
uint64_t gNB_DU_id;
|
||||||
uint16_t num_ues;
|
uint16_t num_ues;
|
||||||
f1ap_cudu_ue_t f1ap_ue[MAX_MOBILES_PER_ENB];
|
f1ap_cudu_ue_t f1ap_ue[MAX_MOBILES_PER_ENB];
|
||||||
} f1ap_cudu_inst_t;
|
} f1ap_cudu_inst_t;
|
||||||
@@ -434,59 +440,67 @@ typedef struct f1ap_cudu_inst_s {
|
|||||||
|
|
||||||
uint8_t F1AP_get_next_transaction_identifier(module_id_t enb_mod_idP, module_id_t cu_mod_idP);
|
uint8_t F1AP_get_next_transaction_identifier(module_id_t enb_mod_idP, module_id_t cu_mod_idP);
|
||||||
|
|
||||||
|
f1ap_cudu_inst_t *getCxt(bool isCU, module_id_t module_idP);
|
||||||
|
|
||||||
int f1ap_add_ue(f1ap_cudu_inst_t *f1_inst,
|
void createF1inst(bool isCU, module_id_t module_idP, f1ap_setup_req_t *req);
|
||||||
|
int f1ap_add_ue(bool isCu,
|
||||||
module_id_t module_idP,
|
module_id_t module_idP,
|
||||||
int CC_idP,
|
int CC_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
rnti_t rntiP);
|
rnti_t rntiP);
|
||||||
|
|
||||||
int f1ap_remove_ue(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_remove_ue(bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP);
|
rnti_t rntiP);
|
||||||
|
|
||||||
int f1ap_get_du_ue_f1ap_id (f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_du_ue_f1ap_id (bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP);
|
rnti_t rntiP);
|
||||||
|
|
||||||
int f1ap_get_cu_ue_f1ap_id (f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_cu_ue_f1ap_id (bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP);
|
rnti_t rntiP);
|
||||||
|
|
||||||
|
|
||||||
int f1ap_get_rnti_by_du_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_rnti_by_du_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t du_ue_f1ap_id );
|
module_id_t du_ue_f1ap_id );
|
||||||
|
|
||||||
|
|
||||||
int f1ap_get_rnti_by_cu_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_rnti_by_cu_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t cu_ue_f1ap_id );
|
module_id_t cu_ue_f1ap_id );
|
||||||
|
|
||||||
|
|
||||||
int f1ap_get_du_uid(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_du_uid(bool isCu, module_id_t module_idP,
|
||||||
module_id_t du_ue_f1ap_id );
|
module_id_t du_ue_f1ap_id );
|
||||||
|
|
||||||
int f1ap_get_cu_uid(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_cu_uid(bool isCu, module_id_t module_idP,
|
||||||
module_id_t cu_ue_f1ap_id );
|
module_id_t cu_ue_f1ap_id );
|
||||||
|
|
||||||
int f1ap_get_uid_by_rnti(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_get_uid_by_rnti(bool isCu, module_id_t module_idP,
|
||||||
rnti_t rntiP );
|
rnti_t rntiP );
|
||||||
|
|
||||||
int f1ap_du_add_cu_ue_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_du_add_cu_ue_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t du_ue_f1ap_id,
|
module_id_t du_ue_f1ap_id,
|
||||||
module_id_t cu_ue_f1ap_id);
|
module_id_t cu_ue_f1ap_id);
|
||||||
|
|
||||||
int f1ap_cu_add_du_ue_id(f1ap_cudu_inst_t *f1_inst,
|
int f1ap_cu_add_du_ue_id(bool isCu, module_id_t module_idP,
|
||||||
module_id_t cu_ue_f1ap_id,
|
module_id_t cu_ue_f1ap_id,
|
||||||
module_id_t du_ue_f1ap_id);
|
module_id_t du_ue_f1ap_id);
|
||||||
|
|
||||||
|
int f1ap_assoc_id(bool isCu, module_id_t module_idP);
|
||||||
|
|
||||||
|
static inline f1ap_setup_req_t *f1ap_req(bool isCu, module_id_t module_idP) {
|
||||||
|
return &getCxt(isCu, module_idP)->setupReq;
|
||||||
|
}
|
||||||
|
|
||||||
#define asn1cCalloc(VaR, TyPe, lOcPtr) TyPe *lOcPtr=VaR=(TyPe*) calloc(1,sizeof(TyPe));
|
#define asn1cCalloc(VaR, TyPe, lOcPtr) TyPe *lOcPtr=VaR=(TyPe*) calloc(1,sizeof(TyPe));
|
||||||
#define asn1cCallocOne(VaR, TyPe, VaLue) VaR=(TyPe*) calloc(1,sizeof(TyPe)); *VaR=VaLue;
|
#define asn1cCallocOne(VaR, TyPe, VaLue) VaR=(TyPe*) calloc(1,sizeof(TyPe)); *VaR=VaLue;
|
||||||
#define asn1cSequenceAdd(VaR, TyPe, lOcPtr) TyPe *lOcPtr=(TyPe*) calloc(1,sizeof(TyPe)); ASN_SEQUENCE_ADD(&VaR,lOcPtr);
|
#define asn1cSequenceAdd(VaR, TyPe, lOcPtr) TyPe *lOcPtr=(TyPe*) calloc(1,sizeof(TyPe)); ASN_SEQUENCE_ADD(&VaR,lOcPtr);
|
||||||
|
|
||||||
|
#define TASK_F1APP f1ap_req(false, instance)->cell_type==CELL_MACRO_GNB?TASK_GNB_APP:TASK_ENB_APP
|
||||||
|
|
||||||
//lts: C struct type is not homogeneous, so we need macros instead of functions
|
//lts: C struct type is not homogeneous, so we need macros instead of functions
|
||||||
#define addnRCGI(nRCGi, servedCelL) \
|
#define addnRCGI(nRCGi, servedCelL) \
|
||||||
MCC_MNC_TO_PLMNID((servedCelL)->mcc,(servedCelL)-> mnc,(servedCelL)->mnc_digit_length, \
|
MCC_MNC_TO_PLMNID((servedCelL)->mcc,(servedCelL)-> mnc,(servedCelL)->mnc_digit_length, \
|
||||||
&((nRCGi).pLMN_Identity)); \
|
&((nRCGi).pLMN_Identity)); \
|
||||||
NR_CELL_ID_TO_BIT_STRING((servedCelL)->nr_cellid, &((nRCGi).nRCellIdentity));
|
NR_CELL_ID_TO_BIT_STRING((servedCelL)->nr_cellid, &((nRCGi).nRCellIdentity));
|
||||||
|
|
||||||
extern f1ap_setup_req_t *f1ap_du_data_from_du;
|
|
||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
|
|
||||||
#endif /* F1AP_COMMON_H_ */
|
#endif /* F1AP_COMMON_H_ */
|
||||||
|
|||||||
@@ -133,8 +133,11 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* - nRCGI */
|
/* - nRCGI */
|
||||||
addnRCGI(served_cells_item_p->served_Cell_Information.nRCGI, req->cell+i);
|
TBCD_TO_MCC_MNC(&(served_cells_item_p->served_Cell_Information.nRCGI.pLMN_Identity), req->cell[i].mcc,
|
||||||
|
req->cell[i].mnc,req->cell[i].mnc_digit_length);
|
||||||
|
// NR cellID
|
||||||
|
BIT_STRING_TO_NR_CELL_IDENTITY(&served_cells_item_p->served_Cell_Information.nRCGI.nRCellIdentity,
|
||||||
|
req->cell[i].nr_cellid);
|
||||||
LOG_D(F1AP, "[SCTP %d] Received nRCGI: MCC %d, MNC %d, CELL_ID %llu\n", assoc_id,
|
LOG_D(F1AP, "[SCTP %d] Received nRCGI: MCC %d, MNC %d, CELL_ID %llu\n", assoc_id,
|
||||||
req->cell[i].mcc,
|
req->cell[i].mcc,
|
||||||
req->cell[i].mnc,
|
req->cell[i].mnc,
|
||||||
@@ -147,6 +150,12 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
served_cells_item_p->served_Cell_Information.nRCGI.nRCellIdentity.buf[4]);
|
served_cells_item_p->served_Cell_Information.nRCGI.nRCellIdentity.buf[4]);
|
||||||
/* - nRPCI */
|
/* - nRPCI */
|
||||||
req->cell[i].nr_pci = served_cells_item_p->served_Cell_Information.nRPCI;
|
req->cell[i].nr_pci = served_cells_item_p->served_Cell_Information.nRPCI;
|
||||||
|
|
||||||
|
// LTS: FIXME data model failure: we don't KNOW if we receive a 4G or a 5G cell
|
||||||
|
// Furthermore, cell_type is not a attribute of a cell in the data structure !!!!!!!!!!
|
||||||
|
if (RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CU)
|
||||||
|
f1ap_req(true, instance)->cell_type=CELL_MACRO_GNB;
|
||||||
|
|
||||||
LOG_D(F1AP, "req->nr_pci[%d] %d \n",
|
LOG_D(F1AP, "req->nr_pci[%d] %d \n",
|
||||||
i, req->cell[i].nr_pci);
|
i, req->cell[i].nr_pci);
|
||||||
// System Information
|
// System Information
|
||||||
@@ -170,7 +179,6 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
i, req->sib1[i], req->sib1_length[i]);
|
i, req->sib1[i], req->sib1_length[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
*f1ap_du_data_from_du = F1AP_SETUP_REQ(message_p);
|
|
||||||
// char *measurement_timing_information[F1AP_MAX_NB_CELLS];
|
// char *measurement_timing_information[F1AP_MAX_NB_CELLS];
|
||||||
// uint8_t ranac[F1AP_MAX_NB_CELLS];
|
// uint8_t ranac[F1AP_MAX_NB_CELLS];
|
||||||
// int fdd_flag = f1ap_setup_req->fdd_flag;
|
// int fdd_flag = f1ap_setup_req->fdd_flag;
|
||||||
@@ -222,13 +230,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
CU_send_F1_SETUP_FAILURE(instance);
|
CU_send_F1_SETUP_FAILURE(instance);
|
||||||
|
itti_free(TASK_RRC_GNB,message_p);
|
||||||
if (RC.nrrrc[0]->node_type == ngran_gNB_CU) {
|
|
||||||
itti_free(TASK_RRC_GNB,message_p);
|
|
||||||
} else {
|
|
||||||
itti_free(TASK_RRC_ENB,message_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,7 +289,7 @@ int CU_send_F1_SETUP_RESPONSE(instance_t instance,
|
|||||||
i<num_cells_to_activate;
|
i<num_cells_to_activate;
|
||||||
i++) {
|
i++) {
|
||||||
asn1cSequenceAdd(ie3->value.choice.Cells_to_be_Activated_List.list,
|
asn1cSequenceAdd(ie3->value.choice.Cells_to_be_Activated_List.list,
|
||||||
F1AP_Cells_to_be_Activated_List_ItemIEs_t, cells_to_be_activated_ies);
|
F1AP_Cells_to_be_Activated_List_ItemIEs_t, cells_to_be_activated_ies);
|
||||||
cells_to_be_activated_ies->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
|
cells_to_be_activated_ies->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
|
||||||
cells_to_be_activated_ies->criticality = F1AP_Criticality_reject;
|
cells_to_be_activated_ies->criticality = F1AP_Criticality_reject;
|
||||||
cells_to_be_activated_ies->value.present = F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
|
cells_to_be_activated_ies->value.present = F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
|
||||||
@@ -340,7 +342,7 @@ int CU_send_F1_SETUP_RESPONSE(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
||||||
cu_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data_from_du->assoc_id, buffer, len, 0);
|
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,13 +396,13 @@ int CU_send_F1_SETUP_FAILURE(instance_t instance) {
|
|||||||
ie4->criticality = F1AP_Criticality_ignore;
|
ie4->criticality = F1AP_Criticality_ignore;
|
||||||
ie4->value.present = F1AP_F1SetupFailureIEs__value_PR_CriticalityDiagnostics;
|
ie4->value.present = F1AP_F1SetupFailureIEs__value_PR_CriticalityDiagnostics;
|
||||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.procedureCode,
|
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.procedureCode,
|
||||||
F1AP_ProcedureCode_t, F1AP_ProcedureCode_id_UEContextSetup);
|
F1AP_ProcedureCode_t, F1AP_ProcedureCode_id_UEContextSetup);
|
||||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.triggeringMessage,
|
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.triggeringMessage,
|
||||||
F1AP_TriggeringMessage_t, F1AP_TriggeringMessage_initiating_message);
|
F1AP_TriggeringMessage_t, F1AP_TriggeringMessage_initiating_message);
|
||||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.procedureCriticality,
|
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.procedureCriticality,
|
||||||
F1AP_Criticality_t, F1AP_Criticality_reject);
|
F1AP_Criticality_t, F1AP_Criticality_reject);
|
||||||
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.transactionID,
|
asn1cCallocOne(ie4->value.choice.CriticalityDiagnostics.transactionID,
|
||||||
F1AP_TransactionID_t, 0);
|
F1AP_TransactionID_t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* encode */
|
/* encode */
|
||||||
@@ -410,7 +412,7 @@ int CU_send_F1_SETUP_FAILURE(instance_t instance) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
||||||
cu_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data_from_du->assoc_id, buffer, len, 0);
|
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,7 +482,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
cells_to_be_activated_ies->value.present = F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
|
cells_to_be_activated_ies->value.present = F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
|
||||||
// 2.1 cells to be Activated list item
|
// 2.1 cells to be Activated list item
|
||||||
F1AP_Cells_to_be_Activated_List_Item_t *cells_to_be_activated_list_item=
|
F1AP_Cells_to_be_Activated_List_Item_t *cells_to_be_activated_list_item=
|
||||||
&cells_to_be_activated_ies->value.choice.Cells_to_be_Activated_List_Item;
|
&cells_to_be_activated_ies->value.choice.Cells_to_be_Activated_List_Item;
|
||||||
// - nRCGI
|
// - nRCGI
|
||||||
addnRCGI(cells_to_be_activated_list_item->nRCGI, f1ap_gnb_cu_configuration_update->cells_to_activate+i);
|
addnRCGI(cells_to_be_activated_list_item->nRCGI, f1ap_gnb_cu_configuration_update->cells_to_activate+i);
|
||||||
// optional
|
// optional
|
||||||
@@ -499,7 +501,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
|
|
||||||
if (f1ap_gnb_cu_configuration_update->cells_to_activate[i].num_SI > 0) {
|
if (f1ap_gnb_cu_configuration_update->cells_to_activate[i].num_SI > 0) {
|
||||||
F1AP_GNB_CUSystemInformation_t *gNB_CUSystemInformation =
|
F1AP_GNB_CUSystemInformation_t *gNB_CUSystemInformation =
|
||||||
&cells_to_be_activated_itemExtIEs->extensionValue.choice.GNB_CUSystemInformation;
|
&cells_to_be_activated_itemExtIEs->extensionValue.choice.GNB_CUSystemInformation;
|
||||||
//LOG_I(F1AP, "%s() SI %d size %d: ", __func__, i, f1ap_setup_resp->SI_container_length[i][0]);
|
//LOG_I(F1AP, "%s() SI %d size %d: ", __func__, i, f1ap_setup_resp->SI_container_length[i][0]);
|
||||||
//for (int n = 0; n < f1ap_setup_resp->SI_container_length[i][0]; n++)
|
//for (int n = 0; n < f1ap_setup_resp->SI_container_length[i][0]; n++)
|
||||||
// printf("%02x ", f1ap_setup_resp->SI_container[i][0][n]);
|
// printf("%02x ", f1ap_setup_resp->SI_container[i][0][n]);
|
||||||
@@ -811,7 +813,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
|
|
||||||
LOG_DUMPMSG(F1AP, LOG_DUMP_CHAR, buffer, len, "F1AP gNB-CU CONFIGURATION UPDATE : ");
|
LOG_DUMPMSG(F1AP, LOG_DUMP_CHAR, buffer, len, "F1AP gNB-CU CONFIGURATION UPDATE : ");
|
||||||
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
||||||
cu_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data_from_du->assoc_id, buffer, len, 0);
|
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,20 +38,10 @@
|
|||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
#include "openair3/UTILS/conversions.h"
|
#include "openair3/UTILS/conversions.h"
|
||||||
|
|
||||||
// Bing Kai: create CU and DU context, and put all the information there.
|
|
||||||
uint64_t du_ue_f1ap_id = 0;
|
|
||||||
uint32_t f1ap_assoc_id = 0;
|
|
||||||
uint32_t f1ap_stream = 0;
|
|
||||||
|
|
||||||
|
|
||||||
extern f1ap_cudu_inst_t f1ap_cu_inst[MAX_eNB];
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Initial UL RRC Message Transfer
|
Initial UL RRC Message Transfer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern RAN_CONTEXT_t RC;
|
|
||||||
|
|
||||||
int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||||
uint32_t assoc_id,
|
uint32_t assoc_id,
|
||||||
uint32_t stream,
|
uint32_t stream,
|
||||||
@@ -74,15 +64,11 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: use context
|
|
||||||
f1ap_stream = stream;
|
|
||||||
f1ap_assoc_id = assoc_id;
|
|
||||||
container = &pdu->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
|
container = &pdu->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
|
||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
getCxt(true, instance)->du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||||
LOG_D(F1AP, "du_ue_f1ap_id %lu \n", du_ue_f1ap_id);
|
|
||||||
/* NRCGI
|
/* NRCGI
|
||||||
* TODO: process NRCGI
|
* TODO: process NRCGI
|
||||||
*/
|
*/
|
||||||
@@ -100,7 +86,7 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
AssertFatal(ie!=NULL,"RRCContainer is missing\n");
|
AssertFatal(ie!=NULL,"RRCContainer is missing\n");
|
||||||
|
|
||||||
// create an ITTI message and copy SDU
|
// create an ITTI message and copy SDU
|
||||||
if (RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CU) {
|
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
||||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, NR_RRC_MAC_CCCH_DATA_IND);
|
message_p = itti_alloc_new_message (TASK_CU_F1, 0, NR_RRC_MAC_CCCH_DATA_IND);
|
||||||
memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||||
ccch_sdu_len = ie->value.choice.RRCContainer.size;
|
ccch_sdu_len = ie->value.choice.RRCContainer.size;
|
||||||
@@ -137,7 +123,7 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
// Find instance from nr_cellid
|
// Find instance from nr_cellid
|
||||||
int rrc_inst = -1;
|
int rrc_inst = -1;
|
||||||
|
|
||||||
if (RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CU) {
|
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
||||||
for (int i=0; i<RC.nb_nr_inst; i++) {
|
for (int i=0; i<RC.nb_nr_inst; i++) {
|
||||||
// first get RRC instance (note, no the ITTI instance)
|
// first get RRC instance (note, no the ITTI instance)
|
||||||
gNB_RRC_INST *rrc = RC.nrrrc[i];
|
gNB_RRC_INST *rrc = RC.nrrrc[i];
|
||||||
@@ -160,7 +146,7 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
AssertFatal(rrc_inst>=0,"couldn't find an RRC instance for nr_cell %llu\n",(unsigned long long int)nr_cellid);
|
AssertFatal(rrc_inst>=0,"couldn't find an RRC instance for nr_cell %llu\n",(unsigned long long int)nr_cellid);
|
||||||
int f1ap_uid = f1ap_add_ue(&f1ap_cu_inst[rrc_inst], rrc_inst, CC_id, 0, rnti);
|
int f1ap_uid = f1ap_add_ue(true, rrc_inst, CC_id, 0, rnti);
|
||||||
|
|
||||||
if (f1ap_uid < 0 ) {
|
if (f1ap_uid < 0 ) {
|
||||||
LOG_E(F1AP, "Failed to add UE \n");
|
LOG_E(F1AP, "Failed to add UE \n");
|
||||||
@@ -168,26 +154,14 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f1ap_cu_inst[rrc_inst].f1ap_ue[f1ap_uid].du_ue_f1ap_id = du_ue_f1ap_id;
|
//getCxt(true,ITTI_MSG_DESTINATION_ID(message_p))->f1ap_ue[f1ap_uid].du_ue_f1ap_id = du_ue_f1ap_id;
|
||||||
|
NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = 0;
|
||||||
if (RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)]->node_type == ngran_gNB_CU) {
|
NR_RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = 0;
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = 0;
|
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = ccch_sdu_len;
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = 0;
|
NR_RRC_MAC_CCCH_DATA_IND (message_p).gnb_index = rrc_inst; // CU instance
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = ccch_sdu_len;
|
NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti;
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).gnb_index = rrc_inst; // CU instance
|
NR_RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id;
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti;
|
itti_send_msg_to_task (f1ap_req(true,ITTI_MSG_DESTINATION_ID(message_p))->cell_type==CELL_MACRO_GNB?TASK_RRC_GNB:TASK_RRC_ENB, instance, message_p);
|
||||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id;
|
|
||||||
itti_send_msg_to_task (TASK_RRC_GNB, instance, message_p);
|
|
||||||
} else {
|
|
||||||
RRC_MAC_CCCH_DATA_IND (message_p).frame = 0;
|
|
||||||
RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = 0;
|
|
||||||
RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = ccch_sdu_len;
|
|
||||||
RRC_MAC_CCCH_DATA_IND (message_p).enb_index = rrc_inst; // CU instance
|
|
||||||
RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti;
|
|
||||||
RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id;
|
|
||||||
itti_send_msg_to_task (TASK_RRC_ENB, instance, message_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +192,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||||
ie1->criticality = F1AP_Criticality_reject;
|
ie1->criticality = F1AP_Criticality_reject;
|
||||||
ie1->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
ie1->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(&f1ap_cu_inst[instance], f1ap_dl_rrc->rnti);
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(true, instance, f1ap_dl_rrc->rnti);
|
||||||
LOG_I(F1AP, "Setting GNB_CU_UE_F1AP_ID %llu associated with UE RNTI %x (instance %ld)\n",
|
LOG_I(F1AP, "Setting GNB_CU_UE_F1AP_ID %llu associated with UE RNTI %x (instance %ld)\n",
|
||||||
(unsigned long long int)ie1->value.choice.GNB_CU_UE_F1AP_ID, f1ap_dl_rrc->rnti, instance);
|
(unsigned long long int)ie1->value.choice.GNB_CU_UE_F1AP_ID, f1ap_dl_rrc->rnti, instance);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
@@ -227,7 +201,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||||
ie2->criticality = F1AP_Criticality_reject;
|
ie2->criticality = F1AP_Criticality_reject;
|
||||||
ie2->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
ie2->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||||
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(&f1ap_cu_inst[instance], f1ap_dl_rrc->rnti);
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(true, instance, f1ap_dl_rrc->rnti);
|
||||||
LOG_I(F1AP, "GNB_DU_UE_F1AP_ID %llu associated with UE RNTI %x \n", (unsigned long long int)ie2->value.choice.GNB_DU_UE_F1AP_ID, f1ap_dl_rrc->rnti);
|
LOG_I(F1AP, "GNB_DU_UE_F1AP_ID %llu associated with UE RNTI %x \n", (unsigned long long int)ie2->value.choice.GNB_DU_UE_F1AP_ID, f1ap_dl_rrc->rnti);
|
||||||
/* optional */
|
/* optional */
|
||||||
/* c3. oldgNB_DU_UE_F1AP_ID */
|
/* c3. oldgNB_DU_UE_F1AP_ID */
|
||||||
@@ -264,7 +238,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
ie6->criticality = F1AP_Criticality_reject;
|
ie6->criticality = F1AP_Criticality_reject;
|
||||||
ie6->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_RRCContainer;
|
ie6->value.present = F1AP_DLRRCMessageTransferIEs__value_PR_RRCContainer;
|
||||||
OCTET_STRING_fromBuf(&ie6->value.choice.RRCContainer,
|
OCTET_STRING_fromBuf(&ie6->value.choice.RRCContainer,
|
||||||
(const char *)f1ap_dl_rrc->rrc_container, f1ap_dl_rrc->rrc_container_length);
|
(const char *)f1ap_dl_rrc->rrc_container, f1ap_dl_rrc->rrc_container_length);
|
||||||
|
|
||||||
/* optional */
|
/* optional */
|
||||||
/* c7. RAT_FrequencyPriorityInformation */
|
/* c7. RAT_FrequencyPriorityInformation */
|
||||||
@@ -294,7 +268,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cu_f1ap_itti_send_sctp_data_req(instance, f1ap_assoc_id /* BK: fix me*/, buffer, len, 0 /* BK: fix me*/);
|
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,13 +300,13 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||||
cu_ue_f1ap_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
cu_ue_f1ap_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
||||||
LOG_D(F1AP, "cu_ue_f1ap_id %lu associated with RNTI %x\n",
|
LOG_D(F1AP, "cu_ue_f1ap_id %lu associated with RNTI %x\n",
|
||||||
cu_ue_f1ap_id, f1ap_get_rnti_by_cu_id(&f1ap_cu_inst[instance], cu_ue_f1ap_id));
|
cu_ue_f1ap_id, f1ap_get_rnti_by_cu_id(true, instance, cu_ue_f1ap_id));
|
||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||||
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with RNTI %x\n",
|
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with RNTI %x\n",
|
||||||
du_ue_f1ap_id, f1ap_get_rnti_by_cu_id(&f1ap_cu_inst[instance], du_ue_f1ap_id));
|
du_ue_f1ap_id, f1ap_get_rnti_by_cu_id(true, instance, du_ue_f1ap_id));
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* SRBID */
|
/* SRBID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
|
||||||
@@ -362,7 +336,7 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
ie->value.choice.RRCContainer.size);
|
ie->value.choice.RRCContainer.size);
|
||||||
|
|
||||||
RRC_DCCH_DATA_IND (message_p).dcch_index = srb_id;
|
RRC_DCCH_DATA_IND (message_p).dcch_index = srb_id;
|
||||||
RRC_DCCH_DATA_IND (message_p).rnti = f1ap_get_rnti_by_cu_id(&f1ap_cu_inst[instance], cu_ue_f1ap_id);
|
RRC_DCCH_DATA_IND (message_p).rnti = f1ap_get_rnti_by_cu_id(true, instance, cu_ue_f1ap_id);
|
||||||
RRC_DCCH_DATA_IND (message_p).module_id = instance;
|
RRC_DCCH_DATA_IND (message_p).module_id = instance;
|
||||||
RRC_DCCH_DATA_IND (message_p).eNB_index = instance; // not needed for CU
|
RRC_DCCH_DATA_IND (message_p).eNB_index = instance; // not needed for CU
|
||||||
|
|
||||||
@@ -371,7 +345,7 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
ctxt.module_id = instance;
|
ctxt.module_id = instance;
|
||||||
ctxt.instance = instance;
|
ctxt.instance = instance;
|
||||||
ctxt.rnti = f1ap_get_rnti_by_cu_id(&f1ap_cu_inst[instance], cu_ue_f1ap_id);
|
ctxt.rnti = f1ap_get_rnti_by_cu_id(true, instance, cu_ue_f1ap_id);
|
||||||
ctxt.enb_flag = 1;
|
ctxt.enb_flag = 1;
|
||||||
ctxt.eNB_index = 0;
|
ctxt.eNB_index = 0;
|
||||||
ctxt.configured = 1;
|
ctxt.configured = 1;
|
||||||
|
|||||||
@@ -38,13 +38,14 @@
|
|||||||
#include "f1ap_cu_task.h"
|
#include "f1ap_cu_task.h"
|
||||||
#include "proto_agent.h"
|
#include "proto_agent.h"
|
||||||
|
|
||||||
extern RAN_CONTEXT_t RC;
|
|
||||||
extern uint8_t proto_agent_flag;
|
|
||||||
|
|
||||||
f1ap_setup_req_t *f1ap_du_data_from_du;
|
|
||||||
f1ap_cudu_inst_t f1ap_cu_inst[MAX_eNB];
|
|
||||||
|
|
||||||
void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind) {
|
void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind) {
|
||||||
|
createF1inst(true, instance, NULL);
|
||||||
|
// save the assoc id
|
||||||
|
f1ap_setup_req_t *f1ap_du_data=f1ap_req(true, instance);
|
||||||
|
f1ap_du_data->assoc_id = sctp_new_association_ind->assoc_id;
|
||||||
|
f1ap_du_data->sctp_in_streams = sctp_new_association_ind->in_streams;
|
||||||
|
f1ap_du_data->sctp_out_streams = sctp_new_association_ind->out_streams;
|
||||||
|
f1ap_du_data->default_sctp_stream_id = 0;
|
||||||
// Nothing
|
// Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,20 +57,12 @@ void cu_task_handle_sctp_association_resp(instance_t instance, sctp_new_associat
|
|||||||
sctp_new_association_resp->sctp_state,
|
sctp_new_association_resp->sctp_state,
|
||||||
instance,
|
instance,
|
||||||
sctp_new_association_resp->ulp_cnx_id);
|
sctp_new_association_resp->ulp_cnx_id);
|
||||||
|
//if (sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN)
|
||||||
if (sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN)
|
//proto_agent_stop(instance);
|
||||||
proto_agent_stop(instance);
|
|
||||||
|
|
||||||
//f1ap_handle_setup_message(instance, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
|
//f1ap_handle_setup_message(instance, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
|
||||||
return; // exit -1 for debugging
|
return; // exit -1 for debugging
|
||||||
}
|
}
|
||||||
|
|
||||||
// go to an init func
|
|
||||||
f1ap_du_data_from_du = (f1ap_setup_req_t *)calloc(1, sizeof(f1ap_setup_req_t));
|
|
||||||
// save the assoc id
|
|
||||||
f1ap_du_data_from_du->assoc_id = sctp_new_association_resp->assoc_id;
|
|
||||||
f1ap_du_data_from_du->sctp_in_streams = sctp_new_association_resp->in_streams;
|
|
||||||
f1ap_du_data_from_du->sctp_out_streams = sctp_new_association_resp->out_streams;
|
|
||||||
/* setup parameters for F1U and start the server */
|
/* setup parameters for F1U and start the server */
|
||||||
const cudu_params_t params = {
|
const cudu_params_t params = {
|
||||||
.local_ipv4_address = RC.nrrrc[instance]->eth_params_s.my_addr,
|
.local_ipv4_address = RC.nrrrc[instance]->eth_params_s.my_addr,
|
||||||
@@ -77,9 +70,8 @@ void cu_task_handle_sctp_association_resp(instance_t instance, sctp_new_associat
|
|||||||
.remote_ipv4_address = RC.nrrrc[instance]->eth_params_s.remote_addr,
|
.remote_ipv4_address = RC.nrrrc[instance]->eth_params_s.remote_addr,
|
||||||
.remote_port = RC.nrrrc[instance]->eth_params_s.remote_portd
|
.remote_port = RC.nrrrc[instance]->eth_params_s.remote_portd
|
||||||
};
|
};
|
||||||
AssertFatal(proto_agent_start(instance, ¶ms) == 0,
|
//AssertFatal(proto_agent_start(instance, ¶ms) == 0,
|
||||||
"could not start PROTO_AGENT for F1U on instance %ld!\n", instance);
|
// "could not start PROTO_AGENT for F1U on instance %ld!\n", instance);
|
||||||
proto_agent_flag = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cu_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind) {
|
void cu_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind) {
|
||||||
@@ -120,7 +112,10 @@ void cu_task_send_sctp_init_req(instance_t enb_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *F1AP_CU_task(void *arg) {
|
void *
|
||||||
|
|
||||||
|
|
||||||
|
F1AP_CU_task(void *arg) {
|
||||||
MessageDef *received_msg = NULL;
|
MessageDef *received_msg = NULL;
|
||||||
int result;
|
int result;
|
||||||
LOG_I(F1AP, "Starting F1AP at CU\n");
|
LOG_I(F1AP, "Starting F1AP at CU\n");
|
||||||
@@ -136,7 +131,7 @@ void *F1AP_CU_task(void *arg) {
|
|||||||
case SCTP_NEW_ASSOCIATION_IND:
|
case SCTP_NEW_ASSOCIATION_IND:
|
||||||
LOG_I(F1AP, "CU Task Received SCTP_NEW_ASSOCIATION_IND for instance %ld\n",
|
LOG_I(F1AP, "CU Task Received SCTP_NEW_ASSOCIATION_IND for instance %ld\n",
|
||||||
ITTI_MSG_DESTINATION_INSTANCE(received_msg));
|
ITTI_MSG_DESTINATION_INSTANCE(received_msg));
|
||||||
cu_task_handle_sctp_association_ind(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
cu_task_handle_sctp_association_ind(ITTI_MSG_ORIGIN_INSTANCE(received_msg),
|
||||||
&received_msg->ittiMsg.sctp_new_association_ind);
|
&received_msg->ittiMsg.sctp_new_association_ind);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -44,31 +44,29 @@
|
|||||||
#include "rrc_eNB_GTPV1U.h"
|
#include "rrc_eNB_GTPV1U.h"
|
||||||
#include "openair2/RRC/NR/rrc_gNB_NGAP.h"
|
#include "openair2/RRC/NR/rrc_gNB_NGAP.h"
|
||||||
|
|
||||||
extern f1ap_setup_req_t *f1ap_du_data_from_du;
|
|
||||||
extern f1ap_cudu_inst_t f1ap_cu_inst[MAX_eNB];
|
|
||||||
extern RAN_CONTEXT_t RC;
|
|
||||||
extern uint32_t f1ap_assoc_id;
|
|
||||||
|
|
||||||
static void setQos(F1AP_NonDynamic5QIDescriptor_t *toFill) {
|
static void setQos(F1AP_NonDynamic5QIDescriptor_t *toFill) {
|
||||||
asn1cCalloc(toFill,F1AP_NonDynamic5QIDescriptor_t, tmp);
|
asn1cCalloc(toFill,F1AP_NonDynamic5QIDescriptor_t, tmp);
|
||||||
/* fiveQI */
|
/* fiveQI */
|
||||||
tmp->fiveQI = 1L;
|
tmp->fiveQI = 1L;
|
||||||
|
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
/* qoSPriorityLevel */
|
/* qoSPriorityLevel */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(toFill->qoSPriorityLevel, long, 1L);
|
asn1cCallocOne(toFill->qoSPriorityLevel, long, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
/* averagingWindow */
|
/* averagingWindow */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(toFill->averagingWindow,
|
asn1cCallocOne(toFill->averagingWindow,
|
||||||
F1AP_AveragingWindow_t, 1L);
|
F1AP_AveragingWindow_t, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
/* maxDataBurstVolume */
|
/* maxDataBurstVolume */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(toFill->maxDataBurstVolume,
|
asn1cCallocOne(toFill->maxDataBurstVolume,
|
||||||
F1AP_MaxDataBurstVolume_t, 1L);
|
F1AP_MaxDataBurstVolume_t, 1L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +108,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
ie3->criticality = F1AP_Criticality_reject;
|
ie3->criticality = F1AP_Criticality_reject;
|
||||||
ie3->value.present = F1AP_UEContextSetupRequestIEs__value_PR_NRCGI;
|
ie3->value.present = F1AP_UEContextSetupRequestIEs__value_PR_NRCGI;
|
||||||
/* - nRCGI */
|
/* - nRCGI */
|
||||||
addnRCGI(ie3->value.choice.NRCGI, f1ap_du_data_from_du->cell);
|
addnRCGI(ie3->value.choice.NRCGI, f1ap_ue_context_setup_req);
|
||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c4. ServCellIndex */
|
/* c4. ServCellIndex */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie4);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie4);
|
||||||
@@ -157,7 +154,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
ie7->id = F1AP_ProtocolIE_ID_id_Candidate_SpCell_List; //90
|
ie7->id = F1AP_ProtocolIE_ID_id_Candidate_SpCell_List; //90
|
||||||
ie7->criticality = F1AP_Criticality_ignore;
|
ie7->criticality = F1AP_Criticality_ignore;
|
||||||
ie7->value.present = F1AP_UEContextSetupRequestIEs__value_PR_Candidate_SpCell_List;
|
ie7->value.present = F1AP_UEContextSetupRequestIEs__value_PR_Candidate_SpCell_List;
|
||||||
|
|
||||||
for (int i=0; i<0; i++) {
|
for (int i=0; i<0; i++) {
|
||||||
asn1cSequenceAdd(ie7->value.choice.Candidate_SpCell_List.list,F1AP_Candidate_SpCell_ItemIEs_t, candidate_spCell_item_ies);
|
asn1cSequenceAdd(ie7->value.choice.Candidate_SpCell_List.list,F1AP_Candidate_SpCell_ItemIEs_t, candidate_spCell_item_ies);
|
||||||
candidate_spCell_item_ies->id = F1AP_ProtocolIE_ID_id_Candidate_SpCell_Item; // 91
|
candidate_spCell_item_ies->id = F1AP_ProtocolIE_ID_id_Candidate_SpCell_Item; // 91
|
||||||
@@ -165,14 +162,14 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
candidate_spCell_item_ies->value.present = F1AP_Candidate_SpCell_ItemIEs__value_PR_Candidate_SpCell_Item;
|
candidate_spCell_item_ies->value.present = F1AP_Candidate_SpCell_ItemIEs__value_PR_Candidate_SpCell_Item;
|
||||||
/* 7.1 Candidate_SpCell_Item */
|
/* 7.1 Candidate_SpCell_Item */
|
||||||
F1AP_Candidate_SpCell_Item_t *candidate_spCell_item=
|
F1AP_Candidate_SpCell_Item_t *candidate_spCell_item=
|
||||||
&candidate_spCell_item_ies->value.choice.Candidate_SpCell_Item;
|
&candidate_spCell_item_ies->value.choice.Candidate_SpCell_Item;
|
||||||
/* - candidate_SpCell_ID */
|
/* - candidate_SpCell_ID */
|
||||||
//FixMe: first cell ???
|
//FixMe: first cell ???
|
||||||
addnRCGI(candidate_spCell_item->candidate_SpCell_ID,f1ap_ue_context_setup_req);
|
addnRCGI(candidate_spCell_item->candidate_SpCell_ID,f1ap_ue_context_setup_req);
|
||||||
/* TODO add correct mcc/mnc */
|
/* TODO add correct mcc/mnc */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* optional */
|
/* optional */
|
||||||
/* c8. DRXCycle */
|
/* c8. DRXCycle */
|
||||||
if (0) {
|
if (0) {
|
||||||
@@ -182,19 +179,19 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
ie8->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRXCycle;
|
ie8->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRXCycle;
|
||||||
/* 8.1 longDRXCycleLength */
|
/* 8.1 longDRXCycleLength */
|
||||||
ie8->value.choice.DRXCycle.longDRXCycleLength = F1AP_LongDRXCycleLength_ms10; // enum
|
ie8->value.choice.DRXCycle.longDRXCycleLength = F1AP_LongDRXCycleLength_ms10; // enum
|
||||||
|
|
||||||
/* optional */
|
/* optional */
|
||||||
/* 8.2 shortDRXCycleLength */
|
/* 8.2 shortDRXCycleLength */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(ie6->value.choice.DRXCycle.shortDRXCycleLength,
|
asn1cCallocOne(ie6->value.choice.DRXCycle.shortDRXCycleLength,
|
||||||
F1AP_ShortDRXCycleLength_t, F1AP_ShortDRXCycleLength_ms2); // enum
|
F1AP_ShortDRXCycleLength_t, F1AP_ShortDRXCycleLength_ms2); // enum
|
||||||
}
|
}
|
||||||
|
|
||||||
/* optional */
|
/* optional */
|
||||||
/* 8.3 shortDRXCycleTimer */
|
/* 8.3 shortDRXCycleTimer */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(ie8->value.choice.DRXCycle.shortDRXCycleTimer,
|
asn1cCallocOne(ie8->value.choice.DRXCycle.shortDRXCycleTimer,
|
||||||
F1AP_ShortDRXCycleTimer_t, 123L);
|
F1AP_ShortDRXCycleTimer_t, 123L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +235,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* 10.1.3 sCellULConfigured*/
|
/* 10.1.3 sCellULConfigured*/
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(scell_toBeSetup_item->sCellULConfigured,
|
asn1cCallocOne(scell_toBeSetup_item->sCellULConfigured,
|
||||||
F1AP_CellULConfigured_t, F1AP_CellULConfigured_ul_and_sul); // enum
|
F1AP_CellULConfigured_t, F1AP_CellULConfigured_ul_and_sul); // enum
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -264,7 +261,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* 11.1.2 duplicationIndication */
|
/* 11.1.2 duplicationIndication */
|
||||||
//if (0) {
|
//if (0) {
|
||||||
asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication,
|
asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication,
|
||||||
F1AP_DuplicationIndication_t, F1AP_DuplicationIndication_true); // enum
|
F1AP_DuplicationIndication_t, F1AP_DuplicationIndication_true); // enum
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,7 +328,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
|
|
||||||
if (some_decide_qoS_characteristics) {
|
if (some_decide_qoS_characteristics) {
|
||||||
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
||||||
setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
|
setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
|
||||||
} else {
|
} else {
|
||||||
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
||||||
asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, F1AP_Dynamic5QIDescriptor_t, tmp);
|
asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, F1AP_Dynamic5QIDescriptor_t, tmp);
|
||||||
@@ -347,21 +344,21 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* delayCritical */
|
/* delayCritical */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical,
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical,
|
||||||
long, 1L);
|
long, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
/* averagingWindow */
|
/* averagingWindow */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow,
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow,
|
||||||
F1AP_AveragingWindow_t, 1L);
|
F1AP_AveragingWindow_t, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
/* maxDataBurstVolume */
|
/* maxDataBurstVolume */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume,
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume,
|
||||||
F1AP_MaxDataBurstVolume_t, 1L);
|
F1AP_MaxDataBurstVolume_t, 1L);
|
||||||
}
|
}
|
||||||
} // if some_decide_qoS_characteristics
|
} // if some_decide_qoS_characteristics
|
||||||
} // qoS_Characteristics
|
} // qoS_Characteristics
|
||||||
@@ -385,14 +382,14 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* maxPacketLossRateDownlink */
|
/* maxPacketLossRateDownlink */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink,
|
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink,
|
||||||
F1AP_MaxPacketLossRate_t, 1L);
|
F1AP_MaxPacketLossRate_t, 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
/* maxPacketLossRateUplink */
|
/* maxPacketLossRateUplink */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink,
|
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink,
|
||||||
F1AP_MaxPacketLossRate_t, 1L);
|
F1AP_MaxPacketLossRate_t, 1L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,7 +397,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* reflective_QoS_Attribute */
|
/* reflective_QoS_Attribute */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute,
|
asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute,
|
||||||
long, 1L);
|
long, 1L);
|
||||||
}
|
}
|
||||||
} // dRB_QoS
|
} // dRB_QoS
|
||||||
/* 12.1.2.2 sNSSAI */
|
/* 12.1.2.2 sNSSAI */
|
||||||
@@ -422,7 +419,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* 12.1.2.3 notificationControl */
|
/* 12.1.2.3 notificationControl */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(DRB_Information->notificationControl,
|
asn1cCallocOne(DRB_Information->notificationControl,
|
||||||
F1AP_NotificationControl_t, F1AP_NotificationControl_active); // enum
|
F1AP_NotificationControl_t, F1AP_NotificationControl_active); // enum
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy
|
/* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy
|
||||||
@@ -441,8 +438,8 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
|
|
||||||
if (some_decide_qoS_characteristics) {
|
if (some_decide_qoS_characteristics) {
|
||||||
QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
||||||
setQos(QosParams->choice.non_Dynamic_5QI);
|
setQos(QosParams->choice.non_Dynamic_5QI);
|
||||||
} else {
|
} else {
|
||||||
QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
||||||
asn1cCalloc(QosParams->choice.dynamic_5QI, F1AP_Dynamic5QIDescriptor_t, tmp);
|
asn1cCalloc(QosParams->choice.dynamic_5QI, F1AP_Dynamic5QIDescriptor_t, tmp);
|
||||||
/* qoSPriorityLevel */
|
/* qoSPriorityLevel */
|
||||||
@@ -624,7 +621,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
// return -1;
|
// return -1;
|
||||||
// }
|
// }
|
||||||
LOG_D(F1AP,"F1AP UEContextSetupRequest Encoded %u bits\n", len);
|
LOG_D(F1AP,"F1AP UEContextSetupRequest Encoded %u bits\n", len);
|
||||||
cu_f1ap_itti_send_sctp_data_req(instance, f1ap_assoc_id /* BK: fix me*/, buffer, len, 0 /* BK: fix me*/);
|
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -679,12 +676,12 @@ int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
|
|||||||
/* GNB_CU_UE_F1AP_ID */
|
/* GNB_CU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||||
const rnti_t rnti = f1ap_get_rnti_by_cu_id(&f1ap_cu_inst[instance],
|
const rnti_t rnti = f1ap_get_rnti_by_cu_id(true, instance,
|
||||||
ie->value.choice.GNB_CU_UE_F1AP_ID);
|
ie->value.choice.GNB_CU_UE_F1AP_ID);
|
||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(&f1ap_cu_inst[instance],
|
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(true, instance,
|
||||||
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
||||||
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
||||||
rnti2, rnti);
|
rnti2, rnti);
|
||||||
@@ -713,13 +710,19 @@ int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
LOG_I(F1AP, "Received UE CONTEXT RELEASE REQUEST: Trigger RRC for RNTI %x\n", rnti);
|
LOG_I(F1AP, "Received UE CONTEXT RELEASE REQUEST: Trigger RRC for RNTI %x\n", rnti);
|
||||||
struct rrc_eNB_ue_context_s *ue_context_pP;
|
|
||||||
ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[instance], rnti);
|
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
||||||
rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(
|
AssertFatal(false,"must be devlopped\n");
|
||||||
instance,
|
} else {
|
||||||
ue_context_pP,
|
struct rrc_eNB_ue_context_s *ue_context_pP;
|
||||||
S1AP_CAUSE_RADIO_NETWORK,
|
ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[instance], rnti);
|
||||||
21); // send cause 21: connection with ue lost
|
rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(
|
||||||
|
instance,
|
||||||
|
ue_context_pP,
|
||||||
|
S1AP_CAUSE_RADIO_NETWORK,
|
||||||
|
21); // send cause 21: connection with ue lost
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -744,14 +747,14 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||||
ie1->criticality = F1AP_Criticality_reject;
|
ie1->criticality = F1AP_Criticality_reject;
|
||||||
ie1->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
ie1->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(&f1ap_cu_inst[instance], cmd->rnti);
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(true, instance, cmd->rnti);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c2. GNB_DU_UE_F1AP_ID */
|
/* c2. GNB_DU_UE_F1AP_ID */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie2);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie2);
|
||||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||||
ie2->criticality = F1AP_Criticality_reject;
|
ie2->criticality = F1AP_Criticality_reject;
|
||||||
ie2->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
ie2->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||||
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(&f1ap_cu_inst[instance], cmd->rnti);
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(true, instance, cmd->rnti);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c3. Cause */
|
/* c3. Cause */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie3);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie3);
|
||||||
@@ -801,7 +804,7 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cu_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data_from_du->assoc_id, buffer, len, 0);
|
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -816,12 +819,12 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
|||||||
/* GNB_CU_UE_F1AP_ID */
|
/* GNB_CU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||||
const rnti_t rnti = f1ap_get_rnti_by_cu_id(&f1ap_cu_inst[instance],
|
const rnti_t rnti = f1ap_get_rnti_by_cu_id(true, instance,
|
||||||
ie->value.choice.GNB_CU_UE_F1AP_ID);
|
ie->value.choice.GNB_CU_UE_F1AP_ID);
|
||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(&f1ap_cu_inst[instance],
|
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(true, instance,
|
||||||
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
||||||
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
||||||
rnti2, rnti);
|
rnti2, rnti);
|
||||||
@@ -841,7 +844,7 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
|||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, instance, ENB_FLAG_YES, rnti, 0, 0, instance);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, instance, ENB_FLAG_YES, rnti, 0, 0, instance);
|
||||||
|
|
||||||
if (RC.nrrrc[instance]->node_type == ngran_gNB_CU) {
|
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
||||||
struct rrc_gNB_ue_context_s *ue_context_p =
|
struct rrc_gNB_ue_context_s *ue_context_p =
|
||||||
rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti);
|
rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti);
|
||||||
|
|
||||||
@@ -897,7 +900,7 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
|||||||
instance, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
|
instance, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
|
||||||
|
|
||||||
LOG_I(F1AP, "Received UE CONTEXT RELEASE COMPLETE: Removing CU UE entry for RNTI %x\n", rnti);
|
LOG_I(F1AP, "Received UE CONTEXT RELEASE COMPLETE: Removing CU UE entry for RNTI %x\n", rnti);
|
||||||
f1ap_remove_ue(&f1ap_cu_inst[instance], rnti);
|
f1ap_remove_ue(true, instance, rnti);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -909,7 +912,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
|
|||||||
uint8_t *buffer=NULL;
|
uint8_t *buffer=NULL;
|
||||||
uint32_t len=0;
|
uint32_t len=0;
|
||||||
// for test
|
// for test
|
||||||
cellIDs_t hardCoded={ .mcc=208, .mnc=93, .mnc_digit_length=2};
|
cellIDs_t hardCoded= { .mcc=208, .mnc=93, .mnc_digit_length=2};
|
||||||
/* Create */
|
/* Create */
|
||||||
/* 0. Message Type */
|
/* 0. Message Type */
|
||||||
pdu.present = F1AP_F1AP_PDU_PR_initiatingMessage;
|
pdu.present = F1AP_F1AP_PDU_PR_initiatingMessage;
|
||||||
|
|||||||
@@ -37,10 +37,8 @@
|
|||||||
#include "f1ap_du_interface_management.h"
|
#include "f1ap_du_interface_management.h"
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
|
||||||
extern f1ap_setup_req_t *f1ap_du_data;
|
|
||||||
extern RAN_CONTEXT_t RC;
|
|
||||||
|
|
||||||
int nrb_lut[29] = {11, 18, 24, 25, 31, 32, 38, 51, 52, 65, 66, 78, 79, 93, 106, 107, 121, 132, 133, 135, 160, 162, 189, 216, 217, 245, 264, 270, 273};
|
static const int nrb_lut[29] = {11, 18, 24, 25, 31, 32, 38, 51, 52, 65, 66, 78, 79, 93, 106, 107, 121, 132, 133, 135, 160, 162, 189, 216, 217, 245, 264, 270, 273};
|
||||||
|
|
||||||
int to_NRNRB(int nrb) {
|
int to_NRNRB(int nrb) {
|
||||||
for (int i=0; i<sizeofArray(nrb_lut); i++)
|
for (int i=0; i<sizeofArray(nrb_lut); i++)
|
||||||
@@ -121,17 +119,17 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
ieC2->id = F1AP_ProtocolIE_ID_id_gNB_DU_ID;
|
ieC2->id = F1AP_ProtocolIE_ID_id_gNB_DU_ID;
|
||||||
ieC2->criticality = F1AP_Criticality_reject;
|
ieC2->criticality = F1AP_Criticality_reject;
|
||||||
ieC2->value.present = F1AP_F1SetupRequestIEs__value_PR_GNB_DU_ID;
|
ieC2->value.present = F1AP_F1SetupRequestIEs__value_PR_GNB_DU_ID;
|
||||||
asn_int642INTEGER(&ieC2->value.choice.GNB_DU_ID, f1ap_du_data->gNB_DU_id);
|
asn_int642INTEGER(&ieC2->value.choice.GNB_DU_ID, f1ap_req(false, instance)->gNB_DU_id);
|
||||||
|
|
||||||
/* optional */
|
/* optional */
|
||||||
/* c3. GNB_DU_Name */
|
/* c3. GNB_DU_Name */
|
||||||
if (f1ap_du_data->gNB_DU_name != NULL) {
|
if (f1ap_req(false,instance)->gNB_DU_name != NULL) {
|
||||||
asn1cSequenceAdd(f1Setup->protocolIEs.list, F1AP_F1SetupRequestIEs_t, ieC3);
|
asn1cSequenceAdd(f1Setup->protocolIEs.list, F1AP_F1SetupRequestIEs_t, ieC3);
|
||||||
ieC3->id = F1AP_ProtocolIE_ID_id_gNB_DU_Name;
|
ieC3->id = F1AP_ProtocolIE_ID_id_gNB_DU_Name;
|
||||||
ieC3->criticality = F1AP_Criticality_ignore;
|
ieC3->criticality = F1AP_Criticality_ignore;
|
||||||
ieC3->value.present = F1AP_F1SetupRequestIEs__value_PR_GNB_DU_Name;
|
ieC3->value.present = F1AP_F1SetupRequestIEs__value_PR_GNB_DU_Name;
|
||||||
OCTET_STRING_fromBuf(&ieC3->value.choice.GNB_DU_Name, f1ap_du_data->gNB_DU_name,
|
char *gNB_DU_name=f1ap_req(false, instance)->gNB_DU_name;
|
||||||
strlen(f1ap_du_data->gNB_DU_name));
|
OCTET_STRING_fromBuf(&ieC3->value.choice.GNB_DU_Name, gNB_DU_name, strlen(gNB_DU_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
@@ -140,12 +138,13 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
ieCells->id = F1AP_ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
|
ieCells->id = F1AP_ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
|
||||||
ieCells->criticality = F1AP_Criticality_reject;
|
ieCells->criticality = F1AP_Criticality_reject;
|
||||||
ieCells->value.present = F1AP_F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
|
ieCells->value.present = F1AP_F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
|
||||||
int num_cells_available = f1ap_du_data->num_cells_available;
|
int num_cells_available = f1ap_req(false, instance)->num_cells_available;
|
||||||
LOG_D(F1AP, "num_cells_available = %d \n", num_cells_available);
|
LOG_D(F1AP, "num_cells_available = %d \n", num_cells_available);
|
||||||
|
|
||||||
for (int i=0; i<num_cells_available; i++) {
|
for (int i=0; i<num_cells_available; i++) {
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* 4.1 served cells item */
|
/* 4.1 served cells item */
|
||||||
|
cellIDs_t *cell=&f1ap_req(false, instance)->cell[i];
|
||||||
asn1cSequenceAdd(ieCells->value.choice.GNB_DU_Served_Cells_List.list,
|
asn1cSequenceAdd(ieCells->value.choice.GNB_DU_Served_Cells_List.list,
|
||||||
F1AP_GNB_DU_Served_Cells_ItemIEs_t, duServedCell);
|
F1AP_GNB_DU_Served_Cells_ItemIEs_t, duServedCell);
|
||||||
duServedCell->id = F1AP_ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
|
duServedCell->id = F1AP_ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
|
||||||
@@ -154,11 +153,11 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
F1AP_GNB_DU_Served_Cells_Item_t *gnb_du_served_cells_item=&duServedCell->value.choice.GNB_DU_Served_Cells_Item;
|
F1AP_GNB_DU_Served_Cells_Item_t *gnb_du_served_cells_item=&duServedCell->value.choice.GNB_DU_Served_Cells_Item;
|
||||||
/* 4.1.1 served cell Information */
|
/* 4.1.1 served cell Information */
|
||||||
F1AP_Served_Cell_Information_t *served_cell_information= &gnb_du_served_cells_item->served_Cell_Information;
|
F1AP_Served_Cell_Information_t *served_cell_information= &gnb_du_served_cells_item->served_Cell_Information;
|
||||||
//addnRCGI(served_cell_information->nRCGI,f1ap_du_data->cell+i);
|
addnRCGI(served_cell_information->nRCGI,cell);
|
||||||
/* - nRPCI */
|
/* - nRPCI */
|
||||||
served_cell_information->nRPCI = f1ap_du_data->cell[i].nr_pci; // int 0..1007
|
served_cell_information->nRPCI = cell->nr_pci; // int 0..1007
|
||||||
/* - fiveGS_TAC */
|
/* - fiveGS_TAC */
|
||||||
uint32_t tac=htonl(f1ap_du_data->cell[i].tac);
|
uint32_t tac=htonl(cell->tac);
|
||||||
asn1cCalloc(served_cell_information->fiveGS_TAC, F1AP_FiveGS_TAC_t, netOrder);
|
asn1cCalloc(served_cell_information->fiveGS_TAC, F1AP_FiveGS_TAC_t, netOrder);
|
||||||
OCTET_STRING_fromBuf(netOrder, ((char *)&tac)+1, 3);
|
OCTET_STRING_fromBuf(netOrder, ((char *)&tac)+1, 3);
|
||||||
|
|
||||||
@@ -170,18 +169,16 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
|
|
||||||
/* servedPLMN information */
|
/* servedPLMN information */
|
||||||
asn1cSequenceAdd(served_cell_information->servedPLMNs.list, F1AP_ServedPLMNs_Item_t,servedPLMN_item);
|
asn1cSequenceAdd(served_cell_information->servedPLMNs.list, F1AP_ServedPLMNs_Item_t,servedPLMN_item);
|
||||||
MCC_MNC_TO_PLMNID(f1ap_du_data->cell[i].mcc, f1ap_du_data->cell[i].mnc,
|
MCC_MNC_TO_PLMNID(cell->mcc, cell->mnc, cell->mnc_digit_length, &servedPLMN_item->pLMN_Identity);
|
||||||
f1ap_du_data->cell[i].mnc_digit_length, &servedPLMN_item->pLMN_Identity);
|
|
||||||
// // /* - CHOICE NR-MODE-Info */
|
// // /* - CHOICE NR-MODE-Info */
|
||||||
F1AP_NR_Mode_Info_t *nR_Mode_Info= &served_cell_information->nR_Mode_Info;
|
F1AP_NR_Mode_Info_t *nR_Mode_Info= &served_cell_information->nR_Mode_Info;
|
||||||
|
|
||||||
//f1ap_du_data->fdd_flag = 1;
|
if (f1ap_req(false, instance)->fdd_flag) { // FDD
|
||||||
if (f1ap_du_data->fdd_flag) { // FDD
|
|
||||||
nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_fDD;
|
nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_fDD;
|
||||||
asn1cCalloc(nR_Mode_Info->choice.fDD, F1AP_FDD_Info_t, fDD_Info);
|
asn1cCalloc(nR_Mode_Info->choice.fDD, F1AP_FDD_Info_t, fDD_Info);
|
||||||
/* FDD.1 UL NRFreqInfo */
|
/* FDD.1 UL NRFreqInfo */
|
||||||
/* FDD.1.1 UL NRFreqInfo ARFCN */
|
/* FDD.1.1 UL NRFreqInfo ARFCN */
|
||||||
fDD_Info->uL_NRFreqInfo.nRARFCN = f1ap_du_data->nr_mode_info[i].fdd.ul_nr_arfcn; // Integer
|
fDD_Info->uL_NRFreqInfo.nRARFCN = f1ap_req(false,instance)->nr_mode_info[i].fdd.ul_nr_arfcn; // Integer
|
||||||
|
|
||||||
/* FDD.1.2 F1AP_SUL_Information */
|
/* FDD.1.2 F1AP_SUL_Information */
|
||||||
if(0) { // Optional
|
if(0) { // Optional
|
||||||
@@ -192,27 +189,27 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* FDD.1.3 freqBandListNr */
|
/* FDD.1.3 freqBandListNr */
|
||||||
int fdd_ul_num_available_freq_Bands = f1ap_du_data->nr_mode_info[i].fdd.ul_num_frequency_bands;
|
int fdd_ul_num_available_freq_Bands = f1ap_req(false,instance)->nr_mode_info[i].fdd.ul_num_frequency_bands;
|
||||||
LOG_D(F1AP, "fdd_ul_num_available_freq_Bands = %d \n", fdd_ul_num_available_freq_Bands);
|
LOG_D(F1AP, "fdd_ul_num_available_freq_Bands = %d \n", fdd_ul_num_available_freq_Bands);
|
||||||
|
|
||||||
for (int fdd_ul_j=0; fdd_ul_j<fdd_ul_num_available_freq_Bands; fdd_ul_j++) {
|
for (int fdd_ul_j=0; fdd_ul_j<fdd_ul_num_available_freq_Bands; fdd_ul_j++) {
|
||||||
asn1cSequenceAdd(fDD_Info->uL_NRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem);
|
asn1cSequenceAdd(fDD_Info->uL_NRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem);
|
||||||
/* FDD.1.3.1 freqBandIndicatorNr*/
|
/* FDD.1.3.1 freqBandIndicatorNr*/
|
||||||
nr_freqBandNrItem->freqBandIndicatorNr = f1ap_du_data->nr_mode_info[i].fdd.ul_nr_band[fdd_ul_j]; //
|
nr_freqBandNrItem->freqBandIndicatorNr = f1ap_req(false,instance)->nr_mode_info[i].fdd.ul_nr_band[fdd_ul_j]; //
|
||||||
/* FDD.1.3.2 supportedSULBandList*/
|
/* FDD.1.3.2 supportedSULBandList*/
|
||||||
int num_available_supported_SULBands = f1ap_du_data->nr_mode_info[i].fdd.ul_num_sul_frequency_bands;
|
int num_available_supported_SULBands = f1ap_req(false,instance)->nr_mode_info[i].fdd.ul_num_sul_frequency_bands;
|
||||||
LOG_D(F1AP, "num_available_supported_SULBands = %d \n", num_available_supported_SULBands);
|
LOG_D(F1AP, "num_available_supported_SULBands = %d \n", num_available_supported_SULBands);
|
||||||
|
|
||||||
for (int fdd_ul_k=0; fdd_ul_k<num_available_supported_SULBands; fdd_ul_k++) {
|
for (int fdd_ul_k=0; fdd_ul_k<num_available_supported_SULBands; fdd_ul_k++) {
|
||||||
asn1cSequenceAdd(nr_freqBandNrItem->supportedSULBandList.list, F1AP_SupportedSULFreqBandItem_t, nr_supportedSULFreqBandItem);
|
asn1cSequenceAdd(nr_freqBandNrItem->supportedSULBandList.list, F1AP_SupportedSULFreqBandItem_t, nr_supportedSULFreqBandItem);
|
||||||
/* FDD.1.3.2.1 freqBandIndicatorNr */
|
/* FDD.1.3.2.1 freqBandIndicatorNr */
|
||||||
nr_supportedSULFreqBandItem->freqBandIndicatorNr = f1ap_du_data->nr_mode_info[i].fdd.ul_nr_sul_band[fdd_ul_k]; //
|
nr_supportedSULFreqBandItem->freqBandIndicatorNr = f1ap_req(false,instance)->nr_mode_info[i].fdd.ul_nr_sul_band[fdd_ul_k]; //
|
||||||
} // for FDD : UL supported_SULBands
|
} // for FDD : UL supported_SULBands
|
||||||
} // for FDD : UL freq_Bands
|
} // for FDD : UL freq_Bands
|
||||||
|
|
||||||
/* FDD.2 DL NRFreqInfo */
|
/* FDD.2 DL NRFreqInfo */
|
||||||
/* FDD.2.1 DL NRFreqInfo ARFCN */
|
/* FDD.2.1 DL NRFreqInfo ARFCN */
|
||||||
fDD_Info->dL_NRFreqInfo.nRARFCN = f1ap_du_data->nr_mode_info[i].fdd.dl_nr_arfcn; // Integer
|
fDD_Info->dL_NRFreqInfo.nRARFCN = f1ap_req(false,instance)->nr_mode_info[i].fdd.dl_nr_arfcn; // Integer
|
||||||
|
|
||||||
/* FDD.2.2 F1AP_SUL_Information */
|
/* FDD.2.2 F1AP_SUL_Information */
|
||||||
if(0) { // Optional
|
if(0) { // Optional
|
||||||
@@ -223,36 +220,36 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* FDD.2.3 freqBandListNr */
|
/* FDD.2.3 freqBandListNr */
|
||||||
int fdd_dl_num_available_freq_Bands = f1ap_du_data->nr_mode_info[i].fdd.dl_num_frequency_bands;
|
int fdd_dl_num_available_freq_Bands = f1ap_req(false,instance)->nr_mode_info[i].fdd.dl_num_frequency_bands;
|
||||||
LOG_D(F1AP, "fdd_dl_num_available_freq_Bands = %d \n", fdd_dl_num_available_freq_Bands);
|
LOG_D(F1AP, "fdd_dl_num_available_freq_Bands = %d \n", fdd_dl_num_available_freq_Bands);
|
||||||
|
|
||||||
for (int fdd_dl_j=0; fdd_dl_j<fdd_dl_num_available_freq_Bands; fdd_dl_j++) {
|
for (int fdd_dl_j=0; fdd_dl_j<fdd_dl_num_available_freq_Bands; fdd_dl_j++) {
|
||||||
asn1cSequenceAdd(fDD_Info->dL_NRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem);
|
asn1cSequenceAdd(fDD_Info->dL_NRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem);
|
||||||
/* FDD.2.3.1 freqBandIndicatorNr*/
|
/* FDD.2.3.1 freqBandIndicatorNr*/
|
||||||
nr_freqBandNrItem->freqBandIndicatorNr = f1ap_du_data->nr_mode_info[i].fdd.dl_nr_band[fdd_dl_j]; //
|
nr_freqBandNrItem->freqBandIndicatorNr = f1ap_req(false,instance)->nr_mode_info[i].fdd.dl_nr_band[fdd_dl_j]; //
|
||||||
/* FDD.2.3.2 supportedSULBandList*/
|
/* FDD.2.3.2 supportedSULBandList*/
|
||||||
int num_available_supported_SULBands = f1ap_du_data->nr_mode_info[i].fdd.dl_num_sul_frequency_bands;
|
int num_available_supported_SULBands = f1ap_req(false,instance)->nr_mode_info[i].fdd.dl_num_sul_frequency_bands;
|
||||||
LOG_D(F1AP, "num_available_supported_SULBands = %d \n", num_available_supported_SULBands);
|
LOG_D(F1AP, "num_available_supported_SULBands = %d \n", num_available_supported_SULBands);
|
||||||
|
|
||||||
for (int fdd_dl_k=0; fdd_dl_k<num_available_supported_SULBands; fdd_dl_k++) {
|
for (int fdd_dl_k=0; fdd_dl_k<num_available_supported_SULBands; fdd_dl_k++) {
|
||||||
asn1cSequenceAdd(nr_freqBandNrItem->supportedSULBandList.list, F1AP_SupportedSULFreqBandItem_t, nr_supportedSULFreqBandItem);
|
asn1cSequenceAdd(nr_freqBandNrItem->supportedSULBandList.list, F1AP_SupportedSULFreqBandItem_t, nr_supportedSULFreqBandItem);
|
||||||
/* FDD.2.3.2.1 freqBandIndicatorNr */
|
/* FDD.2.3.2.1 freqBandIndicatorNr */
|
||||||
nr_supportedSULFreqBandItem->freqBandIndicatorNr = f1ap_du_data->nr_mode_info[i].fdd.dl_nr_sul_band[fdd_dl_k]; //
|
nr_supportedSULFreqBandItem->freqBandIndicatorNr = f1ap_req(false,instance)->nr_mode_info[i].fdd.dl_nr_sul_band[fdd_dl_k]; //
|
||||||
} // for FDD : DL supported_SULBands
|
} // for FDD : DL supported_SULBands
|
||||||
} // for FDD : DL freq_Bands
|
} // for FDD : DL freq_Bands
|
||||||
|
|
||||||
/* FDD.3 UL Transmission Bandwidth */
|
/* FDD.3 UL Transmission Bandwidth */
|
||||||
fDD_Info->uL_Transmission_Bandwidth.nRSCS = f1ap_du_data->nr_mode_info[i].fdd.ul_scs;
|
fDD_Info->uL_Transmission_Bandwidth.nRSCS = f1ap_req(false,instance)->nr_mode_info[i].fdd.ul_scs;
|
||||||
fDD_Info->uL_Transmission_Bandwidth.nRNRB = to_NRNRB(f1ap_du_data->nr_mode_info[i].fdd.ul_nrb);
|
fDD_Info->uL_Transmission_Bandwidth.nRNRB = to_NRNRB(f1ap_req(false,instance)->nr_mode_info[i].fdd.ul_nrb);
|
||||||
/* FDD.4 DL Transmission Bandwidth */
|
/* FDD.4 DL Transmission Bandwidth */
|
||||||
fDD_Info->dL_Transmission_Bandwidth.nRSCS = f1ap_du_data->nr_mode_info[i].fdd.dl_scs;
|
fDD_Info->dL_Transmission_Bandwidth.nRSCS = f1ap_req(false,instance)->nr_mode_info[i].fdd.dl_scs;
|
||||||
fDD_Info->dL_Transmission_Bandwidth.nRNRB = to_NRNRB(f1ap_du_data->nr_mode_info[i].fdd.dl_nrb);
|
fDD_Info->dL_Transmission_Bandwidth.nRNRB = to_NRNRB(f1ap_req(false,instance)->nr_mode_info[i].fdd.dl_nrb);
|
||||||
} else { // TDD
|
} else { // TDD
|
||||||
nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_tDD;
|
nR_Mode_Info->present = F1AP_NR_Mode_Info_PR_tDD;
|
||||||
asn1cCalloc(nR_Mode_Info->choice.tDD, F1AP_TDD_Info_t, tDD_Info);
|
asn1cCalloc(nR_Mode_Info->choice.tDD, F1AP_TDD_Info_t, tDD_Info);
|
||||||
/* TDD.1 nRFreqInfo */
|
/* TDD.1 nRFreqInfo */
|
||||||
/* TDD.1.1 nRFreqInfo ARFCN */
|
/* TDD.1.1 nRFreqInfo ARFCN */
|
||||||
tDD_Info->nRFreqInfo.nRARFCN = f1ap_du_data->nr_mode_info[i].tdd.nr_arfcn; // Integer
|
tDD_Info->nRFreqInfo.nRARFCN = f1ap_req(false,instance)->nr_mode_info[i].tdd.nr_arfcn; // Integer
|
||||||
|
|
||||||
/* TDD.1.2 F1AP_SUL_Information */
|
/* TDD.1.2 F1AP_SUL_Information */
|
||||||
if(0) { // Optional
|
if(0) { // Optional
|
||||||
@@ -263,42 +260,42 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* TDD.1.3 freqBandListNr */
|
/* TDD.1.3 freqBandListNr */
|
||||||
int tdd_num_available_freq_Bands = f1ap_du_data->nr_mode_info[i].tdd.num_frequency_bands;
|
int tdd_num_available_freq_Bands = f1ap_req(false,instance)->nr_mode_info[i].tdd.num_frequency_bands;
|
||||||
LOG_D(F1AP, "tdd_num_available_freq_Bands = %d \n", tdd_num_available_freq_Bands);
|
LOG_D(F1AP, "tdd_num_available_freq_Bands = %d \n", tdd_num_available_freq_Bands);
|
||||||
|
|
||||||
for (int j=0; j<tdd_num_available_freq_Bands; j++) {
|
for (int j=0; j<tdd_num_available_freq_Bands; j++) {
|
||||||
asn1cSequenceAdd(tDD_Info->nRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem);
|
asn1cSequenceAdd(tDD_Info->nRFreqInfo.freqBandListNr.list, F1AP_FreqBandNrItem_t, nr_freqBandNrItem);
|
||||||
/* TDD.1.3.1 freqBandIndicatorNr*/
|
/* TDD.1.3.1 freqBandIndicatorNr*/
|
||||||
nr_freqBandNrItem->freqBandIndicatorNr = *f1ap_du_data->nr_mode_info[i].tdd.nr_band; //
|
nr_freqBandNrItem->freqBandIndicatorNr = *f1ap_req(false,instance)->nr_mode_info[i].tdd.nr_band; //
|
||||||
/* TDD.1.3.2 supportedSULBandList*/
|
/* TDD.1.3.2 supportedSULBandList*/
|
||||||
int num_available_supported_SULBands = f1ap_du_data->nr_mode_info[i].tdd.num_sul_frequency_bands;
|
int num_available_supported_SULBands = f1ap_req(false,instance)->nr_mode_info[i].tdd.num_sul_frequency_bands;
|
||||||
LOG_D(F1AP, "num_available_supported_SULBands = %d \n", num_available_supported_SULBands);
|
LOG_D(F1AP, "num_available_supported_SULBands = %d \n", num_available_supported_SULBands);
|
||||||
|
|
||||||
for (int k=0; k<num_available_supported_SULBands; k++) {
|
for (int k=0; k<num_available_supported_SULBands; k++) {
|
||||||
asn1cSequenceAdd(nr_freqBandNrItem->supportedSULBandList.list,F1AP_SupportedSULFreqBandItem_t, nr_supportedSULFreqBandItem);
|
asn1cSequenceAdd(nr_freqBandNrItem->supportedSULBandList.list,F1AP_SupportedSULFreqBandItem_t, nr_supportedSULFreqBandItem);
|
||||||
/* TDD.1.3.2.1 freqBandIndicatorNr */
|
/* TDD.1.3.2.1 freqBandIndicatorNr */
|
||||||
nr_supportedSULFreqBandItem->freqBandIndicatorNr = *f1ap_du_data->nr_mode_info[i].tdd.nr_sul_band; //
|
nr_supportedSULFreqBandItem->freqBandIndicatorNr = *f1ap_req(false,instance)->nr_mode_info[i].tdd.nr_sul_band; //
|
||||||
} // for TDD : supported_SULBands
|
} // for TDD : supported_SULBands
|
||||||
} // for TDD : freq_Bands
|
} // for TDD : freq_Bands
|
||||||
|
|
||||||
/* TDD.2 transmission_Bandwidth */
|
/* TDD.2 transmission_Bandwidth */
|
||||||
tDD_Info->transmission_Bandwidth.nRSCS = f1ap_du_data->nr_mode_info[i].tdd.scs;
|
tDD_Info->transmission_Bandwidth.nRSCS = f1ap_req(false,instance)->nr_mode_info[i].tdd.scs;
|
||||||
tDD_Info->transmission_Bandwidth.nRNRB = to_NRNRB(f1ap_du_data->nr_mode_info[i].tdd.nrb);
|
tDD_Info->transmission_Bandwidth.nRNRB = to_NRNRB(f1ap_req(false,instance)->nr_mode_info[i].tdd.nrb);
|
||||||
} // if nR_Mode_Info
|
} // if nR_Mode_Info
|
||||||
|
|
||||||
/* - measurementTimingConfiguration */
|
/* - measurementTimingConfiguration */
|
||||||
char *measurementTimingConfiguration = f1ap_du_data->measurement_timing_information[i]; // sept. 2018
|
char *measurementTimingConfiguration = f1ap_req(false,instance)->measurement_timing_information[i]; // sept. 2018
|
||||||
OCTET_STRING_fromBuf(&served_cell_information->measurementTimingConfiguration,
|
OCTET_STRING_fromBuf(&served_cell_information->measurementTimingConfiguration,
|
||||||
measurementTimingConfiguration,
|
measurementTimingConfiguration,
|
||||||
strlen(measurementTimingConfiguration));
|
strlen(measurementTimingConfiguration));
|
||||||
asn1cCalloc(gnb_du_served_cells_item->gNB_DU_System_Information, F1AP_GNB_DU_System_Information_t, gNB_DU_System_Information);
|
asn1cCalloc(gnb_du_served_cells_item->gNB_DU_System_Information, F1AP_GNB_DU_System_Information_t, gNB_DU_System_Information);
|
||||||
/* 4.1.2 gNB-DU System Information */
|
/* 4.1.2 gNB-DU System Information */
|
||||||
OCTET_STRING_fromBuf(&gNB_DU_System_Information->mIB_message, // sept. 2018
|
OCTET_STRING_fromBuf(&gNB_DU_System_Information->mIB_message, // sept. 2018
|
||||||
(const char *)f1ap_du_data->mib[i], //f1ap_du_data->mib,
|
(const char *)f1ap_req(false,instance)->mib[i], //f1ap_du_data->mib,
|
||||||
f1ap_du_data->mib_length[i]);
|
f1ap_req(false,instance)->mib_length[i]);
|
||||||
OCTET_STRING_fromBuf(&gNB_DU_System_Information->sIB1_message, // sept. 2018
|
OCTET_STRING_fromBuf(&gNB_DU_System_Information->sIB1_message, // sept. 2018
|
||||||
(const char *)f1ap_du_data->sib1[i],
|
(const char *)f1ap_req(false,instance)->sib1[i],
|
||||||
f1ap_du_data->sib1_length[i]);
|
f1ap_req(false,instance)->sib1_length[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
@@ -319,7 +316,7 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
||||||
du_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data->assoc_id, buffer, len, 0);
|
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,17 +488,8 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
|
|||||||
MSC_AS_TIME_FMT" DU_handle_F1_SETUP_RESPONSE successfulOutcome assoc_id %d",
|
MSC_AS_TIME_FMT" DU_handle_F1_SETUP_RESPONSE successfulOutcome assoc_id %d",
|
||||||
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
assoc_id);
|
assoc_id);
|
||||||
|
LOG_D(F1AP, "Sending F1AP_SETUP_RESP ITTI message\n");
|
||||||
if (RC.nrrrc[0]->node_type == ngran_gNB_DU) {
|
itti_send_msg_to_task(TASK_F1APP, GNB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
|
||||||
LOG_D(F1AP, "Sending F1AP_SETUP_RESP ITTI message to GNB_APP with assoc_id (%d->%d)\n",
|
|
||||||
assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
|
|
||||||
itti_send_msg_to_task(TASK_GNB_APP, GNB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
|
|
||||||
} else {
|
|
||||||
LOG_D(F1AP, "Sending F1AP_SETUP_RESP ITTI message to ENB_APP with assoc_id (%d->%d)\n",
|
|
||||||
assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
|
|
||||||
itti_send_msg_to_task(TASK_ENB_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -573,12 +561,13 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
F1AP_Served_Cells_To_Add_Item_t *served_cells_to_add_item= &served_cells_to_add_item_ies->value.choice.Served_Cells_To_Add_Item;
|
F1AP_Served_Cells_To_Add_Item_t *served_cells_to_add_item= &served_cells_to_add_item_ies->value.choice.Served_Cells_To_Add_Item;
|
||||||
F1AP_Served_Cell_Information_t *served_cell_information=&served_cells_to_add_item->served_Cell_Information;
|
F1AP_Served_Cell_Information_t *served_cell_information=&served_cells_to_add_item->served_Cell_Information;
|
||||||
/* - nRCGI */
|
/* - nRCGI */
|
||||||
//addnRCGI(served_cell_information->nRCGI, f1ap_setup_req->cell[j]);
|
addnRCGI(served_cell_information->nRCGI, &f1ap_setup_req->cell[j]);
|
||||||
/* - nRPCI */
|
/* - nRPCI */
|
||||||
/* 2.1.1 serverd cell Information */
|
/* 2.1.1 serverd cell Information */
|
||||||
served_cell_information->nRPCI = f1ap_setup_req->cell[j].nr_pci; // int 0..1007
|
cellIDs_t *cell=&f1ap_req(false, instance)->cell[j];
|
||||||
|
served_cell_information->nRPCI = cell->nr_pci; // int 0..1007
|
||||||
/* - fiveGS_TAC */
|
/* - fiveGS_TAC */
|
||||||
uint32_t tac=htonl(f1ap_du_data->cell[j].tac);
|
uint32_t tac=htonl(cell->tac);
|
||||||
served_cell_information->fiveGS_TAC=(F1AP_FiveGS_TAC_t *) calloc(1,sizeof(F1AP_FiveGS_TAC_t *));
|
served_cell_information->fiveGS_TAC=(F1AP_FiveGS_TAC_t *) calloc(1,sizeof(F1AP_FiveGS_TAC_t *));
|
||||||
OCTET_STRING_fromBuf(served_cell_information->fiveGS_TAC, ((char *)&tac)+1, 3);
|
OCTET_STRING_fromBuf(served_cell_information->fiveGS_TAC, ((char *)&tac)+1, 3);
|
||||||
|
|
||||||
@@ -589,7 +578,7 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
asn1cSequenceAdd(served_cell_information->servedPLMNs.list, F1AP_ServedPLMNs_Item_t, servedPLMN_item);
|
asn1cSequenceAdd(served_cell_information->servedPLMNs.list, F1AP_ServedPLMNs_Item_t, servedPLMN_item);
|
||||||
MCC_MNC_TO_PLMNID(f1ap_du_data->cell[j].mcc, f1ap_du_data->cell[j].mnc, f1ap_du_data->cell[j].mnc_digit_length, &servedPLMN_item->pLMN_Identity);
|
MCC_MNC_TO_PLMNID(cell->mcc, cell->mnc, cell->mnc_digit_length, &servedPLMN_item->pLMN_Identity);
|
||||||
// // /* - CHOICE NR-MODE-Info */
|
// // /* - CHOICE NR-MODE-Info */
|
||||||
F1AP_NR_Mode_Info_t *nR_Mode_Info=&served_cell_information->nR_Mode_Info;
|
F1AP_NR_Mode_Info_t *nR_Mode_Info=&served_cell_information->nR_Mode_Info;
|
||||||
|
|
||||||
@@ -653,6 +642,7 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
//
|
//
|
||||||
|
cellIDs_t *cell=&f1ap_req(false, instance)->cell[i];
|
||||||
asn1cSequenceAdd(ie3->value.choice.Served_Cells_To_Modify_List.list, F1AP_Served_Cells_To_Modify_ItemIEs_t, served_cells_to_modify_item_ies);
|
asn1cSequenceAdd(ie3->value.choice.Served_Cells_To_Modify_List.list, F1AP_Served_Cells_To_Modify_ItemIEs_t, served_cells_to_modify_item_ies);
|
||||||
served_cells_to_modify_item_ies->id = F1AP_ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
|
served_cells_to_modify_item_ies->id = F1AP_ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
|
||||||
served_cells_to_modify_item_ies->criticality = F1AP_Criticality_reject;
|
served_cells_to_modify_item_ies->criticality = F1AP_Criticality_reject;
|
||||||
@@ -663,7 +653,7 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
/* 3.2.1 serverd cell Information */
|
/* 3.2.1 serverd cell Information */
|
||||||
F1AP_Served_Cell_Information_t *served_cell_information= &served_cells_to_modify_item->served_Cell_Information;
|
F1AP_Served_Cell_Information_t *served_cell_information= &served_cells_to_modify_item->served_Cell_Information;
|
||||||
/* - nRCGI */
|
/* - nRCGI */
|
||||||
//addnRGCI(served_cell_information->nRCGI,f1ap_setup_req->cell[i]);
|
//addnRGCI(served_cell_information->nRCGI,f1ap_setup_req->cell[i]);
|
||||||
/* - nRPCI */
|
/* - nRPCI */
|
||||||
served_cell_information->nRPCI = f1ap_setup_req->cell[i].nr_pci; // int 0..1007
|
served_cell_information->nRPCI = f1ap_setup_req->cell[i].nr_pci; // int 0..1007
|
||||||
/* - fiveGS_TAC */
|
/* - fiveGS_TAC */
|
||||||
@@ -681,7 +671,7 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
asn1cSequenceAdd(served_cell_information->servedPLMNs.list, F1AP_ServedPLMNs_Item_t, servedPLMN_item);
|
asn1cSequenceAdd(served_cell_information->servedPLMNs.list, F1AP_ServedPLMNs_Item_t, servedPLMN_item);
|
||||||
MCC_MNC_TO_PLMNID(f1ap_du_data->cell[i].mcc, f1ap_du_data->cell[i].mnc, f1ap_du_data->cell[i].mnc_digit_length, &servedPLMN_item->pLMN_Identity);
|
MCC_MNC_TO_PLMNID(cell->mcc, cell->mnc, cell->mnc_digit_length, &servedPLMN_item->pLMN_Identity);
|
||||||
// // /* - CHOICE NR-MODE-Info */
|
// // /* - CHOICE NR-MODE-Info */
|
||||||
F1AP_NR_Mode_Info_t *nR_Mode_Info= &served_cell_information->nR_Mode_Info;
|
F1AP_NR_Mode_Info_t *nR_Mode_Info= &served_cell_information->nR_Mode_Info;
|
||||||
|
|
||||||
@@ -752,7 +742,7 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
served_cells_to_delete_item_ies->value.present = F1AP_Served_Cells_To_Delete_ItemIEs__value_PR_Served_Cells_To_Delete_Item;
|
served_cells_to_delete_item_ies->value.present = F1AP_Served_Cells_To_Delete_ItemIEs__value_PR_Served_Cells_To_Delete_Item;
|
||||||
F1AP_Served_Cells_To_Delete_Item_t *served_cells_to_delete_item=&served_cells_to_delete_item_ies->value.choice.Served_Cells_To_Delete_Item;
|
F1AP_Served_Cells_To_Delete_Item_t *served_cells_to_delete_item=&served_cells_to_delete_item_ies->value.choice.Served_Cells_To_Delete_Item;
|
||||||
/* 3.1 oldNRCGI */
|
/* 3.1 oldNRCGI */
|
||||||
//addnRGCI(served_cells_to_delete_item->oldNRCGI, f1ap_setup_req->cell[i]);
|
addnRCGI(served_cells_to_delete_item->oldNRCGI, &f1ap_setup_req->cell[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||||
@@ -925,17 +915,8 @@ int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
MSC_AS_TIME_FMT" DU_handle_GNB_CU_CONFIGURATION_UPDATE initiatingMessage assoc_id %d",
|
MSC_AS_TIME_FMT" DU_handle_GNB_CU_CONFIGURATION_UPDATE initiatingMessage assoc_id %d",
|
||||||
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
|
||||||
assoc_id);
|
assoc_id);
|
||||||
|
LOG_D(F1AP, "Sending F1AP_GNB_CU_CONFIGURATION_UPDATE ITTI message \n");
|
||||||
if (RC.nrrrc[0]->node_type == ngran_gNB_DU) {
|
itti_send_msg_to_task(TASK_F1APP, GNB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
|
||||||
LOG_D(F1AP, "Sending F1AP_GNB_CU_CONFIGURATION_UPDATE ITTI message to GNB_APP with assoc_id (%d->%d)\n",
|
|
||||||
assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
|
|
||||||
itti_send_msg_to_task(TASK_GNB_APP, GNB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
|
|
||||||
} else {
|
|
||||||
LOG_D(F1AP, "Sending F1AP_GNB_CU_CONFIGURATION_UPDATE ITTI message to ENB_APP with assoc_id (%d->%d)\n",
|
|
||||||
assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
|
|
||||||
itti_send_msg_to_task(TASK_ENB_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -985,7 +966,7 @@ int DU_send_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
||||||
du_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data->assoc_id, buffer, len, 0);
|
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,12 +56,6 @@
|
|||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||||
|
|
||||||
extern f1ap_setup_req_t *f1ap_du_data;
|
|
||||||
extern RAN_CONTEXT_t RC;
|
|
||||||
extern f1ap_cudu_inst_t f1ap_du_inst[MAX_eNB];
|
|
||||||
|
|
||||||
uint8_t du_ccch_flag = 1;
|
|
||||||
|
|
||||||
int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||||
uint32_t assoc_id,
|
uint32_t assoc_id,
|
||||||
uint32_t stream,
|
uint32_t stream,
|
||||||
@@ -108,9 +102,9 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||||
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with UE RNTI %x \n",
|
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with UE RNTI %x \n",
|
||||||
du_ue_f1ap_id,
|
du_ue_f1ap_id,
|
||||||
f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer
|
f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer
|
||||||
|
|
||||||
if (f1ap_du_add_cu_ue_id(&f1ap_du_inst[instance],du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) {
|
if (f1ap_du_add_cu_ue_id(false, instance,du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) {
|
||||||
LOG_E(F1AP, "Failed to find the F1AP UID \n");
|
LOG_E(F1AP, "Failed to find the F1AP UID \n");
|
||||||
//return -1;
|
//return -1;
|
||||||
}
|
}
|
||||||
@@ -180,7 +174,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
// decode RRC Container and act on the message type
|
// decode RRC Container and act on the message type
|
||||||
AssertFatal(srb_id<3,"illegal srb_id\n");
|
AssertFatal(srb_id<3,"illegal srb_id\n");
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
ctxt.rnti = f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id);
|
ctxt.rnti = f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id);
|
||||||
ctxt.module_id = instance;
|
ctxt.module_id = instance;
|
||||||
ctxt.instance = instance;
|
ctxt.instance = instance;
|
||||||
ctxt.enb_flag = 1;
|
ctxt.enb_flag = 1;
|
||||||
@@ -222,7 +216,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
LOG_I(F1AP,
|
LOG_I(F1AP,
|
||||||
"Logical Channel DL-CCCH (SRB0), Received RRCConnectionSetup DU_ID %lx/RNTI %x\n",
|
"Logical Channel DL-CCCH (SRB0), Received RRCConnectionSetup DU_ID %lx/RNTI %x\n",
|
||||||
du_ue_f1ap_id,
|
du_ue_f1ap_id,
|
||||||
f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id));
|
f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id));
|
||||||
// Get configuration
|
// Get configuration
|
||||||
LTE_RRCConnectionSetup_t *rrcConnectionSetup = &dl_ccch_msg->message.choice.c1.choice.rrcConnectionSetup;
|
LTE_RRCConnectionSetup_t *rrcConnectionSetup = &dl_ccch_msg->message.choice.c1.choice.rrcConnectionSetup;
|
||||||
AssertFatal(rrcConnectionSetup!=NULL,"rrcConnectionSetup is null\n");
|
AssertFatal(rrcConnectionSetup!=NULL,"rrcConnectionSetup is null\n");
|
||||||
@@ -261,7 +255,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
// This should be somewhere in the f1ap_cudu_ue_inst_t
|
// This should be somewhere in the f1ap_cudu_ue_inst_t
|
||||||
/*int macrlc_instance = 0;
|
/*int macrlc_instance = 0;
|
||||||
|
|
||||||
rnti_t rnti = f1ap_get_rnti_by_du_id(&f1ap_du_inst[0], du_ue_f1ap_id);
|
rnti_t rnti = f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id);
|
||||||
struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[macrlc_instance],rnti);
|
struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(RC.rrc[macrlc_instance],rnti);
|
||||||
*/
|
*/
|
||||||
eNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
eNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
||||||
@@ -358,7 +352,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
LOG_I(F1AP,
|
LOG_I(F1AP,
|
||||||
"Logical Channel DL-DCCH (SRB1), Received RRCConnectionReconfiguration DU_ID %lx/RNTI %x\n",
|
"Logical Channel DL-DCCH (SRB1), Received RRCConnectionReconfiguration DU_ID %lx/RNTI %x\n",
|
||||||
du_ue_f1ap_id,
|
du_ue_f1ap_id,
|
||||||
f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id));
|
f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id));
|
||||||
LTE_RRCConnectionReconfiguration_t *rrcConnectionReconfiguration = &dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration;
|
LTE_RRCConnectionReconfiguration_t *rrcConnectionReconfiguration = &dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration;
|
||||||
|
|
||||||
if (rrcConnectionReconfiguration->criticalExtensions.present == LTE_RRCConnectionReconfiguration__criticalExtensions_PR_c1) {
|
if (rrcConnectionReconfiguration->criticalExtensions.present == LTE_RRCConnectionReconfiguration__criticalExtensions_PR_c1) {
|
||||||
@@ -617,7 +611,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
ie->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
ie->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||||
ie->criticality = F1AP_Criticality_reject;
|
ie->criticality = F1AP_Criticality_reject;
|
||||||
ie->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
ie->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||||
ie->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(&f1ap_du_inst[instance], rnti);
|
ie->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(false, instance, rnti);
|
||||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c2. GNB_DU_UE_F1AP_ID */
|
/* c2. GNB_DU_UE_F1AP_ID */
|
||||||
@@ -625,7 +619,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
ie->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
ie->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||||
ie->criticality = F1AP_Criticality_reject;
|
ie->criticality = F1AP_Criticality_reject;
|
||||||
ie->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
ie->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||||
ie->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(&f1ap_du_inst[instance], rnti);
|
ie->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(false, instance, rnti);
|
||||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c3. SRBID */
|
/* c3. SRBID */
|
||||||
@@ -755,7 +749,8 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
du_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data->assoc_id, buffer, len, f1ap_du_data->default_sctp_stream_id);
|
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
|
||||||
|
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,7 +768,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP,
|
|||||||
F1AP_InitialULRRCMessageTransfer_t *out;
|
F1AP_InitialULRRCMessageTransfer_t *out;
|
||||||
uint8_t *buffer=NULL;
|
uint8_t *buffer=NULL;
|
||||||
uint32_t len=0;
|
uint32_t len=0;
|
||||||
int f1ap_uid = f1ap_add_ue (&f1ap_du_inst[module_idP], module_idP, CC_idP,UE_id, rntiP);
|
int f1ap_uid = f1ap_add_ue (false, module_idP, CC_idP,UE_id, rntiP);
|
||||||
|
|
||||||
if (f1ap_uid < 0 ) {
|
if (f1ap_uid < 0 ) {
|
||||||
LOG_E(F1AP, "Failed to add UE \n");
|
LOG_E(F1AP, "Failed to add UE \n");
|
||||||
@@ -794,14 +789,15 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP,
|
|||||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||||
ie1->criticality = F1AP_Criticality_reject;
|
ie1->criticality = F1AP_Criticality_reject;
|
||||||
ie1->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
ie1->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||||
ie1->value.choice.GNB_DU_UE_F1AP_ID = f1ap_du_inst[module_idP].f1ap_ue[f1ap_uid].du_ue_f1ap_id;
|
ie1->value.choice.GNB_DU_UE_F1AP_ID = getCxt(false, module_idP)->f1ap_ue[f1ap_uid].du_ue_f1ap_id;
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c2. NRCGI */
|
/* c2. NRCGI */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie2);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie2);
|
||||||
ie2->id = F1AP_ProtocolIE_ID_id_NRCGI;
|
ie2->id = F1AP_ProtocolIE_ID_id_NRCGI;
|
||||||
ie2->criticality = F1AP_Criticality_reject;
|
ie2->criticality = F1AP_Criticality_reject;
|
||||||
ie2->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_NRCGI;
|
ie2->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_NRCGI;
|
||||||
//addnRCGI(ie2->value.choice.NRCGI, f1ap_du_data->cell[0]);
|
//Fixme: takes always the first cell
|
||||||
|
addnRCGI(ie2->value.choice.NRCGI, getCxt(false, module_idP)->setupReq.cell);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c3. C_RNTI */ // 16
|
/* c3. C_RNTI */ // 16
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie3);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie3);
|
||||||
@@ -851,15 +847,11 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP,
|
|||||||
RB_INSERT(rrc_ue_tree_s, &RC.rrc[module_idP]->rrc_ue_head, ue_context_p);
|
RB_INSERT(rrc_ue_tree_s, &RC.rrc[module_idP]->rrc_ue_head, ue_context_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
du_f1ap_itti_send_sctp_data_req(module_idP, f1ap_du_data->assoc_id, buffer, len, f1ap_du_data->default_sctp_stream_id);
|
f1ap_itti_send_sctp_data_req(false, module_idP, buffer, len, getCxt(false, module_idP)->default_sctp_stream_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void init_f1ap_du_ue_inst (void) {
|
|
||||||
memset(f1ap_du_inst, 0, sizeof(f1ap_du_inst));
|
|
||||||
}
|
|
||||||
|
|
||||||
int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||||
const f1ap_ul_rrc_message_t *msg) {
|
const f1ap_ul_rrc_message_t *msg) {
|
||||||
const rnti_t rnti = msg->rnti;
|
const rnti_t rnti = msg->rnti;
|
||||||
@@ -887,14 +879,14 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||||
ie1->criticality = F1AP_Criticality_reject;
|
ie1->criticality = F1AP_Criticality_reject;
|
||||||
ie1->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
ie1->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(&f1ap_du_inst[instance], rnti);
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(false, instance, rnti);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c2. GNB_DU_UE_F1AP_ID */
|
/* c2. GNB_DU_UE_F1AP_ID */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie2);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie2);
|
||||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||||
ie2->criticality = F1AP_Criticality_reject;
|
ie2->criticality = F1AP_Criticality_reject;
|
||||||
ie2->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
ie2->value.present = F1AP_ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||||
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(&f1ap_du_inst[instance], rnti);
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(false, instance, rnti);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c3. SRBID */
|
/* c3. SRBID */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie3);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie3);
|
||||||
@@ -919,7 +911,7 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
du_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data->assoc_id, buffer, len, f1ap_du_data->default_sctp_stream_id);
|
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -958,9 +950,9 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||||
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with UE RNTI %x \n",
|
LOG_D(F1AP, "du_ue_f1ap_id %lu associated with UE RNTI %x \n",
|
||||||
du_ue_f1ap_id,
|
du_ue_f1ap_id,
|
||||||
f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer
|
f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer
|
||||||
|
|
||||||
if (f1ap_du_add_cu_ue_id(&f1ap_du_inst[instance],du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) {
|
if (f1ap_du_add_cu_ue_id(false, instance,du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) {
|
||||||
LOG_E(F1AP, "Failed to find the F1AP UID \n");
|
LOG_E(F1AP, "Failed to find the F1AP UID \n");
|
||||||
//return -1;
|
//return -1;
|
||||||
}
|
}
|
||||||
@@ -1030,7 +1022,7 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
// decode RRC Container and act on the message type
|
// decode RRC Container and act on the message type
|
||||||
AssertFatal(srb_id<3,"illegal srb_id\n");
|
AssertFatal(srb_id<3,"illegal srb_id\n");
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
ctxt.rnti = f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id);
|
ctxt.rnti = f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id);
|
||||||
ctxt.module_id = instance;
|
ctxt.module_id = instance;
|
||||||
ctxt.instance = instance;
|
ctxt.instance = instance;
|
||||||
ctxt.enb_flag = 1;
|
ctxt.enb_flag = 1;
|
||||||
@@ -1063,7 +1055,7 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
LOG_I(F1AP,
|
LOG_I(F1AP,
|
||||||
"Logical Channel DL-CCCH (SRB0), Received RRCSetup DU_ID %lx/RNTI %x\n",
|
"Logical Channel DL-CCCH (SRB0), Received RRCSetup DU_ID %lx/RNTI %x\n",
|
||||||
du_ue_f1ap_id,
|
du_ue_f1ap_id,
|
||||||
f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id));
|
f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id));
|
||||||
// Get configuration
|
// Get configuration
|
||||||
NR_RRCSetup_t *rrcSetup = dl_ccch_msg->message.choice.c1->choice.rrcSetup;
|
NR_RRCSetup_t *rrcSetup = dl_ccch_msg->message.choice.c1->choice.rrcSetup;
|
||||||
AssertFatal(rrcSetup!=NULL, "rrcSetup is null\n");
|
AssertFatal(rrcSetup!=NULL, "rrcSetup is null\n");
|
||||||
@@ -1130,7 +1122,7 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
LOG_I(F1AP,
|
LOG_I(F1AP,
|
||||||
"Logical Channel DL-DCCH (SRB1), Received RRCReconfiguration DU_ID %lx/RNTI %x\n",
|
"Logical Channel DL-DCCH (SRB1), Received RRCReconfiguration DU_ID %lx/RNTI %x\n",
|
||||||
du_ue_f1ap_id,
|
du_ue_f1ap_id,
|
||||||
f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance], du_ue_f1ap_id));
|
f1ap_get_rnti_by_du_id(false, instance, du_ue_f1ap_id));
|
||||||
NR_RRCReconfiguration_t *rrcReconfiguration = dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration;
|
NR_RRCReconfiguration_t *rrcReconfiguration = dl_dcch_msg->message.choice.c1->choice.rrcReconfiguration;
|
||||||
|
|
||||||
if (rrcReconfiguration->criticalExtensions.present == NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration) {
|
if (rrcReconfiguration->criticalExtensions.present == NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration) {
|
||||||
|
|||||||
@@ -38,11 +38,6 @@
|
|||||||
#include "f1ap_du_task.h"
|
#include "f1ap_du_task.h"
|
||||||
#include "proto_agent.h"
|
#include "proto_agent.h"
|
||||||
|
|
||||||
extern RAN_CONTEXT_t RC;
|
|
||||||
|
|
||||||
f1ap_setup_req_t *f1ap_du_data;
|
|
||||||
f1ap_cudu_inst_t f1ap_du_inst[MAX_eNB];
|
|
||||||
|
|
||||||
void du_task_send_sctp_association_req(instance_t instance, f1ap_setup_req_t *f1ap_setup_req) {
|
void du_task_send_sctp_association_req(instance_t instance, f1ap_setup_req_t *f1ap_setup_req) {
|
||||||
DevAssert(f1ap_setup_req != NULL);
|
DevAssert(f1ap_setup_req != NULL);
|
||||||
MessageDef *message_p = NULL;
|
MessageDef *message_p = NULL;
|
||||||
@@ -62,9 +57,6 @@ void du_task_send_sctp_association_req(instance_t instance, f1ap_setup_req_t *f1
|
|||||||
memcpy(&sctp_new_association_req_p->local_address,
|
memcpy(&sctp_new_association_req_p->local_address,
|
||||||
&f1ap_setup_req->DU_f1_ip_address,
|
&f1ap_setup_req->DU_f1_ip_address,
|
||||||
sizeof(f1ap_setup_req->DU_f1_ip_address));
|
sizeof(f1ap_setup_req->DU_f1_ip_address));
|
||||||
// store data
|
|
||||||
f1ap_du_data = (f1ap_setup_req_t *)calloc(1, sizeof(f1ap_setup_req_t));
|
|
||||||
*f1ap_du_data = *f1ap_setup_req;
|
|
||||||
//printf("sib itti message %s\n", f1ap_setup_req_t->sib1[0]);
|
//printf("sib itti message %s\n", f1ap_setup_req_t->sib1[0]);
|
||||||
//printf("nr_cellid : %llx (%lld)",f1ap_setup_req->nr_cellid[0],f1ap_setup_req->nr_cellid[0]);
|
//printf("nr_cellid : %llx (%lld)",f1ap_setup_req->nr_cellid[0],f1ap_setup_req->nr_cellid[0]);
|
||||||
//du_f1ap_register_to_sctp
|
//du_f1ap_register_to_sctp
|
||||||
@@ -84,6 +76,7 @@ void du_task_handle_sctp_association_resp(instance_t instance, sctp_new_associat
|
|||||||
}
|
}
|
||||||
|
|
||||||
// save the assoc id
|
// save the assoc id
|
||||||
|
f1ap_setup_req_t *f1ap_du_data=f1ap_req(false, instance);
|
||||||
f1ap_du_data->assoc_id = sctp_new_association_resp->assoc_id;
|
f1ap_du_data->assoc_id = sctp_new_association_resp->assoc_id;
|
||||||
f1ap_du_data->sctp_in_streams = sctp_new_association_resp->in_streams;
|
f1ap_du_data->sctp_in_streams = sctp_new_association_resp->in_streams;
|
||||||
f1ap_du_data->sctp_out_streams = sctp_new_association_resp->out_streams;
|
f1ap_du_data->sctp_out_streams = sctp_new_association_resp->out_streams;
|
||||||
@@ -131,13 +124,14 @@ void *F1AP_DU_task(void *arg) {
|
|||||||
// 1. save the itti msg so that you can use it to sen f1ap_setup_req, fill the f1ap_setup_req message,
|
// 1. save the itti msg so that you can use it to sen f1ap_setup_req, fill the f1ap_setup_req message,
|
||||||
// 2. store the message in f1ap context, that is also stored in RC
|
// 2. store the message in f1ap context, that is also stored in RC
|
||||||
// 2. send a sctp_association req
|
// 2. send a sctp_association req
|
||||||
|
createF1inst(false, ITTI_MSG_DESTINATION_INSTANCE(received_msg), &F1AP_SETUP_REQ(received_msg));
|
||||||
LOG_I(F1AP, "DU Task Received F1AP_SETUP_REQ\n");
|
LOG_I(F1AP, "DU Task Received F1AP_SETUP_REQ\n");
|
||||||
du_task_send_sctp_association_req(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
du_task_send_sctp_association_req(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||||
&F1AP_SETUP_REQ(received_msg));
|
&F1AP_SETUP_REQ(received_msg));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE:
|
case F1AP_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE:
|
||||||
DU_send_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
DU_send_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(ITTI_MSG_ORIGIN_INSTANCE(received_msg),
|
||||||
&F1AP_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(received_msg));
|
&F1AP_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(received_msg));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -41,10 +41,6 @@
|
|||||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||||
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||||
|
|
||||||
extern f1ap_setup_req_t *f1ap_du_data;
|
|
||||||
extern f1ap_cudu_inst_t f1ap_du_inst[MAX_eNB];
|
|
||||||
extern RAN_CONTEXT_t RC;
|
|
||||||
|
|
||||||
int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
||||||
uint32_t assoc_id,
|
uint32_t assoc_id,
|
||||||
uint32_t stream,
|
uint32_t stream,
|
||||||
@@ -183,7 +179,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
|
|
||||||
//void DU_send_UE_CONTEXT_SETUP_RESPONSE(F1AP_UEContextSetupResponse_t *UEContextSetupResponse) {
|
//void DU_send_UE_CONTEXT_SETUP_RESPONSE(F1AP_UEContextSetupResponse_t *UEContextSetupResponse) {
|
||||||
int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
||||||
F1AP_F1AP_PDU_t pdu={0};
|
F1AP_F1AP_PDU_t pdu= {0};
|
||||||
F1AP_UEContextSetupResponse_t *out;
|
F1AP_UEContextSetupResponse_t *out;
|
||||||
uint8_t *buffer=NULL;
|
uint8_t *buffer=NULL;
|
||||||
uint32_t len=0;
|
uint32_t len=0;
|
||||||
@@ -225,7 +221,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
/* measGapConfig */
|
/* measGapConfig */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.measGapConfig,
|
asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.measGapConfig,
|
||||||
F1AP_MeasGapConfig_t, tmp);
|
F1AP_MeasGapConfig_t, tmp);
|
||||||
OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa"));
|
OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,8 +229,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
/* requestedP_MaxFR1 */
|
/* requestedP_MaxFR1 */
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1,
|
asn1cCalloc(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1,
|
||||||
OCTET_STRING_t, tmp);
|
OCTET_STRING_t, tmp);
|
||||||
OCTET_STRING_fromBuf(tmp , "asdsa", strlen("asdsa"));
|
OCTET_STRING_fromBuf(tmp, "asdsa", strlen("asdsa"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +277,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
//
|
//
|
||||||
asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list,
|
asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list,
|
||||||
F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies);
|
F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies);
|
||||||
drbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item;
|
drbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item;
|
||||||
drbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
|
drbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||||
drbs_setup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
|
drbs_setup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
|
||||||
@@ -297,20 +293,19 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
//drbs_setup_item.lCID = 1L;
|
//drbs_setup_item.lCID = 1L;
|
||||||
|
|
||||||
for (int j=0; j<1; j++) {
|
for (int j=0; j<1; j++) {
|
||||||
/* ADD */
|
/* ADD */
|
||||||
asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list,
|
asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list,
|
||||||
F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
|
F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
|
||||||
dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
||||||
/* gTPTunnel */
|
/* gTPTunnel */
|
||||||
asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,
|
asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,
|
||||||
F1AP_GTPTunnel_t, gTPTunnel);
|
F1AP_GTPTunnel_t, gTPTunnel);
|
||||||
/* transportLayerAddress */
|
/* transportLayerAddress */
|
||||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
|
||||||
/* gTP_TEID */
|
/* gTP_TEID */
|
||||||
OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
|
OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
|
||||||
strlen("1204"));
|
strlen("1204"));
|
||||||
} // for j
|
} // for j
|
||||||
|
|
||||||
} // for i
|
} // for i
|
||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
@@ -333,7 +328,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
/* sRBID */
|
/* sRBID */
|
||||||
srbs_failedToBeSetup_item->sRBID = 13L;
|
srbs_failedToBeSetup_item->sRBID = 13L;
|
||||||
/* cause */
|
/* cause */
|
||||||
asn1cCalloc(srbs_failedToBeSetup_item->cause, F1AP_Cause_t ,tmp);
|
asn1cCalloc(srbs_failedToBeSetup_item->cause, F1AP_Cause_t,tmp);
|
||||||
// dummy value
|
// dummy value
|
||||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||||
|
|
||||||
@@ -358,7 +353,6 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
|
|
||||||
} // for i
|
} // for i
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@@ -406,7 +400,6 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
|
|
||||||
} // for i
|
} // for i
|
||||||
|
|
||||||
// /* */
|
// /* */
|
||||||
@@ -418,15 +411,15 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ie10->value.choice.SCell_FailedtoSetup_List.list,
|
asn1cSequenceAdd(ie10->value.choice.SCell_FailedtoSetup_List.list,
|
||||||
F1AP_SCell_FailedtoSetup_ItemIEs_t, sCell_FailedtoSetup_item_ies);
|
F1AP_SCell_FailedtoSetup_ItemIEs_t, sCell_FailedtoSetup_item_ies);
|
||||||
sCell_FailedtoSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_Item;
|
sCell_FailedtoSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_Item;
|
||||||
sCell_FailedtoSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
sCell_FailedtoSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||||
sCell_FailedtoSetup_item_ies->value.present = F1AP_SCell_FailedtoSetup_ItemIEs__value_PR_SCell_FailedtoSetup_Item;
|
sCell_FailedtoSetup_item_ies->value.present = F1AP_SCell_FailedtoSetup_ItemIEs__value_PR_SCell_FailedtoSetup_Item;
|
||||||
/* 10.1 DRBs_Setup_Item */
|
/* 10.1 DRBs_Setup_Item */
|
||||||
F1AP_SCell_FailedtoSetup_Item_t*sCell_FailedtoSetup_item=
|
F1AP_SCell_FailedtoSetup_Item_t *sCell_FailedtoSetup_item=
|
||||||
&sCell_FailedtoSetup_item_ies->value.choice.SCell_FailedtoSetup_Item;
|
&sCell_FailedtoSetup_item_ies->value.choice.SCell_FailedtoSetup_Item;
|
||||||
/* sCell_ID */
|
/* sCell_ID */
|
||||||
addnRCGI(sCell_FailedtoSetup_item->sCell_ID,f1ap_du_data->cell+i);
|
addnRCGI(sCell_FailedtoSetup_item->sCell_ID,f1ap_req(false, instance)->cell+i);
|
||||||
/* cause */
|
/* cause */
|
||||||
asn1cCalloc(sCell_FailedtoSetup_item->cause, F1AP_Cause_t, tmp);
|
asn1cCalloc(sCell_FailedtoSetup_item->cause, F1AP_Cause_t, tmp);
|
||||||
// dummy value
|
// dummy value
|
||||||
@@ -453,10 +446,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
|
|
||||||
} // for i
|
} // for i
|
||||||
|
|
||||||
|
|
||||||
/* Optional */
|
/* Optional */
|
||||||
/* c11. InactivityMonitoringResponse */
|
/* c11. InactivityMonitoringResponse */
|
||||||
if (0) {
|
if (0) {
|
||||||
@@ -475,13 +466,13 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
ie12->criticality = F1AP_Criticality_ignore;
|
ie12->criticality = F1AP_Criticality_ignore;
|
||||||
ie12->value.present = F1AP_UEContextSetupResponseIEs__value_PR_CriticalityDiagnostics;
|
ie12->value.present = F1AP_UEContextSetupResponseIEs__value_PR_CriticalityDiagnostics;
|
||||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.procedureCode,
|
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.procedureCode,
|
||||||
F1AP_ProcedureCode_t, F1AP_ProcedureCode_id_UEContextSetup);
|
F1AP_ProcedureCode_t, F1AP_ProcedureCode_id_UEContextSetup);
|
||||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.triggeringMessage,
|
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.triggeringMessage,
|
||||||
F1AP_TriggeringMessage_t, F1AP_TriggeringMessage_initiating_message);
|
F1AP_TriggeringMessage_t, F1AP_TriggeringMessage_initiating_message);
|
||||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.procedureCriticality,
|
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.procedureCriticality,
|
||||||
F1AP_Criticality_t, F1AP_Criticality_reject);
|
F1AP_Criticality_t, F1AP_Criticality_reject);
|
||||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.transactionID,
|
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.transactionID,
|
||||||
F1AP_TransactionID_t, 0);
|
F1AP_TransactionID_t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* encode */
|
/* encode */
|
||||||
@@ -489,7 +480,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance) {
|
|||||||
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT SETUP RESPONSE\n");
|
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT SETUP RESPONSE\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,15 +509,14 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
|
|||||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||||
ie1->criticality = F1AP_Criticality_reject;
|
ie1->criticality = F1AP_Criticality_reject;
|
||||||
ie1->value.present = F1AP_UEContextReleaseRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
ie1->value.present = F1AP_UEContextReleaseRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(&f1ap_du_inst[instance], req->rnti);
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(false, instance, req->rnti);
|
||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c2. GNB_DU_UE_F1AP_ID */
|
/* c2. GNB_DU_UE_F1AP_ID */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie2);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie2);
|
||||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||||
ie2->criticality = F1AP_Criticality_reject;
|
ie2->criticality = F1AP_Criticality_reject;
|
||||||
ie2->value.present = F1AP_UEContextReleaseRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
ie2->value.present = F1AP_UEContextReleaseRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||||
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(&f1ap_du_inst[instance], req->rnti);
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(false, instance, req->rnti);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c3. Cause */
|
/* c3. Cause */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie3);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie3);
|
||||||
@@ -567,11 +557,10 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
du_f1ap_itti_send_sctp_data_req(instance,
|
f1ap_itti_send_sctp_data_req(false, instance,
|
||||||
f1ap_du_data->assoc_id,
|
buffer,
|
||||||
buffer,
|
len,
|
||||||
len,
|
getCxt(false, instance)->default_sctp_stream_id);
|
||||||
f1ap_du_data->default_sctp_stream_id);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,14 +577,14 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
/* GNB_CU_UE_F1AP_ID */
|
/* GNB_CU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||||
ctxt.rnti = f1ap_get_rnti_by_cu_id(&f1ap_du_inst[instance], ie->value.choice.GNB_CU_UE_F1AP_ID);
|
ctxt.rnti = f1ap_get_rnti_by_cu_id(false, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
|
||||||
ctxt.module_id = instance;
|
ctxt.module_id = instance;
|
||||||
ctxt.instance = instance;
|
ctxt.instance = instance;
|
||||||
ctxt.enb_flag = 1;
|
ctxt.enb_flag = 1;
|
||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
const rnti_t rnti = f1ap_get_rnti_by_du_id(&f1ap_du_inst[instance],
|
const rnti_t rnti = f1ap_get_rnti_by_du_id(false, instance,
|
||||||
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
||||||
AssertFatal(ctxt.rnti == rnti,
|
AssertFatal(ctxt.rnti == rnti,
|
||||||
"RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
"RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
||||||
@@ -720,7 +709,7 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
|
|
||||||
int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
||||||
f1ap_ue_context_release_cplt_t *cplt) {
|
f1ap_ue_context_release_cplt_t *cplt) {
|
||||||
F1AP_F1AP_PDU_t pdu={0};
|
F1AP_F1AP_PDU_t pdu= {0};
|
||||||
F1AP_UEContextReleaseComplete_t *out;
|
F1AP_UEContextReleaseComplete_t *out;
|
||||||
/* Create */
|
/* Create */
|
||||||
/* 0. Message Type */
|
/* 0. Message Type */
|
||||||
@@ -736,14 +725,14 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
|||||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||||
ie1->criticality = F1AP_Criticality_reject;
|
ie1->criticality = F1AP_Criticality_reject;
|
||||||
ie1->value.present = F1AP_UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
ie1->value.present = F1AP_UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(&f1ap_du_inst[instance], cplt->rnti);
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(false, instance, cplt->rnti);
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c2. GNB_DU_UE_F1AP_ID */
|
/* c2. GNB_DU_UE_F1AP_ID */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list,F1AP_UEContextReleaseCompleteIEs_t, ie2);
|
asn1cSequenceAdd(out->protocolIEs.list,F1AP_UEContextReleaseCompleteIEs_t, ie2);
|
||||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||||
ie2->criticality = F1AP_Criticality_reject;
|
ie2->criticality = F1AP_Criticality_reject;
|
||||||
ie2->value.present = F1AP_UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
ie2->value.present = F1AP_UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||||
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(&f1ap_du_inst[instance], cplt->rnti);
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(false, instance, cplt->rnti);
|
||||||
/* optional -> currently not used */
|
/* optional -> currently not used */
|
||||||
/* c3. CriticalityDiagnostics */
|
/* c3. CriticalityDiagnostics */
|
||||||
//if (0) {
|
//if (0) {
|
||||||
@@ -801,12 +790,11 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
du_f1ap_itti_send_sctp_data_req(instance,
|
f1ap_itti_send_sctp_data_req(false, instance,
|
||||||
f1ap_du_data->assoc_id,
|
buffer,
|
||||||
buffer,
|
len,
|
||||||
len,
|
getCxt(false, instance)->default_sctp_stream_id);
|
||||||
f1ap_du_data->default_sctp_stream_id);
|
f1ap_remove_ue(false, instance, cplt->rnti);
|
||||||
f1ap_remove_ue(&f1ap_du_inst[instance], cplt->rnti);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1011,7 +999,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
|
|||||||
/* 8.1 SCell_ToBeSetup_Item */
|
/* 8.1 SCell_ToBeSetup_Item */
|
||||||
F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item;
|
F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item;
|
||||||
/* - sCell_ID */
|
/* - sCell_ID */
|
||||||
addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_du_data->cell[i]);
|
addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &f1ap_req(false, instance)->cell[i]);
|
||||||
asn1cCalloc(scell_failedtoSetupMod_item->cause, F1AP_Cause_t, tmp);
|
asn1cCalloc(scell_failedtoSetupMod_item->cause, F1AP_Cause_t, tmp);
|
||||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
|
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
|
||||||
@@ -1096,7 +1084,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//du_f1ap_itti_send_sctp_data_req(instance, f1ap_setup_req->assoc_id, buffer, len, 0);
|
//f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,8 +40,6 @@
|
|||||||
#include "f1ap_cu_ue_context_management.h"
|
#include "f1ap_cu_ue_context_management.h"
|
||||||
#include "f1ap_du_ue_context_management.h"
|
#include "f1ap_du_ue_context_management.h"
|
||||||
|
|
||||||
extern f1ap_setup_req_t *f1ap_du_data_from_du;
|
|
||||||
|
|
||||||
/* Handlers matrix. Only f1 related procedure present here */
|
/* Handlers matrix. Only f1 related procedure present here */
|
||||||
f1ap_message_decoded_callback f1ap_messages_callback[][3] = {
|
f1ap_message_decoded_callback f1ap_messages_callback[][3] = {
|
||||||
|
|
||||||
|
|||||||
@@ -22,26 +22,13 @@
|
|||||||
#include "f1ap_common.h"
|
#include "f1ap_common.h"
|
||||||
#include "f1ap_itti_messaging.h"
|
#include "f1ap_itti_messaging.h"
|
||||||
|
|
||||||
void cu_f1ap_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
|
void f1ap_itti_send_sctp_data_req(bool isCu, instance_t instance, uint8_t *buffer,
|
||||||
uint32_t buffer_length, uint16_t stream) {
|
uint32_t buffer_length, uint16_t stream) {
|
||||||
MessageDef *message_p;
|
MessageDef *message_p;
|
||||||
sctp_data_req_t *sctp_data_req;
|
sctp_data_req_t *sctp_data_req;
|
||||||
message_p = itti_alloc_new_message(TASK_CU_F1, 0, SCTP_DATA_REQ);
|
message_p = itti_alloc_new_message(isCu?TASK_CU_F1:TASK_DU_F1, 0, SCTP_DATA_REQ);
|
||||||
sctp_data_req = &message_p->ittiMsg.sctp_data_req;
|
sctp_data_req = &message_p->ittiMsg.sctp_data_req;
|
||||||
sctp_data_req->assoc_id = assoc_id;
|
sctp_data_req->assoc_id = f1ap_assoc_id(isCu,instance);
|
||||||
sctp_data_req->buffer = buffer;
|
|
||||||
sctp_data_req->buffer_length = buffer_length;
|
|
||||||
sctp_data_req->stream = stream;
|
|
||||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void du_f1ap_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
|
|
||||||
uint32_t buffer_length, uint16_t stream) {
|
|
||||||
MessageDef *message_p;
|
|
||||||
sctp_data_req_t *sctp_data_req;
|
|
||||||
message_p = itti_alloc_new_message(TASK_DU_F1, 0, SCTP_DATA_REQ);
|
|
||||||
sctp_data_req = &message_p->ittiMsg.sctp_data_req;
|
|
||||||
sctp_data_req->assoc_id = assoc_id;
|
|
||||||
sctp_data_req->buffer = buffer;
|
sctp_data_req->buffer = buffer;
|
||||||
sctp_data_req->buffer_length = buffer_length;
|
sctp_data_req->buffer_length = buffer_length;
|
||||||
sctp_data_req->stream = stream;
|
sctp_data_req->stream = stream;
|
||||||
@@ -49,12 +36,12 @@ void du_f1ap_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint
|
|||||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void f1ap_itti_send_sctp_close_association(instance_t instance, int32_t assoc_id) {
|
void f1ap_itti_send_sctp_close_association(bool isCu, instance_t instance) {
|
||||||
MessageDef *message_p = NULL;
|
MessageDef *message_p = NULL;
|
||||||
sctp_close_association_t *sctp_close_association_p = NULL;
|
sctp_close_association_t *sctp_close_association_p = NULL;
|
||||||
message_p = itti_alloc_new_message(TASK_S1AP, 0, SCTP_CLOSE_ASSOCIATION);
|
message_p = itti_alloc_new_message(TASK_S1AP, 0, SCTP_CLOSE_ASSOCIATION);
|
||||||
sctp_close_association_p = &message_p->ittiMsg.sctp_close_association;
|
sctp_close_association_p = &message_p->ittiMsg.sctp_close_association;
|
||||||
sctp_close_association_p->assoc_id = assoc_id;
|
sctp_close_association_p->assoc_id = f1ap_assoc_id(isCu,instance);
|
||||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,14 +22,10 @@
|
|||||||
#ifndef F1AP_ITTI_MESSAGING_H_
|
#ifndef F1AP_ITTI_MESSAGING_H_
|
||||||
#define F1AP_ITTI_MESSAGING_H_
|
#define F1AP_ITTI_MESSAGING_H_
|
||||||
|
|
||||||
void cu_f1ap_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
|
void f1ap_itti_send_sctp_data_req(bool isCu,instance_t instance, uint8_t *buffer,
|
||||||
uint32_t buffer_length, uint16_t stream);
|
uint32_t buffer_length, uint16_t stream);
|
||||||
|
|
||||||
void du_f1ap_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
|
void f1ap_eNB_itti_send_sctp_close_association(bool isCu,instance_t instance);
|
||||||
uint32_t buffer_length, uint16_t stream);
|
|
||||||
|
|
||||||
void f1ap_eNB_itti_send_sctp_close_association(instance_t instance,
|
|
||||||
int32_t assoc_id);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* F1AP_ITTI_MESSAGING_H_ */
|
#endif /* F1AP_ITTI_MESSAGING_H_ */
|
||||||
|
|||||||
@@ -1646,6 +1646,7 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
|
|||||||
AssertFatal(GNBParamList.paramarray[i][GNB_GNB_ID_IDX].uptr != NULL,
|
AssertFatal(GNBParamList.paramarray[i][GNB_GNB_ID_IDX].uptr != NULL,
|
||||||
"gNB id %u is not defined in configuration file\n",i);
|
"gNB id %u is not defined in configuration file\n",i);
|
||||||
F1AP_SETUP_REQ (msg_p).num_cells_available = 0;
|
F1AP_SETUP_REQ (msg_p).num_cells_available = 0;
|
||||||
|
F1AP_SETUP_REQ (msg_p).cell_type=CELL_MACRO_GNB;
|
||||||
|
|
||||||
for (k=0; k <num_gnbs ; k++) {
|
for (k=0; k <num_gnbs ; k++) {
|
||||||
if (strcmp(GNBSParams[GNB_ACTIVE_GNBS_IDX].strlistptr[k], *(GNBParamList.paramarray[i][GNB_GNB_NAME_IDX].strptr)) == 0) {
|
if (strcmp(GNBSParams[GNB_ACTIVE_GNBS_IDX].strlistptr[k], *(GNBParamList.paramarray[i][GNB_GNB_NAME_IDX].strptr)) == 0) {
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ static uint64_t pdcp_optmask;
|
|||||||
|
|
||||||
ngran_node_t node_type = ngran_gNB;
|
ngran_node_t node_type = ngran_gNB;
|
||||||
uint8_t first_dcch = 0;
|
uint8_t first_dcch = 0;
|
||||||
uint8_t proto_agent_flag = 0;
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/* rlc_data_req queue - begin */
|
/* rlc_data_req queue - begin */
|
||||||
|
|||||||
@@ -183,7 +183,6 @@ eth_params_t *eth_params;
|
|||||||
double cpuf;
|
double cpuf;
|
||||||
|
|
||||||
int oaisim_flag=0;
|
int oaisim_flag=0;
|
||||||
uint8_t proto_agent_flag = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/* forward declarations */
|
/* forward declarations */
|
||||||
|
|||||||
Reference in New Issue
Block a user