diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2012-07-20 18:14:34 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2012-07-21 13:19:43 +0200 |
commit | 1195148fc6d0259a2236cbc5908cbd9416a926f9 (patch) | |
tree | 4f45f24524a5cfc7088150d4eb131806cdb941ea /src/common/pcu_sock.c | |
parent | 1ddb183736bad257b8e774c0d0ab1ff8f628b442 (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.c | 33 |
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) { |