pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bsc/+/40562?usp=email )
Change subject: WIP: bsc: Make sure MSC PC is added to sccp-addressbook
......................................................................
WIP: bsc: Make sure MSC PC is added to sccp-addressbook
This way they can used by libosmo-sigtran to figure out interesting
remote PCs it should track availability for.
Related: OS#5917
Related: SYS#7501
Depends: libosmo-sigtran.git Change-Id I9d2452d9cc8e443050927a047b7ebacd2b2f37e1
Change-Id: I57dca92eb5f482e9017d9b19cd7f8feebd9e2721
---
M TODO-RELEASE
M src/osmo-bsc/bsc_vty.c
M src/osmo-bsc/osmo_bsc_sigtran.c
3 files changed, 70 insertions(+), 42 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/62/40562/1
diff --git a/TODO-RELEASE b/TODO-RELEASE
index c6495da..0eae0e8 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -8,3 +8,4 @@
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
libosmo-mgcp-client bump_dep Depend on I0d58e6d84418f50670c8ab7cf8490af3bc2f5c26
+libosmo-sigtran >2.1.0 osmo_sccp_addr_{create,update}()
diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c
index 98a7792..52ad6b3 100644
--- a/src/osmo-bsc/bsc_vty.c
+++ b/src/osmo-bsc/bsc_vty.c
@@ -2946,7 +2946,8 @@
/* Make sure only standard SSN numbers are used. If no ssn number is
* configured, silently apply the default SSN */
-static void enforce_standard_ssn(struct vty *vty, struct osmo_sccp_addr *addr)
+static void enforce_standard_ssn(struct vty *vty, struct osmo_ss7_instance *ss7,
+ const char *addr_name, struct osmo_sccp_addr *addr)
{
if (addr->presence & OSMO_SCCP_ADDR_T_SSN) {
if (addr->ssn != OSMO_SCCP_SSN_BSSAP)
@@ -2957,6 +2958,7 @@
addr->presence |= OSMO_SCCP_ADDR_T_SSN;
addr->ssn = OSMO_SCCP_SSN_BSSAP;
+ osmo_sccp_addr_update(ss7, addr_name, addr);
}
DEFUN(cfg_msc_cs7_bsc_addr,
@@ -2988,8 +2990,8 @@
msc->a.cs7_instance = ss7_id;
msc->a.cs7_instance_valid = true;
- enforce_standard_ssn(vty, &msc->a.bsc_addr);
msc->a.bsc_addr_name = talloc_strdup(msc, bsc_addr_name);
+ enforce_standard_ssn(vty, ss7, bsc_addr_name, &msc->a.bsc_addr);
return CMD_SUCCESS;
}
@@ -3022,8 +3024,8 @@
msc->a.cs7_instance = ss7_id;
msc->a.cs7_instance_valid = true;
- enforce_standard_ssn(vty, &msc->a.msc_addr);
msc->a.msc_addr_name = talloc_strdup(msc, msc_addr_name);
+ enforce_standard_ssn(vty, ss7, msc_addr_name, &msc->a.msc_addr);
return CMD_SUCCESS;
}
diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c
index f51aa0a..8abeeb6 100644
--- a/src/osmo-bsc/osmo_bsc_sigtran.c
+++ b/src/osmo-bsc/osmo_bsc_sigtran.c
@@ -552,6 +552,9 @@
/* Default point-code to be used as remote address (MSC) */
#define MSC_DEFAULT_PC "0.23.1"
+/* Default point-code to be used as remote address (MSC) */
+#define MSC_DEFAULT_ADDR_NAME "addr-dyn-msc-default"
+
static int asp_rx_unknown(struct osmo_ss7_asp *asp, int ppid_mux, struct msgb *msg);
/* Initialize osmo sigtran backhaul */
@@ -560,55 +563,79 @@
struct bsc_msc_data *msc;
uint32_t default_pc;
struct llist_head *ll_it;
- int create_instance_0_for_msc_nr = -1;
+ int rc;
osmo_ss7_register_rx_unknown_cb(&asp_rx_unknown);
OSMO_ASSERT(mscs);
msc_list = mscs;
- /* Guard against multiple MSCs with identical config */
+ /* Apply default address on each MSC and validate which ss7 instance it runs on. */
llist_for_each_entry(msc, msc_list, entry) {
- struct bsc_msc_data *msc2;
+ struct osmo_ss7_instance *s7i;
/* An MSC with invalid cs7 instance defaults to cs7 instance 0 */
- uint32_t msc_inst = (msc->a.cs7_instance_valid ? msc->a.cs7_instance : 0);
+ if (!msc->a.cs7_instance_valid) {
+ s7i = osmo_ss7_instance_find(0);
+ if (!s7i) {
+ LOGP(DMSC, LOGL_NOTICE, "To auto-configure msc %d, creating cs7 instance 0
implicitly\n",
+ msc->nr);
+ s7i = osmo_ss7_instance_find_or_create(tall_bsc_ctx, 0);
+ OSMO_ASSERT(s7i);
+ }
+ msc->a.cs7_instance = osmo_ss7_instance_get_id(s7i);
+ msc->a.cs7_instance_valid = true;
+ } else {
+ s7i = osmo_ss7_instance_find(msc->a.cs7_instance);
+ }
- if (!msc->a.cs7_instance_valid)
- create_instance_0_for_msc_nr = msc->nr;
-
- /* If unset, use default SCCP address for the MSC */
- if (!msc->a.msc_addr.presence)
- osmo_sccp_make_addr_pc_ssn(&msc->a.msc_addr,
- osmo_ss7_pointcode_parse(NULL, MSC_DEFAULT_PC),
- OSMO_SCCP_SSN_BSSAP);
-
- /* (more optimally, we'd only iterate the remaining other mscs after this msc, but
this happens only
- * during startup, so nevermind that complexity and rather check each pair twice. That
also ensures to
- * compare all MSCs that have no explicit msc_addr set, see
osmo_sccp_make_addr_pc_ssn() above.) */
- llist_for_each_entry(msc2, msc_list, entry) {
- uint32_t msc2_inst;
-
- if (msc2 == msc)
- continue;
-
- msc2_inst = (msc2->a.cs7_instance_valid ? msc2->a.cs7_instance : 0);
- if (msc_inst != msc2_inst)
- continue;
-
- if (osmo_sccp_addr_cmp(&msc->a.msc_addr, &msc2->a.msc_addr,
OSMO_SCCP_ADDR_T_PC) == 0) {
- LOGP(DMSC, LOGL_ERROR, "'msc %d' and 'msc %d' cannot use the
same remote PC"
- " %s on the same cs7 instance %u\n",
- msc->nr, msc2->nr, osmo_sccp_addr_dump(&msc->a.msc_addr),
msc_inst);
- return -EINVAL;
+ /* User didn't configure an 'msc-addr' in VTY for this msc, add
+ * default SCCP address for the MSC to the address book */
+ if (!msc->a.msc_addr_name) {
+ msc->a.msc_addr_name = talloc_strdup(msc, MSC_DEFAULT_ADDR_NAME);
+ LOGP(DMSC, LOGL_NOTICE, "To auto-configure msc %d, adding address '%s' to
cs7 instance 0 address-book implicitly\n",
+ msc->nr, msc->a.msc_addr_name);
+ }
+ if (!msc->a.msc_addr.presence) {
+ struct osmo_ss7_instance *ss7;
+ ss7 = osmo_sccp_addr_by_name(&msc->a.msc_addr, msc->a.msc_addr_name);
+ if (!ss7) {
+ osmo_sccp_make_addr_pc_ssn(&msc->a.msc_addr,
+ osmo_ss7_pointcode_parse(s7i, MSC_DEFAULT_PC),
+ OSMO_SCCP_SSN_BSSAP);
+ rc = osmo_sccp_addr_create(s7i, msc->a.msc_addr_name, &msc->a.msc_addr);
+ if (rc < 0)
+ return -EINVAL;
+ } else {
+ OSMO_ASSERT(s7i == ss7);
+ osmo_sccp_make_addr_pc_ssn(&msc->a.msc_addr,
+ osmo_ss7_pointcode_parse(s7i, MSC_DEFAULT_PC),
+ OSMO_SCCP_SSN_BSSAP);
+ rc = osmo_sccp_addr_update(s7i, msc->a.msc_addr_name, &msc->a.msc_addr);
+ if (rc < 0)
+ return -EINVAL;
}
}
}
- if (create_instance_0_for_msc_nr >= 0 && !osmo_ss7_instance_find(0)) {
- LOGP(DMSC, LOGL_NOTICE, "To auto-configure msc %d, creating cs7 instance 0
implicitly\n",
- create_instance_0_for_msc_nr);
- OSMO_ASSERT(osmo_ss7_instance_find_or_create(tall_bsc_ctx, 0));
+ /* Guard against multiple MSCs with identical config */
+ /* (more optimally, we'd only iterate the remaining other mscs after this msc, but
this happens only
+ * during startup, so nevermind that complexity and rather check each pair twice. That
also ensures to
+ * compare all MSCs that have no explicit msc_addr set, see osmo_sccp_make_addr_pc_ssn()
above.) */
+ llist_for_each_entry(msc, msc_list, entry) {
+ struct bsc_msc_data *msc2;
+ llist_for_each_entry(msc2, msc_list, entry) {
+ if (msc2 == msc)
+ continue;
+ if (msc->a.cs7_instance != msc2->a.cs7_instance)
+ continue;
+ if (osmo_sccp_addr_cmp(&msc->a.msc_addr, &msc2->a.msc_addr,
OSMO_SCCP_ADDR_T_PC) == 0) {
+ LOGP(DMSC, LOGL_ERROR, "'msc %d' and 'msc %d' cannot use the
same remote PC"
+ " %s on the same cs7 instance %u\n",
+ msc->nr, msc2->nr, osmo_sccp_addr_dump(&msc->a.msc_addr),
msc->a.cs7_instance);
+ return -EINVAL;
+ }
+ }
}
/* Set up exactly one SCCP user and one ASP+AS per cs7 instance.
@@ -627,8 +654,7 @@
llist_for_each_entry(msc, msc_list, entry) {
/* An MSC with invalid cs7 instance id defaults to cs7 instance 0 */
- if ((inst_id != msc->a.cs7_instance)
- && !(inst_id == 0 && !msc->a.cs7_instance_valid))
+ if (inst_id != msc->a.cs7_instance)
continue;
/* This msc runs on this cs7 inst. Check the asp_proto. */
@@ -676,8 +702,7 @@
char msc_name[32];
/* Skip MSCs that don't run on this cs7 instance */
- if ((inst_id != msc->a.cs7_instance)
- && !(inst_id == 0 && !msc->a.cs7_instance_valid))
+ if (inst_id != msc->a.cs7_instance)
continue;
snprintf(msc_name, sizeof(msc_name), "msc-%d", msc->nr);
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bsc/+/40562?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I57dca92eb5f482e9017d9b19cd7f8feebd9e2721
Gerrit-Change-Number: 40562
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>