<p>Stefan Sperling has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9576">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">make it possible to pass parameters to m3ua_example<br><br>There are plans to use the m3ua_example tool as an SCCP peer<br>for a TTCN3 test suite. Make it possible to pass paramters to<br>this tool so the user can override hard-coded default values<br>of IP addresses, ports, and point codes.<br><br>Change-Id: I52243ae926c76020de41c8dfc7263517c7263d7e<br>---<br>M examples/m3ua_example.c<br>1 file changed, 131 insertions(+), 16 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/76/9576/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/examples/m3ua_example.c b/examples/m3ua_example.c</span><br><span>index a9f455c..2a99450 100644</span><br><span>--- a/examples/m3ua_example.c</span><br><span>+++ b/examples/m3ua_example.c</span><br><span>@@ -4,6 +4,7 @@</span><br><span> #include <string.h></span><br><span> #include <unistd.h></span><br><span> #include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <ctype.h></span><br><span> </span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/utils.h></span><br><span>@@ -23,15 +24,17 @@</span><br><span> </span><br><span> static struct osmo_sccp_instance *g_sccp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_sccp_instance *sua_server_helper(void)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_sccp_instance *sua_server_helper(int local_port, const char *local_address, int local_pc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               int remote_port, const char *remote_address, int remote_pc)</span><br><span> {</span><br><span>         struct osmo_sccp_instance *sccp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    sccp = osmo_sccp_simple_server(NULL, 1, OSMO_SS7_ASP_PROT_M3UA,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 -1, "127.0.0.2");</span><br><span style="color: hsl(120, 100%, 40%);">+   sccp = osmo_sccp_simple_server(NULL, local_pc, OSMO_SS7_ASP_PROT_M3UA, local_port, local_address);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (sccp == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_sccp_simple_server_add_clnt(sccp, OSMO_SS7_ASP_PROT_M3UA,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "23", 23, -1, 0, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_sccp_simple_server_add_clnt(sccp, OSMO_SS7_ASP_PROT_M3UA, "client", remote_pc, local_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_port, remote_address);</span><br><span> </span><br><span>   return sccp;</span><br><span> }</span><br><span>@@ -79,10 +82,118 @@</span><br><span>     .version = 0,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_LOCAL_PC       -1</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_LOCAL_ADDRESS       "127.0.0.2"</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_LOCAL_PORT       M3UA_PORT</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_REMOTE_PC    23</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_REMOTE_ADDRESS      "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_REMOTE_PORT      M3UA_PORT</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void usage(void) {</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(stderr, "m3ua_example [-c] [-l LOCAL_ADDRESS[:LOCAL_PORT]]\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "             [-r REMOTE_ADDRESS[:REMOTE_PORT]]\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                  "             [-L LOCAL_POINT_CODE] [-R REMOTE_POINT_CODE]\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "Options:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                        "  -c: Run in client mode (default is server mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "  -l: local IP address and SCTP port (default is %s:%d)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                 "  -r: remote IP address and SCTP port (default is %s:%d)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                        "  -L: local point code (default is %d)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                  "  -R: remote point code (default is %d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        DEFAULT_LOCAL_ADDRESS, DEFAULT_LOCAL_PORT,</span><br><span style="color: hsl(120, 100%, 40%);">+                    DEFAULT_REMOTE_ADDRESS, DEFAULT_REMOTE_PORT,</span><br><span style="color: hsl(120, 100%, 40%);">+                  DEFAULT_LOCAL_PC, DEFAULT_REMOTE_PC);</span><br><span style="color: hsl(120, 100%, 40%);">+ exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int is_decimal_string(const char *s)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *p = s;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (*p == '\0')</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while (*p) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!isdigit(*p++))</span><br><span style="color: hsl(120, 100%, 40%);">+                   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int parse_address_port(char **address, int *port, const char *arg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  char *s, *colon;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    s = strdup(arg);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(s);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     colon = strrchr(s, ':');</span><br><span style="color: hsl(120, 100%, 40%);">+      if (colon) {</span><br><span style="color: hsl(120, 100%, 40%);">+          char *portstr = colon + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+            *colon = '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+                if (*portstr == '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+                       fprintf(stderr, "missing port number after : in '%s'\n", arg);</span><br><span style="color: hsl(120, 100%, 40%);">+                      free(s);</span><br><span style="color: hsl(120, 100%, 40%);">+                      return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!is_decimal_string(portstr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    fprintf(stderr, "invalid port number: '%s'\n", portstr);</span><br><span style="color: hsl(120, 100%, 40%);">+                    free(s);</span><br><span style="color: hsl(120, 100%, 40%);">+                      return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             *port = atoi(portstr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   *address = s;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  bool client;</span><br><span style="color: hsl(0, 100%, 40%);">-    int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool client = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc, ch;</span><br><span style="color: hsl(120, 100%, 40%);">+   char *local_address = DEFAULT_LOCAL_ADDRESS;</span><br><span style="color: hsl(120, 100%, 40%);">+  int local_port = DEFAULT_LOCAL_PORT;</span><br><span style="color: hsl(120, 100%, 40%);">+  int local_pc = DEFAULT_LOCAL_PC;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *remote_address = DEFAULT_REMOTE_ADDRESS;</span><br><span style="color: hsl(120, 100%, 40%);">+        int remote_port = DEFAULT_LOCAL_PORT;</span><br><span style="color: hsl(120, 100%, 40%);">+ int remote_pc = DEFAULT_REMOTE_PC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  while ((ch = getopt(argc, argv, "cl:r:p:L:R:")) != -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            switch (ch) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case 'c':</span><br><span style="color: hsl(120, 100%, 40%);">+                     client = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'l':</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (parse_address_port(&local_address, &local_port, optarg))</span><br><span style="color: hsl(120, 100%, 40%);">+                          exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'r':</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (parse_address_port(&remote_address, &remote_port, optarg))</span><br><span style="color: hsl(120, 100%, 40%);">+                                exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'L':</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!is_decimal_string(optarg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             fprintf(stderr, "invalid decimal point code: '%s'\n", optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                              exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     local_pc = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'R':</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!is_decimal_string(optarg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             fprintf(stderr, "invalid decimal point code: '%s'\n", optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                              exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     remote_pc = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      usage();</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     argc -= optind;</span><br><span style="color: hsl(120, 100%, 40%);">+       argv += optind;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (argc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                usage();</span><br><span> </span><br><span>         talloc_enable_leak_report_full();</span><br><span> </span><br><span>@@ -96,23 +207,27 @@</span><br><span>         osmo_ss7_vty_init_asp(NULL);</span><br><span>         osmo_sccp_vty_init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (argc <= 1)</span><br><span style="color: hsl(0, 100%, 40%);">-               client = true;</span><br><span style="color: hsl(0, 100%, 40%);">-  else</span><br><span style="color: hsl(0, 100%, 40%);">-            client = false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      rc = telnet_init_dynif(NULL, NULL, vty_get_bind_addr(), 2324+client);</span><br><span>        if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                perror("Erro binding VTY port\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          perror("Error binding VTY port");</span><br><span>          exit(1);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        if (client) {</span><br><span style="color: hsl(0, 100%, 40%);">-           g_sccp = osmo_sccp_simple_client(NULL, "client", 23, OSMO_SS7_ASP_PROT_M3UA, 0, NULL, M3UA_PORT, "127.0.0.2");</span><br><span style="color: hsl(120, 100%, 40%);">+            g_sccp = osmo_sccp_simple_client(NULL, "client", local_pc, OSMO_SS7_ASP_PROT_M3UA,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           local_port, local_address, remote_port, remote_address);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (g_sccp == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 perror("Could not create SCCP client");</span><br><span style="color: hsl(120, 100%, 40%);">+                     exit (1);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>            sccp_test_user_vty_install(g_sccp, OSMO_SCCP_SSN_BSSAP);</span><br><span>     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                g_sccp = sua_server_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+         g_sccp = sua_server_helper(local_port, local_address, local_pc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          remote_port, remote_address, remote_pc);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (g_sccp == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 perror("Could not create SCCP server");</span><br><span style="color: hsl(120, 100%, 40%);">+                     exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span>            sccp_test_server_init(g_sccp);</span><br><span>       }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9576">change 9576</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9576"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I52243ae926c76020de41c8dfc7263517c7263d7e </div>
<div style="display:none"> Gerrit-Change-Number: 9576 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <ssperling@sysmocom.de> </div>