diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2017-08-11 13:59:29 +0200 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-08-23 02:08:36 +0200 |
commit | 400ae8088643b32caeba05a51bc95ccb80f13f89 (patch) | |
tree | 437c65095533bde3f204b8d309f3f41148d28dda /openbsc | |
parent | a277769b657ad2065f8625626e0f81842f7e91b3 (diff) |
osmo-bsc: cleanup osmo_bsc_sigtran_init()
Diffstat (limited to 'openbsc')
-rw-r--r-- | openbsc/src/osmo-bsc/osmo_bsc_sigtran.c | 115 |
1 files changed, 76 insertions, 39 deletions
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_sigtran.c b/openbsc/src/osmo-bsc/osmo_bsc_sigtran.c index de9416df8..2007689d8 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_sigtran.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_sigtran.c @@ -411,73 +411,92 @@ static void osmo_bsc_sigtran_reset_cb(const void *priv) osmo_bsc_sigtran_tx_reset(msc); } +/* Default point-code to be used as local address (BSC) */ +#define BSC_DEFAULT_PC "0.23.3" + +/* Default point-code to be used as remote address (MSC) */ +#define MSC_DEFAULT_PC "0.23.1" + /* Initalize osmo sigtran backhaul */ int osmo_bsc_sigtran_init(struct llist_head *mscs) { - /* FIXME: Remove hardcoded IP-Addresses */ + bool free_attempt_used = false; + bool fail_on_next_invalid_cfg = false; + struct bsc_msc_data *msc; - char msc_name[256]; - uint32_t bsc_default_pc = CS7_POINTCODE_DEFAULT_OFFSET; - uint8_t cs7_default_inst = 0; - - /* FIXME: The way this code derives the default parameters is not safe when - * mixing proper configuration with incomplete configuration. When multiple - * MSCs are connected, the autogenerated pointcodes may colide with the - * ones that are properly set. However, this is a very unlikely situation. - * in most cases it will be exactly one MSC<->BSC connection and either no - * configuration done by the user or the user knows how to properly set - * up the configuration */ + char msc_name[32]; + uint32_t default_pc; OSMO_ASSERT(mscs); msc_list = mscs; - conn_id_counter = 0; llist_for_each_entry(msc, msc_list, entry) { snprintf(msc_name, sizeof(msc_name), "msc-%u", msc->nr); - LOGP(DMSC, LOGL_NOTICE, "Initializing SCCP connection to MSC %s (%s)\n", - osmo_sccp_addr_dump(&msc->a.msc_addr), msc_name); + LOGP(DMSC, LOGL_NOTICE, "Initializing SCCP connection to MSC %s\n", msc_name); - /* Check if the VTY could determine a valid CS7 instance */ + /* Check if the VTY could determine a valid CS7 instance, + * use safe default in case none is set */ if (msc->a.cs7_instance_valid == false) { - LOGP(DMSC, LOGL_NOTICE, - "A-interface: Unable to detect CS7 instance, assuming instance ID: %u\n", - cs7_default_inst); - msc->a.cs7_instance = cs7_default_inst; + msc->a.cs7_instance = 0; + if (fail_on_next_invalid_cfg) + goto fail_auto_cofiguration; + free_attempt_used = true; + } + LOGP(DMSC, LOGL_NOTICE, "CS7 Instance identifier, A-Interface: %u\n", msc->a.cs7_instance); + + /* Pre-Check if there is an ss7 instance present */ + if (osmo_ss7_instance_find(msc->a.cs7_instance) == NULL) { + if (fail_on_next_invalid_cfg) + goto fail_auto_cofiguration; + free_attempt_used = true; } - cs7_default_inst++; /* SS7 Protocol stack */ + default_pc = osmo_ss7_pointcode_parse(NULL, BSC_DEFAULT_PC); msc->a.sccp = - osmo_sccp_simple_client_on_ss7_id(msc, msc->a.cs7_instance, msc_name, bsc_default_pc, - OSMO_SS7_ASP_PROT_M3UA, 0, NULL, M3UA_PORT, "127.0.0.1"); + osmo_sccp_simple_client_on_ss7_id(msc, msc->a.cs7_instance, msc_name, default_pc, + OSMO_SS7_ASP_PROT_M3UA, 0, NULL, 0, NULL); if (!msc->a.sccp) return -EINVAL; - bsc_default_pc++; - /* Check if the sccp-address fullfill minimum requirements (SSN+PC is present, + /* Check if the sccp-address fullfills minimum requirements (SSN+PC is present, * automatically recover addresses if the addresses are not set up properly) */ if (!osmo_sccp_check_addr(&msc->a.bsc_addr, OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC)) { - /* In case a valid address is not set, derive the address from the SCCP - * instance that has just been created */ + if (fail_on_next_invalid_cfg) + goto fail_auto_cofiguration; + free_attempt_used = true; + LOGP(DMSC, LOGL_NOTICE, - "A-interface: invalid or missing local SCCP address (a.bsc_addr=%s)\n", - osmo_sccp_addr_dump(&msc->a.bsc_addr)); + "A-interface: invalid or missing local (BSC) SCCP address (a.bsc_addr=%s)\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), &msc->a.bsc_addr)); osmo_sccp_local_addr_by_instance(&msc->a.bsc_addr, msc->a.sccp, SCCP_SSN_BSSAP); LOGP(DMSC, LOGL_NOTICE, - "A-interface: using automatically generated SCCP address (a.bsc_addr=%s)\n", - osmo_sccp_addr_dump(&msc->a.bsc_addr)); + "A-interface: using automatically generated local (BSC) SCCP address (a.bsc_addr=%s)\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), &msc->a.bsc_addr)); + } else { + LOGP(DMSC, LOGL_NOTICE, + "A-interface: using local (BSC) automatically SCCP address (a.msc_addr=%s)\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), &msc->a.bsc_addr)); } + if (!osmo_sccp_check_addr(&msc->a.msc_addr, OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC)) { - /* In case a valid address is not set, use the SCCP instance to query a local - * address and subtract one from the pointcode */ - LOGP(DMSC, LOGL_ERROR, - "A-interface: invalid or missing remote SCCP address for the MSC (a.msc_addr=%s)\n", - osmo_sccp_addr_dump(&msc->a.msc_addr)); + if (fail_on_next_invalid_cfg) + goto fail_auto_cofiguration; + free_attempt_used = true; + + LOGP(DMSC, LOGL_NOTICE, + "A-interface: invalid or missing remote (MSC) SCCP address for the MSC (a.msc_addr=%s)\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), &msc->a.msc_addr)); osmo_sccp_local_addr_by_instance(&msc->a.msc_addr, msc->a.sccp, SCCP_SSN_BSSAP); - msc->a.msc_addr.pc -= 1; + msc->a.msc_addr.pc = osmo_ss7_pointcode_parse(NULL, MSC_DEFAULT_PC); LOGP(DMSC, LOGL_NOTICE, - "A-interface: using automatically generated SCCP address (a.msc_addr=%s)\n", - osmo_sccp_addr_dump(&msc->a.msc_addr)); + "A-interface: using automatically generated remote (MSC) SCCP address (a.msc_addr=%s)\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), &msc->a.msc_addr)); + free_attempt_used = true; + } else { + LOGP(DMSC, LOGL_NOTICE, + "A-interface: using remote (MSC) automatically SCCP address (a.msc_addr=%s)\n", + osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance), &msc->a.msc_addr)); } /* Bind SCCP user */ @@ -489,7 +508,25 @@ int osmo_bsc_sigtran_init(struct llist_head *mscs) msc->a.reset = a_reset_alloc(msc, msc_name, osmo_bsc_sigtran_reset_cb, msc); if (!msc->a.reset) return -EINVAL; + + /* If we have detected that the SS7 configuration of the MSC we have just initalized + * was incomplete or completely missing, we can not tolerate another incomplete + * configuration. The reson for this is that we do only specify exactly one default + * pointcode pair. We also specify localhost as default IP-Address. If we have wanted + * to support multiple MSCs with automatic configuration we would be forced to invent + * a complex ruleset how to allocate the pointcodes and respective IP-Addresses. + * Furthermore, the situation where a single BSC is connected to multiple MSCs + * is a very rare situation anyway. In this case we expect the user to experienced + * enough to create a valid SS7/CS7 VTY configuration that does not lack any + * components */ + if (free_attempt_used) + fail_on_next_invalid_cfg = true; } return 0; + +fail_auto_cofiguration: + LOGP(DMSC, LOGL_ERROR, + "A-interface: More than one invalid/inclomplete configuration detected, unable to revover - check config file!\n"); + return -EINVAL; } |