[PATCH] libosmo-sccp[master]: osmo_ss7: default point-code format for parsing/printing wit...

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
Sun Apr 9 19:31:09 UTC 2017


Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/2265

to look at the new patch set (#5).

osmo_ss7: default point-code format for parsing/printing without ss7_instance

osmo_ss7_pointcode_print() osmo_ss7_pointcode_parse() etc. now support
passing a NULL ss7-instance which will lead to application of the
default ITU 3.8.3 point code format.

Change-Id: Ifb739e92e31eaaa0343dc57c9af8c9164d00175f
---
M include/osmocom/sigtran/osmo_ss7.h
M src/osmo_ss7.c
2 files changed, 43 insertions(+), 37 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/65/2265/5

diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h
index 56a3ea4..ebb7cb3 100644
--- a/include/osmocom/sigtran/osmo_ss7.h
+++ b/include/osmocom/sigtran/osmo_ss7.h
@@ -51,6 +51,11 @@
  * SS7 Instances
  ***********************************************************************/
 
+struct osmo_ss7_pc_fmt {
+	char delimiter;
+	uint8_t component_len[3];
+};
+
 struct osmo_ss7_instance {
 	/*! member of global list of instances */
 	struct llist_head list;
@@ -78,10 +83,7 @@
 		/* secondary PCs */
 		/* capability PCs */
 		uint8_t network_indicator;
-		struct {
-			char delimiter;
-			uint8_t component_len[3];
-		} pc_fmt;
+		struct osmo_ss7_pc_fmt pc_fmt;
 	} cfg;
 };
 
diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c
index d657b81..d3b71e7 100644
--- a/src/osmo_ss7.c
+++ b/src/osmo_ss7.c
@@ -71,7 +71,7 @@
 };
 
 #define LOGSS7(inst, level, fmt, args ...)	\
-	LOGP(DLSS7, level, "%u: " fmt, (inst)->cfg.id, ## args)
+	LOGP(DLSS7, level, "%u: " fmt, inst ? (inst)->cfg.id : 0, ## args)
 
 int osmo_ss7_find_free_rctx(struct osmo_ss7_instance *inst)
 {
@@ -87,6 +87,11 @@
 /***********************************************************************
  * SS7 Point Code Parsing / Printing
  ***********************************************************************/
+
+static const struct osmo_ss7_pc_fmt default_pc_fmt = {
+	.delimiter = '.',
+	.component_len = { 3, 8, 3},
+};
 
 /* like strcat() but appends a single character */
 static int strnappendchar(char *str, char c, size_t n)
@@ -104,7 +109,7 @@
 
 /* generate a format string for formatting a point code. The result can
  * e.g. be used with sscanf() or sprintf() */
-static const char *gen_pc_fmtstr(struct osmo_ss7_instance *inst,
+static const char *gen_pc_fmtstr(const struct osmo_ss7_pc_fmt *pc_fmt,
 				 unsigned int *num_comp_exp)
 {
 	static char buf[MAX_PC_STR_LEN];
@@ -114,15 +119,15 @@
 	strcat(buf, "%u");
 	num_comp++;
 
-	if (inst->cfg.pc_fmt.component_len[1] == 0)
+	if (pc_fmt->component_len[1] == 0)
 		goto out;
-	strnappendchar(buf, inst->cfg.pc_fmt.delimiter, sizeof(buf));
+	strnappendchar(buf, pc_fmt->delimiter, sizeof(buf));
 	strcat(buf, "%u");
 	num_comp++;
 
-	if (inst->cfg.pc_fmt.component_len[2] == 0)
+	if (pc_fmt->component_len[2] == 0)
 		goto out;
-	strnappendchar(buf, inst->cfg.pc_fmt.delimiter, sizeof(buf));
+	strnappendchar(buf, pc_fmt->delimiter, sizeof(buf));
 	strcat(buf, "%u");
 	num_comp++;
 out:
@@ -133,38 +138,35 @@
 
 /* get number of components we expect for a point code, depending on the
  * configuration of this ss7_instance */
-static unsigned int num_pc_comp_exp(struct osmo_ss7_instance *inst)
+static unsigned int num_pc_comp_exp(const struct osmo_ss7_pc_fmt *pc_fmt)
 {
 	unsigned int num_comp_exp = 1;
 
-	if (inst->cfg.pc_fmt.component_len[1])
+	if (pc_fmt->component_len[1])
 		num_comp_exp++;
-	if (inst->cfg.pc_fmt.component_len[2])
+	if (pc_fmt->component_len[2])
 		num_comp_exp++;
 
 	return num_comp_exp;
 }
 
 /* get the total width (in bits) of the point-codes in this ss7_instance */
-static unsigned int get_pc_width(struct osmo_ss7_instance *inst)
+static unsigned int get_pc_width(const struct osmo_ss7_pc_fmt *pc_fmt)
 {
-	return inst->cfg.pc_fmt.component_len[0] +
-		inst->cfg.pc_fmt.component_len[1] +
-		inst->cfg.pc_fmt.component_len[2];
+	return pc_fmt->component_len[0] + pc_fmt->component_len[1] + pc_fmt->component_len[2];
 }
 
 /* get the number of bits we must shift the given component of a point
  * code in this ss7_instance */
-static unsigned int get_pc_comp_shift(struct osmo_ss7_instance *inst,
+static unsigned int get_pc_comp_shift(const struct osmo_ss7_pc_fmt *pc_fmt,
 					unsigned int comp_num)
 {
-	uint32_t pc_width = get_pc_width(inst);
+	uint32_t pc_width = get_pc_width(pc_fmt);
 	switch (comp_num) {
 	case 0:
-		return pc_width - inst->cfg.pc_fmt.component_len[0];
+		return pc_width - pc_fmt->component_len[0];
 	case 1:
-		return pc_width - inst->cfg.pc_fmt.component_len[0] -
-			inst->cfg.pc_fmt.component_len[1];
+		return pc_width - pc_fmt->component_len[0] - pc_fmt->component_len[1];
 	case 2:
 		return 0;
 	default:
@@ -172,11 +174,11 @@
 	}
 }
 
-static uint32_t pc_comp_shift_and_mask(struct osmo_ss7_instance *inst,
+static uint32_t pc_comp_shift_and_mask(const struct osmo_ss7_pc_fmt *pc_fmt,
 					unsigned int comp_num, uint32_t pc)
 {
-	unsigned int shift = get_pc_comp_shift(inst, comp_num);
-	uint32_t mask = (1 << inst->cfg.pc_fmt.component_len[comp_num]) - 1;
+	unsigned int shift = get_pc_comp_shift(pc_fmt, comp_num);
+	uint32_t mask = (1 << pc_fmt->component_len[comp_num]) - 1;
 
 	return (pc >> shift) & mask;
 }
@@ -186,8 +188,9 @@
 int osmo_ss7_pointcode_parse(struct osmo_ss7_instance *inst, const char *str)
 {
 	unsigned int component[3];
-	unsigned int num_comp_exp = num_pc_comp_exp(inst);
-	const char *fmtstr = gen_pc_fmtstr(inst, &num_comp_exp);
+	const struct osmo_ss7_pc_fmt *pc_fmt = inst ? &inst->cfg.pc_fmt : &default_pc_fmt;
+	unsigned int num_comp_exp = num_pc_comp_exp(pc_fmt);
+	const char *fmtstr = gen_pc_fmtstr(pc_fmt, &num_comp_exp);
 	int i, rc;
 
 	rc = sscanf(str, fmtstr, &component[0], &component[1], &component[2]);
@@ -198,16 +201,16 @@
 	/* check none of the component values exceeds what can be
 	 * represented within its bit-width */
 	for (i = 0; i < num_comp_exp; i++) {
-		if (component[i] >= (1 << inst->cfg.pc_fmt.component_len[i]))
+		if (component[i] >= (1 << pc_fmt->component_len[i]))
 			goto err;
 	}
 
 	/* shift them all together */
-	rc = (component[0] << get_pc_comp_shift(inst, 0));
+	rc = (component[0] << get_pc_comp_shift(pc_fmt, 0));
 	if (num_comp_exp > 1)
-		rc |= (component[1] << get_pc_comp_shift(inst, 1));
+		rc |= (component[1] << get_pc_comp_shift(pc_fmt, 1));
 	if (num_comp_exp > 2)
-		rc |= (component[2] << get_pc_comp_shift(inst, 2));
+		rc |= (component[2] << get_pc_comp_shift(pc_fmt, 2));
 
 	return rc;
 
@@ -221,21 +224,22 @@
 const char *osmo_ss7_pointcode_print(struct osmo_ss7_instance *inst, uint32_t pc)
 {
 	static char buf[MAX_PC_STR_LEN];
-	unsigned int num_comp_exp = num_pc_comp_exp(inst);
-	const char *fmtstr = gen_pc_fmtstr(inst, &num_comp_exp);
+	const struct osmo_ss7_pc_fmt *pc_fmt = inst ? &inst->cfg.pc_fmt : &default_pc_fmt;
+	unsigned int num_comp_exp = num_pc_comp_exp(pc_fmt);
+	const char *fmtstr = gen_pc_fmtstr(pc_fmt, &num_comp_exp);
 
 	OSMO_ASSERT(fmtstr);
 	snprintf(buf, sizeof(buf), fmtstr,
-		 pc_comp_shift_and_mask(inst, 0, pc),
-		 pc_comp_shift_and_mask(inst, 1, pc),
-		 pc_comp_shift_and_mask(inst, 2, pc));
+		 pc_comp_shift_and_mask(pc_fmt, 0, pc),
+		 pc_comp_shift_and_mask(pc_fmt, 1, pc),
+		 pc_comp_shift_and_mask(pc_fmt, 2, pc));
 
 	return buf;
 }
 
 int osmo_ss7_pointcode_parse_mask_or_len(struct osmo_ss7_instance *inst, const char *in)
 {
-	unsigned int width = get_pc_width(inst);
+	unsigned int width = get_pc_width(inst ? &inst->cfg.pc_fmt : &default_pc_fmt);
 
 	if (in[0] == '/') {
 		/* parse mask by length */

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Ifb739e92e31eaaa0343dc57c9af8c9164d00175f
Gerrit-PatchSet: 5
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list