<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>