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.
diff --git a/openbsc/include/openbsc/paging.h b/openbsc/include/openbsc/paging.h
index 6cbdca9..b69d5e6 100644
--- a/openbsc/include/openbsc/paging.h
+++ b/openbsc/include/openbsc/paging.h
@@ -38,7 +38,7 @@
 
 /* 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 48f7946..0738f80 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -125,12 +125,12 @@
 	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 297a2c9..9ec2bf9 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1363,9 +1363,9 @@
 
 /* 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 @@
 			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 952d724..3776565 100644
--- a/openbsc/src/gsm_04_08_utils.c
+++ b/openbsc/src/gsm_04_08_utils.c
@@ -268,14 +268,14 @@
 
 	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 ee0aba5..a9eee83 100644
--- a/openbsc/src/gsm_04_11.c
+++ b/openbsc/src/gsm_04_11.c
@@ -1108,22 +1108,22 @@
 /* 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 ca37678..eee2aaf 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -194,7 +194,7 @@
 	
 	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 @@
 
 /* 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 @@
 	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 @@
 
 /* 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 b5c7daf..465d206 100644
--- a/openbsc/src/rrlp.c
+++ b/openbsc/src/rrlp.c
@@ -91,7 +91,7 @@
 	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 00acc1d..0471bff 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 @@
 
 	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 7c32c05..2a31df6 100644
--- a/openbsc/src/vty_interface_layer3.c
+++ b/openbsc/src/vty_interface_layer3.c
@@ -513,7 +513,7 @@
 	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: