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 <pes...@sysmocom.de>

Reply via email to