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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce simtrace2-tool<br><br>The simtrace-tool is a command line tool which can be used to e.g.<br>manually request a modem reset.<br><br>Change-Id: I3a8896ac2b3caef7590b51118359e5caed820a40<br>---<br>M host/src/Makefile.am<br>A host/src/simtrace2-tool.c<br>2 files changed, 335 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/host/src/Makefile.am b/host/src/Makefile.am</span><br><span>index fa5be6e..17be9eb 100644</span><br><span>--- a/host/src/Makefile.am</span><br><span>+++ b/host/src/Makefile.am</span><br><span>@@ -5,10 +5,12 @@</span><br><span> LDADD= $(top_builddir)/lib/libosmo-simtrace2.la \</span><br><span>        $(LIBOSMOCORE_LIBS) $(LIBOSMOSIM_LIBS) $(LIBOSMOUSB_LIBS) $(LIBUSB_LIBS)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bin_PROGRAMS = simtrace2-cardem-pcsc simtrace2-list simtrace2-sniff</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS = simtrace2-cardem-pcsc simtrace2-list simtrace2-sniff simtrace2-tool</span><br><span> </span><br><span> simtrace2_cardem_pcsc_SOURCES = simtrace2-cardem-pcsc.c</span><br><span> </span><br><span> simtrace2_list_SOURCES = simtrace2_usb.c</span><br><span> </span><br><span> simtrace2_sniff_SOURCES = simtrace2-sniff.c</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+simtrace2_tool_SOURCES = simtrace2-tool.c</span><br><span>diff --git a/host/src/simtrace2-tool.c b/host/src/simtrace2-tool.c</span><br><span>new file mode 100644</span><br><span>index 0000000..658f84a</span><br><span>--- /dev/null</span><br><span>+++ b/host/src/simtrace2-tool.c</span><br><span>@@ -0,0 +1,332 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* simtrace2-tool - 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) 2019 by Harald Welte <hwelte@hmw-consulting.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%);">+#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/types.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/usb/libusb.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/gsmtap.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/msgb.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%);">+ * 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%);">+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-tool\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "(C) 2019 Harald Welte <laforge@gnumonks.org>\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( "simtrace2-tool [OPTIONS] COMMAND\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf( "Options:\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-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%);">+    printf( "Commands:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+               "\tmodem reset (enable|disable|cycle)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "\tmodem sim-switch (local|remote)\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%);">+static const struct option opts[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { "help", 0, 0, 'h' },</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 osmo_st2_cardem_inst *ci)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_st2_transport *transp = ci->slot->transp;</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%);">+     while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* read data from SIMtrace2 device */</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%);">+             /* break the loop if no new messages arrive within 100ms */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (rc == LIBUSB_ERROR_TIMEOUT)</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_st2_transport _transp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_st2_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 osmo_st2_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 osmo_st2_cardem_inst *ci = &_ci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform a modem reset */</span><br><span style="color: hsl(120, 100%, 40%);">+static int do_modem_reset(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    char *command;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (argc < 1)</span><br><span style="color: hsl(120, 100%, 40%);">+              command = "cycle";</span><br><span style="color: hsl(120, 100%, 40%);">+  else {</span><br><span style="color: hsl(120, 100%, 40%);">+                command = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+            argc--;</span><br><span style="color: hsl(120, 100%, 40%);">+               argv++;</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 (!strcmp(command, "enable")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("Activating Modem RESET\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return osmo_st2_modem_reset_active(ci->slot);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (!strcmp(command, "disable")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("Deactivating Modem RESET\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return osmo_st2_modem_reset_inactive(ci->slot);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if (!strcmp(command, "cycle")) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("Pulsing Modem RESET (1s)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return osmo_st2_modem_reset_pulse(ci->slot, 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Unsupported modem reset command: '%s'\n", command);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* switch between local and remote (emulated) SIM */</span><br><span style="color: hsl(120, 100%, 40%);">+static int do_modem_sim_switch(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        char *command;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (argc < 1)</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       command = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+    argc--;</span><br><span style="color: hsl(120, 100%, 40%);">+       argv++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!strcmp(command, "local")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("Setting SIM=LOCAL; Modem reset recommended\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return osmo_st2_modem_sim_select_local(ci->slot);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (!strcmp(command, "remote")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("Setting SIM=REMOTE; Modem reset recommended\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return osmo_st2_modem_sim_select_remote(ci->slot);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Unsupported modem sim-switch command: '%s'\n", command);</span><br><span style="color: hsl(120, 100%, 40%);">+           return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int do_subsys_modem(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  char *command;</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 (argc < 1)</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       command = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+    argc--;</span><br><span style="color: hsl(120, 100%, 40%);">+       argv++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!strcmp(command, "reset")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = do_modem_reset(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (!strcmp(command, "sim-switch")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = do_modem_sim_switch(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Unsupported command for subsystem modem: '%s'\n", command);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</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 int do_command(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      char *subsys;</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 (argc < 1)</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       subsys = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+     argc--;</span><br><span style="color: hsl(120, 100%, 40%);">+       argv++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!strcmp(subsys, "modem"))</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = do_subsys_modem(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+     else {</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(stderr, "Unsupported subsystem '%s'\n", subsys);</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = -EINVAL;</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%);">+</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 osmo_st2_transport *transp = ci->slot->transp;</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 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 *path = NULL;</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, "hV:P:C:I:S:A:H:", 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 '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 '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 (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%);">+     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%);">+</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%);">+    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 = osmo_libusb_open_claim_interface(NULL, 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 = osmo_libusb_get_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%);">+           if (argc - optind <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  fprintf(stderr, "You have to specify a command to execute\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = do_command(argc-optind, argv+optind);</span><br><span style="color: hsl(120, 100%, 40%);">+            switch (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case -EINVAL:</span><br><span style="color: hsl(120, 100%, 40%);">+                 fprintf(stderr, "Error: Invalid command/syntax\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "Error executing command: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                       exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</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%);">+            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%);">+    } while (0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/simtrace2/+/24574">change 24574</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/+/24574"/><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: I3a8896ac2b3caef7590b51118359e5caed820a40 </div>
<div style="display:none"> Gerrit-Change-Number: 24574 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>