[PATCH 1/3] Proposal for a "channel request" interface...

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.org
Sat Jun 6 12:49:55 UTC 2009


From 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






More information about the OpenBSC mailing list