<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>