diff --git a/openair2/E1AP/e1ap.c b/openair2/E1AP/e1ap.c index 95046cb652..e085a9e9b9 100644 --- a/openair2/E1AP/e1ap.c +++ b/openair2/E1AP/e1ap.c @@ -219,6 +219,8 @@ int e1apCUUP_handle_SETUP_RESPONSE(sctp_assoc_t assoc_id, e1ap_upcp_inst_t *inst return -1; } free_e1ap_cuup_setup_response(&out); + + e1_reset(); // reset all UE contexts, if any: see 38.463 sec 8.2.3 return 0; } diff --git a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c index dc9b5b52ee..dd281fb77d 100644 --- a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c +++ b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c @@ -330,3 +330,15 @@ void e1_bearer_release_cmd(const e1ap_bearer_release_cmd_t *cmd) get_e1_if()->bearer_release_complete(&cplt); } + +void e1_reset(void) +{ + /* we get the list of all UEs from the PDCP, which maintains a list */ + ue_id_t ue_ids[MAX_MOBILES_PER_GNB]; + int num = nr_pdcp_get_num_ues(ue_ids, MAX_MOBILES_PER_GNB); + for (uint32_t i = 0; i < num; ++i) { + ue_id_t ue_id = ue_ids[i]; + LOG_W(E1AP, "releasing UE %ld\n", ue_id); + remove_ue_e1(ue_id); + } +} diff --git a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.h b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.h index 7290043371..521a33ea99 100644 --- a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.h +++ b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.h @@ -31,5 +31,6 @@ struct e1ap_bearer_release_cmd_s; void e1_bearer_context_setup(const struct e1ap_bearer_setup_req_s *req); void e1_bearer_context_modif(const struct e1ap_bearer_setup_req_s *req); void e1_bearer_release_cmd(const struct e1ap_bearer_release_cmd_s *cmd); +void e1_reset(void); #endif /* CUCP_CUUP_HANDLER_H */