From fe416dfe0707ab7d0ea2236a823465d67b98f057 Mon Sep 17 00:00:00 2001 From: Michael McTernan Date: Fri, 3 Jul 2015 10:59:40 +0100 Subject: Support mnc_t. Signed-off-by: Michael McTernan --- openbsc/include/openbsc/gb_proxy.h | 2 +- openbsc/include/openbsc/gsm_data.h | 7 +++-- openbsc/include/openbsc/osmo_msc_data.h | 3 +- openbsc/src/gprs/gb_proxy.c | 55 +++++++++++++++++---------------- openbsc/src/gprs/gb_proxy_vty.c | 12 ++++--- openbsc/src/gprs/gprs_gmm.c | 4 +-- openbsc/src/gprs/gprs_sgsn.c | 2 +- openbsc/src/gprs/sgsn_vty.c | 6 ++-- openbsc/src/ipaccess/ipaccess-config.c | 2 +- openbsc/src/libbsc/bsc_ctrl_commands.c | 9 +++--- openbsc/src/libbsc/bsc_init.c | 8 +++-- openbsc/src/libbsc/bsc_vty.c | 11 ++++--- openbsc/src/libcommon/gsm_data.c | 2 +- openbsc/src/osmo-bsc/osmo_bsc_api.c | 9 +++--- openbsc/src/osmo-bsc/osmo_bsc_ctrl.c | 5 +-- openbsc/src/osmo-bsc/osmo_bsc_filter.c | 2 +- openbsc/src/osmo-bsc/osmo_bsc_msc.c | 2 +- openbsc/src/osmo-bsc/osmo_bsc_vty.c | 10 +++--- openbsc/src/utils/bs11_config.c | 2 +- openbsc/tests/channel/channel_test.c | 2 +- openbsc/tests/gbproxy/gbproxy_test.c | 3 +- openbsc/tests/gsm0408/gsm0408_test.c | 10 ++++-- 22 files changed, 96 insertions(+), 72 deletions(-) diff --git a/openbsc/include/openbsc/gb_proxy.h b/openbsc/include/openbsc/gb_proxy.h index 528b0c4a9..9d4b4e914 100644 --- a/openbsc/include/openbsc/gb_proxy.h +++ b/openbsc/include/openbsc/gb_proxy.h @@ -25,7 +25,7 @@ struct gbproxy_config { struct gprs_ns_inst *nsi; /* force mcc/mnc */ - int core_mnc; + gsm_mnc_t core_mnc; int core_mcc; uint8_t* core_apn; size_t core_apn_size; diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 4338cd60c..5de004a74 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -5,6 +5,7 @@ #include #include +#include #include @@ -205,8 +206,8 @@ enum gsm_auth_policy { struct gsm_network { /* global parameters */ - uint16_t country_code; - uint16_t network_code; + uint16_t country_code; + gsm_mnc_t network_code; char *name_long; char *name_short; enum gsm_auth_policy auth_policy; @@ -328,7 +329,7 @@ struct gsm_sms { char text[SMS_TEXT_SIZE]; }; -struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_code, +struct gsm_network *gsm_network_init(uint16_t country_code, gsm_mnc_t network_code, int (*mncc_recv)(struct gsm_network *, struct msgb *)); int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type); diff --git a/openbsc/include/openbsc/osmo_msc_data.h b/openbsc/include/openbsc/osmo_msc_data.h index 9c312ca8d..d434daed2 100644 --- a/openbsc/include/openbsc/osmo_msc_data.h +++ b/openbsc/include/openbsc/osmo_msc_data.h @@ -27,6 +27,7 @@ #include #include +#include #include @@ -64,7 +65,7 @@ struct osmo_msc_data { struct osmo_timer_list ping_timer; struct osmo_timer_list pong_timer; struct bsc_msc_connection *msc_con; - int core_ncc; + gsm_mnc_t core_mnc; int core_mcc; int rtp_base; diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c index d4b5e0e40..b8923a780 100644 --- a/openbsc/src/gprs/gb_proxy.c +++ b/openbsc/src/gprs/gb_proxy.c @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -143,7 +144,7 @@ struct { } gbprox_global_patch_state = {0,}; struct gbprox_patch_state { - int local_mnc; + gsm_mnc_t local_mnc; int local_mcc; /* List of TLLIs for which patching is enabled */ @@ -851,9 +852,9 @@ static void gbprox_patch_raid(uint8_t *raid_enc, struct gbprox_peer *peer, { struct gbprox_patch_state *state = &peer->patch_state; const int old_local_mcc = state->local_mcc; - const int old_local_mnc = state->local_mnc; + const gsm_mnc_t old_local_mnc = state->local_mnc; int old_mcc; - int old_mnc; + gsm_mnc_t old_mnc; struct gprs_ra_id raid; gsm48_parse_ra(&raid, raid_enc); @@ -871,8 +872,8 @@ static void gbprox_patch_raid(uint8_t *raid_enc, struct gbprox_peer *peer, raid.mcc = gbcfg.core_mcc; } - if (!gbcfg.core_mnc || raid.mnc == gbcfg.core_mnc) { - state->local_mnc = 0; + if (!gbcfg.core_mnc.network_code || gsm48_mnc_are_equal(raid.mnc, gbcfg.core_mnc)) { + memset(&state->local_mnc, 0, sizeof(state->local_mnc)); } else { state->local_mnc = raid.mnc; raid.mnc = gbcfg.core_mnc; @@ -882,23 +883,25 @@ static void gbprox_patch_raid(uint8_t *raid_enc, struct gbprox_peer *peer, if (state->local_mcc) raid.mcc = state->local_mcc; - if (state->local_mnc) + if (state->local_mnc.network_code) raid.mnc = state->local_mnc; } if (old_local_mcc != state->local_mcc || - old_local_mnc != state->local_mnc) + !gsm48_mnc_are_equal(old_local_mnc, state->local_mnc)) LOGP(DGPRS, LOGL_NOTICE, "Patching RAID %sactivated, msg: %s, " - "local: %d-%d, core: %d-%d, to %s\n", - state->local_mcc || state->local_mnc ? + "local: %d-%0*d, core: %d-%0*d, to %s\n", + state->local_mcc || state->local_mnc.network_code ? "" : "de", log_text, - state->local_mcc, state->local_mnc, - gbcfg.core_mcc, gbcfg.core_mnc, + state->local_mcc, + state->local_mnc.two_digits ? 2 : 3, state->local_mnc.network_code, + gbcfg.core_mcc, + gbcfg.core_mnc.two_digits ? 2 : 3, gbcfg.core_mnc.network_code, to_bss ? "BSS" : "SGSN"); - if (state->local_mcc || state->local_mnc) { + if (state->local_mcc || state->local_mnc.network_code) { enum gbprox_peer_ctr counter = to_bss ? GBPROX_PEER_CTR_RAID_PATCHED_SGSN : @@ -906,11 +909,11 @@ static void gbprox_patch_raid(uint8_t *raid_enc, struct gbprox_peer *peer, LOGP(DGPRS, LOGL_DEBUG, "Patching %s to %s: " - "%d-%d-%d-%d -> %d-%d-%d-%d\n", + "%d-%0*d-%d-%d -> %d-%0*d-%d-%d\n", log_text, to_bss ? "BSS" : "SGSN", - old_mcc, old_mnc, raid.lac, raid.rac, - raid.mcc, raid.mnc, raid.lac, raid.rac); + old_mcc, old_mnc.two_digits ? 2 : 3 , old_mnc.network_code, raid.lac, raid.rac, + raid.mcc, raid.mnc.two_digits ? 2 : 3, raid.mnc.network_code, raid.lac, raid.rac); gsm48_construct_ra(raid_enc, &raid); rate_ctr_inc(&peer->ctrg->ctr[counter]); @@ -1361,7 +1364,7 @@ static void gbprox_patch_bssgp_message(struct msgb *msg, const char *err_info = NULL; int err_ctr = -1; - if (!gbcfg.core_mcc && !gbcfg.core_mnc && !gbcfg.core_apn) + if (!gbcfg.core_mcc && !gbcfg.core_mnc.network_code && !gbcfg.core_apn) return; bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg); @@ -1603,9 +1606,9 @@ static int gbprox_rx_sig_from_bss(struct msgb *msg, uint16_t nsei, sizeof(from_peer->ra)); gsm48_parse_ra(&raid, from_peer->ra); LOGP(DGPRS, LOGL_INFO, "NSEI=%u BSSGP SUSPEND/RESUME " - "RAI snooping: RAI %u-%u-%u-%u behind BVCI=%u\n", - nsei, raid.mcc, raid.mnc, raid.lac, - raid.rac , from_peer->bvci); + "RAI snooping: RAI %u-%0*u-%u-%u behind BVCI=%u\n", + nsei, raid.mcc, raid.mnc.two_digits, raid.mnc.network_code, + raid.lac, raid.rac , from_peer->bvci); /* FIXME: This only supports one BSS per RA */ break; case BSSGP_PDUT_BVC_RESET: @@ -1647,9 +1650,9 @@ static int gbprox_rx_sig_from_bss(struct msgb *msg, uint16_t nsei, sizeof(from_peer->ra)); gsm48_parse_ra(&raid, from_peer->ra); LOGP(DGPRS, LOGL_INFO, "NSEI=%u/BVCI=%u " - "Cell ID %u-%u-%u-%u\n", nsei, - bvci, raid.mcc, raid.mnc, raid.lac, - raid.rac); + "Cell ID %u-%0*u-%u-%u\n", + nsei, bvci, raid.mcc, + raid.mnc.two_digits, raid.mnc.network_code, raid.lac, raid.rac); } } break; @@ -2056,11 +2059,11 @@ int gbprox_dump_peers(FILE *stream, int indent) gsm48_parse_ra(&raid, peer->ra); rc = fprintf(stream, "%*s NSEI %u, BVCI %u, %sblocked, " - "RAI %u-%u-%u-%u\n", + "RAI %u-%0*u-%u-%u\n", indent, "", peer->nsei, peer->bvci, peer->blocked ? "" : "not ", - raid.mcc, raid.mnc, raid.lac, raid.rac); + raid.mcc, raid.mnc.two_digits ? 2 : 3, raid.mnc.network_code, raid.lac, raid.rac); if (rc < 0) return rc; @@ -2138,9 +2141,9 @@ static void gbprox_vty_print_peer(struct vty *vty, struct gbprox_peer *peer) gsm48_parse_ra(&raid, peer->ra); vty_out(vty, "NSEI %5u, PTP-BVCI %5u, " - "RAI %u-%u-%u-%u", + "RAI %u-%0*u-%u-%u", peer->nsei, peer->bvci, - raid.mcc, raid.mnc, raid.lac, raid.rac); + raid.mcc, raid.mnc.two_digits ? 2 : 3, raid.mnc.network_code, raid.lac, raid.rac); if (peer->blocked) vty_out(vty, " [BVC-BLOCKED]"); diff --git a/openbsc/src/gprs/gb_proxy_vty.c b/openbsc/src/gprs/gb_proxy_vty.c index e7506fc3e..792d71407 100644 --- a/openbsc/src/gprs/gb_proxy_vty.c +++ b/openbsc/src/gprs/gb_proxy_vty.c @@ -25,6 +25,7 @@ #include +#include #include #include @@ -66,9 +67,9 @@ static int config_write_gbproxy(struct vty *vty) if (g_cfg->core_mcc > 0) vty_out(vty, " core-mobile-country-code %d%s", g_cfg->core_mcc, VTY_NEWLINE); - if (g_cfg->core_mnc > 0) - vty_out(vty, " core-mobile-network-code %d%s", - g_cfg->core_mnc, VTY_NEWLINE); + if (g_cfg->core_mnc.network_code > 0) + vty_out(vty, " core-mobile-network-code %0*d%s", + g_cfg->core_mnc.two_digits ? 2 : 3, g_cfg->core_mnc.network_code, VTY_NEWLINE); if (g_cfg->core_apn != NULL) { if (g_cfg->core_apn_size > 0) { char str[500] = {0}; @@ -128,7 +129,7 @@ DEFUN(cfg_gbproxy_core_mnc, "core-mobile-network-code <1-999>", GBPROXY_CORE_MNC_STR "NCC value\n") { - g_cfg->core_mnc = atoi(argv[0]); + g_cfg->core_mnc = gsm48_str_to_mnc(argv[0]); return CMD_SUCCESS; } @@ -137,7 +138,8 @@ DEFUN(cfg_gbproxy_no_core_mnc, "no core-mobile-network-code", NO_STR GBPROXY_CORE_MNC_STR) { - g_cfg->core_mnc = 0; + /* FIXME: 00, 000 are valid MNCs */ + g_cfg->core_mnc.network_code = 0; return CMD_SUCCESS; } diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c index fa5e82dca..5296364b0 100644 --- a/openbsc/src/gprs/gprs_gmm.c +++ b/openbsc/src/gprs/gprs_gmm.c @@ -700,8 +700,8 @@ static int gsm48_rx_gmm_att_req(struct sgsn_mm_ctx *ctx, struct msgb *msg, /* As a temorary hack, we simply assume that the IMSI exists, * as long as it is part of 'our' network */ char mccmnc[16]; - snprintf(mccmnc, sizeof(mccmnc), "%03d%02d", ra_id.mcc, ra_id.mnc); - if (strncmp(mccmnc, mi_string, 5) && + snprintf(mccmnc, sizeof(mccmnc), "%03d%0*d", ra_id.mcc, ra_id.mnc.two_digits ? 2 : 3, ra_id.mnc.network_code); + if (strncmp(mccmnc, mi_string, strlen(mccmnc)) && (sgsn->cfg.acl_enabled && !sgsn_acl_lookup(mi_string))) { LOGP(DMM, LOGL_INFO, "Rejecting ATTACH REQUESET IMSI=%s\n", diff --git a/openbsc/src/gprs/gprs_sgsn.c b/openbsc/src/gprs/gprs_sgsn.c index 84bf512ae..5e56ce94f 100644 --- a/openbsc/src/gprs/gprs_sgsn.c +++ b/openbsc/src/gprs/gprs_sgsn.c @@ -81,7 +81,7 @@ static const struct rate_ctr_group_desc pdpctx_ctrg_desc = { static int ra_id_equals(const struct gprs_ra_id *id1, const struct gprs_ra_id *id2) { - return (id1->mcc == id2->mcc && id1->mnc == id2->mnc && + return (id1->mcc == id2->mcc && gsm48_mnc_are_equal(id1->mnc, id2->mnc) && id1->lac == id2->lac && id1->rac == id2->rac); } diff --git a/openbsc/src/gprs/sgsn_vty.c b/openbsc/src/gprs/sgsn_vty.c index 31c94f796..ceebf0552 100644 --- a/openbsc/src/gprs/sgsn_vty.c +++ b/openbsc/src/gprs/sgsn_vty.c @@ -240,10 +240,12 @@ static void vty_dump_mmctx(struct vty *vty, const char *pfx, pfx, mm->imsi, mm->imei, mm->p_tmsi, VTY_NEWLINE); vty_out(vty, "%s MSISDN: %s, TLLI: %08x%s", pfx, mm->msisdn, mm->tlli, VTY_NEWLINE); - vty_out(vty, "%s MM State: %s, Routeing Area: %u-%u-%u-%u, " + vty_out(vty, "%s MM State: %s, Routeing Area: %u-%0*u-%u-%u, " "Cell ID: %u%s", pfx, get_value_string(gprs_mm_st_strs, mm->mm_state), - mm->ra.mcc, mm->ra.mnc, mm->ra.lac, mm->ra.rac, + mm->ra.mcc, + mm->ra.mnc.two_digits ? 2 : 3, mm->ra.mnc.network_code, + mm->ra.lac, mm->ra.rac, mm->cell_id, VTY_NEWLINE); vty_out_rate_ctr_group(vty, " ", mm->ctrg); diff --git a/openbsc/src/ipaccess/ipaccess-config.c b/openbsc/src/ipaccess/ipaccess-config.c index c42c7bb9c..c99e7d85c 100644 --- a/openbsc/src/ipaccess/ipaccess-config.c +++ b/openbsc/src/ipaccess/ipaccess-config.c @@ -983,7 +983,7 @@ int main(int argc, char **argv) } libosmo_abis_init(tall_ctx_config); - bsc_gsmnet = gsm_network_init(1, 1, NULL); + bsc_gsmnet = gsm_network_init(1, gsm48_str_to_mnc("01"), NULL); if (!bsc_gsmnet) exit(1); diff --git a/openbsc/src/libbsc/bsc_ctrl_commands.c b/openbsc/src/libbsc/bsc_ctrl_commands.c index 4c587dca8..84bbf8389 100644 --- a/openbsc/src/libbsc/bsc_ctrl_commands.c +++ b/openbsc/src/libbsc/bsc_ctrl_commands.c @@ -60,7 +60,7 @@ static int verify_vty_description_string(struct ctrl_cmd *cmd, return 0; } -CTRL_CMD_DEFINE_RANGE(net_mnc, "mnc", struct gsm_network, network_code, 0, 999); +CTRL_CMD_DEFINE_RANGE(net_mnc, "mnc", struct gsm_network, network_code.network_code, 0, 999); CTRL_CMD_DEFINE_RANGE(net_mcc, "mcc", struct gsm_network, country_code, 1, 999); CTRL_CMD_VTY_STRING(net_short_name, "short-name", struct gsm_network, name_short); CTRL_CMD_VTY_STRING(net_long_name, "long-name", struct gsm_network, name_long); @@ -121,7 +121,8 @@ static int set_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) { struct gsm_network *net = cmd->node; char *tmp, *saveptr, *mcc_str, *mnc_str; - int mcc, mnc; + gsm_mnc_t mnc; + int mcc; tmp = talloc_strdup(cmd, cmd->value); if (!tmp) @@ -132,11 +133,11 @@ static int set_net_mcc_mnc_apply(struct ctrl_cmd *cmd, void *data) mnc_str = strtok_r(NULL, ",", &saveptr); mcc = atoi(mcc_str); - mnc = atoi(mnc_str); + mnc = gsm48_str_to_mnc(mnc_str); talloc_free(tmp); - if (net->network_code == mnc && net->country_code == mcc) { + if (gsm48_mnc_are_equal(net->network_code, mnc) && net->country_code == mcc) { cmd->reply = "Nothing changed"; return CTRL_CMD_REPLY; } diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c index 8fd72cf46..22a729d2b 100644 --- a/openbsc/src/libbsc/bsc_init.c +++ b/openbsc/src/libbsc/bsc_init.c @@ -259,9 +259,11 @@ static void bootstrap_rsl(struct gsm_bts_trx *trx) unsigned int i; LOGP(DRSL, LOGL_NOTICE, "bootstrapping RSL for BTS/TRX (%u/%u) " - "on ARFCN %u using MCC=%u MNC=%u LAC=%u CID=%u BSIC=%u TSC=%u\n", + "on ARFCN %u using MCC=%u MNC=%0*u LAC=%u CID=%u BSIC=%u TSC=%u\n", trx->bts->nr, trx->nr, trx->arfcn, bsc_gsmnet->country_code, - bsc_gsmnet->network_code, trx->bts->location_area_code, + bsc_gsmnet->network_code.two_digits ? 2 : 3, + bsc_gsmnet->network_code.network_code, + trx->bts->location_area_code, trx->bts->cell_identity, trx->bts->bsic, trx->bts->tsc); if (trx->bts->type == GSM_BTS_TYPE_NOKIA_SITE) { @@ -463,7 +465,7 @@ int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), int rc; /* initialize our data structures */ - bsc_gsmnet = gsm_network_init(1, 1, mncc_recv); + bsc_gsmnet = gsm_network_init(1, gsm48_str_to_mnc("01"), mncc_recv); if (!bsc_gsmnet) return -ENOMEM; diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index 9129059e5..f9c2920fb 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -182,8 +182,9 @@ static void net_dump_vty(struct vty *vty, struct gsm_network *net) { struct pchan_load pl; - vty_out(vty, "BSC is on Country Code %u, Network Code %u " - "and has %u BTS%s", net->country_code, net->network_code, + vty_out(vty, "BSC is on Country Code %u, Network Code %0*u " + "and has %u BTS%s", net->country_code, + net->network_code.two_digits ? 2 : 3, net->network_code.network_code, net->num_bts, VTY_NEWLINE); vty_out(vty, " Long network name: '%s'%s", net->name_long, VTY_NEWLINE); @@ -670,7 +671,9 @@ static int config_write_net(struct vty *vty) vty_out(vty, "network%s", VTY_NEWLINE); vty_out(vty, " network country code %u%s", gsmnet->country_code, VTY_NEWLINE); - vty_out(vty, " mobile network code %u%s", gsmnet->network_code, VTY_NEWLINE); + vty_out(vty, " mobile network code %0*u%s", + gsmnet->network_code.two_digits ? 2 : 3, + gsmnet->network_code.network_code, VTY_NEWLINE); vty_out(vty, " short name %s%s", gsmnet->name_short, VTY_NEWLINE); vty_out(vty, " long name %s%s", gsmnet->name_long, VTY_NEWLINE); vty_out(vty, " auth policy %s%s", gsm_auth_policy_name(gsmnet->auth_policy), VTY_NEWLINE); @@ -1234,7 +1237,7 @@ DEFUN(cfg_net_mnc, { struct gsm_network *gsmnet = gsmnet_from_vty(vty); - gsmnet->network_code = atoi(argv[0]); + gsmnet->network_code = gsm48_str_to_mnc(argv[0]); return CMD_SUCCESS; } diff --git a/openbsc/src/libcommon/gsm_data.c b/openbsc/src/libcommon/gsm_data.c index 5f7e32e73..9672f26d0 100644 --- a/openbsc/src/libcommon/gsm_data.c +++ b/openbsc/src/libcommon/gsm_data.c @@ -70,7 +70,7 @@ int gsm_bts_model_register(struct gsm_bts_model *model) return 0; } -struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_code, +struct gsm_network *gsm_network_init(uint16_t country_code, gsm_mnc_t network_code, int (*mncc_recv)(struct gsm_network *, struct msgb *)) { struct gsm_network *net; diff --git a/openbsc/src/osmo-bsc/osmo_bsc_api.c b/openbsc/src/osmo-bsc/osmo_bsc_api.c index 1751df7be..920e0cc68 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_api.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_api.c @@ -25,6 +25,7 @@ #include #include +#include #include @@ -51,10 +52,10 @@ static int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t ca static int complete_layer3(struct gsm_subscriber_connection *conn, struct msgb *msg, struct osmo_msc_data *msc); -static uint16_t get_network_code_for_msc(struct osmo_msc_data *msc) +static gsm_mnc_t get_network_code_for_msc(struct osmo_msc_data *msc) { - if (msc->core_ncc != -1) - return msc->core_ncc; + if (msc->core_mnc.network_code != -1) + return msc->core_mnc; return msc->network->network_code; } @@ -158,7 +159,7 @@ static int complete_layer3(struct gsm_subscriber_connection *conn, struct msgb *msg, struct osmo_msc_data *msc) { struct msgb *resp; - uint16_t network_code; + gsm_mnc_t network_code; uint16_t country_code; enum bsc_con ret; diff --git a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c index 883205781..62c81ec75 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_ctrl.c @@ -187,10 +187,11 @@ static void generate_location_state_trap(struct gsm_bts *bts, struct bsc_msc_con policy = osmo_bsc_rf_get_policy_name(osmo_bsc_rf_get_policy_by_bts(bts)); cmd->reply = talloc_asprintf_append(cmd->reply, - ",%s,%s,%s,%d,%d", + ",%s,%s,%s,%d,%0*d", oper, admin, policy, bts->network->country_code, - bts->network->network_code); + bts->network->network_code.two_digits ? 2 : 3, + bts->network->network_code.network_code); osmo_bsc_send_trap(cmd, msc_con); talloc_free(cmd); diff --git a/openbsc/src/osmo-bsc/osmo_bsc_filter.c b/openbsc/src/osmo-bsc/osmo_bsc_filter.c index 608f52552..e13521ef0 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_filter.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_filter.c @@ -335,7 +335,7 @@ int bsc_scan_msc_msg(struct gsm_subscriber_connection *conn, struct msgb *msg) msc = conn->sccp_con->msc; if (mtype == GSM48_MT_MM_LOC_UPD_ACCEPT) { - if (msc->core_ncc != -1 || msc->core_mcc != -1) { + if (msc->core_mnc.network_code != -1 || msc->core_mcc != -1) { if (msgb_l3len(msg) >= sizeof(*gh) + sizeof(*lai)) { lai = (struct gsm48_loc_area_id *) &gh->data[0]; gsm48_generate_lai(lai, net->country_code, diff --git a/openbsc/src/osmo-bsc/osmo_bsc_msc.c b/openbsc/src/osmo-bsc/osmo_bsc_msc.c index 0acc29027..88aa1ca0e 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_msc.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_msc.c @@ -494,7 +494,7 @@ struct osmo_msc_data *osmo_msc_data_alloc(struct gsm_network *net, int nr) INIT_LLIST_HEAD(&msc_data->dests); msc_data->ping_timeout = 20; msc_data->pong_timeout = 5; - msc_data->core_ncc = -1; + msc_data->core_mnc.network_code = -1; msc_data->core_mcc = -1; msc_data->rtp_base = 4000; diff --git a/openbsc/src/osmo-bsc/osmo_bsc_vty.c b/openbsc/src/osmo-bsc/osmo_bsc_vty.c index eb12287d4..b380e2573 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_vty.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_vty.c @@ -103,9 +103,9 @@ static void write_msc(struct vty *vty, struct osmo_msc_data *msc) vty_out(vty, "msc %d%s", msc->nr, VTY_NEWLINE); if (msc->bsc_token) vty_out(vty, " token %s%s", msc->bsc_token, VTY_NEWLINE); - if (msc->core_ncc != -1) - vty_out(vty, " core-mobile-network-code %d%s", - msc->core_ncc, VTY_NEWLINE); + if (msc->core_mnc.network_code != -1) + vty_out(vty, " core-mobile-network-code %0*d%s", + msc->core_mnc.two_digits ? 2 : 3, msc->core_mnc.network_code, VTY_NEWLINE); if (msc->core_mcc != -1) vty_out(vty, " core-mobile-country-code %d%s", msc->core_mcc, VTY_NEWLINE); @@ -210,10 +210,10 @@ DEFUN(cfg_net_bsc_token, DEFUN(cfg_net_bsc_ncc, cfg_net_bsc_ncc_cmd, "core-mobile-network-code <1-999>", - "Use this network code for the core network\n" "NCC value\n") + "Use this network code for the core network\n" "MNC value\n") { struct osmo_msc_data *data = osmo_msc_data(vty); - data->core_ncc = atoi(argv[0]); + data->core_mnc = gsm48_str_to_mnc(argv[0]); return CMD_SUCCESS; } diff --git a/openbsc/src/utils/bs11_config.c b/openbsc/src/utils/bs11_config.c index e8acb461a..540b701ff 100644 --- a/openbsc/src/utils/bs11_config.c +++ b/openbsc/src/utils/bs11_config.c @@ -893,7 +893,7 @@ int main(int argc, char **argv) handle_options(argc, argv); bts_model_bs11_init(); - gsmnet = gsm_network_init(1, 1, NULL); + gsmnet = gsm_network_init(1, gsm48_str_to_mnc("01"), NULL); if (!gsmnet) { fprintf(stderr, "Unable to allocate gsm network\n"); exit(1); diff --git a/openbsc/tests/channel/channel_test.c b/openbsc/tests/channel/channel_test.c index 9fb1e9e9a..b844cd2fd 100644 --- a/openbsc/tests/channel/channel_test.c +++ b/openbsc/tests/channel/channel_test.c @@ -65,7 +65,7 @@ int main(int argc, char **argv) printf("Testing the gsm_subscriber chan logic\n"); /* Create a dummy network */ - network = gsm_network_init(1, 1, NULL); + network = gsm_network_init(1, gsm48_str_to_mnc("01"), NULL); if (!network) exit(1); bts = gsm_bts_alloc(network); diff --git a/openbsc/tests/gbproxy/gbproxy_test.c b/openbsc/tests/gbproxy/gbproxy_test.c index d5675d825..d79fb206b 100644 --- a/openbsc/tests/gbproxy/gbproxy_test.c +++ b/openbsc/tests/gbproxy/gbproxy_test.c @@ -849,7 +849,8 @@ static void test_gbproxy_ra_patching() gbcfg.nsi = bssgp_nsi; gbcfg.nsip_sgsn_nsei = SGSN_NSEI; gbcfg.core_mcc = 123; - gbcfg.core_mnc = 456; + gbcfg.core_mnc.two_digits = false; + gbcfg.core_mnc.network_code = 456; gbcfg.core_apn = talloc_zero_size(NULL, 100); gbcfg.core_apn_size = gbprox_str_to_apn(gbcfg.core_apn, "foo.bar", 100); diff --git a/openbsc/tests/gsm0408/gsm0408_test.c b/openbsc/tests/gsm0408/gsm0408_test.c index 692ec90b0..c266c1b55 100644 --- a/openbsc/tests/gsm0408/gsm0408_test.c +++ b/openbsc/tests/gsm0408/gsm0408_test.c @@ -66,13 +66,19 @@ static void test_location_area_identifier(void) * Test the default/test setup. Coming from * bsc_hack.c dumps */ - gsm48_generate_lai(&lai48, 1, 1, 1); + gsm48_generate_lai(&lai48, 1, gsm48_str_to_mnc("01"), 1); COMPARE(lai48.digits[0], ==, 0x00); COMPARE(lai48.digits[1], ==, 0xF1); COMPARE(lai48.digits[2], ==, 0x10); COMPARE(lai48.lac, ==, htons(0x0001)); - gsm48_generate_lai(&lai48, 602, 1, 15); + gsm48_generate_lai(&lai48, 1, gsm48_str_to_mnc("001"), 1); + COMPARE(lai48.digits[0], ==, 0x00); + COMPARE(lai48.digits[1], ==, 0x01); + COMPARE(lai48.digits[2], ==, 0x10); + COMPARE(lai48.lac, ==, htons(0x0001)); + + gsm48_generate_lai(&lai48, 602, gsm48_str_to_mnc("01"), 15); COMPARE(lai48.digits[0], ==, 0x06); COMPARE(lai48.digits[1], ==, 0xF2); COMPARE(lai48.digits[2], ==, 0x10); -- cgit v1.2.3