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;
+}