<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>