import gsm48_mi_to_string() from OpenBSC
authorHarald Welte <laforge@gnumonks.org>
Sun, 28 Mar 2010 10:14:50 +0000 (18:14 +0800)
committerHarald Welte <laforge@gnumonks.org>
Sun, 28 Mar 2010 10:14:50 +0000 (18:14 +0800)
include/osmocore/gsm48.h
src/gsm48.c

index 1e96357..b752ee0 100644 (file)
@@ -14,4 +14,8 @@ void gsm48_generate_lai(struct gsm48_loc_area_id *lai48, uint16_t mcc,
 int gsm48_generate_mid_from_tmsi(uint8_t *buf, uint32_t tmsi);
 int gsm48_generate_mid_from_imsi(uint8_t *buf, const char *imsi);
 
+/* Convert Mobile Identity (10.5.1.4) to string */
+int gsm48_mi_to_string(char *string, const int str_len,
+                       const u_int8_t *mi, const int mi_len);
+
 #endif
index 5761c67..d024109 100644 (file)
@@ -261,3 +261,46 @@ 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 u_int8_t *mi, const int mi_len)
+{
+       int i;
+       u_int8_t mi_type;
+       char *str_cur = string;
+       u_int32_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;
+}