drop CC 'local-prefix' feature
It is not entirely clear to me what this used to do once, but I've stumbled upon this before. By now I am certain that this is a non-standard legacy feature. The BSC does *not* redirect connections during CC transactions. Along with this, a bunch of legacy utility functions can be dropped. All of this is unused code. (Preparing for MSC pooling.) Change-Id: Id54afe8ccf0e11b9121a733224054c9565eafb58
This commit is contained in:
parent
962cb637fc
commit
bf4134edaf
|
@ -45,7 +45,6 @@
|
|||
#include <osmocom/core/fsm.h>
|
||||
#include <osmocom/gsm/gsm23003.h>
|
||||
|
||||
#include <regex.h>
|
||||
#include <errno.h>
|
||||
|
||||
struct osmo_bsc_rf;
|
||||
|
@ -121,11 +120,6 @@ struct bsc_msc_data {
|
|||
int allow_emerg;
|
||||
int type;
|
||||
|
||||
/* local call routing */
|
||||
char *local_pref;
|
||||
regex_t local_pref_reg;
|
||||
|
||||
|
||||
/* Connection data */
|
||||
struct osmo_plmn_id core_plmn;
|
||||
int core_lac;
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#define _GSM_DATA_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <regex.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
@ -1362,12 +1361,6 @@ void gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, const struc
|
|||
/* return the gsm_lchan for the CBCH (if it exists at all) */
|
||||
struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts);
|
||||
|
||||
/*
|
||||
* help with parsing regexps
|
||||
*/
|
||||
int gsm_parse_reg(void *ctx, regex_t *reg, char **str,
|
||||
int argc, const char **argv) __attribute__ ((warn_unused_result));
|
||||
|
||||
static inline uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts)
|
||||
{
|
||||
if (ts->tsc != -1)
|
||||
|
|
|
@ -475,96 +475,6 @@ early_fail:
|
|||
return false;
|
||||
}
|
||||
|
||||
static int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);
|
||||
|
||||
/*
|
||||
* Plastic surgery... we want to give up the current connection
|
||||
*/
|
||||
static int move_to_msc(struct gsm_subscriber_connection *_conn,
|
||||
struct msgb *msg, struct bsc_msc_data *msc)
|
||||
{
|
||||
/*
|
||||
* 1. Give up the old connection.
|
||||
* This happens by sending a clear request to the MSC,
|
||||
* it should end with the MSC releasing the connection.
|
||||
*/
|
||||
bsc_clear_request(_conn, 0);
|
||||
|
||||
/*
|
||||
* 2. Attempt to create a new connection to the local
|
||||
* MSC. If it fails the caller will need to handle this
|
||||
* properly.
|
||||
*/
|
||||
if (!complete_layer3(_conn, msg, msc)) {
|
||||
/* FIXME: I have not the slightest idea what move_to_msc() intends to do; during lchan
|
||||
* FSM introduction, I changed this and hope it is the appropriate action. I actually
|
||||
* assume this is unused legacy code for osmo-bsc_nat?? */
|
||||
gscon_release_lchans(_conn, false);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
static int handle_cc_setup(struct gsm_subscriber_connection *conn,
|
||||
struct msgb *msg)
|
||||
{
|
||||
struct gsm48_hdr *gh = msgb_l3(msg);
|
||||
uint8_t pdisc = gsm48_hdr_pdisc(gh);
|
||||
uint8_t mtype = gsm48_hdr_msg_type(gh);
|
||||
|
||||
struct bsc_msc_data *msc;
|
||||
struct gsm_mncc_number called;
|
||||
struct tlv_parsed tp;
|
||||
unsigned payload_len;
|
||||
|
||||
char _dest_nr[35];
|
||||
|
||||
/*
|
||||
* Do we have a setup message here? if not return fast.
|
||||
*/
|
||||
if (pdisc != GSM48_PDISC_CC || mtype != GSM48_MT_CC_SETUP)
|
||||
return 0;
|
||||
|
||||
payload_len = msgb_l3len(msg) - sizeof(*gh);
|
||||
|
||||
tlv_parse(&tp, &gsm48_att_tlvdef, gh->data, payload_len, 0, 0);
|
||||
if (!TLVP_PRESENT(&tp, GSM48_IE_CALLED_BCD)) {
|
||||
LOGP(DMSC, LOGL_ERROR, "Called BCD not present in setup.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&called, 0, sizeof(called));
|
||||
gsm48_decode_called(&called,
|
||||
TLVP_VAL(&tp, GSM48_IE_CALLED_BCD) - 1);
|
||||
|
||||
if (called.plan != 1 && called.plan != 0)
|
||||
return 0;
|
||||
|
||||
if (called.plan == 1 && called.type == 1) {
|
||||
_dest_nr[0] = _dest_nr[1] = '0';
|
||||
memcpy(_dest_nr + 2, called.number, sizeof(called.number));
|
||||
} else
|
||||
memcpy(_dest_nr, called.number, sizeof(called.number));
|
||||
|
||||
/*
|
||||
* Check if the connection should be moved...
|
||||
*/
|
||||
llist_for_each_entry(msc, &conn_get_bts(conn)->network->bsc_data->mscs, entry) {
|
||||
if (msc->type != MSC_CON_TYPE_LOCAL)
|
||||
continue;
|
||||
if (!msc->local_pref)
|
||||
continue;
|
||||
if (regexec(&msc->local_pref_reg, _dest_nr, 0, NULL, 0) != 0)
|
||||
continue;
|
||||
|
||||
return move_to_msc(conn, msg, msc);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*! MS->BSC/MSC: Um L3 message. */
|
||||
void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg)
|
||||
{
|
||||
|
@ -575,13 +485,6 @@ void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct ms
|
|||
|
||||
LOGP(DMSC, LOGL_INFO, "Tx MSC DTAP LINK_ID=0x%02x\n", link_id);
|
||||
|
||||
/*
|
||||
* We might want to move this connection to a new MSC. Ask someone
|
||||
* to handle it. If it was handled we will return.
|
||||
*/
|
||||
if (handle_cc_setup(conn, msg) >= 1)
|
||||
goto done;
|
||||
|
||||
bsc_scan_bts_msg(conn, msg);
|
||||
|
||||
/* Store link_id in msg->cb */
|
||||
|
@ -592,31 +495,6 @@ done:
|
|||
return;
|
||||
}
|
||||
|
||||
/*! BSSMAP Clear Request for legacy code paths, instead see gscon_bssmap_clear(). */
|
||||
static int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause)
|
||||
{
|
||||
int rc;
|
||||
struct msgb *resp;
|
||||
|
||||
if (!msc_connected(conn))
|
||||
return 1;
|
||||
|
||||
LOGP(DMSC, LOGL_INFO, "Tx MSC CLEAR REQUEST\n");
|
||||
|
||||
resp = gsm0808_create_clear_rqst(GSM0808_CAUSE_RADIO_INTERFACE_FAILURE);
|
||||
if (!resp) {
|
||||
LOGP(DMSC, LOGL_ERROR, "Failed to allocate response.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLEAR_RQST]);
|
||||
rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp);
|
||||
if (rc != 0)
|
||||
msgb_free(resp);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*! BSC->MSC: Classmark Update. */
|
||||
void bsc_cm_update(struct gsm_subscriber_connection *conn,
|
||||
const uint8_t *cm2, uint8_t cm2_len,
|
||||
|
|
|
@ -248,31 +248,6 @@ void gsm48_ra_id_by_bts(struct gsm48_ra_id *buf, struct gsm_bts *bts)
|
|||
gsm48_encode_ra(buf, &raid);
|
||||
}
|
||||
|
||||
int gsm_parse_reg(void *ctx, regex_t *reg, char **str, int argc, const char **argv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = 0;
|
||||
if (*str) {
|
||||
talloc_free(*str);
|
||||
*str = NULL;
|
||||
}
|
||||
regfree(reg);
|
||||
|
||||
if (argc > 0) {
|
||||
*str = talloc_strdup(ctx, argv[0]);
|
||||
ret = regcomp(reg, argv[0], REG_NOSUB);
|
||||
|
||||
/* handle compilation failures */
|
||||
if (ret != 0) {
|
||||
talloc_free(*str);
|
||||
*str = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Assume there are only 256 possible bts */
|
||||
osmo_static_assert(sizeof(((struct gsm_bts *) 0)->nr) == 1, _bts_nr_is_256);
|
||||
static void depends_calc_index_bit(int bts_nr, int *idx, int *bit)
|
||||
|
|
|
@ -157,9 +157,6 @@ static void write_msc(struct vty *vty, struct bsc_msc_data *msc)
|
|||
vty_out(vty, " allow-emergency %s%s", msc->allow_emerg ?
|
||||
"allow" : "deny", VTY_NEWLINE);
|
||||
|
||||
if (msc->local_pref)
|
||||
vty_out(vty, " local-prefix %s%s", msc->local_pref, VTY_NEWLINE);
|
||||
|
||||
/* write amr options */
|
||||
write_msc_amr_options(vty, msc);
|
||||
|
||||
|
@ -482,22 +479,6 @@ DEFUN(cfg_net_msc_emerg,
|
|||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN(cfg_net_msc_local_prefix,
|
||||
cfg_net_msc_local_prefix_cmd,
|
||||
"local-prefix REGEXP",
|
||||
"Prefix for local numbers\n" "REGEXP used\n")
|
||||
{
|
||||
struct bsc_msc_data *msc = bsc_msc_data(vty);
|
||||
|
||||
if (gsm_parse_reg(msc, &msc->local_pref_reg, &msc->local_pref, argc, argv) != 0) {
|
||||
vty_out(vty, "%%Failed to parse the regexp: '%s'%s",
|
||||
argv[0], VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
#define AMR_CONF_STR "AMR Multirate Configuration\n"
|
||||
#define AMR_COMMAND(name) \
|
||||
DEFUN(cfg_net_msc_amr_##name, \
|
||||
|
@ -961,7 +942,6 @@ int bsc_vty_init_extra(void)
|
|||
install_element(MSC_NODE, &cfg_net_msc_no_grace_ussd_cmd);
|
||||
install_element(MSC_NODE, &cfg_net_msc_type_cmd);
|
||||
install_element(MSC_NODE, &cfg_net_msc_emerg_cmd);
|
||||
install_element(MSC_NODE, &cfg_net_msc_local_prefix_cmd);
|
||||
install_element(MSC_NODE, &cfg_net_msc_amr_12_2_cmd);
|
||||
install_element(MSC_NODE, &cfg_net_msc_amr_10_2_cmd);
|
||||
install_element(MSC_NODE, &cfg_net_msc_amr_7_95_cmd);
|
||||
|
|
Loading…
Reference in New Issue