add parsing of IMSI DETACH

diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c
index 9fdc104..ac9a262 100644
--- a/src/gsm_04_08.c
+++ b/src/gsm_04_08.c
@@ -510,6 +510,20 @@
 	schedule_timer(&lchan->loc_operation->updating_timer, 5, 0);
 }
 
+static const char *lupd_name(u_int8_t type)
+{
+	switch (type) {
+	case GSM48_LUPD_NORMAL:
+		return "NORMAL";
+	case GSM48_LUPD_PERIODIC:
+		return "PEROIDOC";
+	case GSM48_LUPD_IMSI_ATT:
+		return "IMSI ATTACH";
+	default:
+		return "UNKNOWN";
+	}
+}
+
 #define MI_SIZE 32
 /* Chapter 9.2.15: Receive Location Updating Request */
 static int mm_rx_loc_upd_req(struct msgb *msg)
@@ -530,7 +544,8 @@
 
 	mi_to_string(mi_string, sizeof(mi_string), lu->mi, lu->mi_len);
 
-	DEBUGP(DMM, "LUPDREQ: mi_type=0x%02x MI(%s)\n", mi_type, mi_string);
+	DEBUGP(DMM, "LUPDREQ: mi_type=0x%02x MI(%s) type=%s ", mi_type, mi_string,
+		lupd_name(lu->type));
 
 	allocate_loc_updating_req(lchan);
 
@@ -562,10 +577,10 @@
 	case GSM_MI_TYPE_IMEI:
 	case GSM_MI_TYPE_IMEISV:
 		/* no sim card... FIXME: what to do ? */
-		fprintf(stderr, "Unimplemented mobile identity type\n");
+		DEBUGP(DMM, "unimplemented mobile identity type\n");
 		break;
 	default:	
-		fprintf(stderr, "Unknown mobile identity type\n");
+		DEBUGP(DMM, "unknown mobile identity type\n");
 		break;
 	}
 
@@ -757,6 +772,7 @@
 	DEBUGP(DMM, "<- CM SERVICE REQUEST serv_type=0x%02x mi_type=0x%02x M(%s)\n",
 		req->cm_service_type, mi_type, mi_string);
 
+	/* FIXME: if we don't know the TMSI, inquire abit IMSI and allocate new TMSI */
 	if (!subscr)
 		return gsm48_tx_mm_serv_rej(msg->lchan,
 					    GSM48_REJECT_IMSI_UNKNOWN_IN_HLR);
@@ -771,6 +787,47 @@
 	return gsm48_tx_mm_serv_ack(msg->lchan);
 }
 
+static int gsm48_rx_mm_imsi_detach_ind(struct msgb *msg)
+{
+	struct gsm48_hdr *gh = msgb_l3(msg);
+	struct gsm48_imsi_detach_ind *idi =
+				(struct gsm48_imsi_detach_ind *) gh->data;
+	u_int8_t mi_type = idi->mi[0] & GSM_MI_TYPE_MASK;
+	char mi_string[MI_SIZE];
+	struct gsm_subscriber *subscr;
+
+	mi_to_string(mi_string, sizeof(mi_string), idi->mi, idi->mi_len);
+	DEBUGP(DMM, "IMSI DETACH INDICATION: mi_type=0x%02x MI(%s): ",
+		mi_type, mi_string);
+
+	switch (mi_type) {
+	case GSM_MI_TYPE_TMSI:
+		subscr = subscr_get_by_tmsi(mi_string);
+		break;
+	case GSM_MI_TYPE_IMSI:
+		subscr = subscr_get_by_imsi(mi_string);
+		break;
+	case GSM_MI_TYPE_IMEI:
+	case GSM_MI_TYPE_IMEISV:
+		/* no sim card... FIXME: what to do ? */
+		fprintf(stderr, "Unimplemented mobile identity type\n");
+		break;
+	default:	
+		fprintf(stderr, "Unknown mobile identity type\n");
+		break;
+	}
+
+	if (subscr)
+		DEBUGP(DMM, "Subscriber: %s\n",
+		       subscr->name ? subscr->name : subscr->imsi);
+	else
+		DEBUGP(DMM, "Unknown Subscriber ?!?\n");
+
+	put_lchan(msg->lchan);
+
+	return 0;
+}
+
 /* Receive a GSM 04.08 Mobility Management (MM) message */
 static int gsm0408_rcv_mm(struct msgb *msg)
 {
@@ -789,7 +846,7 @@
 		rc = gsm48_rx_mm_serv_req(msg);
 		break;
 	case GSM48_MT_MM_STATUS:
-		DEBUGP(DMM, "MM STATUS: FIXME parse error cond.\n");
+		DEBUGP(DMM, "STATUS: FIXME parse error cond.\n");
 		break;
 	case GSM48_MT_MM_TMSI_REALL_COMPL:
 		DEBUGP(DMM, "TMSI Reallocation Completed. Subscriber: %s\n",
@@ -797,11 +854,14 @@
 				msg->lchan->subscr->imsi :
 				"unknown subscriber");
 		break;
-	case GSM48_MT_MM_CM_REEST_REQ:
-	case GSM48_MT_MM_AUTH_RESP:
 	case GSM48_MT_MM_IMSI_DETACH_IND:
-		fprintf(stderr, "Unimplemented GSM 04.08 MM msg type 0x%02x\n",
-			gh->msg_type);
+		rc = gsm48_rx_mm_imsi_detach_ind(msg);
+		break;
+	case GSM48_MT_MM_CM_REEST_REQ:
+		DEBUGP(DMM, "CM REESTABLISH REQUEST: Not implemented\n");
+		break;
+	case GSM48_MT_MM_AUTH_RESP:
+		DEBUGP(DMM, "AUTHENTICATION RESPONSE: Not implemented\n");
 		break;
 	default:
 		fprintf(stderr, "Unknown GSM 04.08 MM msg type 0x%02x\n",