bankd: Add command-line arguments for IP/port/etc configuration

Change-Id: Ifafdd7ea005347f39d9adad2b50cf81609b41cba
diff --git a/doc/manuals/chapters/remsim-bankd.adoc b/doc/manuals/chapters/remsim-bankd.adoc
new file mode 100644
index 0000000..a3e708d
--- /dev/null
+++ b/doc/manuals/chapters/remsim-bankd.adoc
@@ -0,0 +1,51 @@
+== remsim-bankd
+
+=== Running
+
+remsim-bankd currently has the following command-line options:
+
+==== SYNOPSIS
+
+*remsim-bankd* [-h] [-i A.B.C.D] [-p <1-65535>] [-b <1-65535>] [-I A.B.C.D] [-P <1-65535> ]
+
+==== OPTIONS
+
+*-h, --help*::
+  Print a short help message about the supported options
+*-i, --server-ip A.B.C.D*::
+  Specify the remote IP address of the remsim-server to which this bankd
+  shall establish its <<RSPRO>> control connection
+*-p, --server-port <1-65535>*::
+  Specify the remote TCP port number of the remsim-server to whihc this bankd
+  shall establish its <<RSPRO>> control connection
+*-b, --bank-id <1-65535>*::
+  Specify the numeric bank identifier of the SIM bank this bankd instance
+  operates.  Must be unique among all banks connecting to the same remsim-server.
+*-I, --bind-IP A.B.C.D*::
+  Specify the local IP address to which the socket for incoming connections
+  from remsim-clients is bound to.
+*-P, --bind-port <1-65535>*::
+  Specify the local TCP port to whicc the socket for incoming connections
+  from remsim-clients is bound to.
+
+=== Logging
+
+remsim-bankd 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.
+
+=== `bankd_pcsc_slots.csv` CSV file
+
+bankd expects a CSV file `bankd_pcsc_slots.csv` in the current working directory at startup.
+
+This CSV file specifies the mapping between the string names of the PCSC
+readers and the <<RSPRO>> bandk/slot numbers.  The format is as follows:
+
+.Example: CSV file mapping bankd slots 0..4 to an ACS ACR33U-A1 reader slots
+----
+"1","0","ACS ACR33 ICC Reader 00 00"
+"1","1","ACS ACR33 ICC Reader 00 01"
+"1","2","ACS ACR33 ICC Reader 00 02"
+"1","3","ACS ACR33 ICC Reader 00 03"
+"1","4","ACS ACR33 ICC Reader 00 04"
+----
diff --git a/doc/manuals/chapters/remsim-client.adoc b/doc/manuals/chapters/remsim-client.adoc
new file mode 100644
index 0000000..98ae4da
--- /dev/null
+++ b/doc/manuals/chapters/remsim-client.adoc
@@ -0,0 +1,70 @@
+== simtrace2-remsim-client
+
+=== Running
+
+simtrace2-remsim-client currently has the following command-line options:
+
+==== SYNOPSIS
+
+*simtrace2-remsim-client* [...]
+
+==== 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 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 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 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 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 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 remsim-bankd
+  once a card has been mapped to this client.
+
+=== Logging
+
+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.
diff --git a/src/bankd_main.c b/src/bankd_main.c
index 54c20ca..0b4a718 100644
--- a/src/bankd_main.c
+++ b/src/bankd_main.c
@@ -28,6 +28,7 @@
 #include <signal.h>
 #include <unistd.h>
 #include <errno.h>
+#include <getopt.h>
 
 #include <pthread.h>
 
@@ -215,9 +216,67 @@
 	return 0;
 }
 
+static void printf_help()
+{
+	printf(
+"  -h --help			Print this help message\n"
+"  -i --server-host A.B.C.D	remsim-server IP address (default: 127.0.0.1)\n"
+"  -p --server-port <1-65535>	remsim-server TCP port (default: 9998)\n"
+"  -b --bank-id <1-65535>	Bank Identifier of this SIM bank (default: 1)\n"
+"  -I --bind-ip A.B.C.D		Local IP address to bind for incoming client\n"
+"				connections (default: INADDR_ANY)\n"
+"  -P --bind-port <1-65535>	Local TCP port to bind for incoming client\n"
+"				connectionss (default: 9999)\n"
+	      );
+}
+
+static int g_bind_port = 9999;
+static char *g_bind_ip = NULL;
 
 void handle_options(int argc, char **argv)
 {
+	while (1) {
+		int option_index = 0, c;
+		static const struct option long_options[] = {
+			{ "help", 0, 0, 'h' },
+			{ "server-host", 1, 0, 'i' },
+			{ "server-port", 1, 0, 'p' },
+			{ "bank-id", 1, 0, 'b' },
+			{ "component-name", 1, 0, 'N' },
+			{ "bind-ip", 1, 0, 'I' },
+			{ "bind-port", 1, 0, 'P' },
+			{ 0, 0, 0, 0 }
+		};
+
+		c = getopt_long(argc, argv, "hi:o:b:N:I:P:", long_options, &option_index);
+		if (c == -1)
+			break;
+
+		switch (c) {
+		case 'h':
+			printf_help();
+			exit(0);
+			break;
+		case 'i':
+			g_bankd->srvc.server_host = optarg;
+			break;
+		case 'p':
+			g_bankd->srvc.server_port = atoi(optarg);
+			break;
+		case 'b':
+			g_bankd->cfg.bank_id = atoi(optarg);
+			break;
+		case 'N':
+			OSMO_STRLCPY_ARRAY(g_bankd->srvc.own_comp_id.name, optarg);
+			break;
+		case 'I':
+			g_bind_ip = optarg;
+			break;
+		case 'P':
+			g_bind_port = atoi(optarg);
+			break;
+		}
+	}
 }
 
 int main(int argc, char **argv)
@@ -253,7 +312,7 @@
 	}
 
 	/* create listening socket for inbound client connections */
-	rc = osmo_sock_init(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 9999, OSMO_SOCK_F_BIND);
+	rc = osmo_sock_init(AF_INET, SOCK_STREAM, IPPROTO_TCP, g_bind_ip, g_bind_port, OSMO_SOCK_F_BIND);
 	if (rc < 0)
 		exit(1);
 	g_bankd->accept_fd = rc;