Change in osmo-mgw[master]: trunk: parse E1 trunk number

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/.

dexter gerrit-no-reply at lists.osmocom.org
Mon Jul 6 09:23:51 UTC 2020


dexter has submitted this change. ( https://gerrit.osmocom.org/c/osmo-mgw/+/18752 )

Change subject: trunk: parse E1 trunk number
......................................................................

trunk: parse E1 trunk number

The E1 trunk number is currently not parsed, whenever a trunk prefix is
detected that indicates an E1 trunk, then the entire request is
rejected.

Parse the trunk number and select the trunk accordingly

Related: OS#2547
Change-Id: Ifdaab953544151e73b58cc3e95d21afdb40765f4
---
M include/osmocom/mgcp/mgcp_trunk.h
M src/libosmo-mgcp/mgcp_trunk.c
M tests/mgcp/mgcp_test.c
3 files changed, 70 insertions(+), 5 deletions(-)

Approvals:
  pespin: Looks good to me, but someone else must approve
  dexter: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve
  Jenkins Builder: Verified



diff --git a/include/osmocom/mgcp/mgcp_trunk.h b/include/osmocom/mgcp/mgcp_trunk.h
index c6a0997..82728fe 100644
--- a/include/osmocom/mgcp/mgcp_trunk.h
+++ b/include/osmocom/mgcp/mgcp_trunk.h
@@ -50,6 +50,7 @@
 int mgcp_trunk_alloc_endpts(struct mgcp_trunk *tcfg);
 struct mgcp_trunk *mgcp_trunk_by_num(const struct mgcp_config *cfg, int index);
 struct mgcp_trunk *mgcp_trunk_by_name(const struct mgcp_config *cfg, const char *epname);
+int e1_trunk_nr_from_epname(const char *epname);
 
 /* The virtual trunk is always created on trunk id 0 for historical reasons,
  * use this define constant as ID when allocating a virtual trunk. Other
diff --git a/src/libosmo-mgcp/mgcp_trunk.c b/src/libosmo-mgcp/mgcp_trunk.c
index bd7bb2a..cc6637b 100644
--- a/src/libosmo-mgcp/mgcp_trunk.c
+++ b/src/libosmo-mgcp/mgcp_trunk.c
@@ -118,6 +118,27 @@
 	return NULL;
 }
 
+/* Made public for unit-testing, do not use from outside this file */
+int e1_trunk_nr_from_epname(const char *epname)
+{
+	unsigned long int trunk_nr;
+	size_t prefix_len;
+	char *str_trunk_nr_end;
+
+	prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_E1_TRUNK) - 1;
+	if (strncmp(epname, MGCP_ENDPOINT_PREFIX_E1_TRUNK, prefix_len) != 0)
+		return -EINVAL;
+
+	errno = 0;
+	trunk_nr = strtoul(epname + prefix_len, &str_trunk_nr_end, 10);
+	if (errno == ERANGE || trunk_nr > 64 || trunk_nr == 0
+	    || epname + prefix_len == str_trunk_nr_end
+	    || str_trunk_nr_end[0] != '/')
+		return -EINVAL;
+	else
+		return trunk_nr;
+}
+
 /*! Find a trunk by the trunk prefix in the endpoint name.
  *  \param[in] epname endpoint name with trunk prefix to look up.
  *  \param[in] cfg that contains the trunks where the endpoint is located.
@@ -126,6 +147,7 @@
 {
 	size_t prefix_len;
 	char epname_lc[MGCP_ENDPOINT_MAXLEN];
+	unsigned long int trunk_nr;
 
 	osmo_str_tolower_buf(epname_lc, sizeof(epname_lc), epname);
 	epname = epname_lc;
@@ -135,13 +157,12 @@
 		return mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);
 	}
 
-	/* E1 trunks are not implemented yet, so we deny any request for an
-	 * e1 trunk for now. */
 	prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_E1_TRUNK) - 1;
 	if (strncmp(epname, MGCP_ENDPOINT_PREFIX_E1_TRUNK, prefix_len) == 0) {
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "endpoint name \"%s\" suggests an E1 trunk, but E1 trunks are not implemented in this version of osmo-mgw!\n", epname);
-		return NULL;
+		trunk_nr = e1_trunk_nr_from_epname(epname);
+		if (trunk_nr < 0)
+			return NULL;
+		return mgcp_trunk_by_num(cfg, trunk_nr);
 	}
 
 	/* Earlier versions of osmo-mgw were accepting endpoint names
diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c
index 56a17b1..b0647f4 100644
--- a/tests/mgcp/mgcp_test.c
+++ b/tests/mgcp/mgcp_test.c
@@ -2130,6 +2130,48 @@
 	talloc_free(conn);
 }
 
+void test_e1_trunk_nr_from_epname()
+{
+	int trunk_nr;
+
+	/* Note: e1_trunk_nr_from_epname does not check the text
+	 * after the E1 trunk number, after the delimiter
+	 * character "/" arbitrary text may follow. */
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-1/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == 1);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-2/s-2/su16-0");
+	OSMO_ASSERT(trunk_nr == 2);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-3/s-23/su32-0");
+	OSMO_ASSERT(trunk_nr == 3);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-3/xxxxxxx");
+	OSMO_ASSERT(trunk_nr == 3);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-24/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == 24);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-64/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == 64);
+
+	/* The following endpoint strings should fail, either the
+	 * trunk number exceeds the valid range or the trunk prefix
+	 * is wrong. Also when the delimiter character "/" at the
+	 * end of the trunk is wrong the parsing should fail. */
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-0/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == -EINVAL);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-65/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == -EINVAL);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1--1/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == -EINVAL);
+	trunk_nr = e1_trunk_nr_from_epname("xxxxxx4zyz");
+	OSMO_ASSERT(trunk_nr == -EINVAL);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1+2/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == -EINVAL);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e2-24/s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == -EINVAL);
+	trunk_nr = e1_trunk_nr_from_epname("ds/e1-24s-1/su16-0");
+	OSMO_ASSERT(trunk_nr == -EINVAL);
+
+	return;
+}
+
 int main(int argc, char **argv)
 {
 	void *ctx = talloc_named_const(NULL, 0, "mgcp_test");
@@ -2155,6 +2197,7 @@
 	test_check_local_cx_options(ctx);
 	test_mgcp_codec_pt_translate();
 	test_conn_id_matching();
+	test_e1_trunk_nr_from_epname();
 
 	OSMO_ASSERT(talloc_total_size(msgb_ctx) == 0);
 	OSMO_ASSERT(talloc_total_blocks(msgb_ctx) == 1);

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-mgw/+/18752
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-mgw
Gerrit-Branch: master
Gerrit-Change-Id: Ifdaab953544151e73b58cc3e95d21afdb40765f4
Gerrit-Change-Number: 18752
Gerrit-PatchSet: 14
Gerrit-Owner: dexter <pmaier at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: pespin <pespin at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200706/069dac25/attachment.htm>


More information about the gerrit-log mailing list