Commit ce9890a5 authored by Cedric Roux's avatar Cedric Roux

save commit

parent 7975b90d
...@@ -503,7 +503,7 @@ function main() { ...@@ -503,7 +503,7 @@ function main() {
execlist="" execlist=""
[[ "$eNB" == "1" ]] && execlist="$execlist lte-softmodem" [[ "$eNB" == "1" ]] && execlist="$execlist lte-softmodem"
[[ "$gNB" == "1" ]] && execlist="$execlist nr-softmodem nr-cuup" [[ "$gNB" == "1" ]] && execlist="$execlist nr-softmodem"
[[ "$RU" == "1" ]] && execlist="$execlist oairu" [[ "$RU" == "1" ]] && execlist="$execlist oairu"
[[ "$UE" == 1 ]] && execlist="$execlist lte-uesoftmodem" [[ "$UE" == 1 ]] && execlist="$execlist lte-uesoftmodem"
[[ "$nrUE" == 1 ]] && execlist="$execlist nr-uesoftmodem" [[ "$nrUE" == 1 ]] && execlist="$execlist nr-uesoftmodem"
......
...@@ -122,6 +122,7 @@ extern "C" { ...@@ -122,6 +122,7 @@ extern "C" {
} }
static inline int itti_send_msg_to_task_locked(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) { static inline int itti_send_msg_to_task_locked(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
//if (message->ittiMsgHeader.messageId == GTPV1U_ENB_TUNNEL_DATA_REQ) exit(1);
task_list_t *t=tasks[destination_task_id]; task_list_t *t=tasks[destination_task_id];
message->ittiMsgHeader.destinationTaskId = destination_task_id; message->ittiMsgHeader.destinationTaskId = destination_task_id;
message->ittiMsgHeader.destinationInstance = destinationInstance; message->ittiMsgHeader.destinationInstance = destinationInstance;
...@@ -144,6 +145,8 @@ extern "C" { ...@@ -144,6 +145,8 @@ extern "C" {
} }
int itti_send_msg_to_task(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) { int itti_send_msg_to_task(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
//if (message->ittiMsgHeader.messageId == GTPV1U_GNB_TUNNEL_DATA_REQ && GTPV1U_GNB_TUNNEL_DATA_REQ(message).assoc_id == 0) exit(1);
//if (message->ittiMsgHeader.messageId == GTPV1U_ENB_TUNNEL_DATA_REQ) exit(1);
task_list_t *t=tasks[destination_task_id]; task_list_t *t=tasks[destination_task_id];
pthread_mutex_lock (&t->queue_cond_lock); pthread_mutex_lock (&t->queue_cond_lock);
int ret=itti_send_msg_to_task_locked(destination_task_id, destinationInstance, message); int ret=itti_send_msg_to_task_locked(destination_task_id, destinationInstance, message);
......
This diff is collapsed.
This diff is collapsed.
...@@ -156,6 +156,7 @@ typedef struct e1ap_bearer_setup_req_s { ...@@ -156,6 +156,7 @@ typedef struct e1ap_bearer_setup_req_s {
uint32_t gNB_cu_cp_ue_id; uint32_t gNB_cu_cp_ue_id;
uint32_t gNB_cu_up_ue_id; uint32_t gNB_cu_up_ue_id;
rnti_t rnti; rnti_t rnti;
int assoc_id;
uint64_t cipheringAlgorithm; uint64_t cipheringAlgorithm;
uint64_t integrityProtectionAlgorithm; uint64_t integrityProtectionAlgorithm;
char encryptionKey[128]; char encryptionKey[128];
......
...@@ -286,6 +286,7 @@ typedef struct f1ap_dl_rrc_message_s { ...@@ -286,6 +286,7 @@ typedef struct f1ap_dl_rrc_message_s {
uint32_t gNB_DU_ue_id; uint32_t gNB_DU_ue_id;
uint32_t old_gNB_DU_ue_id; uint32_t old_gNB_DU_ue_id;
uint16_t rnti; uint16_t rnti;
int assoc_id;
uint8_t srb_id; uint8_t srb_id;
uint8_t execute_duplication; uint8_t execute_duplication;
uint8_t *rrc_container; uint8_t *rrc_container;
...@@ -309,6 +310,7 @@ typedef struct f1ap_initial_ul_rrc_message_s { ...@@ -309,6 +310,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
uint64_t nr_cellid; uint64_t nr_cellid;
/// crnti /// crnti
uint16_t crnti; uint16_t crnti;
int assoc_id;
uint8_t *rrc_container; uint8_t *rrc_container;
int rrc_container_length; int rrc_container_length;
uint8_t *du2cu_rrc_container; uint8_t *du2cu_rrc_container;
...@@ -317,6 +319,7 @@ typedef struct f1ap_initial_ul_rrc_message_s { ...@@ -317,6 +319,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
typedef struct f1ap_ul_rrc_message_s { typedef struct f1ap_ul_rrc_message_s {
uint16_t rnti; uint16_t rnti;
int assoc_id;
uint8_t srb_id; uint8_t srb_id;
uint8_t *rrc_container; uint8_t *rrc_container;
int rrc_container_length; int rrc_container_length;
...@@ -380,6 +383,7 @@ typedef struct f1ap_ue_context_setup_s { ...@@ -380,6 +383,7 @@ typedef struct f1ap_ue_context_setup_s {
uint32_t gNB_CU_ue_id; // BK: need to replace by use from rnti uint32_t gNB_CU_ue_id; // BK: need to replace by use from rnti
uint32_t gNB_DU_ue_id; uint32_t gNB_DU_ue_id;
uint16_t rnti; uint16_t rnti;
int assoc_id;
// SpCell Info // SpCell Info
uint16_t mcc; uint16_t mcc;
uint16_t mnc; uint16_t mnc;
...@@ -419,6 +423,7 @@ typedef enum F1ap_Cause_e { ...@@ -419,6 +423,7 @@ typedef enum F1ap_Cause_e {
typedef struct f1ap_ue_context_release_s { typedef struct f1ap_ue_context_release_s {
uint16_t rnti; uint16_t rnti;
int assoc_id; /* only used in CU */
f1ap_Cause_t cause; f1ap_Cause_t cause;
long cause_value; long cause_value;
uint8_t *rrc_container; uint8_t *rrc_container;
......
...@@ -112,6 +112,7 @@ typedef struct gtpv1u_tunnel_data_req_s { ...@@ -112,6 +112,7 @@ typedef struct gtpv1u_tunnel_data_req_s {
uint32_t length; uint32_t length;
uint32_t offset; ///< start of message offset in buffer uint32_t offset; ///< start of message offset in buffer
ue_id_t ue_id; ue_id_t ue_id;
int assoc_id;
rb_id_t bearer_id; rb_id_t bearer_id;
} gtpv1u_tunnel_data_req_t; } gtpv1u_tunnel_data_req_t;
...@@ -169,6 +170,7 @@ typedef struct { ...@@ -169,6 +170,7 @@ typedef struct {
typedef struct gtpv1u_gnb_create_tunnel_req_s { typedef struct gtpv1u_gnb_create_tunnel_req_s {
ue_id_t ue_id; ue_id_t ue_id;
int assoc_id;
int num_tunnels; int num_tunnels;
//teid_t upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier //teid_t upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier
teid_t outgoing_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; teid_t outgoing_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];
...@@ -183,6 +185,7 @@ typedef struct gtpv1u_gnb_create_tunnel_req_s { ...@@ -183,6 +185,7 @@ typedef struct gtpv1u_gnb_create_tunnel_req_s {
typedef struct gtpv1u_gnb_create_tunnel_resp_s { typedef struct gtpv1u_gnb_create_tunnel_resp_s {
uint8_t status; ///< Status of S1U endpoint creation (Failed = 0xFF or Success = 0x0) uint8_t status; ///< Status of S1U endpoint creation (Failed = 0xFF or Success = 0x0)
ue_id_t ue_id; ue_id_t ue_id;
int assoc_id;
int num_tunnels; int num_tunnels;
teid_t gnb_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier teid_t gnb_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE]; ///< Tunnel Endpoint Identifier
pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE]; pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
...@@ -190,17 +193,18 @@ typedef struct gtpv1u_gnb_create_tunnel_resp_s { ...@@ -190,17 +193,18 @@ typedef struct gtpv1u_gnb_create_tunnel_resp_s {
} gtpv1u_gnb_create_tunnel_resp_t; } gtpv1u_gnb_create_tunnel_resp_t;
typedef struct gtpv1u_gnb_delete_tunnel_req_s { typedef struct gtpv1u_gnb_delete_tunnel_req_s {
ue_id_t ue_id; ue_id_t ue_id;
int assoc_id;
uint8_t num_pdusession; uint8_t num_pdusession;
pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE]; pdusessionid_t pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
} gtpv1u_gnb_delete_tunnel_req_t; } gtpv1u_gnb_delete_tunnel_req_t;
typedef struct gtpv1u_gnb_delete_tunnel_resp_s { typedef struct gtpv1u_gnb_delete_tunnel_resp_s {
ue_id_t ue_id; ue_id_t ue_id;
int assoc_id;
uint8_t status; ///< Status of NGU endpoint deleteion (Failed = 0xFF or Success = 0x0) uint8_t status; ///< Status of NGU endpoint deleteion (Failed = 0xFF or Success = 0x0)
teid_t gnb_NGu_teid; ///< local NGU Tunnel Endpoint Identifier to be deleted teid_t gnb_NGu_teid; ///< local NGU Tunnel Endpoint Identifier to be deleted
} gtpv1u_gnb_delete_tunnel_resp_t; } gtpv1u_gnb_delete_tunnel_resp_t;
typedef struct gtpv1u_DU_buffer_report_req_s { typedef struct gtpv1u_DU_buffer_report_req_s {
uint32_t buffer_availability; uint32_t buffer_availability;
ue_id_t ue_id; ue_id_t ue_id;
......
...@@ -84,6 +84,7 @@ typedef struct NRRrcDcchDataReq_s { ...@@ -84,6 +84,7 @@ typedef struct NRRrcDcchDataReq_s {
uint8_t *sdu_p; uint8_t *sdu_p;
uint8_t mode; uint8_t mode;
uint16_t rnti; uint16_t rnti;
int assoc_id;
uint8_t module_id; uint8_t module_id;
uint8_t gNB_index; uint8_t gNB_index;
} NRRrcDcchDataReq; } NRRrcDcchDataReq;
......
...@@ -1583,6 +1583,13 @@ static void e1_task_handle_sctp_association_resp(E1_t type, instance_t instance, ...@@ -1583,6 +1583,13 @@ static void e1_task_handle_sctp_association_resp(E1_t type, instance_t instance,
void cuup_init_n3(instance_t instance) void cuup_init_n3(instance_t instance)
{ {
#if 0
usleep(100*1000);
extern instance_t CUuniqInstance;
extern instance_t legacyInstanceMapping;
if (CUuniqInstance == 0) abort();
legacyInstanceMapping = getCxtE1(instance)->gtpInstN3 = CUuniqInstance;
#endif
if (getCxtE1(instance)->gtpInstN3 < 0) { if (getCxtE1(instance)->gtpInstN3 < 0) {
e1ap_setup_req_t *setup = &getCxtE1(instance)->setupReq; e1ap_setup_req_t *setup = &getCxtE1(instance)->setupReq;
openAddr_t tmp = {0}; openAddr_t tmp = {0};
......
...@@ -189,7 +189,7 @@ void CUUP_process_bearer_release_command(instance_t instance, e1ap_bearer_releas ...@@ -189,7 +189,7 @@ void CUUP_process_bearer_release_command(instance_t instance, e1ap_bearer_releas
{ {
e1ap_upcp_inst_t *inst = getCxtE1(instance); e1ap_upcp_inst_t *inst = getCxtE1(instance);
AssertFatal(inst, ""); AssertFatal(inst, "");
newGtpuDeleteAllTunnels(inst->gtpInstN3, cmd->gNB_cu_up_ue_id); newGtpuDeleteAllTunnels(inst->gtpInstN3, cmd->gNB_cu_up_ue_id, 0 /* assoc_id, e1 not working */);
newGtpuDeleteAllTunnels(inst->gtpInstF1U, cmd->gNB_cu_up_ue_id); newGtpuDeleteAllTunnels(inst->gtpInstF1U, cmd->gNB_cu_up_ue_id, 0 /* assoc_id, e1 not working */);
e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE(inst, cmd); e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE(inst, cmd);
} }
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
*/ */
#include "f1ap_common.h" #include "f1ap_common.h"
#include "f1ap_cu_task.h"
static f1ap_cudu_inst_t *f1_du_inst[NUMBER_OF_eNB_MAX]= {0}; 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}; static f1ap_cudu_inst_t *f1_cu_inst[NUMBER_OF_eNB_MAX]= {0};
...@@ -51,11 +52,16 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP) { ...@@ -51,11 +52,16 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP) {
AssertFatal ( t==-1 || t==tNew, "This is not thread safe\n"); AssertFatal ( t==-1 || t==tNew, "This is not thread safe\n");
t=tNew; t=tNew;
*/ */
if (isCU == CUtype) {
LOG_E(F1AP, "don't use getCxt() with the CU\n");
exit(1);
}
AssertFatal( instanceP < sizeofArray(f1_cu_inst), ""); AssertFatal( instanceP < sizeofArray(f1_cu_inst), "");
return isCU == CUtype ? f1_cu_inst[ instanceP]: f1_du_inst[ instanceP]; return isCU == CUtype ? f1_cu_inst[ instanceP]: f1_du_inst[ instanceP];
} }
void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req) { void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req) {
printf("createF1inst instanceP %ld\n", instanceP);
if (isCU == CUtype) { if (isCU == CUtype) {
AssertFatal(f1_cu_inst[instanceP] == NULL, "Double call to F1 CU init\n"); AssertFatal(f1_cu_inst[instanceP] == NULL, "Double call to F1 CU init\n");
f1_cu_inst[instanceP]=( f1ap_cudu_inst_t *) calloc(1, sizeof( f1ap_cudu_inst_t)); f1_cu_inst[instanceP]=( f1ap_cudu_inst_t *) calloc(1, sizeof( f1ap_cudu_inst_t));
...@@ -69,11 +75,17 @@ void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req) { ...@@ -69,11 +75,17 @@ void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req) {
int f1ap_add_ue(F1_t isCu, int f1ap_add_ue(F1_t isCu,
instance_t instanceP, instance_t instanceP,
rnti_t rntiP) { rnti_t rntiP,
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP); int assoc_id) {
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
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].assoc_id == assoc_id) {
f1_inst->f1ap_ue[i].f1ap_uid = i; f1_inst->f1ap_ue[i].f1ap_uid = i;
LOG_I(F1AP, "Updating the index of UE with RNTI %x and du_ue_f1ap_id %ld\n", f1_inst->f1ap_ue[i].rnti, f1_inst->f1ap_ue[i].du_ue_f1ap_id); LOG_I(F1AP, "Updating the index of UE with RNTI %x and du_ue_f1ap_id %ld\n", f1_inst->f1ap_ue[i].rnti, f1_inst->f1ap_ue[i].du_ue_f1ap_id);
return i; return i;
...@@ -84,9 +96,11 @@ int f1ap_add_ue(F1_t isCu, ...@@ -84,9 +96,11 @@ int f1ap_add_ue(F1_t isCu,
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 == 0 ) { if (f1_inst->f1ap_ue[i].rnti == 0 ) {
f1_inst->f1ap_ue[i].rnti = rntiP; f1_inst->f1ap_ue[i].rnti = rntiP;
f1_inst->f1ap_ue[i].assoc_id = assoc_id;
f1_inst->f1ap_ue[i].f1ap_uid = i; f1_inst->f1ap_ue[i].f1ap_uid = i;
f1_inst->f1ap_ue[i].du_ue_f1ap_id = rntiP; f1_inst->f1ap_ue[i].du_ue_f1ap_id = rntiP;
f1_inst->f1ap_ue[i].cu_ue_f1ap_id = rntiP; AssertFatal(assoc_id <= 32767, "fatal, assoc_id too big\n");
f1_inst->f1ap_ue[i].cu_ue_f1ap_id = rntiP + assoc_id * 65536;
f1_inst->num_ues++; f1_inst->num_ues++;
LOG_I(F1AP, "Adding a new UE with RNTI %x and cu/du ue_f1ap_id %ld\n", f1_inst->f1ap_ue[i].rnti, f1_inst->f1ap_ue[i].du_ue_f1ap_id); LOG_I(F1AP, "Adding a new UE with RNTI %x and cu/du ue_f1ap_id %ld\n", f1_inst->f1ap_ue[i].rnti, f1_inst->f1ap_ue[i].du_ue_f1ap_id);
return i; return i;
...@@ -113,11 +127,17 @@ int f1ap_remove_ue(F1_t isCu, instance_t instanceP, ...@@ -113,11 +127,17 @@ int f1ap_remove_ue(F1_t isCu, instance_t instanceP,
} }
int f1ap_get_du_ue_f1ap_id(F1_t isCu, instance_t instanceP, int f1ap_get_du_ue_f1ap_id(F1_t isCu, instance_t instanceP,
rnti_t rntiP) { rnti_t rntiP, int assoc_id)
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP); {
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
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].assoc_id == assoc_id) {
return f1_inst->f1ap_ue[i].du_ue_f1ap_id; return f1_inst->f1ap_ue[i].du_ue_f1ap_id;
} }
} }
...@@ -126,11 +146,17 @@ int f1ap_get_du_ue_f1ap_id(F1_t isCu, instance_t instanceP, ...@@ -126,11 +146,17 @@ int f1ap_get_du_ue_f1ap_id(F1_t isCu, instance_t instanceP,
} }
int f1ap_get_cu_ue_f1ap_id(F1_t isCu, instance_t instanceP, int f1ap_get_cu_ue_f1ap_id(F1_t isCu, instance_t instanceP,
rnti_t rntiP) { rnti_t rntiP, int assoc_id)
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP); {
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
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].assoc_id == assoc_id) {
return f1_inst->f1ap_ue[i].cu_ue_f1ap_id; return f1_inst->f1ap_ue[i].cu_ue_f1ap_id;
} }
} }
...@@ -139,8 +165,15 @@ int f1ap_get_cu_ue_f1ap_id(F1_t isCu, instance_t instanceP, ...@@ -139,8 +165,15 @@ int f1ap_get_cu_ue_f1ap_id(F1_t isCu, instance_t instanceP,
} }
int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP, int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP,
instance_t du_ue_f1ap_id ) { instance_t du_ue_f1ap_id,
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP); int assoc_id)
{
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
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) {
...@@ -152,8 +185,15 @@ int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP, ...@@ -152,8 +185,15 @@ int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP,
} }
int f1ap_get_rnti_by_cu_id(F1_t isCu, instance_t instanceP, int f1ap_get_rnti_by_cu_id(F1_t isCu, instance_t instanceP,
instance_t cu_ue_f1ap_id ) { instance_t cu_ue_f1ap_id,
f1ap_cudu_inst_t *f1_inst=getCxt(isCu, instanceP); int assoc_id)
{
f1ap_cudu_inst_t *f1_inst;
if (isCu)
f1_inst = f1ap_cu_assoc_id_to_context(assoc_id);
else
f1_inst = getCxt(isCu, instanceP);
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) {
...@@ -187,5 +227,6 @@ int f1ap_du_add_cu_ue_id(instance_t instanceP, ...@@ -187,5 +227,6 @@ int f1ap_du_add_cu_ue_id(instance_t instanceP,
int f1ap_assoc_id(F1_t isCu, instance_t instanceP) { int f1ap_assoc_id(F1_t isCu, instance_t instanceP) {
f1ap_setup_req_t *f1_inst=f1ap_req(isCu, instanceP); f1ap_setup_req_t *f1_inst=f1ap_req(isCu, instanceP);
printf("f1ap_assoc_id instanceP %ld will return f1_inst->assoc_id %d\n", instanceP, f1_inst->assoc_id);
return f1_inst->assoc_id; return f1_inst->assoc_id;
} }
...@@ -396,16 +396,17 @@ ...@@ -396,16 +396,17 @@
**/ **/
typedef int (*f1ap_message_processing_t)( typedef int (*f1ap_message_processing_t)(
instance_t instance, instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *message_p F1AP_F1AP_PDU_t *message_p
); );
int f1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream, int f1ap_handle_message(instance_t instance, int assoc_id, int32_t stream,
const uint8_t *const data, const uint32_t data_length); const uint8_t *const data, const uint32_t data_length);
typedef struct f1ap_cudu_ue_inst_s { typedef struct f1ap_cudu_ue_inst_s {
// used for eNB stats generation // used for eNB stats generation
rnti_t rnti; rnti_t rnti;
int assoc_id;
instance_t f1ap_uid; instance_t f1ap_uid;
instance_t du_ue_f1ap_id; instance_t du_ue_f1ap_id;
instance_t cu_ue_f1ap_id; instance_t cu_ue_f1ap_id;
...@@ -436,24 +437,27 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP); ...@@ -436,24 +437,27 @@ f1ap_cudu_inst_t *getCxt(F1_t isCU, instance_t instanceP);
void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req); void createF1inst(F1_t isCU, instance_t instanceP, f1ap_setup_req_t *req);
int f1ap_add_ue(F1_t isCu, int f1ap_add_ue(F1_t isCu,
instance_t instanceP, instance_t instanceP,
rnti_t rntiP); rnti_t rntiP,
int assoc_id);
int f1ap_remove_ue(F1_t isCu, instance_t instanceP, int f1ap_remove_ue(F1_t isCu, instance_t instanceP,
rnti_t rntiP); rnti_t rntiP);
int f1ap_get_du_ue_f1ap_id (F1_t isCu, instance_t instanceP, int f1ap_get_du_ue_f1ap_id (F1_t isCu, instance_t instanceP,
rnti_t rntiP); rnti_t rntiP, int assoc_id);
int f1ap_get_cu_ue_f1ap_id (F1_t isCu, instance_t instanceP, int f1ap_get_cu_ue_f1ap_id (F1_t isCu, instance_t instanceP,
rnti_t rntiP); rnti_t rntiP, int assoc_id);
int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP, int f1ap_get_rnti_by_du_id(F1_t isCu, instance_t instanceP,
instance_t du_ue_f1ap_id ); instance_t du_ue_f1ap_id,
int assoc_id);
int f1ap_get_rnti_by_cu_id(F1_t isCu, instance_t instanceP, int f1ap_get_rnti_by_cu_id(F1_t isCu, instance_t instanceP,
instance_t cu_ue_f1ap_id ); instance_t cu_ue_f1ap_id,
int assoc_id);
int f1ap_du_add_cu_ue_id(instance_t instanceP, int f1ap_du_add_cu_ue_id(instance_t instanceP,
instance_t du_ue_f1ap_id, instance_t du_ue_f1ap_id,
......
...@@ -35,20 +35,21 @@ ...@@ -35,20 +35,21 @@
#include "f1ap_decoder.h" #include "f1ap_decoder.h"
#include "f1ap_itti_messaging.h" #include "f1ap_itti_messaging.h"
#include "f1ap_cu_interface_management.h" #include "f1ap_cu_interface_management.h"
#include "f1ap_cu_task.h"
int CU_send_RESET(instance_t instance, F1AP_Reset_t *Reset) { int CU_send_RESET(instance_t instance, F1AP_Reset_t *Reset) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
} }
int CU_handle_RESET_ACKKNOWLEDGE(instance_t instance, int CU_handle_RESET_ACKKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
} }
int CU_handle_RESET(instance_t instance, int CU_handle_RESET(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
...@@ -63,7 +64,7 @@ int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *Rese ...@@ -63,7 +64,7 @@ int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *Rese
Error Indication Error Indication
*/ */
int CU_handle_ERROR_INDICATION(instance_t instance, int CU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
...@@ -78,7 +79,7 @@ int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorI ...@@ -78,7 +79,7 @@ int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorI
F1 Setup F1 Setup
*/ */
int CU_handle_F1_SETUP_REQUEST(instance_t instance, int CU_handle_F1_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "CU_handle_F1_SETUP_REQUEST\n"); LOG_D(F1AP, "CU_handle_F1_SETUP_REQUEST\n");
...@@ -96,7 +97,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, ...@@ -96,7 +97,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
} }
/* assoc_id */ /* assoc_id */
f1ap_setup_req_t *req=&getCxt(true, instance)->setupReq; f1ap_setup_req_t *req=&f1ap_cu_assoc_id_to_context(assoc_id)->setupReq;
req->assoc_id = assoc_id; req->assoc_id = assoc_id;
/* gNB_DU_id */ /* gNB_DU_id */
// this function exits if the ie is mandatory // this function exits if the ie is mandatory
...@@ -143,7 +144,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, ...@@ -143,7 +144,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
LOG_D(F1AP, "req->nr_pci[%d] %d \n", i, req->cell[i].nr_pci); LOG_D(F1AP, "req->nr_pci[%d] %d \n", i, req->cell[i].nr_pci);
// LTS: FIXME cell_type is not a attribute of a cell in the data structure !!!!!!!!!! // LTS: FIXME cell_type is not a attribute of a cell in the data structure !!!!!!!!!!
f1ap_req(true, instance)->cell_type = CELL_MACRO_GNB; req->cell_type=CELL_MACRO_GNB;
// FDD Cells // FDD Cells
if (servedCellInformation->nR_Mode_Info.present==F1AP_NR_Mode_Info_PR_fDD) { if (servedCellInformation->nR_Mode_Info.present==F1AP_NR_Mode_Info_PR_fDD) {
...@@ -197,7 +198,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, ...@@ -197,7 +198,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
} }
struct F1AP_GNB_DU_System_Information * DUsi=served_cells_item->gNB_DU_System_Information; struct F1AP_GNB_DU_System_Information * DUsi=served_cells_item->gNB_DU_System_Information;
LOG_I(F1AP, "Received Cell in %d context\n", f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB); LOG_I(F1AP, "Received Cell in %d context\n", req->cell_type==CELL_MACRO_GNB);
// System Information // System Information
/* mib */ /* mib */
req->mib[i] = calloc(DUsi->mIB_message.size + 1, sizeof(char)); req->mib[i] = calloc(DUsi->mIB_message.size + 1, sizeof(char));
...@@ -257,13 +258,13 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance, ...@@ -257,13 +258,13 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
memcpy(&F1AP_SETUP_REQ(message_p), req, sizeof(f1ap_setup_req_t) ); memcpy(&F1AP_SETUP_REQ(message_p), req, sizeof(f1ap_setup_req_t) );
if (req->num_cells_available > 0) { if (req->num_cells_available > 0) {
if (f1ap_req(true, instance)->cell_type == CELL_MACRO_GNB) { if (req->cell_type == CELL_MACRO_GNB) {
itti_send_msg_to_task(TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(instance), message_p); itti_send_msg_to_task(TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(instance), message_p);
} else { } else {
itti_send_msg_to_task(TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(instance), message_p); itti_send_msg_to_task(TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(instance), message_p);
} }
} else { } else {
CU_send_F1_SETUP_FAILURE(instance); CU_send_F1_SETUP_FAILURE(instance, assoc_id);
itti_free(TASK_CU_F1,message_p); itti_free(TASK_CU_F1,message_p);
return -1; return -1;
} }
...@@ -374,11 +375,12 @@ int CU_send_F1_SETUP_RESPONSE(instance_t instance, ...@@ -374,11 +375,12 @@ 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);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0); f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0, f1ap_setup_resp->assoc_id);
return 0; return 0;
} }
int CU_send_F1_SETUP_FAILURE(instance_t instance) { int CU_send_F1_SETUP_FAILURE(instance_t instance, int assoc_id)
{
LOG_D(F1AP, "CU_send_F1_SETUP_FAILURE\n"); LOG_D(F1AP, "CU_send_F1_SETUP_FAILURE\n");
instance_t enb_mod_idP=0; instance_t enb_mod_idP=0;
instance_t cu_mod_idP=0; instance_t cu_mod_idP=0;
...@@ -444,7 +446,7 @@ int CU_send_F1_SETUP_FAILURE(instance_t instance) { ...@@ -444,7 +446,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);
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0); f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0, assoc_id);
return 0; return 0;
} }
...@@ -453,7 +455,7 @@ int CU_send_F1_SETUP_FAILURE(instance_t instance) { ...@@ -453,7 +455,7 @@ int CU_send_F1_SETUP_FAILURE(instance_t instance) {
*/ */
int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance, int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
...@@ -541,6 +543,15 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu ...@@ -541,6 +543,15 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
AssertFatal(sIBtype < 6 || sIBtype == 9, "Illegal SI type %d\n",sIBtype); AssertFatal(sIBtype < 6 || sIBtype == 9, "Illegal SI type %d\n",sIBtype);
asn1cSequenceAdd(gNB_CUSystemInformation->sibtypetobeupdatedlist.list, F1AP_SibtypetobeupdatedListItem_t, sib_item); asn1cSequenceAdd(gNB_CUSystemInformation->sibtypetobeupdatedlist.list, F1AP_SibtypetobeupdatedListItem_t, sib_item);
sib_item->sIBtype = sIBtype; sib_item->sIBtype = sIBtype;
{
unsigned char *b = f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container[sIBtype];
int len = f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container_length[sIBtype];
printf("celle %d put sib(%d)[%d]", i, sIBtype, len);
int i;
for (i = 0; i < len; i++) printf(" %2.2x", b[i]);
printf("\n");
fflush(stdout);
}
OCTET_STRING_fromBuf(&sib_item->sIBmessage, OCTET_STRING_fromBuf(&sib_item->sIBmessage,
(const char *)f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container[sIBtype], (const char *)f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container[sIBtype],
f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container_length[sIBtype]); f1ap_gnb_cu_configuration_update->cells_to_activate[i].SI_container_length[sIBtype]);
...@@ -558,21 +569,30 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu ...@@ -558,21 +569,30 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
return -1; return -1;
} }
{
unsigned char *b = buffer;
printf("cu update [%d]", len);
int i;
for (i = 0; i < len; i++) printf(" %2.2x", b[i]);
printf("\n");
fflush(stdout);
}
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);
f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0); f1ap_itti_send_sctp_data_req(true,instance, buffer, len, 0, f1ap_gnb_cu_configuration_update->assoc_id);
return 0; return 0;
} }
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE(instance_t instance, int CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
} }
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
LOG_I(F1AP,"Cell Configuration ok (assoc_id %d)\n",assoc_id); LOG_I(F1AP,"Cell Configuration ok (assoc_id %d)\n",assoc_id);
...@@ -581,7 +601,7 @@ int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, ...@@ -581,7 +601,7 @@ int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
int CU_handle_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance, int CU_handle_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(0, "Not implemented yet\n"); AssertFatal(0, "Not implemented yet\n");
......
...@@ -38,11 +38,11 @@ ...@@ -38,11 +38,11 @@
*/ */
int CU_send_RESET(instance_t instance, F1AP_Reset_t *Reset); int CU_send_RESET(instance_t instance, F1AP_Reset_t *Reset);
int CU_handle_RESET_ACKKNOWLEDGE(instance_t instance, int CU_handle_RESET_ACKKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_handle_RESET(instance_t instance, int CU_handle_RESET(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *ResetAcknowledge); int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *ResetAcknowledge);
...@@ -51,7 +51,7 @@ int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *Rese ...@@ -51,7 +51,7 @@ int CU_send_RESET_ACKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *Rese
* Error Indication * Error Indication
*/ */
int CU_handle_ERROR_INDICATION(instance_t instance, int CU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorIndication); int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorIndication);
...@@ -60,19 +60,19 @@ int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorI ...@@ -60,19 +60,19 @@ int CU_send_ERROR_INDICATION(instance_t instance, F1AP_ErrorIndication_t *ErrorI
* F1 Setup * F1 Setup
*/ */
int CU_handle_F1_SETUP_REQUEST(instance_t instance, int CU_handle_F1_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_send_F1_SETUP_RESPONSE(instance_t instance, f1ap_setup_resp_t *f1ap_setup_resp); int CU_send_F1_SETUP_RESPONSE(instance_t instance, f1ap_setup_resp_t *f1ap_setup_resp);
int CU_send_F1_SETUP_FAILURE(instance_t instance); int CU_send_F1_SETUP_FAILURE(instance_t instance, int assoc_id);
/* /*
* gNB-DU Configuration Update * gNB-DU Configuration Update
*/ */
int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance, int CU_handle_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -87,12 +87,12 @@ int CU_send_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, ...@@ -87,12 +87,12 @@ int CU_send_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
*/ */
int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configuration_update_t *f1ap_gnb_cu_configuration_update); int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configuration_update_t *f1ap_gnb_cu_configuration_update);
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE(instance_t instance, int CU_handle_gNB_CU_CONFIGURATION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -100,7 +100,7 @@ int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, ...@@ -100,7 +100,7 @@ int CU_handle_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
* gNB-DU Resource Coordination * gNB-DU Resource Coordination
*/ */
int CU_handle_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance, int CU_handle_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
......
...@@ -115,6 +115,6 @@ int CU_send_Paging(instance_t instance, f1ap_paging_ind_t *paging) { ...@@ -115,6 +115,6 @@ int CU_send_Paging(instance_t instance, f1ap_paging_ind_t *paging) {
return -1; return -1;
} }
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_F1AP_F1AP_PDU, &pdu); ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0); f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0, -1);
return 0; return 0;
} }
...@@ -38,16 +38,17 @@ ...@@ -38,16 +38,17 @@
#include "common/ran_context.h" #include "common/ran_context.h"
#include "openair3/UTILS/conversions.h" #include "openair3/UTILS/conversions.h"
#include "pdcp.h" #include "pdcp.h"
#include "f1ap_cu_task.h"
/* /*
Initial UL RRC Message Transfer Initial UL RRC Message Transfer
*/ */
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, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER\n"); LOG_D(F1AP, "CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER assoc_id %d\n", assoc_id);
// decode the F1 message // decode the F1 message
// get the rrc message from the contauiner // get the rrc message from the contauiner
// call func rrc_eNB_decode_ccch: <-- needs some update here // call func rrc_eNB_decode_ccch: <-- needs some update here
...@@ -89,7 +90,7 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -89,7 +90,7 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, du2cu, container, F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, du2cu, container,
F1AP_ProtocolIE_ID_id_DUtoCURRCContainer, false); F1AP_ProtocolIE_ID_id_DUtoCURRCContainer, false);
int f1ap_uid = f1ap_add_ue(CUtype, instance, rnti); int f1ap_uid = f1ap_add_ue(CUtype, instance, rnti, assoc_id);
if (f1ap_uid < 0 ) { if (f1ap_uid < 0 ) {
LOG_E(F1AP, "Failed to add UE \n"); LOG_E(F1AP, "Failed to add UE \n");
...@@ -97,11 +98,13 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -97,11 +98,13 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
} }
// create an ITTI message and copy SDU // create an ITTI message and copy SDU
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) { f1ap_setup_req_t *req = &f1ap_cu_assoc_id_to_context(assoc_id)->setupReq;
if (req->cell_type==CELL_MACRO_GNB) {
message_p = itti_alloc_new_message (TASK_CU_F1, 0, F1AP_INITIAL_UL_RRC_MESSAGE); message_p = itti_alloc_new_message (TASK_CU_F1, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
f1ap_initial_ul_rrc_message_t *ul_rrc = &F1AP_INITIAL_UL_RRC_MESSAGE(message_p); f1ap_initial_ul_rrc_message_t *ul_rrc = &F1AP_INITIAL_UL_RRC_MESSAGE(message_p);
ul_rrc->nr_cellid = nr_cellid; // CU instance ul_rrc->nr_cellid = nr_cellid; // CU instance
ul_rrc->crnti = rnti; ul_rrc->crnti = rnti;
ul_rrc->assoc_id = assoc_id;
ul_rrc->rrc_container_length = rrccont->value.choice.RRCContainer.size; ul_rrc->rrc_container_length = rrccont->value.choice.RRCContainer.size;
ul_rrc->rrc_container = malloc(ul_rrc->rrc_container_length); ul_rrc->rrc_container = malloc(ul_rrc->rrc_container_length);
memcpy(ul_rrc->rrc_container, rrccont->value.choice.RRCContainer.buf, ul_rrc->rrc_container_length); memcpy(ul_rrc->rrc_container, rrccont->value.choice.RRCContainer.buf, ul_rrc->rrc_container_length);
...@@ -162,7 +165,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -162,7 +165,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(CUtype, instance, f1ap_dl_rrc->rnti); ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_dl_rrc->rnti, f1ap_dl_rrc->assoc_id);
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 */
...@@ -171,7 +174,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -171,7 +174,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(CUtype, instance, f1ap_dl_rrc->rnti); ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_dl_rrc->rnti, f1ap_dl_rrc->assoc_id);
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 */
...@@ -238,15 +241,25 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -238,15 +241,25 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
return -1; return -1;
} }
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/); f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/, f1ap_dl_rrc->assoc_id);
return 0; return 0;
} }
bool nr_pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP,
const MBMS_flag_t MBMS_flagP,
const rb_id_t rb_id,
const sdu_size_t sdu_buffer_size,
mem_block_t *const sdu_buffer,
const uint32_t *const srcID,
const uint32_t *const dstID);
/* /*
UL RRC Message Transfer UL RRC Message Transfer
*/ */
int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance, int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "CU_handle_UL_RRC_MESSAGE_TRANSFER \n"); LOG_D(F1AP, "CU_handle_UL_RRC_MESSAGE_TRANSFER \n");
...@@ -269,13 +282,13 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -269,13 +282,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(CUtype, instance, cu_ue_f1ap_id)); cu_ue_f1ap_id, f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id, assoc_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(CUtype, instance, du_ue_f1ap_id)); du_ue_f1ap_id, f1ap_get_rnti_by_cu_id(CUtype, instance, du_ue_f1ap_id, assoc_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,
...@@ -295,7 +308,7 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -295,7 +308,7 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
protocol_ctxt_t ctxt={0}; protocol_ctxt_t ctxt={0};
ctxt.instance = instance; ctxt.instance = instance;
ctxt.module_id = instance; ctxt.module_id = instance;
ctxt.rntiMaybeUEid = f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id); ctxt.rntiMaybeUEid = f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id, assoc_id);
ctxt.enb_flag = 1; ctxt.enb_flag = 1;
ctxt.eNB_index = 0; ctxt.eNB_index = 0;
mem_block_t *mb = get_free_mem_block(ie->value.choice.RRCContainer.size,__func__); mem_block_t *mb = get_free_mem_block(ie->value.choice.RRCContainer.size,__func__);
...@@ -305,11 +318,12 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -305,11 +318,12 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
//for (int i = 0; i < ie->value.choice.RRCContainer.size; i++) //for (int i = 0; i < ie->value.choice.RRCContainer.size; i++)
// printf("%02x ", mb->data[i]); // printf("%02x ", mb->data[i]);
//printf("\n"); //printf("\n");
pdcp_data_ind (&ctxt, nr_pdcp_data_ind(&ctxt,
1, // srb_flag assoc_id,
0, // embms_flag 1, // srb_flag
srb_id, 0, // embms_flag
ie->value.choice.RRCContainer.size, srb_id,
mb, NULL, NULL); ie->value.choice.RRCContainer.size,
mb, NULL, NULL);
return 0; return 0;
} }
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#define F1AP_CU_RRC_MESSAGE_TRANSFER_H_ #define F1AP_CU_RRC_MESSAGE_TRANSFER_H_
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, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -42,7 +42,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -42,7 +42,7 @@ int CU_send_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
f1ap_dl_rrc_message_t *f1ap_dl_rrc); f1ap_dl_rrc_message_t *f1ap_dl_rrc);
int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance, int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "f1ap_cu_paging.h" #include "f1ap_cu_paging.h"
#include "f1ap_cu_task.h" #include "f1ap_cu_task.h"
#include <openair3/ocp-gtpu/gtp_itf.h> #include <openair3/ocp-gtpu/gtp_itf.h>
#include "assertions.h"
//Fixme: Uniq dirty DU instance, by global var, datamodel need better management //Fixme: Uniq dirty DU instance, by global var, datamodel need better management
instance_t CUuniqInstance=0; instance_t CUuniqInstance=0;
...@@ -45,11 +46,16 @@ static instance_t cu_task_create_gtpu_instance(eth_params_t *IPaddrs) { ...@@ -45,11 +46,16 @@ static instance_t cu_task_create_gtpu_instance(eth_params_t *IPaddrs) {
openAddr_t tmp= {0}; openAddr_t tmp= {0};
strncpy(tmp.originHost, IPaddrs->my_addr, sizeof(tmp.originHost)-1); strncpy(tmp.originHost, IPaddrs->my_addr, sizeof(tmp.originHost)-1);
sprintf(tmp.originService, "%d", IPaddrs->my_portd); sprintf(tmp.originService, "%d", IPaddrs->my_portd);
printf("cu_task_create_gtpu_instance %s %d\n", IPaddrs->my_addr, IPaddrs->my_portd); fflush(stdout);
return gtpv1Init(tmp); return gtpv1Init(tmp);
} }
static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind, static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind,
eth_params_t *IPaddrs) { eth_params_t *IPaddrs) {
printf("cu_task_handle_sctp_association_ind instance %ld assoc_id %d\n", instance, sctp_new_association_ind->assoc_id);
f1ap_new_du(sctp_new_association_ind->assoc_id);
f1ap_cu_assoc_id_to_context(sctp_new_association_ind->assoc_id)->gtpInst = CUuniqInstance;
#if 0
createF1inst(true, instance, NULL); createF1inst(true, instance, NULL);
// save the assoc id // save the assoc id
f1ap_setup_req_t *f1ap_cu_data=f1ap_req(true, instance); f1ap_setup_req_t *f1ap_cu_data=f1ap_req(true, instance);
...@@ -65,6 +71,7 @@ static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_as ...@@ -65,6 +71,7 @@ static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_as
// Fixme: fully inconsistent instances management // Fixme: fully inconsistent instances management
// dirty global var is a bad fix // dirty global var is a bad fix
CUuniqInstance=getCxt(CUtype, instance)->gtpInst; CUuniqInstance=getCxt(CUtype, instance)->gtpInst;
#endif
} }
static void cu_task_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) { static void cu_task_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) {
...@@ -127,6 +134,11 @@ void *F1AP_CU_task(void *arg) { ...@@ -127,6 +134,11 @@ void *F1AP_CU_task(void *arg) {
cu_task_send_sctp_init_req(0, IPaddrs->my_addr); cu_task_send_sctp_init_req(0, IPaddrs->my_addr);
createF1inst(true, 0, NULL);
instance_t gtpu_id = cu_task_create_gtpu_instance(IPaddrs);
CUuniqInstance = gtpu_id;
//getCxt(CUtype, 0/*instance*/)->gtpInst=CUuniqInstance;
while (1) { while (1) {
itti_receive_msg(TASK_CU_F1, &received_msg); itti_receive_msg(TASK_CU_F1, &received_msg);
LOG_I(F1AP, "CU Task Received %s for instance %ld\n", LOG_I(F1AP, "CU Task Received %s for instance %ld\n",
...@@ -210,3 +222,41 @@ void *F1AP_CU_task(void *arg) { ...@@ -210,3 +222,41 @@ void *F1AP_CU_task(void *arg) {
return NULL; return NULL;
} }
typedef struct {
f1ap_du_t *du;
int du_size;
} du_manager_t;
static du_manager_t du;
f1ap_du_t *f1ap_new_du(int assoc_id)
{
int i;
/* must not be here already */
for (i = 0; i < du.du_size; i++)
if (du.du[i].assoc_id == assoc_id) {
LOG_E(F1AP, "fatal: assoc_id %d already there\n", assoc_id);
exit(1);
}
du.du_size++;
du.du = realloc(du.du, du.du_size * sizeof(f1ap_du_t));
AssertFatal(du.du != NULL, "out of memory\n");
du.du[du.du_size - 1].assoc_id = assoc_id;
memset(&du.du[du.du_size - 1].ctxt, 0, sizeof(f1ap_cudu_inst_t));
return &du.du[du.du_size - 1];
}
f1ap_cudu_inst_t *f1ap_cu_assoc_id_to_context(int assoc_id)
{
int i;
for (i = 0; i < du.du_size; i++)
if (du.du[i].assoc_id == assoc_id)
return &du.du[i].ctxt;
LOG_E(F1AP, "fatal: assoc_id %d not found\n", assoc_id);
exit(1);
}
...@@ -22,6 +22,16 @@ ...@@ -22,6 +22,16 @@
#ifndef F1AP_CU_TASK_H_ #ifndef F1AP_CU_TASK_H_
#define F1AP_CU_TASK_H_ #define F1AP_CU_TASK_H_
#include "f1ap_common.h"
typedef struct {
int assoc_id;
f1ap_cudu_inst_t ctxt;
} f1ap_du_t;
f1ap_du_t *f1ap_new_du(int assoc_id);
f1ap_cudu_inst_t *f1ap_cu_assoc_id_to_context(int assoc_id);
void *F1AP_CU_task(void *arg); void *F1AP_CU_task(void *arg);
#endif /* F1AP_CU_TASK_H_ */ #endif /* F1AP_CU_TASK_H_ */
...@@ -40,12 +40,12 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -40,12 +40,12 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
f1ap_ue_context_setup_t *f1ap_ue_context_setup_req); f1ap_ue_context_setup_t *f1ap_ue_context_setup_req);
int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance, int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -54,7 +54,7 @@ int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance, ...@@ -54,7 +54,7 @@ int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance,
* UE Context Release Request (gNB-DU initiated) * UE Context Release Request (gNB-DU initiated)
*/ */
int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -65,7 +65,7 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, ...@@ -65,7 +65,7 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
f1ap_ue_context_release_cmd_t *cmd); f1ap_ue_context_release_cmd_t *cmd);
int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -75,11 +75,11 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, ...@@ -75,11 +75,11 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
f1ap_ue_context_setup_t *f1ap_ue_context_modification_req); f1ap_ue_context_setup_t *f1ap_ue_context_modification_req);
int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance, int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -87,7 +87,7 @@ int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance, ...@@ -87,7 +87,7 @@ int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
* UE Context Modification Required (gNB-DU initiated) * UE Context Modification Required (gNB-DU initiated)
*/ */
int CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance, int CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int CU_send_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, int CU_send_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
......
...@@ -51,7 +51,7 @@ int to_NRNRB(int nrb) { ...@@ -51,7 +51,7 @@ int to_NRNRB(int nrb) {
} }
int DU_handle_RESET(instance_t instance, int DU_handle_RESET(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
...@@ -66,7 +66,7 @@ int DU_send_RESET(instance_t instance, F1AP_Reset_t *Reset) { ...@@ -66,7 +66,7 @@ int DU_send_RESET(instance_t instance, F1AP_Reset_t *Reset) {
} }
int DU_handle_RESET_ACKNOWLEDGE(instance_t instance, int DU_handle_RESET_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
...@@ -82,7 +82,7 @@ int DU_send_ERROR_INDICATION(instance_t instance, F1AP_F1AP_PDU_t *pdu_p) { ...@@ -82,7 +82,7 @@ int DU_send_ERROR_INDICATION(instance_t instance, F1AP_F1AP_PDU_t *pdu_p) {
} }
int DU_handle_ERROR_INDICATION(instance_t instance, int DU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
...@@ -349,12 +349,12 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance) { ...@@ -349,12 +349,12 @@ 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);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0); f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0, -1);
return 0; return 0;
} }
int DU_handle_F1_SETUP_RESPONSE(instance_t instance, int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "DU_handle_F1_SETUP_RESPONSE\n"); LOG_D(F1AP, "DU_handle_F1_SETUP_RESPONSE\n");
...@@ -521,7 +521,7 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, ...@@ -521,7 +521,7 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
// SETUP FAILURE // SETUP FAILURE
int DU_handle_F1_SETUP_FAILURE(instance_t instance, int DU_handle_F1_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
LOG_E(F1AP, "DU_handle_F1_SETUP_FAILURE\n"); LOG_E(F1AP, "DU_handle_F1_SETUP_FAILURE\n");
...@@ -782,14 +782,14 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance, ...@@ -782,14 +782,14 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
} }
int DU_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance, int DU_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
} }
int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
...@@ -797,7 +797,7 @@ int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, ...@@ -797,7 +797,7 @@ int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
LOG_D(F1AP, "DU_handle_gNB_CU_CONFIGURATION_UPDATE\n"); LOG_D(F1AP, "DU_handle_gNB_CU_CONFIGURATION_UPDATE\n");
...@@ -986,7 +986,7 @@ int DU_send_gNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, ...@@ -986,7 +986,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);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0); f1ap_itti_send_sctp_data_req(false, instance, buffer, len, 0, -1);
return 0; return 0;
} }
...@@ -997,7 +997,7 @@ int DU_send_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance, ...@@ -997,7 +997,7 @@ int DU_send_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
} }
int DU_handle_gNB_DU_RESOURCE_COORDINATION_RESPONSE(instance_t instance, int DU_handle_gNB_DU_RESOURCE_COORDINATION_RESPONSE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(0, "Not implemented yet\n"); AssertFatal(0, "Not implemented yet\n");
......
...@@ -37,13 +37,13 @@ ...@@ -37,13 +37,13 @@
* Reset * Reset
*/ */
int DU_handle_RESET(instance_t instance, int DU_handle_RESET(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int DU_send_RESET_ACKKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *ResetAcknowledge); int DU_send_RESET_ACKKNOWLEDGE(instance_t instance, F1AP_ResetAcknowledge_t *ResetAcknowledge);
int DU_send_RESET(instance_t instance, F1AP_Reset_t *Reset); int DU_send_RESET(instance_t instance, F1AP_Reset_t *Reset);
int DU_handle_RESET_ACKNOWLEDGE(instance_t instance, int DU_handle_RESET_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -52,7 +52,7 @@ int DU_handle_RESET_ACKNOWLEDGE(instance_t instance, ...@@ -52,7 +52,7 @@ int DU_handle_RESET_ACKNOWLEDGE(instance_t instance,
*/ */
int DU_send_ERROR_INDICATION(instance_t instance, F1AP_F1AP_PDU_t *pdu_p); int DU_send_ERROR_INDICATION(instance_t instance, F1AP_F1AP_PDU_t *pdu_p);
int DU_handle_ERROR_INDICATION(instance_t instance, int DU_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -63,12 +63,12 @@ int DU_handle_ERROR_INDICATION(instance_t instance, ...@@ -63,12 +63,12 @@ int DU_handle_ERROR_INDICATION(instance_t instance,
int DU_send_F1_SETUP_REQUEST(instance_t instance); int DU_send_F1_SETUP_REQUEST(instance_t instance);
int DU_handle_F1_SETUP_RESPONSE(instance_t instance, int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int DU_handle_F1_SETUP_FAILURE(instance_t instance, int DU_handle_F1_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -80,12 +80,12 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance, ...@@ -80,12 +80,12 @@ int DU_send_gNB_DU_CONFIGURATION_UPDATE(instance_t instance,
f1ap_setup_req_t *f1ap_du_data); f1ap_setup_req_t *f1ap_du_data);
int DU_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance, int DU_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -93,7 +93,7 @@ int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, ...@@ -93,7 +93,7 @@ int DU_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
* gNB-CU Configuration Update * gNB-CU Configuration Update
*/ */
int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -112,7 +112,7 @@ int DU_send_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance, ...@@ -112,7 +112,7 @@ int DU_send_gNB_DU_RESOURCE_COORDINATION_REQUEST(instance_t instance,
F1AP_GNBDUResourceCoordinationRequest_t *GNBDUResourceCoordinationRequest); F1AP_GNBDUResourceCoordinationRequest_t *GNBDUResourceCoordinationRequest);
int DU_handle_gNB_DU_RESOURCE_COORDINATION_RESPONSE(instance_t instance, int DU_handle_gNB_DU_RESOURCE_COORDINATION_RESPONSE(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#include "openair2/RRC/LTE/rrc_proto.h" #include "openair2/RRC/LTE/rrc_proto.h"
int DU_handle_Paging(instance_t instance, int DU_handle_Paging(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
F1AP_Paging_t *paging; F1AP_Paging_t *paging;
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#define F1AP_DU_PAGING_H_ #define F1AP_DU_PAGING_H_
int DU_handle_Paging(instance_t instance, int DU_handle_Paging(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
/* DL RRC Message Transfer */ /* DL RRC Message Transfer */
int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
F1AP_DLRRCMessageTransfer_t *container; F1AP_DLRRCMessageTransfer_t *container;
...@@ -83,7 +83,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -83,7 +83,7 @@ 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(DUtype, instance, du_ue_f1ap_id)); // this should be the one transmitted via initial ul rrc message transfer f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id, 0)); // this should be the one transmitted via initial ul rrc message transfer
if (f1ap_du_add_cu_ue_id(instance,du_ue_f1ap_id, cu_ue_f1ap_id) < 0 ) { if (f1ap_du_add_cu_ue_id(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");
...@@ -142,7 +142,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -142,7 +142,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
f1ap_dl_rrc_message_t dl_rrc = { f1ap_dl_rrc_message_t dl_rrc = {
.rrc_container_length = ie->value.choice.RRCContainer.size, .rrc_container_length = ie->value.choice.RRCContainer.size,
.rrc_container = ie->value.choice.RRCContainer.buf, .rrc_container = ie->value.choice.RRCContainer.buf,
.rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id), .rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id, 0 /* assoc_id 0 in du */),
.srb_id = srb_id .srb_id = srb_id
}; };
int rc = dl_rrc_message(instance, &dl_rrc); int rc = dl_rrc_message(instance, &dl_rrc);
...@@ -153,7 +153,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -153,7 +153,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
AssertFatal(srb_id<3,"illegal srb_id\n"); AssertFatal(srb_id<3,"illegal srb_id\n");
MessageDef *msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION); MessageDef *msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION);
NRDuDlReq_t *req=&NRDuDlReq(msg); NRDuDlReq_t *req=&NRDuDlReq(msg);
req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id); req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id, 0 /* assoc_id 0 in du */);
req->srb_id=srb_id; req->srb_id=srb_id;
req->buf= get_free_mem_block( ie->value.choice.RRCContainer.size, __func__); req->buf= get_free_mem_block( ie->value.choice.RRCContainer.size, __func__);
memcpy(req->buf->data, ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size); memcpy(req->buf->data, ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size);
...@@ -190,7 +190,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -190,7 +190,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(DUtype, instance, rnti); ie->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, rnti, 0);
asn1cSeqAdd(&out->protocolIEs.list, ie); asn1cSeqAdd(&out->protocolIEs.list, ie);
/* mandatory */ /* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */ /* c2. GNB_DU_UE_F1AP_ID */
...@@ -198,7 +198,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -198,7 +198,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(DUtype, instance, rnti); ie->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, rnti, 0);
asn1cSeqAdd(&out->protocolIEs.list, ie); asn1cSeqAdd(&out->protocolIEs.list, ie);
/* mandatory */ /* mandatory */
/* c3. SRBID */ /* c3. SRBID */
...@@ -329,7 +329,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -329,7 +329,7 @@ int DU_send_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
} }
ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu); ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu);
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id); f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id, -1);
return 0; return 0;
} }
...@@ -346,7 +346,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP, ...@@ -346,7 +346,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
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 (DUtype, instanceP, rntiP); int f1ap_uid = f1ap_add_ue (DUtype, instanceP, rntiP, 0);
if (f1ap_uid < 0 ) { if (f1ap_uid < 0 ) {
LOG_E(F1AP, "Failed to add UE \n"); LOG_E(F1AP, "Failed to add UE \n");
...@@ -416,7 +416,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP, ...@@ -416,7 +416,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
return -1; return -1;
} }
f1ap_itti_send_sctp_data_req(false, instanceP, buffer, len, getCxt(DUtype, instanceP)->default_sctp_stream_id); f1ap_itti_send_sctp_data_req(false, instanceP, buffer, len, getCxt(DUtype, instanceP)->default_sctp_stream_id, -1);
return 0; return 0;
} }
...@@ -448,14 +448,14 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -448,14 +448,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(DUtype, instance, rnti); ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, rnti, 0);
/* 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(DUtype, instance, rnti); ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, rnti, 0);
/* mandatory */ /* mandatory */
/* c3. SRBID */ /* c3. SRBID */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie3); asn1cSequenceAdd(out->protocolIEs.list, F1AP_ULRRCMessageTransferIEs_t, ie3);
...@@ -480,6 +480,6 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance, ...@@ -480,6 +480,6 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
return -1; return -1;
} }
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id); f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(DUtype, instance)->default_sctp_stream_id, -1);
return 0; return 0;
} }
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#include "f1ap_common.h" #include "f1ap_common.h"
int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance, int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
......
...@@ -64,7 +64,7 @@ bool lteDURecvCb(protocol_ctxt_t *ctxt_pP, ...@@ -64,7 +64,7 @@ bool lteDURecvCb(protocol_ctxt_t *ctxt_pP,
} }
int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
MessageDef *msg_p; // message to RRC MessageDef *msg_p; // message to RRC
...@@ -89,11 +89,11 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -89,11 +89,11 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
f1ap_ue_context_setup_req->gNB_DU_ue_id = f1ap_ue_context_setup_req->gNB_DU_ue_id =
ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID; ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID;
f1ap_ue_context_setup_req->rnti = f1ap_ue_context_setup_req->rnti =
f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_DU_ue_id); f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_DU_ue_id, 0);
} else { } else {
f1ap_ue_context_setup_req->gNB_DU_ue_id = -1; f1ap_ue_context_setup_req->gNB_DU_ue_id = -1;
f1ap_ue_context_setup_req->rnti = f1ap_ue_context_setup_req->rnti =
f1ap_get_rnti_by_cu_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_CU_ue_id); f1ap_get_rnti_by_cu_id(DUtype, instance, f1ap_ue_context_setup_req->gNB_CU_ue_id, assoc_id);
} }
if(f1ap_ue_context_setup_req->rnti<0) if(f1ap_ue_context_setup_req->rnti<0)
...@@ -256,7 +256,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup ...@@ -256,7 +256,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
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_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; ie2->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti); ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti, resp->assoc_id);
/* mandatory */ /* mandatory */
/* c3. DUtoCURRCInformation */ /* c3. DUtoCURRCInformation */
...@@ -568,7 +568,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup ...@@ -568,7 +568,8 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
f1ap_itti_send_sctp_data_req(false, instance, f1ap_itti_send_sctp_data_req(false, instance,
buffer, buffer,
len, len,
getCxt(false, instance)->default_sctp_stream_id); getCxt(false, instance)->default_sctp_stream_id,
-1);
return 0; return 0;
} }
...@@ -595,14 +596,14 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, ...@@ -595,14 +596,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(DUtype, instance, req->rnti); ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, req->rnti, req->assoc_id);
/* 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(DUtype, instance, req->rnti); ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, req->rnti, req->assoc_id);
/* mandatory */ /* mandatory */
/* c3. Cause */ /* c3. Cause */
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie3); asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseRequestIEs_t, ie3);
...@@ -646,12 +647,13 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, ...@@ -646,12 +647,13 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
f1ap_itti_send_sctp_data_req(false, instance, f1ap_itti_send_sctp_data_req(false, instance,
buffer, buffer,
len, len,
getCxt(false, instance)->default_sctp_stream_id); getCxt(false, instance)->default_sctp_stream_id,
-1);
return 0; return 0;
} }
int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
F1AP_UEContextReleaseCommand_t *container; F1AP_UEContextReleaseCommand_t *container;
...@@ -668,12 +670,12 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, ...@@ -668,12 +670,12 @@ 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);
f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID); f1ap_ue_context_release_cmd->rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID, assoc_id);
// 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(DUtype, instance, const rnti_t rnti = f1ap_get_rnti_by_du_id(DUtype, instance,
ie->value.choice.GNB_DU_UE_F1AP_ID); ie->value.choice.GNB_DU_UE_F1AP_ID, 0);
AssertFatal(f1ap_ue_context_release_cmd->rnti == rnti, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n", rnti, f1ap_ue_context_release_cmd->rnti); AssertFatal(f1ap_ue_context_release_cmd->rnti == rnti, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n", rnti, f1ap_ue_context_release_cmd->rnti);
// We don't need the Cause // We don't need the Cause
...@@ -730,14 +732,14 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, ...@@ -730,14 +732,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(DUtype, instance, cplt->rnti); ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(DUtype, instance, cplt->rnti, cplt->assoc_id);
/* 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(DUtype, instance, cplt->rnti); ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, cplt->rnti, cplt->assoc_id);
/* optional -> currently not used */ /* optional -> currently not used */
/* c3. CriticalityDiagnostics */ /* c3. CriticalityDiagnostics */
//if (0) { //if (0) {
...@@ -798,7 +800,8 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, ...@@ -798,7 +800,8 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
f1ap_itti_send_sctp_data_req(false, instance, f1ap_itti_send_sctp_data_req(false, instance,
buffer, buffer,
len, len,
getCxt(false, instance)->default_sctp_stream_id); getCxt(false, instance)->default_sctp_stream_id,
-1);
f1ap_remove_ue(DUtype, instance, cplt->rnti); f1ap_remove_ue(DUtype, instance, cplt->rnti);
return 0; return 0;
} }
...@@ -814,7 +817,7 @@ static instance_t du_create_gtpu_instance_to_cu(char *CUaddr, uint16_t CUport, c ...@@ -814,7 +817,7 @@ static instance_t du_create_gtpu_instance_to_cu(char *CUaddr, uint16_t CUport, c
} }
int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
...@@ -839,7 +842,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, ...@@ -839,7 +842,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDU_UE, container, F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t, ieDU_UE, container,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
f1ap_ue_context_modification_req->gNB_DU_ue_id = ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID; f1ap_ue_context_modification_req->gNB_DU_ue_id = ieDU_UE->value.choice.GNB_DU_UE_F1AP_ID;
f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id); f1ap_ue_context_modification_req->rnti = f1ap_get_rnti_by_du_id(DUtype, instance, f1ap_ue_context_modification_req->gNB_DU_ue_id, 0);
if(f1ap_ue_context_modification_req->rnti<0) if(f1ap_ue_context_modification_req->rnti<0)
LOG_E(F1AP, "Could not retrieve UE rnti based on the DU UE id \n"); LOG_E(F1AP, "Could not retrieve UE rnti based on the DU UE id \n");
...@@ -1004,7 +1007,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_contex ...@@ -1004,7 +1007,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_contex
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_UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID; ie2->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti); ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(DUtype, instance, resp->rnti, resp->assoc_id);
/* optional */ /* optional */
/* c3. ResourceCoordinationTransferContainer */ /* c3. ResourceCoordinationTransferContainer */
...@@ -1297,7 +1300,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_contex ...@@ -1297,7 +1300,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_contex
return -1; return -1;
} }
f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id); f1ap_itti_send_sctp_data_req(false, instance, buffer, len, getCxt(false, instance)->default_sctp_stream_id, -1);
return 0; return 0;
} }
...@@ -1308,7 +1311,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance) { ...@@ -1308,7 +1311,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
} }
int DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, int DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu) { F1AP_F1AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n"); AssertFatal(1==0,"Not implemented yet\n");
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *req); int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *req);
int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int DU_send_UE_CONTEXT_SETUP_FAILURE(instance_t instance); int DU_send_UE_CONTEXT_SETUP_FAILURE(instance_t instance);
...@@ -56,7 +56,7 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, ...@@ -56,7 +56,7 @@ int DU_send_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
* UE Context Release Command (gNB-CU initiated) * UE Context Release Command (gNB-CU initiated)
*/ */
int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
...@@ -71,7 +71,7 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, ...@@ -71,7 +71,7 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
* UE Context Modification (gNB-CU initiated) * UE Context Modification (gNB-CU initiated)
*/ */
int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp); int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_context_setup_t *resp);
...@@ -83,7 +83,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance); ...@@ -83,7 +83,7 @@ int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance);
*/ */
int DU_send_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance); int DU_send_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance);
int DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, int DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
uint32_t assoc_id, int assoc_id,
uint32_t stream, uint32_t stream,
F1AP_F1AP_PDU_t *pdu); F1AP_F1AP_PDU_t *pdu);
......
...@@ -80,7 +80,7 @@ const char *f1ap_direction2String(int f1ap_dir) { ...@@ -80,7 +80,7 @@ const char *f1ap_direction2String(int f1ap_dir) {
return(f1ap_direction_String[f1ap_dir]); return(f1ap_direction_String[f1ap_dir]);
} }
int f1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream, int f1ap_handle_message(instance_t instance, int assoc_id, int32_t stream,
const uint8_t *const data, const uint32_t data_length) { const uint8_t *const data, const uint32_t data_length) {
F1AP_F1AP_PDU_t pdu= {0}; F1AP_F1AP_PDU_t pdu= {0};
int ret; int ret;
......
...@@ -23,12 +23,12 @@ ...@@ -23,12 +23,12 @@
#include "f1ap_itti_messaging.h" #include "f1ap_itti_messaging.h"
void f1ap_itti_send_sctp_data_req(bool isCu, instance_t instance, 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, int assoc_id) {
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(isCu?TASK_CU_F1:TASK_DU_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 = f1ap_assoc_id(isCu,instance); sctp_data_req->assoc_id = isCu ? assoc_id : f1ap_assoc_id(isCu,instance);
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;
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#define F1AP_ITTI_MESSAGING_H_ #define F1AP_ITTI_MESSAGING_H_
void f1ap_itti_send_sctp_data_req(bool isCu,instance_t instance, 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, int assoc_id);
void f1ap_eNB_itti_send_sctp_close_association(bool isCu,instance_t instance); void f1ap_eNB_itti_send_sctp_close_association(bool isCu,instance_t instance);
......
...@@ -629,6 +629,9 @@ void nr_initiate_ra_proc(module_id_t module_idP, ...@@ -629,6 +629,9 @@ void nr_initiate_ra_proc(module_id_t module_idP,
do { do {
// 3GPP TS 38.321 version 15.13.0 Section 7.1 Table 7.1-1: RNTI values // 3GPP TS 38.321 version 15.13.0 Section 7.1 Table 7.1-1: RNTI values
ra->rnti = (taus() % 0xffef) + 1; ra->rnti = (taus() % 0xffef) + 1;
static int next_id = 0x1000;
ra->rnti = next_id;
next_id++;
loop++; loop++;
} while (loop != 100 } while (loop != 100
&& !((find_nr_UE(&nr_mac->UE_info, ra->rnti) == NULL) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1) && !((find_nr_UE(&nr_mac->UE_info, ra->rnti) == NULL) && (find_nr_RA_id(module_idP, CC_id, ra->rnti) == -1)
......
...@@ -118,7 +118,7 @@ int dl_rrc_message_rrcSetup(module_id_t module_id, const f1ap_dl_rrc_message_t * ...@@ -118,7 +118,7 @@ int dl_rrc_message_rrcSetup(module_id_t module_id, const f1ap_dl_rrc_message_t *
/* TODO: drop the RRC context */ /* TODO: drop the RRC context */
gNB_RRC_INST *rrc = RC.nrrrc[module_id]; gNB_RRC_INST *rrc = RC.nrrrc[module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, dl_rrc->rnti); struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, dl_rrc->rnti, dl_rrc->assoc_id);
gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context; gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
ue_p->SRB_configList = rrcSetup_ies->radioBearerConfig.srb_ToAddModList; ue_p->SRB_configList = rrcSetup_ies->radioBearerConfig.srb_ToAddModList;
ue_p->masterCellGroup = cellGroup; ue_p->masterCellGroup = cellGroup;
......
...@@ -254,6 +254,7 @@ bool pdcp_data_req(protocol_ctxt_t *ctxt_pP, ...@@ -254,6 +254,7 @@ bool pdcp_data_req(protocol_ctxt_t *ctxt_pP,
const uint32_t * destinationL2Id); const uint32_t * destinationL2Id);
bool cu_f1u_data_req(protocol_ctxt_t *ctxt_pP, bool cu_f1u_data_req(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP, const srb_flag_t srb_flagP,
const rb_id_t rb_id, const rb_id_t rb_id,
const mui_t muiP, const mui_t muiP,
......
...@@ -32,7 +32,7 @@ void e1_add_drb(int is_gnb, ...@@ -32,7 +32,7 @@ void e1_add_drb(int is_gnb,
unsigned char *ciphering_key, unsigned char *ciphering_key,
unsigned char *integrity_key) unsigned char *integrity_key)
{ {
add_drb_am(is_gnb, ue_id, 0, s, ciphering_algorithm, integrity_algorithm, add_drb_am(is_gnb, ue_id, 0 /* assoc_id */, 0, s, ciphering_algorithm, integrity_algorithm,
ciphering_key, integrity_key); ciphering_key, integrity_key);
LOG_I(PDCP, "%s:%s:%d: added DRB for UE ID %ld\n", __FILE__, __FUNCTION__, __LINE__, ue_id); LOG_I(PDCP, "%s:%s:%d: added DRB for UE ID %ld\n", __FILE__, __FUNCTION__, __LINE__, ue_id);
} }
......
...@@ -45,7 +45,7 @@ void nr_pdcp_e1_add_drbs(eNB_flag_t enb_flag, ...@@ -45,7 +45,7 @@ void nr_pdcp_e1_add_drbs(eNB_flag_t enb_flag,
uint8_t *const kUPenc, uint8_t *const kUPenc,
uint8_t *const kUPint); uint8_t *const kUPint);
void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s, void add_drb_am(int is_gnb, ue_id_t rntiMaybeUEid, int assoc_id, ue_id_t reestablish_ue_id, struct NR_DRB_ToAddMod *s,
int ciphering_algorithm, int ciphering_algorithm,
int integrity_algorithm, int integrity_algorithm,
unsigned char *ciphering_key, unsigned char *ciphering_key,
......
This diff is collapsed.
...@@ -76,17 +76,18 @@ void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *_m) ...@@ -76,17 +76,18 @@ void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *_m)
} }
/* must be called with lock acquired */ /* must be called with lock acquired */
nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid) nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id)
{ {
/* TODO: optimze */ /* TODO: optimze */
nr_pdcp_ue_manager_internal_t *m = _m; nr_pdcp_ue_manager_internal_t *m = _m;
int i; int i;
for (i = 0; i < m->ue_count; i++) for (i = 0; i < m->ue_count; i++)
if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid) if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid
&& m->ue_list[i]->f1ap_assoc_id == f1ap_assoc_id)
return m->ue_list[i]; return m->ue_list[i];
LOG_D(PDCP, "%s:%d:%s: new UE ID/RNTI 0x%" PRIx64 "\n", __FILE__, __LINE__, __FUNCTION__, rntiMaybeUEid); LOG_D(PDCP, "new UE ID/RNTI 0x%" PRIx64 " assoc_id %d\n", rntiMaybeUEid, f1ap_assoc_id);
m->ue_count++; m->ue_count++;
m->ue_list = realloc(m->ue_list, sizeof(nr_pdcp_ue_t *) * m->ue_count); m->ue_list = realloc(m->ue_list, sizeof(nr_pdcp_ue_t *) * m->ue_count);
...@@ -101,12 +102,13 @@ nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybe ...@@ -101,12 +102,13 @@ nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybe
} }
m->ue_list[m->ue_count - 1]->rntiMaybeUEid = rntiMaybeUEid; m->ue_list[m->ue_count - 1]->rntiMaybeUEid = rntiMaybeUEid;
m->ue_list[m->ue_count-1]->f1ap_assoc_id = f1ap_assoc_id;
return m->ue_list[m->ue_count-1]; return m->ue_list[m->ue_count-1];
} }
/* must be called with lock acquired */ /* must be called with lock acquired */
void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid) void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id)
{ {
nr_pdcp_ue_manager_internal_t *m = _m; nr_pdcp_ue_manager_internal_t *m = _m;
nr_pdcp_ue_t *ue; nr_pdcp_ue_t *ue;
...@@ -114,7 +116,8 @@ void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid) ...@@ -114,7 +116,8 @@ void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, ue_id_t rntiMaybeUEid)
int j; int j;
for (i = 0; i < m->ue_count; i++) for (i = 0; i < m->ue_count; i++)
if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid) if (m->ue_list[i]->rntiMaybeUEid == rntiMaybeUEid
&& m->ue_list[i]->f1ap_assoc_id == f1ap_assoc_id)
break; break;
if (i == m->ue_count) { if (i == m->ue_count) {
...@@ -210,3 +213,12 @@ bool nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager_t *_m, ue_id_t *ret) ...@@ -210,3 +213,12 @@ bool nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager_t *_m, ue_id_t *ret)
*ret = m->ue_list[0]->rntiMaybeUEid; *ret = m->ue_list[0]->rntiMaybeUEid;
return true; return true;
} }
int nr_pdcp_get_first_rnti_assoc_id(nr_pdcp_ue_manager_t *_m, int rnti)
{
nr_pdcp_ue_manager_internal_t *m = _m;
if (m->ue_count == 0)
return -1;
AssertFatal(m->ue_list[0]->rntiMaybeUEid == rnti, "bad rnti\n");
return m->ue_list[0]->f1ap_assoc_id;
}
...@@ -30,6 +30,7 @@ typedef void nr_pdcp_ue_manager_t; ...@@ -30,6 +30,7 @@ typedef void nr_pdcp_ue_manager_t;
typedef struct nr_pdcp_ue_t { typedef struct nr_pdcp_ue_t {
ue_id_t rntiMaybeUEid; ue_id_t rntiMaybeUEid;
int f1ap_assoc_id;
nr_pdcp_entity_t *srb[3]; nr_pdcp_entity_t *srb[3];
nr_pdcp_entity_t *drb[MAX_DRBS_PER_UE]; nr_pdcp_entity_t *drb[MAX_DRBS_PER_UE];
} nr_pdcp_ue_t; } nr_pdcp_ue_t;
...@@ -45,8 +46,8 @@ int nr_pdcp_manager_get_enb_flag(nr_pdcp_ue_manager_t *m); ...@@ -45,8 +46,8 @@ int nr_pdcp_manager_get_enb_flag(nr_pdcp_ue_manager_t *m);
void nr_pdcp_manager_lock(nr_pdcp_ue_manager_t *m); void nr_pdcp_manager_lock(nr_pdcp_ue_manager_t *m);
void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *m); void nr_pdcp_manager_unlock(nr_pdcp_ue_manager_t *m);
nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid); nr_pdcp_ue_t *nr_pdcp_manager_get_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id);
void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid); void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *m, ue_id_t rntiMaybeUEid, int f1ap_assoc_id);
nr_pdcp_ue_t **nr_pdcp_manager_get_ue_list(nr_pdcp_ue_manager_t *_m); nr_pdcp_ue_t **nr_pdcp_manager_get_ue_list(nr_pdcp_ue_manager_t *_m);
int nr_pdcp_manager_get_ue_count(nr_pdcp_ue_manager_t *_m); int nr_pdcp_manager_get_ue_count(nr_pdcp_ue_manager_t *_m);
...@@ -67,4 +68,7 @@ void nr_pdcp_ue_add_drb_pdcp_entity(nr_pdcp_ue_t *ue, int drb_id, ...@@ -67,4 +68,7 @@ void nr_pdcp_ue_add_drb_pdcp_entity(nr_pdcp_ue_t *ue, int drb_id,
/* returns 0 if no UE, 1 otherwise */ /* returns 0 if no UE, 1 otherwise */
bool nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager_t *m, ue_id_t *ret); bool nr_pdcp_get_first_ue_id(nr_pdcp_ue_manager_t *m, ue_id_t *ret);
/* returns -1 if no UE */
int nr_pdcp_get_first_rnti_assoc_id(nr_pdcp_ue_manager_t *m, int rnti);
#endif /* _NR_PDCP_UE_MANAGER_H_ */ #endif /* _NR_PDCP_UE_MANAGER_H_ */
...@@ -546,6 +546,7 @@ rb_found: ...@@ -546,6 +546,7 @@ rb_found:
req->length=size; req->length=size;
req->offset=0; req->offset=0;
req->ue_id=ue->rnti; req->ue_id=ue->rnti;
req->assoc_id = 0;
req->bearer_id=rb_id; req->bearer_id=rb_id;
LOG_D(RLC, "Received uplink user-plane traffic at RLC-DU to be sent to the CU, size %d \n", size); LOG_D(RLC, "Received uplink user-plane traffic at RLC-DU to be sent to the CU, size %d \n", size);
extern instance_t DUuniqInstance; extern instance_t DUuniqInstance;
...@@ -562,8 +563,9 @@ rb_found: ...@@ -562,8 +563,9 @@ rb_found:
} }
memcpy(memblock->data, buf, size); memcpy(memblock->data, buf, size);
LOG_D(PDCP, "Calling PDCP layer from RLC in %s\n", __FUNCTION__); LOG_D(PDCP, "Calling PDCP layer from RLC in %s\n", __FUNCTION__);
if (!pdcp_data_ind(&ctx, is_srb, 0, rb_id, size, memblock, NULL, NULL)) { AssertFatal(!(NODE_IS_CU(RC.nrrrc[0]->node_type)), "CU should not call this\n");
LOG_E(RLC, "%s:%d:%s: ERROR: pdcp_data_ind failed\n", __FILE__, __LINE__, __FUNCTION__); if (!nr_pdcp_data_ind(&ctx, 0, is_srb, 0, rb_id, size, memblock, NULL, NULL)) {
LOG_E(RLC, "%s:%d:%s: ERROR: nr_pdcp_data_ind failed\n", __FILE__, __LINE__, __FUNCTION__);
/* what to do in case of failure? for the moment: nothing */ /* what to do in case of failure? for the moment: nothing */
} }
} }
......
...@@ -59,6 +59,7 @@ nr_rrc_mac_remove_ue(module_id_t mod_idP, ...@@ -59,6 +59,7 @@ nr_rrc_mac_remove_ue(module_id_t mod_idP,
uint8_t uint8_t
nr_rrc_data_req( nr_rrc_data_req(
const protocol_ctxt_t *const ctxt_pP, const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const rb_id_t rb_idP, const rb_id_t rb_idP,
const mui_t muiP, const mui_t muiP,
const confirm_t confirmP, const confirm_t confirmP,
...@@ -77,24 +78,25 @@ nr_rrc_data_req( ...@@ -77,24 +78,25 @@ nr_rrc_data_req(
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
sdu_sizeP); sdu_sizeP);
memcpy (message_buffer, buffer_pP, sdu_sizeP); memcpy (message_buffer, buffer_pP, sdu_sizeP);
message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_UE, 0, RRC_DCCH_DATA_REQ); message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_GNB : TASK_RRC_UE, 0, NR_RRC_DCCH_DATA_REQ);
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame; NR_RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag; NR_RRC_DCCH_DATA_REQ (message_p).gnb_flag = ctxt_pP->enb_flag;
RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP; NR_RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
RRC_DCCH_DATA_REQ (message_p).muip = muiP; NR_RRC_DCCH_DATA_REQ (message_p).muip = muiP;
RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP; NR_RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP; NR_RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer; NR_RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
//memcpy (NR_RRC_DCCH_DATA_REQ (message_p).sdu_p, buffer_pP, sdu_sizeP); //memcpy (NR_NR_RRC_DCCH_DATA_REQ (message_p).sdu_p, buffer_pP, sdu_sizeP);
RRC_DCCH_DATA_REQ (message_p).mode = modeP; NR_RRC_DCCH_DATA_REQ (message_p).mode = modeP;
RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id; NR_RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
RRC_DCCH_DATA_REQ(message_p).rnti = ctxt_pP->rntiMaybeUEid; NR_RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rntiMaybeUEid;
RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index; NR_RRC_DCCH_DATA_REQ (message_p).assoc_id = assoc_id;
NR_RRC_DCCH_DATA_REQ (message_p).gNB_index = ctxt_pP->eNB_index;
itti_send_msg_to_task ( itti_send_msg_to_task (
ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE,
ctxt_pP->instance, ctxt_pP->instance,
message_p); message_p);
LOG_I(NR_RRC,"send RRC_DCCH_DATA_REQ to PDCP\n"); LOG_I(NR_RRC,"send NR_RRC_DCCH_DATA_REQ to PDCP\n");
/* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads /* Hack: only trigger PDCP if in CU, otherwise it is triggered by RU threads
* Ideally, PDCP would not neet to be triggered like this but react to ITTI * Ideally, PDCP would not neet to be triggered like this but react to ITTI
...@@ -163,7 +165,7 @@ int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP, ...@@ -163,7 +165,7 @@ int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP,
const int dl_bwp_id, const int dl_bwp_id,
const int ul_bwp_id) { const int ul_bwp_id) {
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[module_idP], rntiP); struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[module_idP], rntiP, 0 /* no assoc_id in mac, let's use 0 */);
protocol_ctxt_t ctxt; protocol_ctxt_t ctxt;
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP, 0); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP, 0);
...@@ -180,7 +182,7 @@ void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP, ...@@ -180,7 +182,7 @@ void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
struct rrc_gNB_ue_context_s *ue_context_p = NULL; struct rrc_gNB_ue_context_s *ue_context_p = NULL;
ue_context_p = rrc_gNB_get_ue_context( ue_context_p = rrc_gNB_get_ue_context(
RC.nrrrc[Mod_instP], RC.nrrrc[Mod_instP],
rntiP); rntiP, 0 /* no assoc_id in mac, let's use 0 */);
if (ue_context_p != NULL) { if (ue_context_p != NULL) {
LOG_D(RRC,"Frame %d, Subframe %d: UE %x UL failure, activating timer\n",frameP,subframeP,rntiP); LOG_D(RRC,"Frame %d, Subframe %d: UE %x UL failure, activating timer\n",frameP,subframeP,rntiP);
...@@ -196,7 +198,7 @@ void nr_mac_gNB_rrc_ul_failure_reset(const module_id_t Mod_instP, ...@@ -196,7 +198,7 @@ void nr_mac_gNB_rrc_ul_failure_reset(const module_id_t Mod_instP,
const sub_frame_t subframeP, const sub_frame_t subframeP,
const rnti_t rntiP) { const rnti_t rntiP) {
struct rrc_gNB_ue_context_s *ue_context_p = NULL; struct rrc_gNB_ue_context_s *ue_context_p = NULL;
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_instP], rntiP); ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[Mod_instP], rntiP, 0 /* no assoc_id in mac, let's use 0 */);
if (ue_context_p != NULL) { if (ue_context_p != NULL) {
LOG_W(RRC,"Frame %d, Subframe %d: UE %x UL failure reset, deactivating timer\n",frameP,subframeP,rntiP); LOG_W(RRC,"Frame %d, Subframe %d: UE %x UL failure reset, deactivating timer\n",frameP,subframeP,rntiP);
ue_context_p->ue_context.ul_failure_timer=0; ue_context_p->ue_context.ul_failure_timer=0;
......
...@@ -593,7 +593,7 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier, ...@@ -593,7 +593,7 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
gNB_RrcConfigurationReq *configuration) { gNB_RrcConfigurationReq *configuration) {
asn_enc_rval_t enc_rval; asn_enc_rval_t enc_rval;
SystemInformation_IEs__sib_TypeAndInfo__Member *sib2 = NULL; SystemInformation_IEs__sib_TypeAndInfo__Member *sib2 = NULL;
SystemInformation_IEs__sib_TypeAndInfo__Member *sib3 = NULL; //SystemInformation_IEs__sib_TypeAndInfo__Member *sib3 = NULL;
NR_BCCH_DL_SCH_Message_t *sib_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t)); NR_BCCH_DL_SCH_Message_t *sib_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t));
sib_message->message.present = NR_BCCH_DL_SCH_MessageType_PR_c1; sib_message->message.present = NR_BCCH_DL_SCH_MessageType_PR_c1;
...@@ -610,7 +610,7 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier, ...@@ -610,7 +610,7 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
sib2->present = NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2; sib2->present = NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2;
sib2->choice.sib2 = CALLOC(1, sizeof(struct NR_SIB2)); sib2->choice.sib2 = CALLOC(1, sizeof(struct NR_SIB2));
sib2->choice.sib2->cellReselectionInfoCommon.q_Hyst = NR_SIB2__cellReselectionInfoCommon__q_Hyst_dB1; sib2->choice.sib2->cellReselectionInfoCommon.q_Hyst = NR_SIB2__cellReselectionInfoCommon__q_Hyst_dB1;
sib2->choice.sib2->cellReselectionServingFreqInfo.threshServingLowP = 2; // INTEGER (0..31) sib2->choice.sib2->cellReselectionServingFreqInfo.threshServingLowP = 31; //2; // INTEGER (0..31)
sib2->choice.sib2->cellReselectionServingFreqInfo.cellReselectionPriority = 2; // INTEGER (0..7) sib2->choice.sib2->cellReselectionServingFreqInfo.cellReselectionPriority = 2; // INTEGER (0..7)
sib2->choice.sib2->intraFreqCellReselectionInfo.q_RxLevMin = -50; // INTEGER (-70..-22) sib2->choice.sib2->intraFreqCellReselectionInfo.q_RxLevMin = -50; // INTEGER (-70..-22)
sib2->choice.sib2->intraFreqCellReselectionInfo.s_IntraSearchP = 2; // INTEGER (0..31) sib2->choice.sib2->intraFreqCellReselectionInfo.s_IntraSearchP = 2; // INTEGER (0..31)
...@@ -618,10 +618,12 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier, ...@@ -618,10 +618,12 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
sib2->choice.sib2->intraFreqCellReselectionInfo.deriveSSB_IndexFromCell = true; sib2->choice.sib2->intraFreqCellReselectionInfo.deriveSSB_IndexFromCell = true;
asn1cSeqAdd(&ies->sib_TypeAndInfo.list, sib2); asn1cSeqAdd(&ies->sib_TypeAndInfo.list, sib2);
#if 0
sib3 = CALLOC(1, sizeof(SystemInformation_IEs__sib_TypeAndInfo__Member)); sib3 = CALLOC(1, sizeof(SystemInformation_IEs__sib_TypeAndInfo__Member));
sib3->present = NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3; sib3->present = NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3;
sib3->choice.sib3 = CALLOC(1, sizeof(struct NR_SIB3)); sib3->choice.sib3 = CALLOC(1, sizeof(struct NR_SIB3));
asn1cSeqAdd(&ies->sib_TypeAndInfo.list, sib3); asn1cSeqAdd(&ies->sib_TypeAndInfo.list, sib3);
#endif
//encode SIB to data //encode SIB to data
// carrier->SIB23 = (uint8_t *) malloc16(128); // carrier->SIB23 = (uint8_t *) malloc16(128);
...@@ -632,6 +634,15 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier, ...@@ -632,6 +634,15 @@ uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier,
100); 100);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
enc_rval.failed_type->name, enc_rval.encoded); enc_rval.failed_type->name, enc_rval.encoded);
{
int i;
printf("do_SIB23_NR[%d]", (int)(enc_rval.encoded+7)/8);
for (i = 0; i < (enc_rval.encoded+7)/8; i++) printf(" %2.2x", (unsigned char)carrier->SIB23[i]);
printf("\n");
fflush(stdout);
}
return((enc_rval.encoded+7)/8); return((enc_rval.encoded+7)/8);
} }
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "common/ran_context.h" #include "common/ran_context.h"
#include "openair2/F1AP/f1ap_common.h" #include "openair2/F1AP/f1ap_common.h"
#include "openair2/E1AP/e1ap_common.h" #include "openair2/E1AP/e1ap_common.h"
#include "openair2/F1AP/f1ap_cu_task.h"
extern RAN_CONTEXT_t RC; extern RAN_CONTEXT_t RC;
void fill_e1ap_bearer_setup_resp(e1ap_bearer_setup_resp_t *resp, void fill_e1ap_bearer_setup_resp(e1ap_bearer_setup_resp_t *resp,
...@@ -60,6 +61,7 @@ void fill_e1ap_bearer_setup_resp(e1ap_bearer_setup_resp_t *resp, ...@@ -60,6 +61,7 @@ void fill_e1ap_bearer_setup_resp(e1ap_bearer_setup_resp_t *resp,
drbSetup->UpParamList[0].tlAddress = my_addr; drbSetup->UpParamList[0].tlAddress = my_addr;
drbSetup->UpParamList[0].teId = newGtpuCreateTunnel(gtpInst, drbSetup->UpParamList[0].teId = newGtpuCreateTunnel(gtpInst,
(ue_id & 0xFFFF), (ue_id & 0xFFFF),
req->assoc_id,
drb2Setup->id, drb2Setup->id,
drb2Setup->id, drb2Setup->id,
0xFFFF, // We will set the right value from DU answer 0xFFFF, // We will set the right value from DU answer
...@@ -91,6 +93,7 @@ void CU_update_UP_DL_tunnel(e1ap_bearer_setup_req_t *const req, instance_t insta ...@@ -91,6 +93,7 @@ void CU_update_UP_DL_tunnel(e1ap_bearer_setup_req_t *const req, instance_t insta
GtpuUpdateTunnelOutgoingAddressAndTeid(instance, GtpuUpdateTunnelOutgoingAddressAndTeid(instance,
(ue_id & 0xFFFF), (ue_id & 0xFFFF),
req->assoc_id,
(ebi_t)drb_p->id, (ebi_t)drb_p->id,
*(in_addr_t*)&newRemoteAddr.buffer, *(in_addr_t*)&newRemoteAddr.buffer,
drb_p->DlUpParamList[0].teId); drb_p->DlUpParamList[0].teId);
...@@ -119,6 +122,7 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p, ...@@ -119,6 +122,7 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
create_tunnel_req.num_tunnels = 1; create_tunnel_req.num_tunnels = 1;
create_tunnel_req.ue_id = ue_context_p->ue_context.rnti; create_tunnel_req.ue_id = ue_context_p->ue_context.rnti;
create_tunnel_req.assoc_id = req->assoc_id;
int ret = gtpv1u_create_ngu_tunnel(getCxtE1(instance)->gtpInstN3, &create_tunnel_req, &create_tunnel_resp); int ret = gtpv1u_create_ngu_tunnel(getCxtE1(instance)->gtpInstN3, &create_tunnel_req, &create_tunnel_resp);
if (ret != 0) { if (ret != 0) {
...@@ -153,14 +157,14 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p, ...@@ -153,14 +157,14 @@ static int drb_config_gtpu_create(const protocol_ctxt_t *const ctxt_p,
LOG_D(NR_RRC,"Configuring PDCP DRBs/SRBs for UE %x\n",ue_context_p->ue_context.rnti); LOG_D(NR_RRC,"Configuring PDCP DRBs/SRBs for UE %x\n",ue_context_p->ue_context.rnti);
nr_pdcp_add_srbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, nr_pdcp_add_srbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, req->assoc_id,
SRB_configList, SRB_configList,
(ue_context_p->ue_context.integrity_algorithm << 4) (ue_context_p->ue_context.integrity_algorithm << 4)
| ue_context_p->ue_context.ciphering_algorithm, | ue_context_p->ue_context.ciphering_algorithm,
kRRCenc, kRRCenc,
kRRCint); kRRCint);
nr_pdcp_add_drbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, 0, nr_pdcp_add_drbs(ctxt_p->enb_flag, ctxt_p->rntiMaybeUEid, req->assoc_id, 0,
DRB_configList, DRB_configList,
(ue_context_p->ue_context.integrity_algorithm << 4) (ue_context_p->ue_context.integrity_algorithm << 4)
| ue_context_p->ue_context.ciphering_algorithm, | ue_context_p->ue_context.ciphering_algorithm,
...@@ -187,7 +191,7 @@ static NR_SRB_ToAddModList_t **generateSRB2_confList(gNB_RRC_UE_t *ue, NR_SRB_To ...@@ -187,7 +191,7 @@ static NR_SRB_ToAddModList_t **generateSRB2_confList(gNB_RRC_UE_t *ue, NR_SRB_To
return SRB_configList2; return SRB_configList2;
} }
static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) { static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) {
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti); rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti, req->assoc_id);
protocol_ctxt_t ctxt = {0}; protocol_ctxt_t ctxt = {0};
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);
...@@ -206,7 +210,7 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const ...@@ -206,7 +210,7 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
e1ap_bearer_setup_resp_t resp; // Used to store teids e1ap_bearer_setup_resp_t resp; // Used to store teids
int remote_port = RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd; int remote_port = RC.nrrrc[ctxt.module_id]->eth_params_s.remote_portd;
in_addr_t my_addr = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr); in_addr_t my_addr = inet_addr(RC.nrrrc[ctxt.module_id]->eth_params_s.my_addr);
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst; instance_t gtpInst = f1ap_cu_assoc_id_to_context(req->assoc_id)->gtpInst;
// GTP tunnel for DL // GTP tunnel for DL
fill_e1ap_bearer_setup_resp(&resp, req, gtpInst, ue_context_p->ue_context.rnti, remote_port, my_addr); fill_e1ap_bearer_setup_resp(&resp, req, gtpInst, ue_context_p->ue_context.rnti, remote_port, my_addr);
...@@ -215,7 +219,7 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const ...@@ -215,7 +219,7 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
} }
static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) { static void cucp_cuup_bearer_context_mod_direct(e1ap_bearer_setup_req_t *const req, instance_t instance) {
instance_t gtpInst = getCxt(CUtype, instance)->gtpInst; instance_t gtpInst = f1ap_cu_assoc_id_to_context(req->assoc_id)->gtpInst;
CU_update_UP_DL_tunnel(req, gtpInst, req->rnti); CU_update_UP_DL_tunnel(req, gtpInst, req->rnti);
} }
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
extern RAN_CONTEXT_t RC; extern RAN_CONTEXT_t RC;
static void cucp_cuup_bearer_context_setup_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance) { static void cucp_cuup_bearer_context_setup_e1ap(e1ap_bearer_setup_req_t *const req, instance_t instance) {
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti); rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], req->rnti, 0 /* assoc_id */);
protocol_ctxt_t ctxt = {0}; protocol_ctxt_t ctxt = {0};
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, GNB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0, 0);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
static void dl_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc) static void dl_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
{ {
printf("XX dl_rrc_message_transfer_f1ap assoc_id %d\n", dl_rrc->assoc_id); fflush(stdout);
/* TODO call F1AP function directly? no real-time constraint here */ /* TODO call F1AP function directly? no real-time constraint here */
MessageDef *message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_DL_RRC_MESSAGE); MessageDef *message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_DL_RRC_MESSAGE);
......
...@@ -398,6 +398,10 @@ typedef struct gNB_RRC_UE_s { ...@@ -398,6 +398,10 @@ typedef struct gNB_RRC_UE_s {
uint8_t nas_pdu_flag; uint8_t nas_pdu_flag;
ngap_nas_pdu_t nas_pdu; ngap_nas_pdu_t nas_pdu;
/* F1AP assoc_id to know to which DU the UE is attached to
* (only valid in a cu/du scenario)
*/
int f1ap_assoc_id;
} gNB_RRC_UE_t; } gNB_RRC_UE_t;
typedef struct rrc_gNB_ue_context_s { typedef struct rrc_gNB_ue_context_s {
......
...@@ -139,6 +139,7 @@ void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMc ...@@ -139,6 +139,7 @@ void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMc
uint8_t uint8_t
nr_rrc_data_req( nr_rrc_data_req(
const protocol_ctxt_t *const ctxt_pP, const protocol_ctxt_t *const ctxt_pP,
const int assoc_id,
const rb_id_t rb_idP, const rb_id_t rb_idP,
const mui_t muiP, const mui_t muiP,
const confirm_t confirmP, const confirm_t confirmP,
...@@ -164,6 +165,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP ...@@ -164,6 +165,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
const int ul_bwp_id); const int ul_bwp_id);
int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP, int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
int assoc_id,
const uint8_t *buffer, const uint8_t *buffer,
int buffer_length, int buffer_length,
const uint8_t *du_to_cu_rrc_container, const uint8_t *du_to_cu_rrc_container,
...@@ -206,10 +208,11 @@ void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP, ...@@ -206,10 +208,11 @@ void fill_DRB_configList(const protocol_ctxt_t *const ctxt_pP,
void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p, void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
e1ap_bearer_setup_resp_t *e1ap_resp); e1ap_bearer_setup_resp_t *e1ap_resp);
void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kUPint); void nr_pdcp_add_srbs(eNB_flag_t enb_flag, ue_id_t rntiMaybeUEid, int assoc_id, NR_SRB_ToAddModList_t *const srb2add_list, const uint8_t security_modeP, uint8_t *const kRRCenc, uint8_t *const kUPint);
void nr_pdcp_add_drbs(eNB_flag_t enb_flag, void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
ue_id_t rntiMaybeUEid, ue_id_t rntiMaybeUEid,
int assoc_id,
ue_id_t reestablish_ue_id, ue_id_t reestablish_ue_id,
NR_DRB_ToAddModList_t *const drb2add_list, NR_DRB_ToAddModList_t *const drb2add_list,
const uint8_t security_modeP, const uint8_t security_modeP,
......
This diff is collapsed.
...@@ -57,7 +57,7 @@ rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP( ...@@ -57,7 +57,7 @@ rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RX CREATE_TUNNEL_RESP num tunnels %u \n", LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RX CREATE_TUNNEL_RESP num tunnels %u \n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
create_tunnel_resp_pP->num_tunnels); create_tunnel_resp_pP->num_tunnels);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid); ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid, 0 /* assoc_id, not defined here, use 0 */);
for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) { for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
ue_context_p->ue_context.gnb_gtp_teid[inde_list[i]] = create_tunnel_resp_pP->enb_S1u_teid[i]; ue_context_p->ue_context.gnb_gtp_teid[inde_list[i]] = create_tunnel_resp_pP->enb_S1u_teid[i];
...@@ -88,7 +88,7 @@ int nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ct ...@@ -88,7 +88,7 @@ int nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ct
LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" RX CREATE_TUNNEL_RESP num tunnels %u \n", LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" RX CREATE_TUNNEL_RESP num tunnels %u \n",
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP), PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
create_tunnel_resp_pP->num_tunnels); create_tunnel_resp_pP->num_tunnels);
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid); ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[ctxt_pP->module_id], ctxt_pP->rntiMaybeUEid, create_tunnel_resp_pP->assoc_id);
for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) { for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) {
ue_context_p->ue_context.gnb_gtp_teid[i + offset] = create_tunnel_resp_pP->gnb_NGu_teid[i]; ue_context_p->ue_context.gnb_gtp_teid[i + offset] = create_tunnel_resp_pP->gnb_NGu_teid[i];
......
...@@ -213,16 +213,17 @@ rrc_gNB_NGAP_get_ue_ids( ...@@ -213,16 +213,17 @@ rrc_gNB_NGAP_get_ue_ids(
result = rrc_gNB_NGAP_get_ue_ids(rrc_instance_pP, ue_desc_p->ue_initial_id, gNB_ue_ngap_idP); result = rrc_gNB_NGAP_get_ue_ids(rrc_instance_pP, ue_desc_p->ue_initial_id, gNB_ue_ngap_idP);
if (result != NULL) { if (result != NULL) {
ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], result->ue_rnti); ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instance)], result->ue_rnti, result->assoc_id);
if ((ue_context_p != NULL) && (ue_context_p->ue_context.gNB_ue_ngap_id == 0)) { if ((ue_context_p != NULL) && (ue_context_p->ue_context.gNB_ue_ngap_id == 0)) {
ue_context_p->ue_context.gNB_ue_ngap_id = gNB_ue_ngap_idP; ue_context_p->ue_context.gNB_ue_ngap_id = gNB_ue_ngap_idP;
} else { } else {
LOG_E(NR_RRC, "[gNB %ld] Incoherence between RRC context and NGAP context (%d != %d) for UE RNTI %d or UE RRC context doesn't exist\n", LOG_E(NR_RRC, "[gNB %ld] Incoherence between RRC context and NGAP context (%d != %d) for UE RNTI %d (assoc_id %d) or UE RRC context doesn't exist\n",
rrc_instance_pP - RC.nrrrc[0], rrc_instance_pP - RC.nrrrc[0],
(ue_context_p==NULL)?99999:ue_context_p->ue_context.gNB_ue_ngap_id, (ue_context_p==NULL)?99999:ue_context_p->ue_context.gNB_ue_ngap_id,
gNB_ue_ngap_idP, gNB_ue_ngap_idP,
result->ue_rnti); result->ue_rnti,
result->assoc_id);
} }
} }
} else { } else {
...@@ -255,7 +256,7 @@ rrc_gNB_get_ue_context_from_ngap_ids( ...@@ -255,7 +256,7 @@ rrc_gNB_get_ue_context_from_ngap_ids(
temp = rrc_gNB_NGAP_get_ue_ids(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], ue_initial_idP, gNB_ue_ngap_idP); temp = rrc_gNB_NGAP_get_ue_ids(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], ue_initial_idP, gNB_ue_ngap_idP);
if (temp != NULL) { if (temp != NULL) {
return rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], temp->ue_rnti); return rrc_gNB_get_ue_context(RC.nrrrc[GNB_INSTANCE_TO_MODULE_ID(instanceP)], temp->ue_rnti, temp->assoc_id);
} }
return NULL; return NULL;
...@@ -290,6 +291,17 @@ void process_gNB_security_key ( ...@@ -290,6 +291,17 @@ void process_gNB_security_key (
LOG_I(NR_RRC, "[gNB %d][UE %x] Saved security key %s\n", ctxt_pP->module_id, ue_context_pP->ue_context.rnti, ascii_buffer); LOG_I(NR_RRC, "[gNB %d][UE %x] Saved security key %s\n", ctxt_pP->module_id, ue_context_pP->ue_context.rnti, ascii_buffer);
} }
void nr_pdcp_config_set_security(
const protocol_ctxt_t* const ctxt_pP,
const int assoc_id,
pdcp_t *const pdcp_pP,
const rb_id_t rb_id,
const uint16_t lc_idP,
const uint8_t security_modeP,
uint8_t *const kRRCenc_pP,
uint8_t *const kRRCint_pP,
uint8_t *const kUPenc_pP);
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void void
nr_rrc_pdcp_config_security( nr_rrc_pdcp_config_security(
...@@ -334,8 +346,9 @@ nr_rrc_pdcp_config_security( ...@@ -334,8 +346,9 @@ nr_rrc_pdcp_config_security(
} }
} }
pdcp_config_set_security( nr_pdcp_config_set_security(
ctxt_pP, ctxt_pP,
ue_context_pP->ue_context.f1ap_assoc_id,
NULL, /* pdcp_pP not used anymore in NR */ NULL, /* pdcp_pP not used anymore in NR */
DCCH, DCCH,
DCCH+2, DCCH+2,
...@@ -374,6 +387,7 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ( ...@@ -374,6 +387,7 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
rrc_ue_ngap_ids_p->ue_initial_id = ue_context_pP->ue_context.ue_initial_id; rrc_ue_ngap_ids_p->ue_initial_id = ue_context_pP->ue_context.ue_initial_id;
rrc_ue_ngap_ids_p->gNB_ue_ngap_id = UE_INITIAL_ID_INVALID; rrc_ue_ngap_ids_p->gNB_ue_ngap_id = UE_INITIAL_ID_INVALID;
rrc_ue_ngap_ids_p->ue_rnti = ctxt_pP->rntiMaybeUEid; rrc_ue_ngap_ids_p->ue_rnti = ctxt_pP->rntiMaybeUEid;
rrc_ue_ngap_ids_p->assoc_id = ue_context_pP->ue_context.f1ap_assoc_id;
h_rc = hashtable_insert(RC.nrrrc[ctxt_pP->module_id]->initial_id2_ngap_ids, h_rc = hashtable_insert(RC.nrrrc[ctxt_pP->module_id]->initial_id2_ngap_ids,
(hash_key_t)ue_context_pP->ue_context.ue_initial_id, (hash_key_t)ue_context_pP->ue_context.ue_initial_id,
...@@ -419,19 +433,21 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ( ...@@ -419,19 +433,21 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
if ((r_amf->plmn_Identity->mcc != NULL) && (r_amf->plmn_Identity->mcc->list.count > 0)) { if ((r_amf->plmn_Identity->mcc != NULL) && (r_amf->plmn_Identity->mcc->list.count > 0)) {
/* Use first indicated PLMN MCC if it is defined */ /* Use first indicated PLMN MCC if it is defined */
NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mcc = *r_amf->plmn_Identity->mcc->list.array[selected_plmn_identity]; NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mcc = *r_amf->plmn_Identity->mcc->list.array[selected_plmn_identity];
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MCC %u ue %x\n", LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MCC %u ue %x (assoc_id %d)\n",
ctxt_pP->module_id, ctxt_pP->module_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mcc, NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mcc,
ue_context_pP->ue_context.rnti); ue_context_pP->ue_context.rnti,
ue_context_pP->ue_context.f1ap_assoc_id);
} }
if (r_amf->plmn_Identity->mnc.list.count > 0) { if (r_amf->plmn_Identity->mnc.list.count > 0) {
/* Use first indicated PLMN MNC if it is defined */ /* Use first indicated PLMN MNC if it is defined */
NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mnc = *r_amf->plmn_Identity->mnc.list.array[selected_plmn_identity]; NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.mnc = *r_amf->plmn_Identity->mnc.list.array[selected_plmn_identity];
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u ue %x\n", LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUMMEI MNC %u ue %x (assoc_id %d)\n",
ctxt_pP->module_id, ctxt_pP->module_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mnc, NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.mnc,
ue_context_pP->ue_context.rnti); ue_context_pP->ue_context.rnti,
ue_context_pP->ue_context.f1ap_assoc_id);
} }
} else { } else {
/* TODO */ /* TODO */
...@@ -450,11 +466,12 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ( ...@@ -450,11 +466,12 @@ rrc_gNB_send_NGAP_NAS_FIRST_REQ(
ue_context_pP->ue_context.ue_guami.amf_set_id = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_set_id; ue_context_pP->ue_context.ue_guami.amf_set_id = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_set_id;
ue_context_pP->ue_context.ue_guami.amf_pointer = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_pointer; ue_context_pP->ue_context.ue_guami.amf_pointer = NGAP_NAS_FIRST_REQ(message_p).ue_identity.guami.amf_pointer;
LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUAMI amf_set_id %u amf_region_id %u ue %x\n", LOG_I(NGAP, "[gNB %d] Build NGAP_NAS_FIRST_REQ adding in s_TMSI: GUAMI amf_set_id %u amf_region_id %u ue %x (assoc_id %d)\n",
ctxt_pP->module_id, ctxt_pP->module_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_set_id, NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_set_id,
NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_region_id, NGAP_NAS_FIRST_REQ (message_p).ue_identity.guami.amf_region_id,
ue_context_pP->ue_context.rnti); ue_context_pP->ue_context.rnti,
ue_context_pP->ue_context.f1ap_assoc_id);
} }
itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, message_p); itti_send_msg_to_task (TASK_NGAP, ctxt_pP->instance, message_p);
...@@ -530,7 +547,8 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ( ...@@ -530,7 +547,8 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
} }
ue_context_p->ue_context.nb_of_pdusessions = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions; ue_context_p->ue_context.nb_of_pdusessions = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_pdusessions;
create_tunnel_req.ue_id = ue_context_p->ue_context.rnti; create_tunnel_req.ue_id = ue_context_p->ue_context.rnti;
create_tunnel_req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
create_tunnel_req.num_tunnels = pdu_sessions_done; create_tunnel_req.num_tunnels = pdu_sessions_done;
ret = gtpv1u_create_ngu_tunnel( ret = gtpv1u_create_ngu_tunnel(
...@@ -806,6 +824,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS( ...@@ -806,6 +824,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
/* Transfer data to PDCP */ /* Transfer data to PDCP */
nr_rrc_data_req ( nr_rrc_data_req (
&ctxt, &ctxt,
ue_context_p->ue_context.f1ap_assoc_id,
ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id, ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id,
(*rrc_gNB_mui)++, (*rrc_gNB_mui)++,
SDU_CONFIRM_NO, SDU_CONFIRM_NO,
...@@ -825,6 +844,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS( ...@@ -825,6 +844,7 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
/* Transfer data to PDCP */ /* Transfer data to PDCP */
nr_rrc_data_req ( nr_rrc_data_req (
&ctxt, &ctxt,
ue_context_p->ue_context.f1ap_assoc_id,
ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id, ue_context_p->ue_context.Srb2.Active == 1 ? ue_context_p->ue_context.Srb2.Srb_info.Srb_id : ue_context_p->ue_context.Srb1.Srb_info.Srb_id,
(*rrc_gNB_mui)++, (*rrc_gNB_mui)++,
SDU_CONFIRM_NO, SDU_CONFIRM_NO,
...@@ -993,6 +1013,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ( ...@@ -993,6 +1013,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
bearer_req.gNB_cu_cp_ue_id = gNB_ue_ngap_id; bearer_req.gNB_cu_cp_ue_id = gNB_ue_ngap_id;
bearer_req.rnti = ue_context_p->ue_context.rnti; bearer_req.rnti = ue_context_p->ue_context.rnti;
bearer_req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
bearer_req.cipheringAlgorithm = ue_context_p->ue_context.ciphering_algorithm; bearer_req.cipheringAlgorithm = ue_context_p->ue_context.ciphering_algorithm;
memcpy(bearer_req.encryptionKey, ue_context_p->ue_context.kgnb, sizeof(ue_context_p->ue_context.kgnb)); memcpy(bearer_req.encryptionKey, ue_context_p->ue_context.kgnb, sizeof(ue_context_p->ue_context.kgnb));
bearer_req.integrityProtectionAlgorithm = ue_context_p->ue_context.integrity_algorithm; bearer_req.integrityProtectionAlgorithm = ue_context_p->ue_context.integrity_algorithm;
...@@ -1681,6 +1702,7 @@ rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND( ...@@ -1681,6 +1702,7 @@ rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(
LOG_I(NR_RRC, "gtp tunnel delete \n"); LOG_I(NR_RRC, "gtp tunnel delete \n");
gtpv1u_gnb_delete_tunnel_req_t req={0}; gtpv1u_gnb_delete_tunnel_req_t req={0};
req.ue_id = ue_context_p->ue_context.rnti; req.ue_id = ue_context_p->ue_context.rnti;
req.assoc_id = ue_context_p->ue_context.f1ap_assoc_id;
for(i = 0; i < NB_RB_MAX; i++) { for(i = 0; i < NB_RB_MAX; i++) {
if(xid == ue_context_p->ue_context.pduSession[i].xid) { if(xid == ue_context_p->ue_context.pduSession[i].xid) {
......
...@@ -50,6 +50,7 @@ typedef struct rrc_ue_ngap_ids_s { ...@@ -50,6 +50,7 @@ typedef struct rrc_ue_ngap_ids_s {
// value // value
rnti_t ue_rnti; rnti_t ue_rnti;
int assoc_id;
} rrc_ue_ngap_ids_t; } rrc_ue_ngap_ids_t;
void void
......
...@@ -50,6 +50,14 @@ int rrc_gNB_compare_ue_rnti_id( ...@@ -50,6 +50,14 @@ int rrc_gNB_compare_ue_rnti_id(
return -1; return -1;
} }
if (c1_pP->ue_context.f1ap_assoc_id > c2_pP->ue_context.f1ap_assoc_id) {
return 1;
}
if (c1_pP->ue_context.f1ap_assoc_id < c2_pP->ue_context.f1ap_assoc_id) {
return -1;
}
return 0; return 0;
} }
...@@ -66,6 +74,7 @@ rrc_gNB_allocate_new_UE_context( ...@@ -66,6 +74,7 @@ rrc_gNB_allocate_new_UE_context(
) )
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
printf("rrc_gNB_allocate_new_UE_context called\n"); fflush(stdout);
struct rrc_gNB_ue_context_s *new_p; struct rrc_gNB_ue_context_s *new_p;
new_p = (struct rrc_gNB_ue_context_s * )malloc(sizeof(struct rrc_gNB_ue_context_s)); new_p = (struct rrc_gNB_ue_context_s * )malloc(sizeof(struct rrc_gNB_ue_context_s));
...@@ -92,9 +101,12 @@ rrc_gNB_allocate_new_UE_context( ...@@ -92,9 +101,12 @@ rrc_gNB_allocate_new_UE_context(
struct rrc_gNB_ue_context_s * struct rrc_gNB_ue_context_s *
rrc_gNB_get_ue_context( rrc_gNB_get_ue_context(
gNB_RRC_INST *rrc_instance_pP, gNB_RRC_INST *rrc_instance_pP,
rnti_t rntiP) rnti_t rntiP,
int assoc_id)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
printf("rrc_gNB_get_ue_context rnti %x assoc_id %d\n", rntiP, assoc_id); fflush(stdout);
#if 0
rrc_gNB_ue_context_t temp; rrc_gNB_ue_context_t temp;
memset(&temp, 0, sizeof(struct rrc_gNB_ue_context_s)); memset(&temp, 0, sizeof(struct rrc_gNB_ue_context_s));
/* gNB ue rrc id = 24 bits wide */ /* gNB ue rrc id = 24 bits wide */
...@@ -112,6 +124,15 @@ rrc_gNB_get_ue_context( ...@@ -112,6 +124,15 @@ rrc_gNB_get_ue_context(
} }
return NULL; return NULL;
} }
#endif
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
RB_FOREACH(ue_context_p, rrc_nr_ue_tree_s, &(rrc_instance_pP->rrc_ue_head)) {
printf(" in list rnti %x assoc_id %d\n", ue_context_p->ue_context.rnti, ue_context_p->ue_context.f1ap_assoc_id);
if (ue_context_p->ue_context.rnti == rntiP && ue_context_p->ue_context.f1ap_assoc_id == assoc_id) {
return ue_context_p;
}
}
return NULL;
} }
void rrc_gNB_free_mem_UE_context( void rrc_gNB_free_mem_UE_context(
...@@ -204,13 +225,15 @@ rrc_gNB_ue_context_5g_s_tmsi_exist( ...@@ -204,13 +225,15 @@ rrc_gNB_ue_context_5g_s_tmsi_exist(
struct rrc_gNB_ue_context_s * struct rrc_gNB_ue_context_s *
rrc_gNB_get_next_free_ue_context( rrc_gNB_get_next_free_ue_context(
const protocol_ctxt_t *const ctxt_pP, const protocol_ctxt_t *const ctxt_pP,
int assoc_id,
gNB_RRC_INST *rrc_instance_pP, gNB_RRC_INST *rrc_instance_pP,
const uint64_t ue_identityP const uint64_t ue_identityP
) )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
printf("rrc_gNB_get_next_free_ue_context rnti %lx assoc_id %d\n", ctxt_pP->rntiMaybeUEid, assoc_id); fflush(stdout);
struct rrc_gNB_ue_context_s *ue_context_p = NULL; struct rrc_gNB_ue_context_s *ue_context_p = NULL;
ue_context_p = rrc_gNB_get_ue_context(rrc_instance_pP, ctxt_pP->rntiMaybeUEid); ue_context_p = rrc_gNB_get_ue_context(rrc_instance_pP, ctxt_pP->rntiMaybeUEid, assoc_id);
if (ue_context_p == NULL) { if (ue_context_p == NULL) {
ue_context_p = rrc_gNB_allocate_new_UE_context(rrc_instance_pP); ue_context_p = rrc_gNB_allocate_new_UE_context(rrc_instance_pP);
...@@ -224,6 +247,7 @@ rrc_gNB_get_next_free_ue_context( ...@@ -224,6 +247,7 @@ rrc_gNB_get_next_free_ue_context(
ue_context_p->ue_id_rnti = ctxt_pP->rntiMaybeUEid; // here ue_id_rnti is just a key, may be something else ue_context_p->ue_id_rnti = ctxt_pP->rntiMaybeUEid; // here ue_id_rnti is just a key, may be something else
ue_context_p->ue_context.rnti = ctxt_pP->rntiMaybeUEid; // yes duplicate, 1 may be removed ue_context_p->ue_context.rnti = ctxt_pP->rntiMaybeUEid; // yes duplicate, 1 may be removed
ue_context_p->ue_context.f1ap_assoc_id = assoc_id;
ue_context_p->ue_context.random_ue_identity = ue_identityP; ue_context_p->ue_context.random_ue_identity = ue_identityP;
RB_INSERT(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_p); RB_INSERT(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_p);
LOG_D(NR_RRC, LOG_D(NR_RRC,
......
...@@ -49,7 +49,8 @@ rrc_gNB_allocate_new_UE_context( ...@@ -49,7 +49,8 @@ rrc_gNB_allocate_new_UE_context(
struct rrc_gNB_ue_context_s* struct rrc_gNB_ue_context_s*
rrc_gNB_get_ue_context( rrc_gNB_get_ue_context(
gNB_RRC_INST* rrc_instance_pP, gNB_RRC_INST* rrc_instance_pP,
rnti_t rntiP rnti_t rntiP,
int assoc_id
); );
void rrc_gNB_free_mem_UE_context( void rrc_gNB_free_mem_UE_context(
...@@ -78,6 +79,7 @@ rrc_gNB_ue_context_5g_s_tmsi_exist( ...@@ -78,6 +79,7 @@ rrc_gNB_ue_context_5g_s_tmsi_exist(
struct rrc_gNB_ue_context_s * struct rrc_gNB_ue_context_s *
rrc_gNB_get_next_free_ue_context( rrc_gNB_get_next_free_ue_context(
const protocol_ctxt_t *const ctxt_pP, const protocol_ctxt_t *const ctxt_pP,
int assoc_id,
gNB_RRC_INST *rrc_instance_pP, gNB_RRC_INST *rrc_instance_pP,
const uint64_t ue_identityP const uint64_t ue_identityP
); );
......
...@@ -387,6 +387,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ ...@@ -387,6 +387,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
nr_pdcp_add_drbs(ctxt.enb_flag, nr_pdcp_add_drbs(ctxt.enb_flag,
ctxt.rntiMaybeUEid, ctxt.rntiMaybeUEid,
0, /* assoc_id set to 0, NSA not functional in CU/DU split */
0, 0,
ue_context_p->ue_context.rb_config->drb_ToAddModList, ue_context_p->ue_context.rb_config->drb_ToAddModList,
(ue_context_p->ue_context.integrity_algorithm << 4) | ue_context_p->ue_context.ciphering_algorithm, (ue_context_p->ue_context.integrity_algorithm << 4) | ue_context_p->ue_context.ciphering_algorithm,
...@@ -403,6 +404,8 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ ...@@ -403,6 +404,8 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
LOG_D(RRC, "%s:%d: done RRC PDCP/RLC ASN1 request for UE rnti %lx\n", __FUNCTION__, __LINE__, ctxt.rntiMaybeUEid); LOG_D(RRC, "%s:%d: done RRC PDCP/RLC ASN1 request for UE rnti %lx\n", __FUNCTION__, __LINE__, ctxt.rntiMaybeUEid);
} }
bool nr_pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP, int assoc_id);
void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) { void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
protocol_ctxt_t ctxt; protocol_ctxt_t ctxt;
rrc_gNB_ue_context_t *ue_context; rrc_gNB_ue_context_t *ue_context;
...@@ -411,13 +414,13 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) { ...@@ -411,13 +414,13 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti) {
LOG_D(RRC, "calling rrc_remove_nsa_user rnti %d\n", rnti); LOG_D(RRC, "calling rrc_remove_nsa_user rnti %d\n", rnti);
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, rnti, 0, 0, rrc->module_id); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, rnti, 0, 0, rrc->module_id);
ue_context = rrc_gNB_get_ue_context(rrc, rnti); ue_context = rrc_gNB_get_ue_context(rrc, rnti, 0 /* assoc_id set to 0, NSA not functional in CU/DU split */);
if (ue_context == NULL) { if (ue_context == NULL) {
LOG_W(RRC, "rrc_remove_nsa_user: rnti %d not found\n", rnti); LOG_W(RRC, "rrc_remove_nsa_user: rnti %d not found\n", rnti);
return; return;
} }
pdcp_remove_UE(&ctxt); nr_pdcp_remove_UE(&ctxt, ue_context->ue_context.f1ap_assoc_id);
rrc_rlc_remove_ue(&ctxt); rrc_rlc_remove_ue(&ctxt);
......
...@@ -166,18 +166,19 @@ rrc_data_req_nr_ue( ...@@ -166,18 +166,19 @@ rrc_data_req_nr_ue(
message_buffer = itti_malloc (TASK_RRC_UE, TASK_PDCP_UE, sdu_sizeP); message_buffer = itti_malloc (TASK_RRC_UE, TASK_PDCP_UE, sdu_sizeP);
LOG_D(RRC,"Sending RRC message for SRB %ld, sdu_size %d\n",rb_idP, sdu_sizeP); LOG_D(RRC,"Sending RRC message for SRB %ld, sdu_size %d\n",rb_idP, sdu_sizeP);
memcpy (message_buffer, buffer_pP, sdu_sizeP); memcpy (message_buffer, buffer_pP, sdu_sizeP);
message_p = itti_alloc_new_message ( TASK_RRC_UE, 0, RRC_DCCH_DATA_REQ); message_p = itti_alloc_new_message ( TASK_RRC_UE, 0, NR_RRC_DCCH_DATA_REQ);
RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame; NR_RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame;
RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag; NR_RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag;
RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP; NR_RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP;
RRC_DCCH_DATA_REQ (message_p).muip = muiP; NR_RRC_DCCH_DATA_REQ (message_p).muip = muiP;
RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP; NR_RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP;
RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP; NR_RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP;
RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer; NR_RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer;
RRC_DCCH_DATA_REQ (message_p).mode = modeP; NR_RRC_DCCH_DATA_REQ (message_p).mode = modeP;
RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id; NR_RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id;
RRC_DCCH_DATA_REQ(message_p).rnti = ctxt_pP->rntiMaybeUEid; NR_RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rntiMaybeUEid;
RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index; NR_RRC_DCCH_DATA_REQ (message_p).assoc_id = 0; /* assoc_id is 0 for nrUE */
NR_RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index;
itti_send_msg_to_task ( itti_send_msg_to_task (
TASK_PDCP_UE, TASK_PDCP_UE,
ctxt_pP->instance, ctxt_pP->instance,
......
...@@ -26,6 +26,7 @@ uint8_t nas_pduid; ...@@ -26,6 +26,7 @@ uint8_t nas_pduid;
bool sdap_data_req(protocol_ctxt_t *ctxt_p, bool sdap_data_req(protocol_ctxt_t *ctxt_p,
const ue_id_t ue_id, const ue_id_t ue_id,
const int assoc_id,
const srb_flag_t srb_flag, const srb_flag_t srb_flag,
const rb_id_t rb_id, const rb_id_t rb_id,
const mui_t mui, const mui_t mui,
...@@ -39,7 +40,8 @@ bool sdap_data_req(protocol_ctxt_t *ctxt_p, ...@@ -39,7 +40,8 @@ bool sdap_data_req(protocol_ctxt_t *ctxt_p,
const bool rqi, const bool rqi,
const int pdusession_id) { const int pdusession_id) {
nr_sdap_entity_t *sdap_entity; nr_sdap_entity_t *sdap_entity;
sdap_entity = nr_sdap_get_entity(ue_id, pdusession_id); printf("sdap_data_req assoc_id %d\n", assoc_id); fflush(stdout);
sdap_entity = nr_sdap_get_entity(ue_id, assoc_id, pdusession_id);
if(sdap_entity == NULL) { if(sdap_entity == NULL) {
LOG_E(SDAP, "%s:%d:%s: Entity not found with ue: 0x%"PRIx64" and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ue_id, pdusession_id); LOG_E(SDAP, "%s:%d:%s: Entity not found with ue: 0x%"PRIx64" and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ue_id, pdusession_id);
...@@ -48,6 +50,7 @@ bool sdap_data_req(protocol_ctxt_t *ctxt_p, ...@@ -48,6 +50,7 @@ bool sdap_data_req(protocol_ctxt_t *ctxt_p,
bool ret = sdap_entity->tx_entity(sdap_entity, bool ret = sdap_entity->tx_entity(sdap_entity,
ctxt_p, ctxt_p,
assoc_id,
srb_flag, srb_flag,
rb_id, rb_id,
mui, mui,
...@@ -67,10 +70,12 @@ void sdap_data_ind(rb_id_t pdcp_entity, ...@@ -67,10 +70,12 @@ void sdap_data_ind(rb_id_t pdcp_entity,
bool has_sdap_rx, bool has_sdap_rx,
int pdusession_id, int pdusession_id,
ue_id_t ue_id, ue_id_t ue_id,
int assoc_id,
char *buf, char *buf,
int size) { int size) {
nr_sdap_entity_t *sdap_entity; nr_sdap_entity_t *sdap_entity;
sdap_entity = nr_sdap_get_entity(ue_id, pdusession_id); printf("assoc_id %d\n", assoc_id); fflush(stdout);
sdap_entity = nr_sdap_get_entity(ue_id, assoc_id, pdusession_id);
if (sdap_entity == NULL) { if (sdap_entity == NULL) {
LOG_E(SDAP, "%s:%d:%s: Entity not found for ue rnti/ue_id: %lx and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ue_id, pdusession_id); LOG_E(SDAP, "%s:%d:%s: Entity not found for ue rnti/ue_id: %lx and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ue_id, pdusession_id);
...@@ -83,6 +88,7 @@ void sdap_data_ind(rb_id_t pdcp_entity, ...@@ -83,6 +88,7 @@ void sdap_data_ind(rb_id_t pdcp_entity,
has_sdap_rx, has_sdap_rx,
pdusession_id, pdusession_id,
ue_id, ue_id,
assoc_id,
buf, buf,
size); size);
} }
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
*/ */
bool sdap_data_req(protocol_ctxt_t *ctxt_p, bool sdap_data_req(protocol_ctxt_t *ctxt_p,
const ue_id_t ue_id, const ue_id_t ue_id,
const int assoc_id,
const srb_flag_t srb_flag, const srb_flag_t srb_flag,
const rb_id_t rb_id, const rb_id_t rb_id,
const mui_t mui, const mui_t mui,
...@@ -58,6 +59,7 @@ void sdap_data_ind(rb_id_t pdcp_entity, ...@@ -58,6 +59,7 @@ void sdap_data_ind(rb_id_t pdcp_entity,
bool has_sdap_rx, bool has_sdap_rx,
int pdusession_id, int pdusession_id,
ue_id_t ue_id, ue_id_t ue_id,
int assoc_id,
char *buf, char *buf,
int size); int size);
......
This diff is collapsed.
...@@ -72,10 +72,11 @@ typedef struct qfi2drb_s { ...@@ -72,10 +72,11 @@ typedef struct qfi2drb_s {
bool has_sdap_tx; bool has_sdap_tx;
} qfi2drb_t; } qfi2drb_t;
void nr_pdcp_submit_sdap_ctrl_pdu(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); void nr_pdcp_submit_sdap_ctrl_pdu(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
typedef struct nr_sdap_entity_s { typedef struct nr_sdap_entity_s {
ue_id_t ue_id; ue_id_t ue_id;
int assoc_id;
rb_id_t default_drb; rb_id_t default_drb;
int pdusession_id; int pdusession_id;
qfi2drb_t qfi2drb_table[SDAP_MAX_QFI]; qfi2drb_t qfi2drb_table[SDAP_MAX_QFI];
...@@ -86,10 +87,11 @@ typedef struct nr_sdap_entity_s { ...@@ -86,10 +87,11 @@ typedef struct nr_sdap_entity_s {
nr_sdap_ul_hdr_t (*sdap_construct_ctrl_pdu)(uint8_t qfi); nr_sdap_ul_hdr_t (*sdap_construct_ctrl_pdu)(uint8_t qfi);
rb_id_t (*sdap_map_ctrl_pdu)(struct nr_sdap_entity_s *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi); rb_id_t (*sdap_map_ctrl_pdu)(struct nr_sdap_entity_s *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi);
void (*sdap_submit_ctrl_pdu)(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); void (*sdap_submit_ctrl_pdu)(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
bool (*tx_entity)(struct nr_sdap_entity_s *entity, bool (*tx_entity)(struct nr_sdap_entity_s *entity,
protocol_ctxt_t *ctxt_p, protocol_ctxt_t *ctxt_p,
const int assoc_id,
const srb_flag_t srb_flag, const srb_flag_t srb_flag,
const rb_id_t rb_id, const rb_id_t rb_id,
const mui_t mui, const mui_t mui,
...@@ -108,6 +110,7 @@ typedef struct nr_sdap_entity_s { ...@@ -108,6 +110,7 @@ typedef struct nr_sdap_entity_s {
bool has_sdap_rx, bool has_sdap_rx,
int pdusession_id, int pdusession_id,
ue_id_t ue_id, ue_id_t ue_id,
int assoc_id,
char *buf, char *buf,
int size); int size);
...@@ -150,24 +153,24 @@ rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int ...@@ -150,24 +153,24 @@ rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int
* TS 37.324 5.3 QoS flow to DRB Mapping * TS 37.324 5.3 QoS flow to DRB Mapping
* Submit the end-marker control PDU to the lower layer. * Submit the end-marker control PDU to the lower layer.
*/ */
void nr_sdap_submit_ctrl_pdu(ue_id_t ue_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); void nr_sdap_submit_ctrl_pdu(ue_id_t ue_id, int assoc_id, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu);
/* /*
* TS 37.324 5.3 QoS flow to DRB Mapping * TS 37.324 5.3 QoS flow to DRB Mapping
* 5.3.1 Configuration Procedures * 5.3.1 Configuration Procedures
*/ */
void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t pdcp_entity, ue_id_t ue_id, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount, uint8_t drb_identity, bool has_sdap_rx, bool has_sdap_tx); void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, rb_id_t pdcp_entity, ue_id_t ue_id, int assoc_id, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount, uint8_t drb_identity, bool has_sdap_rx, bool has_sdap_tx);
/* /*
* TS 37.324 4.4 5.1.1 SDAP entity establishment * TS 37.324 4.4 5.1.1 SDAP entity establishment
* Establish an SDAP entity. * Establish an SDAP entity.
*/ */
nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap_tx, ue_id_t ue_id, int pdusession_id, bool is_defaultDRB, uint8_t default_DRB, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount); nr_sdap_entity_t *new_nr_sdap_entity(int is_gnb, bool has_sdap_rx, bool has_sdap_tx, ue_id_t ue_id, int assoc_id, int pdusession_id, bool is_defaultDRB, uint8_t default_DRB, NR_QFI_t *mapped_qfi_2_add, uint8_t mappedQFIs2AddCount);
/* Entity Handling Related Functions */ /* Entity Handling Related Functions */
nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int pdusession_id); nr_sdap_entity_t *nr_sdap_get_entity(ue_id_t ue_id, int assoc_id, int pdusession_id);
/* Entity Handling Related Functions */ /* Entity Handling Related Functions */
void delete_nr_sdap_entity(ue_id_t ue_id); void delete_nr_sdap_entity(ue_id_t ue_id, int assoc_id);
#endif #endif
...@@ -865,11 +865,18 @@ sctp_eNB_accept_associations( ...@@ -865,11 +865,18 @@ sctp_eNB_accept_associations(
if ((client_sd = accept(sctp_cnx->sd, (struct sockaddr*)&saddr, &saddr_size)) < 0) { if ((client_sd = accept(sctp_cnx->sd, (struct sockaddr*)&saddr, &saddr_size)) < 0) {
SCTP_ERROR("[%d] accept failed: %s:%d\n", sctp_cnx->sd, strerror(errno), errno); SCTP_ERROR("[%d] accept failed: %s:%d\n", sctp_cnx->sd, strerror(errno), errno);
} else { } else {
printf("addr size %d in6 size %ld\n", saddr_size, sizeof(struct sockaddr_in6)); fflush(stdout);
{
int i;
for (i = 0; i < saddr_size; i++) printf(" %2.2x", ((unsigned char*)&saddr)[i]);
printf("\n"); fflush(stdout);
}
struct sctp_cnx_list_elm_s *new_cnx; struct sctp_cnx_list_elm_s *new_cnx;
uint16_t port; uint16_t port;
/* This is an ipv6 socket */ /* This is an ipv6 socket */
port = saddr.sin6_port; port = saddr.sin6_port;
printf("port %d %d\n", port, ntohs(port)); fflush(stdout);
/* Contrary to BSD, client socket does not inherit O_NONBLOCK option */ /* Contrary to BSD, client socket does not inherit O_NONBLOCK option */
if (fcntl(client_sd, F_SETFL, O_NONBLOCK) < 0) { if (fcntl(client_sd, F_SETFL, O_NONBLOCK) < 0) {
......
This diff is collapsed.
...@@ -9,6 +9,7 @@ extern "C" { ...@@ -9,6 +9,7 @@ extern "C" {
#endif #endif
typedef bool (*gtpCallback)(protocol_ctxt_t *ctxt_pP, typedef bool (*gtpCallback)(protocol_ctxt_t *ctxt_pP,
const int assoc_id,
const srb_flag_t srb_flagP, const srb_flag_t srb_flagP,
const rb_id_t rb_idP, const rb_id_t rb_idP,
const mui_t muiP, const mui_t muiP,
...@@ -21,6 +22,7 @@ extern "C" { ...@@ -21,6 +22,7 @@ extern "C" {
typedef bool (*gtpCallbackSDAP)(protocol_ctxt_t *ctxt_pP, typedef bool (*gtpCallbackSDAP)(protocol_ctxt_t *ctxt_pP,
const ue_id_t ue_id, const ue_id_t ue_id,
const int assoc_id,
const srb_flag_t srb_flagP, const srb_flag_t srb_flagP,
const rb_id_t rb_idP, const rb_id_t rb_idP,
const mui_t muiP, const mui_t muiP,
...@@ -77,12 +79,14 @@ extern "C" { ...@@ -77,12 +79,14 @@ extern "C" {
int gtpv1u_update_ngu_tunnel( const instance_t instanceP, int gtpv1u_update_ngu_tunnel( const instance_t instanceP,
const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req_pP, const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req_pP,
const ue_id_t prior_rnti const ue_id_t prior_rnti,
const int assoc_id
); );
// New API // New API
teid_t newGtpuCreateTunnel(instance_t instance, teid_t newGtpuCreateTunnel(instance_t instance,
ue_id_t ue_id, ue_id_t ue_id,
int assoc_id,
int incoming_bearer_id, int incoming_bearer_id,
int outgoing_rb_id, int outgoing_rb_id,
teid_t teid, teid_t teid,
...@@ -94,12 +98,13 @@ extern "C" { ...@@ -94,12 +98,13 @@ extern "C" {
void GtpuUpdateTunnelOutgoingAddressAndTeid(instance_t instance, void GtpuUpdateTunnelOutgoingAddressAndTeid(instance_t instance,
ue_id_t ue_id, ue_id_t ue_id,
int assoc_id,
ebi_t bearer_id, ebi_t bearer_id,
in_addr_t newOutgoingAddr, in_addr_t newOutgoingAddr,
teid_t newOutgoingTeid); teid_t newOutgoingTeid);
int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id); int newGtpuDeleteAllTunnels(instance_t instance, ue_id_t ue_id, int assoc_id);
int newGtpuDeleteTunnels(instance_t instance, ue_id_t ue_id, int nbTunnels, pdusessionid_t *pdusession_id); int newGtpuDeleteTunnels(instance_t instance, ue_id_t ue_id, int assoc_id, int nbTunnels, pdusessionid_t *pdusession_id);
instance_t gtpv1Init(openAddr_t context); instance_t gtpv1Init(openAddr_t context);
void *gtpv1uTask(void *args); void *gtpv1uTask(void *args);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment