<p>tsaitgaist <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/simtrace2/+/16194">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  tsaitgaist: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">host: use autotools and split shared code to libosmo-simtrace2<br><br>Change-Id: I57e77f927ee9e169cc794c5dc6b128a2d590201b<br>---<br>M contrib/jenkins.sh<br>A host/.gitignore<br>A host/Makefile.am<br>R host/Makefile.old<br>A host/configure.ac<br>R host/contrib/99-simtrace2.rules<br>A host/contrib/Makefile.am<br>A host/git-version-gen<br>A host/include/Makefile.am<br>R host/include/osmocom/simtrace2/apdu_dispatch.h<br>A host/include/osmocom/simtrace2/gsmtap.h<br>R host/include/osmocom/simtrace2/libusb_util.h<br>A host/include/osmocom/simtrace2/simtrace2_api.h<br>A host/include/osmocom/simtrace2/simtrace_prot.h<br>A host/include/osmocom/simtrace2/simtrace_usb.h<br>A host/lib/Makefile.am<br>R host/lib/apdu_dispatch.c<br>A host/lib/gsmtap.c<br>R host/lib/libusb_util.c<br>A host/lib/simtrace2_api.c<br>A host/libosmo-simtrace2.pc.in<br>D host/simtrace.h<br>D host/simtrace2-remsim.c<br>D host/simtrace_prot.h<br>D host/simtrace_usb.h<br>A host/src/Makefile.am<br>R host/src/simtrace2-discovery.c<br>R host/src/simtrace2-discovery.h<br>A host/src/simtrace2-remsim.c<br>R host/src/simtrace2-sniff.c<br>R host/src/simtrace2_usb.c<br>R host/src/usb2udp.c<br>32 files changed, 1,245 insertions(+), 836 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh</span><br><span>index b85e4b3..a8426bd 100755</span><br><span>--- a/contrib/jenkins.sh</span><br><span>+++ b/contrib/jenkins.sh</span><br><span>@@ -50,9 +50,15 @@</span><br><span> echo</span><br><span> echo "=============== HOST START  =============="</span><br><span> cd $TOPDIR/host</span><br><span style="color: hsl(0, 100%, 40%);">-make clean</span><br><span style="color: hsl(0, 100%, 40%);">-make</span><br><span style="color: hsl(0, 100%, 40%);">-make clean</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-werror</span><br><span style="color: hsl(120, 100%, 40%);">+$MAKE $PARALLEL_MAKE</span><br><span style="color: hsl(120, 100%, 40%);">+#$MAKE distcheck || cat-testlogs.sh</span><br><span style="color: hsl(120, 100%, 40%);">+make dist</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> </span><br><span> if [ "x$publish" = "x--publish" ]; then</span><br><span>        echo</span><br><span>@@ -69,6 +75,10 @@</span><br><span> fi</span><br><span> </span><br><span> echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo "=============== HOST CLEAN  =============="</span><br><span style="color: hsl(120, 100%, 40%);">+$MAKE maintainer-clean</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span> echo "=============== FIRMWARE CLEAN  =============="</span><br><span> cd $TOPDIR/firmware/</span><br><span> for build in $BUILDS; do</span><br><span>diff --git a/host/.gitignore b/host/.gitignore</span><br><span>new file mode 100644</span><br><span>index 0000000..44ca2a0</span><br><span>--- /dev/null</span><br><span>+++ b/host/.gitignore</span><br><span>@@ -0,0 +1,32 @@</span><br><span style="color: hsl(120, 100%, 40%);">+.o</span><br><span style="color: hsl(120, 100%, 40%);">+*.a</span><br><span style="color: hsl(120, 100%, 40%);">+*.lo</span><br><span style="color: hsl(120, 100%, 40%);">+*.la</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%);">+</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%);">+compile</span><br><span style="color: hsl(120, 100%, 40%);">+config.guess</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.sub</span><br><span style="color: hsl(120, 100%, 40%);">+configure</span><br><span style="color: hsl(120, 100%, 40%);">+configure.lineno</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%);">+</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%);">+libtool</span><br><span style="color: hsl(120, 100%, 40%);">+.libs</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+*.pc</span><br><span>diff --git a/host/Makefile.am b/host/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..d1b3b31</span><br><span>--- /dev/null</span><br><span>+++ b/host/Makefile.am</span><br><span>@@ -0,0 +1,14 @@</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%);">+AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = include lib src contrib #tests examples doc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = .version git-version-gen</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%);">+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>diff --git a/host/Makefile b/host/Makefile.old</span><br><span>similarity index 94%</span><br><span>rename from host/Makefile</span><br><span>rename to host/Makefile.old</span><br><span>index aee399c..ab767cd 100644</span><br><span>--- a/host/Makefile</span><br><span>+++ b/host/Makefile.old</span><br><span>@@ -5,7 +5,7 @@</span><br><span> </span><br><span> all: $(APPS)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-simtrace2-remsim: simtrace2-remsim.o apdu_dispatch.o simtrace2-discovery.o libusb_util.o</span><br><span style="color: hsl(120, 100%, 40%);">+simtrace2-remsim: simtrace2-remsim.o apdu_dispatch.o simtrace2-discovery.o simtrace2_api.o libusb_util.o</span><br><span>       $(CC) -o $@ $^ $(LDFLAGS) `pkg-config --libs libosmosim libpcsclite`</span><br><span> </span><br><span> simtrace2-remsim-usb2udp: usb2udp.o simtrace2-discovery.o</span><br><span>diff --git a/host/configure.ac b/host/configure.ac</span><br><span>new file mode 100644</span><br><span>index 0000000..7929884</span><br><span>--- /dev/null</span><br><span>+++ b/host/configure.ac</span><br><span>@@ -0,0 +1,102 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AC_INIT([simtrace2],</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%);">+     [simtrace@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([foreign dist-bzip2 no-dist-gzip 1.6 subdir-objects])</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([pic-only])</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%);">+AC_CONFIG_MACRO_DIR([m4])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+CFLAGS="$CFLAGS -Wall"</span><br><span style="color: hsl(120, 100%, 40%);">+CPPFLAGS="$CPPFLAGS -Wall"</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%);">+# 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%);">+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.0.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOSIM, libosmosim >= 1.0.0)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBUSB, libusb-1.0)</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%);">+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%);">+AC_OUTPUT(</span><br><span style="color: hsl(120, 100%, 40%);">+        libosmo-simtrace2.pc</span><br><span style="color: hsl(120, 100%, 40%);">+  include/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+      src/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+  lib/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+  contrib/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+      Makefile)</span><br><span>diff --git a/host/99-simtrace2.rules b/host/contrib/99-simtrace2.rules</span><br><span>similarity index 100%</span><br><span>rename from host/99-simtrace2.rules</span><br><span>rename to host/contrib/99-simtrace2.rules</span><br><span>diff --git a/host/contrib/Makefile.am b/host/contrib/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..4f11962</span><br><span>--- /dev/null</span><br><span>+++ b/host/contrib/Makefile.am</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = 99-simtrace2.rules</span><br><span>diff --git a/host/git-version-gen b/host/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/host/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/host/include/Makefile.am b/host/include/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..4222484</span><br><span>--- /dev/null</span><br><span>+++ b/host/include/Makefile.am</span><br><span>@@ -0,0 +1,7 @@</span><br><span style="color: hsl(120, 100%, 40%);">+nobase_include_HEADERS = \</span><br><span style="color: hsl(120, 100%, 40%);">+             osmocom/simtrace2/apdu_dispatch.h \</span><br><span style="color: hsl(120, 100%, 40%);">+           osmocom/simtrace2/libusb_util.h \</span><br><span style="color: hsl(120, 100%, 40%);">+             osmocom/simtrace2/simtrace2_api.h \</span><br><span style="color: hsl(120, 100%, 40%);">+           osmocom/simtrace2/simtrace_usb.h \</span><br><span style="color: hsl(120, 100%, 40%);">+            osmocom/simtrace2/simtrace_prot.h \</span><br><span style="color: hsl(120, 100%, 40%);">+           osmocom/simtrace2/gsmtap.h</span><br><span>diff --git a/host/apdu_dispatch.h b/host/include/osmocom/simtrace2/apdu_dispatch.h</span><br><span>similarity index 100%</span><br><span>rename from host/apdu_dispatch.h</span><br><span>rename to host/include/osmocom/simtrace2/apdu_dispatch.h</span><br><span>diff --git a/host/include/osmocom/simtrace2/gsmtap.h b/host/include/osmocom/simtrace2/gsmtap.h</span><br><span>new file mode 100644</span><br><span>index 0000000..d7184dc</span><br><span>--- /dev/null</span><br><span>+++ b/host/include/osmocom/simtrace2/gsmtap.h</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_st2_gsmtap_init(const char *gsmtap_host);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_st2_gsmtap_send_apdu(uint8_t sub_type, const uint8_t *apdu, unsigned int len);</span><br><span>diff --git a/host/libusb_util.h b/host/include/osmocom/simtrace2/libusb_util.h</span><br><span>similarity index 100%</span><br><span>rename from host/libusb_util.h</span><br><span>rename to host/include/osmocom/simtrace2/libusb_util.h</span><br><span>diff --git a/host/include/osmocom/simtrace2/simtrace2_api.h b/host/include/osmocom/simtrace2/simtrace2_api.h</span><br><span>new file mode 100644</span><br><span>index 0000000..5a9f4a3</span><br><span>--- /dev/null</span><br><span>+++ b/host/include/osmocom/simtrace2/simtrace2_api.h</span><br><span>@@ -0,0 +1,52 @@</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 <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sim/sim.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* transport to a SIMtrace device */</span><br><span style="color: hsl(120, 100%, 40%);">+struct st_transport {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* USB */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct libusb_device_handle *usb_devh;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t in;</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t out;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t irq_in;</span><br><span style="color: hsl(120, 100%, 40%);">+       } usb_ep;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* UDP */</span><br><span style="color: hsl(120, 100%, 40%);">+     int udp_fd;</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%);">+/* a SIMtrace slot; communicates over a transport */</span><br><span style="color: hsl(120, 100%, 40%);">+struct st_slot {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* transport through which the slot can be reached */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct st_transport *transp;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* number of the slot within the transport */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t slot_nr;</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%);">+/* One istance of card emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+struct cardem_inst {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* slot on which this card emulation instance runs */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct st_slot *slot;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* libosmosim SIM card profile */</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct osim_cla_ins_card_profile *card_prof;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* libosmosim SIM card channel */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osim_chan_hdl *chan;</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 cardem_request_card_insert(struct cardem_inst *ci, bool inserted);</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_pb_and_rx(struct cardem_inst *ci, uint8_t pb, uint8_t le);</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_pb_and_tx(struct cardem_inst *ci, uint8_t pb,</span><br><span style="color: hsl(120, 100%, 40%);">+                       const uint8_t *data, uint16_t data_len_in);</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_sw_tx(struct cardem_inst *ci, const uint8_t *sw);</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_set_atr(struct cardem_inst *ci, const uint8_t *atr, unsigned int atr_len);</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 st_modem_reset_pulse(struct st_slot *slot, uint16_t duration_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_reset_active(struct st_slot *slot);</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_reset_inactive(struct st_slot *slot);</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_sim_select_local(struct st_slot *slot);</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_sim_select_remote(struct st_slot *slot);</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_get_status(struct st_slot *slot);</span><br><span>diff --git a/host/include/osmocom/simtrace2/simtrace_prot.h b/host/include/osmocom/simtrace2/simtrace_prot.h</span><br><span>new file mode 120000</span><br><span>index 0000000..cf485f3</span><br><span>--- /dev/null</span><br><span>+++ b/host/include/osmocom/simtrace2/simtrace_prot.h</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+../../../../firmware/libcommon/include/simtrace_prot.h</span><br><span>\ No newline at end of file</span><br><span>diff --git a/host/include/osmocom/simtrace2/simtrace_usb.h b/host/include/osmocom/simtrace2/simtrace_usb.h</span><br><span>new file mode 120000</span><br><span>index 0000000..ec0c021</span><br><span>--- /dev/null</span><br><span>+++ b/host/include/osmocom/simtrace2/simtrace_usb.h</span><br><span>@@ -0,0 +1 @@</span><br><span style="color: hsl(120, 100%, 40%);">+../../../../firmware/libcommon/include/simtrace_usb.h</span><br><span>\ No newline at end of file</span><br><span>diff --git a/host/lib/Makefile.am b/host/lib/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..8416923</span><br><span>--- /dev/null</span><br><span>+++ b/host/lib/Makefile.am</span><br><span>@@ -0,0 +1,19 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# This is _NOT_ the library release version, it's an API version.</span><br><span style="color: hsl(120, 100%, 40%);">+# Please read chapter "Library interface versions" of the libtool documentation</span><br><span style="color: hsl(120, 100%, 40%);">+# before making any modifications: https://www.gnu.org/software/libtool/manual/html_node/Versioning.html</span><br><span style="color: hsl(120, 100%, 40%);">+ST2_LIBVERSION=0:0:0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS= -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOSIM_CFLAGS) $(LIBUSB_CFLAGS) $(COVERAGE_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+AM_LDFLAGS = $(COVERAGE_LDFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+COMMONLIBS = $(LIBOSMOCORE_LIBS) $(LIBOSMOSIM_LIBS) $(LIBUSB_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+lib_LTLIBRARIES = libosmo-simtrace2.la</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+libosmo_simtrace2_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(ST2_LIBVERSION)</span><br><span style="color: hsl(120, 100%, 40%);">+libosmo_simtrace2_la_LIBADD = $(COMMONLIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+libosmo_simtrace2_la_SOURCES = \</span><br><span style="color: hsl(120, 100%, 40%);">+       apdu_dispatch.c \</span><br><span style="color: hsl(120, 100%, 40%);">+     gsmtap.c \</span><br><span style="color: hsl(120, 100%, 40%);">+    libusb_util.c \</span><br><span style="color: hsl(120, 100%, 40%);">+       simtrace2_api.c</span><br><span>diff --git a/host/apdu_dispatch.c b/host/lib/apdu_dispatch.c</span><br><span>similarity index 98%</span><br><span>rename from host/apdu_dispatch.c</span><br><span>rename to host/lib/apdu_dispatch.c</span><br><span>index 7c7ed01..ae892eb 100644</span><br><span>--- a/host/apdu_dispatch.c</span><br><span>+++ b/host/lib/apdu_dispatch.c</span><br><span>@@ -27,7 +27,7 @@</span><br><span> #include <osmocom/sim/sim.h></span><br><span> #include <osmocom/sim/class_tables.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include "apdu_dispatch.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/apdu_dispatch.h></span><br><span> </span><br><span> /*! \brief Has the command-data phase been completed yet? */</span><br><span> static inline bool is_dc_complete(struct apdu_context *ac)</span><br><span>diff --git a/host/lib/gsmtap.c b/host/lib/gsmtap.c</span><br><span>new file mode 100644</span><br><span>index 0000000..d5575e0</span><br><span>--- /dev/null</span><br><span>+++ b/host/lib/gsmtap.c</span><br><span>@@ -0,0 +1,57 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/gsmtap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap_util.h></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%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* global GSMTAP instance */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsmtap_inst *g_gti;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_st2_gsmtap_init(const char *gsmtap_host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (g_gti)</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EEXIST;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     g_gti = gsmtap_source_init(gsmtap_host, GSMTAP_UDP_PORT, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!g_gti) {</span><br><span style="color: hsl(120, 100%, 40%);">+         perror("unable to open GSMTAP");</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     gsmtap_source_add_sink(g_gti);</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%);">+int osmo_st2_gsmtap_send_apdu(uint8_t sub_type, const uint8_t *apdu, unsigned int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsmtap_hdr *gh;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int gross_len = len + sizeof(*gh);</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t *buf = malloc(gross_len);</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%);">+     if (!buf)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     memset(buf, 0, sizeof(*gh));</span><br><span style="color: hsl(120, 100%, 40%);">+  gh = (struct gsmtap_hdr *) buf;</span><br><span style="color: hsl(120, 100%, 40%);">+       gh->version = GSMTAP_VERSION;</span><br><span style="color: hsl(120, 100%, 40%);">+      gh->hdr_len = sizeof(*gh)/4;</span><br><span style="color: hsl(120, 100%, 40%);">+       gh->type = GSMTAP_TYPE_SIM;</span><br><span style="color: hsl(120, 100%, 40%);">+        gh->sub_type = sub_type;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(buf + sizeof(*gh), apdu, len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = write(gsmtap_inst_fd(g_gti), buf, gross_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              perror("write gsmtap");</span><br><span style="color: hsl(120, 100%, 40%);">+             free(buf);</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%);">+   free(buf);</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/host/libusb_util.c b/host/lib/libusb_util.c</span><br><span>similarity index 98%</span><br><span>rename from host/libusb_util.c</span><br><span>rename to host/lib/libusb_util.c</span><br><span>index 71fb488..d88b043 100644</span><br><span>--- a/host/libusb_util.c</span><br><span>+++ b/host/lib/libusb_util.c</span><br><span>@@ -1,6 +1,6 @@</span><br><span> /* libusb utilities</span><br><span>  * </span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2010-2016 by Harald Welte <hwelte@hmw-consulting.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2010-2019 by Harald Welte <hwelte@hmw-consulting.de></span><br><span>  *</span><br><span>  * This program is free software; you can redistribute it and/or</span><br><span>  * modify it under the terms of the GNU General Public License</span><br><span>@@ -25,7 +25,7 @@</span><br><span> </span><br><span> #include <libusb.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include "libusb_util.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/libusb_util.h></span><br><span> </span><br><span> static char path_buf[USB_MAX_PATH_LEN];</span><br><span> </span><br><span>diff --git a/host/lib/simtrace2_api.c b/host/lib/simtrace2_api.c</span><br><span>new file mode 100644</span><br><span>index 0000000..0d48b8e</span><br><span>--- /dev/null</span><br><span>+++ b/host/lib/simtrace2_api.c</span><br><span>@@ -0,0 +1,281 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* simtrace2-protocol - USB protocol library code for SIMtrace2</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2016-2019 by Harald Welte <hwelte@hmw-consulting.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></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</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (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, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</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%);">+#include <unistd.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 <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></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 <sys/time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arpa/inet.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <libusb.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+//#include <osmocom/simtrace2/libusb_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace_prot.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace2_api.h></span><br><span style="color: hsl(120, 100%, 40%);">+//#include "apdu_dispatch.h"</span><br><span style="color: hsl(120, 100%, 40%);">+//#include "simtrace2-discovery.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/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sim/class_tables.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sim/sim.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%);">+ * SIMTRACE core protocol</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 allocate a message buffer for simtrace use */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct msgb *st_msgb_alloc(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return msgb_alloc_headroom(1024+32, 32, "SIMtrace");</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 0</span><br><span style="color: hsl(120, 100%, 40%);">+static void apdu_out_cb(uint8_t *buf, unsigned int len, void *user_data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("APDU: %s\n", osmo_hexdump(buf, len));</span><br><span style="color: hsl(120, 100%, 40%);">+       gsmtap_send_sim(buf, len);</span><br><span style="color: hsl(120, 100%, 40%);">+}</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%);">+/*! \brief Transmit a given command to the SIMtrace2 device */</span><br><span style="color: hsl(120, 100%, 40%);">+int st_transp_tx_msg(struct st_transport *transp, struct msgb *msg)</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%);">+     printf("<- %s\n", msgb_hexdump(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (transp->udp_fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               int xfer_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = libusb_bulk_transfer(transp->usb_devh, transp->usb_ep.out,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   msgb_data(msg), msgb_length(msg),</span><br><span style="color: hsl(120, 100%, 40%);">+                                     &xfer_len, 100000);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = write(transp->udp_fd, msgb_data(msg), msgb_length(msg));</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(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%);">+static struct simtrace_msg_hdr *st_push_hdr(struct msgb *msg, uint8_t msg_class, uint8_t msg_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       uint8_t slot_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct simtrace_msg_hdr *sh;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        sh = (struct simtrace_msg_hdr *) msgb_push(msg, sizeof(*sh));</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(sh, 0, sizeof(*sh));</span><br><span style="color: hsl(120, 100%, 40%);">+   sh->msg_class = msg_class;</span><br><span style="color: hsl(120, 100%, 40%);">+ sh->msg_type = msg_type;</span><br><span style="color: hsl(120, 100%, 40%);">+   sh->slot_nr = slot_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+     sh->msg_len = msgb_length(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return sh;</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%);">+/* transmit a given message to a specified slot. Expects all headers</span><br><span style="color: hsl(120, 100%, 40%);">+ * present before calling the function */</span><br><span style="color: hsl(120, 100%, 40%);">+int st_slot_tx_msg(struct st_slot *slot, struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t msg_class, uint8_t msg_type)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    st_push_hdr(msg, msg_class, msg_type, slot->slot_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return st_transp_tx_msg(slot->transp, msg);</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%);">+ * Card Emulation protocol</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%);">+/*! \brief Request the SIMtrace2 to generate a card-insert signal */</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_card_insert(struct cardem_inst *ci, bool inserted)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct cardemu_usb_msg_cardinsert *cins;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    cins = (struct cardemu_usb_msg_cardinsert *) msgb_put(msg, sizeof(*cins));</span><br><span style="color: hsl(120, 100%, 40%);">+    memset(cins, 0, sizeof(*cins));</span><br><span style="color: hsl(120, 100%, 40%);">+       if (inserted)</span><br><span style="color: hsl(120, 100%, 40%);">+         cins->card_insert = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_CARDINSERT);</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 Request the SIMtrace2 to transmit a Procedure Byte, then Rx */</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_pb_and_rx(struct cardem_inst *ci, uint8_t pb, uint8_t le)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct cardemu_usb_msg_tx_data *txd;</span><br><span style="color: hsl(120, 100%, 40%);">+  txd = (struct cardemu_usb_msg_tx_data *) msgb_put(msg, sizeof(*txd));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("<= %s(%02x, %d)\n", __func__, pb, le);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(txd, 0, sizeof(*txd));</span><br><span style="color: hsl(120, 100%, 40%);">+ txd->data_len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ txd->flags = CEMU_DATA_F_PB_AND_RX;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* one data byte */</span><br><span style="color: hsl(120, 100%, 40%);">+   msgb_put_u8(msg, pb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_TX_DATA);</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 Request the SIMtrace2 to transmit a Procedure Byte, then Tx */</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_pb_and_tx(struct cardem_inst *ci, uint8_t pb,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const uint8_t *data, uint16_t data_len_in)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct cardemu_usb_msg_tx_data *txd;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t *cur;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       txd = (struct cardemu_usb_msg_tx_data *) msgb_put(msg, sizeof(*txd));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("<= %s(%02x, %s, %d)\n", __func__, pb,</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_hexdump(data, data_len_in), data_len_in);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      memset(txd, 0, sizeof(*txd));</span><br><span style="color: hsl(120, 100%, 40%);">+ txd->data_len = 1 + data_len_in;</span><br><span style="color: hsl(120, 100%, 40%);">+   txd->flags = CEMU_DATA_F_PB_AND_TX;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* procedure byte */</span><br><span style="color: hsl(120, 100%, 40%);">+  msgb_put_u8(msg, pb);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* data */</span><br><span style="color: hsl(120, 100%, 40%);">+    cur = msgb_put(msg, data_len_in);</span><br><span style="color: hsl(120, 100%, 40%);">+     memcpy(cur, data, data_len_in);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_TX_DATA);</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 Request the SIMtrace2 to send a Status Word */</span><br><span style="color: hsl(120, 100%, 40%);">+int cardem_request_sw_tx(struct cardem_inst *ci, const uint8_t *sw)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct cardemu_usb_msg_tx_data *txd;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t *cur;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       txd = (struct cardemu_usb_msg_tx_data *) msgb_put(msg, sizeof(*txd));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("<= %s(%02x %02x)\n", __func__, sw[0], sw[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  memset(txd, 0, sizeof(*txd));</span><br><span style="color: hsl(120, 100%, 40%);">+ txd->data_len = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ txd->flags = CEMU_DATA_F_PB_AND_TX | CEMU_DATA_F_FINAL;</span><br><span style="color: hsl(120, 100%, 40%);">+    cur = msgb_put(msg, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+       cur[0] = sw[0];</span><br><span style="color: hsl(120, 100%, 40%);">+       cur[1] = sw[1];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_TX_DATA);</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 cardem_request_set_atr(struct cardem_inst *ci, const uint8_t *atr, unsigned int atr_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct cardemu_usb_msg_set_atr *satr;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t *cur;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       satr = (struct cardemu_usb_msg_set_atr *) msgb_put(msg, sizeof(*satr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("<= %s(%s)\n", __func__, osmo_hexdump(atr, atr_len));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(satr, 0, sizeof(*satr));</span><br><span style="color: hsl(120, 100%, 40%);">+       satr->atr_len = atr_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   cur = msgb_put(msg, atr_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(cur, atr, atr_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_SET_ATR);</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%);">+ * Modem Control protocol</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int _modem_reset(struct st_slot *slot, uint8_t asserted, uint16_t pulse_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct st_modem_reset *sr ;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ sr = (struct st_modem_reset *) msgb_put(msg, sizeof(*sr));</span><br><span style="color: hsl(120, 100%, 40%);">+    sr->asserted = asserted;</span><br><span style="color: hsl(120, 100%, 40%);">+   sr->pulse_duration_msec = pulse_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return st_slot_tx_msg(slot, msg, SIMTRACE_MSGC_MODEM, SIMTRACE_MSGT_DT_MODEM_RESET);</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 pulse the RESET line of the modem for \a duration_ms milli-seconds*/</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_reset_pulse(struct st_slot *slot, uint16_t duration_ms)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return _modem_reset(slot, 2, duration_ms);</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 assert the RESET line of the modem */</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_reset_active(struct st_slot *slot)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return _modem_reset(slot, 1, 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%);">+/*! \brief de-assert the RESET line of the modem */</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_reset_inactive(struct st_slot *slot)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      return _modem_reset(slot, 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%);">+static int _modem_sim_select(struct st_slot *slot, uint8_t remote_sim)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+   struct st_modem_sim_select *ss;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ss = (struct st_modem_sim_select *) msgb_put(msg, sizeof(*ss));</span><br><span style="color: hsl(120, 100%, 40%);">+       ss->remote_sim = remote_sim;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return st_slot_tx_msg(slot, msg, SIMTRACE_MSGC_MODEM, SIMTRACE_MSGT_DT_MODEM_SIM_SELECT);</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 select local (physical) SIM for given slot */</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_sim_select_local(struct st_slot *slot)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      return _modem_sim_select(slot, 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%);">+/*! \brief select remote (emulated/forwarded) SIM for given slot */</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_sim_select_remote(struct st_slot *slot)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return _modem_sim_select(slot, 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%);">+/*! \brief Request slot to send us status information about the modem */</span><br><span style="color: hsl(120, 100%, 40%);">+int st_modem_get_status(struct st_slot *slot)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return st_slot_tx_msg(slot, msg, SIMTRACE_MSGC_MODEM, SIMTRACE_MSGT_BD_MODEM_STATUS);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/host/libosmo-simtrace2.pc.in b/host/libosmo-simtrace2.pc.in</span><br><span>new file mode 100644</span><br><span>index 0000000..6e9f6f2</span><br><span>--- /dev/null</span><br><span>+++ b/host/libosmo-simtrace2.pc.in</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+prefix=@prefix@</span><br><span style="color: hsl(120, 100%, 40%);">+exec_prefix=@exec_prefix@</span><br><span style="color: hsl(120, 100%, 40%);">+libdir=@libdir@</span><br><span style="color: hsl(120, 100%, 40%);">+includedir=@includedir@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Name: Osmocom SIMtrace2 library</span><br><span style="color: hsl(120, 100%, 40%);">+Description: Library for SIM Card / Smart Card tracing + emulation</span><br><span style="color: hsl(120, 100%, 40%);">+Version: @VERSION@</span><br><span style="color: hsl(120, 100%, 40%);">+Libs: -L${libdir} -losmo-simtrace2</span><br><span style="color: hsl(120, 100%, 40%);">+Cflags: -I${includedir}/</span><br><span>diff --git a/host/simtrace.h b/host/simtrace.h</span><br><span>deleted file mode 100644</span><br><span>index c4a20da..0000000</span><br><span>--- a/host/simtrace.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,7 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef _SIMTRACE_H</span><br><span style="color: hsl(0, 100%, 40%);">-#define _SIMTRACE_H</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define SIMTRACE_USB_VENDOR      0x1d50</span><br><span style="color: hsl(0, 100%, 40%);">-#define SIMTRACE_USB_PRODUCT      0x60e3</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>diff --git a/host/simtrace2-remsim.c b/host/simtrace2-remsim.c</span><br><span>deleted file mode 100644</span><br><span>index 918c9fd..0000000</span><br><span>--- a/host/simtrace2-remsim.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,758 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* simtrace2-remsim - main program for the host PC to provide a remote SIM</span><br><span style="color: hsl(0, 100%, 40%);">- * using the SIMtrace 2 firmware in card emulation mode</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2016-2017 by Harald Welte <hwelte@hmw-consulting.de></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(0, 100%, 40%);">- * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(0, 100%, 40%);">- * of the License, or (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(0, 100%, 40%);">- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdint.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <signal.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <time.h></span><br><span style="color: hsl(0, 100%, 40%);">-#define _GNU_SOURCE</span><br><span style="color: hsl(0, 100%, 40%);">-#include <getopt.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/time.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/types.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <sys/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <arpa/inet.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <libusb.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "libusb_util.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace_prot.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "apdu_dispatch.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace2-discovery.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/gsmtap.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/gsmtap_util.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sim/class_tables.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sim/sim.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* transport to a SIMtrace device */</span><br><span style="color: hsl(0, 100%, 40%);">-struct st_transport {</span><br><span style="color: hsl(0, 100%, 40%);">-     /* USB */</span><br><span style="color: hsl(0, 100%, 40%);">-       struct libusb_device_handle *usb_devh;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t in;</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t out;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t irq_in;</span><br><span style="color: hsl(0, 100%, 40%);">- } usb_ep;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* UDP */</span><br><span style="color: hsl(0, 100%, 40%);">-       int udp_fd;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* a SIMtrace slot; communicates over a transport */</span><br><span style="color: hsl(0, 100%, 40%);">-struct st_slot {</span><br><span style="color: hsl(0, 100%, 40%);">-       /* transport through which the slot can be reached */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct st_transport *transp;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* number of the slot within the transport */</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t slot_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* One istance of card emulation */</span><br><span style="color: hsl(0, 100%, 40%);">-struct cardem_inst {</span><br><span style="color: hsl(0, 100%, 40%);">-       /* slot on which this card emulation instance runs */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct st_slot *slot;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* libosmosim SIM card profile */</span><br><span style="color: hsl(0, 100%, 40%);">-       const struct osim_cla_ins_card_profile *card_prof;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* libosmosim SIM card channel */</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osim_chan_hdl *chan;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* global GSMTAP instance */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct gsmtap_inst *g_gti;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsmtap_send_sim(const uint8_t *apdu, unsigned int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsmtap_hdr *gh;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int gross_len = len + sizeof(*gh);</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t *buf = malloc(gross_len);</span><br><span style="color: hsl(0, 100%, 40%);">-       int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!buf)</span><br><span style="color: hsl(0, 100%, 40%);">-               return -ENOMEM;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(buf, 0, sizeof(*gh));</span><br><span style="color: hsl(0, 100%, 40%);">-    gh = (struct gsmtap_hdr *) buf;</span><br><span style="color: hsl(0, 100%, 40%);">- gh->version = GSMTAP_VERSION;</span><br><span style="color: hsl(0, 100%, 40%);">-        gh->hdr_len = sizeof(*gh)/4;</span><br><span style="color: hsl(0, 100%, 40%);">- gh->type = GSMTAP_TYPE_SIM;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(buf + sizeof(*gh), apdu, len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   rc = write(gsmtap_inst_fd(g_gti), buf, gross_len);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                perror("write gsmtap");</span><br><span style="color: hsl(0, 100%, 40%);">-               free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-              return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/***********************************************************************</span><br><span style="color: hsl(0, 100%, 40%);">- * SIMTRACE pcore protocol</span><br><span style="color: hsl(0, 100%, 40%);">- ***********************************************************************/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief allocate a message buffer for simtrace use */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct msgb *st_msgb_alloc(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   return msgb_alloc_headroom(1024+32, 32, "SIMtrace");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span style="color: hsl(0, 100%, 40%);">-static void apdu_out_cb(uint8_t *buf, unsigned int len, void *user_data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   printf("APDU: %s\n", osmo_hexdump(buf, len));</span><br><span style="color: hsl(0, 100%, 40%);">- gsmtap_send_sim(buf, len);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Transmit a given command to the SIMtrace2 device */</span><br><span style="color: hsl(0, 100%, 40%);">-int st_transp_tx_msg(struct st_transport *transp, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("<- %s\n", msgb_hexdump(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (transp->udp_fd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         int xfer_len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = libusb_bulk_transfer(transp->usb_devh, transp->usb_ep.out,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     msgb_data(msg), msgb_length(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                                       &xfer_len, 100000);</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = write(transp->udp_fd, msgb_data(msg), msgb_length(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct simtrace_msg_hdr *st_push_hdr(struct msgb *msg, uint8_t msg_class, uint8_t msg_type,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       uint8_t slot_nr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct simtrace_msg_hdr *sh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    sh = (struct simtrace_msg_hdr *) msgb_push(msg, sizeof(*sh));</span><br><span style="color: hsl(0, 100%, 40%);">-   memset(sh, 0, sizeof(*sh));</span><br><span style="color: hsl(0, 100%, 40%);">-     sh->msg_class = msg_class;</span><br><span style="color: hsl(0, 100%, 40%);">-   sh->msg_type = msg_type;</span><br><span style="color: hsl(0, 100%, 40%);">-     sh->slot_nr = slot_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-       sh->msg_len = msgb_length(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return sh;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* transmit a given message to a specified slot. Expects all headers</span><br><span style="color: hsl(0, 100%, 40%);">- * present before calling the function */</span><br><span style="color: hsl(0, 100%, 40%);">-int st_slot_tx_msg(struct st_slot *slot, struct msgb *msg,</span><br><span style="color: hsl(0, 100%, 40%);">-                 uint8_t msg_class, uint8_t msg_type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        st_push_hdr(msg, msg_class, msg_type, slot->slot_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return st_transp_tx_msg(slot->transp, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/***********************************************************************</span><br><span style="color: hsl(0, 100%, 40%);">- * Card Emulation protocol</span><br><span style="color: hsl(0, 100%, 40%);">- ***********************************************************************/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Request the SIMtrace2 to generate a card-insert signal */</span><br><span style="color: hsl(0, 100%, 40%);">-static int cardem_request_card_insert(struct cardem_inst *ci, bool inserted)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-     struct cardemu_usb_msg_cardinsert *cins;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        cins = (struct cardemu_usb_msg_cardinsert *) msgb_put(msg, sizeof(*cins));</span><br><span style="color: hsl(0, 100%, 40%);">-      memset(cins, 0, sizeof(*cins));</span><br><span style="color: hsl(0, 100%, 40%);">- if (inserted)</span><br><span style="color: hsl(0, 100%, 40%);">-           cins->card_insert = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_CARDINSERT);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Request the SIMtrace2 to transmit a Procedure Byte, then Rx */</span><br><span style="color: hsl(0, 100%, 40%);">-static int cardem_request_pb_and_rx(struct cardem_inst *ci, uint8_t pb, uint8_t le)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-     struct cardemu_usb_msg_tx_data *txd;</span><br><span style="color: hsl(0, 100%, 40%);">-    txd = (struct cardemu_usb_msg_tx_data *) msgb_put(msg, sizeof(*txd));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   printf("<= %s(%02x, %d)\n", __func__, pb, le);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     memset(txd, 0, sizeof(*txd));</span><br><span style="color: hsl(0, 100%, 40%);">-   txd->data_len = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-   txd->flags = CEMU_DATA_F_PB_AND_RX;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* one data byte */</span><br><span style="color: hsl(0, 100%, 40%);">-     msgb_put_u8(msg, pb);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_TX_DATA);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Request the SIMtrace2 to transmit a Procedure Byte, then Tx */</span><br><span style="color: hsl(0, 100%, 40%);">-static int cardem_request_pb_and_tx(struct cardem_inst *ci, uint8_t pb,</span><br><span style="color: hsl(0, 100%, 40%);">-                              const uint8_t *data, uint16_t data_len_in)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-     struct cardemu_usb_msg_tx_data *txd;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t *cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   txd = (struct cardemu_usb_msg_tx_data *) msgb_put(msg, sizeof(*txd));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   printf("<= %s(%02x, %s, %d)\n", __func__, pb,</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_hexdump(data, data_len_in), data_len_in);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  memset(txd, 0, sizeof(*txd));</span><br><span style="color: hsl(0, 100%, 40%);">-   txd->data_len = 1 + data_len_in;</span><br><span style="color: hsl(0, 100%, 40%);">-     txd->flags = CEMU_DATA_F_PB_AND_TX;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* procedure byte */</span><br><span style="color: hsl(0, 100%, 40%);">-    msgb_put_u8(msg, pb);</span><br><span style="color: hsl(0, 100%, 40%);">-   /* data */</span><br><span style="color: hsl(0, 100%, 40%);">-      cur = msgb_put(msg, data_len_in);</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(cur, data, data_len_in);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_TX_DATA);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Request the SIMtrace2 to send a Status Word */</span><br><span style="color: hsl(0, 100%, 40%);">-static int cardem_request_sw_tx(struct cardem_inst *ci, const uint8_t *sw)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-     struct cardemu_usb_msg_tx_data *txd;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t *cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   txd = (struct cardemu_usb_msg_tx_data *) msgb_put(msg, sizeof(*txd));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   printf("<= %s(%02x %02x)\n", __func__, sw[0], sw[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      memset(txd, 0, sizeof(*txd));</span><br><span style="color: hsl(0, 100%, 40%);">-   txd->data_len = 2;</span><br><span style="color: hsl(0, 100%, 40%);">-   txd->flags = CEMU_DATA_F_PB_AND_TX | CEMU_DATA_F_FINAL;</span><br><span style="color: hsl(0, 100%, 40%);">-      cur = msgb_put(msg, 2);</span><br><span style="color: hsl(0, 100%, 40%);">- cur[0] = sw[0];</span><br><span style="color: hsl(0, 100%, 40%);">- cur[1] = sw[1];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_TX_DATA);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void atr_update_csum(uint8_t *atr, unsigned int atr_len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t csum = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 1; i < atr_len - 1; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-            csum = csum ^ atr[i];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   atr[atr_len-1] = csum;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int cardem_request_set_atr(struct cardem_inst *ci, const uint8_t *atr, unsigned int atr_len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-     struct cardemu_usb_msg_set_atr *satr;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t *cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   satr = (struct cardemu_usb_msg_set_atr *) msgb_put(msg, sizeof(*satr));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("<= %s(%s)\n", __func__, osmo_hexdump(atr, atr_len));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       memset(satr, 0, sizeof(*satr));</span><br><span style="color: hsl(0, 100%, 40%);">- satr->atr_len = atr_len;</span><br><span style="color: hsl(0, 100%, 40%);">-     cur = msgb_put(msg, atr_len);</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(cur, atr, atr_len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return st_slot_tx_msg(ci->slot, msg, SIMTRACE_MSGC_CARDEM, SIMTRACE_MSGT_DT_CEMU_SET_ATR);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/***********************************************************************</span><br><span style="color: hsl(0, 100%, 40%);">- * Modem Control protocol</span><br><span style="color: hsl(0, 100%, 40%);">- ***********************************************************************/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int _modem_reset(struct st_slot *slot, uint8_t asserted, uint16_t pulse_ms)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-     struct st_modem_reset *sr ;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     sr = (struct st_modem_reset *) msgb_put(msg, sizeof(*sr));</span><br><span style="color: hsl(0, 100%, 40%);">-      sr->asserted = asserted;</span><br><span style="color: hsl(0, 100%, 40%);">-     sr->pulse_duration_msec = pulse_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return st_slot_tx_msg(slot, msg, SIMTRACE_MSGC_MODEM, SIMTRACE_MSGT_DT_MODEM_RESET);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief pulse the RESET line of the modem for \a duration_ms milli-seconds*/</span><br><span style="color: hsl(0, 100%, 40%);">-int st_modem_reset_pulse(struct st_slot *slot, uint16_t duration_ms)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       return _modem_reset(slot, 2, duration_ms);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief assert the RESET line of the modem */</span><br><span style="color: hsl(0, 100%, 40%);">-int st_modem_reset_active(struct st_slot *slot)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return _modem_reset(slot, 1, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief de-assert the RESET line of the modem */</span><br><span style="color: hsl(0, 100%, 40%);">-int st_modem_reset_inactive(struct st_slot *slot)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return _modem_reset(slot, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int _modem_sim_select(struct st_slot *slot, uint8_t remote_sim)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-     struct st_modem_sim_select *ss;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ss = (struct st_modem_sim_select *) msgb_put(msg, sizeof(*ss));</span><br><span style="color: hsl(0, 100%, 40%);">- ss->remote_sim = remote_sim;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return st_slot_tx_msg(slot, msg, SIMTRACE_MSGC_MODEM, SIMTRACE_MSGT_DT_MODEM_SIM_SELECT);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief select local (physical) SIM for given slot */</span><br><span style="color: hsl(0, 100%, 40%);">-int st_modem_sim_select_local(struct st_slot *slot)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return _modem_sim_select(slot, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief select remote (emulated/forwarded) SIM for given slot */</span><br><span style="color: hsl(0, 100%, 40%);">-int st_modem_sim_select_remote(struct st_slot *slot)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return _modem_sim_select(slot, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Request slot to send us status information about the modem */</span><br><span style="color: hsl(0, 100%, 40%);">-int st_modem_get_status(struct st_slot *slot)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct msgb *msg = st_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return st_slot_tx_msg(slot, msg, SIMTRACE_MSGC_MODEM, SIMTRACE_MSGT_BD_MODEM_STATUS);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/***********************************************************************</span><br><span style="color: hsl(0, 100%, 40%);">- * Incoming Messages</span><br><span style="color: hsl(0, 100%, 40%);">- ***********************************************************************/</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Process a STATUS message from the SIMtrace2 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int process_do_status(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct cardemu_usb_msg_status *status;</span><br><span style="color: hsl(0, 100%, 40%);">-  status = (struct cardemu_usb_msg_status *) buf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("=> STATUS: flags=0x%x, fi=%u, di=%u, wi=%u wtime=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-            status->flags, status->fi, status->di, status->wi,</span><br><span style="color: hsl(0, 100%, 40%);">-          status->waiting_time);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Process a PTS indication message from the SIMtrace2 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int process_do_pts(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct cardemu_usb_msg_pts_info *pts;</span><br><span style="color: hsl(0, 100%, 40%);">-   pts = (struct cardemu_usb_msg_pts_info *) buf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  printf("=> PTS req: %s\n", osmo_hexdump(pts->req, sizeof(pts->req)));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Process a RX-DATA indication message from the SIMtrace2 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int process_do_rx_da(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      static struct apdu_context ac;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct cardemu_usb_msg_rx_data *data;</span><br><span style="color: hsl(0, 100%, 40%);">-   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- data = (struct cardemu_usb_msg_rx_data *) buf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  printf("=> DATA: flags=%x, %s: ", data->flags,</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_hexdump(data->data, data->data_len));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = apdu_segment_in(&ac, data->data, data->data_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                      data->flags & CEMU_DATA_F_TPDU_HDR);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (rc & APDU_ACT_TX_CAPDU_TO_CARD) {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct msgb *tmsg = msgb_alloc(1024, "TPDU");</span><br><span style="color: hsl(0, 100%, 40%);">-         struct osim_reader_hdl *rh = ci->chan->card->reader;</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t *cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Copy TPDU header */</span><br><span style="color: hsl(0, 100%, 40%);">-          cur = msgb_put(tmsg, sizeof(ac.hdr));</span><br><span style="color: hsl(0, 100%, 40%);">-           memcpy(cur, &ac.hdr, sizeof(ac.hdr));</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Copy D(c), if any */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (ac.lc.tot) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        cur = msgb_put(tmsg, ac.lc.tot);</span><br><span style="color: hsl(0, 100%, 40%);">-                        memcpy(cur, ac.dc, ac.lc.tot);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               /* send to actual card */</span><br><span style="color: hsl(0, 100%, 40%);">-               tmsg->l3h = tmsg->tail;</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = rh->ops->transceive(rh, tmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-               if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        fprintf(stderr, "error during transceive: %d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-                 msgb_free(tmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-                        return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               msgb_apdu_sw(tmsg) = msgb_get_u16(tmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-                ac.sw[0] = msgb_apdu_sw(tmsg) >> 8;</span><br><span style="color: hsl(0, 100%, 40%);">-               ac.sw[1] = msgb_apdu_sw(tmsg) & 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("SW=0x%04x, len_rx=%d\n", msgb_apdu_sw(tmsg), msgb_l3len(tmsg));</span><br><span style="color: hsl(0, 100%, 40%);">-               if (msgb_l3len(tmsg))</span><br><span style="color: hsl(0, 100%, 40%);">-                   cardem_request_pb_and_tx(ci, ac.hdr.ins, tmsg->l3h, msgb_l3len(tmsg));</span><br><span style="color: hsl(0, 100%, 40%);">-               cardem_request_sw_tx(ci, ac.sw);</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (ac.lc.tot > ac.lc.cur) {</span><br><span style="color: hsl(0, 100%, 40%);">-          cardem_request_pb_and_rx(ci, ac.hdr.ins, ac.lc.tot - ac.lc.cur);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Process an incoming message from the SIMtrace2 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int process_usb_msg(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        struct simtrace_msg_hdr *sh = (struct simtrace_msg_hdr *)buf;</span><br><span style="color: hsl(0, 100%, 40%);">-   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("-> %s\n", osmo_hexdump(buf, len));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- buf += sizeof(*sh);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     switch (sh->msg_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-      case SIMTRACE_MSGT_BD_CEMU_STATUS:</span><br><span style="color: hsl(0, 100%, 40%);">-              rc = process_do_status(ci, buf, len);</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case SIMTRACE_MSGT_DO_CEMU_PTS:</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = process_do_pts(ci, buf, len);</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case SIMTRACE_MSGT_DO_CEMU_RX_DATA:</span><br><span style="color: hsl(0, 100%, 40%);">-             rc = process_do_rx_da(ci, buf, len);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("unknown simtrace msg type 0x%02x\n", sh->msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_welcome(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     printf("simtrace2-remsim - Remote SIM card forwarding\n"</span><br><span style="color: hsl(0, 100%, 40%);">-             "(C) 2010-2017, Harald Welte <laforge@gnumonks.org>\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "(C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de>\n\n");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_help(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        printf( "\t-r\t--remote-udp-host HOST\n"</span><br><span style="color: hsl(0, 100%, 40%);">-              "\t-p\t--remote-udp-port PORT\n"</span><br><span style="color: hsl(0, 100%, 40%);">-              "\t-h\t--help\n"</span><br><span style="color: hsl(0, 100%, 40%);">-              "\t-i\t--gsmtap-ip\tA.B.C.D\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                "\t-a\t--skip-atr\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "\t-k\t--keep-running\n"</span><br><span style="color: hsl(0, 100%, 40%);">-              "\t-V\t--usb-vendor\tVENDOR_ID\n"</span><br><span style="color: hsl(0, 100%, 40%);">-             "\t-P\t--usb-product\tPRODUCT_ID\n"</span><br><span style="color: hsl(0, 100%, 40%);">-           "\t-C\t--usb-config\tCONFIG_ID\n"</span><br><span style="color: hsl(0, 100%, 40%);">-             "\t-I\t--usb-interface\tINTERFACE_ID\n"</span><br><span style="color: hsl(0, 100%, 40%);">-               "\t-S\t--usb-altsetting ALTSETTING_ID\n"</span><br><span style="color: hsl(0, 100%, 40%);">-              "\t-A\t--usb-address\tADDRESS\n"</span><br><span style="color: hsl(0, 100%, 40%);">-              "\t-H\t--usb-path\tPATH\n"</span><br><span style="color: hsl(0, 100%, 40%);">-            "\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          );</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct option opts[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        { "remote-udp-host", 1, 0, 'r' },</span><br><span style="color: hsl(0, 100%, 40%);">-     { "remote-udp-port", 1, 0, 'p' },</span><br><span style="color: hsl(0, 100%, 40%);">-     { "gsmtap-ip", 1, 0, 'i' },</span><br><span style="color: hsl(0, 100%, 40%);">-   { "skip-atr", 0, 0, 'a' },</span><br><span style="color: hsl(0, 100%, 40%);">-    { "help", 0, 0, 'h' },</span><br><span style="color: hsl(0, 100%, 40%);">-        { "keep-running", 0, 0, 'k' },</span><br><span style="color: hsl(0, 100%, 40%);">-        { "usb-vendor", 1, 0, 'V' },</span><br><span style="color: hsl(0, 100%, 40%);">-  { "usb-product", 1, 0, 'P' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "usb-config", 1, 0, 'C' },</span><br><span style="color: hsl(0, 100%, 40%);">-  { "usb-interface", 1, 0, 'I' },</span><br><span style="color: hsl(0, 100%, 40%);">-       { "usb-altsetting", 1, 0, 'S' },</span><br><span style="color: hsl(0, 100%, 40%);">-      { "usb-address", 1, 0, 'A' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "usb-path", 1, 0, 'H' },</span><br><span style="color: hsl(0, 100%, 40%);">-    { NULL, 0, 0, 0 }</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void run_mainloop(struct cardem_inst *ci)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct st_transport *transp = ci->slot->transp;</span><br><span style="color: hsl(0, 100%, 40%);">-   unsigned int msg_count, byte_count = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t buf[16*265];</span><br><span style="color: hsl(0, 100%, 40%);">-    int xfer_len;</span><br><span style="color: hsl(0, 100%, 40%);">-   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Entering main loop\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* read data from SIMtrace2 device (local or via USB) */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (transp->udp_fd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 rc = libusb_bulk_transfer(transp->usb_devh, transp->usb_ep.in,</span><br><span style="color: hsl(0, 100%, 40%);">-                                              buf, sizeof(buf), &xfer_len, 100);</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (rc < 0 && rc != LIBUSB_ERROR_TIMEOUT &&</span><br><span style="color: hsl(0, 100%, 40%);">-                                rc != LIBUSB_ERROR_INTERRUPTED &&</span><br><span style="color: hsl(0, 100%, 40%);">-                               rc != LIBUSB_ERROR_IO) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          fprintf(stderr, "BULK IN transfer error; rc=%d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-                               return;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        rc = read(transp->udp_fd, buf, sizeof(buf));</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (rc <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               fprintf(stderr, "shor read from UDP\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                              return;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-                       xfer_len = rc;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               /* dispatch any incoming data */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (xfer_len > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  printf("URB: %s\n", osmo_hexdump(buf, xfer_len));</span><br><span style="color: hsl(0, 100%, 40%);">-                     process_usb_msg(ci, buf, xfer_len);</span><br><span style="color: hsl(0, 100%, 40%);">-                     msg_count++;</span><br><span style="color: hsl(0, 100%, 40%);">-                    byte_count += xfer_len;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct st_transport _transp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct st_slot _slot = {</span><br><span style="color: hsl(0, 100%, 40%);">-    .transp = &_transp,</span><br><span style="color: hsl(0, 100%, 40%);">- .slot_nr = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct cardem_inst _ci = {</span><br><span style="color: hsl(0, 100%, 40%);">-       .slot = &_slot,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct cardem_inst *ci = &_ci;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void signal_handler(int signal)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (signal) {</span><br><span style="color: hsl(0, 100%, 40%);">-       case SIGINT:</span><br><span style="color: hsl(0, 100%, 40%);">-            cardem_request_card_insert(ci, false);</span><br><span style="color: hsl(0, 100%, 40%);">-          exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct st_transport *transp = ci->slot->transp;</span><br><span style="color: hsl(0, 100%, 40%);">-   char *gsmtap_host = "127.0.0.1";</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- int c, ret = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- int skip_atr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       int keep_running = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   int remote_udp_port = 52342;</span><br><span style="color: hsl(0, 100%, 40%);">-    int if_num = 0, vendor_id = -1, product_id = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        int config_id = -1, altsetting = 0, addr = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-  char *remote_udp_host = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   char *path = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct osim_reader_hdl *reader;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osim_card_hdl *card;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     print_welcome();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             int option_index = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           c = getopt_long(argc, argv, "r:p:hi:V:P:C:I:S:A:H:ak", opts, &option_index);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (c == -1)</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          switch (c) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case 'r':</span><br><span style="color: hsl(0, 100%, 40%);">-                       remote_udp_host = optarg;</span><br><span style="color: hsl(0, 100%, 40%);">-                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'p':</span><br><span style="color: hsl(0, 100%, 40%);">-                       remote_udp_port = atoi(optarg);</span><br><span style="color: hsl(0, 100%, 40%);">-                 break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'h':</span><br><span style="color: hsl(0, 100%, 40%);">-                       print_help();</span><br><span style="color: hsl(0, 100%, 40%);">-                   exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-                        break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'i':</span><br><span style="color: hsl(0, 100%, 40%);">-                       gsmtap_host = optarg;</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'a':</span><br><span style="color: hsl(0, 100%, 40%);">-                       skip_atr = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'k':</span><br><span style="color: hsl(0, 100%, 40%);">-                       keep_running = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'V':</span><br><span style="color: hsl(0, 100%, 40%);">-                       vendor_id = strtol(optarg, NULL, 16);</span><br><span style="color: hsl(0, 100%, 40%);">-                   break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'P':</span><br><span style="color: hsl(0, 100%, 40%);">-                       product_id = strtol(optarg, NULL, 16);</span><br><span style="color: hsl(0, 100%, 40%);">-                  break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'C':</span><br><span style="color: hsl(0, 100%, 40%);">-                       config_id = atoi(optarg);</span><br><span style="color: hsl(0, 100%, 40%);">-                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'I':</span><br><span style="color: hsl(0, 100%, 40%);">-                       if_num = atoi(optarg);</span><br><span style="color: hsl(0, 100%, 40%);">-                  break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'S':</span><br><span style="color: hsl(0, 100%, 40%);">-                       altsetting = atoi(optarg);</span><br><span style="color: hsl(0, 100%, 40%);">-                      break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'A':</span><br><span style="color: hsl(0, 100%, 40%);">-                       addr = atoi(optarg);</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case 'H':</span><br><span style="color: hsl(0, 100%, 40%);">-                       path = optarg;</span><br><span style="color: hsl(0, 100%, 40%);">-                  break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!remote_udp_host && (vendor_id < 0 || product_id < 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "You have to specify the vendor and product ID\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           goto do_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       transp->udp_fd = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ci->card_prof = &osim_uicc_sim_cic_profile;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!remote_udp_host) {</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = libusb_init(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        fprintf(stderr, "libusb initialization failed\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                    goto do_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                transp->udp_fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            remote_udp_host, remote_udp_port+if_num,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                OSMO_SOCK_F_CONNECT);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (transp->udp_fd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 fprintf(stderr, "error binding UDP port\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  goto do_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       g_gti = gsmtap_source_init(gsmtap_host, GSMTAP_UDP_PORT, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!g_gti) {</span><br><span style="color: hsl(0, 100%, 40%);">-           perror("unable to open GSMTAP");</span><br><span style="color: hsl(0, 100%, 40%);">-              goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       gsmtap_source_add_sink(g_gti);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  reader = osim_reader_open(OSIM_READER_DRV_PCSC, 0, "", NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!reader) {</span><br><span style="color: hsl(0, 100%, 40%);">-          perror("unable to open PC/SC reader");</span><br><span style="color: hsl(0, 100%, 40%);">-                goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       card = osim_card_open(reader, OSIM_PROTO_T0);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!card) {</span><br><span style="color: hsl(0, 100%, 40%);">-            perror("unable to open SIM card");</span><br><span style="color: hsl(0, 100%, 40%);">-            goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ci->chan = llist_entry(card->channels.next, struct osim_chan_hdl, list);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!ci->chan) {</span><br><span style="color: hsl(0, 100%, 40%);">-             perror("SIM card has no channel?!?");</span><br><span style="color: hsl(0, 100%, 40%);">-         goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       signal(SIGINT, &signal_handler);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    do {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (transp->udp_fd < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 struct usb_interface_match _ifm, *ifm = &_ifm;</span><br><span style="color: hsl(0, 100%, 40%);">-                      ifm->vendor = vendor_id;</span><br><span style="color: hsl(0, 100%, 40%);">-                     ifm->product = product_id;</span><br><span style="color: hsl(0, 100%, 40%);">-                   ifm->configuration = config_id;</span><br><span style="color: hsl(0, 100%, 40%);">-                      ifm->interface = if_num;</span><br><span style="color: hsl(0, 100%, 40%);">-                     ifm->altsetting = altsetting;</span><br><span style="color: hsl(0, 100%, 40%);">-                        ifm->addr = addr;</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (path)</span><br><span style="color: hsl(0, 100%, 40%);">-                               osmo_strlcpy(ifm->path, path, sizeof(ifm->path));</span><br><span style="color: hsl(0, 100%, 40%);">-                 transp->usb_devh = usb_open_claim_interface(NULL, ifm);</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (!transp->usb_devh) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             fprintf(stderr, "can't open USB device\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                               goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       rc = libusb_claim_interface(transp->usb_devh, if_num);</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                fprintf(stderr, "can't claim interface %d; rc=%d\n", if_num, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-                         goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       rc = get_usb_ep_addrs(transp->usb_devh, if_num, &transp->usb_ep.out,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        &transp->usb_ep.in, &transp->usb_ep.irq_in);</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">-                            goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* simulate card-insert to modem (owhw, not qmod) */</span><br><span style="color: hsl(0, 100%, 40%);">-            cardem_request_card_insert(ci, true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           /* select remote (forwarded) SIM */</span><br><span style="color: hsl(0, 100%, 40%);">-             st_modem_sim_select_remote(ci->slot);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!skip_atr) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* set the ATR */</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint8_t real_atr[] = {  0x3B, 0x9F, 0x96, 0x80, 0x1F, 0xC7, 0x80, 0x31,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         0xA0, 0x73, 0xBE, 0x21, 0x13, 0x67, 0x43, 0x20,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         0x07, 0x18, 0x00, 0x00, 0x01, 0xA5 };</span><br><span style="color: hsl(0, 100%, 40%);">-                   atr_update_csum(real_atr, sizeof(real_atr));</span><br><span style="color: hsl(0, 100%, 40%);">-                    cardem_request_set_atr(ci, real_atr, sizeof(real_atr));</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* select remote (forwarded) SIM */</span><br><span style="color: hsl(0, 100%, 40%);">-             st_modem_reset_pulse(ci->slot, 300);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         run_mainloop(ci);</span><br><span style="color: hsl(0, 100%, 40%);">-               ret = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                if (transp->udp_fd < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                   libusb_release_interface(transp->usb_devh, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-close_exit:</span><br><span style="color: hsl(0, 100%, 40%);">-            if (transp->usb_devh)</span><br><span style="color: hsl(0, 100%, 40%);">-                        libusb_close(transp->usb_devh);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (keep_running)</span><br><span style="color: hsl(0, 100%, 40%);">-                       sleep(1);</span><br><span style="color: hsl(0, 100%, 40%);">-       } while (keep_running);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (transp->udp_fd < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-           libusb_exit(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-do_exit:</span><br><span style="color: hsl(0, 100%, 40%);">-      return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/host/simtrace_prot.h b/host/simtrace_prot.h</span><br><span>deleted file mode 120000</span><br><span>index a9fffe1..0000000</span><br><span>--- a/host/simtrace_prot.h</span><br><span>+++ /dev/null</span><br><span>@@ -1 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-../firmware/libcommon/include/simtrace_prot.h</span><br><span>\ No newline at end of file</span><br><span>diff --git a/host/simtrace_usb.h b/host/simtrace_usb.h</span><br><span>deleted file mode 120000</span><br><span>index f1e0982..0000000</span><br><span>--- a/host/simtrace_usb.h</span><br><span>+++ /dev/null</span><br><span>@@ -1 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-../firmware/libcommon/include/simtrace_usb.h</span><br><span>\ No newline at end of file</span><br><span>diff --git a/host/src/Makefile.am b/host/src/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..b0f1f91</span><br><span>--- /dev/null</span><br><span>+++ b/host/src/Makefile.am</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS=-Wall -g $(LIBOSMOCORE_CFLAGS) $(LIBOSMOSIM_CFLAGS) $(LIBUSB_CFLAGS) $(COVERAGE_FLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+AM_LDFLAGS=$(COVERAGE_LDFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+LDADD= $(top_builddir)/lib/libosmo-simtrace2.la \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOCORE_LIBS) $(LIBOSMOSIM_LIBS) $(LIBUSB_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_HEADERS = simtrace2-discovery.h</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS = simtrace2-remsim simtrace2-remsim-usb2udp simtrace2-list simtrace2-sniff</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+simtrace2_remsim_SOURCES = simtrace2-remsim.c simtrace2-discovery.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+simtrace2_remsim_usb2udp_SOURCES = usb2udp.c simtrace2-discovery.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+simtrace2_list_SOURCES = simtrace2_usb.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+simtrace2_sniff_SOURCES = simtrace2-sniff.c simtrace2-discovery.c</span><br><span>diff --git a/host/simtrace2-discovery.c b/host/src/simtrace2-discovery.c</span><br><span>similarity index 100%</span><br><span>rename from host/simtrace2-discovery.c</span><br><span>rename to host/src/simtrace2-discovery.c</span><br><span>diff --git a/host/simtrace2-discovery.h b/host/src/simtrace2-discovery.h</span><br><span>similarity index 100%</span><br><span>rename from host/simtrace2-discovery.h</span><br><span>rename to host/src/simtrace2-discovery.h</span><br><span>diff --git a/host/src/simtrace2-remsim.c b/host/src/simtrace2-remsim.c</span><br><span>new file mode 100644</span><br><span>index 0000000..c76e587</span><br><span>--- /dev/null</span><br><span>+++ b/host/src/simtrace2-remsim.c</span><br><span>@@ -0,0 +1,463 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* simtrace2-remsim - main program for the host PC to provide a remote SIM</span><br><span style="color: hsl(120, 100%, 40%);">+ * using the SIMtrace 2 firmware in card emulation mode</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2016-2017 by Harald Welte <hwelte@hmw-consulting.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></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</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (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, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</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%);">+#include <unistd.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 <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></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 <sys/time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arpa/inet.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <libusb.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/libusb_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace2_api.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace_prot.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/apdu_dispatch.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/gsmtap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "simtrace2-discovery.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/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sim/class_tables.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sim/sim.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void atr_update_csum(uint8_t *atr, unsigned int atr_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t csum = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 1; i < atr_len - 1; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+          csum = csum ^ atr[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       atr[atr_len-1] = csum;</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%);">+ * Incoming Messages</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 Process a STATUS message from the SIMtrace2 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int process_do_status(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct cardemu_usb_msg_status *status;</span><br><span style="color: hsl(120, 100%, 40%);">+        status = (struct cardemu_usb_msg_status *) buf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("=> STATUS: flags=0x%x, fi=%u, di=%u, wi=%u wtime=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          status->flags, status->fi, status->di, status->wi,</span><br><span style="color: hsl(120, 100%, 40%);">+                status->waiting_time);</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%);">+/*! \brief Process a PTS indication message from the SIMtrace2 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int process_do_pts(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct cardemu_usb_msg_pts_info *pts;</span><br><span style="color: hsl(120, 100%, 40%);">+ pts = (struct cardemu_usb_msg_pts_info *) buf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("=> PTS req: %s\n", osmo_hexdump(pts->req, sizeof(pts->req)));</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%);">+/*! \brief Process a RX-DATA indication message from the SIMtrace2 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int process_do_rx_da(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  static struct apdu_context ac;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct cardemu_usb_msg_rx_data *data;</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%);">+     data = (struct cardemu_usb_msg_rx_data *) buf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("=> DATA: flags=%x, %s: ", data->flags,</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_hexdump(data->data, data->data_len));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = apdu_segment_in(&ac, data->data, data->data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                            data->flags & CEMU_DATA_F_TPDU_HDR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc & APDU_ACT_TX_CAPDU_TO_CARD) {</span><br><span style="color: hsl(120, 100%, 40%);">+             struct msgb *tmsg = msgb_alloc(1024, "TPDU");</span><br><span style="color: hsl(120, 100%, 40%);">+               struct osim_reader_hdl *rh = ci->chan->card->reader;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t *cur;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Copy TPDU header */</span><br><span style="color: hsl(120, 100%, 40%);">+                cur = msgb_put(tmsg, sizeof(ac.hdr));</span><br><span style="color: hsl(120, 100%, 40%);">+         memcpy(cur, &ac.hdr, sizeof(ac.hdr));</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Copy D(c), if any */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (ac.lc.tot) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      cur = msgb_put(tmsg, ac.lc.tot);</span><br><span style="color: hsl(120, 100%, 40%);">+                      memcpy(cur, ac.dc, ac.lc.tot);</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* send to actual card */</span><br><span style="color: hsl(120, 100%, 40%);">+             tmsg->l3h = tmsg->tail;</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = rh->ops->transceive(rh, tmsg);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "error during transceive: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                       msgb_free(tmsg);</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%);">+             msgb_apdu_sw(tmsg) = msgb_get_u16(tmsg);</span><br><span style="color: hsl(120, 100%, 40%);">+              ac.sw[0] = msgb_apdu_sw(tmsg) >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+             ac.sw[1] = msgb_apdu_sw(tmsg) & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("SW=0x%04x, len_rx=%d\n", msgb_apdu_sw(tmsg), msgb_l3len(tmsg));</span><br><span style="color: hsl(120, 100%, 40%);">+             if (msgb_l3len(tmsg))</span><br><span style="color: hsl(120, 100%, 40%);">+                 cardem_request_pb_and_tx(ci, ac.hdr.ins, tmsg->l3h, msgb_l3len(tmsg));</span><br><span style="color: hsl(120, 100%, 40%);">+             cardem_request_sw_tx(ci, ac.sw);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (ac.lc.tot > ac.lc.cur) {</span><br><span style="color: hsl(120, 100%, 40%);">+                cardem_request_pb_and_rx(ci, ac.hdr.ins, ac.lc.tot - ac.lc.cur);</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%);">+/*! \brief Process an incoming message from the SIMtrace2 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int process_usb_msg(struct cardem_inst *ci, uint8_t *buf, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct simtrace_msg_hdr *sh = (struct simtrace_msg_hdr *)buf;</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%);">+     printf("-> %s\n", osmo_hexdump(buf, len));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     buf += sizeof(*sh);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (sh->msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case SIMTRACE_MSGT_BD_CEMU_STATUS:</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = process_do_status(ci, buf, len);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIMTRACE_MSGT_DO_CEMU_PTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = process_do_pts(ci, buf, len);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIMTRACE_MSGT_DO_CEMU_RX_DATA:</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = process_do_rx_da(ci, buf, len);</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%);">+              printf("unknown simtrace msg type 0x%02x\n", sh->msg_type);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = -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%);">+</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%);">+static void print_welcome(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("simtrace2-remsim - Remote SIM card forwarding\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "(C) 2010-2017, Harald Welte <laforge@gnumonks.org>\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "(C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de>\n\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(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf( "\t-r\t--remote-udp-host HOST\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "\t-p\t--remote-udp-port PORT\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "\t-h\t--help\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "\t-i\t--gsmtap-ip\tA.B.C.D\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "\t-a\t--skip-atr\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                "\t-k\t--keep-running\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "\t-V\t--usb-vendor\tVENDOR_ID\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "\t-P\t--usb-product\tPRODUCT_ID\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "\t-C\t--usb-config\tCONFIG_ID\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "\t-I\t--usb-interface\tINTERFACE_ID\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "\t-S\t--usb-altsetting ALTSETTING_ID\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "\t-A\t--usb-address\tADDRESS\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "\t-H\t--usb-path\tPATH\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "\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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct option opts[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        { "remote-udp-host", 1, 0, 'r' },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "remote-udp-port", 1, 0, 'p' },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "gsmtap-ip", 1, 0, 'i' },</span><br><span style="color: hsl(120, 100%, 40%);">+ { "skip-atr", 0, 0, 'a' },</span><br><span style="color: hsl(120, 100%, 40%);">+  { "help", 0, 0, 'h' },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "keep-running", 0, 0, 'k' },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "usb-vendor", 1, 0, 'V' },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "usb-product", 1, 0, 'P' },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "usb-config", 1, 0, 'C' },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "usb-interface", 1, 0, 'I' },</span><br><span style="color: hsl(120, 100%, 40%);">+     { "usb-altsetting", 1, 0, 'S' },</span><br><span style="color: hsl(120, 100%, 40%);">+    { "usb-address", 1, 0, 'A' },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "usb-path", 1, 0, 'H' },</span><br><span style="color: hsl(120, 100%, 40%);">+  { NULL, 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%);">+static void run_mainloop(struct cardem_inst *ci)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct st_transport *transp = ci->slot->transp;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int msg_count, byte_count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t buf[16*265];</span><br><span style="color: hsl(120, 100%, 40%);">+  int xfer_len;</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%);">+     printf("Entering main loop\n");</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%);">+           /* read data from SIMtrace2 device (local or via USB) */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (transp->udp_fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       rc = libusb_bulk_transfer(transp->usb_devh, transp->usb_ep.in,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            buf, sizeof(buf), &xfer_len, 100);</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (rc < 0 && rc != LIBUSB_ERROR_TIMEOUT &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                      rc != LIBUSB_ERROR_INTERRUPTED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                     rc != LIBUSB_ERROR_IO) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                fprintf(stderr, "BULK IN transfer error; rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                             return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rc = read(transp->udp_fd, buf, sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (rc <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             fprintf(stderr, "shor read from UDP\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                            return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     xfer_len = rc;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* dispatch any incoming data */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (xfer_len > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf("URB: %s\n", osmo_hexdump(buf, xfer_len));</span><br><span style="color: hsl(120, 100%, 40%);">+                   process_usb_msg(ci, buf, xfer_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg_count++;</span><br><span style="color: hsl(120, 100%, 40%);">+                  byte_count += xfer_len;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct st_transport _transp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct st_slot _slot = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .transp = &_transp,</span><br><span style="color: hsl(120, 100%, 40%);">+       .slot_nr = 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%);">+struct cardem_inst _ci = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .slot = &_slot,</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%);">+struct cardem_inst *ci = &_ci;</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%);">+    switch (signal) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case SIGINT:</span><br><span style="color: hsl(120, 100%, 40%);">+          cardem_request_card_insert(ci, false);</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%);">+        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%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct st_transport *transp = ci->slot->transp;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *gsmtap_host = "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       int c, ret = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+       int skip_atr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int keep_running = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ int remote_udp_port = 52342;</span><br><span style="color: hsl(120, 100%, 40%);">+  int if_num = 0, vendor_id = -1, product_id = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+      int config_id = -1, altsetting = 0, addr = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *remote_udp_host = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *path = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osim_reader_hdl *reader;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osim_card_hdl *card;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ print_welcome();</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;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               c = getopt_long(argc, argv, "r:p:hi:V:P:C:I:S:A:H:ak", opts, &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%);">+                switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case 'r':</span><br><span style="color: hsl(120, 100%, 40%);">+                     remote_udp_host = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'p':</span><br><span style="color: hsl(120, 100%, 40%);">+                     remote_udp_port = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'h':</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%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'i':</span><br><span style="color: hsl(120, 100%, 40%);">+                     gsmtap_host = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'a':</span><br><span style="color: hsl(120, 100%, 40%);">+                     skip_atr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'k':</span><br><span style="color: hsl(120, 100%, 40%);">+                     keep_running = 1;</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%);">+                     vendor_id = strtol(optarg, NULL, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'P':</span><br><span style="color: hsl(120, 100%, 40%);">+                     product_id = strtol(optarg, NULL, 16);</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_id = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'I':</span><br><span style="color: hsl(120, 100%, 40%);">+                     if_num = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'S':</span><br><span style="color: hsl(120, 100%, 40%);">+                     altsetting = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'A':</span><br><span style="color: hsl(120, 100%, 40%);">+                     addr = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'H':</span><br><span style="color: hsl(120, 100%, 40%);">+                     path = optarg;</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%);">+   if (!remote_udp_host && (vendor_id < 0 || product_id < 0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "You have to specify the vendor and product ID\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         goto do_exit;</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%);">+   transp->udp_fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ci->card_prof = &osim_uicc_sim_cic_profile;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!remote_udp_host) {</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = libusb_init(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "libusb initialization failed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                  goto do_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              transp->udp_fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          remote_udp_host, remote_udp_port+if_num,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              OSMO_SOCK_F_CONNECT);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (transp->udp_fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       fprintf(stderr, "error binding UDP port\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                        goto do_exit;</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 = osmo_st2_gsmtap_init(gsmtap_host);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              perror("unable to open GSMTAP");</span><br><span style="color: hsl(120, 100%, 40%);">+            goto close_exit;</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%);">+   reader = osim_reader_open(OSIM_READER_DRV_PCSC, 0, "", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!reader) {</span><br><span style="color: hsl(120, 100%, 40%);">+                perror("unable to open PC/SC reader");</span><br><span style="color: hsl(120, 100%, 40%);">+              goto close_exit;</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%);">+   card = osim_card_open(reader, OSIM_PROTO_T0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!card) {</span><br><span style="color: hsl(120, 100%, 40%);">+          perror("unable to open SIM card");</span><br><span style="color: hsl(120, 100%, 40%);">+          goto close_exit;</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%);">+   ci->chan = llist_entry(card->channels.next, struct osim_chan_hdl, list);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!ci->chan) {</span><br><span style="color: hsl(120, 100%, 40%);">+           perror("SIM card has no channel?!?");</span><br><span style="color: hsl(120, 100%, 40%);">+               goto close_exit;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        do {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (transp->udp_fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       struct usb_interface_match _ifm, *ifm = &_ifm;</span><br><span style="color: hsl(120, 100%, 40%);">+                    ifm->vendor = vendor_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                   ifm->product = product_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                 ifm->configuration = config_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                    ifm->interface = if_num;</span><br><span style="color: hsl(120, 100%, 40%);">+                   ifm->altsetting = altsetting;</span><br><span style="color: hsl(120, 100%, 40%);">+                      ifm->addr = addr;</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (path)</span><br><span style="color: hsl(120, 100%, 40%);">+                             osmo_strlcpy(ifm->path, path, sizeof(ifm->path));</span><br><span style="color: hsl(120, 100%, 40%);">+                       transp->usb_devh = usb_open_claim_interface(NULL, ifm);</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!transp->usb_devh) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           fprintf(stderr, "can't open USB device\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                             goto close_exit;</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 = libusb_claim_interface(transp->usb_devh, if_num);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              fprintf(stderr, "can't claim interface %d; rc=%d\n", if_num, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                               goto close_exit;</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 = get_usb_ep_addrs(transp->usb_devh, if_num, &transp->usb_ep.out,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              &transp->usb_ep.in, &transp->usb_ep.irq_in);</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                          goto close_exit;</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%);">+           /* simulate card-insert to modem (owhw, not qmod) */</span><br><span style="color: hsl(120, 100%, 40%);">+          cardem_request_card_insert(ci, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* select remote (forwarded) SIM */</span><br><span style="color: hsl(120, 100%, 40%);">+           st_modem_sim_select_remote(ci->slot);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!skip_atr) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* set the ATR */</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint8_t real_atr[] = {  0x3B, 0x9F, 0x96, 0x80, 0x1F, 0xC7, 0x80, 0x31,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               0xA0, 0x73, 0xBE, 0x21, 0x13, 0x67, 0x43, 0x20,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               0x07, 0x18, 0x00, 0x00, 0x01, 0xA5 };</span><br><span style="color: hsl(120, 100%, 40%);">+                 atr_update_csum(real_atr, sizeof(real_atr));</span><br><span style="color: hsl(120, 100%, 40%);">+                  cardem_request_set_atr(ci, real_atr, sizeof(real_atr));</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%);">+           /* select remote (forwarded) SIM */</span><br><span style="color: hsl(120, 100%, 40%);">+           st_modem_reset_pulse(ci->slot, 300);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             run_mainloop(ci);</span><br><span style="color: hsl(120, 100%, 40%);">+             ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (transp->udp_fd < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                 libusb_release_interface(transp->usb_devh, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+close_exit:</span><br><span style="color: hsl(120, 100%, 40%);">+                if (transp->usb_devh)</span><br><span style="color: hsl(120, 100%, 40%);">+                      libusb_close(transp->usb_devh);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (keep_running)</span><br><span style="color: hsl(120, 100%, 40%);">+                     sleep(1);</span><br><span style="color: hsl(120, 100%, 40%);">+     } while (keep_running);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (transp->udp_fd < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         libusb_exit(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+do_exit:</span><br><span style="color: hsl(120, 100%, 40%);">+  return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/host/simtrace2-sniff.c b/host/src/simtrace2-sniff.c</span><br><span>similarity index 88%</span><br><span>rename from host/simtrace2-sniff.c</span><br><span>rename to host/src/simtrace2-sniff.c</span><br><span>index dddf5cf..f3c37dc 100644</span><br><span>--- a/host/simtrace2-sniff.c</span><br><span>+++ b/host/src/simtrace2-sniff.c</span><br><span>@@ -37,33 +37,19 @@</span><br><span> </span><br><span> #include <libusb.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include "libusb_util.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace_usb.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace_prot.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/libusb_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace_usb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace_prot.h></span><br><span> #include "simtrace2-discovery.h"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/gsmtap.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/gsmtap_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/gsmtap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/sim/class_tables.h></span><br><span> #include <osmocom/sim/sim.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* as of August 26, 2018 we don't have any released libosmocore version which includes those</span><br><span style="color: hsl(0, 100%, 40%);">- * definitions yet.  Let's ensure some backwards compatibility: */</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef GSMTAP_SIM_APDU</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_APDU            0x00 /* APDU data (complete APDU) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_ATR              0x01 /* card ATR data */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_PPS_REQ              0x02 /* PPS request data */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_PPS_RSP           0x03 /* PPS response data */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_TPDU_HDR         0x04 /* TPDU command header */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_TPDU_CMD               0x05 /* TPDU command body */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_TPDU_RSP         0x06 /* TPDU response body */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_SIM_TPDU_SW         0x07 /* TPDU response trailer */</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* transport to a SIMtrace device */</span><br><span> struct st_transport {</span><br><span>      /* USB */</span><br><span>@@ -75,39 +61,6 @@</span><br><span>       } usb_ep;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* global GSMTAP instance */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct gsmtap_inst *g_gti;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int gsmtap_send_sim(uint8_t sub_type, const uint8_t *data, unsigned int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsmtap_hdr *gh;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int gross_len = len + sizeof(*gh);</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t *buf = malloc(gross_len);</span><br><span style="color: hsl(0, 100%, 40%);">-       int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!buf)</span><br><span style="color: hsl(0, 100%, 40%);">-               return -ENOMEM;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(buf, 0, sizeof(*gh));</span><br><span style="color: hsl(0, 100%, 40%);">-    gh = (struct gsmtap_hdr *) buf;</span><br><span style="color: hsl(0, 100%, 40%);">- gh->version = GSMTAP_VERSION;</span><br><span style="color: hsl(0, 100%, 40%);">-        gh->hdr_len = sizeof(*gh)/4;</span><br><span style="color: hsl(0, 100%, 40%);">- gh->type = GSMTAP_TYPE_SIM;</span><br><span style="color: hsl(0, 100%, 40%);">-  gh->sub_type = sub_type;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     memcpy(buf + sizeof(*gh), data, len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   rc = write(gsmtap_inst_fd(g_gti), buf, gross_len);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                perror("write gsmtap");</span><br><span style="color: hsl(0, 100%, 40%);">-               free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-              return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       free(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> const struct value_string change_flags[] = {</span><br><span>   {</span><br><span>            .value = SNIFF_CHANGE_FLAG_CARD_INSERT,</span><br><span>@@ -252,11 +205,11 @@</span><br><span>      /* Send message as GSNTAP */</span><br><span>         switch (type) {</span><br><span>      case SIMTRACE_MSGT_SNIFF_ATR:</span><br><span style="color: hsl(0, 100%, 40%);">-           gsmtap_send_sim(GSMTAP_SIM_ATR, data->data, data->length);</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_st2_gsmtap_send_apdu(GSMTAP_SIM_ATR, data->data, data->length);</span><br><span>           break;</span><br><span>       case SIMTRACE_MSGT_SNIFF_TPDU:</span><br><span>               /* TPDU is now considered as APDU since SIMtrace sends complete TPDU */</span><br><span style="color: hsl(0, 100%, 40%);">-         gsmtap_send_sim(GSMTAP_SIM_APDU, data->data, data->length);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_st2_gsmtap_send_apdu(GSMTAP_SIM_APDU, data->data, data->length);</span><br><span>          break;</span><br><span>       default:</span><br><span>             break;</span><br><span>@@ -542,12 +495,11 @@</span><br><span>       }</span><br><span>    printf("(%s)\n", strbuf);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- g_gti = gsmtap_source_init(gsmtap_host, GSMTAP_UDP_PORT, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!g_gti) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = osmo_st2_gsmtap_init(gsmtap_host);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0) {</span><br><span>             perror("unable to open GSMTAP");</span><br><span>           goto close_exit;</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       gsmtap_source_add_sink(g_gti);</span><br><span> </span><br><span>   signal(SIGINT, &signal_handler);</span><br><span> </span><br><span>diff --git a/host/simtrace2_usb.c b/host/src/simtrace2_usb.c</span><br><span>similarity index 96%</span><br><span>rename from host/simtrace2_usb.c</span><br><span>rename to host/src/simtrace2_usb.c</span><br><span>index 1e3104a..d31ff29 100644</span><br><span>--- a/host/simtrace2_usb.c</span><br><span>+++ b/host/src/simtrace2_usb.c</span><br><span>@@ -23,8 +23,8 @@</span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include "libusb_util.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace_usb.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/libusb_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace_usb.h></span><br><span> </span><br><span> static const struct dev_id compatible_dev_ids[] = {</span><br><span>       { USB_VENDOR_OPENMOKO, USB_PRODUCT_OWHW_SAM3 },</span><br><span>diff --git a/host/usb2udp.c b/host/src/usb2udp.c</span><br><span>similarity index 98%</span><br><span>rename from host/usb2udp.c</span><br><span>rename to host/src/usb2udp.c</span><br><span>index 97ffad0..9927594 100644</span><br><span>--- a/host/usb2udp.c</span><br><span>+++ b/host/src/usb2udp.c</span><br><span>@@ -35,9 +35,8 @@</span><br><span> </span><br><span> #include <libusb.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace_usb.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "simtrace_prot.h"</span><br><span style="color: hsl(0, 100%, 40%);">-#include "apdu_dispatch.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace_usb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/simtrace2/simtrace_prot.h></span><br><span> #include "simtrace2-discovery.h"</span><br><span> </span><br><span> #include <osmocom/core/utils.h></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/simtrace2/+/16194">change 16194</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/simtrace2/+/16194"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I57e77f927ee9e169cc794c5dc6b128a2d590201b </div>
<div style="display:none"> Gerrit-Change-Number: 16194 </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-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: tsaitgaist <kredon@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>