diff options
Diffstat (limited to 'src/osmo-bsc/osmo_bsc_msc.c')
-rw-r--r-- | src/osmo-bsc/osmo_bsc_msc.c | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/src/osmo-bsc/osmo_bsc_msc.c b/src/osmo-bsc/osmo_bsc_msc.c index 583b6ff23..08a2466e3 100644 --- a/src/osmo-bsc/osmo_bsc_msc.c +++ b/src/osmo-bsc/osmo_bsc_msc.c @@ -40,6 +40,7 @@ #include <osmocom/abis/ipa.h> #include <osmocom/mgcp_client/mgcp_client.h> +#include <osmocom/mgcp_client/mgcp_client_pool.h> #include <sys/socket.h> #include <netinet/tcp.h> @@ -53,8 +54,9 @@ static const struct rate_ctr_desc msc_ctr_description[] = { [MSC_CTR_BSSMAP_RX_UDT_UNKNOWN] = {"bssmap:rx:udt:err_unknown", "Number of received BSSMAP unknown UDT messages"}, [MSC_CTR_BSSMAP_RX_DT1_CLEAR_CMD] = {"bssmap:rx:dt1:clear:cmd", "Number of received BSSMAP DT1 CLEAR CMD messages"}, [MSC_CTR_BSSMAP_RX_DT1_CIPHER_MODE_CMD] = {"bssmap:rx:dt1:cipher_mode:cmd", "Number of received BSSMAP DT1 CIPHER MODE CMD messages"}, - [MSC_CTR_BSSMAP_RX_DT1_ASSIGMENT_RQST] = {"bssmap:rx:dt1:assignment:rqst", "Number of received BSSMAP DT1 ASSIGMENT RQST messages"}, + [MSC_CTR_BSSMAP_RX_DT1_ASSIGNMENT_RQST] = {"bssmap:rx:dt1:assignment:rqst", "Number of received BSSMAP DT1 ASSIGNMENT RQST messages"}, [MSC_CTR_BSSMAP_RX_DT1_LCLS_CONNECT_CTRL] = {"bssmap:rx:dt1:lcls_connect_ctrl:cmd", "Number of received BSSMAP DT1 LCLS CONNECT CTRL messages"}, + [MSC_CTR_BSSMAP_RX_DT1_HANDOVER_RQST] = {"bssmap:rx:dt1:handover:rqst", "Number of received BSSMAP DT1 HANDOVER RQST messages"}, [MSC_CTR_BSSMAP_RX_DT1_HANDOVER_CMD] = {"bssmap:rx:dt1:handover:cmd", "Number of received BSSMAP DT1 HANDOVER CMD messages"}, [MSC_CTR_BSSMAP_RX_DT1_CLASSMARK_RQST] = {"bssmap:rx:dt1:classmark:rqst", "Number of received BSSMAP DT1 CLASSMARK RQST messages"}, [MSC_CTR_BSSMAP_RX_DT1_CONFUSION] = {"bssmap:rx:dt1:confusion", "Number of received BSSMAP DT1 CONFUSION messages"}, @@ -147,8 +149,8 @@ static const struct rate_ctr_group_desc msc_ctrg_desc = { }; static const struct osmo_stat_item_desc msc_stat_desc[] = { - { "msc_links:active", "Number of active MSC links", "", 16, 0 }, - { "msc_links:total", "Number of configured MSC links", "", 16, 0 }, + [MSC_STAT_MSC_LINKS_ACTIVE] = { "msc_links:active", "Number of active MSC links", "", 16, 0 }, + [MSC_STAT_MSC_LINKS_TOTAL] = { "msc_links:total", "Number of configured MSC links", "", 16, 0 }, }; static const struct osmo_stat_item_group_desc msc_statg_desc = { @@ -162,23 +164,32 @@ static const struct osmo_stat_item_group_desc msc_statg_desc = { int osmo_bsc_msc_init(struct bsc_msc_data *msc) { struct gsm_network *net = msc->network; - uint16_t mgw_port; + struct mgcp_client *mgcp_cli; int rc; - if (net->mgw.conf->remote_port >= 0) - mgw_port = net->mgw.conf->remote_port; - else - mgw_port = MGCP_CLIENT_REMOTE_PORT_DEFAULT; + /* Everything below refers to SCCP-Lite MSC connections only. */ + if (msc_is_aoip(msc)) + return 0; + /* Note: MGW is preselected here at startup, which means currently + * osmo-bsc configured for SCCPLite doesn't support MGW pools with more + * than 1 MGW. + */ + mgcp_cli = mgcp_client_pool_get(net->mgw.mgw_pool); + OSMO_ASSERT(mgcp_cli); rc = osmo_sock_init2_ofd(&msc->mgcp_ipa.ofd, AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, msc->mgcp_ipa.local_addr, msc->mgcp_ipa.local_port, - net->mgw.conf->remote_addr, mgw_port, + mgcp_client_remote_addr_str(mgcp_cli), + mgcp_client_remote_port(mgcp_cli), OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT); + mgcp_client_pool_put(mgcp_cli); if (rc < 0) { LOGP(DMSC, LOGL_ERROR, "msc %u: Could not create/connect/bind MGCP proxy socket: %d\n", msc->nr, rc); return rc; } + LOGP(DMSC, LOGL_INFO, "msc %u: Socket forwarding IPA-encapsulated MGCP messages towards MGW: %s\n", + msc->nr, osmo_sock_get_name2(msc->mgcp_ipa.ofd.fd)); return 0; } @@ -196,7 +207,6 @@ struct bsc_msc_data *osmo_msc_data_find(struct gsm_network *net, int nr) struct bsc_msc_data *osmo_msc_data_alloc(struct gsm_network *net, int nr) { struct bsc_msc_data *msc_data; - unsigned int i; /* check if there is already one */ msc_data = osmo_msc_data_find(net, nr); @@ -229,8 +239,6 @@ struct bsc_msc_data *osmo_msc_data_alloc(struct gsm_network *net, int nr) .mcc = GSM_MCC_MNC_INVALID, .mnc = GSM_MCC_MNC_INVALID, }; - msc_data->core_ci = -1; - msc_data->core_lac = -1; msc_data->nr = nr; msc_data->allow_emerg = 1; @@ -242,24 +250,16 @@ struct bsc_msc_data *osmo_msc_data_alloc(struct gsm_network *net, int nr) /* Allow the full set of possible codecs by default */ msc_data->audio_length = 5; - msc_data->audio_support = - talloc_zero_array(msc_data, struct gsm_audio_support *, - msc_data->audio_length); - for (i = 0; i < msc_data->audio_length; i++) { - msc_data->audio_support[i] = - talloc_zero(msc_data->audio_support, - struct gsm_audio_support); - } - msc_data->audio_support[0]->ver = 1; - msc_data->audio_support[0]->hr = 0; - msc_data->audio_support[1]->ver = 1; - msc_data->audio_support[1]->hr = 1; - msc_data->audio_support[2]->ver = 2; - msc_data->audio_support[2]->hr = 0; - msc_data->audio_support[3]->ver = 3; - msc_data->audio_support[3]->hr = 0; - msc_data->audio_support[4]->ver = 3; - msc_data->audio_support[4]->hr = 1; + msc_data->audio_support[0].ver = 1; + msc_data->audio_support[0].hr = 0; + msc_data->audio_support[1].ver = 1; + msc_data->audio_support[1].hr = 1; + msc_data->audio_support[2].ver = 2; + msc_data->audio_support[2].hr = 0; + msc_data->audio_support[3].ver = 3; + msc_data->audio_support[3].hr = 0; + msc_data->audio_support[4].ver = 3; + msc_data->audio_support[4].hr = 1; osmo_fd_setup(&msc_data->mgcp_ipa.ofd, -1, OSMO_FD_READ, &bsc_sccplite_mgcp_proxy_cb, msc_data, 0); msc_data->mgcp_ipa.local_addr = NULL; /* = INADDR(6)_ANY */ @@ -285,8 +285,8 @@ struct osmo_cell_global_id *cgi_for_msc(struct bsc_msc_data *msc, struct gsm_bts cgi.lai.plmn.mnc = msc->core_plmn.mnc; cgi.lai.plmn.mnc_3_digits = msc->core_plmn.mnc_3_digits; } - cgi.lai.lac = (msc->core_lac != -1) ? msc->core_lac : bts->location_area_code; - cgi.cell_identity = (msc->core_ci != -1) ? msc->core_ci : bts->cell_identity; + cgi.lai.lac = bts->location_area_code; + cgi.cell_identity = bts->cell_identity; return &cgi; } |