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>