bankd: move bank_id / num_slots from g_bankd to remsim_srv_conn

... and make num_slots configurable via command line argument

Change-Id: Id8f15085b397186d3470f4d943979857b6811a52
diff --git a/doc/manuals/chapters/remsim-bankd.adoc b/doc/manuals/chapters/remsim-bankd.adoc
index fa8ce38..7e83621 100644
--- a/doc/manuals/chapters/remsim-bankd.adoc
+++ b/doc/manuals/chapters/remsim-bankd.adoc
@@ -60,7 +60,7 @@
 
 ==== SYNOPSIS
 
-*remsim-bankd* [-h] [-i A.B.C.D] [-p <1-65535>] [-b <1-65535>] [-I A.B.C.D] [-P <1-65535> ]
+*remsim-bankd* [-h] [-i A.B.C.D] [-p <1-65535>] [-b <1-65535>] [-n <1-65535>] [-I A.B.C.D] [-P <1-65535> ]
 
 ==== OPTIONS
 
@@ -75,6 +75,8 @@
 *-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.
+*-n, --num-slots <1-65535>*::
+  Specify the number of slots that this bankd handles.
 *-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.
diff --git a/src/bankd.h b/src/bankd.h
index d56734c..7f4d687 100644
--- a/src/bankd.h
+++ b/src/bankd.h
@@ -110,11 +110,6 @@
 
 /* global bank deamon */
 struct bankd {
-	struct {
-		uint16_t bank_id;
-		uint16_t num_slots;
-	} cfg;
-
 	struct app_comp_id comp_id;
 	/* RSPRO connection to the remsim-server */
 	struct rspro_server_conn srvc;
diff --git a/src/bankd_main.c b/src/bankd_main.c
index 0b4a718..8ac5909 100644
--- a/src/bankd_main.c
+++ b/src/bankd_main.c
@@ -82,8 +82,8 @@
 	pthread_mutex_init(&bankd->workers_mutex, NULL);
 
 	/* set some defaults, overridden by commandline/config */
-	bankd->cfg.bank_id = 1;
-	bankd->cfg.num_slots = 8;
+	bankd->srvc.bankd.bank_id = 1;
+	bankd->srvc.bankd.num_slots = 8;
 
 	bankd->comp_id.type = ComponentType_remsimBankd;
 	OSMO_STRLCPY_ARRAY(bankd->comp_id.name, "fixme-name");
@@ -149,13 +149,13 @@
 		break;
 	case RsproPDUchoice_PR_createMappingReq:
 		creq = &pdu->msg.choice.createMappingReq;
-		if (creq->bank.bankId != g_bankd->cfg.bank_id) {
+		if (creq->bank.bankId != g_bankd->srvc.bankd.bank_id) {
 			LOGPFSML(srvc->fi, LOGL_ERROR, "createMapping specifies invalid Bank ID %lu "
-				 "(we are %u)\n", creq->bank.bankId, g_bankd->cfg.bank_id);
+				 "(we are %u)\n", creq->bank.bankId, g_bankd->srvc.bankd.bank_id);
 			resp = rspro_gen_CreateMappingRes(ResultCode_illegalBankId);
-		} else if (creq->bank.slotNr >= g_bankd->cfg.num_slots) {
+		} else if (creq->bank.slotNr >= g_bankd->srvc.bankd.num_slots) {
 			LOGPFSML(srvc->fi, LOGL_ERROR, "createMapping specifies invalid Slot Nr %lu "
-				 "(we have %u)\n", creq->bank.slotNr, g_bankd->cfg.num_slots);
+				 "(we have %u)\n", creq->bank.slotNr, g_bankd->srvc.bankd.num_slots);
 			resp = rspro_gen_CreateMappingRes(ResultCode_illegalSlotId);
 		} else {
 			rspro2bank_slot(&bs, &creq->bank);
@@ -172,13 +172,13 @@
 		break;
 	case RsproPDUchoice_PR_removeMappingReq:
 		rreq = &pdu->msg.choice.removeMappingReq;
-		if (rreq->bank.bankId != g_bankd->cfg.bank_id) {
+		if (rreq->bank.bankId != g_bankd->srvc.bankd.bank_id) {
 			LOGPFSML(srvc->fi, LOGL_ERROR, "removeMapping specifies invalid Bank ID %lu "
-				 "(we are %u)\n", creq->bank.bankId, g_bankd->cfg.bank_id);
+				 "(we are %u)\n", creq->bank.bankId, g_bankd->srvc.bankd.bank_id);
 			resp = rspro_gen_RemoveMappingRes(ResultCode_illegalBankId);
-		} else if (rreq->bank.slotNr >= g_bankd->cfg.num_slots) {
+		} else if (rreq->bank.slotNr >= g_bankd->srvc.bankd.num_slots) {
 			LOGPFSML(srvc->fi, LOGL_ERROR, "removeMapping specifies invalid Slot Nr %lu "
-				 "(we have %u)\n", creq->bank.slotNr, g_bankd->cfg.num_slots);
+				 "(we have %u)\n", creq->bank.slotNr, g_bankd->srvc.bankd.num_slots);
 			resp = rspro_gen_RemoveMappingRes(ResultCode_illegalSlotId);
 		} else {
 			rspro2bank_slot(&bs, &rreq->bank);
@@ -223,6 +223,7 @@
 "  -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"
+"  -b --num-slots <1-65535>	Number of Slots in this SIM bank (default: 8)\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"
@@ -242,13 +243,14 @@
 			{ "server-host", 1, 0, 'i' },
 			{ "server-port", 1, 0, 'p' },
 			{ "bank-id", 1, 0, 'b' },
+			{ "num-slots", 1, 0, 'n' },
 			{ "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);
+		c = getopt_long(argc, argv, "hi:o:b:n:N:I:P:", long_options, &option_index);
 		if (c == -1)
 			break;
 
@@ -264,7 +266,10 @@
 			g_bankd->srvc.server_port = atoi(optarg);
 			break;
 		case 'b':
-			g_bankd->cfg.bank_id = atoi(optarg);
+			g_bankd->srvc.bankd.bank_id = atoi(optarg);
+			break;
+		case 'n':
+			g_bankd->srvc.bankd.num_slots = atoi(optarg);
 			break;
 		case 'N':
 			OSMO_STRLCPY_ARRAY(g_bankd->srvc.own_comp_id.name, optarg);
@@ -318,7 +323,7 @@
 	g_bankd->accept_fd = rc;
 
 	/* create worker threads: One per reader/slot! */
-	for (i = 0; i < g_bankd->cfg.num_slots; i++) {
+	for (i = 0; i < g_bankd->srvc.bankd.num_slots; i++) {
 		struct bankd_worker *w;
 		w = bankd_create_worker(g_bankd, i);
 		if (!w)
diff --git a/src/rspro_client_fsm.h b/src/rspro_client_fsm.h
index ea88333..8e7f58c 100644
--- a/src/rspro_client_fsm.h
+++ b/src/rspro_client_fsm.h
@@ -34,6 +34,12 @@
 	/* configuration */
 	char *server_host;
 	uint16_t server_port;
+
+	/* only in case we are representing a bankd client */
+	struct {
+		uint16_t bank_id;
+		uint16_t num_slots;
+	} bankd;
 };
 
 int ipa_client_conn_send_rspro(struct ipa_client_conn *ipa, RsproPDU_t *rspro);