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