* [PATCH 1/4] plugin: Plugin that finds correspondence between MCC and MNC length
@ 2013-10-24 11:01 Alfonso Sanchez-Beato
2013-10-24 16:35 ` Denis Kenzior
0 siblings, 1 reply; 2+ messages in thread
From: Alfonso Sanchez-Beato @ 2013-10-24 11:01 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 8437 bytes --]
The implementation searchs in two tables, one of them with some special cases
for some operators and the other with the MNC length for a given MCC, as
recommended by the ITU (http://www.itu.int/pub/T-SP-E.212B).
---
plugins/mnclength.c | 392 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 392 insertions(+)
create mode 100644 plugins/mnclength.c
diff --git a/plugins/mnclength.c b/plugins/mnclength.c
new file mode 100644
index 0000000..ee40857
--- /dev/null
+++ b/plugins/mnclength.c
@@ -0,0 +1,392 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
+ * Copyright (C) 2013 Canonical Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <glib.h>
+
+#define OFONO_API_SUBJECT_TO_CHANGE
+#include <ofono/types.h>
+#include <ofono/log.h>
+#include <ofono/plugin.h>
+#include <ofono/sim-mnclength.h>
+
+
+struct mcc_mnclength {
+ int mcc;
+ int mnclength;
+};
+
+/*
+ * Database of MCC to MNC length correspondences based on "Mobile Network Codes
+ * (MNC) for the international identification plan for public networks and
+ * subscriptions (According to Recommendation ITU-T E.212 (05/2008))"
+ * Latest version of that document can be found in
+ * http://www.itu.int/pub/T-SP-E.212B.
+ */
+static struct mcc_mnclength mnclen_db[] = {
+ {202, 2},
+ {204, 2},
+ {206, 2},
+ {208, 2},
+ {212, 2},
+ {213, 2},
+ {214, 2},
+ {216, 2},
+ {218, 2},
+ {219, 2},
+ {220, 2},
+ {222, 2},
+ {225, 2},
+ {226, 2},
+ {228, 2},
+ {230, 2},
+ {231, 2},
+ {232, 2},
+ {234, 2},
+ {235, 2},
+ {238, 2},
+ {240, 2},
+ {242, 2},
+ {244, 2},
+ {246, 2},
+ {247, 2},
+ {248, 2},
+ {250, 2},
+ {255, 2},
+ {257, 2},
+ {259, 2},
+ {260, 2},
+ {262, 2},
+ {266, 2},
+ {268, 2},
+ {270, 2},
+ {272, 2},
+ {274, 2},
+ {276, 2},
+ {278, 2},
+ {280, 2},
+ {282, 2},
+ {283, 2},
+ {284, 2},
+ {286, 2},
+ {288, 2},
+ {289, 2},
+ {290, 2},
+ {292, 2},
+ {293, 2},
+ {294, 2},
+ {295, 2},
+ {297, 2},
+ {302, 3},
+ {308, 2},
+ {310, 3},
+ {311, 3},
+ {312, 3},
+ {313, 3},
+ {314, 3},
+ {315, 3},
+ {316, 3},
+ {330, 2},
+ {332, 2},
+ {334, 3},
+ {338, 3},
+ {340, 2},
+ {342, 3},
+ {344, 3},
+ {346, 3},
+ {348, 3},
+ {350, 2},
+ {352, 2},
+ {354, 2},
+ {356, 2},
+ {358, 2},
+ {360, 2},
+ {362, 2},
+ {363, 2},
+ {364, 2},
+ {365, 3},
+ {366, 2},
+ {368, 2},
+ {370, 2},
+ {372, 2},
+ {374, 2},
+ {376, 2},
+ {400, 2},
+ {401, 2},
+ {402, 2},
+ {404, 2},
+ {405, 2},
+ {410, 2},
+ {412, 2},
+ {413, 2},
+ {414, 2},
+ {415, 2},
+ {416, 2},
+ {417, 2},
+ {418, 2},
+ {419, 2},
+ {420, 2},
+ {421, 2},
+ {422, 2},
+ {423, 2},
+ {424, 2},
+ {425, 2},
+ {426, 2},
+ {427, 2},
+ {428, 2},
+ {429, 2},
+ {430, 2},
+ {431, 2},
+ {432, 2},
+ {434, 2},
+ {436, 2},
+ {437, 2},
+ {438, 2},
+ {440, 2},
+ {441, 2},
+ {450, 2},
+ {452, 2},
+ {454, 2},
+ {455, 2},
+ {456, 2},
+ {457, 2},
+ {460, 2},
+ {461, 2},
+ {466, 2},
+ {467, 2},
+ {470, 2},
+ {472, 2},
+ {502, 2},
+ {505, 2},
+ {510, 2},
+ {514, 2},
+ {515, 2},
+ {520, 2},
+ {525, 2},
+ {528, 2},
+ {530, 2},
+ {534, 2},
+ {535, 2},
+ {536, 2},
+ {537, 2},
+ {539, 2},
+ {540, 2},
+ {541, 2},
+ {542, 2},
+ {543, 2},
+ {544, 2},
+ {545, 2},
+ {546, 2},
+ {547, 2},
+ {548, 2},
+ {549, 2},
+ {550, 2},
+ {551, 2},
+ {552, 2},
+ {602, 2},
+ {603, 2},
+ {604, 2},
+ {605, 2},
+ {606, 2},
+ {607, 2},
+ {608, 2},
+ {609, 2},
+ {610, 2},
+ {611, 2},
+ {612, 2},
+ {613, 2},
+ {614, 2},
+ {615, 2},
+ {616, 2},
+ {617, 2},
+ {618, 2},
+ {619, 2},
+ {620, 2},
+ {621, 2},
+ {622, 2},
+ {623, 2},
+ {624, 2},
+ {625, 2},
+ {626, 2},
+ {627, 2},
+ {628, 2},
+ {629, 2},
+ {630, 2},
+ {631, 2},
+ {632, 2},
+ {633, 2},
+ {634, 2},
+ {635, 2},
+ {636, 2},
+ {637, 2},
+ {638, 2},
+ {639, 2},
+ {640, 2},
+ {641, 2},
+ {642, 2},
+ {643, 2},
+ {645, 2},
+ {646, 2},
+ {647, 2},
+ {648, 2},
+ {649, 2},
+ {650, 2},
+ {651, 2},
+ {652, 2},
+ {653, 2},
+ {654, 2},
+ {655, 2},
+ {657, 2},
+ {702, 2},
+ {704, 2},
+ {706, 2},
+ {708, 3},
+ {710, 2},
+ {712, 2},
+ {714, 2},
+ {716, 2},
+ {722, 3},
+ {724, 2},
+ {730, 2},
+ {732, 3},
+ {734, 2},
+ {736, 2},
+ {738, 2},
+ {740, 2},
+ {742, 2},
+ {744, 2},
+ {746, 2},
+ {748, 2},
+ {750, 2},
+};
+
+/*
+ * These MCC+MNC combinations have 3 digit MNC even though the default for
+ * the corresponing MCC in mnclen_db is length 2.
+ */
+static int codes_mnclen3_db[] = {
+ 405025, 405026, 405027, 405028, 405029, 405030, 405031, 405032,
+ 405033, 405034, 405035, 405036, 405037, 405038, 405039, 405040,
+ 405041, 405042, 405043, 405044, 405045, 405046, 405047, 405750,
+ 405751, 405752, 405753, 405754, 405755, 405756, 405799, 405800,
+ 405801, 405802, 405803, 405804, 405805, 405806, 405807, 405808,
+ 405809, 405810, 405811, 405812, 405813, 405814, 405815, 405816,
+ 405817, 405818, 405819, 405820, 405821, 405822, 405823, 405824,
+ 405825, 405826, 405827, 405828, 405829, 405830, 405831, 405832,
+ 405833, 405834, 405835, 405836, 405837, 405838, 405839, 405840,
+ 405841, 405842, 405843, 405844, 405845, 405846, 405847, 405848,
+ 405849, 405850, 405851, 405852, 405853, 405875, 405876, 405877,
+ 405878, 405879, 405880, 405881, 405882, 405883, 405884, 405885,
+ 405886, 405908, 405909, 405910, 405911, 405912, 405913, 405914,
+ 405915, 405916, 405917, 405918, 405919, 405920, 405921, 405922,
+ 405923, 405924, 405925, 405926, 405927, 405928, 405929, 405930,
+ 405931, 405932
+};
+
+static int comp_int(const void *key, const void *value)
+{
+ int mccmnckey = *(int *) key;
+ int mccmnccurr = *(int *) value;
+
+ return mccmnckey - mccmnccurr;
+}
+
+static int comp_mcc(const void *key, const void *value)
+{
+ int mcc = *(int *) key;
+ struct mcc_mnclength *mccmnc = (struct mcc_mnclength *) value;
+
+ return mcc - mccmnc->mcc;
+}
+
+static int mnclength_get_mnclength(const char *imsi)
+{
+ char mccmnc[OFONO_MAX_MCC_LENGTH + OFONO_MAX_MNC_LENGTH + 1];
+ size_t nelem_mnclen3 = sizeof(codes_mnclen3_db)
+ / sizeof(codes_mnclen3_db[0]);
+ size_t nelem_mccmnc = sizeof(mnclen_db)
+ / sizeof(mnclen_db[0]);
+ int mccmnc_num;
+ int *mccmnc3_res;
+ int mcc_num;
+ struct mcc_mnclength *mccmnc_res;
+
+ if (strlen(imsi) < 6)
+ return 0;
+
+ /* Special case for some operators */
+ strncpy(mccmnc, imsi, sizeof(mccmnc) - 1);
+ mccmnc[sizeof(mccmnc) - 1] = '\0';
+ errno = 0;
+ mccmnc_num = (int) strtol(mccmnc, NULL, 10);
+
+ if (errno == 0) {
+ mccmnc3_res =
+ bsearch(&mccmnc_num, codes_mnclen3_db, nelem_mnclen3,
+ sizeof(codes_mnclen3_db[0]), comp_int);
+
+ if (mccmnc3_res)
+ return 3;
+ }
+
+ /* General case */
+ mccmnc[OFONO_MAX_MCC_LENGTH] = '\0';
+ errno = 0;
+ mcc_num = (int) strtol(mccmnc, NULL, 10);
+
+ if (errno == 0) {
+ mccmnc_res =
+ bsearch(&mcc_num, mnclen_db, nelem_mccmnc,
+ sizeof(mnclen_db[0]), comp_mcc);
+
+ if (mccmnc_res)
+ return mccmnc_res->mnclength;
+ }
+
+ return 0;
+}
+
+static struct ofono_sim_mnclength_driver mnclength_driver = {
+ .name = "MNC length",
+ .get_mnclength = mnclength_get_mnclength
+};
+
+static int mnclength_init(void)
+{
+ return ofono_sim_mnclength_driver_register(&mnclength_driver);
+}
+
+static void mnclength_exit(void)
+{
+ ofono_sim_mnclength_driver_unregister(&mnclength_driver);
+}
+
+OFONO_PLUGIN_DEFINE(mnclength, "MNC length Plugin", VERSION,
+ OFONO_PLUGIN_PRIORITY_DEFAULT,
+ mnclength_init, mnclength_exit)
--
1.8.3.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 1/4] plugin: Plugin that finds correspondence between MCC and MNC length
2013-10-24 11:01 [PATCH 1/4] plugin: Plugin that finds correspondence between MCC and MNC length Alfonso Sanchez-Beato
@ 2013-10-24 16:35 ` Denis Kenzior
0 siblings, 0 replies; 2+ messages in thread
From: Denis Kenzior @ 2013-10-24 16:35 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5088 bytes --]
Hi Alfonso,
On 10/24/2013 06:01 AM, Alfonso Sanchez-Beato wrote:
> The implementation searchs in two tables, one of them with some special cases
typo here
> for some operators and the other with the MNC length for a given MCC, as
> recommended by the ITU (http://www.itu.int/pub/T-SP-E.212B).
> ---
> plugins/mnclength.c | 392 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 392 insertions(+)
> create mode 100644 plugins/mnclength.c
>
> diff --git a/plugins/mnclength.c b/plugins/mnclength.c
> new file mode 100644
> index 0000000..ee40857
> --- /dev/null
> +++ b/plugins/mnclength.c
> @@ -0,0 +1,392 @@
> +/*
> + *
> + * oFono - Open Source Telephony
> + *
> + * Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
> + * Copyright (C) 2013 Canonical Ltd.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + *
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <errno.h>
> +#include <string.h>
> +#include <stdlib.h>
> +
> +#include <glib.h>
> +
> +#define OFONO_API_SUBJECT_TO_CHANGE
> +#include <ofono/types.h>
> +#include <ofono/log.h>
> +#include <ofono/plugin.h>
> +#include <ofono/sim-mnclength.h>
> +
> +
No double-empty lines please
> +struct mcc_mnclength {
> + int mcc;
> + int mnclength;
> +};
> +
<snip>
> +static int comp_int(const void *key, const void *value)
> +{
> + int mccmnckey = *(int *) key;
> + int mccmnccurr = *(int *) value;
> +
> + return mccmnckey - mccmnccurr;
> +}
> +
> +static int comp_mcc(const void *key, const void *value)
> +{
> + int mcc = *(int *) key;
> + struct mcc_mnclength *mccmnc = (struct mcc_mnclength *) value;
> +
> + return mcc - mccmnc->mcc;
> +}
> +
> +static int mnclength_get_mnclength(const char *imsi)
> +{
> + char mccmnc[OFONO_MAX_MCC_LENGTH + OFONO_MAX_MNC_LENGTH + 1];
> + size_t nelem_mnclen3 = sizeof(codes_mnclen3_db)
> + / sizeof(codes_mnclen3_db[0]);
> + size_t nelem_mccmnc = sizeof(mnclen_db)
> + / sizeof(mnclen_db[0]);
Please define/use ARRAY_SIZE macro for this to make it clearer whats
going on. If there's a glib equivalent, then use that.
> + int mccmnc_num;
> + int *mccmnc3_res;
> + int mcc_num;
> + struct mcc_mnclength *mccmnc_res;
> +
> + if (strlen(imsi) < 6)
You might as well use a constant here instead of magic number 6.
> + return 0;
In general we prefer to return negative errno values on errors. So in
this case -EINVAL -> Invalid Input
> +
> + /* Special case for some operators */
> + strncpy(mccmnc, imsi, sizeof(mccmnc) - 1);
Why bother with strncpy when you just checked the size? Just do one or
the other.
> + mccmnc[sizeof(mccmnc) - 1] = '\0';
> + errno = 0;
> + mccmnc_num = (int) strtol(mccmnc, NULL, 10);
> +
First of all, you probably want strtoul here. Second of all, please see
strtoul manpage on how to properly use it. Hint, the second parameter
should not be NULL. Since you already checked for size 6, messing with
errno is completely unnecessary.
If strtoul conversion fails, you probably want to bail out at this point
anyway.
> + if (errno == 0) {
> + mccmnc3_res =
> + bsearch(&mccmnc_num, codes_mnclen3_db, nelem_mnclen3,
> + sizeof(codes_mnclen3_db[0]), comp_int);
Why don't you use GINT_TO_POINTER here?
> +
> + if (mccmnc3_res)
> + return 3;
> + }
> +
> + /* General case */
> + mccmnc[OFONO_MAX_MCC_LENGTH] = '\0';
> + errno = 0;
> + mcc_num = (int) strtol(mccmnc, NULL, 10);
> +
Again, see comments above
> + if (errno == 0) {
> + mccmnc_res =
> + bsearch(&mcc_num, mnclen_db, nelem_mccmnc,
> + sizeof(mnclen_db[0]), comp_mcc);
> +
And here
> + if (mccmnc_res)
> + return mccmnc_res->mnclength;
> + }
> +
> + return 0;
And here probably -ENOENT;
> +}
> +
> +static struct ofono_sim_mnclength_driver mnclength_driver = {
> + .name = "MNC length",
> + .get_mnclength = mnclength_get_mnclength
> +};
> +
> +static int mnclength_init(void)
> +{
> + return ofono_sim_mnclength_driver_register(&mnclength_driver);
> +}
> +
> +static void mnclength_exit(void)
> +{
> + ofono_sim_mnclength_driver_unregister(&mnclength_driver);
> +}
> +
> +OFONO_PLUGIN_DEFINE(mnclength, "MNC length Plugin", VERSION,
> + OFONO_PLUGIN_PRIORITY_DEFAULT,
> + mnclength_init, mnclength_exit)
>
Regards,
-Denis
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-10-24 16:35 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-24 11:01 [PATCH 1/4] plugin: Plugin that finds correspondence between MCC and MNC length Alfonso Sanchez-Beato
2013-10-24 16:35 ` Denis Kenzior
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.