aboutsummaryrefslogtreecommitdiffstats
path: root/libosmocore/src/gsm48.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-04-30 14:29:56 +0200
committerHarald Welte <laforge@gnumonks.org>2010-04-30 14:29:56 +0200
commite562502e8d35356f3183a39ff6aad200d11a77bb (patch)
tree31d24174740b1b104a7c13b0086cbee4fecb90c5 /libosmocore/src/gsm48.c
parente9dd9b047590064eec1c618475ece7f9627e0312 (diff)
parent074c9f904cb5e4f6ab014d76e4abc079c16fc5d7 (diff)
Merge commit '074c9f904cb5e4f6ab014d76e4abc079c16fc5d7'
Diffstat (limited to 'libosmocore/src/gsm48.c')
-rw-r--r--libosmocore/src/gsm48.c48
1 files changed, 46 insertions, 2 deletions
diff --git a/libosmocore/src/gsm48.c b/libosmocore/src/gsm48.c
index 5761c67b4..783ff6a5d 100644
--- a/libosmocore/src/gsm48.c
+++ b/libosmocore/src/gsm48.c
@@ -97,10 +97,10 @@ static const struct value_string rr_cause_names[] = {
};
/* FIXME: convert to value_string */
-static const char *cc_state_names[32] = {
+static const char *cc_state_names[33] = {
"NULL",
"INITIATED",
- "illegal state 2",
+ "MM_CONNECTION_PEND",
"MO_CALL_PROC",
"CALL_DELIVERED",
"illegal state 5",
@@ -261,3 +261,47 @@ int gsm48_generate_mid_from_imsi(uint8_t *buf, const char *imsi)
return 2 + buf[1];
}
+
+/* Convert Mobile Identity (10.5.1.4) to string */
+int gsm48_mi_to_string(char *string, const int str_len, const uint8_t *mi,
+ const int mi_len)
+{
+ int i;
+ uint8_t mi_type;
+ char *str_cur = string;
+ uint32_t tmsi;
+
+ mi_type = mi[0] & GSM_MI_TYPE_MASK;
+
+ switch (mi_type) {
+ case GSM_MI_TYPE_NONE:
+ break;
+ case GSM_MI_TYPE_TMSI:
+ /* Table 10.5.4.3, reverse generate_mid_from_tmsi */
+ if (mi_len == GSM48_TMSI_LEN && mi[0] == (0xf0 | GSM_MI_TYPE_TMSI)) {
+ memcpy(&tmsi, &mi[1], 4);
+ tmsi = ntohl(tmsi);
+ return snprintf(string, str_len, "%u", tmsi);
+ }
+ break;
+ case GSM_MI_TYPE_IMSI:
+ case GSM_MI_TYPE_IMEI:
+ case GSM_MI_TYPE_IMEISV:
+ *str_cur++ = bcd2char(mi[0] >> 4);
+
+ for (i = 1; i < mi_len; i++) {
+ if (str_cur + 2 >= string + str_len)
+ return str_cur - string;
+ *str_cur++ = bcd2char(mi[i] & 0xf);
+ /* skip last nibble in last input byte when GSM_EVEN */
+ if( (i != mi_len-1) || (mi[0] & GSM_MI_ODD))
+ *str_cur++ = bcd2char(mi[i] >> 4);
+ }
+ break;
+ default:
+ break;
+ }
+ *str_cur++ = '\0';
+
+ return str_cur - string;
+}