From d0e38c3cadc8f13e85aef184a1155d34bf99a1f5 Mon Sep 17 00:00:00 2001 From: Holger Freyther Date: Sun, 4 Jan 2009 03:48:30 +0000 Subject: [PATCH] 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. --- include/openbsc/chan_alloc.h | 24 ++++++++++++++++++++++++ src/chan_alloc.c | 16 ++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/openbsc/chan_alloc.h b/include/openbsc/chan_alloc.h index 0c6d63e64..d6d367c84 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 + * (C) 2009 by Holger Hans Peter Freyther + * 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 @@ struct gsm_bts_trx_ts *ts_alloc(struct gsm_bts *bts, /* 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 439a8da56..b50b19fc8 100644 --- a/src/chan_alloc.c +++ b/src/chan_alloc.c @@ -226,3 +226,19 @@ static void auto_release_channel(void *_lchan) 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; +}