Make gcc happy and remove a couple of warnings

Remove the callbacks from gsm_network for now. A set of different
callbacks will be back. E.g. when the paging is completed, when the
Q.931 like call handling is there...

Remove var's or move them into #if 0, remove unused stuff that looks
like we do not need it anytime soon or #if 0 them, move stuff around.
diff --git a/include/openbsc/db.h b/include/openbsc/db.h
index bd30aab..9ce7181 100644
--- a/include/openbsc/db.h
+++ b/include/openbsc/db.h
@@ -32,7 +32,7 @@
 
 /* subscriber management */
 struct gsm_subscriber* db_create_subscriber(char *imsi);
-struct gsm_subscriber* db_get_subscriber(enum gsm_subscriber_field field, char *subscr);
+struct gsm_subscriber* db_get_subscriber(enum gsm_subscriber_field field, const char *subscr);
 int db_sync_subscriber(struct gsm_subscriber* subscriber);
 int db_subscriber_alloc_tmsi(struct gsm_subscriber* subscriber);
 int db_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char *imei);
diff --git a/include/openbsc/debug.h b/include/openbsc/debug.h
index d30f0d0..5671980 100644
--- a/include/openbsc/debug.h
+++ b/include/openbsc/debug.h
@@ -22,6 +22,7 @@
 
 #define static_assert(exp, name) typedef int dummy##name [(exp) ? 1 : -1];
 
+void hexdump(unsigned char *buf, int len);
 void debugp(unsigned int subsys, char *file, int line, const char *format, ...);
 void debug_parse_category_mask(const char* mask);
 void debug_use_color(int use_color);
diff --git a/include/openbsc/gsm_04_08.h b/include/openbsc/gsm_04_08.h
index 3ef4fdb..b5eecf0 100644
--- a/include/openbsc/gsm_04_08.h
+++ b/include/openbsc/gsm_04_08.h
@@ -394,6 +394,7 @@
 int gsm48_tx_mm_info(struct gsm_lchan *lchan);
 struct msgb *gsm48_msgb_alloc(void);
 int gsm48_sendmsg(struct msgb *msg);
+int generate_mid_from_tmsi(u_int8_t *buf, u_int32_t tmsi);
 
 
 #endif
diff --git a/include/openbsc/gsm_data.h b/include/openbsc/gsm_data.h
index 02fdeaf..5ab4c61 100644
--- a/include/openbsc/gsm_data.h
+++ b/include/openbsc/gsm_data.h
@@ -177,14 +177,6 @@
 	unsigned int num_bts;
 	/* private lists */
 	struct gsm_bts	bts[GSM_MAX_BTS+1];
-
-	/* management of the lower layers to allow the bsc to hook into it */
-	void (*update_request)(struct gsm_bts *, u_int32_t tmsi, int accepted);
-	void (*channel_allocated)(struct gsm_lchan *bts, enum gsm_chreq_reason_t);
-	void (*channel_deallocated)(struct gsm_lchan *bts);
-	void (*channel_response)(struct gsm_lchan *, int acked);
-	void (*channel_subscriber_assigned)(struct gsm_lchan *);
-	void (*call_state_changed)(struct gsm_lchan *, enum gsm_call_state new_state);
 };
 
 struct gsm_network *gsm_network_init(unsigned int num_bts, u_int16_t country_code,
diff --git a/include/openbsc/gsm_subscriber.h b/include/openbsc/gsm_subscriber.h
index 27726a8..8dcde3e 100644
--- a/include/openbsc/gsm_subscriber.h
+++ b/include/openbsc/gsm_subscriber.h
@@ -34,6 +34,7 @@
 struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
 struct gsm_subscriber *subscr_get_by_tmsi(const char *tmsi);
 struct gsm_subscriber *subscr_get_by_imsi(const char *imsi);
+int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts);
 
 /* internal */
 struct gsm_subscriber *subscr_alloc(void);
diff --git a/include/openbsc/misdn.h b/include/openbsc/misdn.h
index 09dc5ba..51932c2 100644
--- a/include/openbsc/misdn.h
+++ b/include/openbsc/misdn.h
@@ -23,5 +23,6 @@
 int mi_setup(struct gsm_bts *bts, int cardnr, 
 	     void (cb)(int event, struct gsm_bts *bts));
 void mi_set_pcap_fd(int fd);
+int _abis_nm_sendmsg(struct msgb *msg);
 
 #endif
diff --git a/src/abis_nm.c b/src/abis_nm.c
index b297a11..e6230b4 100644
--- a/src/abis_nm.c
+++ b/src/abis_nm.c
@@ -32,6 +32,7 @@
 #include <openbsc/msgb.h>
 #include <openbsc/tlv.h>
 #include <openbsc/abis_nm.h>
+#include <openbsc/misdn.h>
 
 #define OM_ALLOC_SIZE		1024
 #define OM_HEADROOM_SIZE	128
@@ -92,11 +93,13 @@
 	return 0;
 }
 
+#if 0
 /* is this msgtype the usual ACK/NACK type ? */
 static int is_ack_nack(enum abis_nm_msgtype mt)
 {
 	return !is_in_arr(mt, no_ack_nack, ARRAY_SIZE(no_ack_nack));
 }
+#endif
 
 /* is this msgtype a report ? */
 static int is_report(enum abis_nm_msgtype mt)
@@ -182,8 +185,6 @@
 {
 	int rc;
 	struct abis_om_hdr *oh = msgb_l2(msg);
-	unsigned int l2_len = msg->tail - (u_int8_t *)msgb_l2(msg);
-	unsigned int hlen = sizeof(*oh) + sizeof(struct abis_om_fom_hdr);
 
 	/* Various consistency checks */
 	if (oh->placement != ABIS_OM_PLACEMENT_ONLY) {
@@ -197,6 +198,8 @@
 		return -EINVAL;
 	}
 #if 0
+	unsigned int l2_len = msg->tail - (u_int8_t *)msgb_l2(msg);
+	unsigned int hlen = sizeof(*oh) + sizeof(struct abis_om_fom_hdr);
 	if (oh->length + hlen > l2_len) {
 		fprintf(stderr, "ABIS OML truncated message (%u > %u)\n",
 			oh->length + sizeof(*oh), l2_len);
@@ -296,7 +299,6 @@
 {
 	struct abis_om_hdr *oh;
 	struct abis_nm_channel *ch;
-	u_int8_t *tei_attr;
 	u_int8_t len = sizeof(*ch) + 2;
 	struct msgb *msg = nm_msgb_alloc();
 
diff --git a/src/abis_rsl.c b/src/abis_rsl.c
index 04c8455..14b4108 100644
--- a/src/abis_rsl.c
+++ b/src/abis_rsl.c
@@ -264,7 +264,6 @@
 {
 	struct abis_rsl_dchan_hdr *dh;
 	struct msgb *msg = rsl_msgb_alloc();
-	u_int8_t encr_info = 0x01;
 
 	dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));
 	init_dchan_hdr(dh, RSL_MT_CHAN_ACTIV);
@@ -295,9 +294,7 @@
 	struct abis_rsl_dchan_hdr *dh;
 	struct msgb *msg = rsl_msgb_alloc();
 	/* FXIME: don't hardcode these!! */
-	u_int8_t encr_info = 0x01;
 	u_int8_t ms_power = 0x0f;
-	u_int8_t bs_power = 0x01;
 
 	u_int8_t chan_nr = lchan2chan_nr(lchan);
 	u_int16_t arfcn = lchan->ts->trx->arfcn;
@@ -317,6 +314,12 @@
 		cm.chan_rt = RSL_CMOD_CRT_TCH_Bm;
 		cm.chan_rate = 0x11; /* speech coding alg version 2*/
 		break;
+	case GSM_LCHAN_TCH_H:
+		DEBUGP(DRSL, "Unimplemented TCH_H activation in %s:%d\n", __FILE__, __LINE__);
+		return -1;
+	case GSM_LCHAN_UNKNOWN:
+	case GSM_LCHAN_NONE:
+		return -1;
 	}
 
 	ci.chan_desc.iei = 0x64;
@@ -334,7 +337,7 @@
 		     (u_int8_t *) &cm);
 	msgb_tlv_put(msg, RSL_IE_CHAN_IDENT, 4,
 		     (u_int8_t *) &ci);
-	/* FIXME: this shoould be optional */
+	/* FIXME: this should be optional */
 #if 0
 	msgb_tlv_put(msg, RSL_IE_ENCR_INFO, 1,
 		     (u_int8_t *) &encr_info);
@@ -386,9 +389,11 @@
 int rsl_paging_cmd_subscr(struct gsm_bts *bts, u_int8_t chan_need,
 			  struct gsm_subscriber *subscr)
 {
+#if 0
 	u_int8_t mi[128];
 	unsigned int mi_len;
 	u_int8_t paging_group;
+#endif
 
 	return -1;
 }
@@ -458,8 +463,6 @@
 /* Chapter 8.4.2: Channel Activate Acknowledge */
 static int rsl_rx_chan_act_ack(struct msgb *msg)
 {
-	struct gsm_lchan *lchan;
-	struct gsm_network *network;
 	struct abis_rsl_dchan_hdr *rslh = msgb_l2(msg);
 
 	/* BTS has confirmed channel activation, we now need
@@ -469,19 +472,12 @@
 	
 	DEBUGP(DRSL, "Channel Activate ACK Channel 0x%02x\n", rslh->chan_nr);
 
-	lchan = lchan_lookup(msg->trx, rslh->chan_nr);
-	network = msg->trx->bts->network;
-	if (network->channel_response)
-		(*network->channel_response)(lchan, 1);
-
 	return 0;
 }
 
 /* Chapter 8.4.3: Channel Activate NACK */
 static int rsl_rx_chan_act_nack(struct msgb *msg)
 {
-	struct gsm_lchan *lchan;
-	struct gsm_network *network;
 	struct abis_rsl_dchan_hdr *rslh = msgb_l2(msg);
 
 	/* BTS has confirmed channel activation, we now need
@@ -491,11 +487,6 @@
 	
 	DEBUGP(DRSL, "Channel Activate NACK Channel 0x%02x\n", rslh->chan_nr);
 
-	lchan = lchan_lookup(msg->trx, rslh->chan_nr);
-	network = msg->trx->bts->network;
-	if (network->channel_response)
-		(*network->channel_response)(lchan, 0);
-
 	return 0;
 }
 
@@ -655,10 +646,6 @@
 	/* send IMMEDIATE ASSIGN CMD on RSL to BTS (to send on CCCH to MS) */
 	ret = rsl_imm_assign_cmd(bts, sizeof(ia), (u_int8_t *) &ia);
 
-	/* inform the bsc that a channel has been allocated */
-	if (bts->network->channel_allocated)
-		(*bts->network->channel_allocated)(lchan, chreq_reason);
-
 	return ret;
 }
 
@@ -752,7 +739,6 @@
 int abis_rsl_rcvmsg(struct msgb *msg)
 {
 	struct abis_rsl_common_hdr *rslh = msgb_l2(msg)	;
-	unsigned int l2_len = (void *)msg->tail - msgb_l2(msg);
 	int rc;
 
 	switch (rslh->msg_discr & 0xfe) {
diff --git a/src/bsc_hack.c b/src/bsc_hack.c
index a3aefc6..ef61e75 100644
--- a/src/bsc_hack.c
+++ b/src/bsc_hack.c
@@ -53,16 +53,6 @@
 static int MNC = 1;
 static const char *database_name = "hlr.sqlite3";
 
-/* forward declarations */
-static void bsc_hack_update_request(struct gsm_bts *bts,
-			u_int32_t assigned_tmi, int accepted);
-static void bsc_hack_channel_allocated(struct gsm_lchan *chan,
-			enum gsm_chreq_reason_t reason);
-static void bsc_hack_channel_response(struct gsm_lchan *chan, int acked);
-static void bsc_hack_call_state_changed(struct gsm_lchan *chan,
-			enum gsm_call_state new_state);
-
-
 /* The following definitions are for OM and NM packets that we cannot yet
  * generate by code but we just pass on */
 
@@ -607,15 +597,6 @@
 	return 0;
 }
 
-static void activate_traffic_channels(struct gsm_bts_trx *trx)
-{
-	int i;
-
-	/* channel 0 is CCCH */
-	for (i = 1; i < 8; i++)
-		rsl_chan_activate_tch_f(&trx->ts[i]);
-}
-
 /*
  * Patch the various SYSTEM INFORMATION tables to update
  * the LAI
@@ -646,9 +627,6 @@
 	fprintf(stdout, "bootstrapping RSL MCC=%u MNC=%u\n", MCC, MNC);
 	patch_tables(bts);
 	set_system_infos(bts);
-
-	/* FIXME: defer this until the channels are used */
-	//activate_traffic_channels(&bts->trx[0]);
 }
 
 static void mi_cb(int event, struct gsm_bts *bts)
@@ -680,12 +658,6 @@
 	bts = &gsmnet->bts[0];
 	bts->location_area_code = 1;
 	bts->trx[0].arfcn = HARDCODED_ARFCN;
-#if 0
-	gsmnet->update_request = bsc_hack_update_request;
-	gsmnet->channel_allocated = bsc_hack_channel_allocated;
-	gsmnet->channel_response = bsc_hack_channel_response;
-	gsmnet->call_state_changed = bsc_hack_call_state_changed;
-#endif
 
 	telnet_init(gsmnet, 4242);
 	if (mi_setup(bts, 0, mi_cb) < 0)
@@ -785,193 +757,6 @@
 	}
 }
 
-static struct timer_list pag_timer;
-
-/* handles uppercase decimal and hexadecimal */
-static u_int8_t char2bcd(char c)
-{
-	if (c <= '9')
-		return c - '0';
-	else
-		return c - 'A';
-}
-
-static int string_to_mi(u_int8_t *mi, const char *string,
-			u_int8_t type)
-{
-	u_int8_t *cur = mi+3;
-
-	mi[0] = GSM48_IE_MOBILE_ID;
-	//mi[1] = TMSI_LEN;
-	mi[2] = type & GSM_MI_TYPE_MASK;
-
-	if (strlen(string) & 0x01)
-		mi[2] |= char2bcd(*string++) << 4;
-	else
-		mi[2] |= 0xf0;
-
-	while (*string && *(string+1))
-		*cur++ = char2bcd(*string++) | (char2bcd(*string++) << 4);
-
-	mi[1] = cur - mi;
-
-	return cur - mi;
-}
-
-/*
- * Stations that registered and that we need to page
- */
-struct pending_registered_station {
-	struct llist_head entry;
-
-	/* the tmsi of the subscriber */
-	u_int32_t tmsi;
-	int last_page_group;
-};
-
-static LLIST_HEAD(pending_stations);
-
-static void pag_timer_cb(void *data);
-static struct timer_list pag_timer = {
-	.cb = pag_timer_cb,
-};
-
-/* page the tmsi and wait for the channel request */
-static void pag_timer_cb(void *data)
-{
-	struct gsm_bts *bts = &gsmnet->bts[0];
-	struct pending_registered_station *pending_station;
-	u_int8_t mi[128];
-	unsigned int mi_len;
-
-return;
-
-	if (llist_empty(&pending_stations)) {
-		DEBUGP(DPAG, "pag_timer_cb but no pending mobile stations\n");
-		return;
-	}
-
-	/* FIXME: 05.02  6.5.2 Determination of CCCH_GROUP and PAGING_GROUP... */
-	/* get the station to page */
-	pending_station = (struct pending_registered_station*) pending_stations.next;
-	mi_len = generate_mid_from_tmsi(mi, pending_station->tmsi);
-	rsl_paging_cmd(bts, pending_station->last_page_group, mi_len, mi, RSL_CHANNEED_TCH_F);
-
-	/* which group to page next */
-	pending_station->last_page_group = (pending_station->last_page_group+1) % 12;
-	schedule_timer(&pag_timer, 1, 0);
-}
-
-/*
- * initiate the a page command for the given
- * station and retry until we get a channel request
- */
-static void station_timer_cb(void *data)
-{
-	DEBUGP(DPAG, "Initiating paging of a channel\n");
-	pag_timer_cb(0);
-}
-
-static struct timer_list station_timer = {
-	.cb = station_timer_cb,
-};
-
-/*
- * schedule work
- */
-static void bsc_hack_update_request(struct gsm_bts *bts, u_int32_t tmsi, int accepted)
-{
-	struct pending_registered_station *station =
-				(struct pending_registered_station*)malloc(sizeof(*station));
-
-	/*
-	 * Only deal with LOCATION UPDATE REQUEST we have
-	 * accepted.
-	 */
-	if (!accepted)
-		return;
-
-
-	station->tmsi = tmsi;
-	station->last_page_group = 0;
-	llist_add_tail(&station->entry, &pending_stations);
-
-	if (!timer_pending(&station_timer))
-		schedule_timer(&station_timer, 1, 0);
-}
-
-static void bsc_hack_channel_allocated(struct gsm_lchan *chan,
-									enum gsm_chreq_reason_t chreq_reason)
-{
-	struct pending_registered_station *station;
-	if (chreq_reason != GSM_CHREQ_REASON_PAG)
-		return;
-
-	if (llist_empty(&pending_stations)) {
-		DEBUGP(DPAG, "Channel allocated for pag but not waitin for it\n");
-		return;
-	}
-
-	station = (struct pending_registered_station*) pending_stations.next;
-
-	DEBUGP(DPAG, "CHAN RQD due PAG %d on %d for %u\n", chan->type, chan->nr, station->tmsi);
-
-	/* allocate some token in the chan for us */
-	chan->user_data = (void*)station->tmsi;
-	del_timer(&pag_timer);
-}
-
-static void bsc_hack_channel_response(struct gsm_lchan *lchan, int ack)
-{
-	struct pending_registered_station *station;
-	if (llist_empty(&pending_stations)) {
-		return;
-	}
-
-	station = (struct pending_registered_station*) pending_stations.next;
-	if (station->tmsi != (u_int32_t)lchan->user_data) {
-		DEBUGP(DPAG, "Hmmm the channel is not allocated by the"
-					 "station we wanted channel: %u us:%u\n",
-					  (u_int32_t)(lchan->user_data), station->tmsi);
-		return;
-	}
-
-	if (ack) {
-		DEBUGP(DPAG, "We have probably paged a channel for tmsi: %u on %d\n",
-				station->tmsi, lchan->nr);
-		
-		llist_del(&station->entry);
-		free(station);
-
-		/*
-		 * start a call
-		 */
-		gsm48_cc_tx_setup(lchan);
-	} else {
-		/*
-		 * give up and go to the next channel
-		*/
-		llist_del(&station->entry);
-		free(station);
-		pag_timer_cb(0);
-	}
-}
-
-static void bsc_hack_call_state_changed(struct gsm_lchan *lchan,
-					enum gsm_call_state new_state)
-{
-	DEBUGP(DPAG, "Call released jumping to the next...\n");
-
-	/* only handle the transition back to the NULL state */
-	if (new_state != GSM_CSTATE_NULL)
-		return;
-
-	rsl_chan_release(lchan);
-
-	/* next!!! */
-	pag_timer_cb(0);
-}
-
 static void signal_handler(int signal)
 {
 	fprintf(stdout, "signal %u received\n", signal);
diff --git a/src/db.c b/src/db.c
index 8ee2132..50459cf 100644
--- a/src/db.c
+++ b/src/db.c
@@ -194,7 +194,7 @@
 	return subscr;
 }
 
-struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, char *id) {
+struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, const char *id) {
 	dbi_result result;
 	const char *string;
 	char *quoted;
diff --git a/src/debug.c b/src/debug.c
index ecd7be1..0a35dbc 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -77,7 +77,7 @@
 			if (strcasecmp(debug_info[i].name, category_token) == 0)
 				new_mask |= debug_info[i].number;
 		}
-	} while (category_token = strtok(NULL, ":"));
+	} while ((category_token = strtok(NULL, ":")));
 
 
 	free(mask);
@@ -120,3 +120,12 @@
 	fflush(outfd);
 }
 
+void hexdump(unsigned char *buf, int len)
+{
+	int i;
+	for (i = 0; i < len; i++) {
+		fprintf(stdout, "%02x ", buf[i]);
+	}
+	fprintf(stdout, "\n");
+}
+
diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c
index 69207d7..aca4cf2 100644
--- a/src/gsm_04_08.c
+++ b/src/gsm_04_08.c
@@ -38,6 +38,7 @@
 #include <openbsc/gsm_04_11.h>
 #include <openbsc/gsm_04_08.h>
 #include <openbsc/abis_rsl.h>
+#include <openbsc/chan_alloc.h>
 
 #define GSM48_ALLOC_SIZE	1024
 #define GSM48_ALLOC_HEADROOM	128
@@ -106,25 +107,6 @@
 	memset(lchan->loc_operation, 0, sizeof(*lchan->loc_operation));
 }
 
-static void parse_lai(struct gsm_lai *lai, const struct gsm48_loc_area_id *lai48)
-{
-	u_int8_t dig[4];
-
-	/* MCC */
-	dig[1] = lai48->digits[0] & 0x0f;
-	dig[2] = lai48->digits[0] >> 4;
-	dig[3] = lai48->digits[1] & 0x0f;
-	lai->mcc = dig[3] * 100 + dig[2];
-
-	/* MNC */
-	dig[1] = lai48->digits[1] >> 4;
-	dig[2] = lai48->digits[2] & 0x0f;
-	dig[3] = lai48->digits[2] >> 4;
-	lai->mnc = dig[3] * 100 + dig[2];
-
-	lai->lac = lai48->lac;
-}
-
 static void to_bcd(u_int8_t *bcd, u_int16_t val)
 {
 	bcd[2] = val % 10;
@@ -135,17 +117,6 @@
 	val = val / 10;
 }
 
-static u_int8_t to_bcd8(unsigned int val)
-{
-	u_int8_t bcd;
-	
-	bcd = (val % 10) & 0x0f;
-	val = val / 10;
-	bcd |= (val % 10) << 4;
-
-	return bcd;
-}
-
 void gsm0408_generate_lai(struct gsm48_loc_area_id *lai48, u_int16_t mcc, 
 			 u_int16_t mnc, u_int16_t lac)
 {
@@ -207,6 +178,8 @@
 				break;
 			case GSM_CT_MT:
 				break;
+			case GSM_CT_NONE:
+				break;
 			}
 		}
 	}
@@ -262,10 +235,6 @@
 
 	DEBUGP(DMM, "-> LOCATION UPDATE ACCEPT\n");
 
-	/* inform the upper layer on the progress */
-	if (bts->network->update_request)
-		(*bts->network->update_request)(bts, tmsi, 1);
-
 	ret = gsm48_sendmsg(msg);
 
 	/* return gsm48_cc_tx_setup(lchan); */
@@ -448,7 +417,7 @@
 		lchan->loc_operation->waiting_for_imei = 1;
 
 		/* look up the subscriber based on TMSI, request IMSI if it fails */
-		subscr = subscr_get_by_tmsi(lu->mi);
+		subscr = subscr_get_by_tmsi((char *)lu->mi);
 		if (!subscr) {
 			/* send IDENTITY REQUEST message to get IMSI */
 			use_lchan(lchan);
@@ -492,12 +461,9 @@
 	struct msgb *msg = gsm48_msgb_alloc();
 	struct gsm48_hdr *gh;
 	struct gsm_network *net = lchan->ts->trx->bts->network;
-	time_t cur_t;
-	struct tm* cur_time;
 	u_int8_t *ptr8;
 	u_int16_t *ptr16;
 	int name_len;
-	int tz15min;
 	int i;
 
 	msg->lchan = lchan;
@@ -536,6 +502,10 @@
 	}
 
 #if 0
+	/* move back to the top */
+	time_t cur_t;
+	struct tm* cur_time;
+	int tz15min;
 	/* Section 10.5.3.9 */
 	cur_t = time(NULL);
 	cur_time = gmtime(cur_t);
@@ -673,11 +643,13 @@
 	return gsm48_cc_tx_status(msg->lchan);
 }
 
+#if 0
 static int gsm48_cc_rx_setup(struct msgb *msg)
 {
 	return gsm48_tx_simple(msg->lchan, GSM48_PDISC_CC,
 			       GSM48_MT_CC_CALL_CONF);
 }
+#endif
 
 int gsm48_cc_tx_setup(struct gsm_lchan *lchan)
 {
@@ -711,7 +683,6 @@
 	struct gsm48_hdr *gh = msgb_l3(msg);
 	u_int8_t msg_type = gh->msg_type & 0xbf;
 	struct gsm_call *call = &msg->lchan->call;
-	struct gsm_network *network = msg->lchan->ts->trx->bts->network;
 	int rc = 0;
 
 	switch (msg_type) {
@@ -722,8 +693,6 @@
 	case GSM48_MT_CC_RELEASE_COMPL:
 		/* Answer from MS to RELEASE */
 		DEBUGP(DCC, "RELEASE COMPLETE (state->NULL)\n");
-		if (network->call_state_changed)
-			(*network->call_state_changed)(msg->lchan, call->state);
 		call->state = GSM_CSTATE_NULL;
 		break;
 	case GSM48_MT_CC_ALERTING:
diff --git a/src/gsm_04_11.c b/src/gsm_04_11.c
index ede89ef..b0d3a01 100644
--- a/src/gsm_04_11.c
+++ b/src/gsm_04_11.c
@@ -73,11 +73,11 @@
 	return text;
 }
 
+#if 0
 static u_int8_t gsm0411_tpdu_from_sms(u_int8_t *tpdu, struct sms_deliver *sms)
 {
-	u_int8_t len = 0;
-
 }
+#endif
 
 static int gsm411_sms_submit_from_msgb(struct msgb *msg)
 {
@@ -111,7 +111,7 @@
 	}
 	sms->ud_len = *smsp++;
 
-	sms->user_data = gsm411_7bit_decode(smsp, sms->ud_len);
+	sms->user_data = (u_int8_t *)gsm411_7bit_decode(smsp, sms->ud_len);
 
 	DEBUGP(DSMS, "SMS:\nMTI: 0x%02x, VPF: 0x%02x, MR: 0x%02x\n"
 			"PID: 0x%02x, DCS: 0x%02x, UserDataLength: 0x%02x\n"
@@ -147,6 +147,7 @@
 	return gsm0411_sendmsg(msg);
 }
 
+#if 0
 static int gsm411_send_rp_error(struct gsm_lchan *lchan, u_int8_t trans_id,
 		u_int8_t msg_ref)
 {
@@ -169,6 +170,7 @@
 
 	return gsm0411_sendmsg(msg);
 }
+#endif
 
 static int gsm411_cp_data(struct msgb *msg)
 {
@@ -248,7 +250,7 @@
 	struct msgb *msg = gsm411_msgb_alloc();
 	struct gsm48_hdr *gh;
 	struct gsm411_rp_hdr *rp;
-	u_int8_t *data, *tpdu, smslen;
+	u_int8_t *data;
 
 	msg->lchan = lchan;
 
diff --git a/src/misdn.c b/src/misdn.c
index 17d2669..75cdb83 100644
--- a/src/misdn.c
+++ b/src/misdn.c
@@ -197,15 +197,6 @@
 #define TEI_OML		25
 #define TEI_RSL		1
 
-void hexdump(unsigned char *buf, int len)
-{
-	int i;
-	for (i = 0; i < len; i++) {
-		fprintf(stdout, "%02x ", buf[i]);
-	}
-	fprintf(stdout, "\n");
-}
-
 #define TS1_ALLOC_SIZE	300
 
 static int handle_ts1_read(struct bsc_fd *bfd)
@@ -389,7 +380,7 @@
 	struct mi_e1_handle *e1h = bfd->data;
 	struct msgb *msg = msgb_alloc(TSX_ALLOC_SIZE);
 	struct mISDNhead *hh;
-	int ret;
+	int ret, dummy;
 
 	if (!msg)
 		return -ENOMEM;
@@ -425,7 +416,7 @@
 		if (!e1h->ts2_fd)
 			e1h->ts2_fd = open("/tmp/ts2.dump", O_WRONLY|O_APPEND|O_CREAT, 0660);
 		
-		write(e1h->ts2_fd, msgb_l2(msg), ret - MISDN_HEADER_LEN);
+		dummy = write(e1h->ts2_fd, msgb_l2(msg), ret - MISDN_HEADER_LEN);
 
 		break;
 	default:
diff --git a/src/telnet_parser.l b/src/telnet_parser.l
index 796c5c9..e432719 100644
--- a/src/telnet_parser.l
+++ b/src/telnet_parser.l
@@ -182,3 +182,9 @@
 		conn->imsi = NULL;
 	}
 }
+
+__attribute__((unused)) void telnet_unused(void)
+{
+	yyunput(0, 0, 0);
+	input(0);
+}