<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/14743">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add ipa pingp/pong keepalive for OML/RSL links between bts and bsc<br><br>Change-Id: I30e3bd601e55355aaf738ee2f2c44c1ec2c46c6a<br>---<br>M include/osmocom/abis/e1_input.h<br>M src/e1_input_vty.c<br>M src/input/ipaccess.c<br>3 files changed, 186 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/43/14743/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h</span><br><span>index e6d5154..4459392 100644</span><br><span>--- a/include/osmocom/abis/e1_input.h</span><br><span>+++ b/include/osmocom/abis/e1_input.h</span><br><span>@@ -187,11 +187,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 d81c859..3c6a268 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,40 @@</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%);">+DEFUN(cfg_e1line_ipakeepalive, cfg_e1_line_ipakeepalive_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "e1_line <0-255> ipakeepalive <0-300> <1-300>",</span><br><span style="color: hsl(120, 100%, 40%);">+ E1_LINE_HELP "Enable IPA PING/PONG keepalive\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Idle interval in seconds before probes are sent, 0 disables keepalive\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%);">+ int e1_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ int interval = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ int waittime = atoi(argv[2]);</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%);">+ 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%);">+ if (!line->driver->has_keepalive) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%% Driver '%s' does not support keep alive%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ line->driver->name, 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(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 = waittime;</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%);">+ return CMD_SUCCESS;</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 +277,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 ipakeepalive %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 +436,7 @@</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_ipakeepalive_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 fb6ad10..b2b6a6b 100644</span><br><span>--- a/src/input/ipaccess.c</span><br><span>+++ b/src/input/ipaccess.c</span><br><span>@@ -59,15 +59,28 @@</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%);">+#define ka_fsm_for_ts(ipaline,ofd) (ipaline->ka_fsm[ofd->priv_nr-1])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ipaccess_line {</span><br><span style="color: hsl(120, 100%, 40%);">+ int line_already_initialized;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst* ka_fsm[NUM_E1_TS];</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> struct e1inp_ts *e1i_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipaccess_line *il = line->driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst* f = ka_fsm_for_ts(il, bfd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (bfd->priv_nr == E1INP_SIGN_OML)</span><br><span> e1i_ts = e1inp_line_ipa_oml_ts(line);</span><br><span> else</span><br><span> e1i_ts = e1inp_line_ipa_rsl_ts(line, bfd->priv_nr - E1INP_SIGN_RSL);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if(f)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_stop(f);</span><br><span style="color: hsl(120, 100%, 40%);">+</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> LOGP(DLINP, LOGL_ERROR, "Forcing socket shutdown with "</span><br><span>@@ -87,6 +100,29 @@</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%);">+ struct osmo_fd *bfd = (struct osmo_fd *)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 = send(bfd->fd, msg->data, msg->len, 0);</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%);">+ 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%);">+ struct e1inp_line *line = (struct e1inp_line *) bfd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipaccess_line *il = line->driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_drop(bfd, line);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* fsm will free itself upon returning */</span><br><span style="color: hsl(120, 100%, 40%);">+ ka_fsm_for_ts(il, bfd) = NULL;</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> /* 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 +134,11 @@</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 ipaccess_line *il = line->driver_data;</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(ka_fsm_for_ts(il,bfd) && msg_type == IPAC_MSGT_PONG)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_pong_received(ka_fsm_for_ts(il,bfd));</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>@@ -152,6 +193,7 @@</span><br><span> }</span><br><span> /* the BSC creates the new sign links at this stage. */</span><br><span> if (bfd->priv_nr == E1INP_SIGN_OML) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst** f = &ka_fsm_for_ts(il,bfd);</span><br><span> sign_link =</span><br><span> line->ops->sign_link_up(&unit_data, line,</span><br><span> E1INP_SIGN_OML);</span><br><span>@@ -161,10 +203,22 @@</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%);">+ if(*f)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(line->ipa_kap){</span><br><span style="color: hsl(120, 100%, 40%);">+ *f = ipa_generic_conn_alloc_keepalive_fsm(tall_ipa_ctx, bfd, line->ipa_kap, "oml_bsc_to_bts");</span><br><span style="color: hsl(120, 100%, 40%);">+ if(line->ipa_kap && f){</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(*f, ipa_bsc_keepalive_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_send_cb(*f, ipa_bsc_keepalive_write_server_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</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 style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst** f;</span><br><span> </span><br><span> sign_link =</span><br><span> line->ops->sign_link_up(&unit_data, line,</span><br><span>@@ -205,6 +259,19 @@</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%);">+ il = new_line->driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ f = &ka_fsm_for_ts(il,newbfd);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(*f)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(new_line->ipa_kap) {</span><br><span style="color: hsl(120, 100%, 40%);">+ *f = ipa_generic_conn_alloc_keepalive_fsm(tall_ipa_ctx, newbfd, new_line->ipa_kap, "rsl_bsc_to_bts");</span><br><span style="color: hsl(120, 100%, 40%);">+ if(f){</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(*f, ipa_bsc_keepalive_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_send_cb(*f, ipa_bsc_keepalive_write_server_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> return 1;</span><br><span> }</span><br><span> break;</span><br><span>@@ -231,6 +298,9 @@</span><br><span> struct ipaccess_head *hh;</span><br><span> struct msgb *msg = NULL;</span><br><span> int ret, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipaccess_line *il = line->driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst** f = &ka_fsm_for_ts(il,bfd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> if (bfd->priv_nr == E1INP_SIGN_OML)</span><br><span> e1i_ts = e1inp_line_ipa_oml_ts(line);</span><br><span>@@ -291,6 +361,9 @@</span><br><span> err_msg:</span><br><span> msgb_free(msg);</span><br><span> err:</span><br><span style="color: hsl(120, 100%, 40%);">+ if(*f)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ *f = NULL;</span><br><span> ipaccess_drop(bfd, line);</span><br><span> return -EBADF;</span><br><span> }</span><br><span>@@ -306,6 +379,14 @@</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%);">+ /* line might not exist if != bsc||bts */</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 ipaccess_line *il = line ? line->driver_data : 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+ if(il && ka_fsm_for_ts(il,bfd))</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_stop(ka_fsm_for_ts(il,bfd));</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>@@ -324,6 +405,8 @@</span><br><span> struct e1inp_sign_link *sign_link;</span><br><span> struct msgb *msg;</span><br><span> int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipaccess_line *il = line->driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst** f = &ka_fsm_for_ts(il,bfd);</span><br><span> </span><br><span> if (bfd->priv_nr == E1INP_SIGN_OML)</span><br><span> e1i_ts = e1inp_line_ipa_oml_ts(line);</span><br><span>@@ -372,6 +455,9 @@</span><br><span> msgb_free(msg);</span><br><span> return ret;</span><br><span> err:</span><br><span style="color: hsl(120, 100%, 40%);">+ if(*f)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ *f = NULL;</span><br><span> ipaccess_drop(bfd, line);</span><br><span> msgb_free(msg);</span><br><span> return ret;</span><br><span>@@ -677,11 +763,15 @@</span><br><span> static void ipaccess_bts_updown_cb(struct ipa_client_conn *link, int up)</span><br><span> {</span><br><span> struct e1inp_line *line = link->line;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ipaccess_line *il = line->driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst *f = ka_fsm_for_ts(il,link->ofd);</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%);">+ update_fd_settings(line, link->ofd->fd);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(f && line->ipa_kap)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_start(f);</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>@@ -695,11 +785,18 @@</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 style="color: hsl(120, 100%, 40%);">+ struct ipaccess_line *il = line ? line->driver_data : 0;</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> </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(il && ka_fsm_for_ts(il,link->ofd) && msg_type == IPAC_MSGT_PONG)</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_pong_received(ka_fsm_for_ts(il,link->ofd));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* ping, pong and acknowledgment cases. */</span><br><span> ret = ipa_ccm_rcvmsg_bts_base(msg, link->ofd);</span><br><span> if (ret < 0)</span><br><span>@@ -823,9 +920,21 @@</span><br><span> return -EBADF;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct ipaccess_line {</span><br><span style="color: hsl(0, 100%, 40%);">- int line_already_initialized;</span><br><span style="color: hsl(0, 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 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> </span><br><span> static int ipaccess_line_update(struct e1inp_line *line)</span><br><span> {</span><br><span>@@ -889,6 +998,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 osmo_fsm_inst** f = &il->ka_fsm[0];</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>@@ -915,6 +1025,17 @@</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%);">+ if(*f)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(line->ipa_kap){</span><br><span style="color: hsl(120, 100%, 40%);">+ *f = ipa_client_conn_alloc_keepalive_fsm(link, line->ipa_kap, "oml_bts_to_bsc");</span><br><span style="color: hsl(120, 100%, 40%);">+ if(*f){</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(*f, ipa_bts_keepalive_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_send_cb(*f, 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 style="color: hsl(120, 100%, 40%);">+</span><br><span> ret = 0;</span><br><span> break;</span><br><span> }</span><br><span>@@ -924,7 +1045,6 @@</span><br><span> return ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* backwards compatibility */</span><br><span> int e1inp_ipa_bts_rsl_connect(struct e1inp_line *line,</span><br><span> const char *rem_addr, uint16_t rem_port)</span><br><span>@@ -937,6 +1057,8 @@</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 ipaccess_line *il = line->driver_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst** f = &il->ka_fsm[1+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>@@ -964,6 +1086,17 @@</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%);">+ if(*f)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_free(*f);</span><br><span style="color: hsl(120, 100%, 40%);">+ if(line->ipa_kap){</span><br><span style="color: hsl(120, 100%, 40%);">+ *f = ipa_client_conn_alloc_keepalive_fsm(rsl_link, line->ipa_kap, "rsl_bts_to_bsc");</span><br><span style="color: hsl(120, 100%, 40%);">+ if(*f){</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_timeout_cb(*f, ipa_bts_keepalive_timeout_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_set_send_cb(*f, 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 style="color: hsl(120, 100%, 40%);">+</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: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>