diff options
author | Sylvain Munaut <tnt@246tNt.com> | 2009-12-24 00:28:01 +0100 |
---|---|---|
committer | Sylvain Munaut <tnt@246tNt.com> | 2010-01-07 10:49:51 +0100 |
commit | b1b23cf6f782b609fea8dd4253d1fc69305254f3 (patch) | |
tree | 1ab6372fdf2dbb279d752ddbedae641830172ae4 | |
parent | 9fd4a3ed1205457123645cec08143a49a0677604 (diff) |
gsm_04_08: Establish secure channel on LOCATION UPDATE
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
-rw-r--r-- | openbsc/src/gsm_04_08.c | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c index 2f2138b17..3ecaefe26 100644 --- a/openbsc/src/gsm_04_08.c +++ b/openbsc/src/gsm_04_08.c @@ -318,29 +318,50 @@ static void allocate_loc_updating_req(struct gsm_lchan *lchan) struct gsm_loc_updating_operation); } -static int gsm0408_authorize(struct gsm_lchan *lchan, struct msgb *msg) +static int _gsm0408_authorize_sec_cb(unsigned int hooknum, unsigned int event, + struct msgb *msg, void *data, void *param) { - if (authorize_subscriber(lchan->loc_operation, lchan->subscr)) { - int rc; + struct gsm_lchan *lchan = data; + int rc = 0; - db_subscriber_alloc_tmsi(lchan->subscr); - release_loc_updating_req(lchan); - rc = gsm0408_loc_upd_acc(msg->lchan, lchan->subscr->tmsi); - if (lchan->ts->trx->bts->network->send_mm_info) { - /* send MM INFO with network name */ - rc = gsm48_tx_mm_info(msg->lchan); - } + switch (event) { + case GSM_SECURITY_AUTH_FAILED: + release_loc_updating_req(lchan); + break; - /* call subscr_update after putting the loc_upd_acc - * in the transmit queue, since S_SUBSCR_ATTACHED might - * trigger further action like SMS delivery */ - subscr_update(lchan->subscr, msg->trx->bts, - GSM_SUBSCRIBER_UPDATE_ATTACHED); - /* try to close channel ASAP */ - lchan_auto_release(lchan); - return rc; - } + case GSM_SECURITY_NOAVAIL: + case GSM_SECURITY_SUCCEEDED: + /* We're all good */ + db_subscriber_alloc_tmsi(lchan->subscr); + release_loc_updating_req(lchan); + rc = gsm0408_loc_upd_acc(lchan, lchan->subscr->tmsi); + if (lchan->ts->trx->bts->network->send_mm_info) { + /* send MM INFO with network name */ + rc = gsm48_tx_mm_info(lchan); + } + + /* call subscr_update after putting the loc_upd_acc + * in the transmit queue, since S_SUBSCR_ATTACHED might + * trigger further action like SMS delivery */ + subscr_update(lchan->subscr, lchan->ts->trx->bts, + GSM_SUBSCRIBER_UPDATE_ATTACHED); + /* try to close channel ASAP */ + lchan_auto_release(lchan); + + break; + + default: + rc = -EINVAL; + }; + + return rc; +} + +static int gsm0408_authorize(struct gsm_lchan *lchan, struct msgb *msg) +{ + if (authorize_subscriber(lchan->loc_operation, lchan->subscr)) + return gsm48_secure_channel(lchan, 0, _gsm0408_authorize_sec_cb, NULL); return 0; } |