<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13419">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use osmo_lcls instead of anonymous struct<br><br>This allows us to (re)use code from libosmocore for parameter checks,<br>printing etc.<br><br>Change-Id: I0f2c2a065755d9051fc7d7ce52c19ab0b7d9288a<br>Related: OS#2487<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M include/osmocom/bsc/osmo_bsc_lcls.h<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M src/osmo-bsc/osmo_bsc_lcls.c<br>6 files changed, 71 insertions(+), 106 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/19/13419/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 47ca5e8..3ee7694 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -292,10 +292,7 @@</span><br><span> </span><br><span>    /* LCLS (local call, local switch) related state */</span><br><span>  struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t global_call_ref[15];</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t global_call_ref_len; /* length of global_call_ref */</span><br><span style="color: hsl(0, 100%, 40%);">-            enum gsm0808_lcls_config config;        /* TS 48.008 3.2.2.116 */</span><br><span style="color: hsl(0, 100%, 40%);">-               enum gsm0808_lcls_control control;      /* TS 48.008 3.2.2.117 */</span><br><span style="color: hsl(120, 100%, 40%);">+             struct osmo_lcls *par; /* LCLS parameters */</span><br><span>                 /* LCLS FSM */</span><br><span>               struct osmo_fsm_inst *fi;</span><br><span>            /* pointer to "other" connection, if Call Leg Relocation was successful */</span><br><span>diff --git a/include/osmocom/bsc/osmo_bsc_lcls.h b/include/osmocom/bsc/osmo_bsc_lcls.h</span><br><span>index 8bbd552..b7836ce 100644</span><br><span>--- a/include/osmocom/bsc/osmo_bsc_lcls.h</span><br><span>+++ b/include/osmocom/bsc/osmo_bsc_lcls.h</span><br><span>@@ -47,9 +47,6 @@</span><br><span> </span><br><span> enum gsm0808_lcls_status lcls_get_status(const struct gsm_subscriber_connection *conn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void lcls_update_config(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                     const uint8_t *config, const uint8_t *control);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> void lcls_apply_config(struct gsm_subscriber_connection *conn);</span><br><span> </span><br><span> extern struct osmo_fsm lcls_fsm;</span><br><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index 1cc0c78..3f43801 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -889,16 +889,28 @@</span><br><span>              return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ conn->lcls.par = talloc_zero(conn, struct osmo_lcls);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* indicate "IE not [yet] received" */</span><br><span style="color: hsl(0, 100%, 40%);">-        conn->lcls.config = GSM0808_LCLS_CFG_NA;</span><br><span style="color: hsl(0, 100%, 40%);">-     conn->lcls.control = GSM0808_LCLS_CSC_NA;</span><br><span style="color: hsl(120, 100%, 40%);">+  conn->lcls.par->config = GSM0808_LCLS_CFG_NA;</span><br><span style="color: hsl(120, 100%, 40%);">+   conn->lcls.par->control = GSM0808_LCLS_CSC_NA;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       conn->lcls.fi = osmo_fsm_inst_alloc_child(&lcls_fsm, conn->fi, GSCON_EV_LCLS_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      if (!conn->lcls.fi) {</span><br><span>             osmo_fsm_inst_term(conn->fi, OSMO_FSM_TERM_ERROR, NULL);</span><br><span>          return NULL;</span><br><span>         }</span><br><span>    conn->lcls.fi->priv = conn;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (conn->lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOG_LCHAN(conn->lchan, LOGL_NOTICE, "New %s\n", osmo_lcls_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+              LOG_LCHAN(conn->lchan, LOGL_NOTICE, "New %s\n", osmo_gcr_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPFSM(conn->fi, "New %s\n", osmo_lcls_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPFSM(conn->fi, "New %s\n", osmo_gcr_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  llist_add_tail(&conn->entry, &net->subscr_conns);</span><br><span>      return conn;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 9413d36..769ddeb 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -1586,16 +1586,9 @@</span><br><span>      vty_out(vty, "conn ID=%u, MSC=%u, hodec2_fail=%d, mgw_ep=%s%s",</span><br><span>            conn->sccp.conn_id, conn->sccp.msc->nr, conn->hodec2.failures,</span><br><span>           mgw_endpoint_name(conn->user_plane.mgw_endpoint), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (conn->lcls.global_call_ref_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, " LCLS GCR: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                       osmo_hexdump_nospc(conn->lcls.global_call_ref, conn->lcls.global_call_ref_len),</span><br><span style="color: hsl(0, 100%, 40%);">-                   VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, " LCLS Config: %s, LCLS Control: %s, LCLS BSS Status: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                     gsm0808_lcls_config_name(conn->lcls.config),</span><br><span style="color: hsl(0, 100%, 40%);">-                 gsm0808_lcls_control_name(conn->lcls.control),</span><br><span style="color: hsl(0, 100%, 40%);">-                       osmo_fsm_inst_state_name(conn->lcls.fi),</span><br><span style="color: hsl(0, 100%, 40%);">-                     VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, " %s%s", osmo_lcls_dump(conn->lcls.par), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_out(vty, "  %s%s", osmo_gcr_dump(conn->lcls.par), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   if (conn->lchan)</span><br><span>          lchan_dump_full_vty(vty, conn->lchan);</span><br><span>    if (conn->assignment.new_lchan)</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index 85aab22..74f0901 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -541,36 +541,20 @@</span><br><span> </span><br><span> /* handle LCLS specific IES in BSSMAP ASS REQ */</span><br><span> static void bssmap_handle_ass_req_lcls(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   const struct tlv_parsed *tp)</span><br><span style="color: hsl(120, 100%, 40%);">+                                 const struct tlv_parsed *tp)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        const uint8_t *config, *control, *gcr, gcr_len = TLVP_LEN(tp, GSM0808_IE_GLOBAL_CALL_REF);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gcr_len > sizeof(conn->lcls.global_call_ref))</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGPFSML(conn->fi, LOGL_ERROR, "Global Call Ref IE of %u bytes is too long\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      gcr_len);</span><br><span style="color: hsl(0, 100%, 40%);">-      else {</span><br><span style="color: hsl(0, 100%, 40%);">-          gcr = TLVP_VAL_MINLEN(tp, GSM0808_IE_GLOBAL_CALL_REF, 13);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (gcr) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      LOGPFSM(conn->fi, "Setting GCR to %s\n", osmo_hexdump_nospc(gcr, gcr_len));</span><br><span style="color: hsl(0, 100%, 40%);">-                        memcpy(&conn->lcls.global_call_ref, gcr, gcr_len);</span><br><span style="color: hsl(0, 100%, 40%);">-                       conn->lcls.global_call_ref_len = gcr_len;</span><br><span style="color: hsl(0, 100%, 40%);">-            } else</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPFSML(conn->fi, LOGL_ERROR, "Global Call Ref IE of %u bytes is too short\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                             gcr_len);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       config = TLVP_VAL_MINLEN(tp, GSM0808_IE_LCLS_CONFIG, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        control = TLVP_VAL_MINLEN(tp, GSM0808_IE_LCLS_CONN_STATUS_CTRL, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (config || control) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPFSM(conn->fi, "BSSMAP ASS REQ contains LCLS (%s / %s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      config ? gsm0808_lcls_config_name(*config) : "NULL",</span><br><span style="color: hsl(0, 100%, 40%);">-                  control ? gsm0808_lcls_control_name(*control) : "NULL");</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Update the LCLS state with Config + CSC (if any) */</span><br><span style="color: hsl(0, 100%, 40%);">-  lcls_update_config(conn, config, control);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGPFSML(conn->fi, LOGL_NOTICE, "Old %s\n", osmo_lcls_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGPFSML(conn->fi, LOGL_NOTICE, "Old <%u> %s\n", conn->lcls.par->gcr_available, osmo_gcr_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc = gsm0808_dec_lcls(conn->lcls.par, tp);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPFSML(conn->fi, LOGL_ERROR, "LCLS decoding failed: %s\n", strerror(-rc));</span><br><span style="color: hsl(120, 100%, 40%);">+     } else</span><br><span style="color: hsl(120, 100%, 40%);">+                conn->lcls.par->gcr_available = true;</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGPFSML(conn->fi, LOGL_NOTICE, "New %s\n", osmo_lcls_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGPFSML(conn->fi, LOGL_NOTICE, "New <%u> %s\n", conn->lcls.par->gcr_available, osmo_gcr_dump(conn->lcls.par));</span><br><span style="color: hsl(120, 100%, 40%);">+   /* notify the LCLS FSM about new LCLS Config and/or CSC */</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_fsm_inst_dispatch(conn->lcls.fi, LCLS_EV_UPDATE_CFG_CSC, conn->lcls.par);</span><br><span>         /* Do not attempt to perform correlation yet, as during processing of the ASS REQ</span><br><span>     * we don't have the MGCP/MGW connections yet, and hence couldn't enable LS. */</span><br><span> }</span><br><span>@@ -581,7 +565,6 @@</span><br><span> {</span><br><span>      struct msgb *resp;</span><br><span>   struct tlv_parsed tp;</span><br><span style="color: hsl(0, 100%, 40%);">-   const uint8_t *config, *control;</span><br><span>     int rc;</span><br><span> </span><br><span>  OSMO_ASSERT(conn);</span><br><span>@@ -592,20 +575,8 @@</span><br><span>                     msgb_hexdump(msg));</span><br><span>                 return rc;</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       config = TLVP_VAL_MINLEN(&tp, GSM0808_IE_LCLS_CONFIG, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-   control = TLVP_VAL_MINLEN(&tp, GSM0808_IE_LCLS_CONN_STATUS_CTRL, 1);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    LOGPFSM(conn->fi, "Rx LCLS CONNECT CTRL (%s / %s)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-              config ? gsm0808_lcls_config_name(*config) : "NULL",</span><br><span style="color: hsl(0, 100%, 40%);">-          control ? gsm0808_lcls_control_name(*control) : "NULL");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (conn->lcls.global_call_ref_len == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPFSML(conn->fi, LOGL_ERROR, "Ignoring LCLS as no GCR was set before\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Update the LCLS state with Config + CSC (if any) */</span><br><span style="color: hsl(0, 100%, 40%);">-  lcls_update_config(conn, TLVP_VAL_MINLEN(&tp, GSM0808_IE_LCLS_CONFIG, 1),</span><br><span style="color: hsl(0, 100%, 40%);">-                           TLVP_VAL_MINLEN(&tp, GSM0808_IE_LCLS_CONN_STATUS_CTRL, 1));</span><br><span style="color: hsl(120, 100%, 40%);">+       bssmap_handle_ass_req_lcls(conn, &tp);</span><br><span>   lcls_apply_config(conn);</span><br><span> </span><br><span>         LOGPFSM(conn->fi, "Tx LCLS CONNECT CTRL ACK (%s)\n",</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_lcls.c b/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>index c1f62dc..e81e8f8 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>@@ -101,12 +101,12 @@</span><br><span>               /* don't report back the same connection */</span><br><span>              if (conn_other == conn_local)</span><br><span>                        continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               /* don't consider any conn where GCR length is not the same as before */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (conn_other->lcls.global_call_ref_len != conn_local->lcls.global_call_ref_len)</span><br><span style="color: hsl(0, 100%, 40%);">-                 continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!memcmp(conn_other->lcls.global_call_ref, conn_local->lcls.global_call_ref,</span><br><span style="color: hsl(0, 100%, 40%);">-                       conn_local->lcls.global_call_ref_len))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               if (osmo_gcr_eq(&conn_other->lcls.par->gcr, &conn_local->lcls.par->gcr))</span><br><span>                         return conn_other;</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPFSM(conn_local->lcls.fi, "LCLS local %s != other %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                              osmo_gcr_dump(conn_local->lcls.par), osmo_gcr_dump(conn_other->lcls.par));</span><br><span>     }</span><br><span>    return NULL;</span><br><span> }</span><br><span>@@ -126,7 +126,9 @@</span><br><span>      struct gsm_subscriber_connection *conn_other;</span><br><span> </span><br><span>    /* We can only correlate if a GCR is present */</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(conn_local->lcls.global_call_ref_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!conn_local->lcls.par->gcr_available)</span><br><span style="color: hsl(120, 100%, 40%);">+               return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* We can only correlate if we're not in active LS */</span><br><span>    OSMO_ASSERT(conn_local->lcls.fi->state != ST_LOCALLY_SWITCHED &&</span><br><span>                   conn_local->lcls.fi->state != ST_LOCALLY_SWITCHED_WAIT_BREAK &&</span><br><span>@@ -146,7 +148,7 @@</span><br><span>      conn_other = find_conn_with_same_gcr(conn_local);</span><br><span>    if (!conn_other) {</span><br><span>           /* we found no other call with same GCR: not possible */</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPFSM(conn_local->lcls.fi, "Unsuccessful correlation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPFSM(conn_local->lcls.fi, "Unsuccessful correlation: we found no other call with same GCR\n");</span><br><span>               return -ENODEV;</span><br><span>      }</span><br><span> </span><br><span>@@ -168,25 +170,25 @@</span><br><span>                                             const struct osmo_lcls *new_cfg_csc)</span><br><span> {</span><br><span>       static struct osmo_lcls old_cfg_csc = { 0 };</span><br><span style="color: hsl(0, 100%, 40%);">-    old_cfg_csc.config = conn->lcls.config;</span><br><span style="color: hsl(0, 100%, 40%);">-      old_cfg_csc.control = conn->lcls.control;</span><br><span style="color: hsl(120, 100%, 40%);">+  old_cfg_csc.config = conn->lcls.par->config;</span><br><span style="color: hsl(120, 100%, 40%);">+    old_cfg_csc.control = conn->lcls.par->control;</span><br><span> </span><br><span>     if (new_cfg_csc->config != GSM0808_LCLS_CFG_NA) {</span><br><span>                 if (!lcls_is_supported_config(new_cfg_csc->config))</span><br><span>                       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (conn->lcls.config != new_cfg_csc->config) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (conn->lcls.par->config != new_cfg_csc->config) {</span><br><span>                        LOGPFSM(conn->lcls.fi, "LCLS update Config %s -> %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                         gsm0808_lcls_config_name(conn->lcls.config),</span><br><span style="color: hsl(120, 100%, 40%);">+                               gsm0808_lcls_config_name(conn->lcls.par->config),</span><br><span>                              gsm0808_lcls_config_name(new_cfg_csc->config));</span><br><span style="color: hsl(0, 100%, 40%);">-                      conn->lcls.config = new_cfg_csc->config;</span><br><span style="color: hsl(120, 100%, 40%);">+                        conn->lcls.par->config = new_cfg_csc->config;</span><br><span>               }</span><br><span>    }</span><br><span>    if (new_cfg_csc->control != GSM0808_LCLS_CSC_NA) {</span><br><span style="color: hsl(0, 100%, 40%);">-           if (conn->lcls.control != new_cfg_csc->control) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (conn->lcls.par->control != new_cfg_csc->control) {</span><br><span>                      LOGPFSM(conn->lcls.fi, "LCLS update Control %s -> %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                gsm0808_lcls_control_name(conn->lcls.control),</span><br><span style="color: hsl(120, 100%, 40%);">+                             gsm0808_lcls_control_name(conn->lcls.par->control),</span><br><span>                            gsm0808_lcls_control_name(new_cfg_csc->control));</span><br><span style="color: hsl(0, 100%, 40%);">-                    conn->lcls.control = new_cfg_csc->control;</span><br><span style="color: hsl(120, 100%, 40%);">+                      conn->lcls.par->control = new_cfg_csc->control;</span><br><span>             }</span><br><span>    }</span><br><span> </span><br><span>@@ -208,25 +210,7 @@</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* notify the LCLS FSM about new LCLS Config and/or CSC */</span><br><span style="color: hsl(0, 100%, 40%);">-void lcls_update_config(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                     const uint8_t *config, const uint8_t *control)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_lcls new_cfg = {</span><br><span style="color: hsl(0, 100%, 40%);">-            .config = GSM0808_LCLS_CFG_NA,</span><br><span style="color: hsl(0, 100%, 40%);">-          .control = GSM0808_LCLS_CSC_NA,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-      /* nothing to update, skip it */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!config && !control)</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(0, 100%, 40%);">- if (config)</span><br><span style="color: hsl(0, 100%, 40%);">-             new_cfg.config = *config;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (control)</span><br><span style="color: hsl(0, 100%, 40%);">-            new_cfg.control = *control;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_fsm_inst_dispatch(conn->lcls.fi, LCLS_EV_UPDATE_CFG_CSC, &new_cfg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* apply the configuration, may be changed before by lcls_update_config */</span><br><span style="color: hsl(120, 100%, 40%);">+/* apply the configuration, might have been changed before by corresponding BSSMAP handlers */</span><br><span> void lcls_apply_config(struct gsm_subscriber_connection *conn)</span><br><span> {</span><br><span>    osmo_fsm_inst_dispatch(conn->lcls.fi, LCLS_EV_APPLY_CFG_CSC, NULL);</span><br><span>@@ -277,6 +261,10 @@</span><br><span> {</span><br><span>   mgcp_pick_codec(mdcx_info, conn->lchan, false);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPFSM(conn->lcls.fi, "LCLS(%s) MGW to %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           bsc_lcls_mode_name(conn->sccp.msc->lcls_mode),</span><br><span style="color: hsl(120, 100%, 40%);">+          mgwep_ci_name(conn->user_plane.mgw_endpoint_ci_msc));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   mgw_endpoint_ci_request(conn->user_plane.mgw_endpoint_ci_msc, MGCP_VERB_MDCX, mdcx_info,</span><br><span>                          NULL, 0, 0, NULL);</span><br><span> }</span><br><span>@@ -295,9 +283,11 @@</span><br><span>       case BSC_LCLS_MODE_MGW_LOOP:</span><br><span>                 mdcx_info.port = conn->user_plane.msc_assigned_rtp_port;</span><br><span>          osmo_strlcpy(mdcx_info.addr, conn->user_plane.msc_assigned_rtp_addr, sizeof(mdcx_info.addr));</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPFSM(conn->lcls.fi, "LCLS(%s) MDCX breaking\n", bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));</span><br><span>                lcls_mdcx(conn, &mdcx_info);</span><br><span>             break;</span><br><span>       case BSC_LCLS_MODE_BTS_LOOP:</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPFSM(conn->lcls.fi, "LCLS(%s) RSL breaking\n", bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));</span><br><span>                 lcls_rsl(conn, false);</span><br><span>               break;</span><br><span>       case BSC_LCLS_MODE_DISABLED:</span><br><span>@@ -314,22 +304,22 @@</span><br><span>         struct gsm_subscriber_connection *other_conn = conn->lcls.other;</span><br><span>  OSMO_ASSERT(other_conn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (!lcls_is_supported_config(conn->lcls.config)) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!lcls_is_supported_config(conn->lcls.par->config)) {</span><br><span>               LOGPFSM(conn->lcls.fi, "Not enabling LS due to unsupported local config\n");</span><br><span>            return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!lcls_is_supported_config(other_conn->lcls.config)) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!lcls_is_supported_config(other_conn->lcls.par->config)) {</span><br><span>                 LOGPFSM(conn->lcls.fi, "Not enabling LS due to unsupported other config\n");</span><br><span>            return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (conn->lcls.control != GSM0808_LCLS_CSC_CONNECT) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (conn->lcls.par->control != GSM0808_LCLS_CSC_CONNECT) {</span><br><span>             LOGPFSM(conn->lcls.fi, "Not enabling LS due to insufficient local control\n");</span><br><span>          return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (other_conn->lcls.control != GSM0808_LCLS_CSC_CONNECT) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (other_conn->lcls.par->control != GSM0808_LCLS_CSC_CONNECT) {</span><br><span>               LOGPFSM(conn->lcls.fi, "Not enabling LS due to insufficient other control\n");</span><br><span>          return false;</span><br><span>        }</span><br><span>@@ -378,9 +368,12 @@</span><br><span>     }</span><br><span> </span><br><span>        /* If there's no GCR set, we can never leave this state */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (conn->lcls.global_call_ref_len == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPFSML(fi, LOGL_NOTICE, "No GCR set, ignoring %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                         osmo_fsm_event_name(fi->fsm, event));</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!conn->lcls.par->gcr_available) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPFSML(fi, LOGL_NOTICE, "No GCR set, ignoring %s: %s <%u> %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_fsm_event_name(fi->fsm, event),</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_lcls_dump(conn->lcls.par),</span><br><span style="color: hsl(120, 100%, 40%);">+                    conn->lcls.par->gcr_available,</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_gcr_dump(conn->lcls.par));</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span>@@ -390,7 +383,7 @@</span><br><span>                  return;</span><br><span>              return;</span><br><span>      case LCLS_EV_APPLY_CFG_CSC:</span><br><span style="color: hsl(0, 100%, 40%);">-             if (conn->lcls.config == GSM0808_LCLS_CFG_NA)</span><br><span style="color: hsl(120, 100%, 40%);">+              if (conn->lcls.par->config == GSM0808_LCLS_CFG_NA)</span><br><span>                     return;</span><br><span>              if (lcls_perform_correlation(conn) != 0) {</span><br><span>                   /* Correlation leads to no result: Not Possible to LS */</span><br><span>@@ -565,7 +558,7 @@</span><br><span>               }</span><br><span>            /* we now have two correlated calls */</span><br><span>               OSMO_ASSERT(conn->lcls.other);</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!lcls_is_supported_config(conn->lcls.config))</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!lcls_is_supported_config(conn->lcls.par->config))</span><br><span>                         return;</span><br><span>              if (lcls_enable_possible(conn))</span><br><span>                      osmo_fsm_inst_state_chg(fi, ST_LOCALLY_SWITCHED, 0, 0);</span><br><span>@@ -601,7 +594,7 @@</span><br><span>                }</span><br><span>            break;</span><br><span>       case LCLS_EV_APPLY_CFG_CSC:</span><br><span style="color: hsl(0, 100%, 40%);">-             if (conn->lcls.control == GSM0808_LCLS_CSC_RELEASE_LCLS) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (conn->lcls.par->control == GSM0808_LCLS_CSC_RELEASE_LCLS) {</span><br><span>                        osmo_fsm_inst_state_chg(fi, ST_LOCALLY_SWITCHED_WAIT_OTHER_BREAK, 0, 0);</span><br><span>                     osmo_fsm_inst_dispatch(conn->lcls.other->lcls.fi, LCLS_EV_OTHER_BREAK, conn);</span><br><span>                  /* FIXME: what if there's a new config included? */</span><br><span>@@ -659,9 +652,11 @@</span><br><span>               mdcx_info = *other_mgw_info;</span><br><span>                 /* Make sure the request doesn't want to use the other side's endpoint string. */</span><br><span>            mdcx_info.endpoint[0] = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPFSM(fi, "LCLS(%s) MDCX making\n", bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));</span><br><span>                lcls_mdcx(conn, &mdcx_info);</span><br><span>             break;</span><br><span>       case BSC_LCLS_MODE_BTS_LOOP:</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPFSM(fi, "LCLS(%s) RSL making\n", bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));</span><br><span>                 lcls_rsl(conn, true);</span><br><span>                break;</span><br><span>       case BSC_LCLS_MODE_DISABLED:</span><br><span>@@ -687,7 +682,7 @@</span><br><span>           }</span><br><span>            break;</span><br><span>       case LCLS_EV_APPLY_CFG_CSC:</span><br><span style="color: hsl(0, 100%, 40%);">-             if (conn->lcls.control == GSM0808_LCLS_CSC_RELEASE_LCLS) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (conn->lcls.par->control == GSM0808_LCLS_CSC_RELEASE_LCLS) {</span><br><span>                        lcls_break_local_switching(conn);</span><br><span>                    osmo_fsm_inst_state_chg(fi, ST_NO_LONGER_LS, 0, 0);</span><br><span>                  osmo_fsm_inst_dispatch(conn->lcls.other->lcls.fi, LCLS_EV_OTHER_BREAK, conn);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13419">change 13419</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/13419"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I0f2c2a065755d9051fc7d7ce52c19ab0b7d9288a </div>
<div style="display:none"> Gerrit-Change-Number: 13419 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>