pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-remsim/+/39044?usp=email )
Change subject: Use new osmo_ipa_ka_fsm_inst APIs from libosmo-netif
......................................................................
Use new osmo_ipa_ka_fsm_inst APIs from libosmo-netif
Related: OS#5896
Depends: libosmo-netif.git Change-Id I5c36e06e0dc29ec4679b20ad6c426f051b659acd
Change-Id: Id9784c69f1524872053436b59712f67ad5fbfe94
---
M TODO-RELEASE
M src/client/client.h
M src/client/user_simtrace2.c
M src/rspro_client_fsm.c
M src/rspro_client_fsm.h
M src/server/rspro_server.c
M src/server/rspro_server.h
7 files changed, 70 insertions(+), 60 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-remsim refs/changes/44/39044/1
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 7aeffd4..730a421 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -9,3 +9,4 @@
#library what description / commit summary line
libosmocore > 1.9.0 working (compiling) gsmtap_inst_fd2()
libosmo-simtrace2 >= 0.9.0 required to compile (sim presence polarity)
+libosmo-netif >1.5.1 osmo_ipa_ka_fsm_inst APIs
diff --git a/src/client/client.h b/src/client/client.h
index df95312..6ec94b7 100644
--- a/src/client/client.h
+++ b/src/client/client.h
@@ -2,7 +2,6 @@
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/fsm.h>
-#include <osmocom/abis/ipa.h>
#include <osmocom/rspro/RsproPDU.h>
#include "rspro_util.h"
diff --git a/src/client/user_simtrace2.c b/src/client/user_simtrace2.c
index 65d4cde..2535efb 100644
--- a/src/client/user_simtrace2.c
+++ b/src/client/user_simtrace2.c
@@ -22,6 +22,7 @@
#include <libusb.h>
#include <osmocom/core/fsm.h>
+#include <osmocom/core/select.h>
#include <osmocom/core/utils.h>
#include <osmocom/usb/libusb.h>
diff --git a/src/rspro_client_fsm.c b/src/rspro_client_fsm.c
index dcde0e4..a740afd 100644
--- a/src/rspro_client_fsm.c
+++ b/src/rspro_client_fsm.c
@@ -33,9 +33,6 @@
#include <osmocom/netif/stream.h>
#include <osmocom/netif/ipa.h>
-/* libosmo-abis still needed for ipa_keepalive_fsm: */
-#include <osmocom/abis/ipa.h>
-
#include "debug.h"
#include "asn1c_helpers.h"
#include "rspro_client_fsm.h"
@@ -137,7 +134,6 @@
OSMO_VALUE_STRING(SRVC_E_TCP_UP),
OSMO_VALUE_STRING(SRVC_E_TCP_DOWN),
OSMO_VALUE_STRING(SRVC_E_KA_TIMEOUT),
- OSMO_VALUE_STRING(SRVC_E_KA_TERMINATED),
OSMO_VALUE_STRING(SRVC_E_CLIENT_CONN_RES),
OSMO_VALUE_STRING(SRVC_E_RSPRO_TX),
{ 0, NULL }
@@ -156,6 +152,13 @@
struct rspro_server_conn *srvc = osmo_stream_cli_get_data(cli);
LOGPFSML(srvc->fi, LOGL_NOTICE, "RSPRO link to %s:%d DOWN\n",
srvc->server_host, srvc->server_port);
+
+ if (srvc->ka_fi) {
+ osmo_ipa_ka_fsm_stop(srvc->ka_fi);
+ osmo_ipa_ka_fsm_free(srvc->ka_fi);
+ srvc->ka_fi = NULL;
+ }
+
osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_TCP_DOWN, 0);
return 0;
}
@@ -239,7 +242,7 @@
}
switch (msg_type) {
case IPAC_MSGT_PONG:
- ipa_keepalive_fsm_pong_received(srvc->keepalive_fi);
+ osmo_ipa_ka_fsm_pong_received(srvc->ka_fi);
rc = 0;
break;
default:
@@ -275,11 +278,6 @@
return -EBADF;
}
-static const struct ipa_keepalive_params ka_params = {
- .interval = 30,
- .wait_for_resp = 10,
-};
-
static int64_t get_monotonic_ms(void)
{
struct timespec t;
@@ -334,7 +332,7 @@
struct rspro_server_conn *srvc = (struct rspro_server_conn *) fi->priv;
RsproPDU_t *pdu;
- ipa_keepalive_fsm_start(srvc->keepalive_fi);
+ osmo_ipa_ka_fsm_start(srvc->ka_fi);
if (srvc->own_comp_id.type == ComponentType_remsimClient)
pdu = rspro_gen_ConnectClientReq(&srvc->own_comp_id, srvc->clslot);
@@ -407,29 +405,25 @@
osmo_fsm_inst_dispatch(fi->proc.parent, srvc->parent_disc_evt, NULL);
}
-static void ipa_keepalive_send_cb(struct osmo_fsm_inst *fi, void *conn, struct msgb
*msg)
+static int ipa_keepalive_send_cb(struct osmo_ipa_ka_fsm_inst *ka_fi, struct msgb *msg)
{
- struct osmo_stream_cli *cli = (struct osmo_stream_cli *)conn;
+ struct osmo_stream_cli *cli = osmo_ipa_ka_fsm_get_data(ka_fi);
osmo_stream_cli_send(cli, msg);
+ return 0;
}
-static int ipa_kaepalive_timeout_cb(struct osmo_fsm_inst *ka_fi, void *conn)
+static int ipa_keepalive_timeout_cb(struct osmo_ipa_ka_fsm_inst *ka_fi)
{
- struct osmo_fsm_inst *fi = ka_fi->proc.parent;
- osmo_fsm_inst_dispatch(fi, SRVC_E_KA_TIMEOUT, NULL);
- return 0; /* we will explicitly terminate it */
+ struct osmo_stream_cli *cli = osmo_ipa_ka_fsm_get_data(ka_fi);
+ struct rspro_server_conn *srvc = osmo_stream_cli_get_data(cli);
+ osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_KA_TIMEOUT, NULL);
+ return 0;
}
static void srvc_st_reestablish_delay_onenter(struct osmo_fsm_inst *fi, uint32_t
prev_state)
{
struct rspro_server_conn *srvc = (struct rspro_server_conn *) fi->priv;
- if (srvc->keepalive_fi) {
- ipa_keepalive_fsm_stop(srvc->keepalive_fi);
- osmo_fsm_inst_term(srvc->keepalive_fi, OSMO_FSM_TERM_REGULAR, NULL);
- srvc->keepalive_fi = NULL;
- }
-
if (srvc->conn) {
LOGPFSML(fi, LOGL_INFO, "Destroying existing connection to server\n");
osmo_stream_cli_destroy(srvc->conn);
@@ -449,6 +443,7 @@
OSMO_ASSERT(0);
}
}
+
static void srvc_st_reestablish_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
{
struct rspro_server_conn *srvc = (struct rspro_server_conn *) fi->priv;
@@ -461,7 +456,7 @@
srvc->conn = osmo_stream_cli_create(fi);
if (!srvc->conn) {
LOGPFSML(fi, LOGL_FATAL, "Unable to create socket: %s\n", strerror(errno));
- exit(1);
+ goto err_exit;
}
osmo_stream_cli_set_name(srvc->conn, fi->id);
@@ -479,15 +474,16 @@
osmo_stream_cli_set_disconnect_cb(srvc->conn, srvc_disconnect_cb);
osmo_stream_cli_set_read_cb2(srvc->conn, srvc_read_cb);
- srvc->keepalive_fi = ipa_generic_conn_alloc_keepalive_fsm(srvc->conn,
srvc->conn, &ka_params, fi->id);
- if (!srvc->keepalive_fi) {
+ srvc->ka_fi = osmo_ipa_ka_fsm_alloc(srvc->conn, fi->id);
+ if (!srvc->ka_fi) {
LOGPFSM(fi, "Unable to create keepalive FSM\n");
- exit(1);
+ goto err_free_cli;
}
- ipa_keepalive_fsm_set_send_cb(srvc->keepalive_fi, ipa_keepalive_send_cb);
- ipa_keepalive_fsm_set_timeout_cb(srvc->keepalive_fi, ipa_kaepalive_timeout_cb);
- /* ensure parent is notified once keepalive FSM instance is dying */
- osmo_fsm_inst_change_parent(srvc->keepalive_fi, srvc->fi, SRVC_E_KA_TERMINATED);
+ osmo_ipa_ka_fsm_set_data(srvc->ka_fi, srvc->conn);
+ osmo_ipa_ka_fsm_set_ping_interval(srvc->ka_fi, 30);
+ osmo_ipa_ka_fsm_set_pong_timeout(srvc->ka_fi, 10);
+ osmo_ipa_ka_fsm_set_send_cb(srvc->ka_fi, ipa_keepalive_send_cb);
+ osmo_ipa_ka_fsm_set_timeout_cb(srvc->ka_fi, ipa_keepalive_timeout_cb);
/* Attempt to connect TCP socket */
rc = osmo_stream_cli_open(srvc->conn);
@@ -495,8 +491,17 @@
LOGPFSML(fi, LOGL_FATAL, "Unable to connect RSPRO to %s:%u - %s\n",
srvc->server_host, srvc->server_port, strerror(errno));
/* FIXME: retry? Timer? Abort? */
- OSMO_ASSERT(0);
+ goto err_free_ka_fi;
}
+
+err_free_ka_fi:
+ osmo_ipa_ka_fsm_free(srvc->ka_fi);
+ srvc->ka_fi = NULL;
+err_free_cli:
+ osmo_stream_cli_destroy(srvc->conn);
+ srvc->conn = NULL;
+err_exit:
+ exit(1);
}
static void srvc_st_reestablish(struct osmo_fsm_inst *fi, uint32_t event, void *data)
@@ -525,11 +530,6 @@
srvc_do_reestablish(fi);
break;
case SRVC_E_DISCONNECT:
- if (srvc->keepalive_fi) {
- ipa_keepalive_fsm_stop(srvc->keepalive_fi);
- osmo_fsm_inst_term(srvc->keepalive_fi, OSMO_FSM_TERM_REGULAR, NULL);
- srvc->keepalive_fi = NULL;
- }
if (srvc->conn) {
LOGPFSML(fi, LOGL_INFO, "Destroying existing connection to server\n");
osmo_stream_cli_destroy(srvc->conn);
diff --git a/src/rspro_client_fsm.h b/src/rspro_client_fsm.h
index 152ae5c..6ac40e5 100644
--- a/src/rspro_client_fsm.h
+++ b/src/rspro_client_fsm.h
@@ -13,7 +13,6 @@
SRVC_E_TCP_UP,
SRVC_E_TCP_DOWN,
SRVC_E_KA_TIMEOUT,
- SRVC_E_KA_TERMINATED,
SRVC_E_CLIENT_CONN_RES,
SRVC_E_RSPRO_TX /* transmit a RSPRO PDU to the peer */
};
@@ -23,7 +22,7 @@
/* state */
struct osmo_stream_cli *conn;
struct osmo_fsm_inst *fi;
- struct osmo_fsm_inst *keepalive_fi;
+ struct osmo_ipa_ka_fsm_inst *ka_fi;
int (*handle_rx)(struct rspro_server_conn *conn, const RsproPDU_t *pdu);
/* index into k_reestablish_delay[] for this connection */
diff --git a/src/server/rspro_server.c b/src/server/rspro_server.c
index c2001af..0910358 100644
--- a/src/server/rspro_server.c
+++ b/src/server/rspro_server.c
@@ -11,7 +11,6 @@
#include <osmocom/core/socket.h>
#include <osmocom/gsm/protocol/ipaccess.h>
#include <osmocom/netif/ipa.h>
-#include <osmocom/abis/ipa.h>
#include <osmocom/rspro/RsproPDU.h>
@@ -164,9 +163,7 @@
rspro2client_slot(&conn->client.slot, cclreq->clientSlot);
osmo_fsm_inst_update_id_f(fi, "C%u:%u", conn->client.slot.client_id,
conn->client.slot.slot_nr);
- osmo_fsm_inst_update_id_f(conn->keepalive_fi, "C%u:%u",
- conn->client.slot.client_id,
- conn->client.slot.slot_nr);
+ osmo_ipa_ka_fsm_set_id(conn->ka_fi, fi->id);
LOGPFSML(fi, LOGL_INFO, "Client connected from %s:%s\n", ip_str, port_str);
/* check for unique-ness */
@@ -214,7 +211,7 @@
conn->bank.bank_id = cbreq->bankId;
conn->bank.num_slots = cbreq->numberOfSlots;
osmo_fsm_inst_update_id_f(fi, "B%u", conn->bank.bank_id);
- osmo_fsm_inst_update_id_f(conn->keepalive_fi, "B%u",
conn->bank.bank_id);
+ osmo_ipa_ka_fsm_set_id(conn->ka_fi, fi->id);
LOGPFSML(fi, LOGL_INFO, "Bankd connected from %s:%s\n", ip_str, port_str);
if (!strncmp(ip_str, "127.", 4)) {
@@ -671,7 +668,7 @@
return 0;
case IPAC_MSGT_PONG:
LOGPFSML(conn->fi, LOGL_DEBUG, "PONG!\n");
- ipa_keepalive_fsm_pong_received(conn->keepalive_fi);
+ osmo_ipa_ka_fsm_pong_received(conn->ka_fi);
return 0;
case IPAC_MSGT_ID_ACK:
LOGPFSML(conn->fi, LOGL_DEBUG, "ID_ACK? -> ACK!\n");
@@ -767,6 +764,11 @@
if (!conn)
return 0; /* rspro conn is already being destroyed, do nothing. */
osmo_stream_srv_set_data(peer, NULL);
+ if (conn->ka_fi) {
+ osmo_ipa_ka_fsm_stop(conn->ka_fi);
+ osmo_ipa_ka_fsm_free(conn->ka_fi);
+ conn->ka_fi = NULL;
+ }
if (conn->fi) {
conn->peer = NULL;
osmo_fsm_inst_dispatch(conn->fi, CLNTC_E_TCP_DOWN, NULL);
@@ -776,17 +778,22 @@
return 0;
}
-static const struct ipa_keepalive_params ka_params = {
- .interval = 30,
- .wait_for_resp = 10,
-};
-
-static void ipa_keepalive_send_cb(struct osmo_fsm_inst *fi, void *conn, struct msgb
*msg)
+static int ipa_keepalive_send_cb(struct osmo_ipa_ka_fsm_inst *ka_fi, struct msgb *msg)
{
- struct osmo_stream_srv *srv = (struct osmo_stream_srv *)conn;
+ struct osmo_stream_srv *srv = osmo_ipa_ka_fsm_get_data(ka_fi);
osmo_stream_srv_send(srv, msg);
+ return 0;
}
+static int ipa_keepalive_timeout_cb(struct osmo_ipa_ka_fsm_inst *ka_fi)
+{
+ struct osmo_stream_srv *peer = osmo_ipa_ka_fsm_get_data(ka_fi);
+ struct rspro_client_conn *conn = osmo_stream_srv_get_data(peer);
+ osmo_fsm_inst_dispatch(conn->fi, CLNTC_E_KA_TIMEOUT, NULL);
+ return 0;
+}
+
+
/* a new TCP connection was accepted on the RSPRO server socket */
static int accept_cb(struct osmo_stream_srv_link *link, int fd)
{
@@ -812,13 +819,15 @@
goto out_err_conn;
/* use ipa_keepalive_fsm to periodically send an IPA_PING and expect a PONG in response
*/
- conn->keepalive_fi = ipa_generic_conn_alloc_keepalive_fsm(conn->peer,
conn->peer, &ka_params, NULL);
- if (!conn->keepalive_fi)
+ conn->ka_fi = osmo_ipa_ka_fsm_alloc(conn->peer, conn->fi->id);
+ if (!conn->ka_fi)
goto out_err_fi;
- /* ensure parent is notified once keepalive FSM instance is dying */
- osmo_fsm_inst_change_parent(conn->keepalive_fi, conn->fi, CLNTC_E_KA_TIMEOUT);
- ipa_keepalive_fsm_set_send_cb(conn->keepalive_fi, ipa_keepalive_send_cb);
- ipa_keepalive_fsm_start(conn->keepalive_fi);
+ osmo_ipa_ka_fsm_set_data(conn->ka_fi, conn->peer);
+ osmo_ipa_ka_fsm_set_ping_interval(conn->ka_fi, 30);
+ osmo_ipa_ka_fsm_set_pong_timeout(conn->ka_fi, 10);
+ osmo_ipa_ka_fsm_set_send_cb(conn->ka_fi, ipa_keepalive_send_cb);
+ osmo_ipa_ka_fsm_set_timeout_cb(conn->ka_fi, ipa_keepalive_timeout_cb);
+ osmo_ipa_ka_fsm_start(conn->ka_fi);
INIT_LLIST_HEAD(&conn->bank.maps_new);
INIT_LLIST_HEAD(&conn->bank.maps_unack);
diff --git a/src/server/rspro_server.h b/src/server/rspro_server.h
index 4843821..1bef81f 100644
--- a/src/server/rspro_server.h
+++ b/src/server/rspro_server.h
@@ -4,6 +4,7 @@
#include <osmocom/core/select.h>
#include <osmocom/core/fsm.h>
#include <osmocom/netif/stream.h>
+#include <osmocom/netif/ipa.h>
#include "rspro_util.h"
#include "slotmap.h"
@@ -36,7 +37,7 @@
/* remote component identity (after it has been received) */
struct app_comp_id comp_id;
/* keep-alive handling FSM */
- struct osmo_fsm_inst *keepalive_fi;
+ struct osmo_ipa_ka_fsm_inst *ka_fi;
struct {
struct llist_head maps_new;
--
To view, visit
https://gerrit.osmocom.org/c/osmo-remsim/+/39044?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmo-remsim
Gerrit-Branch: master
Gerrit-Change-Id: Id9784c69f1524872053436b59712f67ad5fbfe94
Gerrit-Change-Number: 39044
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>