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