diff options
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-05-02 15:55:22 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-05-02 16:30:10 +0200
commit3a9c52a5dc8a625b916193b7bea90254af0e04f1 (patch)
parentc6580c5b2c11ca6bbc22676866c5cfe4dc36596f (diff)
paging: change subscr_paging_cb() into subscr_rx_paging_response()
Remove one layer of callback indirection in paging. When a paging response arrives, we always want to first secure the connection, thus a fixed subscr_rx_paging_response() function is more appropriate and avoids having to store a cbfn. The actual actions to be taken upon successful paging are of course still in callback functions stored with each subscriber.
2 files changed, 7 insertions, 10 deletions
diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h
index 045e9110a..86ecafd77 100644
--- a/openbsc/include/openbsc/gsm_subscriber.h
+++ b/openbsc/include/openbsc/gsm_subscriber.h
@@ -140,6 +140,8 @@ bool subscr_authorized(struct gsm_subscriber *subsc);
struct subscr_request *subscr_request_conn(struct gsm_subscriber *subscr,
gsm_cbfn *cbfn, void *param);
void subscr_remove_request(struct subscr_request *req);
+int subscr_rx_paging_response(struct msgb *msg,
+ struct gsm_subscriber_connection *conn);
/* internal */
struct gsm_subscriber *subscr_alloc(void);
diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c
index 1901ea29b..46b6b03eb 100644
--- a/openbsc/src/libmsc/gsm_subscriber.c
+++ b/openbsc/src/libmsc/gsm_subscriber.c
@@ -121,23 +121,18 @@ static int subscr_paging_sec_cb(unsigned int hooknum, unsigned int event,
return rc;
-static int subscr_paging_cb(unsigned int hooknum, unsigned int event,
- struct msgb *msg, void *data, void *param)
+int subscr_rx_paging_response(struct msgb *msg,
+ struct gsm_subscriber_connection *conn)
- struct gsm_subscriber_connection *conn = data;
struct gsm48_hdr *gh;
struct gsm48_pag_resp *pr;
- /* Non-success implies a problem, dispatch directly */
- if (event != GSM_PAGING_SUCCEEDED)
- return subscr_paging_dispatch(hooknum, event, msg, data, param);
- /* Get paging response */
+ /* Get key_seq from Paging Response headers */
gh = msgb_l3(msg);
pr = (struct gsm48_pag_resp *)gh->data;
- /* We _really_ have a channel, secure it now ! */
- return gsm48_secure_channel(conn, pr->key_seq, subscr_paging_sec_cb, param);
+ /* Secure the connection */
+ return gsm48_secure_channel(conn, pr->key_seq, subscr_paging_sec_cb, NULL);
int msc_paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,