[MERGED] libosmo-sccp[master]: ensure valid primary_pc in osmo_ss7_instance

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Wed Aug 9 12:58:58 UTC 2017


Harald Welte has submitted this change and it was merged.

Change subject: ensure valid primary_pc in osmo_ss7_instance
......................................................................


ensure valid primary_pc in osmo_ss7_instance

Initialize osmo_ss7_instance.cfg.primary_pc = OSMO_SS7_PC_INVALID.
Adjust all code paths using primary_pc to ensure it is indeed valid.

Rationale:

It looks like we are going to use the primary point-code of an SS7 instance to
derive a local SCCP address, e.g. for osmo-bsc and osmo-hnbgw.

 cs7-instance 1
  point-code 1.2.3   ! sets osmo_ss7_instance.primary_pc = 1.2.3
  sccp-address msc
   point-code 0.0.1
   routing-indicator PC

 hnb
  iucs
   remote-addr msc   ! derives cs7 instance 1 and local pc 1.2.3

If 'point-code 1.2.3' is omitted, this becomes '0.0.0' without the user
noticing, and this happens for each client that omits it. I would like to barf
when no local PC is set.

Change-Id: I7f0f0c89b7335d9da24161bfac8234be214ca00c
---
M src/osmo_ss7.c
M src/osmo_ss7_vty.c
M src/sccp_scoc.c
M src/sccp_scrc.c
M src/sccp_user.c
5 files changed, 19 insertions(+), 6 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c
index 6db3f14..f82f952 100644
--- a/src/osmo_ss7.c
+++ b/src/osmo_ss7.c
@@ -354,6 +354,8 @@
 	if (!inst)
 		return NULL;
 
+	inst->cfg.primary_pc = OSMO_SS7_PC_INVALID;
+
 	inst->cfg.id = id;
 	LOGSS7(inst, LOGL_INFO, "Creating SS7 Instance\n");
 
@@ -1825,7 +1827,7 @@
 bool osmo_ss7_pc_is_local(struct osmo_ss7_instance *inst, uint32_t pc)
 {
 	OSMO_ASSERT(ss7_initialized);
-	if (pc == inst->cfg.primary_pc)
+	if (osmo_ss7_pc_is_valid(inst->cfg.primary_pc) && pc == inst->cfg.primary_pc)
 		return true;
 	/* FIXME: Secondary and Capability Point Codes */
 	return false;
diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c
index 476aedf..164b7f2 100644
--- a/src/osmo_ss7_vty.c
+++ b/src/osmo_ss7_vty.c
@@ -166,7 +166,7 @@
 {
 	struct osmo_ss7_instance *inst = vty->index;
 	int pc = osmo_ss7_pointcode_parse(inst, argv[0]);
-	if (pc < 0) {
+	if (pc < 0 || !osmo_ss7_pc_is_valid((uint32_t)pc)) {
 		vty_out(vty, "Invalid point code (%s)%s", argv[0], VTY_NEWLINE);
 		return CMD_WARNING;
 	}
@@ -1536,7 +1536,7 @@
 	if (inst->cfg.pc_fmt.delimiter != '.')
 		vty_out(vty, " point-code delimiter dash%s", VTY_NEWLINE);
 
-	if (inst->cfg.primary_pc)
+	if (osmo_ss7_pc_is_valid(inst->cfg.primary_pc))
 		vty_out(vty, " point-code %s%s",
 			osmo_ss7_pointcode_print(inst, inst->cfg.primary_pc),
 			VTY_NEWLINE);
diff --git a/src/sccp_scoc.c b/src/sccp_scoc.c
index 3d43448..9820c40 100644
--- a/src/sccp_scoc.c
+++ b/src/sccp_scoc.c
@@ -1670,11 +1670,11 @@
 {
 	struct osmo_ss7_instance *s7i = conn->inst->ss7;
 	struct osmo_sccp_addr *remote_addr;
-	uint32_t local_pc;
+	uint32_t local_pc = OSMO_SS7_PC_INVALID;
 
 	if (conn->user->pc_valid)
 		local_pc = conn->user->pc;
-	else
+	else if (osmo_ss7_pc_is_valid(s7i->cfg.primary_pc))
 		local_pc = s7i->cfg.primary_pc;
 
 	if (conn->incoming)
diff --git a/src/sccp_scrc.c b/src/sccp_scrc.c
index e44201a..2afd696 100644
--- a/src/sccp_scrc.c
+++ b/src/sccp_scrc.c
@@ -91,8 +91,14 @@
 	param = &omp->u.transfer;
 	if (sua->mtp.opc)
 		param->opc = sua->mtp.opc;
-	else
+	else {
+		if (!osmo_ss7_pc_is_valid(s7i->cfg.primary_pc)) {
+			LOGP(DLSCCP, LOGL_ERROR, "SS7 instance %u: no primary point-code set\n",
+			     s7i->cfg.id);
+			return -1;
+		}
 		param->opc = s7i->cfg.primary_pc;
+	}
 	param->dpc = remote_pc;
 	param->sls = sua->mtp.sls;
 	param->sio = MTP_SIO(MTP_SI_SCCP, s7i->cfg.network_indicator);
diff --git a/src/sccp_user.c b/src/sccp_user.c
index 71b3262..d49da29 100644
--- a/src/sccp_user.c
+++ b/src/sccp_user.c
@@ -366,6 +366,11 @@
 			goto out_ss7;
 		as_created = true;
 
+		if (!osmo_ss7_pc_is_valid(ss7->cfg.primary_pc)) {
+			LOGP(DLSCCP, LOGL_ERROR, "SS7 instance %u: no primary point-code set\n",
+			     ss7->cfg.id);
+			goto out_ss7;
+		}
 		as->cfg.routing_key.pc = ss7->cfg.primary_pc;
 
 		/* install default route */

-- 
To view, visit https://gerrit.osmocom.org/3355
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I7f0f0c89b7335d9da24161bfac8234be214ca00c
Gerrit-PatchSet: 4
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list