diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2009-08-21 05:18:21 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2009-09-28 12:50:49 +0200 |
commit | 3ee5d3e8af741176843836ac4e78823fa1d17778 (patch) | |
tree | 64c92e4f3f4b0b597ed9c1ca3da4cc6e752a2893 /openbsc/src/gsm_04_08_utils.c | |
parent | adc1478a47323a3ae9bcfd928894a32541269b76 (diff) |
[gsm0408] Move paging handling to gsm_04_08_utils.c
Add one method to extract the MI which will allow to load
the gsm_subscriber depending on the MSC/BSC setup and then
use gsm48_handle_paging_resp to finish the paging response
handling.
Diffstat (limited to 'openbsc/src/gsm_04_08_utils.c')
-rw-r--r-- | openbsc/src/gsm_04_08_utils.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/openbsc/src/gsm_04_08_utils.c b/openbsc/src/gsm_04_08_utils.c index c9cbd5c34..47ec8ab0e 100644 --- a/openbsc/src/gsm_04_08_utils.c +++ b/openbsc/src/gsm_04_08_utils.c @@ -32,6 +32,8 @@ #include <openbsc/debug.h> #include <openbsc/gsm_04_08.h> #include <openbsc/transaction.h> +#include <openbsc/paging.h> +#include <openbsc/signal.h> #define GSM48_ALLOC_SIZE 1024 #define GSM48_ALLOC_HEADROOM 128 @@ -413,3 +415,45 @@ int send_siemens_mrpci(struct gsm_lchan *lchan, return rsl_siemens_mrpci(lchan, &mrpci); } +int gsm48_paging_extract_mi(struct msgb *msg, char *mi_string, u_int8_t *mi_type) +{ + struct gsm48_hdr *gh = msgb_l3(msg); + u_int8_t *classmark2_lv = gh->data + 1; + u_int8_t *mi_lv = gh->data + 2 + *classmark2_lv; + *mi_type = mi_lv[1] & GSM_MI_TYPE_MASK; + + return gsm48_mi_to_string(mi_string, GSM48_MI_SIZE, mi_lv+1, *mi_lv); +} + +int gsm48_handle_paging_resp(struct msgb *msg, struct gsm_subscriber *subscr) +{ + struct gsm_bts *bts = msg->lchan->ts->trx->bts; + struct gsm48_hdr *gh = msgb_l3(msg); + u_int8_t *classmark2_lv = gh->data + 1; + struct paging_signal_data sig_data; + + if (is_siemens_bts(bts)) + send_siemens_mrpci(msg->lchan, classmark2_lv); + + if (!msg->lchan->subscr) { + msg->lchan->subscr = subscr; + } else if (msg->lchan->subscr != subscr) { + DEBUGP(DRR, "<- Channel already owned by someone else?\n"); + subscr_put(subscr); + return -EINVAL; + } else { + DEBUGP(DRR, "<- Channel already owned by us\n"); + subscr_put(subscr); + subscr = msg->lchan->subscr; + } + + sig_data.subscr = subscr; + sig_data.bts = msg->lchan->ts->trx->bts; + sig_data.lchan = msg->lchan; + + dispatch_signal(SS_PAGING, S_PAGING_COMPLETED, &sig_data); + + /* Stop paging on the bts we received the paging response */ + paging_request_stop(msg->trx->bts, subscr, msg->lchan); + return 0; +} |