pespin has submitted this change. (
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(-)
Approvals:
Jenkins Builder: Verified
osmith: Looks good to me, but someone else must approve
fixeria: Looks good to me, approved
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(a)gnumonks.org>
+ * (C) 2023-2024 by sysmocom s.f.m.c. GmbH <info(a)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)
--
To view, visit
https://gerrit.osmocom.org/c/libosmo-sigtran/+/38727?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I81b424239e9f7d4dc84bf167053f784ad2e8ca49
Gerrit-Change-Number: 38727
Gerrit-PatchSet: 4
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>