pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmo-sigtran/+/38640?usp=email )


Change subject: sigtran: Make osmo_ss7_user APIs private
......................................................................

sigtran: Make osmo_ss7_user APIs private

ss7_user objects are managed so far exclusively through libosmo-sigtran
internal upper layers (SCCP), hence make the struct as well as all its
APIs private.

Change-Id: I59d8f70aa81ba396159af40ffd7e8cc6c27cb864
---
M include/osmocom/sigtran/osmo_ss7.h
M src/Makefile.am
M src/osmo_ss7.c
M src/osmo_ss7_hmrt.c
A src/osmo_ss7_user.c
M src/sccp_internal.h
M src/sccp_user.c
A src/ss7_user.h
M tests/ss7/ss7_test.c
9 files changed, 162 insertions(+), 37 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran 
refs/changes/40/38640/1

diff --git a/include/osmocom/sigtran/osmo_ss7.h 
b/include/osmocom/sigtran/osmo_ss7.h
index 9a754cd..6fbe76c 100644
--- a/include/osmocom/sigtran/osmo_ss7.h
+++ b/include/osmocom/sigtran/osmo_ss7.h
@@ -98,28 +98,7 @@
  * MTP Users (Users of MTP, such as SCCP or ISUP)
  ***********************************************************************/

-struct osmo_ss7_user {
-       /* pointer back to SS7 instance */
-       struct osmo_ss7_instance *inst;
-       /* name of the user */
-       const char *name;
-       /* primitive call-back for incoming MTP primitives */
-       osmo_prim_cb prim_cb;
-       /* private data */
-       void *priv;
-};
-
-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);
-
-int osmo_ss7_mtp_to_user(struct osmo_ss7_instance *inst, struct osmo_mtp_prim 
*omp);
-
-/* SS7 User wants to issue MTP-TRANSFER.req */
-int osmo_ss7_user_mtp_xfer_req(struct osmo_ss7_instance *inst,
-                               struct osmo_mtp_prim *omp);
+struct osmo_ss7_user;

 /***********************************************************************
  * SS7 Links
diff --git a/src/Makefile.am b/src/Makefile.am
index 6dd338e..8d074e9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -9,6 +9,7 @@
        ss7_linkset.h \
        ss7_route.h \
        ss7_route_table.h \
+       ss7_user.h \
        xua_asp_fsm.h \
        xua_as_fsm.h \
        xua_internal.h \
@@ -45,6 +46,7 @@
        osmo_ss7_xua_srv.c \
        osmo_ss7_route.c \
        osmo_ss7_route_table.c \
+       osmo_ss7_user.h \
        sccp2sua.c \
        sccp_helpers.c \
        sccp_lbcs.c \
diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c
index 8f6d417..ab88780 100644
--- a/src/osmo_ss7.c
+++ b/src/osmo_ss7.c
@@ -423,7 +423,7 @@
  *  \param[in] service_ind Service (ISUP, SCCP, ...)
  *  \param[in] user SS7 user (including primitive call-back)
  *  \returns 0 on success; negative on error */
-int osmo_ss7_user_register(struct osmo_ss7_instance *inst, uint8_t service_ind,
+int ss7_user_register(struct osmo_ss7_instance *inst, uint8_t service_ind,
                           struct osmo_ss7_user *user)
 {
        if (service_ind >= ARRAY_SIZE(inst->user))
@@ -447,7 +447,7 @@
  *  \param[in] user (optional) SS7 user. If present, we will not
  *             unregister other users
  *  \returns 0 on success; negative on error */
-int osmo_ss7_user_unregister(struct osmo_ss7_instance *inst, uint8_t 
service_ind,
+int ss7_user_unregister(struct osmo_ss7_instance *inst, uint8_t service_ind,
                             struct osmo_ss7_user *user)
 {
        if (service_ind >= ARRAY_SIZE(inst->user))
@@ -467,7 +467,7 @@
 }

 /* deliver to a local MTP user */
-int osmo_ss7_mtp_to_user(struct osmo_ss7_instance *inst, struct osmo_mtp_prim 
*omp)
+int ss7_mtp_to_user(struct osmo_ss7_instance *inst, struct osmo_mtp_prim *omp)
 {
        uint32_t service_ind;
        const struct osmo_ss7_user *osu;
diff --git a/src/osmo_ss7_hmrt.c b/src/osmo_ss7_hmrt.c
index b0208b0..e504cb1 100644
--- a/src/osmo_ss7_hmrt.c
+++ b/src/osmo_ss7_hmrt.c
@@ -39,6 +39,7 @@
 #include "ss7_route.h"
 #include "ss7_route_table.h"
 #include "ss7_internal.h"
+#include "ss7_user.h"

 /* convert from M3UA message to MTP-TRANSFER.ind osmo_mtp_prim */
 struct osmo_mtp_prim *m3ua_to_xfer_ind(struct xua_msg *xua)
diff --git a/src/osmo_ss7_user.c b/src/osmo_ss7_user.c
new file mode 100644
index 0000000..9d17d7a
--- /dev/null
+++ b/src/osmo_ss7_user.c
@@ -0,0 +1,106 @@
+/* (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/sigtran/osmo_ss7.h>
+
+#include "ss7_internal.h"
+
+/***********************************************************************
+ * MTP Users (Users of MTP, such as SCCP or ISUP)
+ ***********************************************************************/
+
+/*! \brief Register a MTP user for a given service indicator
+ *  \param[in] inst SS7 instance for which we register the user
+ *  \param[in] service_ind Service (ISUP, SCCP, ...)
+ *  \param[in] user SS7 user (including primitive call-back)
+ *  \returns 0 on success; negative on error */
+int ss7_user_register(struct osmo_ss7_instance *inst, uint8_t service_ind,
+                          struct osmo_ss7_user *user)
+{
+       if (service_ind >= ARRAY_SIZE(inst->user))
+               return -EINVAL;
+
+       if (inst->user[service_ind])
+               return -EBUSY;
+
+       DEBUGP(DLSS7, "registering user=%s for SI %u with priv %p\n",
+               user->name, service_ind, user->priv);
+
+       user->inst = inst;
+       inst->user[service_ind] = user;
+
+       return 0;
+}
+
+/*! \brief Unregister a MTP user for a given service indicator
+ *  \param[in] inst SS7 instance for which we register the user
+ *  \param[in] service_ind Service (ISUP, SCCP, ...)
+ *  \param[in] user (optional) SS7 user. If present, we will not
+ *             unregister other users
+ *  \returns 0 on success; negative on error */
+int ss7_user_unregister(struct osmo_ss7_instance *inst, uint8_t service_ind,
+                            struct osmo_ss7_user *user)
+{
+       if (service_ind >= ARRAY_SIZE(inst->user))
+               return -EINVAL;
+
+       if (!inst->user[service_ind])
+               return -ENODEV;
+
+       if (user && (inst->user[service_ind] != user))
+               return -EINVAL;
+
+       if (user)
+               user->inst = NULL;
+       inst->user[service_ind] = NULL;
+
+       return 0;
+}
+
+/* deliver to a local MTP user */
+int ss7_mtp_to_user(struct osmo_ss7_instance *inst, struct osmo_mtp_prim *omp)
+{
+       uint32_t service_ind;
+       const struct osmo_ss7_user *osu;
+
+       if (omp->oph.sap != MTP_SAP_USER ||
+           omp->oph.primitive != OSMO_MTP_PRIM_TRANSFER ||
+           omp->oph.operation != PRIM_OP_INDICATION) {
+               LOGP(DLSS7, LOGL_ERROR, "Unsupported Primitive\n");
+               return -EINVAL;
+       }
+
+       service_ind = omp->u.transfer.sio & 0xF;
+       osu = inst->user[service_ind];
+
+       if (!osu) {
+               LOGP(DLSS7, LOGL_NOTICE, "No MTP-User for SI %u\n", 
service_ind);
+               return -ENODEV;
+       }
+
+       DEBUGP(DLSS7, "delivering MTP-TRANSFER.ind to user %s, priv=%p\n",
+               osu->name, osu->priv);
+       return osu->prim_cb(&omp->oph, (void *) osu->priv);
+}
diff --git a/src/sccp_internal.h b/src/sccp_internal.h
index 0367fe1..6f1fdb9 100644
--- a/src/sccp_internal.h
+++ b/src/sccp_internal.h
@@ -11,6 +11,8 @@

 #define SCCP_STR "Signalling Connection Control Part\n"

+#include "ss7_user.h"
+
 /* Appendix C.4 of Q.714 */
 enum osmo_sccp_timer {
        /* 0 kept unused on purpose since it's handled specially by osmo_fsm */
diff --git a/src/sccp_user.c b/src/sccp_user.c
index 6edbfd1..1ca5f1c 100644
--- a/src/sccp_user.c
+++ b/src/sccp_user.c
@@ -250,7 +250,7 @@
                return NULL;
        }

-       osmo_ss7_user_register(ss7, MTP_SI_SCCP, &inst->ss7_user);
+       ss7_user_register(ss7, MTP_SI_SCCP, &inst->ss7_user);

        llist_add_tail(&inst->list, &sccp_instances);

@@ -262,7 +262,7 @@
        struct osmo_sccp_user *scu, *scu2;

        inst->ss7->sccp = NULL;
-       osmo_ss7_user_unregister(inst->ss7, MTP_SI_SCCP, &inst->ss7_user);
+       ss7_user_unregister(inst->ss7, MTP_SI_SCCP, &inst->ss7_user);

        llist_for_each_entry_safe(scu, scu2, &inst->users, list) {
                osmo_sccp_user_unbind(scu);
diff --git a/src/ss7_user.h b/src/ss7_user.h
new file mode 100644
index 0000000..34d7342
--- /dev/null
+++ b/src/ss7_user.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <stdint.h>
+#include <osmocom/core/prim.h>
+#include <osmocom/sigtran/mtp_sap.h>
+
+/***********************************************************************
+ * SS7 Linksets
+ ***********************************************************************/
+
+struct osmo_ss7_instance;
+
+struct osmo_ss7_user {
+       /* pointer back to SS7 instance */
+       struct osmo_ss7_instance *inst;
+       /* name of the user */
+       const char *name;
+       /* primitive call-back for incoming MTP primitives */
+       osmo_prim_cb prim_cb;
+       /* private data */
+       void *priv;
+};
+
+int ss7_user_register(struct osmo_ss7_instance *inst, uint8_t service_ind,
+                          struct osmo_ss7_user *user);
+
+int ss7_user_unregister(struct osmo_ss7_instance *inst, uint8_t service_ind,
+                            struct osmo_ss7_user *user);
+
+int ss7_mtp_to_user(struct osmo_ss7_instance *inst, struct osmo_mtp_prim *omp);
+
+/* SS7 User wants to issue MTP-TRANSFER.req */
+int osmo_ss7_user_mtp_xfer_req(struct osmo_ss7_instance *inst,
+                               struct osmo_mtp_prim *omp);
diff --git a/tests/ss7/ss7_test.c b/tests/ss7/ss7_test.c
index 7d4ec5f..6fd21d7 100644
--- a/tests/ss7/ss7_test.c
+++ b/tests/ss7/ss7_test.c
@@ -2,6 +2,7 @@
 #include "../src/ss7_linkset.h"
 #include "../src/ss7_route.h"
 #include "../src/ss7_route_table.h"
+#include "../src/ss7_user.h"
 #include "../src/xua_internal.h"
 #include "../src/xua_asp_fsm.h"

@@ -117,25 +118,25 @@
        user.prim_cb = test_user_prim_cb;

        /* registration */
-       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);
+       OSMO_ASSERT(ss7_user_register(s7i, 1, &user) == 0);
+       OSMO_ASSERT(ss7_user_register(s7i, 1, NULL) == -EBUSY);
+       OSMO_ASSERT(ss7_user_register(s7i, 255, NULL) == -EINVAL);

        /* primitive delivery */
-       OSMO_ASSERT(osmo_ss7_mtp_to_user(s7i, &omp) == 23);
+       OSMO_ASSERT(ss7_mtp_to_user(s7i, &omp) == 23);

        /* 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(ss7_user_unregister(s7i, 255, NULL) == -EINVAL);
+       OSMO_ASSERT(ss7_user_unregister(s7i, 10, NULL) == -ENODEV);
+       OSMO_ASSERT(ss7_user_unregister(s7i, 1, &user2) == -EINVAL);
+       OSMO_ASSERT(ss7_user_unregister(s7i, 1, &user) == 0);

        /* primitive delivery should fail now */
-       OSMO_ASSERT(osmo_ss7_mtp_to_user(s7i, &omp) == -ENODEV);
+       OSMO_ASSERT(ss7_mtp_to_user(s7i, &omp) == -ENODEV);

        /* wrong primitive delivery should also fail */
        omp.oph.primitive = OSMO_MTP_PRIM_PAUSE;
-       OSMO_ASSERT(osmo_ss7_mtp_to_user(s7i, &omp) == -EINVAL);
+       OSMO_ASSERT(ss7_mtp_to_user(s7i, &omp) == -EINVAL);
 }

 static void test_route(void)

--
To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/38640?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: I59d8f70aa81ba396159af40ffd7e8cc6c27cb864
Gerrit-Change-Number: 38640
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>

Reply via email to