vty: Fixup sccp/ss7 configuration

The sccp/ss7 configuration is now fixed. The cs7 instance id is
implicitly detected from the bsc_addr or the msc_addr. Depending
on what is listed last. (I am not sure if that is wise, maybe
we should only use the local/bsc address to do the lookup).

Remove cs7-instance vty command

Modify VTY commands, so that the fixed API is used

Set msc->a.cs7_instance from the VTY to when msc/bsc addr is parsed

Fix the initalization to use osmo_sccp_simple_client_on_ss7_id() and
pass the cs7-instance id we determined from the vty.

The whole thing is not waterproof yet. We are still not at the
point where we allow to leave the local address out. This would
be fine, but when it is left out, the only way to determine the
cs7 instance is to use the msc_addr then.

We also might want to make sure to reach a state where all cs7
related config may be left out (like with the MSC)
This commit is contained in:
Philipp Maier 2017-07-21 18:38:36 +02:00 committed by Neels Hofmeyr
parent 19c4fd0562
commit 4ebab46847
3 changed files with 32 additions and 63 deletions

View File

@ -114,7 +114,7 @@ struct bsc_msc_data {
/* Sigtran connection data */
struct {
struct osmo_ss7_instance *ss7;
uint32_t cs7_instance;
struct osmo_sccp_instance *sccp;
struct osmo_sccp_user *sccp_user;

View File

@ -439,28 +439,36 @@ int osmo_bsc_sigtran_init(struct llist_head *mscs)
LOGP(DMSC, LOGL_NOTICE, "Initializing SCCP connection to MSC %s (%s)\n",
osmo_sccp_addr_dump(&msc->a.msc_addr), msc_name);
/* Check if the sccp-address */
/* Check if the sccp-address fullfill minimum requirements (SSN+PC is present) */
if (test_addr(&msc->a.bsc_addr) < 0) {
LOGP(DMSC, LOGL_ERROR,
"A-interface: invalid local SCCP address (a.bsc_addr) %s\n",
"A-interface: invalid local SCCP address (a.bsc_addr=%s)\n",
osmo_sccp_addr_dump(&msc->a.bsc_addr));
return -EINVAL;
}
if (test_addr(&msc->a.msc_addr) < 0) {
LOGP(DMSC, LOGL_ERROR,
"A-interface: invalid remote SCCP address for the MSC (a.msc_addr) %s\n",
"A-interface: invalid remote SCCP address for the MSC (a.msc_addr=%s)\n",
osmo_sccp_addr_dump(&msc->a.msc_addr));
return -EINVAL;
}
/* SCCP Protocol stack */
/* SS7 Protocol stack */
msc->a.sccp =
osmo_sccp_simple_client(NULL, msc_name, msc->a.bsc_addr.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, msc->a.bsc_addr.pc,
OSMO_SS7_ASP_PROT_M3UA, 0, NULL, M3UA_PORT, "127.0.0.1");
if (!msc->a.sccp)
return -EINVAL;
msc->a.sccp_user = osmo_sccp_user_bind(msc->a.sccp, msc_name, sccp_sap_up, msc->a.bsc_addr.ssn);
if (!msc->a.sccp_user)
return -EINVAL;
/* Start MSC reset procedure */
msc->a.reset = a_reset_alloc(msc, msc_name, osmo_bsc_sigtran_reset_cb, msc);
if (!msc->a.reset)
return -EINVAL;
}
return 0;

View File

@ -187,16 +187,13 @@ static void write_msc(struct vty *vty, struct bsc_msc_data *msc)
write_msc_amr_options(vty, msc);
/* write sccp connection configuration */
if (msc->a.ss7) {
vty_out(vty, " cs7-instance %u%s", msc->a.ss7->cfg.id,
VTY_NEWLINE);
vty_out(vty, " bsc-addr %s%s",
osmo_sccp_name_by_addr(&msc->a.bsc_addr,
msc->a.ss7), VTY_NEWLINE);
vty_out(vty, " msc-addr %s%s",
osmo_sccp_name_by_addr(&msc->a.msc_addr,
msc->a.ss7), VTY_NEWLINE);
}
/* FIXME: This can not work, as we manipulate the address,
* we can not expect to find it in the addressbok. We should
* store the string names instead. */
vty_out(vty, " bsc-addr %s%s",
osmo_sccp_name_by_addr(&msc->a.bsc_addr), VTY_NEWLINE);
vty_out(vty, " msc-addr %s%s",
osmo_sccp_name_by_addr(&msc->a.msc_addr), VTY_NEWLINE);
}
static int config_write_msc(struct vty *vty)
@ -698,26 +695,6 @@ DEFUN(cfg_msc_no_acc_lst_name,
return CMD_SUCCESS;
}
DEFUN(cfg_msc_cs7_instance,
cfg_msc_cs7_instance_cmd,
"cs7-instance <0-15>",
"Set Associated SS7 instance.\n" "SS7 instance reference number\n")
{
struct bsc_msc_data *msc = bsc_msc_data(vty);
uint32_t inst_id = atoi(argv[0]);
struct osmo_ss7_instance *inst;
inst = osmo_ss7_instance_find(inst_id);
if (!inst) {
vty_out(vty, "No SS7 instance %d found%s", inst_id,
VTY_NEWLINE);
return CMD_WARNING;
}
msc->a.ss7 = inst;
return CMD_SUCCESS;
}
/* 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)
@ -740,24 +717,17 @@ DEFUN(cfg_msc_cs7_bsc_addr,
{
struct bsc_msc_data *msc = bsc_msc_data(vty);
const char *bsc_addr_name = argv[0];
struct osmo_sccp_addr *bsc_addr;
struct osmo_ss7_instance *ss7;
if (!msc->a.ss7) {
vty_out(vty, "cs7-instance instance must be configured first%s",
VTY_NEWLINE);
return CMD_WARNING;
}
bsc_addr = osmo_sccp_addr_by_name(bsc_addr_name, msc->a.ss7);
if (!bsc_addr) {
ss7 = osmo_sccp_addr_by_name(&msc->a.bsc_addr, bsc_addr_name);
if (!ss7) {
vty_out(vty, "No sccp address %s found%s", bsc_addr_name,
VTY_NEWLINE);
return CMD_WARNING;
}
enforce_standard_ssn(vty, bsc_addr);
memcpy(&msc->a.bsc_addr, bsc_addr, sizeof(*bsc_addr));
msc->a.cs7_instance = ss7->cfg.id;
enforce_standard_ssn(vty, &msc->a.bsc_addr);
return CMD_SUCCESS;
}
@ -768,25 +738,17 @@ DEFUN(cfg_msc_cs7_msc_addr,
{
struct bsc_msc_data *msc = bsc_msc_data(vty);
const char *msc_addr_name = argv[0];
struct osmo_sccp_addr *msc_addr;
struct osmo_ss7_instance *ss7;
if (!msc->a.ss7) {
vty_out(vty, "cs7-instance instance must be configured first%s",
VTY_NEWLINE);
return CMD_WARNING;
}
msc_addr = osmo_sccp_addr_by_name(msc_addr_name, msc->a.ss7);
if (!msc_addr) {
ss7 = osmo_sccp_addr_by_name(&msc->a.msc_addr, msc_addr_name);
if (!ss7) {
vty_out(vty, "No sccp address %s found%s", msc_addr_name,
VTY_NEWLINE);
return CMD_WARNING;
}
enforce_standard_ssn(vty, msc_addr);
memcpy(&msc->a.msc_addr, msc_addr, sizeof(*msc_addr));
msc->a.cs7_instance = ss7->cfg.id;
enforce_standard_ssn(vty, &msc->a.msc_addr);
return CMD_SUCCESS;
}
@ -1036,7 +998,6 @@ int bsc_vty_init_extra(void)
install_element(MSC_NODE, &cfg_net_msc_amr_4_75_cmd);
install_element(MSC_NODE, &cfg_msc_acc_lst_name_cmd);
install_element(MSC_NODE, &cfg_msc_no_acc_lst_name_cmd);
install_element(MSC_NODE, &cfg_msc_cs7_instance_cmd);
install_element(MSC_NODE, &cfg_msc_cs7_bsc_addr_cmd);
install_element(MSC_NODE, &cfg_msc_cs7_msc_addr_cmd);