<p>osmith <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/14743">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, but someone else must approve
fixeria: Looks good to me, but someone else must approve
osmith: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add ipa ping/pong keepalive for OML/RSL links between bts and bsc<br><br>Patch-by: ewild, osmith<br>Related: OS#4070<br>Change-Id: I30e3bd601e55355aaf738ee2f2c44c1ec2c46c6a<br>Depends: (libosmo-abis) Ie453fdee8bfd7fc1a3f1ed67ef0331f0abb1d59b<br>---<br>M TODO-RELEASE<br>M include/osmocom/abis/e1_input.h<br>M src/e1_input_vty.c<br>M src/input/ipaccess.c<br>4 files changed, 204 insertions(+), 22 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>index d0852fc..e2f62ef 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -7,3 +7,4 @@</span><br><span> # If any interfaces have been added since the last public release: c:r:a + 1.</span><br><span> # If any interfaces have been removed or changed since the last public release: c:r:0.</span><br><span> #library what description / commit summary line</span><br><span style="color: hsl(120, 100%, 40%);">+libosmo-abis API change major: add parameter to struct e1inp_line</span><br><span>diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h</span><br><span>index 00b4aaa..4362f50 100644</span><br><span>--- a/include/osmocom/abis/e1_input.h</span><br><span>+++ b/include/osmocom/abis/e1_input.h</span><br><span>@@ -123,6 +123,8 @@</span><br><span> struct {</span><br><span> /* ip.access driver has one fd for each ts */</span><br><span> struct osmo_fd fd;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ipa keep-alive */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst* ka_fsm;</span><br><span> } ipaccess;</span><br><span> struct {</span><br><span> /* DAHDI driver has one fd for each ts */</span><br><span>@@ -197,11 +199,14 @@</span><br><span> char *sock_path;</span><br><span> struct rate_ctr_group *rate_ctr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* keepalive configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* tcp keepalive configuration */</span><br><span> int keepalive_num_probes; /* 0: disable, num, or E1INP_USE_DEFAULT */</span><br><span> int keepalive_idle_timeout; /* secs, or E1INP_USE_DEFAULT */</span><br><span> int keepalive_probe_interval; /* secs or E1INP_USE_DEFAULT */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* ipa ping/pong keepalive params */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_keepalive_params *ipa_kap;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* array of timestlots */</span><br><span> struct e1inp_ts ts[NUM_E1_TS];</span><br><span> unsigned int num_ts;</span><br><span>diff --git a/src/e1_input_vty.c b/src/e1_input_vty.c</span><br><span>index a1943e6..8d89d04 100644</span><br><span>--- a/src/e1_input_vty.c</span><br><span>+++ b/src/e1_input_vty.c</span><br><span>@@ -38,6 +38,7 @@</span><br><span> #include <osmocom/vty/telnet_interface.h></span><br><span> </span><br><span> #include <osmocom/abis/e1_input.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/ipa.h></span><br><span> </span><br><span> /* CONFIG */</span><br><span> </span><br><span>@@ -169,6 +170,47 @@</span><br><span> return set_keepalive_params(vty, atoi(argv[0]), 0, 0, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define IPA_KEEPALIVE_HELP "Enable IPA PING/PONG keep-alive\n"</span><br><span style="color: hsl(120, 100%, 40%);">+static int set_ipa_keepalive_params(struct vty *vty, int e1_nr, int interval, int wait_for_resp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_line *line = e1inp_line_find(e1_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!line) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</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%);">+ if (strcmp(line->driver->name, "ipa") != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%% Line %d doesn't use the ipa driver%s", e1_nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</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%);">+ TALLOC_FREE(line->ipa_kap);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (interval) {</span><br><span style="color: hsl(120, 100%, 40%);">+ line->ipa_kap = talloc_zero(line, struct ipa_keepalive_params);</span><br><span style="color: hsl(120, 100%, 40%);">+ line->ipa_kap->wait_for_resp = wait_for_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+ line->ipa_kap->interval = interval;</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 style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_e1line_ipa_keepalive, cfg_e1_line_ipa_keepalive_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "e1_line <0-255> ipa-keepalive <1-300> <1-300>",</span><br><span style="color: hsl(120, 100%, 40%);">+ E1_LINE_HELP IPA_KEEPALIVE_HELP</span><br><span style="color: hsl(120, 100%, 40%);">+ "Idle interval in seconds before probes are sent\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Time to wait for PONG response\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return set_ipa_keepalive_params(vty, atoi(argv[0]), atoi(argv[1]), atoi(argv[2]));</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%);">+DEFUN(cfg_e1line_no_ipa_keepalive, cfg_e1_line_no_ipa_keepalive_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "no e1_line <0-255> ipa-keepalive",</span><br><span style="color: hsl(120, 100%, 40%);">+ NO_STR E1_LINE_HELP IPA_KEEPALIVE_HELP)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return set_ipa_keepalive_params(vty, atoi(argv[0]), 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_e1line_name, cfg_e1_line_name_cmd,</span><br><span> "e1_line <0-255> name .LINE",</span><br><span> E1_LINE_HELP "Set name for this line\n" "Human readable name\n")</span><br><span>@@ -242,7 +284,10 @@</span><br><span> line->keepalive_num_probes,</span><br><span> line->keepalive_probe_interval,</span><br><span> VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ if (line->ipa_kap)</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " e1_line %u ipa-keepalive %d %d%s", line->num,</span><br><span style="color: hsl(120, 100%, 40%);">+ line->ipa_kap->interval, line->ipa_kap->wait_for_resp,</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span> const char *ipa_bind = e1inp_ipa_get_bind_addr();</span><br><span>@@ -398,6 +443,8 @@</span><br><span> install_element(L_E1INP_NODE, &cfg_e1_line_keepalive_cmd);</span><br><span> install_element(L_E1INP_NODE, &cfg_e1_line_keepalive_params_cmd);</span><br><span> install_element(L_E1INP_NODE, &cfg_e1_line_no_keepalive_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(L_E1INP_NODE, &cfg_e1_line_ipa_keepalive_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(L_E1INP_NODE, &cfg_e1_line_no_ipa_keepalive_cmd);</span><br><span> </span><br><span> install_element(L_E1INP_NODE, &cfg_ipa_bind_cmd);</span><br><span> </span><br><span>diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c</span><br><span>index 9eff2f1..e1936af 100644</span><br><span>--- a/src/input/ipaccess.c</span><br><span>+++ b/src/input/ipaccess.c</span><br><span>@@ -59,14 +59,31 @@</span><br><span> #define DEFAULT_TCP_KEEPALIVE_INTERVAL 3</span><br><span> #define DEFAULT_TCP_KEEPALIVE_RETRY_COUNT 10</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static inline struct e1inp_ts *ipaccess_line_ts(struct osmo_fd *bfd, struct e1inp_line *line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bfd->priv_nr == E1INP_SIGN_OML)</span><br><span style="color: hsl(120, 100%, 40%);">+ return e1inp_line_ipa_oml_ts(line);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ return e1inp_line_ipa_rsl_ts(line, bfd->priv_nr - E1INP_SIGN_RSL);</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%);">+static inline void ipaccess_keepalive_fsm_cleanup(struct e1inp_ts *e1i_ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst *ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ka_fsm = e1i_ts->driver.ipaccess.ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ka_fsm) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_stop(ka_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts->driver.ipaccess.ka_fsm = NULL;</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> static int ipaccess_drop(struct osmo_fd *bfd, struct e1inp_line *line)</span><br><span> {</span><br><span> int ret = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- struct e1inp_ts *e1i_ts;</span><br><span style="color: hsl(0, 100%, 40%);">- if (bfd->priv_nr == E1INP_SIGN_OML)</span><br><span style="color: hsl(0, 100%, 40%);">- e1i_ts = e1inp_line_ipa_oml_ts(line);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- e1i_ts = e1inp_line_ipa_rsl_ts(line, bfd->priv_nr - E1INP_SIGN_RSL);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_ts *e1i_ts = ipaccess_line_ts(bfd, line);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_keepalive_fsm_cleanup(e1i_ts);</span><br><span> </span><br><span> /* Error case: we did not see any ID_RESP yet for this socket. */</span><br><span> if (bfd->fd != -1) {</span><br><span>@@ -87,6 +104,80 @@</span><br><span> return ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void ipa_bsc_keepalive_write_server_cb(struct osmo_fsm_inst *fi, void *conn, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fd *bfd = (struct osmo_fd *)conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ write(bfd->fd, msg->data, msg->len);</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</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%);">+static int ipa_bsc_keepalive_timeout_cb(struct osmo_fsm_inst *fi, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fd *bfd = (struct osmo_fd *)data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bfd->fd == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_drop(bfd, (struct e1inp_line *)bfd->data);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 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%);">+static void ipaccess_bsc_keepalive_fsm_alloc(struct e1inp_ts *e1i_ts, struct osmo_fd *bfd, const char *id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_line *line = e1i_ts->line;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst *ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_keepalive_fsm_cleanup(e1i_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!line->ipa_kap)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ka_fsm = ipa_generic_conn_alloc_keepalive_fsm(tall_ipa_ctx, bfd, line->ipa_kap, id);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts->driver.ipaccess.ka_fsm = ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(ka_fsm, ipa_bsc_keepalive_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_send_cb(ka_fsm, ipa_bsc_keepalive_write_server_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(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%);">+static void ipa_bts_keepalive_write_client_cb(struct osmo_fsm_inst *fi, void *conn, struct msgb *msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipa_client_conn *link = (struct ipa_client_conn *)conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ int ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ret = ipa_send(link->ofd->fd, msg->data, msg->len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ret != msg->len) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DLINP, LOGL_ERROR, "cannot send message. Reason: %s\n", strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</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%);">+static void update_fd_settings(struct e1inp_line *line, int fd);</span><br><span style="color: hsl(120, 100%, 40%);">+static void ipaccess_bts_updown_cb(struct ipa_client_conn *link, int up);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int ipa_bts_keepalive_timeout_cb(struct osmo_fsm_inst *fi, void *conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_bts_updown_cb(conn, false);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 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%);">+static void ipaccess_bts_keepalive_fsm_alloc(struct e1inp_ts *e1i_ts, struct ipa_client_conn *client, const char *id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_line *line = e1i_ts->line;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst *ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_keepalive_fsm_cleanup(e1i_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!line->ipa_kap)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ka_fsm = ipa_client_conn_alloc_keepalive_fsm(client, line->ipa_kap, id);</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts->driver.ipaccess.ka_fsm = ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(ka_fsm, ipa_bts_keepalive_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_send_cb(ka_fsm, ipa_bts_keepalive_write_client_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Returns -1 on error, and 0 or 1 on success. If -1 or 1 is returned, line has</span><br><span> * been released and should not be used anymore by the caller. */</span><br><span> static int ipaccess_rcvmsg(struct e1inp_line *line, struct msgb *msg,</span><br><span>@@ -98,6 +189,14 @@</span><br><span> struct e1inp_sign_link *sign_link;</span><br><span> char *unitid;</span><br><span> int len, ret;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_ts *e1i_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst *ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* peek the pong for our keepalive fsm */</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts = ipaccess_line_ts(bfd, line);</span><br><span style="color: hsl(120, 100%, 40%);">+ ka_fsm = e1i_ts->driver.ipaccess.ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ka_fsm && msg_type == IPAC_MSGT_PONG)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_pong_received(ka_fsm);</span><br><span> </span><br><span> /* Handle IPA PING, PONG and ID_ACK messages. */</span><br><span> ret = ipa_ccm_rcvmsg_base(msg, bfd);</span><br><span>@@ -165,9 +264,12 @@</span><br><span> "closing socket.\n");</span><br><span> goto err;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_bsc_keepalive_fsm_alloc(e1i_ts, bfd, "oml_bsc_to_bts");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> } else if (bfd->priv_nr == E1INP_SIGN_RSL) {</span><br><span> struct e1inp_ts *ts;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_fd *newbfd;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fd *newbfd;</span><br><span> struct e1inp_line *new_line;</span><br><span> </span><br><span> sign_link =</span><br><span>@@ -209,6 +311,9 @@</span><br><span> }</span><br><span> /* now we can release the dummy RSL line. */</span><br><span> e1inp_line_put(line);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts = ipaccess_line_ts(newbfd, new_line);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_bsc_keepalive_fsm_alloc(e1i_ts, newbfd, "rsl_bsc_to_bts");</span><br><span> return 1;</span><br><span> }</span><br><span> break;</span><br><span>@@ -238,11 +343,7 @@</span><br><span> struct msgb *msg = NULL;</span><br><span> int ret, rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (bfd->priv_nr == E1INP_SIGN_OML)</span><br><span style="color: hsl(0, 100%, 40%);">- e1i_ts = e1inp_line_ipa_oml_ts(line);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- e1i_ts = e1inp_line_ipa_rsl_ts(line, bfd->priv_nr - E1INP_SIGN_RSL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts = ipaccess_line_ts(bfd, line);</span><br><span> ret = ipa_msg_recv_buffered(bfd->fd, &msg, &e1i_ts->pending_msg);</span><br><span> if (ret < 0) {</span><br><span> if (ret == -EAGAIN)</span><br><span>@@ -312,6 +413,17 @@</span><br><span> {</span><br><span> struct e1inp_ts *e1i_ts = sign_link->ts;</span><br><span> struct osmo_fd *bfd = &e1i_ts->driver.ipaccess.fd;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_line *line = e1i_ts->line;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* line might not exist if != bsc||bts */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (line) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* depending on caller the fsm might be dead */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst* ka_fsm = ipaccess_line_ts(bfd, line)->driver.ipaccess.ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ka_fsm)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_stop(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 e1inp_close_socket(e1i_ts, sign_link, bfd);</span><br><span> }</span><br><span> </span><br><span>@@ -331,11 +443,7 @@</span><br><span> struct msgb *msg;</span><br><span> int ret;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (bfd->priv_nr == E1INP_SIGN_OML)</span><br><span style="color: hsl(0, 100%, 40%);">- e1i_ts = e1inp_line_ipa_oml_ts(line);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- e1i_ts = e1inp_line_ipa_rsl_ts(line, bfd->priv_nr - E1INP_SIGN_RSL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts = ipaccess_line_ts(bfd, line);</span><br><span> bfd->when &= ~BSC_FD_WRITE;</span><br><span> </span><br><span> /* get the next msg for this timeslot */</span><br><span>@@ -378,6 +486,7 @@</span><br><span> msgb_free(msg);</span><br><span> return ret;</span><br><span> err:</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_keepalive_fsm_cleanup(e1i_ts);</span><br><span> ipaccess_drop(bfd, line);</span><br><span> msgb_free(msg);</span><br><span> return ret;</span><br><span>@@ -684,10 +793,14 @@</span><br><span> {</span><br><span> struct e1inp_line *line = link->line;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (up) {</span><br><span style="color: hsl(0, 100%, 40%);">- update_fd_settings(line, link->ofd->fd);</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(120, 100%, 40%);">+ if (up) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst *ka_fsm = ipaccess_line_ts(link->ofd, line)->driver.ipaccess.ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ update_fd_settings(line, link->ofd->fd);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ka_fsm && line->ipa_kap)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(ka_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> if (line->ops->sign_link_down)</span><br><span> line->ops->sign_link_down(line);</span><br><span>@@ -701,10 +814,19 @@</span><br><span> struct ipaccess_head *hh = (struct ipaccess_head *) msg->data;</span><br><span> struct msgb *rmsg;</span><br><span> int ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* line might not exist if != bsc||bts */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_line *line = link->line;</span><br><span> </span><br><span> /* special handling for IPA CCM. */</span><br><span> if (hh->proto == IPAC_PROTO_IPACCESS) {</span><br><span> uint8_t msg_type = *(msg->l2h);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst* ka_fsm = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* peek the pong for our keepalive fsm */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (line && msg_type == IPAC_MSGT_PONG) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ka_fsm = ipaccess_line_ts(link->ofd, line)->driver.ipaccess.ka_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_pong_received(ka_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> /* ping, pong and acknowledgment cases. */</span><br><span> ret = ipa_ccm_rcvmsg_bts_base(msg, link->ofd);</span><br><span>@@ -895,6 +1017,7 @@</span><br><span> }</span><br><span> case E1INP_LINE_R_BTS: {</span><br><span> struct ipa_client_conn *link;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_ts *e1i_ts;</span><br><span> </span><br><span> LOGP(DLINP, LOGL_NOTICE, "enabling ipaccess BTS mode, "</span><br><span> "OML connecting to %s:%u\n", line->ops->cfg.ipa.addr,</span><br><span>@@ -922,6 +1045,9 @@</span><br><span> ipa_client_conn_destroy(link);</span><br><span> return -EIO;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ e1i_ts = e1inp_line_ipa_oml_ts(line);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_bts_keepalive_fsm_alloc(e1i_ts, link, "oml_bts_to_bsc");</span><br><span> ret = 0;</span><br><span> break;</span><br><span> }</span><br><span>@@ -944,6 +1070,7 @@</span><br><span> uint8_t trx_nr)</span><br><span> {</span><br><span> struct ipa_client_conn *rsl_link;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_ts *e1i_ts = e1inp_line_ipa_rsl_ts(line, trx_nr);</span><br><span> </span><br><span> if (E1INP_SIGN_RSL+trx_nr-1 >= NUM_E1_TS) {</span><br><span> LOGP(DLINP, LOGL_ERROR, "cannot create RSL BTS link: "</span><br><span>@@ -972,6 +1099,8 @@</span><br><span> ipa_client_conn_destroy(rsl_link);</span><br><span> return -EIO;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_bts_keepalive_fsm_alloc(e1i_ts, rsl_link, "rsl_bts_to_bsc");</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-abis/+/14743">change 14743</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/libosmo-abis/+/14743"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: libosmo-abis </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I30e3bd601e55355aaf738ee2f2c44c1ec2c46c6a </div>
<div style="display:none"> Gerrit-Change-Number: 14743 </div>
<div style="display:none"> Gerrit-PatchSet: 12 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Assignee: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>