This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.
Holger Freyther zecke at selfish.orgFrom 6cec523f3c48a6b0d253a9c7405bb6797b044e68 Mon Sep 17 00:00:00 2001 From: Holger Freyther <ich at tamarin.(none)> Date: Tue, 31 Mar 2009 04:35:19 +0200 Subject: [PATCH 1/3] Proposal for a "channel request" interface... Reuqests for a subscriber a stored within the gsm_subscriber datastructure and it will keep track how many channels are allocated for this user and of which type to decide on policy... e.g. attempt to submit SMS during a phone call and not doing paging but a simple (immediate) assignment of the channel... --- include/openbsc/gsm_subscriber.h | 8 ++++++++ src/bsc_hack.c | 1 + src/gsm_04_08.c | 6 +++--- src/gsm_subscriber.c | 26 ++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/include/openbsc/gsm_subscriber.h b/include/openbsc/gsm_subscriber.h index 99148b5..abe1fd7 100644 --- a/include/openbsc/gsm_subscriber.h +++ b/include/openbsc/gsm_subscriber.h @@ -23,6 +23,9 @@ struct gsm_subscriber { /* for internal management */ int use_count; struct llist_head entry; + + /* pending requests */ + struct llist_head requests; }; enum gsm_subscriber_field { @@ -43,6 +46,11 @@ struct gsm_subscriber *subscr_get_by_imsi(const char *imsi); struct gsm_subscriber *subscr_get_by_extension(const char *ext); int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason); void subscr_put_channel(struct gsm_lchan *lchan); +void subscr_get_channel(struct gsm_subscriber *subscr, + struct gsm_bts *bts, int type, + gsm_cbfn *cbfn, void *data); + +void subscr_init(struct gsm_network *network); /* internal */ struct gsm_subscriber *subscr_alloc(void); diff --git a/src/bsc_hack.c b/src/bsc_hack.c index 188ccf6..7821044 100644 --- a/src/bsc_hack.c +++ b/src/bsc_hack.c @@ -983,6 +983,7 @@ static int bootstrap_network(void) printf("DB: Database prepared.\n"); telnet_init(gsmnet, 4242); + subscr_init(gsmnet); register_signal_handler(SS_NM, nm_sig_cb, NULL); diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c index 83f38dd..040efff 100644 --- a/src/gsm_04_08.c +++ b/src/gsm_04_08.c @@ -1203,10 +1203,10 @@ static int gsm48_cc_rx_setup(struct msgb *msg) call->called_subscr = called_subscr; /* start paging of the receiving end of the call */ - /* FIXME: we're assuming that the receiver is at the same BTS - * than we are, which is obviously a wrong assumption in multi-BTS + /* FIXME: we're assuming that the receiver is at the same BSC + * than we are, which is obviously a wrong assumption in multi BSC * case */ - paging_request(msg->trx->bts, called_subscr, RSL_CHANNEED_TCH_F, + subscr_get_channel(called_subscr, msg->trx->bts, RSL_CHANNEED_TCH_F, setup_trig_pag_evt, call); /* send a CALL PROCEEDING message to the MO */ diff --git a/src/gsm_subscriber.c b/src/gsm_subscriber.c index 3f608ec..19de6dc 100644 --- a/src/gsm_subscriber.c +++ b/src/gsm_subscriber.c @@ -27,11 +27,13 @@ #include <string.h> #include <openbsc/gsm_subscriber.h> +#include <openbsc/paging.h> #include <openbsc/debug.h> #include <openbsc/db.h> LLIST_HEAD(active_subscribers); +struct gsm_network *gsmnet = NULL; struct gsm_subscriber *subscr_alloc(void) { @@ -45,6 +47,8 @@ struct gsm_subscriber *subscr_alloc(void) llist_add_tail(&s->entry, &active_subscribers); s->use_count = 1; + INIT_LLIST_HEAD(&s->requests); + return s; } @@ -131,6 +135,23 @@ struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr) return NULL; } +void subscr_get_channel(struct gsm_subscriber *subscr, + struct gsm_bts *default_bts, int type, + gsm_cbfn *cbfn, void *data) +{ + /* FIXME: Find the right BTS... */ + struct gsm_bts *bts; + if (default_bts) + bts = default_bts; + else + bts = gsm_bts_by_lac(gsmnet, subscr->lac, NULL); + + if (!bts) + return; + + paging_request(bts, subscr, type, cbfn, data); +} + void subscr_put_channel(struct gsm_lchan *lchan) { /* @@ -141,3 +162,8 @@ void subscr_put_channel(struct gsm_lchan *lchan) */ put_lchan(lchan); } + +void subscr_init(struct gsm_network *net) +{ + gsmnet = net; +} -- 1.6.3.1