== osmo-remsim-client-st2

The client interfaces with GSM phones / modems via dedicated "Card
Emulation" devices such as the Osmocom SIMtrace2 or sysmocom sysmoQMOD
board + firmware.  This hardware implements the ISO7816-3 electrical
interface and protocol handling and  passes any TPDU headers received
from the phone/modem to `osmo-remsim-client` for further processing of
the TPDUs associated to the given APDU transfer.

`osmo-remsim-client` connects via a RSPRO control connection to
`osmo-remsim-server` at startup and registers itself.  It will receive
configuration data such as the `osmo-remsim-bankd` IP+Port and the
ClientId from `osmo-remsim-server`.

After receiving the configuration, `osmo-remsim-client` will establish a
RSPRO data connection to the `osmo-remsim-bankd` IP:Port.

As the USB interface for remote SIM in simtrace2.git uses one interface
per slot, we can implement the client in blocking mode, i.e. use
blocking I/O on the TCP/RSPRO side.  This simplifies the code compared
to a more complex async implementation.

=== Running

osmo-remsim-client-st2 currently has the following command-line options:

==== SYNOPSIS

*osmo-remsim-client-st2* [...]

==== OPTIONS

*-h, --help*::
  Print a short help message about the supported options
*-s, --server-host A.B.C.D*::
  Specify the remote IP address / hostname of the `osmo-remsim-server` to
  which this client shall establish its RSPRO control connection
*-p, --server-port <1-65535>*::
  Specify the remote TCP port number of the `osmo-remsim-server` to which
  this client shall establish its RSPRO control connection
*-c, --client-id <1-65535>*::
  Specify the numeric client identifier of the SIM bank this bankd
  instance operates.  The tuple of client-id and client-slot must be
  unique among all clients connecting to the same `osmo-remsim-server`.
*-n, --client-slot <0-65535>*::
  Specify the slot number served within this client.  The tuple of
  client-id and client-slot must be unique among all clients connecting
  to the same `osmo-remsim-server`.
*-i, --gsmtap-ip A.B.C.D*::
  Specify the IP address (if any) to which APDU traces are sent in
  GSMTAP format (useful for debugging; supported by wireshark).
*-k, --keep-running*::
  Specify if the `osmo-remsim-client` should terminate after handling one
  session, or whether it should keep running.  Fast respawn (i.e. no
  --keep-running) is probably the more robust option at this point.
*-V, --usb-vendor*::
  Specify the USB Vendor ID of the USB device served by this client,
  use e.g. 0x1d50 for SIMtrace2, sysmoQMOD and OWHW.
*-P, --usb-product*::
  Specify the USB Product ID of the USB device served by this client,
  use e.g. 0x4004 for sysmoQMOD.
*-C, --usb-config*::
  Specify the USB Cofiguration number of the USB device served by this
  client. Default will use current configuration of the device.
*-I, --usb-interface*::
  Specify the USB Interface number (within active configuration) of the
  USB device served by this client.  Default will use FIXME.
*-S, --usb-altsetting*::
  Specify the USB Alternate Setting to be used within the USB Interface
  of the USB device served by this client.  Default will use FIXME.
*-A, --usb-address <0-255>*::
  Specify the USB Address of the USB device served by this client. This
  is useful in case multiple identical USB devices are attached to the
  same host.  However, the address changed at every re-enumeration and
  it's therefor recommended to use the USB path (see below).
*-H, --usb-path*::
  Specify the USB path of the USB device served by this client. This is
  usefule to disambiguate between multiple identical USB devices
  attached to the same host.  You don't need this if you have only one
  SIM emulation device attached to your system.
*-a, --atr HEXSTRING*::
  Specify the initial ATR to be communicated to the modem/phone.  Can
  and will later be overridden by the ATR as specified by
  `osmo-remsim-bankd` once a card has been mapped to this client.
*-e, --event-script COMMAND*::
  Specify the shell command to be execute when the client wants to call its
  helper script


==== Examples
.remsim-server is on 10.2.3.4, sysmoQMOD on usb bus, all 4 modems:
----
osmo-remsim-client-st2 -s 10.2.3.4 -V 1d50 -P 4004 -C 1 -I 0 -H 2-1.1 -c 0 -n 0
osmo-remsim-client-st2 -s 10.2.3.4 -V 1d50 -P 4004 -C 1 -I 1 -H 2-1.1 -c 0 -n 1
osmo-remsim-client-st2 -s 10.2.3.4 -V 1d50 -P 4004 -C 1 -I 0 -H 2-1.4 -c 0 -n 2
osmo-remsim-client-st2 -s 10.2.3.4 -V 1d50 -P 4004 -C 1 -I 1 -H 2-1.4 -c 0 -n 3
----

=== Logging

`osmo-remsim-client` currently logs to stdout only, and the logging
verbosity is not yet configurable.  However, as the libosmocore logging
framework is used, extending this is an easy modification.

=== Helper Script

`osmo-remsim-client` can call an external shell command / script / program at specific
instances of time.  This serves two purposes:

* To keep external system integration posted about the overall status of remsim-client,
  such as whether or not it is connected to a server and/or bankd.
* To request the external system to perform specific actions, such as triggering the reset
  of the modem - in case the hardware doesn't allow the simtrace2 firmware to do that itself.

==== Script Environment Variables

The environment passed to the helper script contains a number of variables to provide inormation
to the external script:

.Environment Variables
[options="header",cols="27%,18%,55%"]
|===
| Name | Example Value | Description
| REMSIM_CLIENT_VERSION | 0.2.2.37-5406a | Compile version of the software
| REMSIM_SERVER_ADDR | 1.2.3.4:1234 | Address and port of the remsim-server
| REMSIM_SERVER_STATE | CONNECTED | FSM state of the connection to remsim-server
| REMSIM_BANKD_ADDR | 1.2.3.4:1234 | Address and port of the remsim-bankd
| REMSIM_BANKD_STATE | CONNECTED | FSM state of the connection to remsim-bankd
| REMSIM_CLIENT_SLOT | 23:42 | Client ID and Client Slot Number
| REMSIM_BANKD_SLOT | 55:33 | Bank ID and Bank Slot Number
| REMSIM_USB_PATH | 2-1.1 | USB path of the USB device with simtrace2 cardem firmware
| REMSIM_USB_INTERFACE | 1 | Interface number of the USB device with simtrace2 cardem firmware
| REMSIM_SIM_VCC | 1 | Whether or not the modem currently applies SIM VCC (0/1)
| REMSIM_SIM_RST | 1 | Whether or not the modem currently asserts SIM RST (0=inactive, 1=active)
| REMSIM_CAUSE | request-card-insert | The cause why this script has been called
|===

==== REMSIM_CAUSE values

The REMSIM_CAUSE environment variable (as well as the first argument) passed to the helper
script indicated why the script has been called.

[options="header",cols="25%,75%"]
|===
| Name | Description
| event-modem-status | The SIM card interface status has changed (e.g. VCC/RST change)
| event-bankd-connect | A logical RSPRO connection to a bankd has been established
| event-server-connect | A logical RSPRO connection to a server has been established
| event-config-bankd | The server has instructed the client of the bankd address
| request-card-insert | The client asks the system to simulate SIM card insertion to the modem
| request-card-remove | The client asks the system to simulate SIM card removal from the modem
| request-sim-remote | The client asks the system to switch to remote SIM
| request-sim-local | The client asks the system to switch to local SIM
| request-modem-reset | The client asks the system to perform a modem reset
|===
