<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-smlc/+/19779">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">initial skeleton<br><br>Change-Id: I706aa9e11a646aad71bb310fa552d0bdb5084d4b<br>---<br>A .gitignore<br>A AUTHORS<br>A COPYING<br>A Makefile.am<br>A README<br>A configure.ac<br>A contrib/Makefile.am<br>A contrib/jenkins.sh<br>A contrib/osmo-smlc.spec.in<br>A contrib/systemd/Makefile.am<br>A contrib/systemd/osmo-smlc.service<br>A debian/changelog<br>A debian/compat<br>A debian/control<br>A debian/copyright<br>A debian/osmo-smlc-doc.install<br>A debian/osmo-smlc.install<br>A debian/rules<br>A debian/source/format<br>A doc/Makefile.am<br>A doc/examples/Makefile.am<br>A doc/examples/osmo-smlc/osmo-smlc.cfg<br>A doc/manuals/Makefile.am<br>A doc/manuals/chapters/overview.adoc<br>A doc/manuals/chapters/running.adoc<br>A doc/manuals/osmosmlc-usermanual-docinfo.xml<br>A doc/manuals/osmosmlc-usermanual.adoc<br>A doc/manuals/osmosmlc-vty-reference.xml<br>A doc/manuals/regen_doc.sh<br>A doc/manuals/vty/smlc_vty_dditions.xml<br>A git-version-gen<br>A include/Makefile.am<br>A include/osmocom/Makefile.am<br>A include/osmocom/smlc/Makefile.am<br>A include/osmocom/smlc/smlc_data.h<br>A include/osmocom/smlc/smlc_sigtran.h<br>A osmoappdesc.py<br>A src/Makefile.am<br>A src/osmo-smlc/Makefile.am<br>A src/osmo-smlc/smlc_ctrl.c<br>A src/osmo-smlc/smlc_main.c<br>A src/osmo-smlc/smlc_sigtran.c<br>A tests/Makefile.am<br>A tests/atlocal.in<br>A tests/test_nodes.vty<br>A tests/testsuite.at<br>46 files changed, 2,388 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-smlc refs/changes/79/19779/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/.gitignore b/.gitignore</span><br><span>new file mode 100644</span><br><span>index 0000000..ba72477</span><br><span>--- /dev/null</span><br><span>+++ b/.gitignore</span><br><span>@@ -0,0 +1,74 @@</span><br><span style="color: hsl(120, 100%, 40%);">+debian/*.log</span><br><span style="color: hsl(120, 100%, 40%);">+*.o</span><br><span style="color: hsl(120, 100%, 40%);">+*.lo</span><br><span style="color: hsl(120, 100%, 40%);">+*.a</span><br><span style="color: hsl(120, 100%, 40%);">+.deps</span><br><span style="color: hsl(120, 100%, 40%);">+Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+Makefile.in</span><br><span style="color: hsl(120, 100%, 40%);">+config.h</span><br><span style="color: hsl(120, 100%, 40%);">+config.h.in</span><br><span style="color: hsl(120, 100%, 40%);">+*.pc</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%);">+*.sw?</span><br><span style="color: hsl(120, 100%, 40%);">+.libs</span><br><span style="color: hsl(120, 100%, 40%);">+*.pyc</span><br><span style="color: hsl(120, 100%, 40%);">+*.gcda</span><br><span style="color: hsl(120, 100%, 40%);">+*.gcno</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+**/TAGS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#configure</span><br><span style="color: hsl(120, 100%, 40%);">+aclocal.m4</span><br><span style="color: hsl(120, 100%, 40%);">+autom4te.cache/</span><br><span style="color: hsl(120, 100%, 40%);">+config.log</span><br><span style="color: hsl(120, 100%, 40%);">+config.status</span><br><span style="color: hsl(120, 100%, 40%);">+config.guess</span><br><span style="color: hsl(120, 100%, 40%);">+config.sub</span><br><span style="color: hsl(120, 100%, 40%);">+configure</span><br><span style="color: hsl(120, 100%, 40%);">+compile</span><br><span style="color: hsl(120, 100%, 40%);">+depcomp</span><br><span style="color: hsl(120, 100%, 40%);">+install-sh</span><br><span style="color: hsl(120, 100%, 40%);">+missing</span><br><span style="color: hsl(120, 100%, 40%);">+stamp-h1</span><br><span style="color: hsl(120, 100%, 40%);">+libtool</span><br><span style="color: hsl(120, 100%, 40%);">+ltmain.sh</span><br><span style="color: hsl(120, 100%, 40%);">+m4/*.m4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# git-version-gen magic</span><br><span style="color: hsl(120, 100%, 40%);">+.tarball-version</span><br><span style="color: hsl(120, 100%, 40%);">+.version</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-smlc-*.tar.bz2</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-smlc-*.tar.gz</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# apps and app data</span><br><span style="color: hsl(120, 100%, 40%);">+src/osmo-smlc/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+src/osmo-smlc/*.cfg*</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tags</span><br><span style="color: hsl(120, 100%, 40%);">+/deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#tests</span><br><span style="color: hsl(120, 100%, 40%);">+tests/testsuite.dir</span><br><span style="color: hsl(120, 100%, 40%);">+tests/*/*_test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tests/atconfig</span><br><span style="color: hsl(120, 100%, 40%);">+tests/atlocal</span><br><span style="color: hsl(120, 100%, 40%);">+tests/package.m4</span><br><span style="color: hsl(120, 100%, 40%);">+tests/testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+tests/testsuite.log</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+writtenconfig/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# manuals</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.html</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.svg</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.pdf</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*__*.png</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/*.check</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/generated/</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/osmomsc-usermanual.xml</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/common</span><br><span style="color: hsl(120, 100%, 40%);">+doc/manuals/build</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+contrib/osmo-smlc.spec</span><br><span>diff --git a/AUTHORS b/AUTHORS</span><br><span>new file mode 100644</span><br><span>index 0000000..07ec7d0</span><br><span>--- /dev/null</span><br><span>+++ b/AUTHORS</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Harald Welte <laforge@osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+Neels Hofmeyr <nhofmeyr@sysmocom.de></span><br><span>diff --git a/COPYING b/COPYING</span><br><span>new file mode 100644</span><br><span>index 0000000..dba13ed</span><br><span>--- /dev/null</span><br><span>+++ b/COPYING</span><br><span>@@ -0,0 +1,661 @@</span><br><span style="color: hsl(120, 100%, 40%);">+                    GNU AFFERO GENERAL PUBLIC LICENSE</span><br><span style="color: hsl(120, 100%, 40%);">+                       Version 3, 19 November 2007</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/></span><br><span style="color: hsl(120, 100%, 40%);">+ Everyone is permitted to copy and distribute verbatim copies</span><br><span style="color: hsl(120, 100%, 40%);">+ of this license document, but changing it is not allowed.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                            Preamble</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The GNU Affero General Public License is a free, copyleft license for</span><br><span style="color: hsl(120, 100%, 40%);">+software and other kinds of works, specifically designed to ensure</span><br><span style="color: hsl(120, 100%, 40%);">+cooperation with the community in the case of network server software.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The licenses for most software and other practical works are designed</span><br><span style="color: hsl(120, 100%, 40%);">+to take away your freedom to share and change the works.  By contrast,</span><br><span style="color: hsl(120, 100%, 40%);">+our General Public Licenses are intended to guarantee your freedom to</span><br><span style="color: hsl(120, 100%, 40%);">+share and change all versions of a program--to make sure it remains free</span><br><span style="color: hsl(120, 100%, 40%);">+software for all its users.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  When we speak of free software, we are referring to freedom, not</span><br><span style="color: hsl(120, 100%, 40%);">+price.  Our General Public Licenses are designed to make sure that you</span><br><span style="color: hsl(120, 100%, 40%);">+have the freedom to distribute copies of free software (and charge for</span><br><span style="color: hsl(120, 100%, 40%);">+them if you wish), that you receive source code or can get it if you</span><br><span style="color: hsl(120, 100%, 40%);">+want it, that you can change the software or use pieces of it in new</span><br><span style="color: hsl(120, 100%, 40%);">+free programs, and that you know you can do these things.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Developers that use our General Public Licenses protect your rights</span><br><span style="color: hsl(120, 100%, 40%);">+with two steps: (1) assert copyright on the software, and (2) offer</span><br><span style="color: hsl(120, 100%, 40%);">+you this License which gives you legal permission to copy, distribute</span><br><span style="color: hsl(120, 100%, 40%);">+and/or modify the software.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A secondary benefit of defending all users' freedom is that</span><br><span style="color: hsl(120, 100%, 40%);">+improvements made in alternate versions of the program, if they</span><br><span style="color: hsl(120, 100%, 40%);">+receive widespread use, become available for other developers to</span><br><span style="color: hsl(120, 100%, 40%);">+incorporate.  Many developers of free software are heartened and</span><br><span style="color: hsl(120, 100%, 40%);">+encouraged by the resulting cooperation.  However, in the case of</span><br><span style="color: hsl(120, 100%, 40%);">+software used on network servers, this result may fail to come about.</span><br><span style="color: hsl(120, 100%, 40%);">+The GNU General Public License permits making a modified version and</span><br><span style="color: hsl(120, 100%, 40%);">+letting the public access it on a server without ever releasing its</span><br><span style="color: hsl(120, 100%, 40%);">+source code to the public.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The GNU Affero General Public License is designed specifically to</span><br><span style="color: hsl(120, 100%, 40%);">+ensure that, in such cases, the modified source code becomes available</span><br><span style="color: hsl(120, 100%, 40%);">+to the community.  It requires the operator of a network server to</span><br><span style="color: hsl(120, 100%, 40%);">+provide the source code of the modified version running there to the</span><br><span style="color: hsl(120, 100%, 40%);">+users of that server.  Therefore, public use of a modified version, on</span><br><span style="color: hsl(120, 100%, 40%);">+a publicly accessible server, gives the public access to the source</span><br><span style="color: hsl(120, 100%, 40%);">+code of the modified version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  An older license, called the Affero General Public License and</span><br><span style="color: hsl(120, 100%, 40%);">+published by Affero, was designed to accomplish similar goals.  This is</span><br><span style="color: hsl(120, 100%, 40%);">+a different license, not a version of the Affero GPL, but Affero has</span><br><span style="color: hsl(120, 100%, 40%);">+released a new version of the Affero GPL which permits relicensing under</span><br><span style="color: hsl(120, 100%, 40%);">+this license.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The precise terms and conditions for copying, distribution and</span><br><span style="color: hsl(120, 100%, 40%);">+modification follow.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       TERMS AND CONDITIONS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  0. Definitions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "This License" refers to version 3 of the GNU Affero General Public License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "Copyright" also means copyright-like laws that apply to other kinds of</span><br><span style="color: hsl(120, 100%, 40%);">+works, such as semiconductor masks.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "The Program" refers to any copyrightable work licensed under this</span><br><span style="color: hsl(120, 100%, 40%);">+License.  Each licensee is addressed as "you".  "Licensees" and</span><br><span style="color: hsl(120, 100%, 40%);">+"recipients" may be individuals or organizations.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To "modify" a work means to copy from or adapt all or part of the work</span><br><span style="color: hsl(120, 100%, 40%);">+in a fashion requiring copyright permission, other than the making of an</span><br><span style="color: hsl(120, 100%, 40%);">+exact copy.  The resulting work is called a "modified version" of the</span><br><span style="color: hsl(120, 100%, 40%);">+earlier work or a work "based on" the earlier work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "covered work" means either the unmodified Program or a work based</span><br><span style="color: hsl(120, 100%, 40%);">+on the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To "propagate" a work means to do anything with it that, without</span><br><span style="color: hsl(120, 100%, 40%);">+permission, would make you directly or secondarily liable for</span><br><span style="color: hsl(120, 100%, 40%);">+infringement under applicable copyright law, except executing it on a</span><br><span style="color: hsl(120, 100%, 40%);">+computer or modifying a private copy.  Propagation includes copying,</span><br><span style="color: hsl(120, 100%, 40%);">+distribution (with or without modification), making available to the</span><br><span style="color: hsl(120, 100%, 40%);">+public, and in some countries other activities as well.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To "convey" a work means any kind of propagation that enables other</span><br><span style="color: hsl(120, 100%, 40%);">+parties to make or receive copies.  Mere interaction with a user through</span><br><span style="color: hsl(120, 100%, 40%);">+a computer network, with no transfer of a copy, is not conveying.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  An interactive user interface displays "Appropriate Legal Notices"</span><br><span style="color: hsl(120, 100%, 40%);">+to the extent that it includes a convenient and prominently visible</span><br><span style="color: hsl(120, 100%, 40%);">+feature that (1) displays an appropriate copyright notice, and (2)</span><br><span style="color: hsl(120, 100%, 40%);">+tells the user that there is no warranty for the work (except to the</span><br><span style="color: hsl(120, 100%, 40%);">+extent that warranties are provided), that licensees may convey the</span><br><span style="color: hsl(120, 100%, 40%);">+work under this License, and how to view a copy of this License.  If</span><br><span style="color: hsl(120, 100%, 40%);">+the interface presents a list of user commands or options, such as a</span><br><span style="color: hsl(120, 100%, 40%);">+menu, a prominent item in the list meets this criterion.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  1. Source Code.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The "source code" for a work means the preferred form of the work</span><br><span style="color: hsl(120, 100%, 40%);">+for making modifications to it.  "Object code" means any non-source</span><br><span style="color: hsl(120, 100%, 40%);">+form of a work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "Standard Interface" means an interface that either is an official</span><br><span style="color: hsl(120, 100%, 40%);">+standard defined by a recognized standards body, or, in the case of</span><br><span style="color: hsl(120, 100%, 40%);">+interfaces specified for a particular programming language, one that</span><br><span style="color: hsl(120, 100%, 40%);">+is widely used among developers working in that language.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The "System Libraries" of an executable work include anything, other</span><br><span style="color: hsl(120, 100%, 40%);">+than the work as a whole, that (a) is included in the normal form of</span><br><span style="color: hsl(120, 100%, 40%);">+packaging a Major Component, but which is not part of that Major</span><br><span style="color: hsl(120, 100%, 40%);">+Component, and (b) serves only to enable use of the work with that</span><br><span style="color: hsl(120, 100%, 40%);">+Major Component, or to implement a Standard Interface for which an</span><br><span style="color: hsl(120, 100%, 40%);">+implementation is available to the public in source code form.  A</span><br><span style="color: hsl(120, 100%, 40%);">+"Major Component", in this context, means a major essential component</span><br><span style="color: hsl(120, 100%, 40%);">+(kernel, window system, and so on) of the specific operating system</span><br><span style="color: hsl(120, 100%, 40%);">+(if any) on which the executable work runs, or a compiler used to</span><br><span style="color: hsl(120, 100%, 40%);">+produce the work, or an object code interpreter used to run it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The "Corresponding Source" for a work in object code form means all</span><br><span style="color: hsl(120, 100%, 40%);">+the source code needed to generate, install, and (for an executable</span><br><span style="color: hsl(120, 100%, 40%);">+work) run the object code and to modify the work, including scripts to</span><br><span style="color: hsl(120, 100%, 40%);">+control those activities.  However, it does not include the work's</span><br><span style="color: hsl(120, 100%, 40%);">+System Libraries, or general-purpose tools or generally available free</span><br><span style="color: hsl(120, 100%, 40%);">+programs which are used unmodified in performing those activities but</span><br><span style="color: hsl(120, 100%, 40%);">+which are not part of the work.  For example, Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+includes interface definition files associated with source files for</span><br><span style="color: hsl(120, 100%, 40%);">+the work, and the source code for shared libraries and dynamically</span><br><span style="color: hsl(120, 100%, 40%);">+linked subprograms that the work is specifically designed to require,</span><br><span style="color: hsl(120, 100%, 40%);">+such as by intimate data communication or control flow between those</span><br><span style="color: hsl(120, 100%, 40%);">+subprograms and other parts of the work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The Corresponding Source need not include anything that users</span><br><span style="color: hsl(120, 100%, 40%);">+can regenerate automatically from other parts of the Corresponding</span><br><span style="color: hsl(120, 100%, 40%);">+Source.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The Corresponding Source for a work in source code form is that</span><br><span style="color: hsl(120, 100%, 40%);">+same work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  2. Basic Permissions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  All rights granted under this License are granted for the term of</span><br><span style="color: hsl(120, 100%, 40%);">+copyright on the Program, and are irrevocable provided the stated</span><br><span style="color: hsl(120, 100%, 40%);">+conditions are met.  This License explicitly affirms your unlimited</span><br><span style="color: hsl(120, 100%, 40%);">+permission to run the unmodified Program.  The output from running a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work is covered by this License only if the output, given its</span><br><span style="color: hsl(120, 100%, 40%);">+content, constitutes a covered work.  This License acknowledges your</span><br><span style="color: hsl(120, 100%, 40%);">+rights of fair use or other equivalent, as provided by copyright law.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may make, run and propagate covered works that you do not</span><br><span style="color: hsl(120, 100%, 40%);">+convey, without conditions so long as your license otherwise remains</span><br><span style="color: hsl(120, 100%, 40%);">+in force.  You may convey covered works to others for the sole purpose</span><br><span style="color: hsl(120, 100%, 40%);">+of having them make modifications exclusively for you, or provide you</span><br><span style="color: hsl(120, 100%, 40%);">+with facilities for running those works, provided that you comply with</span><br><span style="color: hsl(120, 100%, 40%);">+the terms of this License in conveying all material for which you do</span><br><span style="color: hsl(120, 100%, 40%);">+not control copyright.  Those thus making or running the covered works</span><br><span style="color: hsl(120, 100%, 40%);">+for you must do so exclusively on your behalf, under your direction</span><br><span style="color: hsl(120, 100%, 40%);">+and control, on terms that prohibit them from making any copies of</span><br><span style="color: hsl(120, 100%, 40%);">+your copyrighted material outside their relationship with you.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Conveying under any other circumstances is permitted solely under</span><br><span style="color: hsl(120, 100%, 40%);">+the conditions stated below.  Sublicensing is not allowed; section 10</span><br><span style="color: hsl(120, 100%, 40%);">+makes it unnecessary.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  No covered work shall be deemed part of an effective technological</span><br><span style="color: hsl(120, 100%, 40%);">+measure under any applicable law fulfilling obligations under article</span><br><span style="color: hsl(120, 100%, 40%);">+11 of the WIPO copyright treaty adopted on 20 December 1996, or</span><br><span style="color: hsl(120, 100%, 40%);">+similar laws prohibiting or restricting circumvention of such</span><br><span style="color: hsl(120, 100%, 40%);">+measures.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  When you convey a covered work, you waive any legal power to forbid</span><br><span style="color: hsl(120, 100%, 40%);">+circumvention of technological measures to the extent such circumvention</span><br><span style="color: hsl(120, 100%, 40%);">+is effected by exercising rights under this License with respect to</span><br><span style="color: hsl(120, 100%, 40%);">+the covered work, and you disclaim any intention to limit operation or</span><br><span style="color: hsl(120, 100%, 40%);">+modification of the work as a means of enforcing, against the work's</span><br><span style="color: hsl(120, 100%, 40%);">+users, your or third parties' legal rights to forbid circumvention of</span><br><span style="color: hsl(120, 100%, 40%);">+technological measures.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  4. Conveying Verbatim Copies.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may convey verbatim copies of the Program's source code as you</span><br><span style="color: hsl(120, 100%, 40%);">+receive it, in any medium, provided that you conspicuously and</span><br><span style="color: hsl(120, 100%, 40%);">+appropriately publish on each copy an appropriate copyright notice;</span><br><span style="color: hsl(120, 100%, 40%);">+keep intact all notices stating that this License and any</span><br><span style="color: hsl(120, 100%, 40%);">+non-permissive terms added in accord with section 7 apply to the code;</span><br><span style="color: hsl(120, 100%, 40%);">+keep intact all notices of the absence of any warranty; and give all</span><br><span style="color: hsl(120, 100%, 40%);">+recipients a copy of this License along with the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may charge any price or no price for each copy that you convey,</span><br><span style="color: hsl(120, 100%, 40%);">+and you may offer support or warranty protection for a fee.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  5. Conveying Modified Source Versions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may convey a work based on the Program, or the modifications to</span><br><span style="color: hsl(120, 100%, 40%);">+produce it from the Program, in the form of source code under the</span><br><span style="color: hsl(120, 100%, 40%);">+terms of section 4, provided that you also meet all of these conditions:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    a) The work must carry prominent notices stating that you modified</span><br><span style="color: hsl(120, 100%, 40%);">+    it, and giving a relevant date.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    b) The work must carry prominent notices stating that it is</span><br><span style="color: hsl(120, 100%, 40%);">+    released under this License and any conditions added under section</span><br><span style="color: hsl(120, 100%, 40%);">+    7.  This requirement modifies the requirement in section 4 to</span><br><span style="color: hsl(120, 100%, 40%);">+    "keep intact all notices".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    c) You must license the entire work, as a whole, under this</span><br><span style="color: hsl(120, 100%, 40%);">+    License to anyone who comes into possession of a copy.  This</span><br><span style="color: hsl(120, 100%, 40%);">+    License will therefore apply, along with any applicable section 7</span><br><span style="color: hsl(120, 100%, 40%);">+    additional terms, to the whole of the work, and all its parts,</span><br><span style="color: hsl(120, 100%, 40%);">+    regardless of how they are packaged.  This License gives no</span><br><span style="color: hsl(120, 100%, 40%);">+    permission to license the work in any other way, but it does not</span><br><span style="color: hsl(120, 100%, 40%);">+    invalidate such permission if you have separately received it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    d) If the work has interactive user interfaces, each must display</span><br><span style="color: hsl(120, 100%, 40%);">+    Appropriate Legal Notices; however, if the Program has interactive</span><br><span style="color: hsl(120, 100%, 40%);">+    interfaces that do not display Appropriate Legal Notices, your</span><br><span style="color: hsl(120, 100%, 40%);">+    work need not make them do so.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A compilation of a covered work with other separate and independent</span><br><span style="color: hsl(120, 100%, 40%);">+works, which are not by their nature extensions of the covered work,</span><br><span style="color: hsl(120, 100%, 40%);">+and which are not combined with it such as to form a larger program,</span><br><span style="color: hsl(120, 100%, 40%);">+in or on a volume of a storage or distribution medium, is called an</span><br><span style="color: hsl(120, 100%, 40%);">+"aggregate" if the compilation and its resulting copyright are not</span><br><span style="color: hsl(120, 100%, 40%);">+used to limit the access or legal rights of the compilation's users</span><br><span style="color: hsl(120, 100%, 40%);">+beyond what the individual works permit.  Inclusion of a covered work</span><br><span style="color: hsl(120, 100%, 40%);">+in an aggregate does not cause this License to apply to the other</span><br><span style="color: hsl(120, 100%, 40%);">+parts of the aggregate.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  6. Conveying Non-Source Forms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may convey a covered work in object code form under the terms</span><br><span style="color: hsl(120, 100%, 40%);">+of sections 4 and 5, provided that you also convey the</span><br><span style="color: hsl(120, 100%, 40%);">+machine-readable Corresponding Source under the terms of this License,</span><br><span style="color: hsl(120, 100%, 40%);">+in one of these ways:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    a) Convey the object code in, or embodied in, a physical product</span><br><span style="color: hsl(120, 100%, 40%);">+    (including a physical distribution medium), accompanied by the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source fixed on a durable physical medium</span><br><span style="color: hsl(120, 100%, 40%);">+    customarily used for software interchange.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    b) Convey the object code in, or embodied in, a physical product</span><br><span style="color: hsl(120, 100%, 40%);">+    (including a physical distribution medium), accompanied by a</span><br><span style="color: hsl(120, 100%, 40%);">+    written offer, valid for at least three years and valid for as</span><br><span style="color: hsl(120, 100%, 40%);">+    long as you offer spare parts or customer support for that product</span><br><span style="color: hsl(120, 100%, 40%);">+    model, to give anyone who possesses the object code either (1) a</span><br><span style="color: hsl(120, 100%, 40%);">+    copy of the Corresponding Source for all the software in the</span><br><span style="color: hsl(120, 100%, 40%);">+    product that is covered by this License, on a durable physical</span><br><span style="color: hsl(120, 100%, 40%);">+    medium customarily used for software interchange, for a price no</span><br><span style="color: hsl(120, 100%, 40%);">+    more than your reasonable cost of physically performing this</span><br><span style="color: hsl(120, 100%, 40%);">+    conveying of source, or (2) access to copy the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source from a network server at no charge.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    c) Convey individual copies of the object code with a copy of the</span><br><span style="color: hsl(120, 100%, 40%);">+    written offer to provide the Corresponding Source.  This</span><br><span style="color: hsl(120, 100%, 40%);">+    alternative is allowed only occasionally and noncommercially, and</span><br><span style="color: hsl(120, 100%, 40%);">+    only if you received the object code with such an offer, in accord</span><br><span style="color: hsl(120, 100%, 40%);">+    with subsection 6b.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    d) Convey the object code by offering access from a designated</span><br><span style="color: hsl(120, 100%, 40%);">+    place (gratis or for a charge), and offer equivalent access to the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source in the same way through the same place at no</span><br><span style="color: hsl(120, 100%, 40%);">+    further charge.  You need not require recipients to copy the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source along with the object code.  If the place to</span><br><span style="color: hsl(120, 100%, 40%);">+    copy the object code is a network server, the Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+    may be on a different server (operated by you or a third party)</span><br><span style="color: hsl(120, 100%, 40%);">+    that supports equivalent copying facilities, provided you maintain</span><br><span style="color: hsl(120, 100%, 40%);">+    clear directions next to the object code saying where to find the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source.  Regardless of what server hosts the</span><br><span style="color: hsl(120, 100%, 40%);">+    Corresponding Source, you remain obligated to ensure that it is</span><br><span style="color: hsl(120, 100%, 40%);">+    available for as long as needed to satisfy these requirements.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    e) Convey the object code using peer-to-peer transmission, provided</span><br><span style="color: hsl(120, 100%, 40%);">+    you inform other peers where the object code and Corresponding</span><br><span style="color: hsl(120, 100%, 40%);">+    Source of the work are being offered to the general public at no</span><br><span style="color: hsl(120, 100%, 40%);">+    charge under subsection 6d.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A separable portion of the object code, whose source code is excluded</span><br><span style="color: hsl(120, 100%, 40%);">+from the Corresponding Source as a System Library, need not be</span><br><span style="color: hsl(120, 100%, 40%);">+included in conveying the object code work.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "User Product" is either (1) a "consumer product", which means any</span><br><span style="color: hsl(120, 100%, 40%);">+tangible personal property which is normally used for personal, family,</span><br><span style="color: hsl(120, 100%, 40%);">+or household purposes, or (2) anything designed or sold for incorporation</span><br><span style="color: hsl(120, 100%, 40%);">+into a dwelling.  In determining whether a product is a consumer product,</span><br><span style="color: hsl(120, 100%, 40%);">+doubtful cases shall be resolved in favor of coverage.  For a particular</span><br><span style="color: hsl(120, 100%, 40%);">+product received by a particular user, "normally used" refers to a</span><br><span style="color: hsl(120, 100%, 40%);">+typical or common use of that class of product, regardless of the status</span><br><span style="color: hsl(120, 100%, 40%);">+of the particular user or of the way in which the particular user</span><br><span style="color: hsl(120, 100%, 40%);">+actually uses, or expects or is expected to use, the product.  A product</span><br><span style="color: hsl(120, 100%, 40%);">+is a consumer product regardless of whether the product has substantial</span><br><span style="color: hsl(120, 100%, 40%);">+commercial, industrial or non-consumer uses, unless such uses represent</span><br><span style="color: hsl(120, 100%, 40%);">+the only significant mode of use of the product.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "Installation Information" for a User Product means any methods,</span><br><span style="color: hsl(120, 100%, 40%);">+procedures, authorization keys, or other information required to install</span><br><span style="color: hsl(120, 100%, 40%);">+and execute modified versions of a covered work in that User Product from</span><br><span style="color: hsl(120, 100%, 40%);">+a modified version of its Corresponding Source.  The information must</span><br><span style="color: hsl(120, 100%, 40%);">+suffice to ensure that the continued functioning of the modified object</span><br><span style="color: hsl(120, 100%, 40%);">+code is in no case prevented or interfered with solely because</span><br><span style="color: hsl(120, 100%, 40%);">+modification has been made.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you convey an object code work under this section in, or with, or</span><br><span style="color: hsl(120, 100%, 40%);">+specifically for use in, a User Product, and the conveying occurs as</span><br><span style="color: hsl(120, 100%, 40%);">+part of a transaction in which the right of possession and use of the</span><br><span style="color: hsl(120, 100%, 40%);">+User Product is transferred to the recipient in perpetuity or for a</span><br><span style="color: hsl(120, 100%, 40%);">+fixed term (regardless of how the transaction is characterized), the</span><br><span style="color: hsl(120, 100%, 40%);">+Corresponding Source conveyed under this section must be accompanied</span><br><span style="color: hsl(120, 100%, 40%);">+by the Installation Information.  But this requirement does not apply</span><br><span style="color: hsl(120, 100%, 40%);">+if neither you nor any third party retains the ability to install</span><br><span style="color: hsl(120, 100%, 40%);">+modified object code on the User Product (for example, the work has</span><br><span style="color: hsl(120, 100%, 40%);">+been installed in ROM).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The requirement to provide Installation Information does not include a</span><br><span style="color: hsl(120, 100%, 40%);">+requirement to continue to provide support service, warranty, or updates</span><br><span style="color: hsl(120, 100%, 40%);">+for a work that has been modified or installed by the recipient, or for</span><br><span style="color: hsl(120, 100%, 40%);">+the User Product in which it has been modified or installed.  Access to a</span><br><span style="color: hsl(120, 100%, 40%);">+network may be denied when the modification itself materially and</span><br><span style="color: hsl(120, 100%, 40%);">+adversely affects the operation of the network or violates the rules and</span><br><span style="color: hsl(120, 100%, 40%);">+protocols for communication across the network.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Corresponding Source conveyed, and Installation Information provided,</span><br><span style="color: hsl(120, 100%, 40%);">+in accord with this section must be in a format that is publicly</span><br><span style="color: hsl(120, 100%, 40%);">+documented (and with an implementation available to the public in</span><br><span style="color: hsl(120, 100%, 40%);">+source code form), and must require no special password or key for</span><br><span style="color: hsl(120, 100%, 40%);">+unpacking, reading or copying.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  7. Additional Terms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  "Additional permissions" are terms that supplement the terms of this</span><br><span style="color: hsl(120, 100%, 40%);">+License by making exceptions from one or more of its conditions.</span><br><span style="color: hsl(120, 100%, 40%);">+Additional permissions that are applicable to the entire Program shall</span><br><span style="color: hsl(120, 100%, 40%);">+be treated as though they were included in this License, to the extent</span><br><span style="color: hsl(120, 100%, 40%);">+that they are valid under applicable law.  If additional permissions</span><br><span style="color: hsl(120, 100%, 40%);">+apply only to part of the Program, that part may be used separately</span><br><span style="color: hsl(120, 100%, 40%);">+under those permissions, but the entire Program remains governed by</span><br><span style="color: hsl(120, 100%, 40%);">+this License without regard to the additional permissions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  When you convey a copy of a covered work, you may at your option</span><br><span style="color: hsl(120, 100%, 40%);">+remove any additional permissions from that copy, or from any part of</span><br><span style="color: hsl(120, 100%, 40%);">+it.  (Additional permissions may be written to require their own</span><br><span style="color: hsl(120, 100%, 40%);">+removal in certain cases when you modify the work.)  You may place</span><br><span style="color: hsl(120, 100%, 40%);">+additional permissions on material, added by you to a covered work,</span><br><span style="color: hsl(120, 100%, 40%);">+for which you have or can give appropriate copyright permission.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Notwithstanding any other provision of this License, for material you</span><br><span style="color: hsl(120, 100%, 40%);">+add to a covered work, you may (if authorized by the copyright holders of</span><br><span style="color: hsl(120, 100%, 40%);">+that material) supplement the terms of this License with terms:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    a) Disclaiming warranty or limiting liability differently from the</span><br><span style="color: hsl(120, 100%, 40%);">+    terms of sections 15 and 16 of this License; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    b) Requiring preservation of specified reasonable legal notices or</span><br><span style="color: hsl(120, 100%, 40%);">+    author attributions in that material or in the Appropriate Legal</span><br><span style="color: hsl(120, 100%, 40%);">+    Notices displayed by works containing it; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    c) Prohibiting misrepresentation of the origin of that material, or</span><br><span style="color: hsl(120, 100%, 40%);">+    requiring that modified versions of such material be marked in</span><br><span style="color: hsl(120, 100%, 40%);">+    reasonable ways as different from the original version; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    d) Limiting the use for publicity purposes of names of licensors or</span><br><span style="color: hsl(120, 100%, 40%);">+    authors of the material; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    e) Declining to grant rights under trademark law for use of some</span><br><span style="color: hsl(120, 100%, 40%);">+    trade names, trademarks, or service marks; or</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f) Requiring indemnification of licensors and authors of that</span><br><span style="color: hsl(120, 100%, 40%);">+    material by anyone who conveys the material (or modified versions of</span><br><span style="color: hsl(120, 100%, 40%);">+    it) with contractual assumptions of liability to the recipient, for</span><br><span style="color: hsl(120, 100%, 40%);">+    any liability that these contractual assumptions directly impose on</span><br><span style="color: hsl(120, 100%, 40%);">+    those licensors and authors.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  All other non-permissive additional terms are considered "further</span><br><span style="color: hsl(120, 100%, 40%);">+restrictions" within the meaning of section 10.  If the Program as you</span><br><span style="color: hsl(120, 100%, 40%);">+received it, or any part of it, contains a notice stating that it is</span><br><span style="color: hsl(120, 100%, 40%);">+governed by this License along with a term that is a further</span><br><span style="color: hsl(120, 100%, 40%);">+restriction, you may remove that term.  If a license document contains</span><br><span style="color: hsl(120, 100%, 40%);">+a further restriction but permits relicensing or conveying under this</span><br><span style="color: hsl(120, 100%, 40%);">+License, you may add to a covered work material governed by the terms</span><br><span style="color: hsl(120, 100%, 40%);">+of that license document, provided that the further restriction does</span><br><span style="color: hsl(120, 100%, 40%);">+not survive such relicensing or conveying.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you add terms to a covered work in accord with this section, you</span><br><span style="color: hsl(120, 100%, 40%);">+must place, in the relevant source files, a statement of the</span><br><span style="color: hsl(120, 100%, 40%);">+additional terms that apply to those files, or a notice indicating</span><br><span style="color: hsl(120, 100%, 40%);">+where to find the applicable terms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Additional terms, permissive or non-permissive, may be stated in the</span><br><span style="color: hsl(120, 100%, 40%);">+form of a separately written license, or stated as exceptions;</span><br><span style="color: hsl(120, 100%, 40%);">+the above requirements apply either way.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  8. Termination.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may not propagate or modify a covered work except as expressly</span><br><span style="color: hsl(120, 100%, 40%);">+provided under this License.  Any attempt otherwise to propagate or</span><br><span style="color: hsl(120, 100%, 40%);">+modify it is void, and will automatically terminate your rights under</span><br><span style="color: hsl(120, 100%, 40%);">+this License (including any patent licenses granted under the third</span><br><span style="color: hsl(120, 100%, 40%);">+paragraph of section 11).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  However, if you cease all violation of this License, then your</span><br><span style="color: hsl(120, 100%, 40%);">+license from a particular copyright holder is reinstated (a)</span><br><span style="color: hsl(120, 100%, 40%);">+provisionally, unless and until the copyright holder explicitly and</span><br><span style="color: hsl(120, 100%, 40%);">+finally terminates your license, and (b) permanently, if the copyright</span><br><span style="color: hsl(120, 100%, 40%);">+holder fails to notify you of the violation by some reasonable means</span><br><span style="color: hsl(120, 100%, 40%);">+prior to 60 days after the cessation.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Moreover, your license from a particular copyright holder is</span><br><span style="color: hsl(120, 100%, 40%);">+reinstated permanently if the copyright holder notifies you of the</span><br><span style="color: hsl(120, 100%, 40%);">+violation by some reasonable means, this is the first time you have</span><br><span style="color: hsl(120, 100%, 40%);">+received notice of violation of this License (for any work) from that</span><br><span style="color: hsl(120, 100%, 40%);">+copyright holder, and you cure the violation prior to 30 days after</span><br><span style="color: hsl(120, 100%, 40%);">+your receipt of the notice.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Termination of your rights under this section does not terminate the</span><br><span style="color: hsl(120, 100%, 40%);">+licenses of parties who have received copies or rights from you under</span><br><span style="color: hsl(120, 100%, 40%);">+this License.  If your rights have been terminated and not permanently</span><br><span style="color: hsl(120, 100%, 40%);">+reinstated, you do not qualify to receive new licenses for the same</span><br><span style="color: hsl(120, 100%, 40%);">+material under section 10.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  9. Acceptance Not Required for Having Copies.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You are not required to accept this License in order to receive or</span><br><span style="color: hsl(120, 100%, 40%);">+run a copy of the Program.  Ancillary propagation of a covered work</span><br><span style="color: hsl(120, 100%, 40%);">+occurring solely as a consequence of using peer-to-peer transmission</span><br><span style="color: hsl(120, 100%, 40%);">+to receive a copy likewise does not require acceptance.  However,</span><br><span style="color: hsl(120, 100%, 40%);">+nothing other than this License grants you permission to propagate or</span><br><span style="color: hsl(120, 100%, 40%);">+modify any covered work.  These actions infringe copyright if you do</span><br><span style="color: hsl(120, 100%, 40%);">+not accept this License.  Therefore, by modifying or propagating a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work, you indicate your acceptance of this License to do so.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  10. Automatic Licensing of Downstream Recipients.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Each time you convey a covered work, the recipient automatically</span><br><span style="color: hsl(120, 100%, 40%);">+receives a license from the original licensors, to run, modify and</span><br><span style="color: hsl(120, 100%, 40%);">+propagate that work, subject to this License.  You are not responsible</span><br><span style="color: hsl(120, 100%, 40%);">+for enforcing compliance by third parties with this License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  An "entity transaction" is a transaction transferring control of an</span><br><span style="color: hsl(120, 100%, 40%);">+organization, or substantially all assets of one, or subdividing an</span><br><span style="color: hsl(120, 100%, 40%);">+organization, or merging organizations.  If propagation of a covered</span><br><span style="color: hsl(120, 100%, 40%);">+work results from an entity transaction, each party to that</span><br><span style="color: hsl(120, 100%, 40%);">+transaction who receives a copy of the work also receives whatever</span><br><span style="color: hsl(120, 100%, 40%);">+licenses to the work the party's predecessor in interest had or could</span><br><span style="color: hsl(120, 100%, 40%);">+give under the previous paragraph, plus a right to possession of the</span><br><span style="color: hsl(120, 100%, 40%);">+Corresponding Source of the work from the predecessor in interest, if</span><br><span style="color: hsl(120, 100%, 40%);">+the predecessor has it or can get it with reasonable efforts.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You may not impose any further restrictions on the exercise of the</span><br><span style="color: hsl(120, 100%, 40%);">+rights granted or affirmed under this License.  For example, you may</span><br><span style="color: hsl(120, 100%, 40%);">+not impose a license fee, royalty, or other charge for exercise of</span><br><span style="color: hsl(120, 100%, 40%);">+rights granted under this License, and you may not initiate litigation</span><br><span style="color: hsl(120, 100%, 40%);">+(including a cross-claim or counterclaim in a lawsuit) alleging that</span><br><span style="color: hsl(120, 100%, 40%);">+any patent claim is infringed by making, using, selling, offering for</span><br><span style="color: hsl(120, 100%, 40%);">+sale, or importing the Program or any portion of it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  11. Patents.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A "contributor" is a copyright holder who authorizes use under this</span><br><span style="color: hsl(120, 100%, 40%);">+License of the Program or a work on which the Program is based.  The</span><br><span style="color: hsl(120, 100%, 40%);">+work thus licensed is called the contributor's "contributor version".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A contributor's "essential patent claims" are all patent claims</span><br><span style="color: hsl(120, 100%, 40%);">+owned or controlled by the contributor, whether already acquired or</span><br><span style="color: hsl(120, 100%, 40%);">+hereafter acquired, that would be infringed by some manner, permitted</span><br><span style="color: hsl(120, 100%, 40%);">+by this License, of making, using, or selling its contributor version,</span><br><span style="color: hsl(120, 100%, 40%);">+but do not include claims that would be infringed only as a</span><br><span style="color: hsl(120, 100%, 40%);">+consequence of further modification of the contributor version.  For</span><br><span style="color: hsl(120, 100%, 40%);">+purposes of this definition, "control" includes the right to grant</span><br><span style="color: hsl(120, 100%, 40%);">+patent sublicenses in a manner consistent with the requirements of</span><br><span style="color: hsl(120, 100%, 40%);">+this License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Each contributor grants you a non-exclusive, worldwide, royalty-free</span><br><span style="color: hsl(120, 100%, 40%);">+patent license under the contributor's essential patent claims, to</span><br><span style="color: hsl(120, 100%, 40%);">+make, use, sell, offer for sale, import and otherwise run, modify and</span><br><span style="color: hsl(120, 100%, 40%);">+propagate the contents of its contributor version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  In the following three paragraphs, a "patent license" is any express</span><br><span style="color: hsl(120, 100%, 40%);">+agreement or commitment, however denominated, not to enforce a patent</span><br><span style="color: hsl(120, 100%, 40%);">+(such as an express permission to practice a patent or covenant not to</span><br><span style="color: hsl(120, 100%, 40%);">+sue for patent infringement).  To "grant" such a patent license to a</span><br><span style="color: hsl(120, 100%, 40%);">+party means to make such an agreement or commitment not to enforce a</span><br><span style="color: hsl(120, 100%, 40%);">+patent against the party.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you convey a covered work, knowingly relying on a patent license,</span><br><span style="color: hsl(120, 100%, 40%);">+and the Corresponding Source of the work is not available for anyone</span><br><span style="color: hsl(120, 100%, 40%);">+to copy, free of charge and under the terms of this License, through a</span><br><span style="color: hsl(120, 100%, 40%);">+publicly available network server or other readily accessible means,</span><br><span style="color: hsl(120, 100%, 40%);">+then you must either (1) cause the Corresponding Source to be so</span><br><span style="color: hsl(120, 100%, 40%);">+available, or (2) arrange to deprive yourself of the benefit of the</span><br><span style="color: hsl(120, 100%, 40%);">+patent license for this particular work, or (3) arrange, in a manner</span><br><span style="color: hsl(120, 100%, 40%);">+consistent with the requirements of this License, to extend the patent</span><br><span style="color: hsl(120, 100%, 40%);">+license to downstream recipients.  "Knowingly relying" means you have</span><br><span style="color: hsl(120, 100%, 40%);">+actual knowledge that, but for the patent license, your conveying the</span><br><span style="color: hsl(120, 100%, 40%);">+covered work in a country, or your recipient's use of the covered work</span><br><span style="color: hsl(120, 100%, 40%);">+in a country, would infringe one or more identifiable patents in that</span><br><span style="color: hsl(120, 100%, 40%);">+country that you have reason to believe are valid.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If, pursuant to or in connection with a single transaction or</span><br><span style="color: hsl(120, 100%, 40%);">+arrangement, you convey, or propagate by procuring conveyance of, a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work, and grant a patent license to some of the parties</span><br><span style="color: hsl(120, 100%, 40%);">+receiving the covered work authorizing them to use, propagate, modify</span><br><span style="color: hsl(120, 100%, 40%);">+or convey a specific copy of the covered work, then the patent license</span><br><span style="color: hsl(120, 100%, 40%);">+you grant is automatically extended to all recipients of the covered</span><br><span style="color: hsl(120, 100%, 40%);">+work and works based on it.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  A patent license is "discriminatory" if it does not include within</span><br><span style="color: hsl(120, 100%, 40%);">+the scope of its coverage, prohibits the exercise of, or is</span><br><span style="color: hsl(120, 100%, 40%);">+conditioned on the non-exercise of one or more of the rights that are</span><br><span style="color: hsl(120, 100%, 40%);">+specifically granted under this License.  You may not convey a covered</span><br><span style="color: hsl(120, 100%, 40%);">+work if you are a party to an arrangement with a third party that is</span><br><span style="color: hsl(120, 100%, 40%);">+in the business of distributing software, under which you make payment</span><br><span style="color: hsl(120, 100%, 40%);">+to the third party based on the extent of your activity of conveying</span><br><span style="color: hsl(120, 100%, 40%);">+the work, and under which the third party grants, to any of the</span><br><span style="color: hsl(120, 100%, 40%);">+parties who would receive the covered work from you, a discriminatory</span><br><span style="color: hsl(120, 100%, 40%);">+patent license (a) in connection with copies of the covered work</span><br><span style="color: hsl(120, 100%, 40%);">+conveyed by you (or copies made from those copies), or (b) primarily</span><br><span style="color: hsl(120, 100%, 40%);">+for and in connection with specific products or compilations that</span><br><span style="color: hsl(120, 100%, 40%);">+contain the covered work, unless you entered into that arrangement,</span><br><span style="color: hsl(120, 100%, 40%);">+or that patent license was granted, prior to 28 March 2007.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Nothing in this License shall be construed as excluding or limiting</span><br><span style="color: hsl(120, 100%, 40%);">+any implied license or other defenses to infringement that may</span><br><span style="color: hsl(120, 100%, 40%);">+otherwise be available to you under applicable patent law.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  12. No Surrender of Others' Freedom.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If conditions are imposed on you (whether by court order, agreement or</span><br><span style="color: hsl(120, 100%, 40%);">+otherwise) that contradict the conditions of this License, they do not</span><br><span style="color: hsl(120, 100%, 40%);">+excuse you from the conditions of this License.  If you cannot convey a</span><br><span style="color: hsl(120, 100%, 40%);">+covered work so as to satisfy simultaneously your obligations under this</span><br><span style="color: hsl(120, 100%, 40%);">+License and any other pertinent obligations, then as a consequence you may</span><br><span style="color: hsl(120, 100%, 40%);">+not convey it at all.  For example, if you agree to terms that obligate you</span><br><span style="color: hsl(120, 100%, 40%);">+to collect a royalty for further conveying from those to whom you convey</span><br><span style="color: hsl(120, 100%, 40%);">+the Program, the only way you could satisfy both those terms and this</span><br><span style="color: hsl(120, 100%, 40%);">+License would be to refrain entirely from conveying the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  13. Remote Network Interaction; Use with the GNU General Public License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Notwithstanding any other provision of this License, if you modify the</span><br><span style="color: hsl(120, 100%, 40%);">+Program, your modified version must prominently offer all users</span><br><span style="color: hsl(120, 100%, 40%);">+interacting with it remotely through a computer network (if your version</span><br><span style="color: hsl(120, 100%, 40%);">+supports such interaction) an opportunity to receive the Corresponding</span><br><span style="color: hsl(120, 100%, 40%);">+Source of your version by providing access to the Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+from a network server at no charge, through some standard or customary</span><br><span style="color: hsl(120, 100%, 40%);">+means of facilitating copying of software.  This Corresponding Source</span><br><span style="color: hsl(120, 100%, 40%);">+shall include the Corresponding Source for any work covered by version 3</span><br><span style="color: hsl(120, 100%, 40%);">+of the GNU General Public License that is incorporated pursuant to the</span><br><span style="color: hsl(120, 100%, 40%);">+following paragraph.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Notwithstanding any other provision of this License, you have</span><br><span style="color: hsl(120, 100%, 40%);">+permission to link or combine any covered work with a work licensed</span><br><span style="color: hsl(120, 100%, 40%);">+under version 3 of the GNU General Public License into a single</span><br><span style="color: hsl(120, 100%, 40%);">+combined work, and to convey the resulting work.  The terms of this</span><br><span style="color: hsl(120, 100%, 40%);">+License will continue to apply to the part which is the covered work,</span><br><span style="color: hsl(120, 100%, 40%);">+but the work with which it is combined will remain governed by version</span><br><span style="color: hsl(120, 100%, 40%);">+3 of the GNU General Public License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  14. Revised Versions of this License.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  The Free Software Foundation may publish revised and/or new versions of</span><br><span style="color: hsl(120, 100%, 40%);">+the GNU Affero General Public License from time to time.  Such new versions</span><br><span style="color: hsl(120, 100%, 40%);">+will be similar in spirit to the present version, but may differ in detail to</span><br><span style="color: hsl(120, 100%, 40%);">+address new problems or concerns.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Each version is given a distinguishing version number.  If the</span><br><span style="color: hsl(120, 100%, 40%);">+Program specifies that a certain numbered version of the GNU Affero General</span><br><span style="color: hsl(120, 100%, 40%);">+Public License "or any later version" applies to it, you have the</span><br><span style="color: hsl(120, 100%, 40%);">+option of following the terms and conditions either of that numbered</span><br><span style="color: hsl(120, 100%, 40%);">+version or of any later version published by the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+Foundation.  If the Program does not specify a version number of the</span><br><span style="color: hsl(120, 100%, 40%);">+GNU Affero General Public License, you may choose any version ever published</span><br><span style="color: hsl(120, 100%, 40%);">+by the Free Software Foundation.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If the Program specifies that a proxy can decide which future</span><br><span style="color: hsl(120, 100%, 40%);">+versions of the GNU Affero General Public License can be used, that proxy's</span><br><span style="color: hsl(120, 100%, 40%);">+public statement of acceptance of a version permanently authorizes you</span><br><span style="color: hsl(120, 100%, 40%);">+to choose that version for the Program.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  Later license versions may give you additional or different</span><br><span style="color: hsl(120, 100%, 40%);">+permissions.  However, no additional obligations are imposed on any</span><br><span style="color: hsl(120, 100%, 40%);">+author or copyright holder as a result of your choosing to follow a</span><br><span style="color: hsl(120, 100%, 40%);">+later version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  15. Disclaimer of Warranty.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY</span><br><span style="color: hsl(120, 100%, 40%);">+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT</span><br><span style="color: hsl(120, 100%, 40%);">+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY</span><br><span style="color: hsl(120, 100%, 40%);">+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,</span><br><span style="color: hsl(120, 100%, 40%);">+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span><br><span style="color: hsl(120, 100%, 40%);">+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM</span><br><span style="color: hsl(120, 100%, 40%);">+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF</span><br><span style="color: hsl(120, 100%, 40%);">+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  16. Limitation of Liability.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</span><br><span style="color: hsl(120, 100%, 40%);">+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS</span><br><span style="color: hsl(120, 100%, 40%);">+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY</span><br><span style="color: hsl(120, 100%, 40%);">+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE</span><br><span style="color: hsl(120, 100%, 40%);">+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF</span><br><span style="color: hsl(120, 100%, 40%);">+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD</span><br><span style="color: hsl(120, 100%, 40%);">+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),</span><br><span style="color: hsl(120, 100%, 40%);">+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF</span><br><span style="color: hsl(120, 100%, 40%);">+SUCH DAMAGES.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  17. Interpretation of Sections 15 and 16.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If the disclaimer of warranty and limitation of liability provided</span><br><span style="color: hsl(120, 100%, 40%);">+above cannot be given local legal effect according to their terms,</span><br><span style="color: hsl(120, 100%, 40%);">+reviewing courts shall apply local law that most closely approximates</span><br><span style="color: hsl(120, 100%, 40%);">+an absolute waiver of all civil liability in connection with the</span><br><span style="color: hsl(120, 100%, 40%);">+Program, unless a warranty or assumption of liability accompanies a</span><br><span style="color: hsl(120, 100%, 40%);">+copy of the Program in return for a fee.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     END OF TERMS AND CONDITIONS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            How to Apply These Terms to Your New Programs</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If you develop a new program, and you want it to be of the greatest</span><br><span style="color: hsl(120, 100%, 40%);">+possible use to the public, the best way to achieve this is to make it</span><br><span style="color: hsl(120, 100%, 40%);">+free software which everyone can redistribute and change under these terms.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  To do so, attach the following notices to the program.  It is safest</span><br><span style="color: hsl(120, 100%, 40%);">+to attach them to the start of each source file to most effectively</span><br><span style="color: hsl(120, 100%, 40%);">+state the exclusion of warranty; and each file should have at least</span><br><span style="color: hsl(120, 100%, 40%);">+the "copyright" line and a pointer to where the full notice is found.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <one line to give the program's name and a brief idea of what it does.></span><br><span style="color: hsl(120, 100%, 40%);">+    Copyright (C) <year>  <name of author></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+    it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+    the Free Software Foundation, either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+    (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+    but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+    GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+    along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Also add information on how to contact you by electronic and paper mail.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  If your software can interact with users remotely through a computer</span><br><span style="color: hsl(120, 100%, 40%);">+network, you should also make sure that it provides a way for users to</span><br><span style="color: hsl(120, 100%, 40%);">+get its source.  For example, if your program is a web application, its</span><br><span style="color: hsl(120, 100%, 40%);">+interface could display a "Source" link that leads users to an archive</span><br><span style="color: hsl(120, 100%, 40%);">+of the code.  There are many ways you could offer source, and different</span><br><span style="color: hsl(120, 100%, 40%);">+solutions will be better for different programs; see section 13 for the</span><br><span style="color: hsl(120, 100%, 40%);">+specific requirements.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  You should also get your employer (if you work as a programmer) or school,</span><br><span style="color: hsl(120, 100%, 40%);">+if any, to sign a "copyright disclaimer" for the program, if necessary.</span><br><span style="color: hsl(120, 100%, 40%);">+For more information on this, and how to apply and follow the GNU AGPL, see</span><br><span style="color: hsl(120, 100%, 40%);">+<http://www.gnu.org/licenses/>.</span><br><span>diff --git a/Makefile.am b/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..3861d29</span><br><span>--- /dev/null</span><br><span>+++ b/Makefile.am</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## FIXME: automake >= 1.13 or autoconf >= 2.70 provide better suited AC_CONFIG_MACRO_DIRS for configure.ac</span><br><span style="color: hsl(120, 100%, 40%);">+## remove line below when OE toolchain is updated to version which include those</span><br><span style="color: hsl(120, 100%, 40%);">+ACLOCAL_AMFLAGS = -I m4</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+        include \</span><br><span style="color: hsl(120, 100%, 40%);">+     src \</span><br><span style="color: hsl(120, 100%, 40%);">+ tests \</span><br><span style="color: hsl(120, 100%, 40%);">+       doc \</span><br><span style="color: hsl(120, 100%, 40%);">+ contrib \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BUILT_SOURCES = $(top_srcdir)/.version</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+          .version \</span><br><span style="color: hsl(120, 100%, 40%);">+            contrib/osmo-smlc.spec.in \</span><br><span style="color: hsl(120, 100%, 40%);">+           debian \</span><br><span style="color: hsl(120, 100%, 40%);">+      git-version-gen \</span><br><span style="color: hsl(120, 100%, 40%);">+             osmoappdesc.py \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_DISTCHECK_CONFIGURE_FLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      --with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+@RELMAKE@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$(top_srcdir)/.version:</span><br><span style="color: hsl(120, 100%, 40%);">+ echo $(VERSION) > $@-t && mv $@-t $@</span><br><span style="color: hsl(120, 100%, 40%);">+dist-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+   echo $(VERSION) > $(distdir)/.tarball-version</span><br><span>diff --git a/README b/README</span><br><span>new file mode 100644</span><br><span>index 0000000..06fa1ea</span><br><span>--- /dev/null</span><br><span>+++ b/README</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+About OsmoSMLC</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%);">+FIXME</span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>new file mode 100644</span><br><span>index 0000000..e9c4ffc</span><br><span>--- /dev/null</span><br><span>+++ b/configure.ac</span><br><span>@@ -0,0 +1,221 @@</span><br><span style="color: hsl(120, 100%, 40%);">+dnl Process this file with autoconf to produce a configure script</span><br><span style="color: hsl(120, 100%, 40%);">+AC_INIT([osmo-smlc],</span><br><span style="color: hsl(120, 100%, 40%);">+        m4_esyscmd([./git-version-gen .tarball-version]),</span><br><span style="color: hsl(120, 100%, 40%);">+     [openbsc@lists.osmocom.org])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl *This* is the root dir, even if an install-sh exists in ../ or ../../</span><br><span style="color: hsl(120, 100%, 40%);">+AC_CONFIG_AUX_DIR([.])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_INIT_AUTOMAKE([dist-bzip2])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_CONFIG_TESTDIR(tests)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl kernel style compile messages</span><br><span style="color: hsl(120, 100%, 40%);">+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl include release helper</span><br><span style="color: hsl(120, 100%, 40%);">+RELMAKE='-include osmo-release.mk'</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SUBST([RELMAKE])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl checks for programs</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PROG_MAKE_SET</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PROG_CC</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PROG_INSTALL</span><br><span style="color: hsl(120, 100%, 40%);">+LT_INIT</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang</span><br><span style="color: hsl(120, 100%, 40%);">+AS_CASE(["$LD"],[*clang*],</span><br><span style="color: hsl(120, 100%, 40%);">+  [AS_CASE(["${host_os}"],</span><br><span style="color: hsl(120, 100%, 40%);">+     [*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl check for pkg-config (explained in detail in libosmocore/configure.ac)</span><br><span style="color: hsl(120, 100%, 40%);">+AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no)</span><br><span style="color: hsl(120, 100%, 40%);">+if test "x$PKG_CONFIG_INSTALLED" = "xno"; then</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_MSG_WARN([You need to install pkg-config])</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_PROG_PKG_CONFIG([0.20])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl check for AX_CHECK_COMPILE_FLAG</span><br><span style="color: hsl(120, 100%, 40%);">+m4_ifdef([AX_CHECK_COMPILE_FLAG], [], [</span><br><span style="color: hsl(120, 100%, 40%);">+    AC_MSG_ERROR([Please install autoconf-archive; re-run 'autoreconf -fi' for it to take effect.])</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%);">+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.3.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.3.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.3.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.3.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOSIGTRAN, libosmo-sigtran >= 0.10.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOSCCP, libosmo-sccp >= 0.10.0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl checks for header files</span><br><span style="color: hsl(120, 100%, 40%);">+AC_HEADER_STDC</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl Checks for typedefs, structures and compiler characteristics</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(sanitize,</span><br><span style="color: hsl(120, 100%, 40%);">+        [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-sanitize],</span><br><span style="color: hsl(120, 100%, 40%);">+          [Compile with address sanitizer enabled],</span><br><span style="color: hsl(120, 100%, 40%);">+     )],</span><br><span style="color: hsl(120, 100%, 40%);">+   [sanitize=$enableval], [sanitize="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$sanitize" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined"</span><br><span style="color: hsl(120, 100%, 40%);">+    CPPFLAGS="$CPPFLAGS -fsanitize=address -fsanitize=undefined"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(werror,</span><br><span style="color: hsl(120, 100%, 40%);">+   [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-werror],</span><br><span style="color: hsl(120, 100%, 40%);">+            [Turn all compiler warnings into errors, with exceptions:</span><br><span style="color: hsl(120, 100%, 40%);">+              a) deprecation (allow upstream to mark deprecation without breaking builds);</span><br><span style="color: hsl(120, 100%, 40%);">+          b) "#warning" pragmas (allow to remind ourselves of errors without breaking builds)</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%);">+   [werror=$enableval], [werror="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$werror" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+  WERROR_FLAGS="-Werror"</span><br><span style="color: hsl(120, 100%, 40%);">+      WERROR_FLAGS+=" -Wno-error=deprecated -Wno-error=deprecated-declarations"</span><br><span style="color: hsl(120, 100%, 40%);">+   WERROR_FLAGS+=" -Wno-error=cpp" # "#warning"</span><br><span style="color: hsl(120, 100%, 40%);">+      CFLAGS="$CFLAGS $WERROR_FLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+      CPPFLAGS="$CPPFLAGS $WERROR_FLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The following test is taken from WebKit's webkit.m4</span><br><span style="color: hsl(120, 100%, 40%);">+saved_CFLAGS="$CFLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+CFLAGS="$CFLAGS -fvisibility=hidden "</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])],</span><br><span style="color: hsl(120, 100%, 40%);">+      [ AC_MSG_RESULT([yes])</span><br><span style="color: hsl(120, 100%, 40%);">+        SYMBOL_VISIBILITY="-fvisibility=hidden"],</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_MSG_RESULT([no]))</span><br><span style="color: hsl(120, 100%, 40%);">+CFLAGS="$saved_CFLAGS"</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SUBST(SYMBOL_VISIBILITY)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=implicit], [CFLAGS="$CFLAGS -Werror=implicit"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=maybe-uninitialized], [CFLAGS="$CFLAGS -Werror=maybe-uninitialized"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=memset-transposed-args], [CFLAGS="$CFLAGS -Werror=memset-transposed-args"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Wnull-dereference], [CFLAGS="$CFLAGS -Wnull-dereference"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=sizeof-array-argument], [CFLAGS="$CFLAGS -Werror=sizeof-array-argument"])</span><br><span style="color: hsl(120, 100%, 40%);">+AX_CHECK_COMPILE_FLAG([-Werror=sizeof-pointer-memaccess], [CFLAGS="$CFLAGS -Werror=sizeof-pointer-memaccess"])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Coverage build taken from WebKit's configure.in</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_CHECKING([whether to enable code coverage support])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(coverage,</span><br><span style="color: hsl(120, 100%, 40%);">+              AC_HELP_STRING([--enable-coverage],</span><br><span style="color: hsl(120, 100%, 40%);">+                             [enable code coverage support [default=no]]),</span><br><span style="color: hsl(120, 100%, 40%);">+              [],[enable_coverage="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([$enable_coverage])</span><br><span style="color: hsl(120, 100%, 40%);">+if test "$enable_coverage" = "yes"; then</span><br><span style="color: hsl(120, 100%, 40%);">+   COVERAGE_CFLAGS="-ftest-coverage -fprofile-arcs"</span><br><span style="color: hsl(120, 100%, 40%);">+   COVERAGE_LDFLAGS="-ftest-coverage -fprofile-arcs"</span><br><span style="color: hsl(120, 100%, 40%);">+   AC_SUBST([COVERAGE_CFLAGS])</span><br><span style="color: hsl(120, 100%, 40%);">+   AC_SUBST([COVERAGE_LDFLAGS])</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(profile,</span><br><span style="color: hsl(120, 100%, 40%);">+            [AS_HELP_STRING([--enable-profile], [Compile with profiling support enabled], )],</span><br><span style="color: hsl(120, 100%, 40%);">+             [profile=$enableval], [profile="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$profile" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+       CFLAGS="$CFLAGS -pg"</span><br><span style="color: hsl(120, 100%, 40%);">+        CPPFLAGS="$CPPFLAGS -pg"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE([external_tests],</span><br><span style="color: hsl(120, 100%, 40%);">+             AC_HELP_STRING([--enable-external-tests],</span><br><span style="color: hsl(120, 100%, 40%);">+                             [Include the VTY/CTRL tests in make check [default=no]]),</span><br><span style="color: hsl(120, 100%, 40%);">+             [enable_ext_tests="$enableval"],[enable_ext_tests="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+if test "x$enable_ext_tests" = "xyes" ; then</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_CHECK_PROG(PYTHON2_AVAIL,python2,yes)</span><br><span style="color: hsl(120, 100%, 40%);">+       if test "x$PYTHON2_AVAIL" != "xyes" ; then</span><br><span style="color: hsl(120, 100%, 40%);">+               AC_MSG_ERROR([Please install python2 to run the VTY/CTRL tests.])</span><br><span style="color: hsl(120, 100%, 40%);">+     fi</span><br><span style="color: hsl(120, 100%, 40%);">+    AC_CHECK_PROG(OSMOTESTEXT_CHECK,osmotestvty.py,yes)</span><br><span style="color: hsl(120, 100%, 40%);">+    if test "x$OSMOTESTEXT_CHECK" != "xyes" ; then</span><br><span style="color: hsl(120, 100%, 40%);">+           AC_MSG_ERROR([Please install git://osmocom.org/python/osmo-python-tests to run the VTY/CTRL tests.])</span><br><span style="color: hsl(120, 100%, 40%);">+  fi</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_CHECKING([whether to enable VTY/CTRL tests])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([$enable_ext_tests])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(ENABLE_EXT_TESTS, test "x$enable_ext_tests" = "xyes")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Generate manuals</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE(manuals,</span><br><span style="color: hsl(120, 100%, 40%);">+       [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-manuals],</span><br><span style="color: hsl(120, 100%, 40%);">+           [Generate manual PDFs [default=no]],</span><br><span style="color: hsl(120, 100%, 40%);">+  )],</span><br><span style="color: hsl(120, 100%, 40%);">+   [osmo_ac_build_manuals=$enableval], [osmo_ac_build_manuals="no"])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL([BUILD_MANUALS], [test x"$osmo_ac_build_manuals" = x"yes"])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_VAR(OSMO_GSM_MANUALS_DIR, [path to common osmo-gsm-manuals files, overriding pkg-config and "../osmo-gsm-manuals"</span><br><span style="color: hsl(120, 100%, 40%);">+       fallback])</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$osmo_ac_build_manuals" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+      # Find OSMO_GSM_MANUALS_DIR (env, pkg-conf, fallback)</span><br><span style="color: hsl(120, 100%, 40%);">+ if test -n "$OSMO_GSM_MANUALS_DIR"; then</span><br><span style="color: hsl(120, 100%, 40%);">+            echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from env)"</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          OSMO_GSM_MANUALS_DIR="$($PKG_CONFIG osmo-gsm-manuals --variable=osmogsmmanualsdir 2>/dev/null)"</span><br><span style="color: hsl(120, 100%, 40%);">+          if test -n "$OSMO_GSM_MANUALS_DIR"; then</span><br><span style="color: hsl(120, 100%, 40%);">+                    echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (from pkg-conf)"</span><br><span style="color: hsl(120, 100%, 40%);">+           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  OSMO_GSM_MANUALS_DIR="../osmo-gsm-manuals"</span><br><span style="color: hsl(120, 100%, 40%);">+                  echo "checking for OSMO_GSM_MANUALS_DIR... $OSMO_GSM_MANUALS_DIR (fallback)"</span><br><span style="color: hsl(120, 100%, 40%);">+                fi</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+    if ! test -d "$OSMO_GSM_MANUALS_DIR"; then</span><br><span style="color: hsl(120, 100%, 40%);">+          AC_MSG_ERROR("OSMO_GSM_MANUALS_DIR does not exist! Install osmo-gsm-manuals or set OSMO_GSM_MANUALS_DIR.")</span><br><span style="color: hsl(120, 100%, 40%);">+  fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Find and run check-depends</span><br><span style="color: hsl(120, 100%, 40%);">+  CHECK_DEPENDS="$OSMO_GSM_MANUALS_DIR/check-depends.sh"</span><br><span style="color: hsl(120, 100%, 40%);">+      if ! test -x "$CHECK_DEPENDS"; then</span><br><span style="color: hsl(120, 100%, 40%);">+         CHECK_DEPENDS="osmo-gsm-manuals-check-depends"</span><br><span style="color: hsl(120, 100%, 40%);">+      fi</span><br><span style="color: hsl(120, 100%, 40%);">+    if ! $CHECK_DEPENDS; then</span><br><span style="color: hsl(120, 100%, 40%);">+             AC_MSG_ERROR("missing dependencies for --enable-manuals")</span><br><span style="color: hsl(120, 100%, 40%);">+   fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Put in Makefile with absolute path</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_GSM_MANUALS_DIR="$(realpath "$OSMO_GSM_MANUALS_DIR")"</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_SUBST([OSMO_GSM_MANUALS_DIR])</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# https://www.freedesktop.org/software/systemd/man/daemon.html</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_WITH([systemdsystemunitdir],</span><br><span style="color: hsl(120, 100%, 40%);">+     [AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files])],,</span><br><span style="color: hsl(120, 100%, 40%);">+     [with_systemdsystemunitdir=auto])</span><br><span style="color: hsl(120, 100%, 40%);">+AS_IF([test "x$with_systemdsystemunitdir" = "xyes" -o "x$with_systemdsystemunitdir" = "xauto"], [</span><br><span style="color: hsl(120, 100%, 40%);">+     def_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     AS_IF([test "x$def_systemdsystemunitdir" = "x"],</span><br><span style="color: hsl(120, 100%, 40%);">+   [AS_IF([test "x$with_systemdsystemunitdir" = "xyes"],</span><br><span style="color: hsl(120, 100%, 40%);">+    [AC_MSG_ERROR([systemd support requested but pkg-config unable to query systemd package])])</span><br><span style="color: hsl(120, 100%, 40%);">+    with_systemdsystemunitdir=no],</span><br><span style="color: hsl(120, 100%, 40%);">+   [with_systemdsystemunitdir="$def_systemdsystemunitdir"])])</span><br><span style="color: hsl(120, 100%, 40%);">+AS_IF([test "x$with_systemdsystemunitdir" != "xno"],</span><br><span style="color: hsl(120, 100%, 40%);">+      [AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL([HAVE_SYSTEMD], [test "x$with_systemdsystemunitdir" != "xno"])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([CFLAGS="$CFLAGS"])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT([CPPFLAGS="$CPPFLAGS"])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dnl Generate the output</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONFIG_HEADER(config.h)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AC_OUTPUT(</span><br><span style="color: hsl(120, 100%, 40%);">+    include/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    include/osmocom/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    include/osmocom/smlc/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    src/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    src/osmo-smlc/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    tests/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    tests/atlocal</span><br><span style="color: hsl(120, 100%, 40%);">+    doc/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    doc/examples/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    doc/manuals/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    contrib/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    contrib/systemd/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    contrib/osmo-smlc.spec</span><br><span style="color: hsl(120, 100%, 40%);">+    Makefile)</span><br><span>diff --git a/contrib/Makefile.am b/contrib/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..3439c97</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/Makefile.am</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = systemd</span><br><span>diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..b88d812</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/jenkins.sh</span><br><span>@@ -0,0 +1,68 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env bash</span><br><span style="color: hsl(120, 100%, 40%);">+# jenkins build helper script for osmo-smlc.  This is how we build on jenkins.osmocom.org</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# environment variables:</span><br><span style="color: hsl(120, 100%, 40%);">+# * WITH_MANUALS: build manual PDFs if set to "1"</span><br><span style="color: hsl(120, 100%, 40%);">+# * PUBLISH: upload manuals after building if set to "1" (ignored without WITH_MANUALS = "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%);">+if ! [ -x "$(command -v osmo-build-dep.sh)" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+   echo "Error: We need to have scripts/osmo-deps.sh from http://git.osmocom.org/osmo-ci/ in PATH !"</span><br><span style="color: hsl(120, 100%, 40%);">+   exit 2</span><br><span style="color: hsl(120, 100%, 40%);">+fi</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%);">+set -ex</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+base="$PWD"</span><br><span style="color: hsl(120, 100%, 40%);">+deps="$base/deps"</span><br><span style="color: hsl(120, 100%, 40%);">+inst="$deps/install"</span><br><span style="color: hsl(120, 100%, 40%);">+export deps inst</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-clean-workspace.sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+mkdir "$deps" || true</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libosmocore "" '--disable-doxygen --enable-gnutls'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"</span><br><span style="color: hsl(120, 100%, 40%);">+export LD_LIBRARY_PATH="$inst/lib"</span><br><span style="color: hsl(120, 100%, 40%);">+export PATH="$inst/bin:$PATH"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libosmo-netif</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-build-dep.sh libosmo-sccp</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Additional configure options and depends</span><br><span style="color: hsl(120, 100%, 40%);">+CONFIG=""</span><br><span style="color: hsl(120, 100%, 40%);">+if [ "$WITH_MANUALS" = "1" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo-build-dep.sh osmo-gsm-manuals</span><br><span style="color: hsl(120, 100%, 40%);">+    CONFIG="--enable-manuals"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+set +x</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo " =============================== osmo-smlc ==============================="</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+set -x</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cd "$base"</span><br><span style="color: hsl(120, 100%, 40%);">+autoreconf --install --force</span><br><span style="color: hsl(120, 100%, 40%);">+./configure --enable-sanitize --enable-external-tests --enable-werror $CONFIG</span><br><span style="color: hsl(120, 100%, 40%);">+$MAKE $PARALLEL_MAKE</span><br><span style="color: hsl(120, 100%, 40%);">+LD_LIBRARY_PATH="$inst/lib" $MAKE check \</span><br><span style="color: hsl(120, 100%, 40%);">+  || cat-testlogs.sh</span><br><span style="color: hsl(120, 100%, 40%);">+LD_LIBRARY_PATH="$inst/lib" \</span><br><span style="color: hsl(120, 100%, 40%);">+  DISTCHECK_CONFIGURE_FLAGS="--enable-vty-tests --enable-external-tests --enable-werror $CONFIG" \</span><br><span style="color: hsl(120, 100%, 40%);">+  $MAKE distcheck \</span><br><span style="color: hsl(120, 100%, 40%);">+  || cat-testlogs.sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ "$WITH_MANUALS" = "1" ] && [ "$PUBLISH" = "1" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+  make -C "$base/doc/manuals" publish</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$MAKE maintainer-clean</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-clean-workspace.sh</span><br><span>diff --git a/contrib/osmo-smlc.spec.in b/contrib/osmo-smlc.spec.in</span><br><span>new file mode 100644</span><br><span>index 0000000..ed2499e</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/osmo-smlc.spec.in</span><br><span>@@ -0,0 +1,88 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# spec file for package osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (c) 2017, Martin Hauke <mardnh@gmx.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# All modifications and additions to the file contributed by third parties</span><br><span style="color: hsl(120, 100%, 40%);">+# remain the property of their copyright owners, unless otherwise agreed</span><br><span style="color: hsl(120, 100%, 40%);">+# upon. The license for this file, and modifications and additions to the</span><br><span style="color: hsl(120, 100%, 40%);">+# file, is the same license as for the pristine package itself (unless the</span><br><span style="color: hsl(120, 100%, 40%);">+# license for the pristine package is not an Open Source License, in which</span><br><span style="color: hsl(120, 100%, 40%);">+# case the license is the MIT License). An "Open Source License" is a</span><br><span style="color: hsl(120, 100%, 40%);">+# license that conforms to the Open Source Definition (Version 1.9)</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Open Source Initiative.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+## Disable LTO for now since it breaks compilation of the tests</span><br><span style="color: hsl(120, 100%, 40%);">+## https://osmocom.org/issues/4113</span><br><span style="color: hsl(120, 100%, 40%);">+%define _lto_cflags %{nil}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Name:           osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+Version:        @VERSION@</span><br><span style="color: hsl(120, 100%, 40%);">+Release:        0</span><br><span style="color: hsl(120, 100%, 40%);">+Summary:        OsmoSMLC: Osmocom's Location Service Center</span><br><span style="color: hsl(120, 100%, 40%);">+License:        AGPL-3.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+Group:          Hardware/Mobile</span><br><span style="color: hsl(120, 100%, 40%);">+URL:            https://osmocom.org/projects/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+Source:         %{name}-%{version}.tar.xz</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  automake >= 1.9</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  libtool >= 2</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig >= 0.20</span><br><span style="color: hsl(120, 100%, 40%);">+%if 0%{?suse_version}</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  systemd-rpm-macros</span><br><span style="color: hsl(120, 100%, 40%);">+%endif</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmo-netif) >= 0.6.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmo-sccp) >= 0.10.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmo-sigtran) >= 0.10.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmocore) >= 1.2.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmoctrl) >= 1.2.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmogsm) >= 1.2.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(libosmovty) >= 1.2.0</span><br><span style="color: hsl(120, 100%, 40%);">+BuildRequires:  pkgconfig(talloc)</span><br><span style="color: hsl(120, 100%, 40%);">+%{?systemd_requires}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%description</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC: Osmocom's Base Station Controller for 2G circuit-switched mobile networks.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%prep</span><br><span style="color: hsl(120, 100%, 40%);">+%setup -q</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%build</span><br><span style="color: hsl(120, 100%, 40%);">+echo "%{version}" >.tarball-version</span><br><span style="color: hsl(120, 100%, 40%);">+autoreconf -fi</span><br><span style="color: hsl(120, 100%, 40%);">+%configure \</span><br><span style="color: hsl(120, 100%, 40%);">+  --docdir=%{_docdir}/%{name} \</span><br><span style="color: hsl(120, 100%, 40%);">+  --with-systemdsystemunitdir=%{_unitdir}</span><br><span style="color: hsl(120, 100%, 40%);">+make %{?_smp_mflags}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%install</span><br><span style="color: hsl(120, 100%, 40%);">+%make_install</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%if 0%{?suse_version}</span><br><span style="color: hsl(120, 100%, 40%);">+%preun</span><br><span style="color: hsl(120, 100%, 40%);">+%service_del_preun %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%postun</span><br><span style="color: hsl(120, 100%, 40%);">+%service_del_postun %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%pre</span><br><span style="color: hsl(120, 100%, 40%);">+%service_add_pre %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%post</span><br><span style="color: hsl(120, 100%, 40%);">+%service_add_post %{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+%endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%check</span><br><span style="color: hsl(120, 100%, 40%);">+make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%files</span><br><span style="color: hsl(120, 100%, 40%);">+%license COPYING</span><br><span style="color: hsl(120, 100%, 40%);">+%doc AUTHORS README</span><br><span style="color: hsl(120, 100%, 40%);">+%{_bindir}/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+%dir %{_docdir}/%{name}/examples</span><br><span style="color: hsl(120, 100%, 40%);">+%dir %{_docdir}/%{name}/examples/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+%{_docdir}/%{name}/examples/osmo-smlc/osmo-smlc.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+%dir %{_sysconfdir}/osmocom</span><br><span style="color: hsl(120, 100%, 40%);">+%config(noreplace) %{_sysconfdir}/osmocom/osmo-smlc.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+%{_unitdir}/%{name}.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+%changelog</span><br><span>diff --git a/contrib/systemd/Makefile.am b/contrib/systemd/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..32cdc71</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/systemd/Makefile.am</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = osmo-smlc.service</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if HAVE_SYSTEMD</span><br><span style="color: hsl(120, 100%, 40%);">+systemdsystemunit_DATA = \</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo-smlc.service</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/contrib/systemd/osmo-smlc.service b/contrib/systemd/osmo-smlc.service</span><br><span>new file mode 100644</span><br><span>index 0000000..23a8f86</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/systemd/osmo-smlc.service</span><br><span>@@ -0,0 +1,11 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[Unit]</span><br><span style="color: hsl(120, 100%, 40%);">+Description=Osmocom Serving Mobile Location Center (SMLC)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[Service]</span><br><span style="color: hsl(120, 100%, 40%);">+Type=simple</span><br><span style="color: hsl(120, 100%, 40%);">+Restart=always</span><br><span style="color: hsl(120, 100%, 40%);">+ExecStart=/usr/bin/osmo-smlc -c /etc/osmocom/osmo-smlc.cfg -s</span><br><span style="color: hsl(120, 100%, 40%);">+RestartSec=2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[Install]</span><br><span style="color: hsl(120, 100%, 40%);">+WantedBy=multi-user.target</span><br><span>diff --git a/debian/changelog b/debian/changelog</span><br><span>new file mode 100644</span><br><span>index 0000000..e573404</span><br><span>--- /dev/null</span><br><span>+++ b/debian/changelog</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-smlc (0.0.1) unstable; urgency=medium</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  [ Harald Welte ]</span><br><span style="color: hsl(120, 100%, 40%);">+  * initial skeleton</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ -- Harald Welte <laforge@osmocom.org>  Fri, 21 Aug 2020 16:02:11 +0200</span><br><span>diff --git a/debian/compat b/debian/compat</span><br><span>new file mode 100644</span><br><span>index 0000000..ec63514</span><br><span>--- /dev/null</span><br><span>+++ b/debian/compat</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+9</span><br><span>diff --git a/debian/control b/debian/control</span><br><span>new file mode 100644</span><br><span>index 0000000..5f15744</span><br><span>--- /dev/null</span><br><span>+++ b/debian/control</span><br><span>@@ -0,0 +1,54 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Source: osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+Section: net</span><br><span style="color: hsl(120, 100%, 40%);">+Priority: extra</span><br><span style="color: hsl(120, 100%, 40%);">+Maintainer: Osmocom team <openbsc@lists.osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+Build-Depends: debhelper (>=9),</span><br><span style="color: hsl(120, 100%, 40%);">+               dh-autoreconf,</span><br><span style="color: hsl(120, 100%, 40%);">+               autotools-dev,</span><br><span style="color: hsl(120, 100%, 40%);">+               autoconf,</span><br><span style="color: hsl(120, 100%, 40%);">+               automake,</span><br><span style="color: hsl(120, 100%, 40%);">+               libtool,</span><br><span style="color: hsl(120, 100%, 40%);">+               pkg-config,</span><br><span style="color: hsl(120, 100%, 40%);">+               libsctp-dev,</span><br><span style="color: hsl(120, 100%, 40%);">+               libtalloc-dev,</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmocore-dev (>= 1.3.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmo-sccp-dev (>= 1.1.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               libosmo-sigtran-dev (>= 1.1.0),</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo-gsm-manuals-dev (>= 0.2.0)</span><br><span style="color: hsl(120, 100%, 40%);">+Standards-Version: 3.9.8</span><br><span style="color: hsl(120, 100%, 40%);">+Vcs-Git: git://git.osmocom.org/osmo-smlc.git</span><br><span style="color: hsl(120, 100%, 40%);">+Vcs-Browser: https://git.osmocom.org/osmo-smlc/</span><br><span style="color: hsl(120, 100%, 40%);">+Homepage: https://osmocom.org/projects/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Package: osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+Architecture: any</span><br><span style="color: hsl(120, 100%, 40%);">+Multi-Arch: foreign</span><br><span style="color: hsl(120, 100%, 40%);">+Depends: ${misc:Depends}, ${shlibs:Depends}, libdbd-sqlite3</span><br><span style="color: hsl(120, 100%, 40%);">+Description: OsmoSMLC: Osmocom's Location Services Center</span><br><span style="color: hsl(120, 100%, 40%);">+  FIXME</span><br><span style="color: hsl(120, 100%, 40%);">+  .</span><br><span style="color: hsl(120, 100%, 40%);">+  This Osmocom implementation of the SMLC handles Lb interfaces via 3GPP</span><br><span style="color: hsl(120, 100%, 40%);">+  Lb in an M3UA ASP role.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Package: osmo-smlc-dbg</span><br><span style="color: hsl(120, 100%, 40%);">+Section: debug</span><br><span style="color: hsl(120, 100%, 40%);">+Architecture: any</span><br><span style="color: hsl(120, 100%, 40%);">+Multi-Arch: same</span><br><span style="color: hsl(120, 100%, 40%);">+Depends: osmo-smlc (= ${binary:Version}), ${misc:Depends}</span><br><span style="color: hsl(120, 100%, 40%);">+Description: OsmoSMLC: Osmocom's Location Services Center</span><br><span style="color: hsl(120, 100%, 40%);">+  FIXME</span><br><span style="color: hsl(120, 100%, 40%);">+  .</span><br><span style="color: hsl(120, 100%, 40%);">+  This Osmocom implementation of the SMLC handles Lb interfaces via 3GPP</span><br><span style="color: hsl(120, 100%, 40%);">+  Lb in an M3UA ASP role.</span><br><span style="color: hsl(120, 100%, 40%);">+  .</span><br><span style="color: hsl(120, 100%, 40%);">+  This package contains the debug symbols for osmo-smlc in order to</span><br><span style="color: hsl(120, 100%, 40%);">+  generate meaningful backtraces in bug-reports.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Package: osmo-smlc-doc</span><br><span style="color: hsl(120, 100%, 40%);">+Architecture: all</span><br><span style="color: hsl(120, 100%, 40%);">+Section: doc</span><br><span style="color: hsl(120, 100%, 40%);">+Priority: optional</span><br><span style="color: hsl(120, 100%, 40%);">+Depends: ${misc:Depends}</span><br><span style="color: hsl(120, 100%, 40%);">+Description: ${misc:Package} PDF documentation</span><br><span style="color: hsl(120, 100%, 40%);">+ Various manuals: user manual, VTY reference manual and/or</span><br><span style="color: hsl(120, 100%, 40%);">+ protocol/interface manuals.</span><br><span>diff --git a/debian/copyright b/debian/copyright</span><br><span>new file mode 100644</span><br><span>index 0000000..fcdada7</span><br><span>--- /dev/null</span><br><span>+++ b/debian/copyright</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/</span><br><span style="color: hsl(120, 100%, 40%);">+Upstream-Name: osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+Source: git://git.osmocom.org/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Files:     *</span><br><span style="color: hsl(120, 100%, 40%);">+Copyright: 2020 Harald Welte <laforge@osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+           2020 sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+License:   AGPL-3.0+</span><br><span style="color: hsl(120, 100%, 40%);">+ This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ .</span><br><span style="color: hsl(120, 100%, 40%);">+ This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ .</span><br><span style="color: hsl(120, 100%, 40%);">+ You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span>diff --git a/debian/osmo-smlc-doc.install b/debian/osmo-smlc-doc.install</span><br><span>new file mode 100644</span><br><span>index 0000000..e3cbcb0</span><br><span>--- /dev/null</span><br><span>+++ b/debian/osmo-smlc-doc.install</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+usr/share/doc/osmo-smlc-doc/*.pdf</span><br><span>diff --git a/debian/osmo-smlc.install b/debian/osmo-smlc.install</span><br><span>new file mode 100644</span><br><span>index 0000000..8e3223a</span><br><span>--- /dev/null</span><br><span>+++ b/debian/osmo-smlc.install</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+etc/osmocom/osmo-smlc.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+lib/systemd/system/osmo-smlc.service</span><br><span style="color: hsl(120, 100%, 40%);">+usr/bin/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+usr/share/doc/osmo-msc/examples/osmo-smlc/osmo-smlc.cfg usr/share/doc/osmo-smlc/examples</span><br><span>diff --git a/debian/rules b/debian/rules</span><br><span>new file mode 100755</span><br><span>index 0000000..15f6320</span><br><span>--- /dev/null</span><br><span>+++ b/debian/rules</span><br><span>@@ -0,0 +1,67 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/make -f</span><br><span style="color: hsl(120, 100%, 40%);">+# You must remove unused comment lines for the released package.</span><br><span style="color: hsl(120, 100%, 40%);">+# See debhelper(7) (uncomment to enable)</span><br><span style="color: hsl(120, 100%, 40%);">+# This is an autogenerated template for debian/rules.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Output every command that modifies files on the build system.</span><br><span style="color: hsl(120, 100%, 40%);">+#export DH_VERBOSE = 1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copy some variable definitions from pkg-info.mk and vendor.mk</span><br><span style="color: hsl(120, 100%, 40%);">+# under /usr/share/dpkg/ to here if they are useful.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# See FEATURE AREAS/ENVIRONMENT in dpkg-buildflags(1)</span><br><span style="color: hsl(120, 100%, 40%);">+# Apply all hardening options</span><br><span style="color: hsl(120, 100%, 40%);">+#export DEB_BUILD_MAINT_OPTIONS = hardening=+all</span><br><span style="color: hsl(120, 100%, 40%);">+# Package maintainers to append CFLAGS</span><br><span style="color: hsl(120, 100%, 40%);">+#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic</span><br><span style="color: hsl(120, 100%, 40%);">+# Package maintainers to append LDFLAGS</span><br><span style="color: hsl(120, 100%, 40%);">+#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# With debhelper version 9 or newer, the dh command exports</span><br><span style="color: hsl(120, 100%, 40%);">+# all buildflags.  So there is no need to include the</span><br><span style="color: hsl(120, 100%, 40%);">+# /usr/share/dpkg/buildflags.mk file here if compat is 9 or newer.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# These are rarely used code. (START)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# The following include for *.mk magically sets miscellaneous</span><br><span style="color: hsl(120, 100%, 40%);">+# variables while honoring existing values of pertinent</span><br><span style="color: hsl(120, 100%, 40%);">+# environment variables:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Architecture-related variables such as DEB_TARGET_MULTIARCH:</span><br><span style="color: hsl(120, 100%, 40%);">+#include /usr/share/dpkg/architecture.mk</span><br><span style="color: hsl(120, 100%, 40%);">+# Vendor-related variables such as DEB_VENDOR:</span><br><span style="color: hsl(120, 100%, 40%);">+#include /usr/share/dpkg/vendor.mk</span><br><span style="color: hsl(120, 100%, 40%);">+# Package-related variables such as DEB_DISTRIBUTION</span><br><span style="color: hsl(120, 100%, 40%);">+#include /usr/share/dpkg/pkg-info.mk</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You may alternatively set them susing a simple script such as:</span><br><span style="color: hsl(120, 100%, 40%);">+# DEB_VENDOR ?= $(shell dpkg-vendor --query  Vendor)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# These are rarely used code. (END)</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%);">+# main packaging script based on dh7 syntax</span><br><span style="color: hsl(120, 100%, 40%);">+%:</span><br><span style="color: hsl(120, 100%, 40%);">+    dh $@ --with autoreconf</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# debmake generated override targets</span><br><span style="color: hsl(120, 100%, 40%);">+# Set options for ./configure</span><br><span style="color: hsl(120, 100%, 40%);">+CONFIGURE_FLAGS += --enable-iu --enable-smpp --with-systemdsystemunitdir=/lib/systemd/system --enable-manuals</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_auto_configure:</span><br><span style="color: hsl(120, 100%, 40%);">+    dh_auto_configure -- $(CONFIGURE_FLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Do not install libtool archive, python .pyc .pyo</span><br><span style="color: hsl(120, 100%, 40%);">+#override_dh_install:</span><br><span style="color: hsl(120, 100%, 40%);">+#        dh_install --list-missing -X.la -X.pyc -X.pyo</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# See https://www.debian.org/doc/manuals/developers-reference/best-pkging-practices.html#bpp-dbg</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_strip:</span><br><span style="color: hsl(120, 100%, 40%);">+ dh_strip --dbg-package=osmo-smlc-dbg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Print test results in case of a failure</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_auto_test:</span><br><span style="color: hsl(120, 100%, 40%);">+     dh_auto_test || (find . -name testsuite.log -exec cat {} \; ; false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Don't create .pdf.gz files (barely saves space and they can't be opened directly by most pdf readers)</span><br><span style="color: hsl(120, 100%, 40%);">+override_dh_compress:</span><br><span style="color: hsl(120, 100%, 40%);">+        dh_compress -X.pdf</span><br><span>diff --git a/debian/source/format b/debian/source/format</span><br><span>new file mode 100644</span><br><span>index 0000000..89ae9db</span><br><span>--- /dev/null</span><br><span>+++ b/debian/source/format</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+3.0 (native)</span><br><span>diff --git a/doc/Makefile.am b/doc/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..2b65598</span><br><span>--- /dev/null</span><br><span>+++ b/doc/Makefile.am</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+     examples \</span><br><span style="color: hsl(120, 100%, 40%);">+    manuals \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+msc: \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dot: \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$(builddir)/%.png: $(srcdir)/%.msc</span><br><span style="color: hsl(120, 100%, 40%);">+ mscgen -T png -o $@ $<</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+$(builddir)/%.png: $(srcdir)/%.dot</span><br><span style="color: hsl(120, 100%, 40%);">+       dot -Tpng $< > $@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.PHONY: poll</span><br><span style="color: hsl(120, 100%, 40%);">+poll:</span><br><span style="color: hsl(120, 100%, 40%);">+        while true; do $(MAKE) msc dot; sleep 1; done</span><br><span>diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..f4acac8</span><br><span>--- /dev/null</span><br><span>+++ b/doc/examples/Makefile.am</span><br><span>@@ -0,0 +1,30 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OSMOCONF_FILES = \</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo-smlc/osmo-smlc.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmoconfdir = $(sysconfdir)/osmocom</span><br><span style="color: hsl(120, 100%, 40%);">+osmoconf_DATA = $(OSMOCONF_FILES)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = $(OSMOCONF_FILES)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+CFG_FILES = find $(srcdir) -name '*.cfg*' | sed -e 's,^$(srcdir),,'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dist-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+      for f in $$($(CFG_FILES)); do \</span><br><span style="color: hsl(120, 100%, 40%);">+               j="$(distdir)/$$f" && \</span><br><span style="color: hsl(120, 100%, 40%);">+             mkdir -p "$$(dirname $$j)" && \</span><br><span style="color: hsl(120, 100%, 40%);">+             $(INSTALL_DATA) $(srcdir)/$$f $$j; \</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+install-data-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+    for f in $$($(CFG_FILES)); do \</span><br><span style="color: hsl(120, 100%, 40%);">+               j="$(DESTDIR)$(docdir)/examples/$$f" && \</span><br><span style="color: hsl(120, 100%, 40%);">+           mkdir -p "$$(dirname $$j)" && \</span><br><span style="color: hsl(120, 100%, 40%);">+             $(INSTALL_DATA) $(srcdir)/$$f $$j; \</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uninstall-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+       @$(PRE_UNINSTALL)</span><br><span style="color: hsl(120, 100%, 40%);">+     for f in $$($(CFG_FILES)); do \</span><br><span style="color: hsl(120, 100%, 40%);">+               j="$(DESTDIR)$(docdir)/examples/$$f" && \</span><br><span style="color: hsl(120, 100%, 40%);">+           $(RM) $$j; \</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span>diff --git a/doc/examples/osmo-smlc/osmo-smlc.cfg b/doc/examples/osmo-smlc/osmo-smlc.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/doc/examples/osmo-smlc/osmo-smlc.cfg</span><br><span>diff --git a/doc/manuals/Makefile.am b/doc/manuals/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..5aa75fe</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/Makefile.am</span><br><span>@@ -0,0 +1,25 @@</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+    osmosmlc-usermanual.adoc \</span><br><span style="color: hsl(120, 100%, 40%);">+    osmosmlc-usermanual-docinfo.xml \</span><br><span style="color: hsl(120, 100%, 40%);">+    osmosmlc-vty-reference.xml \</span><br><span style="color: hsl(120, 100%, 40%);">+    chapters \</span><br><span style="color: hsl(120, 100%, 40%);">+    regen_doc.sh \</span><br><span style="color: hsl(120, 100%, 40%);">+    vty</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if BUILD_MANUALS</span><br><span style="color: hsl(120, 100%, 40%);">+  ASCIIDOC = osmosmlc-usermanual.adoc</span><br><span style="color: hsl(120, 100%, 40%);">+  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.asciidoc.inc</span><br><span style="color: hsl(120, 100%, 40%);">+  osmosmlc-usermanual.pdf: $(srcdir)/chapters/*.adoc $(srcdir)/chapters/*.dot</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  VTY_REFERENCE = osmosmlc-vty-reference.xml</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  BUILT_REFERENCE_XML = $(builddir)/vty/smlc_vty_reference.xml</span><br><span style="color: hsl(120, 100%, 40%);">+  $(builddir)/vty/smlc_vty_reference.xml: $(top_builddir)/src/osmo-smlc/osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+  mkdir -p $(builddir)/vty</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-smlc/osmo-smlc --vty-ref-xml > $@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.vty-reference.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_REPOSITORY = osmo-smlc</span><br><span style="color: hsl(120, 100%, 40%);">+  include $(OSMO_GSM_MANUALS_DIR)/build/Makefile.common.inc</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/doc/manuals/chapters/overview.adoc b/doc/manuals/chapters/overview.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..b0132ad</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/chapters/overview.adoc</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[[overview]]</span><br><span style="color: hsl(120, 100%, 40%);">+== Overview</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This manual should help you getting started with OsmoSMLC. It will cover</span><br><span style="color: hsl(120, 100%, 40%);">+aspects of configuring and running the OsmoSMLC.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[[intro_overview]]</span><br><span style="color: hsl(120, 100%, 40%);">+=== About OsmoSMLC</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoSMLC is the Osmocom implementation of a Serving Mobile Location Center.</span><br><span>diff --git a/doc/manuals/chapters/running.adoc b/doc/manuals/chapters/running.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..0a3174e</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/chapters/running.adoc</span><br><span>@@ -0,0 +1,79 @@</span><br><span style="color: hsl(120, 100%, 40%);">+== Running OsmoSMLC</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The OsmoSMLC executable (`osmo-smlc`) offers the following command-line</span><br><span style="color: hsl(120, 100%, 40%);">+arguments:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== SYNOPSIS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+*osmo-smlc* [-h|-V] [-d 'DBGMASK'] [-D] [-c 'CONFIGFILE'] [-s] [-T] [-e 'LOGLEVEL'] [-l 'IP'] [-r 'RFCTL']</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== OPTIONS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+*-h, --help*::</span><br><span style="color: hsl(120, 100%, 40%);">+  Print a short help message about the supported options</span><br><span style="color: hsl(120, 100%, 40%);">+*-V, --version*::</span><br><span style="color: hsl(120, 100%, 40%);">+     Print the compile-time version number of the program</span><br><span style="color: hsl(120, 100%, 40%);">+*-d, --debug 'DBGMASK','DBGLEVELS'*::</span><br><span style="color: hsl(120, 100%, 40%);">+   Set the log subsystems and levels for logging to stderr. This</span><br><span style="color: hsl(120, 100%, 40%);">+ has mostly been superseded by VTY-based logging configuration,</span><br><span style="color: hsl(120, 100%, 40%);">+        see <<logging>> for further information.</span><br><span style="color: hsl(120, 100%, 40%);">+*-D, --daemonize*::</span><br><span style="color: hsl(120, 100%, 40%);">+     Fork the process as a daemon into background.</span><br><span style="color: hsl(120, 100%, 40%);">+*-c, --config-file 'CONFIGFILE'*::</span><br><span style="color: hsl(120, 100%, 40%);">+     Specify the file and path name of the configuration file to be</span><br><span style="color: hsl(120, 100%, 40%);">+        used. If none is specified, use `osmo-smlc.cfg` in the current</span><br><span style="color: hsl(120, 100%, 40%);">+        working directory.</span><br><span style="color: hsl(120, 100%, 40%);">+*-e, --log-level 'LOGLEVEL'*::</span><br><span style="color: hsl(120, 100%, 40%);">+    Set the global log level for logging to stderr. This has mostly</span><br><span style="color: hsl(120, 100%, 40%);">+       been deprecated by VTY based logging configuration, see</span><br><span style="color: hsl(120, 100%, 40%);">+       <<logging>> for more information.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== Multiple instances</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Running multiple instances of `osmo-smlc` on the same host is possible if all</span><br><span style="color: hsl(120, 100%, 40%);">+interfaces (VTY, CTRL) are separated using the appropriate configuration</span><br><span style="color: hsl(120, 100%, 40%);">+options. The IP based interfaces are binding to local host by default. In order</span><br><span style="color: hsl(120, 100%, 40%);">+to separate the processes, the user has to bind those services to specific but</span><br><span style="color: hsl(120, 100%, 40%);">+different IP addresses and/or ports.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The VTY and the Control interface can be bound to IP addresses from the loopback</span><br><span style="color: hsl(120, 100%, 40%);">+address range, for example:</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%);">+line vty</span><br><span style="color: hsl(120, 100%, 40%);">+ bind 127.0.0.2</span><br><span style="color: hsl(120, 100%, 40%);">+ctrl</span><br><span style="color: hsl(120, 100%, 40%);">+ bind 127.0.0.2</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%);">+For the following links, OsmoSMLC acts as a client and does not listen/bind to a</span><br><span style="color: hsl(120, 100%, 40%);">+specific interface, and will hence not encounter conflicts for multiple instances</span><br><span style="color: hsl(120, 100%, 40%);">+running on the same interface:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+- The SCCP/M3UA links are established by OsmoSMLC contacting an STP.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+To run multiple OsmoSMLC instances on the same network, each SMLC</span><br><span style="color: hsl(120, 100%, 40%);">+has to configure a distinct point-code. See <<cs7_config>>.</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%);">+=== Configure primary links</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Connect to an STP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===== Configure SCCP/M3UA (AoIP)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoSMLC acts as client to contact an STP instance and establish an SCCP/M3UA</span><br><span style="color: hsl(120, 100%, 40%);">+link.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+An example configuration of OsmoSMLC's Lb SCCP link, assuming the SMLC at</span><br><span style="color: hsl(120, 100%, 40%);">+point-code 1.23.6 via an SG listening for M3UA at 127.0.0.1:2905:</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%);">+cs7 instance 0</span><br><span style="color: hsl(120, 100%, 40%);">+ point-code 1.23.6</span><br><span style="color: hsl(120, 100%, 40%);">+ asp asp-clnt-msc-0 2905 0 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+  sctp-role client</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%);">+This configuration is explained in detail in <<cs7_config>>.</span><br><span>diff --git a/doc/manuals/osmosmlc-usermanual-docinfo.xml b/doc/manuals/osmosmlc-usermanual-docinfo.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..b39d11b</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/osmosmlc-usermanual-docinfo.xml</span><br><span>@@ -0,0 +1,63 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+  <revision></span><br><span style="color: hsl(120, 100%, 40%);">+    <revnumber>1</revnumber></span><br><span style="color: hsl(120, 100%, 40%);">+    <date>August 2020</date></span><br><span style="color: hsl(120, 100%, 40%);">+    <authorinitials>HW</authorinitials></span><br><span style="color: hsl(120, 100%, 40%);">+    <revremark></span><br><span style="color: hsl(120, 100%, 40%);">+      Initial OsmoSMLC manual</span><br><span style="color: hsl(120, 100%, 40%);">+    </revremark></span><br><span style="color: hsl(120, 100%, 40%);">+  </revision></span><br><span style="color: hsl(120, 100%, 40%);">+</revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<authorgroup></span><br><span style="color: hsl(120, 100%, 40%);">+  <author></span><br><span style="color: hsl(120, 100%, 40%);">+    <firstname>Harald</firstname></span><br><span style="color: hsl(120, 100%, 40%);">+    <surname>Welte</surname></span><br><span style="color: hsl(120, 100%, 40%);">+    <email>hwelte@sysmocom.de</email></span><br><span style="color: hsl(120, 100%, 40%);">+    <authorinitials>HW</authorinitials></span><br><span style="color: hsl(120, 100%, 40%);">+    <affiliation></span><br><span style="color: hsl(120, 100%, 40%);">+      <shortaffil>sysmocom</shortaffil></span><br><span style="color: hsl(120, 100%, 40%);">+      <orgname>sysmocom - s.f.m.c. GmbH</orgname></span><br><span style="color: hsl(120, 100%, 40%);">+      <jobtitle>Managing Director</jobtitle></span><br><span style="color: hsl(120, 100%, 40%);">+    </affiliation></span><br><span style="color: hsl(120, 100%, 40%);">+  </author></span><br><span style="color: hsl(120, 100%, 40%);">+  <author></span><br><span style="color: hsl(120, 100%, 40%);">+    <firstname>Neels</firstname></span><br><span style="color: hsl(120, 100%, 40%);">+    <surname>Hofmeyr</surname></span><br><span style="color: hsl(120, 100%, 40%);">+    <email>nhofmeyr@sysmocom.de</email></span><br><span style="color: hsl(120, 100%, 40%);">+    <authorinitials>NH</authorinitials></span><br><span style="color: hsl(120, 100%, 40%);">+    <affiliation></span><br><span style="color: hsl(120, 100%, 40%);">+      <shortaffil>sysmocom</shortaffil></span><br><span style="color: hsl(120, 100%, 40%);">+      <orgname>sysmocom - s.f.m.c. GmbH</orgname></span><br><span style="color: hsl(120, 100%, 40%);">+      <jobtitle>Senior Developer</jobtitle></span><br><span style="color: hsl(120, 100%, 40%);">+    </affiliation></span><br><span style="color: hsl(120, 100%, 40%);">+  </author></span><br><span style="color: hsl(120, 100%, 40%);">+</authorgroup></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<copyright></span><br><span style="color: hsl(120, 100%, 40%);">+  <year>2012-2020</year></span><br><span style="color: hsl(120, 100%, 40%);">+  <holder>sysmocom - s.f.m.c. GmbH</holder></span><br><span style="color: hsl(120, 100%, 40%);">+</copyright></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+<legalnotice></span><br><span style="color: hsl(120, 100%, 40%);">+  <para></span><br><span style="color: hsl(120, 100%, 40%);">+     Permission is granted to copy, distribute and/or modify this</span><br><span style="color: hsl(120, 100%, 40%);">+  document under the terms of the GNU Free Documentation License,</span><br><span style="color: hsl(120, 100%, 40%);">+       Version 1.3 or any later version published by the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+       Foundation; with the Invariant Sections being just 'Foreword',</span><br><span style="color: hsl(120, 100%, 40%);">+        'Acknowledgements' and 'Preface', with no Front-Cover Texts,</span><br><span style="color: hsl(120, 100%, 40%);">+  and no Back-Cover Texts.  A copy of the license is included in</span><br><span style="color: hsl(120, 100%, 40%);">+        the section entitled "GNU Free Documentation License".</span><br><span style="color: hsl(120, 100%, 40%);">+  </para></span><br><span style="color: hsl(120, 100%, 40%);">+  <para></span><br><span style="color: hsl(120, 100%, 40%);">+     The Asciidoc source code of this manual can be found at</span><br><span style="color: hsl(120, 100%, 40%);">+       <ulink url="http://git.osmocom.org/osmo-gsm-manuals/"></span><br><span style="color: hsl(120, 100%, 40%);">+                http://git.osmocom.org/osmo-gsm-manuals/</span><br><span style="color: hsl(120, 100%, 40%);">+      </ulink></span><br><span style="color: hsl(120, 100%, 40%);">+        and</span><br><span style="color: hsl(120, 100%, 40%);">+   <ulink url="http://git.osmocom.org/osmo-smlc/"></span><br><span style="color: hsl(120, 100%, 40%);">+               http://git.osmocom.org/osmo-smlc/</span><br><span style="color: hsl(120, 100%, 40%);">+     </ulink></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  </para></span><br><span style="color: hsl(120, 100%, 40%);">+</legalnotice></span><br><span>diff --git a/doc/manuals/osmosmlc-usermanual.adoc b/doc/manuals/osmosmlc-usermanual.adoc</span><br><span>new file mode 100644</span><br><span>index 0000000..1717659</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/osmosmlc-usermanual.adoc</span><br><span>@@ -0,0 +1,37 @@</span><br><span style="color: hsl(120, 100%, 40%);">+:gfdl-enabled:</span><br><span style="color: hsl(120, 100%, 40%);">+:program-name: OsmoSMLC</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoSMLC User Manual</span><br><span style="color: hsl(120, 100%, 40%);">+====================</span><br><span style="color: hsl(120, 100%, 40%);">+Harald Welte <hwelte@sysmocom.de></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%);">+include::./common/chapters/preface.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::{srcdir}/chapters/overview.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::{srcdir}/chapters/running.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/vty.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/logging.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/cs7-config.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/counters-overview.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// include::{srcdir}/chapters/counters.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/control_if.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// include::{srcdir}/chapters/control.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::{srcdir}/chapters/osmux_bsc.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/port_numbers.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/bibliography.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/glossary.adoc[]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+include::./common/chapters/gfdl.adoc[]</span><br><span>diff --git a/doc/manuals/osmosmlc-vty-reference.xml b/doc/manuals/osmosmlc-vty-reference.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..38085b7</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/osmosmlc-vty-reference.xml</span><br><span>@@ -0,0 +1,38 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0" encoding="UTF-8"?></span><br><span style="color: hsl(120, 100%, 40%);">+<!--</span><br><span style="color: hsl(120, 100%, 40%);">+  ex:ts=2:sw=42sts=2:et</span><br><span style="color: hsl(120, 100%, 40%);">+  -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-</span><br><span style="color: hsl(120, 100%, 40%);">+--></span><br><span style="color: hsl(120, 100%, 40%);">+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML 5.0//EN"</span><br><span style="color: hsl(120, 100%, 40%);">+"http://docbook.org/xml/5.0/dtd/docbook.dtd" [</span><br><span style="color: hsl(120, 100%, 40%);">+<!ENTITY chapter-vty      SYSTEM      "./common/chapters/vty.xml" ></span><br><span style="color: hsl(120, 100%, 40%);">+<!ENTITY sections-vty     SYSTEM      "generated/docbook_vty.xml"  ></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%);">+<book></span><br><span style="color: hsl(120, 100%, 40%);">+  <info></span><br><span style="color: hsl(120, 100%, 40%);">+    <revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+        <revision></span><br><span style="color: hsl(120, 100%, 40%);">+            <revnumber>v1</revnumber></span><br><span style="color: hsl(120, 100%, 40%);">+            <date>21st August 2020</date></span><br><span style="color: hsl(120, 100%, 40%);">+            <authorinitials>hw</authorinitials></span><br><span style="color: hsl(120, 100%, 40%);">+            <revremark>Initial</revremark></span><br><span style="color: hsl(120, 100%, 40%);">+        </revision></span><br><span style="color: hsl(120, 100%, 40%);">+    </revhistory></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <title>OsmoSMLC VTY Reference</title></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <copyright></span><br><span style="color: hsl(120, 100%, 40%);">+      <year>2020</year></span><br><span style="color: hsl(120, 100%, 40%);">+    </copyright></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    <legalnotice></span><br><span style="color: hsl(120, 100%, 40%);">+      <para>This work is copyright by <orgname>sysmocom - s.f.m.c. GmbH</orgname>. All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+      </para></span><br><span style="color: hsl(120, 100%, 40%);">+    </legalnotice></span><br><span style="color: hsl(120, 100%, 40%);">+  </info></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  <!-- Main chapters--></span><br><span style="color: hsl(120, 100%, 40%);">+  &chapter-vty;</span><br><span style="color: hsl(120, 100%, 40%);">+</book></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/doc/manuals/regen_doc.sh b/doc/manuals/regen_doc.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..175b17e</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/regen_doc.sh</span><br><span>@@ -0,0 +1,17 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh -x</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z "$DOCKER_PLAYGROUND" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+      echo "You need to set DOCKER_PLAYGROUND"</span><br><span style="color: hsl(120, 100%, 40%);">+    exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+SCRIPT=$(realpath "$0")</span><br><span style="color: hsl(120, 100%, 40%);">+MANUAL_DIR=$(dirname "$SCRIPT")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+COMMIT=${COMMIT:-$(git log -1 --format=format:%H)}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cd "$DOCKER_PLAYGROUND/scripts" || exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OSMO_SMLC_BRANCH=$COMMIT ./regen_doc.sh osmo-smlc 4271 \</span><br><span style="color: hsl(120, 100%, 40%);">+   "$MANUAL_DIR/chapters/counters_generated.adoc" \</span><br><span style="color: hsl(120, 100%, 40%);">+    "$MANUAL_DIR/vty/smlc_vty_reference.xml"</span><br><span>diff --git a/doc/manuals/vty/smlc_vty_dditions.xml b/doc/manuals/vty/smlc_vty_dditions.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/doc/manuals/vty/smlc_vty_dditions.xml</span><br><span>diff --git a/git-version-gen b/git-version-gen</span><br><span>new file mode 100755</span><br><span>index 0000000..42cf3d2</span><br><span>--- /dev/null</span><br><span>+++ b/git-version-gen</span><br><span>@@ -0,0 +1,151 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+# Print a version string.</span><br><span style="color: hsl(120, 100%, 40%);">+scriptversion=2010-01-28.01</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2007-2010 Free Software Foundation, Inc.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.</span><br><span style="color: hsl(120, 100%, 40%);">+# It may be run two ways:</span><br><span style="color: hsl(120, 100%, 40%);">+# - from a git repository in which the "git describe" command below</span><br><span style="color: hsl(120, 100%, 40%);">+#   produces useful output (thus requiring at least one signed tag)</span><br><span style="color: hsl(120, 100%, 40%);">+# - from a non-git-repo directory containing a .tarball-version file, which</span><br><span style="color: hsl(120, 100%, 40%);">+#   presumes this script is invoked like "./git-version-gen .tarball-version".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# In order to use intra-version strings in your project, you will need two</span><br><span style="color: hsl(120, 100%, 40%);">+# separate generated version string files:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# .tarball-version - present only in a distribution tarball, and not in</span><br><span style="color: hsl(120, 100%, 40%);">+#   a checked-out repository.  Created with contents that were learned at</span><br><span style="color: hsl(120, 100%, 40%);">+#   the last time autoconf was run, and used by git-version-gen.  Must not</span><br><span style="color: hsl(120, 100%, 40%);">+#   be present in either $(srcdir) or $(builddir) for git-version-gen to</span><br><span style="color: hsl(120, 100%, 40%);">+#   give accurate answers during normal development with a checked out tree,</span><br><span style="color: hsl(120, 100%, 40%);">+#   but must be present in a tarball when there is no version control system.</span><br><span style="color: hsl(120, 100%, 40%);">+#   Therefore, it cannot be used in any dependencies.  GNUmakefile has</span><br><span style="color: hsl(120, 100%, 40%);">+#   hooks to force a reconfigure at distribution time to get the value</span><br><span style="color: hsl(120, 100%, 40%);">+#   correct, without penalizing normal development with extra reconfigures.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# .version - present in a checked-out repository and in a distribution</span><br><span style="color: hsl(120, 100%, 40%);">+#   tarball.  Usable in dependencies, particularly for files that don't</span><br><span style="color: hsl(120, 100%, 40%);">+#   want to depend on config.h but do want to track version changes.</span><br><span style="color: hsl(120, 100%, 40%);">+#   Delete this file prior to any autoconf run where you want to rebuild</span><br><span style="color: hsl(120, 100%, 40%);">+#   files to pick up a version string change; and leave it stale to</span><br><span style="color: hsl(120, 100%, 40%);">+#   minimize rebuild time after unrelated changes to configure sources.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# It is probably wise to add these two files to .gitignore, so that you</span><br><span style="color: hsl(120, 100%, 40%);">+# don't accidentally commit either generated file.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Use the following line in your configure.ac, so that $(VERSION) will</span><br><span style="color: hsl(120, 100%, 40%);">+# automatically be up-to-date each time configure is run (and note that</span><br><span style="color: hsl(120, 100%, 40%);">+# since configure.ac no longer includes a version string, Makefile rules</span><br><span style="color: hsl(120, 100%, 40%);">+# should not depend on configure.ac for version updates).</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# AC_INIT([GNU project],</span><br><span style="color: hsl(120, 100%, 40%);">+#         m4_esyscmd([build-aux/git-version-gen .tarball-version]),</span><br><span style="color: hsl(120, 100%, 40%);">+#         [bug-project@example])</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Then use the following lines in your Makefile.am, so that .version</span><br><span style="color: hsl(120, 100%, 40%);">+# will be present for dependencies, and so that .tarball-version will</span><br><span style="color: hsl(120, 100%, 40%);">+# exist in distribution tarballs.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# BUILT_SOURCES = $(top_srcdir)/.version</span><br><span style="color: hsl(120, 100%, 40%);">+# $(top_srcdir)/.version:</span><br><span style="color: hsl(120, 100%, 40%);">+#      echo $(VERSION) > $@-t && mv $@-t $@</span><br><span style="color: hsl(120, 100%, 40%);">+# dist-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+#        echo $(VERSION) > $(distdir)/.tarball-version</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+case $# in</span><br><span style="color: hsl(120, 100%, 40%);">+    1) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version"; exit 1;;</span><br><span style="color: hsl(120, 100%, 40%);">+esac</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+tarball_version_file=$1</span><br><span style="color: hsl(120, 100%, 40%);">+nl='</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%);">+# First see if there is a tarball-only version file.</span><br><span style="color: hsl(120, 100%, 40%);">+# then try "git describe", then default.</span><br><span style="color: hsl(120, 100%, 40%);">+if test -f $tarball_version_file</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    v=`cat $tarball_version_file` || exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+    case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+       *$nl*) v= ;; # reject multi-line output</span><br><span style="color: hsl(120, 100%, 40%);">+       [0-9]*) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *) v= ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    esac</span><br><span style="color: hsl(120, 100%, 40%);">+    test -z "$v" \</span><br><span style="color: hsl(120, 100%, 40%);">+      && echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if test -n "$v"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    : # use $v</span><br><span style="color: hsl(120, 100%, 40%);">+elif</span><br><span style="color: hsl(120, 100%, 40%);">+       v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \</span><br><span style="color: hsl(120, 100%, 40%);">+       || git describe --abbrev=4 HEAD 2>/dev/null` \</span><br><span style="color: hsl(120, 100%, 40%);">+    && case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+         [0-9]*) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    v[0-9]*) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+   *) (exit 1) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+       esac</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+    # Is this a new git that lists number of commits since the last</span><br><span style="color: hsl(120, 100%, 40%);">+    # tag or the previous older version that did not?</span><br><span style="color: hsl(120, 100%, 40%);">+    #   Newer: v6.10-77-g0f8faeb</span><br><span style="color: hsl(120, 100%, 40%);">+    #   Older: v6.10-g0f8faeb</span><br><span style="color: hsl(120, 100%, 40%);">+    case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+       *-*-*) : git describe is okay three part flavor ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *-*)</span><br><span style="color: hsl(120, 100%, 40%);">+      : git describe is older two part flavor</span><br><span style="color: hsl(120, 100%, 40%);">+       # Recreate the number of commits and rewrite such that the</span><br><span style="color: hsl(120, 100%, 40%);">+            # result is the same as if we were using the newer version</span><br><span style="color: hsl(120, 100%, 40%);">+            # of git describe.</span><br><span style="color: hsl(120, 100%, 40%);">+            vtag=`echo "$v" | sed 's/-.*//'`</span><br><span style="color: hsl(120, 100%, 40%);">+            numcommits=`git rev-list "$vtag"..HEAD | wc -l`</span><br><span style="color: hsl(120, 100%, 40%);">+     v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;</span><br><span style="color: hsl(120, 100%, 40%);">+         ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    esac</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # Change the first '-' to a '.', so version-comparing tools work properly.</span><br><span style="color: hsl(120, 100%, 40%);">+    # Remove the "g" in git describe's output string, to save a byte.</span><br><span style="color: hsl(120, 100%, 40%);">+    v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;</span><br><span style="color: hsl(120, 100%, 40%);">+else</span><br><span style="color: hsl(120, 100%, 40%);">+    v=UNKNOWN</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+v=`echo "$v" |sed 's/^v//'`</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Don't declare a version "dirty" merely because a time stamp has changed.</span><br><span style="color: hsl(120, 100%, 40%);">+git status > /dev/null 2>&1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty=</span><br><span style="color: hsl(120, 100%, 40%);">+case "$dirty" in</span><br><span style="color: hsl(120, 100%, 40%);">+    '') ;;</span><br><span style="color: hsl(120, 100%, 40%);">+    *) # Append the suffix only if there isn't one already.</span><br><span style="color: hsl(120, 100%, 40%);">+        case $v in</span><br><span style="color: hsl(120, 100%, 40%);">+      *-dirty) ;;</span><br><span style="color: hsl(120, 100%, 40%);">+   *) v="$v-dirty" ;;</span><br><span style="color: hsl(120, 100%, 40%);">+        esac ;;</span><br><span style="color: hsl(120, 100%, 40%);">+esac</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Omit the trailing newline, so that m4_esyscmd can use the result directly.</span><br><span style="color: hsl(120, 100%, 40%);">+echo "$v" | tr -d '\012'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Local variables:</span><br><span style="color: hsl(120, 100%, 40%);">+# eval: (add-hook 'write-file-hooks 'time-stamp)</span><br><span style="color: hsl(120, 100%, 40%);">+# time-stamp-start: "scriptversion="</span><br><span style="color: hsl(120, 100%, 40%);">+# time-stamp-format: "%:y-%02m-%02d.%02H"</span><br><span style="color: hsl(120, 100%, 40%);">+# time-stamp-end: "$"</span><br><span style="color: hsl(120, 100%, 40%);">+# End:</span><br><span>diff --git a/include/Makefile.am b/include/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..fa499e7</span><br><span>--- /dev/null</span><br><span>+++ b/include/Makefile.am</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   osmocom \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_HEADERS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span>diff --git a/include/osmocom/Makefile.am b/include/osmocom/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..923cb50</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/Makefile.am</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   smlc \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(NULL)</span><br><span>diff --git a/include/osmocom/smlc/Makefile.am b/include/osmocom/smlc/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..599651d</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/smlc/Makefile.am</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_HEADERS = \</span><br><span style="color: hsl(120, 100%, 40%);">+     smlc_data.h \</span><br><span style="color: hsl(120, 100%, 40%);">+ smlc_sigtran.h \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span>diff --git a/include/osmocom/smlc/smlc_data.h b/include/osmocom/smlc/smlc_data.h</span><br><span>new file mode 100644</span><br><span>index 0000000..2506fdc</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/smlc/smlc_data.h</span><br><span>@@ -0,0 +1,37 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/tdef.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct smlc_state {</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_sccp_user *sccp_user;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ctrl_handle *ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   struct rate_ctr_group *ctrs;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_stat_item_group *statg;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_tdef *T_defs;</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%);">+extern struct smlc_state *g_smlc;</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%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+        DSMLC,</span><br><span style="color: hsl(120, 100%, 40%);">+        DLB,            /* Lb interface */</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int smlc_ctrl_node_lookup(void *data, vector vline, int *node_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                         void **node_data, int *i);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum smlc_ctrl_node {</span><br><span style="color: hsl(120, 100%, 40%);">+ CTRL_NODE_SMLC = _LAST_CTRL_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+     _LAST_CTRL_NODE_SMLC</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/include/osmocom/smlc/smlc_sigtran.h b/include/osmocom/smlc/smlc_sigtran.h</span><br><span>new file mode 100644</span><br><span>index 0000000..aeaf2c5</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/smlc/smlc_sigtran.h</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int smlc_sigtran_init(void);</span><br><span>diff --git a/osmoappdesc.py b/osmoappdesc.py</span><br><span>new file mode 100644</span><br><span>index 0000000..86a6ac1</span><br><span>--- /dev/null</span><br><span>+++ b/osmoappdesc.py</span><br><span>@@ -0,0 +1,13 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+app_configs = {</span><br><span style="color: hsl(120, 100%, 40%);">+    "osmo-smlc": ["doc/examples/osmo-smlc/osmo-smlc.cfg"]</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%);">+apps = [(4271, "src/osmo-smlc/osmo-smlc", "OsmoSMLC", "osmo-smlc")</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%);">+vty_command = ["./src/osmo-smlc/osmo-smlc", "-c",</span><br><span style="color: hsl(120, 100%, 40%);">+               "doc/examples/osmo-smlc/osmo-smlc.cfg"]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_app = apps[0]</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..26ff4d1</span><br><span>--- /dev/null</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -0,0 +1,25 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_builddir) \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      -Wall \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOCTRLY_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_LDFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(COVERAGE_LDFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo-smlc \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span>diff --git a/src/osmo-smlc/Makefile.am b/src/osmo-smlc/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..269c23d</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-smlc/Makefile.am</span><br><span>@@ -0,0 +1,38 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_builddir) \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      -Wall \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOCTRL_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_LDFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(COVERAGE_LDFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo-smlc \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_smlc_SOURCES = \</span><br><span style="color: hsl(120, 100%, 40%);">+      smlc_ctrl.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ smlc_main.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ smlc_sigtran.c \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_smlc_LDADD = \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOVTY_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOCTRL_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(COVERAGE_LDFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOSIGTRAN_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span>diff --git a/src/osmo-smlc/smlc_ctrl.c b/src/osmo-smlc/smlc_ctrl.c</span><br><span>new file mode 100644</span><br><span>index 0000000..c211d89</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-smlc/smlc_ctrl.c</span><br><span>@@ -0,0 +1,17 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></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%);">+/*! \brief control interface lookup function for bsc/bts/msc gsm_data</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] data Private data passed to controlif_setup()</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] vline Vector of the line holding the command string</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] node_type type (CTRL_NODE_) that was determined</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] node_data private dta of node that was determined</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param i Current index into vline, up to which it is parsed</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int smlc_ctrl_node_lookup(void *data, vector vline, int *node_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                    void **node_data, int *i)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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 style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/src/osmo-smlc/smlc_main.c b/src/osmo-smlc/smlc_main.c</span><br><span>new file mode 100644</span><br><span>index 0000000..9f32441</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-smlc/smlc_main.c</span><br><span>@@ -0,0 +1,263 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2020 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_cmd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/ports.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/ports.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/xua_msg.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/smlc/smlc_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/smlc/smlc_sigtran.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define _GNU_SOURCE</span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></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%);">+#include "../../config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const char *config_file = "osmo-smlc.cfg";</span><br><span style="color: hsl(120, 100%, 40%);">+static int daemonize = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+static void *tall_smlc_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+struct smlc_state *g_smlc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void print_usage()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Usage: osmo-smlc\n");</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 void print_help()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("  Some useful help...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("  -h --help                        This text.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("  -D --daemonize           Fork the process into a background daemon.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("  -d  --debug option               --debug=DRLL:DMM:DRR:DRSL:DNM enable debugging.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("  -V --version                     Print the version of OsmoBSC.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("  -c --config-file filename        The config file to use.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("  -e --log-level number            Set a global loglevel.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("  --vty-ref-xml                    Generate the VTY reference XML output and exit.\n");</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 void handle_options(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int option_index = 0, c;</span><br><span style="color: hsl(120, 100%, 40%);">+              static int long_option = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+           static struct option long_options[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                       {"help", 0, 0, 'h'},</span><br><span style="color: hsl(120, 100%, 40%);">+                        {"debug", 1, 0, 'd'},</span><br><span style="color: hsl(120, 100%, 40%);">+                       {"daemonize", 0, 0, 'D'},</span><br><span style="color: hsl(120, 100%, 40%);">+                   {"config-file", 1, 0, 'c'},</span><br><span style="color: hsl(120, 100%, 40%);">+                 {"version", 0, 0, 'V' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    {"log-level", 1, 0, 'e'},</span><br><span style="color: hsl(120, 100%, 40%);">+                   {"vty-ref-xml", 0, &long_option, 1},</span><br><span style="color: hsl(120, 100%, 40%);">+                    {0, 0, 0, 0}</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%);">+          c = getopt_long(argc, argv, "hd:Dc:Ve:",</span><br><span style="color: hsl(120, 100%, 40%);">+                            long_options, &option_index);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (c == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case 'h':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_usage();</span><br><span style="color: hsl(120, 100%, 40%);">+                        print_help();</span><br><span style="color: hsl(120, 100%, 40%);">+                 exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+              case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       switch (long_option) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+                               vty_dump_xml_ref(stdout);</span><br><span style="color: hsl(120, 100%, 40%);">+                             exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      default:</span><br><span style="color: hsl(120, 100%, 40%);">+                              fprintf(stderr, "error parsing cmdline options\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             case 'd':</span><br><span style="color: hsl(120, 100%, 40%);">+                     log_parse_category_mask(osmo_stderr_target, optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'D':</span><br><span style="color: hsl(120, 100%, 40%);">+                     daemonize = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'c':</span><br><span style="color: hsl(120, 100%, 40%);">+                     config_file = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'V':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_version(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                     exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'e':</span><br><span style="color: hsl(120, 100%, 40%);">+                     log_set_log_level(osmo_stderr_target, 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%);">+                      /* catch unknown options *as well as* missing arguments. */</span><br><span style="color: hsl(120, 100%, 40%);">+                   fprintf(stderr, "Error in command line options. Exiting.\n");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (argc > optind) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "Unsupported positional arguments on command line\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(2);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct vty_app_info vty_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .name           = "OsmoSMLC",</span><br><span style="color: hsl(120, 100%, 40%);">+       .copyright      =</span><br><span style="color: hsl(120, 100%, 40%);">+     "Copyright (C) 2020 Harald Welte and sysmocom - s.f.m.c. GmbH\r\n\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "License AGPLv3+: GNU AGPL version 3 or later <http://gnu.org/licenses/agpl-3.0.html>\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "This is free software: you are free to change and redistribute it.\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "There is NO WARRANTY, to the extent permitted by law.\r\n",</span><br><span style="color: hsl(120, 100%, 40%);">+        .version        = PACKAGE_VERSION,</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 void signal_handler(int signal)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   fprintf(stdout, "signal %u received\n", signal);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (signal) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case SIGINT:</span><br><span style="color: hsl(120, 100%, 40%);">+  case SIGTERM:</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIGABRT:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* in case of abort, we want to obtain a talloc report</span><br><span style="color: hsl(120, 100%, 40%);">+                 * and then return to the caller, who will abort the process */</span><br><span style="color: hsl(120, 100%, 40%);">+       case SIGUSR1:</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_report_full(tall_smlc_ctx, stderr);</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%);">+              break;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct log_info_cat smlc_categories[] = {</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%);">+const struct log_info log_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+      .cat = smlc_categories,</span><br><span style="color: hsl(120, 100%, 40%);">+       .num_cat = ARRAY_SIZE(smlc_categories),</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%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     tall_smlc_ctx = talloc_named_const(NULL, 1, "osmo-smlc");</span><br><span style="color: hsl(120, 100%, 40%);">+   msgb_talloc_ctx_init(tall_smlc_ctx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_signal_talloc_ctx_init(tall_smlc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_xua_msg_tall_ctx_init(tall_smlc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_info.tall_ctx = tall_smlc_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_init_logging2(tall_smlc_ctx, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_stats_init(tall_smlc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+       rate_ctr_init(tall_smlc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_fsm_set_dealloc_ctx(OTC_SELECT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       g_smlc = talloc_zero(tall_smlc_ctx, struct smlc_state);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(g_smlc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* This needs to precede handle_options() */</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_init(&vty_info);</span><br><span style="color: hsl(120, 100%, 40%);">+      //smlc_vty_init(g_smlc);</span><br><span style="color: hsl(120, 100%, 40%);">+      ctrl_vty_init(tall_smlc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Initialize SS7 */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(osmo_ss7_init() == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_ss7_vty_init_asp(tall_smlc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_sccp_vty_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* parse options */</span><br><span style="color: hsl(120, 100%, 40%);">+   handle_options(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Read the config */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = vty_read_config_file(config_file, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);</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%);">+   /* Start telnet interface after reading config for vty_get_bind_addr() */</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = telnet_init_dynif(tall_smlc_ctx, g_smlc, vty_get_bind_addr(), OSMO_VTY_PORT_SMLC);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0)</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%);">+    /* start control interface after reading config for</span><br><span style="color: hsl(120, 100%, 40%);">+    * ctrl_vty_get_bind_addr() */</span><br><span style="color: hsl(120, 100%, 40%);">+        g_smlc->ctrl = ctrl_interface_setup_dynip2(g_smlc, ctrl_vty_get_bind_addr(), OSMO_CTRL_PORT_SMLC,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             smlc_ctrl_node_lookup, _LAST_CTRL_NODE_SMLC);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!g_smlc->ctrl) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "Failed to init the control interface. Exiting.\n");</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%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = smlc_ctrl_cmds_install(g_smlc);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Failed to install control commands. Exiting.\n");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (smlc_sigtran_init() != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DLB, LOGL_ERROR, "Failed to initialize sigtran backhaul.\n");</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%);">+   signal(SIGINT, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGTERM, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGABRT, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGUSR1, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGUSR2, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_ignore_signals();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (daemonize) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_daemonize();</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      perror("Error during daemonize");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_select_main_ctx(0);</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%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-smlc/smlc_sigtran.c b/src/osmo-smlc/smlc_sigtran.c</span><br><span>new file mode 100644</span><br><span>index 0000000..902df0c</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-smlc/smlc_sigtran.c</span><br><span>@@ -0,0 +1,94 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2020 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/osmo_ss7.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm0808.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/smlc/smlc_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/smlc/smlc_sigtran.h></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%);">+#define DEFAULT_M3UA_REMOTE_IP       "localhost"</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_PC               "0.23.6"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_scu_prim *scu_prim = (struct osmo_scu_prim *)oph;</span><br><span style="color: hsl(120, 100%, 40%);">+ //struct osmo_sccp_user *scu = _scu;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (OSMO_PRIM_HDR(&scu_prim->oph)) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case OSMO_PRIM(OSMO_SCU_PRIM_N_UNITDATA, PRIM_OP_INDICATION):</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Handle inbound UNITDATA */</span><br><span style="color: hsl(120, 100%, 40%);">+         DEBUGP(DLB, "N-UNITDATA.ind(%s)\n", osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));</span><br><span style="color: hsl(120, 100%, 40%);">+           //rc = handle_unitdata_from_bsc(&scu_prim->u.unitdata.calling_addr, oph->msg, scu);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_INDICATION):</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Handle inbound connections */</span><br><span style="color: hsl(120, 100%, 40%);">+              DEBUGP(DLB, "N-CONNECT.ind(X->%u)\n", scu_prim->u.connect.conn_id);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_CONFIRM):</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Handle outbound connection confirmation */</span><br><span style="color: hsl(120, 100%, 40%);">+         DEBUGP(DLB, "N-CONNECT.cnf(%u, %s)\n", scu_prim->u.connect.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case OSMO_PRIM(OSMO_SCU_PRIM_N_DATA, PRIM_OP_INDICATION):</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Handle incoming connection oriented data */</span><br><span style="color: hsl(120, 100%, 40%);">+                DEBUGP(DLB, "N-DATA.ind(%u, %s)\n", scu_prim->u.data.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case OSMO_PRIM(OSMO_SCU_PRIM_N_DISCONNECT, PRIM_OP_INDICATION):</span><br><span style="color: hsl(120, 100%, 40%);">+               DEBUGP(DLB, "N-DISCONNECT.ind(%u, %s, cause=%i)\n", scu_prim->u.disconnect.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)),</span><br><span style="color: hsl(120, 100%, 40%);">+                  scu_prim->u.disconnect.cause);</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%);">+              LOGP(DLB, LOGL_ERROR, "Unhandled SIGTRAN operation %s on primitive %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   get_value_string(osmo_prim_op_names, oph->operation), oph->primitive);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</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%);">+   msgb_free(oph->msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       return rc;</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%);">+int smlc_sigtran_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_sccp_instance *sccp;</span><br><span style="color: hsl(120, 100%, 40%);">+      int default_pc = osmo_ss7_pointcode_parse(NULL, DEFAULT_PC);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(default_pc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    sccp = osmo_sccp_simple_client_on_ss7_id(g_smlc, 0, "Lb", default_pc, OSMO_SS7_ASP_PROT_M3UA,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                0, NULL, 0, DEFAULT_M3UA_REMOTE_IP);</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%);">+     g_smlc->sccp_user = osmo_sccp_user_bind(sccp, "SMLC", sccp_sap_up, OSMO_SCCP_SSN_SMLC_BSSAP);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!g_smlc->sccp_user)</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..a9f7001</span><br><span>--- /dev/null</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -0,0 +1,84 @@</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The `:;' works around a Bash 3.2 bug when the output is not writeable.</span><br><span style="color: hsl(120, 100%, 40%);">+$(srcdir)/package.m4: $(top_srcdir)/configure.ac</span><br><span style="color: hsl(120, 100%, 40%);">+     :;{ \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '# Signature of the current package.' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_NAME],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_NAME)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_TARNAME],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_TARNAME)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_VERSION],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_VERSION)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_STRING],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_STRING)])' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_BUGREPORT],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_BUGREPORT)])'; \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo 'm4_define([AT_PACKAGE_URL],' && \</span><br><span style="color: hsl(120, 100%, 40%);">+               echo '  [$(PACKAGE_URL)])'; \</span><br><span style="color: hsl(120, 100%, 40%);">+             } >'$(srcdir)/package.m4'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+    testsuite.at \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(srcdir)/package.m4 \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(TESTSUITE) \</span><br><span style="color: hsl(120, 100%, 40%);">+        test_nodes.vty \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+TESTSUITE = $(srcdir)/testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DISTCLEANFILES = \</span><br><span style="color: hsl(120, 100%, 40%);">+      atconfig \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_EXT_TESTS</span><br><span style="color: hsl(120, 100%, 40%);">+python-tests: $(BUILT_SOURCES)</span><br><span style="color: hsl(120, 100%, 40%);">+        $(MAKE) vty-test</span><br><span style="color: hsl(120, 100%, 40%);">+      $(MAKE) ctrl-test</span><br><span style="color: hsl(120, 100%, 40%);">+else</span><br><span style="color: hsl(120, 100%, 40%);">+python-tests: $(BUILT_SOURCES)</span><br><span style="color: hsl(120, 100%, 40%);">+       echo "Not running python-based tests (determined at configure-time)"</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Run a specific test with: 'make vty-test VTY_TEST=osmo-smlc.vty'</span><br><span style="color: hsl(120, 100%, 40%);">+VTY_TEST ?= *.vty</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# To update the VTY script from current application behavior,</span><br><span style="color: hsl(120, 100%, 40%);">+# pass -u to vty_script_runner.py by doing:</span><br><span style="color: hsl(120, 100%, 40%);">+#   make vty-test U=-u</span><br><span style="color: hsl(120, 100%, 40%);">+vty-test:</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_verify_transcript_vty.py -v \</span><br><span style="color: hsl(120, 100%, 40%);">+            -n OsmoSMLC -p 4271 \</span><br><span style="color: hsl(120, 100%, 40%);">+         -r "$(top_builddir)/src/osmo-smlc/osmo-smlc -c $(top_srcdir)/doc/examples/osmo-smlc/osmo-smlc.cfg" \</span><br><span style="color: hsl(120, 100%, 40%);">+                $(U) $(srcdir)/$(VTY_TEST)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# To update the CTRL script from current application behavior,</span><br><span style="color: hsl(120, 100%, 40%);">+# pass -u to ctrl_script_runner.py by doing:</span><br><span style="color: hsl(120, 100%, 40%);">+#   make ctrl-test U=-u</span><br><span style="color: hsl(120, 100%, 40%);">+ctrl-test:</span><br><span style="color: hsl(120, 100%, 40%);">+       -rm -f $(CTRL_TEST_DB)</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_verify_transcript_ctrl.py -v \</span><br><span style="color: hsl(120, 100%, 40%);">+           -p 4272 \</span><br><span style="color: hsl(120, 100%, 40%);">+             -r "$(top_builddir)/src/osmo-smlc/osmo-smlc -c $(top_srcdir)/doc/examples/osmo-smlc.cfg -l $(CTRL_TEST_DB)" \</span><br><span style="color: hsl(120, 100%, 40%);">+               $(U) $(srcdir)/*.ctrl</span><br><span style="color: hsl(120, 100%, 40%);">+ -rm -f $(CTRL_TEST_DB)</span><br><span style="color: hsl(120, 100%, 40%);">+        -rm $(CTRL_TEST_DB)-*</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+check-local: atconfig $(TESTSUITE)</span><br><span style="color: hsl(120, 100%, 40%);">+   $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+     $(MAKE) $(AM_MAKEFLAGS) python-tests</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+installcheck-local: atconfig $(TESTSUITE)</span><br><span style="color: hsl(120, 100%, 40%);">+     $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \</span><br><span style="color: hsl(120, 100%, 40%);">+           $(TESTSUITEFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+clean-local:</span><br><span style="color: hsl(120, 100%, 40%);">+     test ! -f '$(TESTSUITE)' || \</span><br><span style="color: hsl(120, 100%, 40%);">+         $(SHELL) '$(TESTSUITE)' --clean</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AUTOM4TE = $(SHELL) $(top_srcdir)/missing --run autom4te</span><br><span style="color: hsl(120, 100%, 40%);">+AUTOTEST = $(AUTOM4TE) --language=autotest</span><br><span style="color: hsl(120, 100%, 40%);">+$(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4</span><br><span style="color: hsl(120, 100%, 40%);">+    $(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at</span><br><span style="color: hsl(120, 100%, 40%);">+    mv $@.tmp $@</span><br><span>diff --git a/tests/atlocal.in b/tests/atlocal.in</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/tests/atlocal.in</span><br><span>diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..8ad784a</span><br><span>--- /dev/null</span><br><span>+++ b/tests/test_nodes.vty</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoSMLC> enable</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoSMLC#</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>new file mode 100644</span><br><span>index 0000000..09a77c3</span><br><span>--- /dev/null</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AT_INIT</span><br><span style="color: hsl(120, 100%, 40%);">+AT_BANNER([Regression tests.])</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-smlc/+/19779">change 19779</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/c/osmo-smlc/+/19779"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-smlc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I706aa9e11a646aad71bb310fa552d0bdb5084d4b </div>
<div style="display:none"> Gerrit-Change-Number: 19779 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>