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 <[email protected]>
+ * (C) 2023-2024 by sysmocom s.f.m.c. GmbH <[email protected]>
+ * 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: newchange
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I81b424239e9f7d4dc84bf167053f784ad2e8ca49
Gerrit-Change-Number: 38727
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>

Reply via email to