<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-uecups/+/17857">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add support for UeCUPS_ResetAllState<br><br>This allows the controlling entity (testsuite) to reset all<br>state in the daemon.<br><br>Change-Id: I18c952b3874324a9efafb26b5f2c64f8396ff36a<br>---<br>M daemon/main.c<br>M ttcn3/UECUPS_Types.ttcn<br>2 files changed, 48 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-uecups refs/changes/57/17857/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/daemon/main.c b/daemon/main.c</span><br><span>index 155d5d5..a458e16 100644</span><br><span>--- a/daemon/main.c</span><br><span>+++ b/daemon/main.c</span><br><span>@@ -68,6 +68,14 @@</span><br><span> pid_t pid;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* kill the specified subprocess and forget about it */</span><br><span style="color: hsl(120, 100%, 40%);">+static void subprocess_destroy(struct subprocess *p, int signal)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ kill(p->pid, signal);</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_del(&p->list);</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(p);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Send JSON to a given client/connection */</span><br><span> static int cups_client_tx_json(struct cups_client *cc, json_t *jtx)</span><br><span> {</span><br><span>@@ -446,6 +454,29 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int cups_client_handle_reset_all_state(struct cups_client *cc, json_t *sprog)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gtp_daemon *d = cc->d;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gtp_tunnel *t, *t2;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct subprocess *p, *p2;</span><br><span style="color: hsl(120, 100%, 40%);">+ json_t *jres;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ pthread_rwlock_wrlock(&d->rwlock);</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry_safe(t, t2, &d->gtp_tunnels, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ _gtp_tunnel_destroy(t);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ pthread_rwlock_unlock(&d->rwlock);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* no locking needed as this list is only used by main thread */</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry_safe(p, p2, &d->subprocesses, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ subprocess_destroy(p, SIGKILL);</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%);">+ jres = gen_uecups_result("reset_all_state_res", "OK");</span><br><span style="color: hsl(120, 100%, 40%);">+ cups_client_tx_json(cc, jres);</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> </span><br><span> static int cups_client_handle_json(struct cups_client *cc, json_t *jroot)</span><br><span> {</span><br><span>@@ -469,6 +500,8 @@</span><br><span> rc = cups_client_handle_destroy_tun(cc, cmd);</span><br><span> } else if (!strcmp(key, "start_program")) {</span><br><span> rc = cups_client_handle_start_program(cc, cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (!strcmp(key, "reset_all_state")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = cups_client_handle_reset_all_state(cc, cmd);</span><br><span> } else {</span><br><span> LOGCC(cc, LOGL_NOTICE, "Unknown command '%s' received\n", key);</span><br><span> return -EINVAL;</span><br><span>@@ -551,12 +584,10 @@</span><br><span> struct subprocess *p, *p2;</span><br><span> </span><br><span> /* kill + forget about all subprocesses of this client */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We need no locking here as the subprocess list is only used from the main thread */</span><br><span> llist_for_each_entry_safe(p, p2, &d->subprocesses, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (p->cups_client == cc) {</span><br><span style="color: hsl(0, 100%, 40%);">- kill(p->pid, SIGKILL);</span><br><span style="color: hsl(0, 100%, 40%);">- llist_del(&p->list);</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(p);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (p->cups_client == cc)</span><br><span style="color: hsl(120, 100%, 40%);">+ subprocess_destroy(p, SIGKILL);</span><br><span> }</span><br><span> </span><br><span> LOGCC(cc, LOGL_INFO, "UECUPS connection lost\n");</span><br><span>diff --git a/ttcn3/UECUPS_Types.ttcn b/ttcn3/UECUPS_Types.ttcn</span><br><span>index 8861998..bbd849f 100644</span><br><span>--- a/ttcn3/UECUPS_Types.ttcn</span><br><span>+++ b/ttcn3/UECUPS_Types.ttcn</span><br><span>@@ -80,15 +80,26 @@</span><br><span> integer exit_code</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type record UeCUPS_ResetAllState {</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%);">+type record UeCUPS_ResetAllStateRes {</span><br><span style="color: hsl(120, 100%, 40%);">+ UECUPS_Result result</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> type union PDU_UECUPS {</span><br><span> UECUPS_CreateTun create_tun,</span><br><span> UECUPS_CreateTunRes create_tun_res,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> UECUPS_DestroyTun destroy_tun,</span><br><span> UECUPS_DestroyTunRes destroy_tun_res,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> UECUPS_StartProgram start_program,</span><br><span> UECUPS_StartProgramRes start_program_res,</span><br><span style="color: hsl(0, 100%, 40%);">- UECUPS_ProgramTermInd program_term_ind</span><br><span style="color: hsl(120, 100%, 40%);">+ UECUPS_ProgramTermInd program_term_ind,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ UeCUPS_ResetAllState reset_all_state,</span><br><span style="color: hsl(120, 100%, 40%);">+ UeCUPS_ResetAllStateRes reset_all_state_res</span><br><span> };</span><br><span> </span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-uecups/+/17857">change 17857</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-uecups/+/17857"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-uecups </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I18c952b3874324a9efafb26b5f2c64f8396ff36a </div>
<div style="display:none"> Gerrit-Change-Number: 17857 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>