Review at  https://gerrit.osmocom.org/6671

implement support for 3-digit MNC with leading zeros

Add 3-digit flags and use the new RAI and LAI API from libosmocore throughout
the code base to be able to handle an MNC < 100 that has three digits (leading
zeros).

Depends: Id2240f7f518494c9df6c8bda52c0d5092f90f221 (libosmocore),
         Ib7176b1d65a03b76f41f94bc9d3293a8a07d24c6 (libosmocore)
Change-Id: I82f0016d9512ee8722a3489a3cb4b6c704a271fc
---
M include/osmocom/msc/gsm_data.h
M src/libcommon-cs/common_cs_vty.c
M src/libmsc/a_iface_bssap.c
M src/libmsc/gsm_04_08.c
M src/libmsc/msc_vty.c
M src/libvlr/vlr_lu_fsm.c
M src/osmo-msc/msc_main.c
7 files changed, 27 insertions(+), 14 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/71/6671/1

diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h
index 67b657a..18f92af 100644
--- a/include/osmocom/msc/gsm_data.h
+++ b/include/osmocom/msc/gsm_data.h
@@ -226,6 +226,7 @@
        /* global parameters */
        uint16_t country_code;
        uint16_t network_code;
+       bool network_code_3_digits;
        char *name_long;
        char *name_short;
        /* bit-mask of permitted encryption algorithms. LSB=A5/0, MSB=A5/7 */
diff --git a/src/libcommon-cs/common_cs_vty.c b/src/libcommon-cs/common_cs_vty.c
index 01c6b35..0d39e9c 100644
--- a/src/libcommon-cs/common_cs_vty.c
+++ b/src/libcommon-cs/common_cs_vty.c
@@ -75,8 +75,16 @@
       "Mobile Network Code to use\n")
 {
        struct gsm_network *gsmnet = gsmnet_from_vty(vty);
+       uint16_t mnc;
+       bool mnc_3_digits;
 
-       gsmnet->network_code = atoi(argv[0]);
+       if (gsm48_mnc_from_str(argv[0], &mnc, &mnc_3_digits)) {
+               vty_out(vty, "%% Error decoding MNC: %s%s", argv[0], 
VTY_NEWLINE);
+               return CMD_WARNING;
+       }
+
+       gsmnet->network_code = mnc;
+       gsmnet->network_code_3_digits = mnc_3_digits;
 
        return CMD_SUCCESS;
 }
diff --git a/src/libmsc/a_iface_bssap.c b/src/libmsc/a_iface_bssap.c
index 224c5c9..37a4255 100644
--- a/src/libmsc/a_iface_bssap.c
+++ b/src/libmsc/a_iface_bssap.c
@@ -265,6 +265,7 @@
        } __attribute__ ((packed)) lai_ci;
        uint16_t mcc;
        uint16_t mnc;
+       bool mnc_3_digits;
        uint16_t lac;
        uint8_t data_length;
        const uint8_t *data;
@@ -301,11 +302,12 @@
                     "Unable to parse element CELL IDENTIFIER (wrong cell 
identification discriminator) -- discarding message!\n");
                return -EINVAL;
        }
-       if (gsm48_decode_lai(&lai_ci.lai, &mcc, &mnc, &lac) != 0) {
+       if (gsm48_decode_lai2(&lai_ci.lai, &mcc, &mnc, &mnc_3_digits, &lac) != 
0) {
                LOGP(DBSSAP, LOGL_ERROR,
                     "Unable to parse element CELL IDENTIFIER (lai decoding 
failed) -- discarding message!\n");
                return -EINVAL;
        }
+       /* FIXME: Actually compare the MCC-MNC to the local network config?? */
 
        /* Parse Layer 3 Information element */
        msg->l3h = (uint8_t*)TLVP_VAL(tp, GSM0808_IE_LAYER_3_INFORMATION);
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index b928171..0a61c09 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -228,9 +228,9 @@
        gh->msg_type = GSM48_MT_MM_LOC_UPD_ACCEPT;
 
        lai = (struct gsm48_loc_area_id *) msgb_put(msg, sizeof(*lai));
-       gsm48_generate_lai(lai, conn->network->country_code,
-                          conn->network->network_code,
-                          conn->lac);
+       gsm48_generate_lai2(lai, conn->network->country_code,
+                           conn->network->network_code, 
conn->network->network_code_3_digits,
+                           conn->lac);
 
        if (send_tmsi == GSM_RESERVED_TMSI) {
                /* we did not allocate a TMSI to the MS, so we need to
@@ -381,10 +381,11 @@
                break;
        }
 
-       gsm48_decode_lai(&lu->lai, &old_lai.plmn.mcc,
-                        &old_lai.plmn.mnc, &old_lai.lac);
+       gsm48_decode_lai2(&lu->lai, &old_lai.plmn.mcc,
+                         &old_lai.plmn.mnc, &old_lai.plmn.mnc_3_digits, 
&old_lai.lac);
        new_lai.plmn.mcc = conn->network->country_code;
        new_lai.plmn.mnc = conn->network->network_code;
+       new_lai.plmn.mnc_3_digits = conn->network->network_code_3_digits;
        new_lai.lac = conn->lac;
        DEBUGP(DMM, "LU/new-LAC: %u/%u\n", old_lai.lac, new_lai.lac);
 
@@ -703,6 +704,7 @@
 
        lai.plmn.mcc = conn->network->country_code;
        lai.plmn.mnc = conn->network->network_code;
+       lai.plmn.mnc_3_digits = conn->network->network_code_3_digits;
        lai.lac = conn->lac;
 
        DEBUGP(DMM, "<- CM SERVICE REQUEST ");
@@ -1154,6 +1156,7 @@
 
        lai.plmn.mcc = conn->network->country_code;
        lai.plmn.mnc = conn->network->network_code;
+       lai.plmn.mnc_3_digits = conn->network->network_code_3_digits;
        lai.lac = conn->lac;
 
        resp = (struct gsm48_pag_resp *) &gh->data[0];
diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c
index 77ced8e..95c1382 100644
--- a/src/libmsc/msc_vty.c
+++ b/src/libmsc/msc_vty.c
@@ -182,8 +182,9 @@
        int i;
 
        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, " network country code %s%s", 
osmo_mcc_name(gsmnet->country_code), VTY_NEWLINE);
+       vty_out(vty, " mobile network code %s%s",
+               osmo_mnc_name(gsmnet->network_code, 
gsmnet->network_code_3_digits), 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, " encryption a5");
diff --git a/src/libvlr/vlr_lu_fsm.c b/src/libvlr/vlr_lu_fsm.c
index 0ac5b9a..d037279 100644
--- a/src/libvlr/vlr_lu_fsm.c
+++ b/src/libvlr/vlr_lu_fsm.c
@@ -914,8 +914,8 @@
 static const char *lai_name(struct osmo_location_area_id *lai)
 {
        static char buf[64];
-       snprintf(buf, sizeof(buf),"MCC:%u, MNC:%u, LAC:%u",
-                lai->plmn.mcc, lai->plmn.mnc, lai->lac);
+       snprintf(buf, sizeof(buf), "%s-%u",
+                osmo_mcc_mnc_name(lai->plmn.mcc, lai->plmn.mnc, 
lai->plmn.mnc_3_digits), lai->lac);
        return buf;
 }
 
diff --git a/src/osmo-msc/msc_main.c b/src/osmo-msc/msc_main.c
index da28083..2571765 100644
--- a/src/osmo-msc/msc_main.c
+++ b/src/osmo-msc/msc_main.c
@@ -281,9 +281,7 @@
 {
        DEBUGP(DIUCS, "got IuCS message %d bytes: %s\n", msg->len, 
msgb_hexdump(msg));
        if (ra_id) {
-               DEBUGP(DIUCS, "got IuCS message on"
-                      " MNC %d MCC %d LAC %d RAC %d\n",
-                      ra_id->mnc, ra_id->mcc, ra_id->lac, ra_id->rac);
+               DEBUGP(DIUCS, "got IuCS message on %s\n", osmo_rai_name(ra_id));
        }
 
        return gsm0408_rcvmsg_iucs(msc_network, msg, ra_id? &ra_id->lac : NULL);

-- 
To view, visit https://gerrit.osmocom.org/6671
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I82f0016d9512ee8722a3489a3cb4b6c704a271fc
Gerrit-PatchSet: 1
Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofm...@sysmocom.de>

Reply via email to