osmith has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/38753?usp=email )
Change subject: Add osmo_ss7 APIs ...................................................................... Add osmo_ss7 APIs Prepare OsmoBSC to work with newer versions of libosmo-sigtran, where struct osmo_ss7_instance was made private. Ensure the APIs are always present even if building with older libosmo-sigtran, so we can apply patches that switches over to using these APIs instead of accessing the struct directly. Related: OS#6617 Change-Id: I327664775e94cf1bae203e98f3324d9ab63ee6d0 --- M configure.ac M include/osmocom/bsc/Makefile.am A include/osmocom/bsc/sigtran_compat.h M src/osmo-bsc/Makefile.am M src/osmo-bsc/bsc_ctrl.c M src/osmo-bsc/bsc_vty.c M src/osmo-bsc/lb.c M src/osmo-bsc/osmo_bsc_sigtran.c A src/osmo-bsc/sigtran_compat.c 9 files changed, 154 insertions(+), 0 deletions(-) Approvals: osmith: Verified fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved diff --git a/configure.ac b/configure.ac index ef43aa6..601134d 100644 --- a/configure.ac +++ b/configure.ac @@ -224,6 +224,18 @@ AC_MSG_RESULT([CFLAGS="$CFLAGS"]) AC_MSG_RESULT([CPPFLAGS="$CPPFLAGS"]) +# OS#6617: check if libosmo-sigtran has private structs +# We need to use grep here, can't set the includedir with AC_CHECK_DECL. +m="OS#6617: checking whether libosmo-sigtran has private structs..." +h="$($PKG_CONFIG --variable=includedir libosmo-sigtran)/osmocom/sigtran/osmo_ss7.h" +f=osmo_ss7_as_select_asp +if grep -q "$f" "$h"; then + echo "$m yes ($f in $h)" + AC_DEFINE(SIGTRAN_PRIVATE_STRUCTS, [1], ["OS#6617"]) +else + echo "$m no ($f not in $h)" +fi + dnl Generate the output AM_CONFIG_HEADER(bscconfig.h) diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am index a560f23..d0f7c52 100644 --- a/include/osmocom/bsc/Makefile.am +++ b/include/osmocom/bsc/Makefile.am @@ -67,4 +67,5 @@ smscb.h \ power_control.h \ vgcs_fsm.h \ + sigtran_compat.h \ $(NULL) diff --git a/include/osmocom/bsc/sigtran_compat.h b/include/osmocom/bsc/sigtran_compat.h new file mode 100644 index 0000000..95d4e33 --- /dev/null +++ b/include/osmocom/bsc/sigtran_compat.h @@ -0,0 +1,32 @@ +#pragma once +#include "../../bscconfig.h" + +#include <osmocom/sigtran/osmo_ss7.h> + +#ifndef SIGTRAN_PRIVATE_STRUCTS + +static inline struct osmo_ss7_as *osmo_ss7_route_get_dest_as(struct osmo_ss7_route *rt) +{ + return rt->dest.as; +} + +static inline uint32_t osmo_ss7_instance_get_id(const struct osmo_ss7_instance *inst) +{ + return inst->cfg.id; +} + +static inline struct osmo_ss7_instance *osmo_ss7_instances_llist_entry(struct llist_head *list) +{ + struct osmo_ss7_instance *pos; + pos = llist_entry(list, struct osmo_ss7_instance, list); + return pos; +} + +static inline enum osmo_ss7_asp_protocol osmo_ss7_as_get_asp_protocol(const struct osmo_ss7_as *as) +{ + return as->cfg.proto; +} + +struct osmo_ss7_asp *osmo_ss7_as_select_asp(struct osmo_ss7_as *as); + +#endif diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am index 1026523..2ac133f 100644 --- a/src/osmo-bsc/Makefile.am +++ b/src/osmo-bsc/Makefile.am @@ -117,6 +117,7 @@ cbch_scheduler.c \ cbsp_link.c \ power_control.c \ + sigtran_compat.c \ $(NULL) libbsc_la_LIBADD = \ diff --git a/src/osmo-bsc/bsc_ctrl.c b/src/osmo-bsc/bsc_ctrl.c index aff1d83..caef66e 100644 --- a/src/osmo-bsc/bsc_ctrl.c +++ b/src/osmo-bsc/bsc_ctrl.c @@ -44,6 +44,7 @@ #include <osmocom/bsc/ctrl.h> #include <osmocom/bsc/handover_ctrl.h> #include <osmocom/bsc/neighbor_ident.h> +#include <osmocom/bsc/sigtran_compat.h> static int verify_net_apply_config_file(struct ctrl_cmd *cmd, const char *value, void *_data) { diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c index 8690a47..9558330 100644 --- a/src/osmo-bsc/bsc_vty.c +++ b/src/osmo-bsc/bsc_vty.c @@ -68,6 +68,7 @@ #include <osmocom/bsc/bsc_msc_data.h> #include <osmocom/bsc/lchan.h> #include <osmocom/bsc/pcu_if.h> +#include <osmocom/bsc/sigtran_compat.h> #include <inttypes.h> diff --git a/src/osmo-bsc/lb.c b/src/osmo-bsc/lb.c index 511a545..9d5f78e 100644 --- a/src/osmo-bsc/lb.c +++ b/src/osmo-bsc/lb.c @@ -32,6 +32,7 @@ #include <osmocom/bsc/lcs_loc_req.h> #include <osmocom/bsc/bssmap_reset.h> #include <osmocom/bsc/gsm_data.h> +#include <osmocom/bsc/sigtran_compat.h> /* Send reset to SMLC */ int bssmap_le_tx_reset(void) diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c index cdc5785..d1d4d18 100644 --- a/src/osmo-bsc/osmo_bsc_sigtran.c +++ b/src/osmo-bsc/osmo_bsc_sigtran.c @@ -37,6 +37,7 @@ #include <osmocom/bsc/bts.h> #include <osmocom/bsc/paging.h> #include <osmocom/bsc/bssmap_reset.h> +#include <osmocom/bsc/sigtran_compat.h> #include <osmocom/mgcp_client/mgcp_common.h> #include <osmocom/netif/ipa.h> diff --git a/src/osmo-bsc/sigtran_compat.c b/src/osmo-bsc/sigtran_compat.c new file mode 100644 index 0000000..190fbd8 --- /dev/null +++ b/src/osmo-bsc/sigtran_compat.c @@ -0,0 +1,104 @@ +/* (C) 2024 by sysmocom s.f.m.c. GmbH <i...@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 "../../bscconfig.h" + +#include <osmocom/bsc/sigtran_compat.h> + +#ifndef SIGTRAN_PRIVATE_STRUCTS + +static struct osmo_ss7_asp *ss7_as_select_asp_override(struct osmo_ss7_as *as) +{ + struct osmo_ss7_asp *asp; + unsigned int i; + + /* FIXME: proper selection of the ASP based on the SLS! */ + for (i = 0; i < ARRAY_SIZE(as->cfg.asps); i++) { + asp = as->cfg.asps[i]; + if (asp && osmo_ss7_asp_active(asp)) + break; + } + return asp; +} + +static struct osmo_ss7_asp *ss7_as_select_asp_roundrobin(struct osmo_ss7_as *as) +{ + struct osmo_ss7_asp *asp; + unsigned int i; + unsigned int first_idx; + + first_idx = (as->cfg.last_asp_idx_sent + 1) % ARRAY_SIZE(as->cfg.asps); + i = first_idx; + do { + asp = as->cfg.asps[i]; + if (asp && osmo_ss7_asp_active(asp)) + break; + i = (i + 1) % ARRAY_SIZE(as->cfg.asps); + } while (i != first_idx); + as->cfg.last_asp_idx_sent = i; + + return asp; +} + +/* returns NULL if multiple ASPs would need to be selected. */ +static struct osmo_ss7_asp *ss7_as_select_asp_broadcast(struct osmo_ss7_as *as) +{ + struct osmo_ss7_asp *asp; + struct osmo_ss7_asp *asp_found = NULL; + + for (unsigned int i = 0; i < ARRAY_SIZE(as->cfg.asps); i++) { + asp = as->cfg.asps[i]; + if (!asp || !osmo_ss7_asp_active(asp)) + continue; + if (asp_found) /* >1 ASPs selected, early return */ + return NULL; + asp_found = asp; + } + return asp_found; +} + +struct osmo_ss7_asp *osmo_ss7_as_select_asp(struct osmo_ss7_as *as) +{ + struct osmo_ss7_asp *asp = NULL; + + switch (as->cfg.mode) { + case OSMO_SS7_AS_TMOD_OVERRIDE: + asp = ss7_as_select_asp_override(as); + break; + case OSMO_SS7_AS_TMOD_LOADSHARE: + /* TODO: actually use the SLS value to ensure same SLS goes + * through same ASP. Not strictly required by M3UA RFC, but + * would fit the overall principle. */ + case OSMO_SS7_AS_TMOD_ROUNDROBIN: + asp = ss7_as_select_asp_roundrobin(as); + break; + case OSMO_SS7_AS_TMOD_BCAST: + return ss7_as_select_asp_broadcast(as); + case _NUM_OSMO_SS7_ASP_TMOD: + OSMO_ASSERT(false); + } + + if (!asp) { + LOGPFSM(as->fi, "No selectable ASP in AS\n"); + return NULL; + } + return asp; +} + +#endif -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/38753?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: osmo-bsc Gerrit-Branch: osmith/1.12.2 Gerrit-Change-Id: I327664775e94cf1bae203e98f3324d9ab63ee6d0 Gerrit-Change-Number: 38753 Gerrit-PatchSet: 2 Gerrit-Owner: osmith <osm...@sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanits...@sysmocom.de> Gerrit-Reviewer: laforge <lafo...@osmocom.org> Gerrit-Reviewer: osmith <osm...@sysmocom.de> Gerrit-Reviewer: pespin <pes...@sysmocom.de>