aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/pcu_sock.c
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2012-07-20 18:14:34 +0200
committerHarald Welte <laforge@gnumonks.org>2012-07-21 13:19:43 +0200
commit1195148fc6d0259a2236cbc5908cbd9416a926f9 (patch)
tree4f45f24524a5cfc7088150d4eb131806cdb941ea /src/common/pcu_sock.c
parent1ddb183736bad257b8e774c0d0ab1ff8f628b442 (diff)
Send RR paging requests to PCU, in order to page on PACCH
Diffstat (limited to 'src/common/pcu_sock.c')
-rw-r--r--src/common/pcu_sock.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c
index 1bf8cd60..d9ea73ee 100644
--- a/src/common/pcu_sock.c
+++ b/src/common/pcu_sock.c
@@ -389,6 +389,39 @@ int pcu_tx_time_ind(uint32_t fn)
return pcu_sock_send(&bts_gsmnet, msg);
}
+int pcu_tx_pag_req(uint8_t *identity_lv, uint8_t chan_needed)
+{
+ struct pcu_sock_state *state = bts_gsmnet.pcu_state;
+ struct msgb *msg;
+ struct gsm_pcu_if *pcu_prim;
+ struct gsm_pcu_if_pag_req *pag_req;
+
+ /* check if identity does not fit: length > sizeof(lv) - 1 */
+ if (identity_lv[0] >= sizeof(pag_req->identity_lv)) {
+ LOGP(DPCU, LOGL_ERROR, "Paging identity too large (%d)\n",
+ identity_lv[0]);
+ return -EINVAL;
+ }
+
+ /* socket not created */
+ if (!state) {
+ LOGP(DPCU, LOGL_DEBUG, "PCU socket not created, ignoring "
+ "paging message\n");
+ return 0;
+ }
+
+ msg = pcu_msgb_alloc(PCU_IF_MSG_PAG_REQ, 0);
+ if (!msg)
+ return -ENOMEM;
+ pcu_prim = (struct gsm_pcu_if *) msg->data;
+ pag_req = &pcu_prim->u.pag_req;
+
+ pag_req->chan_needed = chan_needed;
+ memcpy(pag_req->identity_lv, identity_lv, identity_lv[0] + 1);
+
+ return pcu_sock_send(&bts_gsmnet, msg);
+}
+
static int pcu_rx_data_req(struct gsm_bts *bts, uint8_t msg_type,
struct gsm_pcu_if_data *data_req)
{