<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13175">View Change</a></p><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;">git pull ssh://gerrit.osmocom.org:29418/osmo-remsim refs/changes/75/13175/1</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: newchange </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>