aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/gprs/gprs_subscriber.c
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-11-28 14:55:25 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-12-24 16:50:30 +0100
commit98a95ac17f701d94d2fa62d91cfe42a5beef4f23 (patch)
treea41eba64f19692721521dc927b258387d9151828 /openbsc/src/gprs/gprs_subscriber.c
parent7921ab1593f45f12588e074ad1280472416ae930 (diff)
sgsn: Add a subscriber based authentication phase
This implements the MAP way of subscriber validation when the MS tries to perform an Attach Request: 1. perform authentication (optionally invoke the sendAuthInfo procedure), starts the Auth & Ciph procedure 2. perform update location 3. insert subscriber data 4. finish the update location 5. Attach Accept / Attach Reject The authentication triplets are used and eventually updated if all of them have been used. This is currently accessible via the VTY interface by the following commands: - update-subscriber imsi IMSI update-auth-info - update-subscriber imsi IMSI update-location-result (ok|ERR-CAUSE) Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/src/gprs/gprs_subscriber.c')
-rw-r--r--openbsc/src/gprs/gprs_subscriber.c91
1 files changed, 62 insertions, 29 deletions
diff --git a/openbsc/src/gprs/gprs_subscriber.c b/openbsc/src/gprs/gprs_subscriber.c
index 16753315c..1f210298f 100644
--- a/openbsc/src/gprs/gprs_subscriber.c
+++ b/openbsc/src/gprs/gprs_subscriber.c
@@ -92,9 +92,18 @@ void gprs_subscr_put_and_cancel(struct gsm_subscriber *subscr)
gprs_subscr_delete(subscr);
}
-int gprs_subscr_query(struct gsm_subscriber *subscr)
+int gprs_subscr_query_auth_info(struct gsm_subscriber *subscr)
{
- /* TODO: Implement remote query to MSC, ... */
+ /* TODO: Implement remote query to HLR, ... */
+
+ LOGMMCTXP(LOGL_INFO, subscr->sgsn_data->mm,
+ "subscriber auth info is not available (remote query NYI)\n");
+ return -ENOTSUP;
+}
+
+int gprs_subscr_location_update(struct gsm_subscriber *subscr)
+{
+ /* TODO: Implement remote query to HLR, ... */
LOGMMCTXP(LOGL_INFO, subscr->sgsn_data->mm,
"subscriber data is not available (remote query NYI)\n");
@@ -105,56 +114,80 @@ void gprs_subscr_update(struct gsm_subscriber *subscr)
{
LOGMMCTXP(LOGL_DEBUG, subscr->sgsn_data->mm, "Updating subscriber data\n");
- subscr->flags &= ~GPRS_SUBSCRIBER_UPDATE_PENDING;
+ subscr->flags &= ~GPRS_SUBSCRIBER_UPDATE_LOCATION_PENDING;
+ subscr->flags &= ~GSM_SUBSCRIBER_FIRST_CONTACT;
+
+ sgsn_update_subscriber_data(subscr->sgsn_data->mm, subscr);
+}
+
+void gprs_subscr_update_auth_info(struct gsm_subscriber *subscr)
+{
+ LOGMMCTXP(LOGL_DEBUG, subscr->sgsn_data->mm,
+ "Updating subscriber authentication info\n");
+
+ subscr->flags &= ~GPRS_SUBSCRIBER_UPDATE_AUTH_INFO_PENDING;
subscr->flags &= ~GSM_SUBSCRIBER_FIRST_CONTACT;
sgsn_update_subscriber_data(subscr->sgsn_data->mm, subscr);
}
-int gprs_subscr_request_update(struct sgsn_mm_ctx *mmctx)
+struct gsm_subscriber *gprs_subscr_get_or_create_by_mmctx(struct sgsn_mm_ctx *mmctx)
{
struct gsm_subscriber *subscr = NULL;
- int need_update = 0;
- int rc;
- LOGMMCTXP(LOGL_DEBUG, mmctx, "Requesting subscriber data update\n");
+ if (mmctx->subscr)
+ return subscr_get(mmctx->subscr);
- if (mmctx->subscr) {
- subscr = subscr_get(mmctx->subscr);
- } else if (mmctx->imsi[0]) {
+ if (mmctx->imsi[0])
subscr = gprs_subscr_get_by_imsi(mmctx->imsi);
- need_update = 1;
- }
if (!subscr) {
subscr = gprs_subscr_get_or_create(mmctx->imsi);
subscr->flags |= GSM_SUBSCRIBER_FIRST_CONTACT;
- need_update = 1;
}
if (strcpy(subscr->equipment.imei, mmctx->imei) != 0) {
strncpy(subscr->equipment.imei, mmctx->imei, GSM_IMEI_LENGTH-1);
subscr->equipment.imei[GSM_IMEI_LENGTH-1] = 0;
- need_update = 1;
}
- if (subscr->lac != mmctx->ra.lac) {
+ if (subscr->lac != mmctx->ra.lac)
subscr->lac = mmctx->ra.lac;
- need_update = 1;
- }
- if (need_update) {
- subscr->flags |= GPRS_SUBSCRIBER_UPDATE_PENDING;
- if (!mmctx->subscr) {
- subscr->sgsn_data->mm = mmctx;
- mmctx->subscr = subscr_get(subscr);
- }
+ subscr->sgsn_data->mm = mmctx;
+ mmctx->subscr = subscr_get(subscr);
- rc = gprs_subscr_query(subscr);
- subscr_put(subscr);
- return rc;
- }
- gprs_subscr_update(subscr);
+ return subscr;
+}
+
+int gprs_subscr_request_update_location(struct sgsn_mm_ctx *mmctx)
+{
+ struct gsm_subscriber *subscr = NULL;
+ int rc;
+
+ LOGMMCTXP(LOGL_DEBUG, mmctx, "Requesting subscriber data update\n");
+
+ subscr = gprs_subscr_get_or_create_by_mmctx(mmctx);
+
+ subscr->flags |= GPRS_SUBSCRIBER_UPDATE_LOCATION_PENDING;
+
+ rc = gprs_subscr_location_update(subscr);
+ subscr_put(subscr);
+ return rc;
+}
+
+int gprs_subscr_request_auth_info(struct sgsn_mm_ctx *mmctx)
+{
+ struct gsm_subscriber *subscr = NULL;
+ int rc;
+
+ LOGMMCTXP(LOGL_DEBUG, mmctx, "Requesting subscriber authentication info\n");
+
+ subscr = gprs_subscr_get_or_create_by_mmctx(mmctx);
+
+ subscr->flags |= GPRS_SUBSCRIBER_UPDATE_AUTH_INFO_PENDING;
+
+ rc = gprs_subscr_query_auth_info(subscr);
subscr_put(subscr);
- return 0;
+ return rc;
}