<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13175">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">client: Connect to server before connecting to bankd<br><br>So far we skipped the client->server connection and related<br>configuration transfer from server to client.  Now, the server<br>instructs the client to which bankd ip/port to connect.<br><br>Change-Id: I76c9498089515d1a6190f3e79e143b7df3a531bd<br>---<br>M src/client.h<br>M src/remsim_client.c<br>M src/remsim_client_fsm.c<br>M src/simtrace2-remsim_client.c<br>4 files changed, 160 insertions(+), 76 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/client.h b/src/client.h</span><br><span>index 6918560..1917cb5 100644</span><br><span>--- a/src/client.h</span><br><span>+++ b/src/client.h</span><br><span>@@ -10,9 +10,10 @@</span><br><span> /* fsm.c */</span><br><span> </span><br><span> enum bankd_conn_fsm_event {</span><br><span style="color: hsl(0, 100%, 40%);">-       BDC_E_TCP_UP,</span><br><span style="color: hsl(0, 100%, 40%);">-   BDC_E_TCP_DOWN,</span><br><span style="color: hsl(0, 100%, 40%);">- BDC_E_CLIENT_CONN_RES,</span><br><span style="color: hsl(120, 100%, 40%);">+        BDC_E_ESTABLISH,        /* instruct BDC to (re)etablish TCP connection to bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+    BDC_E_TCP_UP,           /* notify BDC that TCP connection is up/connected */</span><br><span style="color: hsl(120, 100%, 40%);">+  BDC_E_TCP_DOWN,         /* notify BDC that TCP connection is down/disconnected */</span><br><span style="color: hsl(120, 100%, 40%);">+     BDC_E_CLIENT_CONN_RES,  /* notify BDC that ClientConnectRes has been received */</span><br><span> };</span><br><span> </span><br><span> extern struct osmo_fsm remsim_client_bankd_fsm;</span><br><span>@@ -31,10 +32,12 @@</span><br><span>  /* state */</span><br><span>  struct ipa_client_conn *conn;</span><br><span>        struct osmo_fsm_inst *fi;</span><br><span style="color: hsl(0, 100%, 40%);">-       int (*handle_rx)(struct rspro_server_conn *conn, RsproPDU_t *pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+    int (*handle_rx)(struct rspro_server_conn *conn, const RsproPDU_t *pdu);</span><br><span> </span><br><span>         /* our own component ID */</span><br><span>   struct app_comp_id own_comp_id;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* remote component ID */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct app_comp_id peer_comp_id;</span><br><span> </span><br><span>         /* configuration */</span><br><span>  char *server_host;</span><br><span>@@ -48,11 +51,10 @@</span><br><span> </span><br><span> struct bankd_client {</span><br><span>        /* connection to the remsim-server (control) */</span><br><span style="color: hsl(0, 100%, 40%);">- struct ipa_client_conn *srv_conn;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_fsm_inst *srv_fi;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct rspro_server_conn srv_conn;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* our own component ID */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct app_comp_id own_comp_id;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* remote component ID */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct app_comp_id peer_comp_id;</span><br><span> </span><br><span>         /* connection to the remsim-bankd */</span><br><span>         char *bankd_host;</span><br><span>diff --git a/src/remsim_client.c b/src/remsim_client.c</span><br><span>index 62f65f9..2f740d4 100644</span><br><span>--- a/src/remsim_client.c</span><br><span>+++ b/src/remsim_client.c</span><br><span>@@ -26,6 +26,8 @@</span><br><span> </span><br><span>   switch (pdu->msg.present) {</span><br><span>       case RsproPDUchoice_PR_connectClientRes:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Store 'identity' of bankd to in peer_comp_id */</span><br><span style="color: hsl(120, 100%, 40%);">+            rspro_comp_id_retrieve(&bc->peer_comp_id, &pdu->msg.choice.connectClientRes.identity);</span><br><span>                 osmo_fsm_inst_dispatch(bc->bankd_fi, BDC_E_CLIENT_CONN_RES, pdu);</span><br><span>                 break;</span><br><span>       default:</span><br><span>@@ -84,17 +86,62 @@</span><br><span> void __thread *talloc_asn1_ctx;</span><br><span> int asn_debug;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* handle incoming messages from server */</span><br><span style="color: hsl(120, 100%, 40%);">+static int srvc_handle_rx(struct rspro_server_conn *srvc, const RsproPDU_t *pdu)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      RsproPDU_t  *resp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (pdu->msg.present) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case RsproPDUchoice_PR_connectClientRes:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Store 'identity' of server in srvc->peer_comp_id */</span><br><span style="color: hsl(120, 100%, 40%);">+             rspro_comp_id_retrieve(&srvc->peer_comp_id, &pdu->msg.choice.connectClientRes.identity);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_CLIENT_CONN_RES, (void *) pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RsproPDUchoice_PR_configClientReq:</span><br><span style="color: hsl(120, 100%, 40%);">+               /* store/set the clientID as instructed by the server */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!g_client->clslot)</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_client->clslot = talloc_zero(g_client, ClientSlot_t);</span><br><span style="color: hsl(120, 100%, 40%);">+            *g_client->clslot = pdu->msg.choice.configClientReq.clientSlot;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* store/set the bankd ip/port as instructed by the server */</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_talloc_replace_string(g_client, &g_client->bankd_host,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       rspro_IpAddr2str(&pdu->msg.choice.configClientReq.bankd.ip));</span><br><span style="color: hsl(120, 100%, 40%);">+               g_client->bankd_port = ntohs(pdu->msg.choice.configClientReq.bankd.port);</span><br><span style="color: hsl(120, 100%, 40%);">+               /* instruct bankd FSM to connect */</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_dispatch(g_client->bankd_fi, BDC_E_ESTABLISH, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* send response to server */</span><br><span style="color: hsl(120, 100%, 40%);">+         resp = rspro_gen_ConfigClientRes(ResultCode_ok);</span><br><span style="color: hsl(120, 100%, 40%);">+              ipa_client_conn_send_rspro(srvc->conn, resp);</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, "Unknown/Unsupported RSPRO PDU type: %u\n", pdu->msg.present);</span><br><span style="color: hsl(120, 100%, 40%);">+           return -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%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct rspro_server_conn *srvc;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    g_tall_ctx = talloc_named_const(NULL, 0, "global");</span><br><span> </span><br><span>    g_client = talloc_zero(g_tall_ctx, struct bankd_client);</span><br><span style="color: hsl(0, 100%, 40%);">-        g_client->bankd_host = "localhost";</span><br><span style="color: hsl(0, 100%, 40%);">-        g_client->bankd_port = 9999;</span><br><span style="color: hsl(0, 100%, 40%);">- g_client->own_comp_id.type = ComponentType_remsimClient;</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_STRLCPY_ARRAY(g_client->own_comp_id.name, "fixme-name");</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_STRLCPY_ARRAY(g_client->own_comp_id.software, "remsim-client");</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_STRLCPY_ARRAY(g_client->own_comp_id.sw_version, PACKAGE_VERSION);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   srvc = &g_client->srv_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+    srvc->server_host = "localhost";</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc->server_port = 9998;</span><br><span style="color: hsl(120, 100%, 40%);">+  srvc->handle_rx = srvc_handle_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+  srvc->own_comp_id.type = ComponentType_remsimClient;</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_STRLCPY_ARRAY(srvc->own_comp_id.name, "fixme-name");</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_STRLCPY_ARRAY(srvc->own_comp_id.software, "remsim-client");</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_STRLCPY_ARRAY(srvc->own_comp_id.sw_version, PACKAGE_VERSION);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = server_conn_fsm_alloc(g_client, srvc);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Unable to create Server conn FSM: %s\n", strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> </span><br><span>        asn_debug = 0;</span><br><span>       osmo_init_logging2(g_tall_ctx, &log_info);</span><br><span>diff --git a/src/remsim_client_fsm.c b/src/remsim_client_fsm.c</span><br><span>index d361659..06df4e0 100644</span><br><span>--- a/src/remsim_client_fsm.c</span><br><span>+++ b/src/remsim_client_fsm.c</span><br><span>@@ -57,6 +57,7 @@</span><br><span> };</span><br><span> </span><br><span> static const struct value_string remsim_client_bankd_fsm_event_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_VALUE_STRING(BDC_E_ESTABLISH),</span><br><span>  OSMO_VALUE_STRING(BDC_E_TCP_UP),</span><br><span>     OSMO_VALUE_STRING(BDC_E_TCP_DOWN),</span><br><span>   OSMO_VALUE_STRING(BDC_E_CLIENT_CONN_RES),</span><br><span>@@ -67,33 +68,10 @@</span><br><span> #define T2_RECONNECT                 10</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bdc_st_init_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct bankd_client *bc = (struct bankd_client *) fi->priv;</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("onenter\n");</span><br><span style="color: hsl(0, 100%, 40%);">-  bc->bankd_conn = ipa_client_conn_create(bc, NULL, 0, bc->bankd_host, bc->bankd_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           bankd_updown_cb, bankd_read_cb, NULL, bc);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!bc->bankd_conn) {</span><br><span style="color: hsl(0, 100%, 40%);">-               fprintf(stderr, "Unable to create socket: %s\n", strerror(errno));</span><br><span style="color: hsl(0, 100%, 40%);">-            exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Attempt to connect TCP socket */</span><br><span style="color: hsl(0, 100%, 40%);">-     rc = ipa_client_conn_open(bc->bankd_conn);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                fprintf(stderr, "Unable to connect: %s\n", strerror(errno));</span><br><span style="color: hsl(0, 100%, 40%);">-          exit(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%);">-</span><br><span> static void bdc_st_init(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>     switch (event) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case BDC_E_TCP_UP:</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_fsm_inst_state_chg(fi, BDC_ST_ESTABLISHED, T1_WAIT_CLIENT_CONN_RES, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case BDC_E_TCP_DOWN:</span><br><span style="color: hsl(120, 100%, 40%);">+  case BDC_E_ESTABLISH:</span><br><span>                osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);</span><br><span>            break;</span><br><span>       default:</span><br><span>@@ -107,7 +85,7 @@</span><br><span>        RsproPDU_t *pdu;</span><br><span> </span><br><span>         /* FIXME: Send ClientConnReq */</span><br><span style="color: hsl(0, 100%, 40%);">- pdu = rspro_gen_ConnectClientReq(&bc->own_comp_id, bc->clslot);</span><br><span style="color: hsl(120, 100%, 40%);">+     pdu = rspro_gen_ConnectClientReq(&bc->srv_conn.own_comp_id, bc->clslot);</span><br><span>   ipa_client_conn_send_rspro(bc->bankd_conn, pdu);</span><br><span> }</span><br><span> </span><br><span>@@ -142,6 +120,21 @@</span><br><span>  struct bankd_client *bc = (struct bankd_client *) fi->priv;</span><br><span>       int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* re-create bankd_conn */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bc->bankd_conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPFSML(fi, LOGL_INFO, "Destroying existing connection to bankd\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               ipa_client_conn_destroy(bc->bankd_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+           bc->bankd_conn = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPFSML(fi, LOGL_INFO, "Creating TCP connection to bankd at %s:%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               bc->bankd_host, bc->bankd_port);</span><br><span style="color: hsl(120, 100%, 40%);">+       bc->bankd_conn = ipa_client_conn_create(bc, NULL, 0, bc->bankd_host, bc->bankd_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         bankd_updown_cb, bankd_read_cb, NULL, bc);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bc->bankd_conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+             fprintf(stderr, "Unable to create socket: %s\n", strerror(errno));</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>  /* Attempt to connect TCP socket */</span><br><span>  rc = ipa_client_conn_open(bc->bankd_conn);</span><br><span>        if (rc < 0) {</span><br><span>@@ -166,14 +159,27 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void bdc_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case BDC_ST_REESTABLISH:</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);</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%);">+              OSMO_ASSERT(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%);">+</span><br><span> static int remsim_client_bankd_fsm_timer_cb(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span>         switch (fi->T) {</span><br><span>  case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+               /* TCP reconnect failed: retry */</span><br><span>            osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);</span><br><span>            break;</span><br><span>       case 1:</span><br><span style="color: hsl(0, 100%, 40%);">-         /* FIXME: close connection and re-start */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* no ClientConnectRes received: disconnect + reconnect */</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);</span><br><span>            break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(0);</span><br><span>@@ -184,8 +190,8 @@</span><br><span> static const struct osmo_fsm_state bankd_conn_fsm_states[] = {</span><br><span>      [BDC_ST_INIT] = {</span><br><span>            .name = "INIT",</span><br><span style="color: hsl(0, 100%, 40%);">-               .in_event_mask = S(BDC_E_TCP_UP) | S(BDC_E_TCP_DOWN),</span><br><span style="color: hsl(0, 100%, 40%);">-           .out_state_mask = S(BDC_ST_ESTABLISHED) | S(BDC_ST_REESTABLISH),</span><br><span style="color: hsl(120, 100%, 40%);">+              .in_event_mask = 0, /* S(BDC_E_ESTABLISH) via allstate */</span><br><span style="color: hsl(120, 100%, 40%);">+             .out_state_mask = S(BDC_ST_REESTABLISH),</span><br><span>             .action = bdc_st_init,</span><br><span>       },</span><br><span>   [BDC_ST_ESTABLISHED] = {</span><br><span>@@ -214,6 +220,8 @@</span><br><span>       .name = "BANKD_CONN",</span><br><span>      .states = bankd_conn_fsm_states,</span><br><span>     .num_states = ARRAY_SIZE(bankd_conn_fsm_states),</span><br><span style="color: hsl(120, 100%, 40%);">+      .allstate_event_mask = S(BDC_E_ESTABLISH),</span><br><span style="color: hsl(120, 100%, 40%);">+    .allstate_action = bdc_allstate_action,</span><br><span>      .timer_cb = remsim_client_bankd_fsm_timer_cb,</span><br><span>        .log_subsys = DMAIN,</span><br><span>         .event_names = remsim_client_bankd_fsm_event_names,</span><br><span>@@ -228,8 +236,6 @@</span><br><span>            return -1;</span><br><span> </span><br><span>       bc->bankd_fi = fi;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* onenter of the initial state is not automatically executed by osmo_fsm :( */</span><br><span style="color: hsl(0, 100%, 40%);">- bdc_st_init_onenter(fi, 0);</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/simtrace2-remsim_client.c b/src/simtrace2-remsim_client.c</span><br><span>index 6d31d32..79da419 100644</span><br><span>--- a/src/simtrace2-remsim_client.c</span><br><span>+++ b/src/simtrace2-remsim_client.c</span><br><span>@@ -539,6 +539,8 @@</span><br><span> </span><br><span>        switch (pdu->msg.present) {</span><br><span>       case RsproPDUchoice_PR_connectClientRes:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Store 'identity' of bankd to in peer_comp_id */</span><br><span style="color: hsl(120, 100%, 40%);">+            rspro_comp_id_retrieve(&bc->peer_comp_id, &pdu->msg.choice.connectClientRes.identity);</span><br><span>                 osmo_fsm_inst_dispatch(bc->bankd_fi, BDC_E_CLIENT_CONN_RES, pdu);</span><br><span>                 break;</span><br><span>       case RsproPDUchoice_PR_tpduCardToModem: // APDU response from card received</span><br><span>@@ -582,6 +584,41 @@</span><br><span>   return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* handle incoming messages from server */</span><br><span style="color: hsl(120, 100%, 40%);">+static int srvc_handle_rx(struct rspro_server_conn *srvc, const RsproPDU_t *pdu)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  RsproPDU_t  *resp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (pdu->msg.present) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case RsproPDUchoice_PR_connectClientRes:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Store 'identity' of server in srvc->peer_comp_id */</span><br><span style="color: hsl(120, 100%, 40%);">+             rspro_comp_id_retrieve(&srvc->peer_comp_id, &pdu->msg.choice.connectClientRes.identity);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_CLIENT_CONN_RES, (void *) pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case RsproPDUchoice_PR_configClientReq:</span><br><span style="color: hsl(120, 100%, 40%);">+               /* store/set the clientID as instructed by the server */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!g_client->clslot)</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_client->clslot = talloc_zero(g_client, ClientSlot_t);</span><br><span style="color: hsl(120, 100%, 40%);">+            *g_client->clslot = pdu->msg.choice.configClientReq.clientSlot;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* store/set the bankd ip/port as instructed by the server */</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_talloc_replace_string(g_client, &g_client->bankd_host,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       rspro_IpAddr2str(&pdu->msg.choice.configClientReq.bankd.ip));</span><br><span style="color: hsl(120, 100%, 40%);">+               g_client->bankd_port = ntohs(pdu->msg.choice.configClientReq.bankd.port);</span><br><span style="color: hsl(120, 100%, 40%);">+               /* instruct bankd FSM to connect */</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_dispatch(g_client->bankd_fi, BDC_E_ESTABLISH, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* send response to server */</span><br><span style="color: hsl(120, 100%, 40%);">+         resp = rspro_gen_ConfigClientRes(ResultCode_ok);</span><br><span style="color: hsl(120, 100%, 40%);">+              ipa_client_conn_send_rspro(srvc->conn, resp);</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, "Unknown/Unsupported RSPRO PDU type: %u\n", pdu->msg.present);</span><br><span style="color: hsl(120, 100%, 40%);">+           return -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%);">+   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%);">+</span><br><span> static const struct log_info_cat default_categories[] = {</span><br><span>        [DMAIN] = {</span><br><span>          .name = "DMAIN",</span><br><span>@@ -604,10 +641,8 @@</span><br><span> </span><br><span> static void print_help(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      printf( "\t-d\t--bankd-host HOST\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\t-s\t--server-host HOST\n"</span><br><span>               "\t-p\t--bankd-port PORT\n"</span><br><span style="color: hsl(0, 100%, 40%);">-           "\t-c\t--client-id REMSIM_CLIENT_ID\n"</span><br><span style="color: hsl(0, 100%, 40%);">-                "\t-s\t--slot-nr REMSIM_SLOT_NUMBER\n"</span><br><span>             "\t-h\t--help\n"</span><br><span>           "\t-i\t--gsmtap-ip\tA.B.C.D\n"</span><br><span>             "\t-k\t--keep-running\n"</span><br><span>@@ -624,10 +659,8 @@</span><br><span> }</span><br><span> </span><br><span> static const struct option opts[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-     { "bankd-host", 1, 0, 'b' },</span><br><span style="color: hsl(0, 100%, 40%);">-  { "bankd-port", 1, 0, 'p' },</span><br><span style="color: hsl(0, 100%, 40%);">-  { "client-id", 1, 0, 'c' },</span><br><span style="color: hsl(0, 100%, 40%);">-   { "slot-nr", 1, 0, 's' },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "server-host", 1, 0, 's' },</span><br><span style="color: hsl(120, 100%, 40%);">+       { "server-port", 1, 0, 'p' },</span><br><span>      { "gsmtap-ip", 1, 0, 'i' },</span><br><span>        { "help", 0, 0, 'h' },</span><br><span>     { "keep-running", 0, 0, 'k' },</span><br><span>@@ -644,16 +677,16 @@</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct rspro_server_conn *srvc;</span><br><span>      struct st_transport *transp = ci->slot->transp;</span><br><span>        char *gsmtap_host = "127.0.0.1";</span><br><span>   int rc;</span><br><span>      int c, ret = 1;</span><br><span>      int keep_running = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   int bankd_port = 9999;</span><br><span style="color: hsl(0, 100%, 40%);">-  int client_id = -1, slot_nr = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     int server_port = 9999;</span><br><span>      int if_num = 0, vendor_id = -1, product_id = -1;</span><br><span>     int config_id = -1, altsetting = 0, addr = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-  char *bankd_host = "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+     char *server_host = "127.0.0.1";</span><br><span>   char *path = NULL;</span><br><span>   uint8_t atr_data[33] = { 0x3B, 0x00 }; // the shortest simplest ATR possible</span><br><span>         uint8_t atr_len = 2;</span><br><span>@@ -663,21 +696,15 @@</span><br><span>         while (1) {</span><br><span>          int option_index = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               c = getopt_long(argc, argv, "b:p:c:s:hi:V:P:C:I:S:A:H:a:k", opts, &option_index);</span><br><span style="color: hsl(120, 100%, 40%);">+               c = getopt_long(argc, argv, "s:p:hi:V:P:C:I:S:A:H:a:k", opts, &option_index);</span><br><span>          if (c == -1)</span><br><span>                         break;</span><br><span>               switch (c) {</span><br><span style="color: hsl(0, 100%, 40%);">-            case 'b':</span><br><span style="color: hsl(0, 100%, 40%);">-                       bankd_host = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+          case 's':</span><br><span style="color: hsl(120, 100%, 40%);">+                     server_host = optarg;</span><br><span>                        break;</span><br><span>               case 'p':</span><br><span style="color: hsl(0, 100%, 40%);">-                       bankd_port = atoi(optarg);</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%);">-                       client_id = 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%);">-                       slot_nr = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                       server_port = atoi(optarg);</span><br><span>                  break;</span><br><span>               case 'h':</span><br><span>                    print_help();</span><br><span>@@ -726,11 +753,6 @@</span><br><span>                 goto do_exit;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (client_id < 0 || slot_nr < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               fprintf(stderr, "You have to specify the remote SIM client ID and slot number\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>    rc = libusb_init(NULL);</span><br><span>      if (rc < 0) {</span><br><span>             fprintf(stderr, "libusb initialization failed\n");</span><br><span>@@ -750,13 +772,20 @@</span><br><span>         g_tall_ctx = talloc_named_const(NULL, 0, "global");</span><br><span> </span><br><span>    g_client = talloc_zero(g_tall_ctx, struct bankd_client);</span><br><span style="color: hsl(0, 100%, 40%);">-        g_client->bankd_host = bankd_host;</span><br><span style="color: hsl(0, 100%, 40%);">-   g_client->bankd_port = bankd_port;</span><br><span style="color: hsl(0, 100%, 40%);">-   g_client->own_comp_id.type = ComponentType_remsimClient;</span><br><span style="color: hsl(0, 100%, 40%);">-     g_client->clslot = &(ClientSlot_t){ .clientId = client_id, .slotNr = slot_nr };</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_STRLCPY_ARRAY(g_client->own_comp_id.name, "simtrace2-remsim-client");</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_STRLCPY_ARRAY(g_client->own_comp_id.software, "remsim-client");</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_STRLCPY_ARRAY(g_client->own_comp_id.sw_version, PACKAGE_VERSION);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   srvc = &g_client->srv_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+    srvc->server_host = server_host;</span><br><span style="color: hsl(120, 100%, 40%);">+   srvc->server_port = server_port;</span><br><span style="color: hsl(120, 100%, 40%);">+   srvc->handle_rx = srvc_handle_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+  srvc->own_comp_id.type = ComponentType_remsimClient;</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_STRLCPY_ARRAY(srvc->own_comp_id.name, "simtrace2-remsim-client");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_STRLCPY_ARRAY(srvc->own_comp_id.software, "remsim-client");</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_STRLCPY_ARRAY(srvc->own_comp_id.sw_version, PACKAGE_VERSION);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = server_conn_fsm_alloc(g_client, srvc);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Unable to create Server conn FSM: %s\n", strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> </span><br><span>        asn_debug = 0;</span><br><span>       osmo_init_logging2(g_tall_ctx, &log_info);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13175">change 13175</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/13175"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-remsim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I76c9498089515d1a6190f3e79e143b7df3a531bd </div>
<div style="display:none"> Gerrit-Change-Number: 13175 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>