<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19003">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">create ASP+AS only once per cs7 instance<br><br>Refactor osmo_bsc_sigtran_init(): invoke osmo_sccp_simple_client_on_ss7_id()<br>exactly once per cs7 instance.<br><br>When introducing MSC pooling to the ttcn3-bsc-tests, it became apparent that<br>osmo-bsc rapidly huts down and re-creates the SCTP link for each configured<br>MSC. This manifested in an osmo-stp crash (fixed in libosmo-sccp<br>I9b3ae6dfcf6efeabb7fb6c33503d1d7924fec2fa). I first tried to fix it by only<br>restarting an ASP when it wasn't found in the AS yet, but that created obscure<br>problems described in OS#4635 which in turn completely broke ttcn3-msc-tests.<br><br>This solution keeps osmo_sccp_simple_client_on_ss7_id() unchanged and instead<br>invokes it exactly once per cs7 instance.<br><br>Keep the same auto-config logic, but change and improve the mechanisms to<br>achieve it:<br><br>Replace the fail_on_next_invalid_cfg flag with a more accurate check against<br>remote PC collisions between configured MSCs. Before this patch, the code made<br>sure that at most one MSC lacks an explicit remote address (and cs7 instance),<br>so that no two MSCs get the same default remote PC. This patch more accurately<br>checks that no two MSCs use the same remote PC on the same cs7 instance,<br>period, whether implicitly or explicitly configured.<br><br>Before this patch, the logic amounted to creating cs7 instance 0 implicitly,<br>but it was not very obvious: If an 'msc' has an msc-addr configured, it is<br>associated with the cs7 instance that has this addr in its address book. If it<br>has no msc-addr configured, then msc->a.cs7_instance_valid == false. In that<br>case, msc->a.cs7_instance is still 0 (from talloc_zero) and hence<br>osmo_sccp_simple_client_on_ss7_id(ss7_id = 0) created cs7 instance 0. In this<br>patch, that logic remains unchanged, but is written out more explicitly: if any<br>msc has no cs7 instance associated, make sure to create cs7 instance 0<br>beforehand.<br><br>Then iterate all osmo_ss7_instances. If at least one MSC uses it, set up the<br>SCCP client on it and connect all MSCs as appropriate.<br><br>Related: OS#4625 OS#4635<br>Change-Id: I16f4f7f447f69525a2f57c4649ab295112904d6a<br>---<br>M src/osmo-bsc/osmo_bsc_sigtran.c<br>1 file changed, 138 insertions(+), 84 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>index 43ffae0..afc6c8d 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>@@ -468,66 +468,25 @@</span><br><span> /* Initialize osmo sigtran backhaul */</span><br><span> int osmo_bsc_sigtran_init(struct llist_head *mscs)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      bool free_attempt_used = false;</span><br><span style="color: hsl(0, 100%, 40%);">- bool fail_on_next_invalid_cfg = false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       struct bsc_msc_data *msc;</span><br><span style="color: hsl(0, 100%, 40%);">-       char msc_name[32];</span><br><span>   uint32_t default_pc;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_ss7_instance *inst;</span><br><span style="color: hsl(120, 100%, 40%);">+       int create_instance_0_for_msc_nr = -1;</span><br><span> </span><br><span>   osmo_ss7_register_rx_unknown_cb(&asp_rx_unknown);</span><br><span> </span><br><span>    OSMO_ASSERT(mscs);</span><br><span>   msc_list = mscs;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* Guard against multiple MSCs with identical config */</span><br><span>      llist_for_each_entry(msc, msc_list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-            snprintf(msc_name, sizeof(msc_name), "msc-%u", msc->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_NOTICE, "Initializing SCCP connection to MSC %s\n", msc_name);</span><br><span style="color: hsl(120, 100%, 40%);">+              struct bsc_msc_data *msc2;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          /* Check if the VTY could determine a valid CS7 instance,</span><br><span style="color: hsl(0, 100%, 40%);">-                * use safe default in case none is set */</span><br><span style="color: hsl(0, 100%, 40%);">-              if (msc->a.cs7_instance_valid == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    msc->a.cs7_instance = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (fail_on_next_invalid_cfg)</span><br><span style="color: hsl(0, 100%, 40%);">-                           goto fail_auto_cofiguration;</span><br><span style="color: hsl(0, 100%, 40%);">-                    free_attempt_used = true;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DMSC, LOGL_NOTICE, "CS7 Instance identifier, A-Interface: %u\n", msc->a.cs7_instance);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* An MSC with invalid cs7 instance defaults to cs7 instance 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+             uint32_t msc_inst = (msc->a.cs7_instance_valid ? msc->a.cs7_instance : 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            /* Pre-Check if there is an ss7 instance present */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (osmo_ss7_instance_find(msc->a.cs7_instance) == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (fail_on_next_invalid_cfg)</span><br><span style="color: hsl(0, 100%, 40%);">-                           goto fail_auto_cofiguration;</span><br><span style="color: hsl(0, 100%, 40%);">-                    free_attempt_used = true;</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%);">-               /* SS7 Protocol stack */</span><br><span style="color: hsl(0, 100%, 40%);">-                default_pc = osmo_ss7_pointcode_parse(NULL, BSC_DEFAULT_PC);</span><br><span style="color: hsl(0, 100%, 40%);">-            msc->a.sccp =</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_sccp_simple_client_on_ss7_id(msc, msc->a.cs7_instance, msc_name, default_pc,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      msc->a.asp_proto, 0, NULL, 0, DEFAULT_ASP_REMOTE_IP);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!msc->a.sccp)</span><br><span style="color: hsl(0, 100%, 40%);">-                    return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         /* In SCCPlite, the MSC side of the MGW endpoint is configured by the MSC. Since we have</span><br><span style="color: hsl(0, 100%, 40%);">-                 * no way to figure out which CallID ('C:') the MSC will issue in its CRCX command, set</span><br><span style="color: hsl(0, 100%, 40%);">-          * an X-Osmo-IGN flag telling osmo-mgw to ignore CallID mismatches for this endpoint.</span><br><span style="color: hsl(0, 100%, 40%);">-            * If an explicit VTY command has already indicated whether or not to send X-Osmo-IGN, do</span><br><span style="color: hsl(0, 100%, 40%);">-                * not overwrite that setting. */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (msc_is_sccplite(msc) && !msc->x_osmo_ign_configured)</span><br><span style="color: hsl(0, 100%, 40%);">-                     msc->x_osmo_ign |= MGCP_X_OSMO_IGN_CALLID;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           /* If unset, use default local SCCP address */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!msc->a.bsc_addr.presence)</span><br><span style="color: hsl(0, 100%, 40%);">-                       osmo_sccp_local_addr_by_instance(&msc->a.bsc_addr, msc->a.sccp,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        OSMO_SCCP_SSN_BSSAP);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!osmo_sccp_check_addr(&msc->a.bsc_addr, OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                       "(%s) A-interface: invalid local (BSC) SCCP address: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                           msc_name, osmo_sccp_inst_addr_name(msc->a.sccp, &msc->a.bsc_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-                      return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!msc->a.cs7_instance_valid)</span><br><span style="color: hsl(120, 100%, 40%);">+                    create_instance_0_for_msc_nr = msc->nr;</span><br><span> </span><br><span>               /* If unset, use default SCCP address for the MSC */</span><br><span>                 if (!msc->a.msc_addr.presence)</span><br><span>@@ -535,50 +494,145 @@</span><br><span>                                              osmo_ss7_pointcode_parse(NULL, MSC_DEFAULT_PC),</span><br><span>                                              OSMO_SCCP_SSN_BSSAP);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            if (!osmo_sccp_check_addr(&msc->a.msc_addr, OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                       "(%s) A-interface: invalid remote (MSC) SCCP address: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                          msc_name, osmo_sccp_inst_addr_name(msc->a.sccp, &msc->a.msc_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-                      return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* (more optimally, we'd only iterate the remaining other mscs after this msc, but this happens only</span><br><span style="color: hsl(120, 100%, 40%);">+               * during startup, so nevermind that complexity and rather check each pair twice. That also ensures to</span><br><span style="color: hsl(120, 100%, 40%);">+                 * compare all MSCs that have no explicit msc_addr set, see osmo_sccp_make_addr_pc_ssn() above.) */</span><br><span style="color: hsl(120, 100%, 40%);">+           llist_for_each_entry(msc2, msc_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 uint32_t msc2_inst;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (msc2 == msc)</span><br><span style="color: hsl(120, 100%, 40%);">+                              continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   msc2_inst = (msc2->a.cs7_instance_valid ? msc2->a.cs7_instance : 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (msc_inst != msc2_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+                            continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (osmo_sccp_addr_cmp(&msc->a.msc_addr, &msc2->a.msc_addr, OSMO_SCCP_ADDR_T_PC) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                LOGP(DMSC, LOGL_ERROR, "'msc %d' and 'msc %d' cannot use the same remote PC"</span><br><span style="color: hsl(120, 100%, 40%);">+                                     " %s on the same cs7 instance %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                msc->nr, msc2->nr, osmo_sccp_addr_dump(&msc->a.msc_addr), msc_inst);</span><br><span style="color: hsl(120, 100%, 40%);">+                                return -EINVAL;</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (create_instance_0_for_msc_nr >= 0 && !osmo_ss7_instance_find(0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMSC, LOGL_NOTICE, "To auto-configure msc %d, creating cs7 instance 0 implicitly\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                create_instance_0_for_msc_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+           OSMO_ASSERT(osmo_ss7_instance_find_or_create(tall_bsc_ctx, 0));</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%);">+   /* Set up exactly one SCCP user and one ASP+AS per cs7 instance.</span><br><span style="color: hsl(120, 100%, 40%);">+       * Iterate cs7 instance indexes and see for each one whether an MSC is configured for it.</span><br><span style="color: hsl(120, 100%, 40%);">+      * The 'msc' / 'msc-addr' command selects the cs7 instance used for an MSC.</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(inst, &osmo_ss7_instances, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+           char inst_name[32];</span><br><span style="color: hsl(120, 100%, 40%);">+           enum osmo_ss7_asp_protocol used_proto = OSMO_SS7_ASP_PROT_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+               int prev_msc_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            struct osmo_sccp_instance *sccp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            llist_for_each_entry(msc, msc_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* An MSC with invalid cs7 instance id defaults to cs7 instance 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                  if ((inst->cfg.id != msc->a.cs7_instance)</span><br><span style="color: hsl(120, 100%, 40%);">+                           && !(inst->cfg.id == 0 && !msc->a.cs7_instance_valid))</span><br><span style="color: hsl(120, 100%, 40%);">+                              continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* This msc runs on this cs7 inst. Check the asp_proto. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (used_proto != OSMO_SS7_ASP_PROT_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+                          && used_proto != msc->a.asp_proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGP(DMSC, LOGL_ERROR, "'msc %d' and 'msc %d' with differing ASP protocols"</span><br><span style="color: hsl(120, 100%, 40%);">+                              " %s and %s cannot use the same cs7 instance %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 prev_msc_nr, msc->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                              osmo_ss7_asp_protocol_name(used_proto),</span><br><span style="color: hsl(120, 100%, 40%);">+                               osmo_ss7_asp_protocol_name(msc->a.asp_proto),</span><br><span style="color: hsl(120, 100%, 40%);">+                              inst->cfg.id);</span><br><span style="color: hsl(120, 100%, 40%);">+                                return -EINVAL;</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%);">+                   used_proto = msc->a.asp_proto;</span><br><span style="color: hsl(120, 100%, 40%);">+                     prev_msc_nr = msc->nr;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* still run through the other MSCs to catch asp_proto mismatches */</span><br><span>                 }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DMSC, LOGL_NOTICE, "(%s) A-interface: local (BSC) SCCP address: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                msc_name, osmo_sccp_inst_addr_name(msc->a.sccp, &msc->a.bsc_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DMSC, LOGL_NOTICE, "(%s) A-interface: remote (MSC) SCCP address: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-               msc_name, osmo_sccp_inst_addr_name(msc->a.sccp, &msc->a.msc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+            if (used_proto == OSMO_SS7_ASP_PROT_NONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* This instance has no MSC associated with it */</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGP(DMSC, LOGL_ERROR, "cs7 instance %u has no MSCs configured to run on it\n", inst->cfg.id);</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           /* Bind SCCP user. Bind only one user per sccp_instance. */</span><br><span style="color: hsl(0, 100%, 40%);">-             msc->a.sccp_user = osmo_sccp_user_find(msc->a.sccp, msc->a.bsc_addr.ssn, msc->a.bsc_addr.pc);</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DMSC, LOGL_NOTICE, "(%s) A-interface: %s\n", msc_name,</span><br><span style="color: hsl(0, 100%, 40%);">-                msc->a.sccp_user ? "user already bound for this SCCP instance" : "binding SCCP user");</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!msc->a.sccp_user)</span><br><span style="color: hsl(0, 100%, 40%);">-                       msc->a.sccp_user = osmo_sccp_user_bind(msc->a.sccp, msc_name, sccp_sap_up, msc->a.bsc_addr.ssn);</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!msc->a.sccp_user)</span><br><span style="color: hsl(120, 100%, 40%);">+             snprintf(inst_name, sizeof(inst_name), "A-%u-%s", inst->cfg.id, osmo_ss7_asp_protocol_name(used_proto));</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DMSC, LOGL_NOTICE, "Initializing SCCP connection for A/%s on cs7 instance %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_ss7_asp_protocol_name(used_proto), inst->cfg.id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* SS7 Protocol stack */</span><br><span style="color: hsl(120, 100%, 40%);">+              default_pc = osmo_ss7_pointcode_parse(NULL, BSC_DEFAULT_PC);</span><br><span style="color: hsl(120, 100%, 40%);">+          sccp = osmo_sccp_simple_client_on_ss7_id(tall_bsc_ctx, inst->cfg.id, inst_name, default_pc, used_proto, 0, NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    0, DEFAULT_ASP_REMOTE_IP);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (!sccp)</span><br><span>                   return -EINVAL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             /* Start MSC-Reset procedure */</span><br><span style="color: hsl(0, 100%, 40%);">-         a_reset_alloc(msc, msc_name, osmo_bsc_sigtran_reset_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Now that the SCCP client is set up, configure all MSCs on this cs7 instance to use it */</span><br><span style="color: hsl(120, 100%, 40%);">+           llist_for_each_entry(msc, msc_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  char msc_name[32];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          /* If we have detected that the SS7 configuration of the MSC we have just initialized</span><br><span style="color: hsl(0, 100%, 40%);">-            * was incomplete or completely missing, we can not tolerate another incomplete</span><br><span style="color: hsl(0, 100%, 40%);">-          * configuration. The reason for this is that we do only specify exactly one default</span><br><span style="color: hsl(0, 100%, 40%);">-             * pointcode pair. We also specify localhost as default IP-Address. If we have wanted</span><br><span style="color: hsl(0, 100%, 40%);">-            * to support multiple MSCs with automatic configuration we would be forced to invent</span><br><span style="color: hsl(0, 100%, 40%);">-            * a complex ruleset how to allocate the pointcodes and respective IP-Addresses.</span><br><span style="color: hsl(0, 100%, 40%);">-                 * Furthermore, the situation where a single BSC is connected to multiple MSCs</span><br><span style="color: hsl(0, 100%, 40%);">-           * is a very rare situation anyway. In this case we expect the user to experienced</span><br><span style="color: hsl(0, 100%, 40%);">-               * enough to create a valid SS7/CS7 VTY configuration that does not lack any</span><br><span style="color: hsl(0, 100%, 40%);">-             * components */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (free_attempt_used)</span><br><span style="color: hsl(0, 100%, 40%);">-                  fail_on_next_invalid_cfg = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Skip MSCs that don't run on this cs7 instance */</span><br><span style="color: hsl(120, 100%, 40%);">+                       if ((inst->cfg.id != msc->a.cs7_instance)</span><br><span style="color: hsl(120, 100%, 40%);">+                           && !(inst->cfg.id == 0 && !msc->a.cs7_instance_valid))</span><br><span style="color: hsl(120, 100%, 40%);">+                              continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   snprintf(msc_name, sizeof(msc_name), "msc-%d", msc->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       msc->a.sccp = sccp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* In SCCPlite, the MSC side of the MGW endpoint is configured by the MSC. Since we have</span><br><span style="color: hsl(120, 100%, 40%);">+                       * no way to figure out which CallID ('C:') the MSC will issue in its CRCX command, set</span><br><span style="color: hsl(120, 100%, 40%);">+                        * an X-Osmo-IGN flag telling osmo-mgw to ignore CallID mismatches for this endpoint.</span><br><span style="color: hsl(120, 100%, 40%);">+                  * If an explicit VTY command has already indicated whether or not to send X-Osmo-IGN, do</span><br><span style="color: hsl(120, 100%, 40%);">+                      * not overwrite that setting. */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (msc_is_sccplite(msc) && !msc->x_osmo_ign_configured)</span><br><span style="color: hsl(120, 100%, 40%);">+                           msc->x_osmo_ign |= MGCP_X_OSMO_IGN_CALLID;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* If unset, use default local SCCP address */</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (!msc->a.bsc_addr.presence)</span><br><span style="color: hsl(120, 100%, 40%);">+                             osmo_sccp_local_addr_by_instance(&msc->a.bsc_addr, sccp,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                OSMO_SCCP_SSN_BSSAP);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (!osmo_sccp_check_addr(&msc->a.bsc_addr, OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "%s %s: invalid local (BSC) SCCP address: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    inst_name, msc_name, osmo_sccp_inst_addr_name(sccp, &msc->a.bsc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+                           return -EINVAL;</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 (!osmo_sccp_check_addr(&msc->a.msc_addr, OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "%s %s: invalid remote (MSC) SCCP address: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   inst_name, msc_name, osmo_sccp_inst_addr_name(sccp, &msc->a.msc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+                           return -EINVAL;</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%);">+                   LOGP(DMSC, LOGL_NOTICE, "%s %s: local (BSC) SCCP address: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         inst_name, msc_name, osmo_sccp_inst_addr_name(sccp, &msc->a.bsc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGP(DMSC, LOGL_NOTICE, "%s %s: remote (MSC) SCCP address: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        inst_name, msc_name, osmo_sccp_inst_addr_name(sccp, &msc->a.msc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Bind SCCP user. Bind only one user per sccp_instance and bsc_addr. */</span><br><span style="color: hsl(120, 100%, 40%);">+                      msc->a.sccp_user = osmo_sccp_user_find(sccp, msc->a.bsc_addr.ssn, msc->a.bsc_addr.pc);</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGP(DMSC, LOGL_NOTICE, "%s %s: %s\n", inst_name, msc_name,</span><br><span style="color: hsl(120, 100%, 40%);">+                      msc->a.sccp_user ? "user already bound for this SCCP instance" : "binding SCCP user");</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!msc->a.sccp_user)</span><br><span style="color: hsl(120, 100%, 40%);">+                             msc->a.sccp_user = osmo_sccp_user_bind(sccp, msc_name, sccp_sap_up, msc->a.bsc_addr.ssn);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (!msc->a.sccp_user)</span><br><span style="color: hsl(120, 100%, 40%);">+                             return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* Start MSC-Reset procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+                       a_reset_alloc(msc, msc_name, osmo_bsc_sigtran_reset_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span>    }</span><br><span> </span><br><span>        return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-fail_auto_cofiguration:</span><br><span style="color: hsl(0, 100%, 40%);">-        LOGP(DMSC, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-       "A-interface: More than one invalid/inclomplete configuration detected, unable to revover - check config file!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-      return -EINVAL;</span><br><span> }</span><br><span> </span><br><span> /* this function receives all messages received on an ASP for a PPID / StreamID that</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19003">change 19003</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/osmo-bsc/+/19003"/><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-Change-Id: I16f4f7f447f69525a2f57c4649ab295112904d6a </div>
<div style="display:none"> Gerrit-Change-Number: 19003 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>