Add implementation to find a lchan by the struct gsm_subscriber

Really compare pointers to check if the one gsm_subscriber
is equal to the other... gsm_subscriber should be unique for
a given IMSI so comparing the pointers should be fine.
diff --git a/include/openbsc/chan_alloc.h b/include/openbsc/chan_alloc.h
index 0c6d63e..d6d367c 100644
--- a/include/openbsc/chan_alloc.h
+++ b/include/openbsc/chan_alloc.h
@@ -1,6 +1,28 @@
+/* Management functions to allocate/release struct gsm_lchan */
+/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
 #ifndef _CHAN_ALLOC_H
 #define _CHAN_ALLOC_H
 
+#include "gsm_subscriber.h"
+
 /* Special allocator for C0 of BTS */
 struct gsm_bts_trx_ts *ts_c0_alloc(struct gsm_bts *bts,
 				   enum gsm_phys_chan_config pchan);
@@ -12,6 +34,8 @@
 /* Regular physical channel (TS) */
 void ts_free(struct gsm_bts_trx_ts *ts);
 
+/* Find an allocated channel */
+struct gsm_lchan *lchan_find(struct gsm_bts *bts, struct gsm_subscriber *subscr);
 
 /* Allocate a logical channel (SDCCH, TCH, ...) */
 struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type);
diff --git a/src/chan_alloc.c b/src/chan_alloc.c
index 439a8da..b50b19f 100644
--- a/src/chan_alloc.c
+++ b/src/chan_alloc.c
@@ -226,3 +226,19 @@
 		schedule_timer(&lchan->release_timer, LCHAN_RELEASE_TIMEOUT);
 }
 
+struct gsm_lchan* lchan_find(struct gsm_bts *bts, struct gsm_subscriber *subscr) {
+	int trx, ts_no, lchan_no; 
+
+	for (trx = 0; trx < bts->num_trx; ++trx) {
+		for (ts_no = 0; ts_no < 8; ++ts_no) {
+			for (lchan_no = 0; lchan_no < TS_MAX_LCHAN; ++lchan_no) {
+				struct gsm_lchan *lchan =
+					&bts->trx[trx].ts[ts_no].lchan[lchan_no];
+				if (subscr == lchan->subscr)
+					return lchan;
+			}
+		}
+	}
+
+	return NULL;
+}