[PATCH] libosmo-sccp[master]: WIP: osmo-stp executable

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:28:47 UTC 2017


Review at  https://gerrit.osmocom.org/2281

WIP: osmo-stp executable

Change-Id: If32227b8d3127c6178e4ee45527ce65f69bc7b1e
---
M .gitignore
M Makefile.am
M configure.ac
M include/osmocom/sigtran/osmo_ss7.h
M src/osmo_ss7.c
A stp/Makefile.am
A stp/internal.h
R stp/osmo_ss7_vty.c
A stp/stp_main.c
9 files changed, 334 insertions(+), 60 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/81/2281/1

diff --git a/.gitignore b/.gitignore
index 83f1333..c38bac1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,6 +62,8 @@
 
 examples/m3ua_example
 
+stp/osmo-stp
+
 *.pc
 config.*
 
diff --git a/Makefile.am b/Makefile.am
index dd73ec2..ededdac 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,7 +1,7 @@
 AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
 
 AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
-SUBDIRS = include src tests examples
+SUBDIRS = include src tests examples stp
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libosmo-sccp.pc libosmo-mtp.pc libosmo-sigtran.pc libosmo-xua.pc
diff --git a/configure.ac b/configure.ac
index 6dc0ebd..82c7ee8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,5 +70,6 @@
     tests/xua/Makefile
     tests/ss7/Makefile
     examples/Makefile
+    stp/Makefile
     Makefile)
 
diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h
index cbc6a02..2d5eba9 100644
--- a/include/osmocom/sigtran/osmo_ss7.h
+++ b/include/osmocom/sigtran/osmo_ss7.h
@@ -9,6 +9,8 @@
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/prim.h>
 
+extern struct llist_head osmo_ss7_xua_servers;
+
 struct osmo_ss7_instance;
 struct osmo_ss7_user;
 struct osmo_sccp_instance;
diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c
index 103c05b..e55d55c 100644
--- a/src/osmo_ss7.c
+++ b/src/osmo_ss7.c
@@ -28,6 +28,7 @@
 
 #include <osmocom/sigtran/osmo_ss7.h>
 #include <osmocom/sigtran/mtp_sap.h>
+#include <osmocom/sigtran/protocol/mtp.h>
 #include <osmocom/sigtran/protocol/sua.h>
 #include <osmocom/sigtran/protocol/m3ua.h>
 
@@ -52,7 +53,7 @@
 static bool ss7_initialized = false;
 
 static LLIST_HEAD(ss7_instances);
-static LLIST_HEAD(ss7_xua_servers);
+LLIST_HEAD(osmo_ss7_xua_servers);
 static int32_t next_rctx = 1;
 
 struct value_string osmo_ss7_as_traffic_mode_vals[] = {
@@ -1449,7 +1450,7 @@
 	struct osmo_xua_server *xs;
 
 	OSMO_ASSERT(ss7_initialized);
-	llist_for_each_entry(xs, &ss7_xua_servers, list) {
+	llist_for_each_entry(xs, &osmo_ss7_xua_servers, list) {
 		if (proto == xs->cfg.proto &&
 		    local_port == xs->cfg.local.port)
 			return xs;
@@ -1498,7 +1499,7 @@
 	}
 
 	oxs->inst = inst;
-	llist_add_tail(&oxs->list, &ss7_xua_servers);
+	llist_add_tail(&oxs->list, &osmo_ss7_xua_servers);
 
 	return oxs;
 }
diff --git a/stp/Makefile.am b/stp/Makefile.am
new file mode 100644
index 0000000..3cc9112
--- /dev/null
+++ b/stp/Makefile.am
@@ -0,0 +1,9 @@
+AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
+AM_CFLAGS=-Wall -g $(LIBOSMOCORE_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMONETIF_CFLAGS) $(COVERAGE_FLAGS)
+AM_LDFLAGS=$(COVERAGE_LDFLAGS)
+
+noinst_PROGRAMS = osmo-stp
+
+osmo_stp_SOURCES = stp_main.c osmo_ss7_vty.c
+osmo_stp_LDADD = $(top_builddir)/src/libosmo-sigtran.la \
+		   $(LIBOSMOCORE_LIBS) $(LIBOSMOVTY_LIBS)
diff --git a/stp/internal.h b/stp/internal.h
new file mode 100644
index 0000000..0a434cc
--- /dev/null
+++ b/stp/internal.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include <osmocom/vty/command.h>
+
+enum stp_vty_node {
+	L_CS7_AS_NODE = _LAST_OSMOVTY_NODE + 1,
+	L_CS7_ASP_NODE,
+	L_CS7_SUA_NODE,
+	L_CS7_M3UA_NODE,
+	L_CS7_RTABLE_NODE,
+};
+
+int osmo_ss7_vty_init(void);
+int osmo_ss7_vty_go_parent(struct vty *vty);
+int osmo_ss7_is_config_node(struct vty *vty, int node);
+
+extern struct osmo_ss7_instance *g_s7i;
+
diff --git a/src/osmo_ss7_vty.c b/stp/osmo_ss7_vty.c
similarity index 74%
rename from src/osmo_ss7_vty.c
rename to stp/osmo_ss7_vty.c
index 80cd4d0..7863e8a 100644
--- a/src/osmo_ss7_vty.c
+++ b/stp/osmo_ss7_vty.c
@@ -33,6 +33,9 @@
 #include <osmocom/vty/misc.h>
 
 #include <osmocom/sigtran/osmo_ss7.h>
+#include <osmocom/sigtran/protocol/mtp.h>
+
+#include "internal.h"
 
 #define CS7_STR	"ITU-T Signaling System 7\n"
 #define PC_STR	"Point Code\n"
@@ -58,7 +61,7 @@
 	"Reserved Network\n"
 	"Spare Network\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	int ni = get_string_value(ss7_network_indicator_vals, argv[0]);
 
 	inst->cfg.network_indicator = ni;
@@ -67,13 +70,13 @@
 
 /* TODO: cs7 point-code format */
 DEFUN(cs7_pc_format, cs7_pc_format_cmd,
-	"cs7 point-code format <1-24> [<1-23> [<1-22>]]",
+	"cs7 point-code format <1-24> [<1-23>] [<1-22>]",
 	CS7_STR PC_STR "Configure Point Code Format\n"
 	"Length of first PC component\n"
 	"Length of second PC component\n"
 	"Length of third PC component\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	int argind = 0;
 
 	inst->cfg.pc_fmt.component_len[0] = atoi(argv[argind++]);
@@ -96,7 +99,7 @@
 	CS7_STR PC_STR "Configure Point Code Format\n"
 	"Default Point Code Format (3.8.3)\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	inst->cfg.pc_fmt.component_len[0] = 3;
 	inst->cfg.pc_fmt.component_len[1] = 8;
 	inst->cfg.pc_fmt.component_len[2] = 3;
@@ -111,7 +114,7 @@
 	"Use dot as delimiter\n"
 	"User dash as delimiter\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 
 	if (!strcmp(argv[0], "dash"))
 		inst->cfg.pc_fmt.delimiter = '-';
@@ -126,7 +129,7 @@
 	CS7_STR "Configure the local Point Code\n"
 	"Point Code\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	uint32_t pc = osmo_ss7_pointcode_parse(inst, argv[0]);
 
 	inst->cfg.primary_pc = pc;
@@ -135,6 +138,40 @@
 /* TODO: cs7 secondary-pc */
 /* TODO: cs7 capability-pc */
 
+
+static void write_one_ss7_inst(struct vty *vty, struct osmo_ss7_instance *inst)
+{
+	if (inst->cfg.network_indicator)
+		vty_out(vty, "cs7 network-indicator %s%s",
+			get_value_string(ss7_network_indicator_vals,
+					 inst->cfg.network_indicator),
+			VTY_NEWLINE);
+
+	if (inst->cfg.pc_fmt.component_len[0] != 3 ||
+	    inst->cfg.pc_fmt.component_len[1] != 8 ||
+	    inst->cfg.pc_fmt.component_len[2] != 3) {
+		vty_out(vty, "cs7 point-code format %u",
+			inst->cfg.pc_fmt.component_len[0]);
+		if (inst->cfg.pc_fmt.component_len[1])
+			vty_out(vty, " %u", inst->cfg.pc_fmt.component_len[1]);
+		if (inst->cfg.pc_fmt.component_len[2])
+			vty_out(vty, " %u", inst->cfg.pc_fmt.component_len[2]);
+		vty_out(vty, "%s", VTY_NEWLINE);
+	}
+
+	if (inst->cfg.pc_fmt.delimiter != '.')
+		vty_out(vty, "cs7 point-code delimiter dash%s", VTY_NEWLINE);
+
+	if (inst->cfg.primary_pc)
+		vty_out(vty, "cs7 point-code %s%s",
+			osmo_ss7_pointcode_print(inst, inst->cfg.primary_pc),
+			VTY_NEWLINE);
+}
+
+static void config_write_cs7(struct vty *vty)
+{
+	write_one_ss7_inst(vty, g_s7i);
+}
 
 /***********************************************************************
  * Routing Table Configuration
@@ -151,7 +188,7 @@
 	CS7_STR "Specify the name of the route table\n"
 	"Name of the route table\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	struct osmo_ss7_route_table *rtable;
 
 	rtable = inst->rtable_system;
@@ -163,7 +200,7 @@
 }
 
 DEFUN(cs7_rt_upd, cs7_rt_upd_cmd,
-	"update route POINT_CODE [MASK | LENGTH] linkset LS_NAME [priority PRIO] [qos-class (CLASS | default",
+	"update route POINT_CODE MASK linkset LS_NAME [priority PRIO] [qos-class (CLASS|default)]",
 	"Update the Route\n"
 	"Update the Route\n"
 	"Destination Point Code\n"
@@ -185,8 +222,10 @@
 	unsigned int argind;
 
 	rt = osmo_ss7_route_create(rtable, dpc, mask, ls_name);
-	if (!rt)
+	if (!rt) {
+		vty_out(vty, "cannot create route%s", VTY_NEWLINE);
 		return CMD_WARNING;
+	}
 
 	argind = 3;
 	if (argc > argind && !strcmp(argv[argind], "priority")) {
@@ -203,7 +242,7 @@
 }
 
 DEFUN(cs7_rt_rem, cs7_rt_rem_cmd,
-	"remove route POINT_CODE [MASK | LENGTH]",
+	"remove route POINT_CODE MASK",
 	"Remove a Route\n"
 	"Remove a Route\n"
 	"Destination Point Code\n"
@@ -216,19 +255,22 @@
 	uint32_t mask = osmo_ss7_pointcode_parse_mask_or_len(rtable->inst, argv[1]);
 
 	rt = osmo_ss7_route_find_dpc_mask(rtable, dpc, mask);
-	if (!rt)
+	if (!rt) {
+		vty_out(vty, "cannot find route to be deleted%s", VTY_NEWLINE);
 		return CMD_WARNING;
+	}
 
 	osmo_ss7_route_destroy(rt);
 	return CMD_SUCCESS;
 }
 
-static int config_write_rtable(struct vty *vty)
+static void write_one_rtable(struct vty *vty, struct osmo_ss7_route_table *rtable)
 {
-	struct osmo_ss7_route_table *rtable = vty->index;
 	struct osmo_ss7_route *rt;
 
 	vty_out(vty, "cs7 route-table %s%s", rtable->cfg.name, VTY_NEWLINE);
+	if (rtable->cfg.description)
+		vty_out(vty, " description %s%s", rtable->cfg.description, VTY_NEWLINE);
 	llist_for_each_entry(rt, &rtable->routes, list) {
 		vty_out(vty, " update route %s %s linkset %s",
 			osmo_ss7_pointcode_print(rtable->inst, rt->cfg.pc),
@@ -240,6 +282,16 @@
 			vty_out(vty, " qos-class %u", rt->cfg.qos_class);
 		vty_out(vty, "%s", VTY_NEWLINE);
 	}
+}
+
+static int config_write_rtable(struct vty *vty)
+{
+	struct osmo_ss7_instance *inst = g_s7i;
+	struct osmo_ss7_route_table *rtable;
+
+	llist_for_each_entry(rtable, &inst->rtable_list, list)
+		write_one_rtable(vty, rtable);
+
 	return 0;
 }
 
@@ -259,7 +311,7 @@
 	"Configure/Enable SUA\n"
 	"SCTP Port number for SUA\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	struct osmo_xua_server *xs;
 	uint16_t port = atoi(argv[0]);
 
@@ -291,12 +343,22 @@
 	return get_string_value(osmo_ss7_asp_protocol_vals, protocol);
 }
 
+static void write_one_sua(struct vty *vty, struct osmo_xua_server *xs)
+{
+	vty_out(vty, "cs7 %s %u%s",
+		get_value_string(osmo_ss7_asp_protocol_vals, xs->cfg.proto),
+		xs->cfg.local.port, VTY_NEWLINE);
+	vty_out(vty, " local-ip %s%s", xs->cfg.local.host, VTY_NEWLINE);
+}
+
+
 static int config_write_sua(struct vty *vty)
 {
-	struct osmo_xua_server *xs = vty->index;
+	struct osmo_xua_server *xs;
 
-	vty_out(vty, "cs7 sua %u%s", xs->cfg.local.port, VTY_NEWLINE);
-	vty_out(vty, " local-ip %s%s", xs->cfg.local.host, VTY_NEWLINE);
+	llist_for_each_entry(xs, &osmo_ss7_xua_servers, list)
+		write_one_sua(vty, xs);
+
 	return 0;
 }
 
@@ -316,7 +378,7 @@
 	"Configure/Enable M3UA\n"
 	"SCTP Port number for M3UA\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	struct osmo_xua_server *xs;
 	uint16_t port = atoi(argv[0]);
 
@@ -345,10 +407,7 @@
 
 static int config_write_m3ua(struct vty *vty)
 {
-	struct osmo_xua_server *xs = vty->index;
-
-	vty_out(vty, "cs7 m3ua %u%s", xs->cfg.local.port, VTY_NEWLINE);
-	vty_out(vty, " local-ip %s%s", xs->cfg.local.host, VTY_NEWLINE);
+	/* see config_write_sua */
 	return 0;
 }
 
@@ -363,7 +422,7 @@
 };
 
 DEFUN(cs7_asp, cs7_asp_cmd,
-	"cs7 asp NAME <0-65535> <0-65535> [m3ua | sua]",
+	"cs7 asp NAME <0-65535> <0-65535> (m3ua|sua)",
 	CS7_STR
 	"Configure Application Server Process\n"
 	"Name of ASP\n"
@@ -372,19 +431,24 @@
 	"M3UA Protocol\n"
 	"SUA Protocol\n")
 {
-	struct osmo_ss7_instance *inst = FIXME;
+	struct osmo_ss7_instance *inst = g_s7i;
 	const char *name = argv[0];
 	uint16_t remote_port = atoi(argv[1]);
 	uint16_t local_port = atoi(argv[2]);
 	enum osmo_ss7_asp_protocol protocol = parse_asp_proto(argv[3]);
 	struct osmo_ss7_asp *asp;
 
-	if (protocol == OSMO_SS7_ASP_PROT_NONE)
+	if (protocol == OSMO_SS7_ASP_PROT_NONE) {
+		vty_out(vty, "invalid protocol '%s'%s", argv[3], VTY_NEWLINE);
 		return CMD_WARNING;
+	}
 
 	asp = osmo_ss7_asp_find_or_create(inst, name, remote_port, local_port, protocol);
-	if (!asp)
+	if (!asp) {
+		vty_out(vty, "cannot create ASP '%s'%s", name, VTY_NEWLINE);
 		return CMD_WARNING;
+	}
+	asp->cfg.is_server = true;
 
 	vty->node = L_CS7_ASP_NODE;
 	vty->index = asp;
@@ -394,7 +458,7 @@
 
 DEFUN(asp_remote_ip, asp_remote_ip_cmd,
 	"remote-ip A.B.C.D",
-	"Specity Remote IP Address of ASP\n"
+	"Specify Remote IP Address of ASP\n"
 	"Remote IP Address of ASP\n")
 {
 	struct osmo_ss7_asp *asp = vty->index;
@@ -404,7 +468,7 @@
 
 DEFUN(asp_qos_clas, asp_qos_class_cmd,
 	"qos-class <0-255>",
-	"Specity QoS Class of ASP\n"
+	"Specify QoS Class of ASP\n"
 	"QoS Class of ASP\n")
 {
 	struct osmo_ss7_asp *asp = vty->index;
@@ -417,7 +481,7 @@
 	"Allows a SCTP Association with ASP, but doesn't let it become active\n")
 {
 	struct osmo_ss7_asp *asp = vty->index;
-	vty_out(vty, "Not supported yet\n");
+	vty_out(vty, "Not supported yet%s", VTY_NEWLINE);
 	return CMD_WARNING;
 }
 
@@ -426,22 +490,33 @@
 	"Terminates SCTP association; New associations will be rejected\n")
 {
 	struct osmo_ss7_asp *asp = vty->index;
-	vty_out(vty, "Not supported yet\n");
+	vty_out(vty, "Not supported yet%s", VTY_NEWLINE);
 	return CMD_WARNING;
+}
+
+static void write_one_asp(struct vty *vty, struct osmo_ss7_asp *asp)
+{
+	vty_out(vty, "cs7 asp %s %u %u %s%s",
+		asp->cfg.name, asp->cfg.remote.port, asp->cfg.local.port,
+		osmo_ss7_asp_protocol_name(asp->cfg.proto), VTY_NEWLINE);
+	if (asp->cfg.description)
+		vty_out(vty, " description %s%s", asp->cfg.description, VTY_NEWLINE);
+	vty_out(vty, " remote-ip %s%s", asp->cfg.remote.host, VTY_NEWLINE);
+	if (asp->cfg.qos_class)
+		vty_out(vty, " qos-class %u%s", asp->cfg.qos_class, VTY_NEWLINE);
 }
 
 static int config_write_asp(struct vty *vty)
 {
-	struct osmo_ss7_asp *asp = vty->index;
+	struct osmo_ss7_instance *inst = g_s7i;
+	struct osmo_ss7_asp *asp;
 
-	vty_out(vty, "cs7 asp %s %u %u %s%s",
-		asp->cfg.name, asp->cfg.remote.port, asp->cfg.local.port,
-		osmo_ss7_asp_protocol_name(asp->cfg.proto), VTY_NEWLINE);
-	vty_out(vty, " remote-ip %s%s", asp->cfg.remote.host, VTY_NEWLINE);
-	if (asp->cfg.qos_class)
-		vty_out(vty, " qos-class %u%s", asp->cfg.qos_class, VTY_NEWLINE);
+	llist_for_each_entry(asp, &inst->asp_list, list)
+		write_one_asp(vty, asp);
+
 	return 0;
 }
+
 
 /***********************************************************************
  * Application Server
@@ -454,21 +529,29 @@
 };
 
 DEFUN(cs7_as, cs7_as_cmd,
-	"cs7 as NAME [m3ua | sua]",
+	"cs7 as NAME (m3ua|sua)",
 	CS7_STR
 	"Configure an Application Server\n"
 	"Name of the Application Server\n"
 	"M3UA Application Server\n"
 	"SUA Application Server\n")
 {
+	struct osmo_ss7_instance *inst = g_s7i;
 	struct osmo_ss7_as *as;
 	const char *name = argv[0];
 	enum osmo_ss7_asp_protocol protocol = parse_asp_proto(argv[1]);
 
-	if (protocol == OSMO_SS7_ASP_PROT_NONE)
+	if (protocol == OSMO_SS7_ASP_PROT_NONE) {
+		vty_out(vty, "invalid protocol '%s'%s", argv[3], VTY_NEWLINE);
 		return CMD_WARNING;
+	}
 
-	/* FIXME */
+	as = osmo_ss7_as_find_or_create(inst, name, protocol);
+	if (!as) {
+		vty_out(vty, "cannot create AS '%s'%s", name, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
 	as->cfg.name = talloc_strdup(as, name);
 
 	vty->node = L_CS7_AS_NODE;
@@ -486,8 +569,10 @@
 {
 	struct osmo_ss7_as *as = vty->index;
 
-	if (osmo_ss7_as_add_asp(as, argv[0]))
+	if (osmo_ss7_as_add_asp(as, argv[0])) {
+		vty_out(vty, "cannot find ASP '%s'%s", argv[0], VTY_NEWLINE);
 		return CMD_WARNING;
+	}
 
 	return CMD_SUCCESS;
 }
@@ -499,8 +584,10 @@
 {
 	struct osmo_ss7_as *as = vty->index;
 
-	if (osmo_ss7_as_del_asp(as, argv[0]))
+	if (osmo_ss7_as_del_asp(as, argv[0])) {
+		vty_out(vty, "cannot find ASP '%s'%s", argv[0], VTY_NEWLINE);
 		return CMD_WARNING;
+	}
 
 	return CMD_SUCCESS;
 }
@@ -516,7 +603,7 @@
 	struct osmo_ss7_as *as = vty->index;
 
 	as->cfg.mode = get_string_value(osmo_ss7_as_traffic_mode_vals, argv[0]);
-	return CMD_WARNING;
+	return CMD_SUCCESS;
 }
 
 DEFUN(as_recov_tout, as_recov_tout_cmd,
@@ -554,7 +641,7 @@
 };
 
 DEFUN(as_rout_key, as_rout_key_cmd,
-	"routing-key RCONTEXT DPC [si {aal2 | bicc | b-isup | h248 | isup | sat-isup | sccp | tup }] [ssn SSN]}",
+	"routing-key RCONTEXT DPC [si (aal2|bicc|b-isup|h248|isup|sat-isup|sccp|tup)] [ssn SSN]}",
 	"Define a routing key\n"
 	"Routing context number\n"
 	"Destination Point Code\n"
@@ -571,25 +658,21 @@
 	"Sub-System Number to match on\n")
 {
 	struct osmo_ss7_as *as = vty->index;
-	uint32_t key = atoi(argv[0]);
-	struct osmo_ss7_routing_key *rkey;
+	struct osmo_ss7_routing_key *rkey = &as->cfg.routing_key;
 	int argind;
 
-	rkey = osmo_ss7_rkey_find_or_create(as, key);
-	if (!rkey)
-		return CMD_WARNING;
-
+	rkey->context = atoi(argv[0]);
 	rkey->pc = osmo_ss7_pointcode_parse(as->inst, argv[1]);
 	argind = 2;
 
-	if (!strcmp(argv[argind], "si")) {
+	if (argind < argc && !strcmp(argv[argind], "si")) {
 		const char *si_str;
 		argind++;
 		si_str = argv[argind++];
 		/* parse numeric SI from string */
 		rkey->si = get_string_value(mtp_si_vals, si_str);
 	}
-	if (!strcmp(argv[argind], "ssn")) {
+	if (argind < argc && !strcmp(argv[argind], "ssn")) {
 		argind++;
 		rkey->ssn = atoi(argv[argind]);
 	}
@@ -597,14 +680,15 @@
 	return CMD_SUCCESS;
 }
 
-static int config_write_as(struct vty *vty)
+static void write_one_as(struct vty *vty, struct osmo_ss7_as *as)
 {
-	struct osmo_ss7_as *as = vty->index;
 	struct osmo_ss7_routing_key *rkey;
 	unsigned int i;
 
 	vty_out(vty, "cs7 as %s %s%s", as->cfg.name,
 		osmo_ss7_asp_protocol_name(as->cfg.proto), VTY_NEWLINE);
+	if (as->cfg.description)
+		vty_out(vty, " description %s%s", as->cfg.description, VTY_NEWLINE);
 	for (i = 0; i < ARRAY_SIZE(as->cfg.asps); i++) {
 		struct osmo_ss7_asp *asp = as->cfg.asps[i];
 		if (!asp)
@@ -618,7 +702,8 @@
 		vty_out(vty, " recovery-timeout %u%s",
 			as->cfg.recovery_timeout_msec, VTY_NEWLINE);
 	}
-	vty_out(vty, " qos-class %u%s", as->cfg.qos_class, VTY_NEWLINE);
+	if (as->cfg.qos_class)
+		vty_out(vty, " qos-class %u%s", as->cfg.qos_class, VTY_NEWLINE);
 	rkey = &as->cfg.routing_key;
 	vty_out(vty, " routing-key %u %s", rkey->context,
 		osmo_ss7_pointcode_print(as->inst, rkey->pc));
@@ -628,8 +713,61 @@
 	if (rkey->ssn)
 		vty_out(vty, " ssn %u", rkey->ssn);
 	vty_out(vty, "%s", VTY_NEWLINE);
+}
+
+static int config_write_as(struct vty *vty)
+{
+	struct osmo_ss7_instance *inst = g_s7i;
+	struct osmo_ss7_as *as;
+
+	/* HACK to call this here, as we cannot install additional
+	 * 'save' code into the root CONFIG_NODE ... */
+	config_write_cs7(vty);
+
+	/* HACK to call this here, but we must make sure that the ASP
+	 * are all configured before we reference them from the AS, and
+	 * VTY code always stores the nodes in alphabetical order */
+
+	config_write_asp(vty);
+
+	llist_for_each_entry(as, &inst->as_list, list)
+		write_one_as(vty, as);
 
 	return 0;
+}
+
+int osmo_ss7_vty_go_parent(struct vty *vty)
+{
+	struct osmo_ss7_asp *asp;
+
+	switch (vty->node) {
+	case L_CS7_ASP_NODE:
+		asp = vty->index;
+		osmo_ss7_asp_restart(asp);
+		vty->node = CONFIG_NODE;
+		break;
+	case L_CS7_RTABLE_NODE:
+	case L_CS7_SUA_NODE:
+	case L_CS7_M3UA_NODE:
+	case L_CS7_AS_NODE:
+	default:
+		vty->node = CONFIG_NODE;
+		break;
+	}
+}
+
+int osmo_ss7_is_config_node(struct vty *vty, int node)
+{
+	switch (node) {
+	case L_CS7_ASP_NODE:
+	case L_CS7_RTABLE_NODE:
+	case L_CS7_SUA_NODE:
+	case L_CS7_M3UA_NODE:
+	case L_CS7_AS_NODE:
+		return 1;
+	default:
+		return 0;
+	}
 }
 
 int osmo_ss7_vty_init(void)
@@ -657,7 +795,7 @@
 	install_element(CONFIG_NODE, &cs7_m3ua_cmd);
 	install_element(L_CS7_M3UA_NODE, &m3ua_local_ip_cmd);
 
-	install_node(&asp_node, config_write_asp);
+	install_node(&asp_node, NULL);
 	vty_install_default(L_CS7_ASP_NODE);
 	install_element(CONFIG_NODE, &cs7_asp_cmd);
 	install_element(L_CS7_ASP_NODE, &cfg_description_cmd);
diff --git a/stp/stp_main.c b/stp/stp_main.c
new file mode 100644
index 0000000..e70ff14
--- /dev/null
+++ b/stp/stp_main.c
@@ -0,0 +1,103 @@
+/* Osmocom STP (Signal Transfer Point) */
+
+/* (C) 2015-2017 by Harald Welte <laforge at gnumonks.org>
+ * All Rights Reserved
+ *
+ * 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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <osmocom/core/select.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/application.h>
+#include <osmocom/core/fsm.h>
+#include <osmocom/vty/vty.h>
+#include <osmocom/vty/ports.h>
+#include <osmocom/vty/telnet_interface.h>
+
+#include <osmocom/sigtran/osmo_ss7.h>
+#include <osmocom/sigtran/sccp_sap.h>
+#include <osmocom/sigtran/sccp_helpers.h>
+#include <osmocom/sigtran/protocol/sua.h>
+#include <osmocom/sigtran/protocol/m3ua.h>
+
+#include "internal.h"
+
+struct osmo_ss7_instance *g_s7i;
+
+static const struct log_info_cat log_info_cat[] = {
+};
+
+static const struct log_info log_info = {
+	.cat = log_info_cat,
+	.num_cat = ARRAY_SIZE(log_info_cat),
+};
+
+/* Hack to enable debug logging for all relevant (used?) subsystems */
+static void init_logging(void)
+{
+	const int log_cats[] = { DLSS7, DLSUA, DLM3UA, DLSCCP, DLINP };
+	unsigned int i;
+
+	osmo_init_logging(&log_info);
+
+	for (i = 0; i < ARRAY_SIZE(log_cats); i++)
+		log_set_category_filter(osmo_stderr_target, log_cats[i], 1, LOGL_DEBUG);
+}
+
+static struct vty_app_info vty_info = {
+	.name	= "osmo-stp",
+	.version = PACKAGE_VERSION,
+	.go_parent_cb = osmo_ss7_vty_go_parent,
+	.is_config_node = osmo_ss7_is_config_node,
+};
+
+int main(int argc, char **argv)
+{
+	struct osmo_sccp_instance *sccp;
+	char *config_file = "osmo-stp.cfg";
+	bool client;
+	int rc;
+
+	init_logging();
+	osmo_ss7_init();
+	osmo_fsm_log_addr(false);
+	vty_init(&vty_info);
+	osmo_ss7_vty_init();
+
+	g_s7i = osmo_ss7_instance_find_or_create(NULL, 0);
+
+	rc = vty_read_config_file(config_file, NULL);
+	if (rc < 0) {
+		fprintf(stderr, "Failed to parse the config file '%s'\n",
+			config_file);
+		exit(1);
+	}
+
+	rc = telnet_init_dynif(NULL, NULL, vty_get_bind_addr(), OSMO_VTY_PORT_STP);
+	if (rc < 0) {
+		perror("Erro binding VTY port\n");
+		exit(1);
+	}
+
+	while (1) {
+		osmo_select_main(0);
+	}
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: If32227b8d3127c6178e4ee45527ce65f69bc7b1e
Gerrit-PatchSet: 1
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list