aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael McTernan <mike.mcternan@wavemobile.com>2015-07-03 10:59:40 +0100
committerMichael McTernan <mike.mcternan@wavemobile.com>2015-07-03 10:59:40 +0100
commitfe416dfe0707ab7d0ea2236a823465d67b98f057 (patch)
tree801341fa619e1dd634b8fd21d966d5bc1ee6747d
parentd265532d0dc21e113b7c963b605c099683472096 (diff)
Support mnc_t.
Signed-off-by: Michael McTernan <mike.mcternan@wavemobile.com>
-rw-r--r--openbsc/include/openbsc/gb_proxy.h2
-rw-r--r--openbsc/include/openbsc/gsm_data.h7
-rw-r--r--openbsc/include/openbsc/osmo_msc_data.h3
-rw-r--r--openbsc/src/gprs/gb_proxy.c55
-rw-r--r--openbsc/src/gprs/gb_proxy_vty.c12
-rw-r--r--openbsc/src/gprs/gprs_gmm.c4
-rw-r--r--openbsc/src/gprs/gprs_sgsn.c2
-rw-r--r--openbsc/src/gprs/sgsn_vty.c6
-rw-r--r--openbsc/src/ipaccess/ipaccess-config.c2
-rw-r--r--openbsc/src/libbsc/bsc_ctrl_commands.c9
-rw-r--r--openbsc/src/libbsc/bsc_init.c8
-rw-r--r--openbsc/src/libbsc/bsc_vty.c11
-rw-r--r--openbsc/src/libcommon/gsm_data.c2
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_api.c9
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_ctrl.c5
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_filter.c2
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_msc.c2
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_vty.c10
-rw-r--r--openbsc/src/utils/bs11_config.c2
-rw-r--r--openbsc/tests/channel/channel_test.c2
-rw-r--r--openbsc/tests/gbproxy/gbproxy_test.c3
-rw-r--r--openbsc/tests/gsm0408/gsm0408_test.c10
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 <osmocom/core/timer.h>
#include <osmocom/core/select.h>
+#include <osmocom/gsm/gsm48.h>
#include <openbsc/rest_octets.h>
@@ -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 <osmocom/core/timer.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/gsm48.h>
#include <regex.h>
@@ -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 <osmocom/gprs/gprs_bssgp.h>
#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/gsm48.h>
#include <openbsc/signal.h>
#include <openbsc/debug.h>
@@ -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 <osmocom/core/talloc.h>
+#include <openbsc/gsm_04_08.h>
#include <osmocom/gprs/gprs_ns.h>
#include <openbsc/debug.h>
@@ -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 <osmocom/gsm/protocol/gsm_08_08.h>
#include <osmocom/gsm/gsm0808.h>
+#include <osmocom/gsm/gsm48.h>
#include <osmocom/sccp/sccp.h>
@@ -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);