laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-sgsn/+/40691?usp=email )
Change subject: routing area: introduce sgsn_ra_find_or_create() ......................................................................
routing area: introduce sgsn_ra_find_or_create()
If the RA is the same, return the RA, but if the ran type is different, return NULL instead of allocating a second RA in the other RAT.
Change-Id: I6955a09d9d8f3ba4dc3a14d7ed5cd9798d929c61 --- M include/osmocom/sgsn/gprs_routing_area.h M src/sgsn/gprs_routing_area.c M tests/gprs_routing_area/gprs_routing_area_test.c 3 files changed, 28 insertions(+), 7 deletions(-)
Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved
diff --git a/include/osmocom/sgsn/gprs_routing_area.h b/include/osmocom/sgsn/gprs_routing_area.h index 3bdc057..9f16559 100644 --- a/include/osmocom/sgsn/gprs_routing_area.h +++ b/include/osmocom/sgsn/gprs_routing_area.h @@ -74,6 +74,7 @@ void sgsn_ra_init(struct sgsn_instance *inst);
struct sgsn_ra *sgsn_ra_alloc(const struct osmo_routing_area_id *rai, enum sgsn_ra_ran_type ran_type); +struct sgsn_ra *sgsn_ra_find_or_create(const struct osmo_routing_area_id *rai, enum sgsn_ra_ran_type ran_type); void sgsn_ra_free(struct sgsn_ra *ra); struct sgsn_ra_cell *sgsn_ra_cell_alloc_geran(struct sgsn_ra *ra, uint16_t cell_id, uint16_t nsei, uint16_t bvci); void sgsn_ra_cell_free(struct sgsn_ra_cell *cell); diff --git a/src/sgsn/gprs_routing_area.c b/src/sgsn/gprs_routing_area.c index 4d04ed7..3a39f8d 100644 --- a/src/sgsn/gprs_routing_area.c +++ b/src/sgsn/gprs_routing_area.c @@ -93,6 +93,26 @@ return ra; }
+struct sgsn_ra *sgsn_ra_find_or_create(const struct osmo_routing_area_id *rai, enum sgsn_ra_ran_type ran_type) +{ + struct sgsn_ra *ra = sgsn_ra_get_ra(rai); + + if (ra) { + if (ra->ran_type == ran_type) { + LOGP(DRA, LOGL_ERROR, "Trying to create an already existing RA %s with the same ran type %s. Using old RA.\n", + osmo_rai_name2(rai), get_value_string(sgsn_ra_ran_type_names, ra->ran_type)); + + return ra; + } + + LOGP(DRA, LOGL_ERROR, "Failed to create an already existing RA %s with a different ran type %s.\n", + osmo_rai_name2(rai), get_value_string(sgsn_ra_ran_type_names, ra->ran_type)); + return NULL; + } + + return sgsn_ra_alloc(rai, ran_type); +} + struct sgsn_ra_cell *sgsn_ra_cell_alloc_geran(struct sgsn_ra *ra, uint16_t cell_id, uint16_t nsei, uint16_t bvci) { struct sgsn_ra_cell *cell; @@ -287,7 +307,7 @@ ra = sgsn_ra_get_ra_geran(&cgi_ps->rai); if (!ra) { /* TODO: check for UTRAN rai when introducing UTRAN support */ - ra = sgsn_ra_alloc(&cgi_ps->rai, RA_TYPE_GERAN_Gb); + ra = sgsn_ra_find_or_create(&cgi_ps->rai, RA_TYPE_GERAN_Gb); if (!ra) return -ENOMEM; ra_created = true; diff --git a/tests/gprs_routing_area/gprs_routing_area_test.c b/tests/gprs_routing_area/gprs_routing_area_test.c index c43c771..a329e87 100644 --- a/tests/gprs_routing_area/gprs_routing_area_test.c +++ b/tests/gprs_routing_area/gprs_routing_area_test.c @@ -75,7 +75,7 @@ printf("Testing Routing Area create/free\n");
sgsn = sgsn_instance_alloc(tall_sgsn_ctx); - ra = sgsn_ra_alloc(&rai, RA_TYPE_GERAN_Gb); + ra = sgsn_ra_find_or_create(&rai, RA_TYPE_GERAN_Gb); OSMO_ASSERT(ra); OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
@@ -105,7 +105,7 @@ printf("Testing Routing Area create/free\n");
sgsn = sgsn_instance_alloc(tall_sgsn_ctx); - ra = sgsn_ra_alloc(&rai, RA_TYPE_GERAN_Gb); + ra = sgsn_ra_find_or_create(&rai, RA_TYPE_GERAN_Gb); OSMO_ASSERT(ra); OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
@@ -117,7 +117,7 @@ sgsn_ra_free(ra); OSMO_ASSERT(llist_empty(&sgsn->routing_area->ra_list));
- ra = sgsn_ra_alloc(&rai, RA_TYPE_GERAN_Gb); + ra = sgsn_ra_find_or_create(&rai, RA_TYPE_GERAN_Gb); OSMO_ASSERT(ra); OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
@@ -160,7 +160,7 @@ printf("Testing Routing Area find\n");
sgsn = sgsn_instance_alloc(tall_sgsn_ctx); - ra_a = sgsn_ra_alloc(&rai, RA_TYPE_GERAN_Gb); + ra_a = sgsn_ra_find_or_create(&rai, RA_TYPE_GERAN_Gb); OSMO_ASSERT(ra_a); OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
@@ -194,7 +194,7 @@ cgi.cell_identity = cell_id_not_found; cgi_ps.cell_identity = cell_id_not_found;
- ra_a = sgsn_ra_alloc(&rai, RA_TYPE_GERAN_Gb); + ra_a = sgsn_ra_find_or_create(&rai, RA_TYPE_GERAN_Gb); OSMO_ASSERT(ra_a); OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1);
@@ -263,7 +263,7 @@ printf("Testing Routing Area BSSGP BVC RESET IND\n");
sgsn = sgsn_instance_alloc(tall_sgsn_ctx); - ra_a = sgsn_ra_alloc(&rai, RA_TYPE_GERAN_Gb); + ra_a = sgsn_ra_find_or_create(&rai, RA_TYPE_GERAN_Gb); OSMO_ASSERT(ra_a); OSMO_ASSERT(llist_count(&sgsn->routing_area->ra_list) == 1); OSMO_ASSERT(llist_count(&ra_a->cells_alive_list) == 0);