diff options
Diffstat (limited to 'src/osmo-bsc/lb.c')
-rw-r--r-- | src/osmo-bsc/lb.c | 182 |
1 files changed, 107 insertions, 75 deletions
diff --git a/src/osmo-bsc/lb.c b/src/osmo-bsc/lb.c index 654f26144..511a54528 100644 --- a/src/osmo-bsc/lb.c +++ b/src/osmo-bsc/lb.c @@ -31,22 +31,10 @@ #include <osmocom/bsc/osmo_bsc_sigtran.h> #include <osmocom/bsc/lcs_loc_req.h> #include <osmocom/bsc/bssmap_reset.h> - -static struct gsm_subscriber_connection *get_bsc_conn_by_lb_conn_id(int conn_id) -{ - struct gsm_subscriber_connection *conn; - - llist_for_each_entry(conn, &bsc_gsmnet->subscr_conns, entry) { - if (conn->lcs.lb.state != SUBSCR_SCCP_ST_NONE - && conn->lcs.lb.conn_id == conn_id) - return conn; - } - - return NULL; -} +#include <osmocom/bsc/gsm_data.h> /* Send reset to SMLC */ -int bssmap_le_tx_reset() +int bssmap_le_tx_reset(void) { struct osmo_ss7_instance *ss7; struct msgb *msg; @@ -58,18 +46,23 @@ int bssmap_le_tx_reset() }, }; + if (!bsc_gsmnet->smlc->sccp_user) { + LOGP(DRESET, LOGL_DEBUG, "Not sending RESET to SMLC, Lb link down\n"); + return -1; + } + ss7 = osmo_ss7_instance_find(bsc_gsmnet->smlc->cs7_instance); OSMO_ASSERT(ss7); LOGP(DRESET, LOGL_INFO, "Sending RESET to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr)); msg = osmo_bssap_le_enc(&reset); - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_UDT_RESET]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_UDT_RESET)); return osmo_sccp_tx_unitdata_msg(bsc_gsmnet->smlc->sccp_user, &bsc_gsmnet->smlc->bsc_addr, &bsc_gsmnet->smlc->smlc_addr, msg); } /* Send reset-ack to SMLC */ -int bssmap_le_tx_reset_ack() +int bssmap_le_tx_reset_ack(void) { struct osmo_ss7_instance *ss7; struct msgb *msg; @@ -85,7 +78,7 @@ int bssmap_le_tx_reset_ack() LOGP(DRESET, LOGL_NOTICE, "Sending RESET ACK to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr)); msg = osmo_bssap_le_enc(&reset_ack); - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_UDT_RESET_ACK]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_UDT_RESET_ACK)); return osmo_sccp_tx_unitdata_msg(bsc_gsmnet->smlc->sccp_user, &bsc_gsmnet->smlc->bsc_addr, &bsc_gsmnet->smlc->smlc_addr, msg); } @@ -95,8 +88,8 @@ static int handle_unitdata_from_smlc(const struct osmo_sccp_addr *smlc_addr, str { struct osmo_ss7_instance *ss7; struct bssap_le_pdu bssap_le; - struct osmo_bssap_le_err *err; - struct rate_ctr *ctr = bsc_gsmnet->smlc->ctrs->ctr; + struct osmo_bssap_le_err *err = NULL; + struct rate_ctr_group *ctrg = bsc_gsmnet->smlc->ctrs; ss7 = osmo_sccp_get_ss7(osmo_sccp_get_sccp(scu)); OSMO_ASSERT(ss7); @@ -104,13 +97,13 @@ static int handle_unitdata_from_smlc(const struct osmo_sccp_addr *smlc_addr, str if (osmo_sccp_addr_cmp(smlc_addr, &bsc_gsmnet->smlc->smlc_addr, OSMO_SCCP_ADDR_T_MASK)) { LOGP(DLCS, LOGL_ERROR, "Rx BSSMAP-LE UnitData from unknown remote address: %s\n", osmo_sccp_addr_name(ss7, smlc_addr)); - rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UNKNOWN_PEER]); + rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UNKNOWN_PEER)); return -EINVAL; } if (osmo_bssap_le_dec(&bssap_le, &err, msg, msg)) { LOGP(DLCS, LOGL_ERROR, "Rx BSSAP-LE UnitData with error: %s\n", err->logmsg); - rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG]); + rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG)); return -EINVAL; } @@ -121,17 +114,17 @@ static int handle_unitdata_from_smlc(const struct osmo_sccp_addr *smlc_addr, str switch (bssap_le.bssmap_le.msg_type) { case BSSMAP_LE_MSGT_RESET: - rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_RESET]); + rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_RESET)); LOGP(DLCS, LOGL_NOTICE, "RESET from SMLC: %s\n", osmo_sccp_addr_name(ss7, smlc_addr)); return osmo_fsm_inst_dispatch(bsc_gsmnet->smlc->bssmap_reset->fi, BSSMAP_RESET_EV_RX_RESET, NULL); case BSSMAP_LE_MSGT_RESET_ACK: - rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_RESET_ACK]); + rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_RESET_ACK)); LOGP(DLCS, LOGL_NOTICE, "RESET-ACK from SMLC: %s\n", osmo_sccp_addr_name(ss7, smlc_addr)); return osmo_fsm_inst_dispatch(bsc_gsmnet->smlc->bssmap_reset->fi, BSSMAP_RESET_EV_RX_RESET_ACK, NULL); default: - rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG]); + rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG)); LOGP(DLCS, LOGL_ERROR, "Rx unimplemented UDT message type %s\n", osmo_bssap_le_pdu_to_str_c(OTC_SELECT, &bssap_le)); return -EINVAL; @@ -142,6 +135,8 @@ static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu) { struct osmo_scu_prim *scu_prim = (struct osmo_scu_prim *)oph; struct osmo_sccp_user *scu = _scu; + struct osmo_sccp_instance *sccp = osmo_sccp_get_sccp(scu); + struct bsc_sccp_inst *bsc_sccp = osmo_sccp_get_priv(sccp); struct gsm_subscriber_connection *conn; int rc = 0; @@ -164,7 +159,7 @@ static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu) case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_CONFIRM): /* Handle inbound confirmation of outbound connection */ DEBUGP(DLCS, "N-CONNECT.cnf(%u)\n", scu_prim->u.connect.conn_id); - conn = get_bsc_conn_by_lb_conn_id(scu_prim->u.connect.conn_id); + conn = bsc_sccp_inst_get_gscon_by_conn_id(bsc_sccp, scu_prim->u.connect.conn_id); if (conn) { conn->lcs.lb.state = SUBSCR_SCCP_ST_CONNECTED; if (msgb_l2len(oph->msg) > 0) { @@ -180,7 +175,7 @@ static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu) /* Handle incoming connection oriented data */ DEBUGP(DLCS, "N-DATA.ind(%u)\n", scu_prim->u.data.conn_id); - conn = get_bsc_conn_by_lb_conn_id(scu_prim->u.data.conn_id); + conn = bsc_sccp_inst_get_gscon_by_conn_id(bsc_sccp, scu_prim->u.data.conn_id); if (!conn) { LOGP(DLCS, LOGL_ERROR, "N-DATA.ind(%u) for unknown conn_id\n", scu_prim->u.data.conn_id); rc = -EINVAL; @@ -198,12 +193,14 @@ static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu) osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)), scu_prim->u.disconnect.cause); /* indication of disconnect */ - conn = get_bsc_conn_by_lb_conn_id(scu_prim->u.disconnect.conn_id); + conn = bsc_sccp_inst_get_gscon_by_conn_id(bsc_sccp, scu_prim->u.disconnect.conn_id); if (!conn) { LOGP(DLCS, LOGL_ERROR, "N-DISCONNECT.ind for unknown conn_id %u\n", scu_prim->u.disconnect.conn_id); rc = -EINVAL; } else { + bsc_sccp_inst_unregister_gscon(bsc_sccp, &conn->lcs.lb.conn); + conn->lcs.lb.conn.conn_id = SCCP_CONN_ID_UNSET; conn->lcs.lb.state = SUBSCR_SCCP_ST_NONE; if (msgb_l2len(oph->msg) > 0) { rc = lcs_loc_req_rx_bssmap_le(conn, oph->msg); @@ -212,8 +209,9 @@ static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu) break; default: - LOGP(DLCS, LOGL_ERROR, "Unhandled SIGTRAN operation %s on primitive %u\n", - get_value_string(osmo_prim_op_names, oph->operation), oph->primitive); + LOGP(DLCS, LOGL_ERROR, "Unhandled SIGTRAN primitive %s.%s\n", + osmo_scu_prim_type_name(oph->primitive), + get_value_string(osmo_prim_op_names, oph->operation)); break; } @@ -224,8 +222,9 @@ static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu) static int lb_open_conn(struct gsm_subscriber_connection *conn, struct msgb *msg) { struct osmo_ss7_instance *ss7; - int conn_id; + uint32_t conn_id; int rc; + struct bsc_sccp_inst *bsc_sccp = osmo_sccp_get_priv(bsc_gsmnet->smlc->sccp); OSMO_ASSERT(conn); OSMO_ASSERT(msg); @@ -236,35 +235,52 @@ static int lb_open_conn(struct gsm_subscriber_connection *conn, struct msgb *msg return -EINVAL; } - conn_id = bsc_sccp_inst_next_conn_id(bsc_gsmnet->smlc->sccp); - if (conn_id < 0) { + conn_id = bsc_sccp_inst_next_conn_id(bsc_sccp); + if (conn_id == SCCP_CONN_ID_UNSET) { LOGPFSMSL(conn->fi, DLCS, LOGL_ERROR, "Unable to allocate SCCP Connection ID for BSSMAP-LE to SMLC\n"); return -ENOSPC; } - conn->lcs.lb.conn_id = conn_id; + conn->lcs.lb.conn.conn_id = conn_id; + if (bsc_sccp_inst_register_gscon(bsc_sccp, &conn->lcs.lb.conn) < 0) { + LOGP(DMSC, LOGL_ERROR, "Unable to register Lb SCCP connection (id=%u)\n", conn->lcs.lb.conn.conn_id); + return -1; + } ss7 = osmo_ss7_instance_find(bsc_gsmnet->smlc->cs7_instance); OSMO_ASSERT(ss7); - LOGPFSMSL(conn->fi, DLCS, LOGL_INFO, "Opening new SCCP connection (id=%i) to SMLC: %s\n", conn_id, + LOGPFSMSL(conn->fi, DLCS, LOGL_INFO, "Opening new SCCP connection (id=%u) to SMLC: %s\n", conn_id, osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr)); rc = osmo_sccp_tx_conn_req_msg(bsc_gsmnet->smlc->sccp_user, conn_id, &bsc_gsmnet->smlc->bsc_addr, &bsc_gsmnet->smlc->smlc_addr, msg); - if (rc >= 0) - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_SUCCESS]); - else - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_ERR_SEND]); - if (rc >= 0) + if (rc >= 0) { + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_SUCCESS)); conn->lcs.lb.state = SUBSCR_SCCP_ST_WAIT_CONN_CONF; + } else { + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_ERR_SEND)); + goto failed_unregister_conn_id; + } + + return rc; +failed_unregister_conn_id: + bsc_sccp_inst_unregister_gscon(bsc_sccp, &conn->lcs.lb.conn); + conn->lcs.lb.conn.conn_id = SCCP_CONN_ID_UNSET; return rc; } void lb_close_conn(struct gsm_subscriber_connection *conn) { + struct bsc_sccp_inst *bsc_sccp; if (conn->lcs.lb.state == SUBSCR_SCCP_ST_NONE) return; - osmo_sccp_tx_disconn(bsc_gsmnet->smlc->sccp_user, conn->lcs.lb.conn_id, &bsc_gsmnet->smlc->bsc_addr, 0); + OSMO_ASSERT(conn->lcs.lb.conn.conn_id != SCCP_CONN_ID_UNSET); + + osmo_sccp_tx_disconn(bsc_gsmnet->smlc->sccp_user, conn->lcs.lb.conn.conn_id, &bsc_gsmnet->smlc->bsc_addr, 0); + conn->lcs.lb.state = SUBSCR_SCCP_ST_NONE; + bsc_sccp = osmo_sccp_get_priv(bsc_gsmnet->smlc->sccp); + bsc_sccp_inst_unregister_gscon(bsc_sccp, &conn->lcs.lb.conn); + conn->lcs.lb.conn.conn_id = SCCP_CONN_ID_UNSET; } /* Send data to SMLC, take ownership of *msg */ @@ -297,11 +313,11 @@ int lb_send(struct gsm_subscriber_connection *conn, const struct bssap_le_pdu *b } LOGPFSMSL(conn->fi, DLCS, LOGL_DEBUG, "Tx %s\n", osmo_bssap_le_pdu_to_str_c(OTC_SELECT, bssap_le)); - rc = osmo_sccp_tx_data_msg(bsc_gsmnet->smlc->sccp_user, conn->lcs.lb.conn_id, msg); + rc = osmo_sccp_tx_data_msg(bsc_gsmnet->smlc->sccp_user, conn->lcs.lb.conn.conn_id, msg); if (rc >= 0) - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_SUCCESS]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_SUCCESS)); else - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_ERR_SEND]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_ERR_SEND)); count_tx: if (rc < 0) @@ -309,24 +325,24 @@ count_tx: switch (bssap_le->bssmap_le.msg_type) { case BSSMAP_LE_MSGT_PERFORM_LOC_REQ: - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_REQUEST]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_REQUEST)); break; case BSSMAP_LE_MSGT_PERFORM_LOC_ABORT: - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_ABORT]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_ABORT)); break; case BSSMAP_LE_MSGT_CONN_ORIENTED_INFO: switch (bssap_le->bssmap_le.conn_oriented_info.apdu.msg_type) { case BSSLAP_MSGT_TA_RESPONSE: - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_TA_RESPONSE]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_TA_RESPONSE)); break; case BSSLAP_MSGT_REJECT: - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_REJECT]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_REJECT)); break; case BSSLAP_MSGT_RESET: - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_RESET]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_RESET)); break; case BSSLAP_MSGT_ABORT: - rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_ABORT]); + rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_ABORT)); break; default: break; @@ -347,7 +363,7 @@ count_tx: #define DEFAULT_ASP_LOCAL_IP "localhost" #define DEFAULT_ASP_REMOTE_IP "localhost" -void lb_cancel_all() +void lb_cancel_all(void) { struct gsm_subscriber_connection *conn; llist_for_each_entry(conn, &bsc_gsmnet->subscr_conns, entry) @@ -379,7 +395,7 @@ void lb_reset_tx_reset_ack(void *data) bssmap_le_tx_reset_ack(); } -static void lb_start_reset_fsm() +static void lb_start_reset_fsm(void) { struct bssmap_reset_cfg cfg = { .conn_cfm_failure_threshold = 3, @@ -399,7 +415,13 @@ static void lb_start_reset_fsm() bsc_gsmnet->smlc->bssmap_reset = bssmap_reset_alloc(bsc_gsmnet, "Lb", &cfg); } -static int lb_start() +static void lb_stop_reset_fsm(void) +{ + bssmap_reset_term_and_free(bsc_gsmnet->smlc->bssmap_reset); + bsc_gsmnet->smlc->bssmap_reset = NULL; +} + +static int lb_start(void) { uint32_t default_pc; struct osmo_ss7_instance *cs7_inst = NULL; @@ -407,6 +429,7 @@ static int lb_start() enum osmo_ss7_asp_protocol used_proto = OSMO_SS7_ASP_PROT_M3UA; char inst_name[32]; const char *smlc_name = "smlc"; + struct bsc_sccp_inst *bsc_sccp; /* Already set up? */ if (bsc_gsmnet->smlc->sccp_user) @@ -440,6 +463,9 @@ static int lb_start() if (!sccp) return -EINVAL; bsc_gsmnet->smlc->sccp = sccp; + bsc_sccp = bsc_sccp_inst_alloc(tall_bsc_ctx); + bsc_sccp->sccp = sccp; + osmo_sccp_set_priv(sccp, bsc_sccp); /* If unset, use default local SCCP address */ if (!bsc_gsmnet->smlc->bsc_addr.presence) @@ -473,7 +499,7 @@ static int lb_start() return 0; } -static int lb_stop() +static int lb_stop(void) { /* Not set up? */ if (!bsc_gsmnet->smlc->sccp_user) @@ -482,12 +508,13 @@ static int lb_stop() LOGP(DLCS, LOGL_INFO, "Shutting down Lb link\n"); lb_cancel_all(); + lb_stop_reset_fsm(); osmo_sccp_user_unbind(bsc_gsmnet->smlc->sccp_user); bsc_gsmnet->smlc->sccp_user = NULL; return 0; } -int lb_start_or_stop() +int lb_start_or_stop(void) { int rc; if (bsc_gsmnet->smlc->enable) { @@ -522,7 +549,7 @@ int lb_start_or_stop() static void smlc_vty_init(void); -int lb_init() +int lb_init(void) { OSMO_ASSERT(!bsc_gsmnet->smlc); bsc_gsmnet->smlc = talloc_zero(bsc_gsmnet, struct smlc_config); @@ -587,6 +614,28 @@ static void enforce_ssn(struct vty *vty, struct osmo_sccp_addr *addr, enum osmo_ addr->ssn = want_ssn; } +/* Prevent mixing addresses from different CS7 instances */ +bool smlc_set_cs7_instance(struct vty *vty, const char *from_vty_cmd, const char *from_addr, + struct osmo_ss7_instance *ss7) +{ + if (bsc_gsmnet->smlc->cs7_instance_valid) { + if (bsc_gsmnet->smlc->cs7_instance != ss7->cfg.id) { + LOGP(DLCS, LOGL_ERROR, + "%s: expecting address from cs7 instance %u, but '%s' is from %u\n", + from_vty_cmd, bsc_gsmnet->smlc->cs7_instance, from_addr, ss7->cfg.id); + vty_out(vty, "Error:" + " %s: expecting address from cs7 instance %u, but '%s' is from %u%s", + from_vty_cmd, bsc_gsmnet->smlc->cs7_instance, from_addr, ss7->cfg.id, VTY_NEWLINE); + return false; + } + } else { + bsc_gsmnet->smlc->cs7_instance = ss7->cfg.id; + bsc_gsmnet->smlc->cs7_instance_valid = true; + LOGP(DLCS, LOGL_NOTICE, "Lb interface is using cs7 instance %u\n", bsc_gsmnet->smlc->cs7_instance); + } + return true; +} + DEFUN(cfg_smlc_cs7_bsc_addr, cfg_smlc_cs7_bsc_addr_cmd, "bsc-addr NAME", @@ -601,17 +650,9 @@ DEFUN(cfg_smlc_cs7_bsc_addr, return CMD_ERR_INCOMPLETE; } - /* Prevent mixing addresses from different CS7 instances */ - if (bsc_gsmnet->smlc->cs7_instance_valid - && bsc_gsmnet->smlc->cs7_instance != ss7->cfg.id) { - vty_out(vty, - "Error: SCCP addressbook entry from mismatching CS7 instance: '%s'%s", - bsc_addr_name, VTY_NEWLINE); + if (!smlc_set_cs7_instance(vty, "smlc / bsc-addr", bsc_addr_name, ss7)) return CMD_WARNING; - } - bsc_gsmnet->smlc->cs7_instance = ss7->cfg.id; - bsc_gsmnet->smlc->cs7_instance_valid = true; enforce_ssn(vty, &bsc_gsmnet->smlc->bsc_addr, OSMO_SCCP_SSN_BSC_BSSAP_LE); bsc_gsmnet->smlc->bsc_addr_name = talloc_strdup(bsc_gsmnet, bsc_addr_name); return CMD_SUCCESS; @@ -631,18 +672,9 @@ DEFUN(cfg_smlc_cs7_smlc_addr, return CMD_ERR_INCOMPLETE; } - /* Prevent mixing addresses from different CS7/SS7 instances */ - if (bsc_gsmnet->smlc->cs7_instance_valid) { - if (bsc_gsmnet->smlc->cs7_instance != ss7->cfg.id) { - vty_out(vty, - "Error: SCCP addressbook entry from mismatching CS7 instance: '%s'%s", - smlc_addr_name, VTY_NEWLINE); - return CMD_ERR_INCOMPLETE; - } - } + if (!smlc_set_cs7_instance(vty, "smlc / smlc-addr", smlc_addr_name, ss7)) + return CMD_WARNING; - bsc_gsmnet->smlc->cs7_instance = ss7->cfg.id; - bsc_gsmnet->smlc->cs7_instance_valid = true; enforce_ssn(vty, &bsc_gsmnet->smlc->smlc_addr, OSMO_SCCP_SSN_SMLC_BSSAP_LE); bsc_gsmnet->smlc->smlc_addr_name = talloc_strdup(bsc_gsmnet, smlc_addr_name); return CMD_SUCCESS; |