pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-sigtran/+/38727?usp=email )
Change subject: sigtran: Add public APIs to manage struct osmo_ss7_user ......................................................................
sigtran: Add public APIs to manage struct osmo_ss7_user
Change-Id: I81b424239e9f7d4dc84bf167053f784ad2e8ca49 --- M TODO-RELEASE M include/osmocom/sigtran/osmo_ss7.h M src/Makefile.am A src/osmo_ss7_user.c M src/sccp_internal.h M src/sccp_user.c M tests/ss7/ss7_test.c 7 files changed, 102 insertions(+), 15 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran refs/changes/27/38727/1
diff --git a/TODO-RELEASE b/TODO-RELEASE index 08978d4..a8b60f1 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -14,3 +14,4 @@ libosmo-sigtran add API osmo_ss7_instance_get_id(), osmo_ss7_instance_get_name(), osmo_ss7_instance_get_pc_fmt(), osmo_ss7_instance_get_primary_pc(), osmo_ss7_get_sccp() libosmo-sigtran add API osmo_ss7_instances_llist_entry() libosmo-sigtran add API osmo_ss7_as_get_asp_protocol(), osmo_ss7_as_select_asp() +libosmo-sigtran add API osmo_ss7_user: create(), get_instance(), set_prim_cb(), set_priv(), get_priv() diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h index 361e715..ccf2247 100644 --- a/include/osmocom/sigtran/osmo_ss7.h +++ b/include/osmocom/sigtran/osmo_ss7.h @@ -128,9 +128,16 @@ void *priv; };
+struct osmo_ss7_user *osmo_ss7_user_create(struct osmo_ss7_instance *inst, const char *name); +void osmo_ss7_user_destroy(struct osmo_ss7_user *user); + +struct osmo_ss7_instance *osmo_ss7_user_get_instance(const struct osmo_ss7_user *user); +void osmo_ss7_user_set_prim_cb(struct osmo_ss7_user *user, osmo_prim_cb prim_cb); +void osmo_ss7_user_set_priv(struct osmo_ss7_user *user, void *priv); +void *osmo_ss7_user_get_priv(const struct osmo_ss7_user *user); + int osmo_ss7_user_register(struct osmo_ss7_instance *inst, uint8_t service_ind, struct osmo_ss7_user *user); - int osmo_ss7_user_unregister(struct osmo_ss7_instance *inst, uint8_t service_ind, struct osmo_ss7_user *user);
diff --git a/src/Makefile.am b/src/Makefile.am index 78e9764..44e6c34 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,6 +46,7 @@ osmo_ss7_xua_srv.c \ osmo_ss7_route.c \ osmo_ss7_route_table.c \ + osmo_ss7_user.c \ sccp2sua.c \ sccp_helpers.c \ sccp_lbcs.c \ diff --git a/src/osmo_ss7_user.c b/src/osmo_ss7_user.c new file mode 100644 index 0000000..3aea3a9 --- /dev/null +++ b/src/osmo_ss7_user.c @@ -0,0 +1,71 @@ +/* (C) 2015-2017 by Harald Welte laforge@gnumonks.org + * (C) 2023-2024 by sysmocom s.f.m.c. GmbH info@sysmocom.de + * All Rights Reserved + * + * SPDX-License-Identifier: GPL-2.0+ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + */ + +#include <errno.h> + +#include <osmocom/core/linuxlist.h> +#include <osmocom/core/logging.h> +#include <osmocom/core/talloc.h> +#include <osmocom/core/prim.h> +#include <osmocom/sigtran/osmo_ss7.h> + +#include "ss7_internal.h" + +/*********************************************************************** + * MTP Users (Users of MTP, such as SCCP or ISUP) + ***********************************************************************/ + +struct osmo_ss7_user *osmo_ss7_user_create(struct osmo_ss7_instance *inst, const char *name) +{ + struct osmo_ss7_user *user; + user = talloc_zero(inst, struct osmo_ss7_user); + if (!user) + return NULL; + + user->inst = inst; + user->name = talloc_strdup(user, name ? : ""); + return user; +} + +void osmo_ss7_user_destroy(struct osmo_ss7_user *user) +{ + talloc_free(user); +} + +struct osmo_ss7_instance *osmo_ss7_user_get_instance(const struct osmo_ss7_user *user) +{ + return user->inst; +} + +void osmo_ss7_user_set_prim_cb(struct osmo_ss7_user *user, osmo_prim_cb prim_cb) +{ + user->prim_cb = prim_cb; +} + +void osmo_ss7_user_set_priv(struct osmo_ss7_user *user, void *priv) +{ + user->priv = priv; +} + +void *osmo_ss7_user_get_priv(const struct osmo_ss7_user *user) +{ + return user->priv; +} diff --git a/src/sccp_internal.h b/src/sccp_internal.h index 0367fe1..dedcdcd 100644 --- a/src/sccp_internal.h +++ b/src/sccp_internal.h @@ -48,7 +48,7 @@ struct osmo_ss7_instance *ss7; void *priv;
- struct osmo_ss7_user ss7_user; + struct osmo_ss7_user *ss7_user;
struct osmo_tdef *tdefs;
diff --git a/src/sccp_user.c b/src/sccp_user.c index 4f94bf8..2cd5315 100644 --- a/src/sccp_user.c +++ b/src/sccp_user.c @@ -235,10 +235,6 @@ inst->priv = priv; INIT_LLIST_HEAD(&inst->users);
- inst->ss7_user.inst = ss7; - inst->ss7_user.name = "SCCP"; - inst->ss7_user.prim_cb = mtp_user_prim_cb; - inst->ss7_user.priv = inst; inst->max_optional_data = SCCP_MAX_OPTIONAL_DATA;
inst->tdefs = talloc_memdup(inst, osmo_sccp_timer_defaults, @@ -251,7 +247,10 @@ return NULL; }
- osmo_ss7_user_register(ss7, MTP_SI_SCCP, &inst->ss7_user); + inst->ss7_user = osmo_ss7_user_create(ss7, "SCCP"); + osmo_ss7_user_set_prim_cb(inst->ss7_user, mtp_user_prim_cb); + osmo_ss7_user_set_priv(inst->ss7_user, inst); + osmo_ss7_user_register(ss7, MTP_SI_SCCP, inst->ss7_user);
llist_add_tail(&inst->list, &sccp_instances);
@@ -263,7 +262,9 @@ struct osmo_sccp_user *scu, *scu2;
inst->ss7->sccp = NULL; - osmo_ss7_user_unregister(inst->ss7, MTP_SI_SCCP, &inst->ss7_user); + osmo_ss7_user_unregister(inst->ss7, MTP_SI_SCCP, inst->ss7_user); + osmo_ss7_user_destroy(inst->ss7_user); + inst->ss7_user = NULL;
llist_for_each_entry_safe(scu, scu2, &inst->users, list) { osmo_sccp_user_unbind(scu); diff --git a/tests/ss7/ss7_test.c b/tests/ss7/ss7_test.c index 7d4ec5f..5211fe6 100644 --- a/tests/ss7/ss7_test.c +++ b/tests/ss7/ss7_test.c @@ -98,7 +98,7 @@
static void test_user(void) { - struct osmo_ss7_user user, user2; + struct osmo_ss7_user *user, *user2; struct osmo_mtp_prim omp = { .oph = { .sap = MTP_SAP_USER, @@ -111,13 +111,16 @@ };
printf("Testing SS7 user\n"); + user = osmo_ss7_user_create(s7i, "testuser"); + osmo_ss7_user_set_prim_cb(user, test_user_prim_cb); + osmo_ss7_user_set_priv(user, (void *) 0x1234);
- user.name = "testuser"; - user.priv = (void *) 0x1234; - user.prim_cb = test_user_prim_cb; + user2 = osmo_ss7_user_create(s7i, "testuser_notregistered"); + osmo_ss7_user_set_prim_cb(user, test_user_prim_cb); + osmo_ss7_user_set_priv(user, (void *) 0x1234);
/* registration */ - OSMO_ASSERT(osmo_ss7_user_register(s7i, 1, &user) == 0); + OSMO_ASSERT(osmo_ss7_user_register(s7i, 1, user) == 0); OSMO_ASSERT(osmo_ss7_user_register(s7i, 1, NULL) == -EBUSY); OSMO_ASSERT(osmo_ss7_user_register(s7i, 255, NULL) == -EINVAL);
@@ -127,8 +130,8 @@ /* cleanup */ OSMO_ASSERT(osmo_ss7_user_unregister(s7i, 255, NULL) == -EINVAL); OSMO_ASSERT(osmo_ss7_user_unregister(s7i, 10, NULL) == -ENODEV); - OSMO_ASSERT(osmo_ss7_user_unregister(s7i, 1, &user2) == -EINVAL); - OSMO_ASSERT(osmo_ss7_user_unregister(s7i, 1, &user) == 0); + OSMO_ASSERT(osmo_ss7_user_unregister(s7i, 1, user2) == -EINVAL); + OSMO_ASSERT(osmo_ss7_user_unregister(s7i, 1, user) == 0);
/* primitive delivery should fail now */ OSMO_ASSERT(osmo_ss7_mtp_to_user(s7i, &omp) == -ENODEV); @@ -136,6 +139,9 @@ /* wrong primitive delivery should also fail */ omp.oph.primitive = OSMO_MTP_PRIM_PAUSE; OSMO_ASSERT(osmo_ss7_mtp_to_user(s7i, &omp) == -EINVAL); + + osmo_ss7_user_destroy(user); + osmo_ss7_user_destroy(user2); }
static void test_route(void)