aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-06-17 15:05:57 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-06-17 15:05:57 +0800
commit86481c29d4cc9bed3010db466be6e0757458b031 (patch)
treea8b74f246eece8021115bce1b8c4f21bd97d5a2b
parent7b4a53d537a1d6cb6bfff2c65e3252c2a4ac0aa7 (diff)
bsc_api: Make paging/silent call work with the subscriber_connection
Do not use the lchan for the paging but operate on the subscriber_connection, change the signals too to not carry the lchan but the subscriber connection... the silent call and vty code still assume there is a lchan inside the subscriber connection.
-rw-r--r--openbsc/include/openbsc/paging.h2
-rw-r--r--openbsc/include/openbsc/signal.h4
-rw-r--r--openbsc/src/gsm_04_08.c8
-rw-r--r--openbsc/src/gsm_04_08_utils.c4
-rw-r--r--openbsc/src/gsm_04_11.c10
-rw-r--r--openbsc/src/paging.c12
-rw-r--r--openbsc/src/rrlp.c2
-rw-r--r--openbsc/src/silent_call.c11
-rw-r--r--openbsc/src/vty_interface_layer3.c2
9 files changed, 26 insertions, 29 deletions
diff --git a/openbsc/include/openbsc/paging.h b/openbsc/include/openbsc/paging.h
index 6cbdca902..b69d5e602 100644
--- a/openbsc/include/openbsc/paging.h
+++ b/openbsc/include/openbsc/paging.h
@@ -38,7 +38,7 @@ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
/* stop paging requests */
void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr,
- struct gsm_lchan *lchan);
+ struct gsm_subscriber_connection *conn);
/* update paging load */
void paging_update_buffer_space(struct gsm_bts *bts, u_int16_t);
diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h
index 48f7946b3..0738f807d 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -125,12 +125,12 @@ struct paging_signal_data {
struct gsm_bts *bts;
/* NULL in case the paging didn't work */
- struct gsm_lchan *lchan;
+ struct gsm_subscriber_connection *conn;
};
struct scall_signal_data {
struct gsm_subscriber *subscr;
- struct gsm_lchan *lchan;
+ struct gsm_subscriber_connection *conn;
void *data;
};
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c
index 297a2c9f2..9ec2bf916 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1363,9 +1363,9 @@ static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg);
/* call-back from paging the B-end of the connection */
static int setup_trig_pag_evt(unsigned int hooknum, unsigned int event,
- struct msgb *msg, void *_lchan, void *param)
+ struct msgb *msg, void *_conn, void *param)
{
- struct gsm_lchan *lchan = _lchan;
+ struct gsm_subscriber_connection *conn = _conn;
struct gsm_subscriber *subscr = param;
struct gsm_trans *transt, *tmp;
struct gsm_network *net;
@@ -1387,13 +1387,13 @@ static int setup_trig_pag_evt(unsigned int hooknum, unsigned int event,
continue;
switch (event) {
case GSM_PAGING_SUCCEEDED:
- if (!lchan) // paranoid
+ if (!conn) // paranoid
break;
DEBUGP(DCC, "Paging subscr %s succeeded!\n",
subscr->extension);
/* Assign lchan */
if (!transt->conn) {
- transt->conn = &lchan->conn;
+ transt->conn = conn;
use_subscr_con(transt->conn);
}
/* send SETUP request to called party */
diff --git a/openbsc/src/gsm_04_08_utils.c b/openbsc/src/gsm_04_08_utils.c
index 952d7248e..3776565eb 100644
--- a/openbsc/src/gsm_04_08_utils.c
+++ b/openbsc/src/gsm_04_08_utils.c
@@ -268,14 +268,14 @@ int gsm48_handle_paging_resp(struct msgb *msg, struct gsm_subscriber *subscr)
sig_data.subscr = subscr;
sig_data.bts = msg->lchan->ts->trx->bts;
- sig_data.lchan = msg->lchan;
+ sig_data.conn = &msg->lchan->conn;
counter_inc(bts->network->stats.paging.completed);
dispatch_signal(SS_PAGING, S_PAGING_SUCCEEDED, &sig_data);
/* Stop paging on the bts we received the paging response */
- paging_request_stop(msg->trx->bts, subscr, msg->lchan);
+ paging_request_stop(msg->trx->bts, subscr, &msg->lchan->conn);
return 0;
}
diff --git a/openbsc/src/gsm_04_11.c b/openbsc/src/gsm_04_11.c
index ee0aba59d..a9eee8376 100644
--- a/openbsc/src/gsm_04_11.c
+++ b/openbsc/src/gsm_04_11.c
@@ -1108,22 +1108,22 @@ static int gsm411_send_sms(struct gsm_subscriber_connection *conn, struct gsm_sm
/* paging callback. Here we get called if paging a subscriber has
* succeeded or failed. */
static int paging_cb_send_sms(unsigned int hooknum, unsigned int event,
- struct msgb *msg, void *_lchan, void *_sms)
+ struct msgb *msg, void *_conn, void *_sms)
{
- struct gsm_lchan *lchan = _lchan;
+ struct gsm_subscriber_connection *conn = _conn;
struct gsm_sms *sms = _sms;
int rc = 0;
DEBUGP(DSMS, "paging_cb_send_sms(hooknum=%u, event=%u, msg=%p,"
- "lchan=%p, sms=%p)\n", hooknum, event, msg, lchan, sms);
+ "conn=%p, sms=%p)\n", hooknum, event, msg, conn, sms);
if (hooknum != GSM_HOOK_RR_PAGING)
return -EINVAL;
switch (event) {
case GSM_PAGING_SUCCEEDED:
- use_subscr_con(&lchan->conn);
- gsm411_send_sms(&lchan->conn, sms);
+ use_subscr_con(conn);
+ gsm411_send_sms(conn, sms);
break;
case GSM_PAGING_EXPIRED:
case GSM_PAGING_OOM:
diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c
index ca3767864..eee2aaf98 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -194,7 +194,7 @@ static void paging_T3113_expired(void *data)
sig_data.subscr = req->subscr;
sig_data.bts = req->bts;
- sig_data.lchan = NULL;
+ sig_data.conn = NULL;
/* must be destroyed before calling cbfn, to prevent double free */
counter_inc(req->bts->network->stats.paging.expired);
@@ -276,7 +276,7 @@ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
/* we consciously ignore the type of the request here */
static void _paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr,
- struct gsm_lchan *lchan)
+ struct gsm_subscriber_connection *conn)
{
struct gsm_bts_paging_state *bts_entry = &bts->paging;
struct gsm_paging_request *req, *req2;
@@ -284,10 +284,10 @@ static void _paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *sub
llist_for_each_entry_safe(req, req2, &bts_entry->pending_requests,
entry) {
if (req->subscr == subscr) {
- if (lchan && req->cbfn) {
+ if (conn && req->cbfn) {
LOGP(DPAG, LOGL_DEBUG, "Stop paging on bts %d, calling cbfn.\n", bts->nr);
req->cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_SUCCEEDED,
- NULL, lchan, req->cbfn_param);
+ NULL, conn, req->cbfn_param);
} else
LOGP(DPAG, LOGL_DEBUG, "Stop paging on bts %d silently.\n", bts->nr);
paging_remove_request(&bts->paging, req);
@@ -298,12 +298,12 @@ static void _paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *sub
/* Stop paging on all other bts' */
void paging_request_stop(struct gsm_bts *_bts, struct gsm_subscriber *subscr,
- struct gsm_lchan *lchan)
+ struct gsm_subscriber_connection *conn)
{
struct gsm_bts *bts = NULL;
if (_bts)
- _paging_request_stop(_bts, subscr, lchan);
+ _paging_request_stop(_bts, subscr, conn);
do {
/*
diff --git a/openbsc/src/rrlp.c b/openbsc/src/rrlp.c
index b5c7daf79..465d20617 100644
--- a/openbsc/src/rrlp.c
+++ b/openbsc/src/rrlp.c
@@ -91,7 +91,7 @@ static int paging_sig_cb(unsigned int subsys, unsigned int signal,
switch (signal) {
case S_PAGING_SUCCEEDED:
/* A subscriber has attached. */
- send_rrlp_req(&psig_data->lchan->conn);
+ send_rrlp_req(psig_data->conn);
break;
case S_PAGING_EXPIRED:
break;
diff --git a/openbsc/src/silent_call.c b/openbsc/src/silent_call.c
index 00acc1dc4..0471bff3a 100644
--- a/openbsc/src/silent_call.c
+++ b/openbsc/src/silent_call.c
@@ -36,10 +36,9 @@
/* paging of the requested subscriber has completed */
static int paging_cb_silent(unsigned int hooknum, unsigned int event,
- struct msgb *msg, void *_lchan, void *_data)
+ struct msgb *msg, void *_conn, void *_data)
{
- struct gsm_subscriber_connection *conn;
- struct gsm_lchan *lchan = _lchan;
+ struct gsm_subscriber_connection *conn = _conn;
struct scall_signal_data sigdata;
int rc;
@@ -48,15 +47,13 @@ static int paging_cb_silent(unsigned int hooknum, unsigned int event,
DEBUGP(DSMS, "paging_cb_silent: ");
- conn = &lchan->conn;
-
- sigdata.lchan = lchan;
+ sigdata.conn = conn;
sigdata.data = _data;
switch (event) {
case GSM_PAGING_SUCCEEDED:
DEBUGPC(DSMS, "success, using Timeslot %u on ARFCN %u\n",
- lchan->ts->nr, lchan->ts->trx->arfcn);
+ conn->lchan->ts->nr, conn->lchan->ts->trx->arfcn);
conn->silent_call = 1;
/* increment lchan reference count */
dispatch_signal(SS_SCALL, S_SCALL_SUCCESS, &sigdata);
diff --git a/openbsc/src/vty_interface_layer3.c b/openbsc/src/vty_interface_layer3.c
index 7c32c05b0..2a31df683 100644
--- a/openbsc/src/vty_interface_layer3.c
+++ b/openbsc/src/vty_interface_layer3.c
@@ -513,7 +513,7 @@ static int scall_cbfn(unsigned int subsys, unsigned int signal,
switch (signal) {
case S_SCALL_SUCCESS:
vty_out(vty, "%% silent call on ARFCN %u timeslot %u%s",
- sigdata->lchan->ts->trx->arfcn, sigdata->lchan->ts->nr,
+ sigdata->conn->lchan->ts->trx->arfcn, sigdata->conn->lchan->ts->nr,
VTY_NEWLINE);
break;
case S_SCALL_EXPIRED: