<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-remsim/+/17157">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">client: Work without global g_client variable<br><br>We may want to develop programs that include multiple instances of<br>a remsim_client.  Let's remove the global variable 'g_client' and<br>instead de-reference the bankd_client using container_of() macros<br><br>Change-Id: I456fb633561b88912be2f78c3e0264794d921255<br>---<br>M src/client/client.h<br>M src/client/remsim_client.c<br>M src/client/user_shell.c<br>3 files changed, 28 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/client/client.h b/src/client/client.h</span><br><span>index b3001ee..0239b55 100644</span><br><span>--- a/src/client/client.h</span><br><span>+++ b/src/client/client.h</span><br><span>@@ -1,5 +1,6 @@</span><br><span> #pragma once</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/fsm.h></span><br><span> #include <osmocom/abis/ipa.h></span><br><span> #include <osmocom/rspro/RsproPDU.h></span><br><span>@@ -57,8 +58,9 @@</span><br><span>     struct cardem_inst *cardem;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define srvc2bankd_client(srvc)          container_of(srvc, struct bankd_client, srv_conn)</span><br><span style="color: hsl(120, 100%, 40%);">+#define bankdc2bankd_client(bdc)     container_of(bdc, struct bankd_client, bankd_conn)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern struct bankd_client *g_client;</span><br><span> </span><br><span> extern int client_user_bankd_handle_rx(struct rspro_server_conn *bankdc, const RsproPDU_t *pdu);</span><br><span> </span><br><span>diff --git a/src/client/remsim_client.c b/src/client/remsim_client.c</span><br><span>index dbe983b..496e1f4 100644</span><br><span>--- a/src/client/remsim_client.c</span><br><span>+++ b/src/client/remsim_client.c</span><br><span>@@ -62,7 +62,7 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct bankd_client *g_client;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bankd_client *g_client;</span><br><span> static void *g_tall_ctx;</span><br><span> void __thread *talloc_asn1_ctx;</span><br><span> int asn_debug;</span><br><span>@@ -70,6 +70,7 @@</span><br><span> /* handle incoming messages from server */</span><br><span> static int srvc_handle_rx(struct rspro_server_conn *srvc, const RsproPDU_t *pdu)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct bankd_client *bc = srvc2bankd_client(srvc);</span><br><span>   RsproPDU_t  *resp;</span><br><span> </span><br><span>       switch (pdu->msg.present) {</span><br><span>@@ -80,24 +81,24 @@</span><br><span>                 break;</span><br><span>       case RsproPDUchoice_PR_configClientIdReq:</span><br><span>            /* store/set the clientID as instructed by the server */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!g_client->srv_conn.clslot)</span><br><span style="color: hsl(0, 100%, 40%);">-                      g_client->srv_conn.clslot = talloc_zero(g_client, ClientSlot_t);</span><br><span style="color: hsl(0, 100%, 40%);">-             *g_client->srv_conn.clslot = pdu->msg.choice.configClientIdReq.clientSlot;</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!g_client->bankd_conn.clslot)</span><br><span style="color: hsl(0, 100%, 40%);">-                    g_client->bankd_conn.clslot = talloc_zero(g_client, ClientSlot_t);</span><br><span style="color: hsl(0, 100%, 40%);">-           *g_client->bankd_conn.clslot = *g_client->srv_conn.clslot;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!srvc->clslot)</span><br><span style="color: hsl(120, 100%, 40%);">+                 srvc->clslot = talloc_zero(srvc, ClientSlot_t);</span><br><span style="color: hsl(120, 100%, 40%);">+            *srvc->clslot = pdu->msg.choice.configClientIdReq.clientSlot;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (!bc->bankd_conn.clslot)</span><br><span style="color: hsl(120, 100%, 40%);">+                        bc->bankd_conn.clslot = talloc_zero(bc, ClientSlot_t);</span><br><span style="color: hsl(120, 100%, 40%);">+             *bc->bankd_conn.clslot = *bc->srv_conn.clslot;</span><br><span>                 /* send response to server */</span><br><span>                resp = rspro_gen_ConfigClientIdRes(ResultCode_ok);</span><br><span>           server_conn_send_rspro(srvc, resp);</span><br><span>          break;</span><br><span>       case RsproPDUchoice_PR_configClientBankReq:</span><br><span>          /* store/set the bankd ip/port as instructed by the server */</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_talloc_replace_string(g_client, &g_client->bankd_conn.server_host,</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_talloc_replace_string(bc, &bc->bankd_conn.server_host,</span><br><span>                                      rspro_IpAddr2str(&pdu->msg.choice.configClientBankReq.bankd.ip));</span><br><span style="color: hsl(0, 100%, 40%);">-             rspro2bank_slot(&g_client->bankd_slot, &pdu->msg.choice.configClientBankReq.bankSlot);</span><br><span style="color: hsl(0, 100%, 40%);">-            g_client->bankd_conn.server_port = pdu->msg.choice.configClientBankReq.bankd.port;</span><br><span style="color: hsl(120, 100%, 40%);">+              rspro2bank_slot(&bc->bankd_slot, &pdu->msg.choice.configClientBankReq.bankSlot);</span><br><span style="color: hsl(120, 100%, 40%);">+                bc->bankd_conn.server_port = pdu->msg.choice.configClientBankReq.bankd.port;</span><br><span>           /* instruct bankd FSM to connect */</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_fsm_inst_dispatch(g_client->bankd_conn.fi, SRVC_E_ESTABLISH, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_dispatch(bc->bankd_conn.fi, SRVC_E_ESTABLISH, NULL);</span><br><span>                /* send response to server */</span><br><span>                resp = rspro_gen_ConfigClientBankRes(ResultCode_ok);</span><br><span>                 server_conn_send_rspro(srvc, resp);</span><br><span>diff --git a/src/client/user_shell.c b/src/client/user_shell.c</span><br><span>index db36aab..d5cad7b 100644</span><br><span>--- a/src/client/user_shell.c</span><br><span>+++ b/src/client/user_shell.c</span><br><span>@@ -48,12 +48,13 @@</span><br><span> </span><br><span> int client_user_bankd_handle_rx(struct rspro_server_conn *bankdc, const RsproPDU_t *pdu)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       struct bankd_client *client = bankdc2bankd_client(bankdc);</span><br><span>   switch (pdu->msg.present) {</span><br><span>       case RsproPDUchoice_PR_tpduCardToModem:</span><br><span style="color: hsl(0, 100%, 40%);">-         bankd_handle_tpduCardToModem(g_client, pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+          bankd_handle_tpduCardToModem(client, pdu);</span><br><span>           break;</span><br><span>       case RsproPDUchoice_PR_setAtrReq:</span><br><span style="color: hsl(0, 100%, 40%);">-               bankd_handle_setAtrReq(g_client, pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+                bankd_handle_setAtrReq(client, pdu);</span><br><span>                 break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(0);</span><br><span>@@ -68,17 +69,19 @@</span><br><span> struct stdin_state {</span><br><span>        struct osmo_fd ofd;</span><br><span>  struct msgb *rx_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct bankd_client *bc;</span><br><span> };</span><br><span> </span><br><span> /* called every time a command on stdin was received */</span><br><span> static void handle_stdin_command(struct stdin_state *ss, char *cmd)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bankd_client *bc = ss->bc;</span><br><span>         RsproPDU_t *pdu;</span><br><span>     BankSlot_t bslot;</span><br><span>    uint8_t buf[1024];</span><br><span>   int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     bank_slot2rspro(&bslot, &g_client->bankd_slot);</span><br><span style="color: hsl(120, 100%, 40%);">+    bank_slot2rspro(&bslot, &bc->bankd_slot);</span><br><span> </span><br><span>     OSMO_ASSERT(ss->rx_msg);</span><br><span> </span><br><span>@@ -86,9 +89,9 @@</span><br><span> </span><br><span>      if (!strcasecmp(cmd, "RESET")) {</span><br><span>           /* reset the [remote] card */</span><br><span style="color: hsl(0, 100%, 40%);">-           pdu = rspro_gen_ClientSlotStatusInd(g_client->srv_conn.clslot, &bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+         pdu = rspro_gen_ClientSlotStatusInd(bc->srv_conn.clslot, &bslot,</span><br><span>                                                  true, false, false, true);</span><br><span style="color: hsl(0, 100%, 40%);">-          server_conn_send_rspro(&g_client->bankd_conn, pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+            server_conn_send_rspro(&bc->bankd_conn, pdu);</span><br><span>         } else {</span><br><span>             /* we assume the user has entered a C-APDU as hex string. parse + send */</span><br><span>            rc = osmo_hexparse(cmd, buf, sizeof(buf));</span><br><span>@@ -96,14 +99,14 @@</span><br><span>                     fprintf(stderr, "ERROR parsing C-APDU `%s'!\n", cmd);</span><br><span>                  return;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!g_client->srv_conn.clslot) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!bc->srv_conn.clslot) {</span><br><span>                       fprintf(stderr, "Cannot send command; no client slot\n");</span><br><span>                  return;</span><br><span>              }</span><br><span> </span><br><span>                /* Send CMD APDU to [remote] card */</span><br><span style="color: hsl(0, 100%, 40%);">-            pdu = rspro_gen_TpduModem2Card(g_client->srv_conn.clslot, &bslot, buf, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-              server_conn_send_rspro(&g_client->bankd_conn, pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+            pdu = rspro_gen_TpduModem2Card(bc->srv_conn.clslot, &bslot, buf, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+          server_conn_send_rspro(&bc->bankd_conn, pdu);</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span>@@ -144,7 +147,7 @@</span><br><span> </span><br><span> </span><br><span> /* main function */</span><br><span style="color: hsl(0, 100%, 40%);">-int client_user_main(struct bankd_client *g_client)</span><br><span style="color: hsl(120, 100%, 40%);">+int client_user_main(struct bankd_client *bc)</span><br><span> {</span><br><span>       struct stdin_state ss;</span><br><span> </span><br><span>@@ -152,6 +155,7 @@</span><br><span>     memset(&ss, 0, sizeof(ss));</span><br><span>      osmo_fd_setup(&ss.ofd, fileno(stdin), OSMO_FD_READ, &stdin_fd_cb, &ss, 0);</span><br><span>       osmo_fd_register(&ss.ofd);</span><br><span style="color: hsl(120, 100%, 40%);">+        ss.bc = bc;</span><br><span> </span><br><span>      while (1) {</span><br><span>          osmo_select_main(0);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-remsim/+/17157">change 17157</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/osmo-remsim/+/17157"/><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-Change-Id: I456fb633561b88912be2f78c3e0264794d921255 </div>
<div style="display:none"> Gerrit-Change-Number: 17157 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </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-MessageType: merged </div>