diff options
author | Sylvain Munaut <tnt@246tNt.com> | 2010-12-01 23:04:03 +0100 |
---|---|---|
committer | Sylvain Munaut <tnt@246tNt.com> | 2010-12-01 23:04:26 +0100 |
commit | 8a31a3fcee7199f5e665b47993e82732d22d4147 (patch) | |
tree | 43519b40a9a590933a84f4db62a6373cbc38703f | |
parent | 5a86e06eb3b8747da2aa8548a9547d219c64de64 (diff) |
paging: Dispatch the SS_PAGING signals at the MSC code level
This way the channel is fully ready for use.
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
-rw-r--r-- | openbsc/src/gsm_04_08_utils.c | 7 | ||||
-rw-r--r-- | openbsc/src/gsm_subscriber.c | 13 | ||||
-rw-r--r-- | openbsc/src/paging.c | 7 |
3 files changed, 13 insertions, 14 deletions
diff --git a/openbsc/src/gsm_04_08_utils.c b/openbsc/src/gsm_04_08_utils.c index b63293389..350c69b7a 100644 --- a/openbsc/src/gsm_04_08_utils.c +++ b/openbsc/src/gsm_04_08_utils.c @@ -283,7 +283,6 @@ int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn, 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); @@ -300,14 +299,8 @@ int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn, subscr = conn->subscr; } - sig_data.subscr = subscr; - sig_data.bts = conn->bts; - sig_data.conn = 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(conn->bts, subscr, conn, msg); return 0; diff --git a/openbsc/src/gsm_subscriber.c b/openbsc/src/gsm_subscriber.c index bd76faec7..ed76e453b 100644 --- a/openbsc/src/gsm_subscriber.c +++ b/openbsc/src/gsm_subscriber.c @@ -72,12 +72,25 @@ static int subscr_paging_dispatch(unsigned int hooknum, unsigned int event, struct msgb *msg, void *data, void *param) { struct subscr_request *request; + struct gsm_subscriber_connection *conn = data; struct gsm_subscriber *subscr = param; + struct paging_signal_data sig_data; /* There is no request anymore... */ if (llist_empty(&subscr->requests)) return -1; + /* Dispatch signal */ + sig_data.subscr = subscr; + sig_data.bts = conn ? conn->bts : NULL; + sig_data.conn = conn; + dispatch_signal( + SS_PAGING, + event == GSM_PAGING_SUCCEEDED ? + S_PAGING_SUCCEEDED : S_PAGING_EXPIRED, + &sig_data + ); + /* * FIXME: What to do with paging requests coming during * this callback? We must be sure to not start paging when diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c index 70f378a21..06e6860f8 100644 --- a/openbsc/src/paging.c +++ b/openbsc/src/paging.c @@ -251,16 +251,11 @@ static int paging_pending_request(struct gsm_bts_paging_state *bts, static void paging_T3113_expired(void *data) { struct gsm_paging_request *req = (struct gsm_paging_request *)data; - struct paging_signal_data sig_data; void *cbfn_param; gsm_cbfn *cbfn; LOGP(DPAG, LOGL_INFO, "T3113 expired for request %p (%s)\n", req, req->subscr->imsi); - - sig_data.subscr = req->subscr; - sig_data.bts = req->bts; - sig_data.conn = NULL; /* must be destroyed before calling cbfn, to prevent double free */ counter_inc(req->bts->network->stats.paging.expired); @@ -268,8 +263,6 @@ static void paging_T3113_expired(void *data) cbfn = req->cbfn; paging_remove_request(&req->bts->paging, req); - - dispatch_signal(SS_PAGING, S_PAGING_EXPIRED, &sig_data); if (cbfn) cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED, NULL, NULL, cbfn_param); |