<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hlr/+/14741">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add keepalive for gsup client/server, osmo-hlr<br><br>Change-Id: I01654d4a023e76a2b9245817a0096148c8bd44c1<br>Depends: (libosmo-abis) Ie453fdee8bfd7fc1a3f1ed67ef0331f0abb1d59b<br>---<br>M doc/manuals/vty/hlr_vty_reference.xml<br>M include/osmocom/gsupclient/gsup_client.h<br>M src/gsup_server.c<br>M src/gsup_server.h<br>M src/gsupclient/gsup_client.c<br>M src/gsupclient/gsup_test_client.c<br>M src/hlr.c<br>M src/hlr.h<br>M src/hlr_vty.c<br>M src/osmo-euse-demo.c<br>10 files changed, 109 insertions(+), 60 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/41/14741/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/manuals/vty/hlr_vty_reference.xml b/doc/manuals/vty/hlr_vty_reference.xml</span><br><span>index e5fd0f2..b1ce7d9 100644</span><br><span>--- a/doc/manuals/vty/hlr_vty_reference.xml</span><br><span>+++ b/doc/manuals/vty/hlr_vty_reference.xml</span><br><span>@@ -1408,6 +1408,13 @@</span><br><span> <param name='A.B.C.D' doc='IPv4 Address to bind the GSUP interface to' /></span><br><span> </params></span><br><span> </command></span><br><span style="color: hsl(120, 100%, 40%);">+ <command id='keepalive <0-300> <1-300>'></span><br><span style="color: hsl(120, 100%, 40%);">+ <params></span><br><span style="color: hsl(120, 100%, 40%);">+ <param name='keepalive' doc='Enable keepalive probing' /></span><br><span style="color: hsl(120, 100%, 40%);">+ <param name='<0-300>' doc='Idle interval in seconds before probes are sent, 0 disables keepalive' /></span><br><span style="color: hsl(120, 100%, 40%);">+ <param name='<1-300>' doc='Timeout waiting for PONG response' /></span><br><span style="color: hsl(120, 100%, 40%);">+ </params></span><br><span style="color: hsl(120, 100%, 40%);">+ </command></span><br><span> </node></span><br><span> <node id='config-hlr-euse'></span><br><span> <name>config-hlr-euse</name></span><br><span>diff --git a/include/osmocom/gsupclient/gsup_client.h b/include/osmocom/gsupclient/gsup_client.h</span><br><span>index 154e3e0..a05511f 100644</span><br><span>--- a/include/osmocom/gsupclient/gsup_client.h</span><br><span>+++ b/include/osmocom/gsupclient/gsup_client.h</span><br><span>@@ -35,6 +35,7 @@</span><br><span> struct msgb;</span><br><span> struct ipa_client_conn;</span><br><span> struct osmo_gsup_client;</span><br><span style="color: hsl(120, 100%, 40%);">+struct ipa_keepalive_params;</span><br><span> </span><br><span> /* Expects message in msg->l2h */</span><br><span> typedef int (*osmo_gsup_client_read_cb_t)(struct osmo_gsup_client *gsupc, struct msgb *msg);</span><br><span>@@ -48,12 +49,11 @@</span><br><span> </span><br><span> struct osmo_oap_client_state oap_state;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_timer_list ping_timer;</span><br><span> struct osmo_timer_list connect_timer;</span><br><span> int is_connected;</span><br><span style="color: hsl(0, 100%, 40%);">- int got_ipa_pong;</span><br><span> </span><br><span> struct ipaccess_unit *ipa_dev; /* identification information sent to IPA server */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst* ka_fsm;</span><br><span> };</span><br><span> </span><br><span> struct osmo_gsup_client *osmo_gsup_client_create2(void *talloc_ctx,</span><br><span>@@ -61,13 +61,15 @@</span><br><span> const char *ip_addr,</span><br><span> unsigned int tcp_port,</span><br><span> osmo_gsup_client_read_cb_t read_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_oap_client_config *oapc_config);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_oap_client_config *oapc_config,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params * params);</span><br><span> struct osmo_gsup_client *osmo_gsup_client_create(void *talloc_ctx,</span><br><span> const char *unit_name,</span><br><span> const char *ip_addr,</span><br><span> unsigned int tcp_port,</span><br><span> osmo_gsup_client_read_cb_t read_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_oap_client_config *oapc_config);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_oap_client_config *oapc_config,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params * params);</span><br><span> </span><br><span> void osmo_gsup_client_destroy(struct osmo_gsup_client *gsupc);</span><br><span> int osmo_gsup_client_send(struct osmo_gsup_client *gsupc, struct msgb *msg);</span><br><span>diff --git a/src/gsup_server.c b/src/gsup_server.c</span><br><span>index e75bbd7..5a4031c 100644</span><br><span>--- a/src/gsup_server.c</span><br><span>+++ b/src/gsup_server.c</span><br><span>@@ -30,6 +30,8 @@</span><br><span> #include "gsup_server.h"</span><br><span> #include "gsup_router.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int osmo_gsup_server_closed_cb(struct ipa_server_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void osmo_gsup_server_send(struct osmo_gsup_conn *conn,</span><br><span> int proto_ext, struct msgb *msg_tx)</span><br><span> {</span><br><span>@@ -79,11 +81,17 @@</span><br><span> msg->l2h = &hh->data[0];</span><br><span> </span><br><span> if (hh->proto == IPAC_PROTO_IPACCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t msg_type = *(msg->l2h);</span><br><span> rc = ipa_server_conn_ccm(conn, msg);</span><br><span> if (rc < 0) {</span><br><span> /* conn is already invalid here! */</span><br><span> return -1;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* peek the pong for out keepalive fsm */</span><br><span style="color: hsl(120, 100%, 40%);">+ if(clnt->ka_fsm && msg_type == IPAC_MSGT_PONG)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_pong_received(clnt->ka_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> msgb_free(msg);</span><br><span> return 0;</span><br><span> }</span><br><span>@@ -171,6 +179,12 @@</span><br><span> return TLVP_LEN(&clnt->ccm, tag);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int osmo_gsup_server_ka_timeout_cb(struct osmo_fsm_inst *fi, void *conn){</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_server_conn_destroy(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we're dead, our talloc context was conn, which was freed */</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> static int osmo_gsup_server_ccm_cb(struct ipa_server_conn *conn,</span><br><span> struct msgb *msg, struct tlv_parsed *tlvp,</span><br><span> struct ipaccess_unit *unit)</span><br><span>@@ -196,6 +210,18 @@</span><br><span> }</span><br><span> </span><br><span> gsup_route_add(clnt, addr, addr_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if(clnt->ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(clnt->ka_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if(clnt->server->ka_params){</span><br><span style="color: hsl(120, 100%, 40%);">+ clnt->ka_fsm = ipa_server_conn_alloc_keepalive_fsm(conn, clnt->server->ka_params, "gsup_server");</span><br><span style="color: hsl(120, 100%, 40%);">+ if(clnt->ka_fsm){</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(clnt->ka_fsm, osmo_gsup_server_ka_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(clnt->ka_fsm);</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> return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -206,6 +232,11 @@</span><br><span> LOGP(DLGSUP, LOGL_INFO, "Lost GSUP client %s:%d\n",</span><br><span> conn->addr, conn->port);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if(clnt->ka_fsm){</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(clnt->ka_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+ clnt->ka_fsm = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> gsup_route_del_conn(clnt);</span><br><span> llist_del(&clnt->list);</span><br><span> talloc_free(clnt);</span><br><span>@@ -292,7 +323,7 @@</span><br><span> struct osmo_gsup_server *</span><br><span> osmo_gsup_server_create(void *ctx, const char *ip_addr, uint16_t tcp_port,</span><br><span> osmo_gsup_read_cb_t read_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head *lu_op_lst, void *priv)</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head *lu_op_lst, struct ipa_keepalive_params * params, void *priv)</span><br><span> {</span><br><span> struct osmo_gsup_server *gsups;</span><br><span> int rc;</span><br><span>@@ -313,6 +344,7 @@</span><br><span> </span><br><span> gsups->read_cb = read_cb;</span><br><span> gsups->priv = priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ gsups->ka_params = params;</span><br><span> </span><br><span> rc = ipa_server_link_open(gsups->link);</span><br><span> if (rc < 0)</span><br><span>diff --git a/src/gsup_server.h b/src/gsup_server.h</span><br><span>index 9c4d483..406ecf8 100644</span><br><span>--- a/src/gsup_server.h</span><br><span>+++ b/src/gsup_server.h</span><br><span>@@ -28,6 +28,7 @@</span><br><span> struct ipa_server_link *link;</span><br><span> osmo_gsup_read_cb_t read_cb;</span><br><span> struct llist_head routes;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params* ka_params;</span><br><span> };</span><br><span> </span><br><span> </span><br><span>@@ -45,6 +46,7 @@</span><br><span> /* Set when Location Update is received: */</span><br><span> bool supports_cs; /* client supports OSMO_GSUP_CN_DOMAIN_CS */</span><br><span> bool supports_ps; /* client supports OSMO_GSUP_CN_DOMAIN_PS */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst* ka_fsm;</span><br><span> };</span><br><span> </span><br><span> </span><br><span>@@ -57,6 +59,7 @@</span><br><span> uint16_t tcp_port,</span><br><span> osmo_gsup_read_cb_t read_cb,</span><br><span> struct llist_head *lu_op_lst,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params * params,</span><br><span> void *priv);</span><br><span> </span><br><span> void osmo_gsup_server_destroy(struct osmo_gsup_server *gsups);</span><br><span>diff --git a/src/gsupclient/gsup_client.c b/src/gsupclient/gsup_client.c</span><br><span>index c8408fd..5fe9740 100644</span><br><span>--- a/src/gsupclient/gsup_client.c</span><br><span>+++ b/src/gsupclient/gsup_client.c</span><br><span>@@ -32,18 +32,6 @@</span><br><span> #include <errno.h></span><br><span> #include <string.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void start_test_procedure(struct osmo_gsup_client *gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void gsup_client_send_ping(struct osmo_gsup_client *gsupc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg = osmo_gsup_client_msgb_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- msg->l2h = msgb_put(msg, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- msg->l2h[0] = IPAC_MSGT_PING;</span><br><span style="color: hsl(0, 100%, 40%);">- ipa_msg_push_header(msg, IPAC_PROTO_IPACCESS);</span><br><span style="color: hsl(0, 100%, 40%);">- ipa_client_conn_send(gsupc->link, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int gsup_client_connect(struct osmo_gsup_client *gsupc)</span><br><span> {</span><br><span> int rc;</span><br><span>@@ -57,12 +45,6 @@</span><br><span> osmo_timer_del(&gsupc->connect_timer);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (osmo_timer_pending(&gsupc->ping_timer)) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLGSUP, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">- "GSUP connect: ping timer already running\n");</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_del(&gsupc->ping_timer);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> if (ipa_client_conn_clear_queue(gsupc->link) > 0)</span><br><span> LOGP(DLGSUP, LOGL_DEBUG, "GSUP connect: discarded stored messages\n");</span><br><span> </span><br><span>@@ -71,6 +53,10 @@</span><br><span> if (rc >= 0) {</span><br><span> LOGP(DLGSUP, LOGL_NOTICE, "GSUP connecting to %s:%d\n",</span><br><span> gsupc->link->addr, gsupc->link->port);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if(gsupc->ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(gsupc->ka_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -133,14 +119,16 @@</span><br><span> gsupc->is_connected = up;</span><br><span> </span><br><span> if (up) {</span><br><span style="color: hsl(0, 100%, 40%);">- start_test_procedure(gsupc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(gsupc->ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(gsupc->ka_fsm);</span><br><span> </span><br><span> if (gsupc->oap_state.state == OSMO_OAP_INITIALIZED)</span><br><span> gsup_client_oap_register(gsupc);</span><br><span> </span><br><span> osmo_timer_del(&gsupc->connect_timer);</span><br><span> } else {</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_del(&gsupc->ping_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(gsupc->ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_stop(gsupc->ka_fsm);</span><br><span> </span><br><span> osmo_timer_schedule(&gsupc->connect_timer,</span><br><span> OSMO_GSUP_CLIENT_RECONNECT_INTERVAL, 0);</span><br><span>@@ -189,11 +177,10 @@</span><br><span> </span><br><span> if (rc == 1) {</span><br><span> uint8_t msg_type = *(msg->l2h);</span><br><span style="color: hsl(0, 100%, 40%);">- /* CCM message */</span><br><span style="color: hsl(0, 100%, 40%);">- if (msg_type == IPAC_MSGT_PONG) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLGSUP, LOGL_DEBUG, "GSUP receiving PONG\n");</span><br><span style="color: hsl(0, 100%, 40%);">- gsupc->got_ipa_pong = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* peek the pong for out keepalive fsm */</span><br><span style="color: hsl(120, 100%, 40%);">+ if(gsupc->ka_fsm && msg_type == IPAC_MSGT_PONG)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_pong_received(gsupc->ka_fsm);</span><br><span> </span><br><span> msgb_free(msg);</span><br><span> return 0;</span><br><span>@@ -228,34 +215,20 @@</span><br><span> return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void ping_timer_cb(void *gsupc_)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_gsup_client *gsupc = gsupc_;</span><br><span style="color: hsl(120, 100%, 40%);">+static int osmo_gsup_client_ka_timeout_cb(struct osmo_fsm_inst *fi, void *data){</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_client_conn* cc = (struct ipa_client_conn*) data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_gsup_client* gsupc = (struct osmo_gsup_client *)cc->data;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLGSUP, LOGL_INFO, "GSUP ping callback (%s, %s PONG)\n",</span><br><span style="color: hsl(0, 100%, 40%);">- gsupc->is_connected ? "connected" : "not connected",</span><br><span style="color: hsl(0, 100%, 40%);">- gsupc->got_ipa_pong ? "got" : "didn't get");</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_stop(gsupc->ka_fsm);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (gsupc->got_ipa_pong) {</span><br><span style="color: hsl(0, 100%, 40%);">- start_test_procedure(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</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%);">- LOGP(DLGSUP, LOGL_NOTICE, "GSUP ping timed out, reconnecting\n");</span><br><span> ipa_client_conn_close(gsupc->link);</span><br><span> gsupc->is_connected = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gsup_client_connect(gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&gsupc->connect_timer,</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_CLIENT_RECONNECT_INTERVAL, 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void start_test_procedure(struct osmo_gsup_client *gsupc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_setup(&gsupc->ping_timer, ping_timer_cb, gsupc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsupc->got_ipa_pong = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_schedule(&gsupc->ping_timer, OSMO_GSUP_CLIENT_PING_INTERVAL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLGSUP, LOGL_DEBUG, "GSUP sending PING\n");</span><br><span style="color: hsl(0, 100%, 40%);">- gsup_client_send_ping(gsupc);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* do not terminate */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span> /*!</span><br><span>@@ -276,7 +249,8 @@</span><br><span> const char *ip_addr,</span><br><span> unsigned int tcp_port,</span><br><span> osmo_gsup_client_read_cb_t read_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_oap_client_config *oapc_config)</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_oap_client_config *oapc_config,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params * params)</span><br><span> {</span><br><span> struct osmo_gsup_client *gsupc;</span><br><span> int rc;</span><br><span>@@ -302,6 +276,12 @@</span><br><span> if (!gsupc->link)</span><br><span> goto failed;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if(params){</span><br><span style="color: hsl(120, 100%, 40%);">+ gsupc->ka_fsm = ipa_client_conn_alloc_keepalive_fsm(gsupc->link, params, "gsup_client");</span><br><span style="color: hsl(120, 100%, 40%);">+ if(gsupc->ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(gsupc->ka_fsm, osmo_gsup_client_ka_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> osmo_timer_setup(&gsupc->connect_timer, connect_timer_cb, gsupc);</span><br><span> </span><br><span> rc = gsup_client_connect(gsupc);</span><br><span>@@ -327,17 +307,17 @@</span><br><span> const char *ip_addr,</span><br><span> unsigned int tcp_port,</span><br><span> osmo_gsup_client_read_cb_t read_cb,</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_oap_client_config *oapc_config)</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_oap_client_config *oapc_config,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params * params)</span><br><span> {</span><br><span> struct ipaccess_unit *ipa_dev = talloc_zero(talloc_ctx, struct ipaccess_unit);</span><br><span> ipa_dev->unit_name = talloc_strdup(ipa_dev, unit_name);</span><br><span style="color: hsl(0, 100%, 40%);">- return osmo_gsup_client_create2(talloc_ctx, ipa_dev, ip_addr, tcp_port, read_cb, oapc_config);</span><br><span style="color: hsl(120, 100%, 40%);">+ return osmo_gsup_client_create2(talloc_ctx, ipa_dev, ip_addr, tcp_port, read_cb, oapc_config, params);</span><br><span> }</span><br><span> </span><br><span> void osmo_gsup_client_destroy(struct osmo_gsup_client *gsupc)</span><br><span> {</span><br><span> osmo_timer_del(&gsupc->connect_timer);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_del(&gsupc->ping_timer);</span><br><span> </span><br><span> if (gsupc->link) {</span><br><span> ipa_client_conn_close(gsupc->link);</span><br><span>diff --git a/src/gsupclient/gsup_test_client.c b/src/gsupclient/gsup_test_client.c</span><br><span>index b0362ad..cb293c9 100644</span><br><span>--- a/src/gsupclient/gsup_test_client.c</span><br><span>+++ b/src/gsupclient/gsup_test_client.c</span><br><span>@@ -10,6 +10,7 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/gsm/gsup.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/ipa.h></span><br><span> </span><br><span> #include <osmocom/gsupclient/gsup_client.h></span><br><span> </span><br><span>@@ -289,12 +290,12 @@</span><br><span> unsigned long long i;</span><br><span> char *server_host = "127.0.0.1";</span><br><span> uint16_t server_port = OSMO_GSUP_PORT;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params kap = {.interval = 10, .wait_for_resp = 5};</span><br><span> void *ctx = talloc_named_const(NULL, 0, "gsup_test_client");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> osmo_init_logging2(ctx, &gsup_test_client_log_info);</span><br><span> </span><br><span> g_gc = osmo_gsup_client_create(ctx, "GSUPTEST", server_host, server_port,</span><br><span style="color: hsl(0, 100%, 40%);">- gsupc_read_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ gsupc_read_cb, NULL, &kap);</span><br><span> </span><br><span> </span><br><span> signal(SIGINT, sig_cb);</span><br><span>diff --git a/src/hlr.c b/src/hlr.c</span><br><span>index 90cbac4..5237012 100644</span><br><span>--- a/src/hlr.c</span><br><span>+++ b/src/hlr.c</span><br><span>@@ -880,7 +880,7 @@</span><br><span> }</span><br><span> </span><br><span> g_hlr->gs = osmo_gsup_server_create(hlr_ctx, g_hlr->gsup_bind_addr, OSMO_GSUP_PORT,</span><br><span style="color: hsl(0, 100%, 40%);">- read_cb, &g_lu_ops, g_hlr);</span><br><span style="color: hsl(120, 100%, 40%);">+ read_cb, &g_lu_ops, g_hlr->ka_params, g_hlr);</span><br><span> if (!g_hlr->gs) {</span><br><span> LOGP(DMAIN, LOGL_FATAL, "Error starting GSUP server\n");</span><br><span> exit(1);</span><br><span>diff --git a/src/hlr.h b/src/hlr.h</span><br><span>index 18c4a1d..97b49bc 100644</span><br><span>--- a/src/hlr.h</span><br><span>+++ b/src/hlr.h</span><br><span>@@ -61,6 +61,7 @@</span><br><span> /* Bitmask of DB_SUBSCR_FLAG_* */</span><br><span> uint8_t subscr_create_on_demand_flags;</span><br><span> unsigned int subscr_create_on_demand_rand_msisdn_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params* ka_params;</span><br><span> };</span><br><span> </span><br><span> extern struct hlr *g_hlr;</span><br><span>diff --git a/src/hlr_vty.c b/src/hlr_vty.c</span><br><span>index e6567cc..c975c7f 100644</span><br><span>--- a/src/hlr_vty.c</span><br><span>+++ b/src/hlr_vty.c</span><br><span>@@ -102,6 +102,9 @@</span><br><span> vty_out(vty, " gsup%s", VTY_NEWLINE);</span><br><span> if (g_hlr->gsup_bind_addr)</span><br><span> vty_out(vty, " bind ip %s%s", g_hlr->gsup_bind_addr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_hlr->ka_params)</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " keepalive %d %d%s", g_hlr->ka_params->interval,</span><br><span style="color: hsl(120, 100%, 40%);">+ g_hlr->ka_params->wait_for_resp, VTY_NEWLINE);</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -146,6 +149,22 @@</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_hlr_gsup_keepalive,</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_hlr_gsup_keepalive_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "keepalive <0-300> <1-300>",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Enable keepalive probing\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Idle interval in seconds before probes are sent, 0 disables keepalive\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Timeout waiting for PONG response\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if(atoi(argv[0]) > 0){</span><br><span style="color: hsl(120, 100%, 40%);">+ g_hlr->ka_params = talloc_zero(g_hlr, struct ipa_keepalive_params);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_hlr->ka_params->interval = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_hlr->ka_params->wait_for_resp = atoi(argv[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 CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /***********************************************************************</span><br><span> * USSD Entity</span><br><span> ***********************************************************************/</span><br><span>@@ -444,6 +463,7 @@</span><br><span> install_node(&gsup_node, config_write_hlr_gsup);</span><br><span> </span><br><span> install_element(GSUP_NODE, &cfg_hlr_gsup_bind_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(GSUP_NODE, &cfg_hlr_gsup_keepalive_cmd);</span><br><span> </span><br><span> install_element(HLR_NODE, &cfg_database_cmd);</span><br><span> </span><br><span>diff --git a/src/osmo-euse-demo.c b/src/osmo-euse-demo.c</span><br><span>index 4e4ef78..5cb5c40 100644</span><br><span>--- a/src/osmo-euse-demo.c</span><br><span>+++ b/src/osmo-euse-demo.c</span><br><span>@@ -44,6 +44,8 @@</span><br><span> </span><br><span> #include <osmocom/gsupclient/gsup_client.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/ipa.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include "logging.h"</span><br><span> </span><br><span> static struct osmo_gsup_client *g_gc;</span><br><span>@@ -212,6 +214,7 @@</span><br><span> {</span><br><span> char *server_host = "127.0.0.1";</span><br><span> uint16_t server_port = OSMO_GSUP_PORT;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params kap = {.interval = 10, .wait_for_resp = 5};</span><br><span> void *ctx = talloc_named_const(NULL, 0, "demo-euse");</span><br><span> </span><br><span> osmo_init_logging2(ctx, &gsup_log_info);</span><br><span>@@ -228,7 +231,7 @@</span><br><span> if (argc > 2)</span><br><span> server_port = atoi(argv[2]);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- g_gc = osmo_gsup_client_create(ctx, "EUSE-foobar", server_host, server_port, gsupc_read_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_gc = osmo_gsup_client_create(ctx, "EUSE-foobar", server_host, server_port, gsupc_read_cb, NULL, &kap);</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-hlr/+/14741">change 14741</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-hlr/+/14741"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I01654d4a023e76a2b9245817a0096148c8bd44c1 </div>
<div style="display:none"> Gerrit-Change-Number: 14741 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>