aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openbsc/include/openbsc/gprs_sgsn.h2
-rw-r--r--openbsc/include/openbsc/sgsn.h4
-rw-r--r--openbsc/src/gprs/gprs_subscriber.c84
-rw-r--r--openbsc/src/gprs/sgsn_vty.c37
-rw-r--r--openbsc/tests/sgsn/sgsn_test.c80
5 files changed, 15 insertions, 192 deletions
diff --git a/openbsc/include/openbsc/gprs_sgsn.h b/openbsc/include/openbsc/gprs_sgsn.h
index 7940e1dc1..79df21be0 100644
--- a/openbsc/include/openbsc/gprs_sgsn.h
+++ b/openbsc/include/openbsc/gprs_sgsn.h
@@ -284,8 +284,6 @@ struct sgsn_subscriber_data {
struct gsm_auth_tuple auth_triplets[5];
int auth_triplets_updated;
int error_cause;
- struct osmo_timer_list timer;
- int retries;
enum sgsn_subscriber_proc blocked_by;
};
diff --git a/openbsc/include/openbsc/sgsn.h b/openbsc/include/openbsc/sgsn.h
index 4bd412750..7d3a68c43 100644
--- a/openbsc/include/openbsc/sgsn.h
+++ b/openbsc/include/openbsc/sgsn.h
@@ -7,8 +7,6 @@
#include <osmocom/gprs/gprs_ns.h>
#include <openbsc/gprs_sgsn.h>
-#define SGSN_TIMEOUT_NEVER (-1)
-
struct gprs_gsup_client;
enum sgsn_auth_policy {
@@ -33,8 +31,6 @@ struct sgsn_config {
struct sockaddr_in gsup_server_addr;
int gsup_server_port;
- int subscriber_expiry_timeout;
-
int require_authentication;
int require_update_location;
};
diff --git a/openbsc/src/gprs/gprs_subscriber.c b/openbsc/src/gprs/gprs_subscriber.c
index 5bde6a090..d6d874b0b 100644
--- a/openbsc/src/gprs/gprs_subscriber.c
+++ b/openbsc/src/gprs/gprs_subscriber.c
@@ -89,77 +89,11 @@ static int check_blocking(
static void abort_blocking_procedure(struct gsm_subscriber *subscr)
{
- /* Best effort, stop retries at least */
- subscr->sgsn_data->retries = SGSN_SUBSCR_MAX_RETRIES;
+ /* reset something */
}
-static void sgsn_subscriber_timeout_cb(void *subscr_);
int gprs_subscr_purge(struct gsm_subscriber *subscr);
-void gprs_subscr_stop_timer(struct gsm_subscriber *subscr)
-{
- if (subscr->sgsn_data->timer.data) {
- osmo_timer_del(&subscr->sgsn_data->timer);
- subscr->sgsn_data->timer.cb = NULL;
- OSMO_ASSERT(subscr->sgsn_data->timer.data == subscr);
- subscr->sgsn_data->timer.data = NULL;
- subscr_put(subscr);
- }
-}
-
-void gprs_subscr_start_timer(struct gsm_subscriber *subscr, unsigned seconds)
-{
- if (!subscr->sgsn_data->timer.data) {
- subscr->sgsn_data->timer.cb = sgsn_subscriber_timeout_cb;
- subscr->sgsn_data->timer.data = subscr_get(subscr);
- subscr->sgsn_data->retries = 0;
- }
-
- osmo_timer_schedule(&subscr->sgsn_data->timer, seconds, 0);
-}
-
-static void sgsn_subscriber_timeout_cb(void *subscr_)
-{
- struct gsm_subscriber *subscr = subscr_;
-
- LOGGSUBSCRP(LOGL_INFO, subscr,
- "Expired, deleting subscriber entry\n");
-
- subscr_get(subscr);
-
- /* Check, whether to cleanup immediately */
- if (!(subscr->flags & GPRS_SUBSCRIBER_ENABLE_PURGE) ||
- subscr->sgsn_data->retries >= SGSN_SUBSCR_MAX_RETRIES)
- goto force_cleanup;
-
- /* Send a 'purge MS' message to the HLR */
- if (gprs_subscr_purge(subscr) < 0)
- goto force_cleanup;
-
- /* Purge request has been sent */
-
- /* Check, whether purge is still enabled */
- if (!(subscr->flags & GPRS_SUBSCRIBER_ENABLE_PURGE))
- goto force_cleanup;
-
- /* Make sure this will be tried again if there is no response in time */
- subscr->sgsn_data->retries += 1;
- gprs_subscr_start_timer(subscr, SGSN_SUBSCR_RETRY_INTERVAL);
- subscr_put(subscr);
- return;
-
-force_cleanup:
- /* Make sure to clear blocking */
- if (check_blocking(subscr, SGSN_SUBSCR_PROC_PURGE))
- subscr->sgsn_data->blocked_by = SGSN_SUBSCR_PROC_NONE;
-
- /* Make sure, the timer is cleaned up */
- subscr->keep_in_ram = 0;
- gprs_subscr_stop_timer(subscr);
- /* The subscr is freed now, if the timer was the last user */
- subscr_put(subscr);
-}
-
static struct sgsn_subscriber_data *sgsn_subscriber_data_alloc(void *ctx)
{
struct sgsn_subscriber_data *sdata;
@@ -185,9 +119,6 @@ struct gsm_subscriber *gprs_subscr_get_or_create(const char *imsi)
if (!subscr->sgsn_data)
subscr->sgsn_data = sgsn_subscriber_data_alloc(subscr);
-
- gprs_subscr_stop_timer(subscr);
-
return subscr;
}
@@ -204,16 +135,12 @@ void gprs_subscr_delete(struct gsm_subscriber *subscr)
subscr->sgsn_data->mm = NULL;
}
- if ((subscr->flags & GPRS_SUBSCRIBER_CANCELLED) ||
- (subscr->flags & GSM_SUBSCRIBER_FIRST_CONTACT)) {
- subscr->keep_in_ram = 0;
- gprs_subscr_stop_timer(subscr);
- } else if (sgsn->cfg.subscriber_expiry_timeout != SGSN_TIMEOUT_NEVER) {
- gprs_subscr_start_timer(subscr, sgsn->cfg.subscriber_expiry_timeout);
- } else {
- subscr->keep_in_ram = 1;
+ if (subscr->flags & GPRS_SUBSCRIBER_ENABLE_PURGE) {
+ gprs_subscr_purge(subscr);
+ subscr->flags &= ~GPRS_SUBSCRIBER_ENABLE_PURGE;
}
+ subscr->keep_in_ram = 0;
subscr_put(subscr);
}
@@ -224,7 +151,6 @@ void gprs_subscr_put_and_cancel(struct gsm_subscriber *subscr)
subscr->flags &= ~GPRS_SUBSCRIBER_ENABLE_PURGE;
gprs_subscr_update(subscr);
-
gprs_subscr_delete(subscr);
}
diff --git a/openbsc/src/gprs/sgsn_vty.c b/openbsc/src/gprs/sgsn_vty.c
index 18d997b00..b4e1150e6 100644
--- a/openbsc/src/gprs/sgsn_vty.c
+++ b/openbsc/src/gprs/sgsn_vty.c
@@ -151,10 +151,6 @@ static int config_write_sgsn(struct vty *vty)
llist_for_each_entry(acl, &g_cfg->imsi_acl, list)
vty_out(vty, " imsi-acl add %s%s", acl->imsi, VTY_NEWLINE);
- if (g_cfg->subscriber_expiry_timeout != SGSN_TIMEOUT_NEVER)
- vty_out(vty, " subscriber-expiry-timeout %d%s",
- g_cfg->subscriber_expiry_timeout, VTY_NEWLINE);
-
return CMD_SUCCESS;
}
@@ -406,7 +402,6 @@ static void subscr_dump_full_vty(struct vty *vty, struct gsm_subscriber *subscr,
char expire_time[200];
struct gsm_auth_tuple *at;
int at_idx;
- struct timeval tv;
vty_out(vty, " ID: %llu, Authorized: %d%s", subscr->id,
subscr->authorized, VTY_NEWLINE);
@@ -452,17 +447,6 @@ static void subscr_dump_full_vty(struct vty *vty, struct gsm_subscriber *subscr,
vty_out(vty, " Expiration Time: %s%s", expire_time, VTY_NEWLINE);
}
- /* print the expiration time if the timer is active */
- if (osmo_timer_pending(&subscr->sgsn_data->timer)) {
- osmo_timer_remaining(&subscr->sgsn_data->timer, NULL, &tv);
- strftime(expire_time, sizeof(expire_time),
- "%a, %d %b %Y %T %z",
- localtime(&subscr->sgsn_data->timer.timeout.tv_sec));
- expire_time[sizeof(expire_time) - 1] = '\0';
- vty_out(vty, " Expires in: %ds (%s)%s",
- (int)tv.tv_sec, expire_time, VTY_NEWLINE);
- }
-
if (subscr->flags)
vty_out(vty, " Flags: %s%s%s%s%s%s",
subscr->flags & GSM_SUBSCRIBER_FIRST_CONTACT ?
@@ -703,25 +687,6 @@ DEFUN(cfg_gsup_remote_port, cfg_gsup_remote_port_cmd,
return CMD_SUCCESS;
}
-DEFUN(cfg_subscriber_expiry_timeout, cfg_subscriber_expiry_timeout_cmd,
- "subscriber-expiry-timeout <0-999999>",
- "Set the expiry time for unused subscriber entries\n"
- "Expiry time in seconds\n")
-{
- g_cfg->subscriber_expiry_timeout = atoi(argv[0]);
-
- return CMD_SUCCESS;
-}
-
-DEFUN(cfg_no_subscriber_expiry_timeout, cfg_no_subscriber_expiry_timeout_cmd,
- "no subscriber-expiry-timeout",
- NO_STR "Set the expiry time for unused subscriber entries\n")
-{
- g_cfg->subscriber_expiry_timeout = atoi(argv[0]);
-
- return CMD_SUCCESS;
-}
-
int sgsn_vty_init(void)
{
install_element_ve(&show_sgsn_cmd);
@@ -748,8 +713,6 @@ int sgsn_vty_init(void)
install_element(SGSN_NODE, &cfg_auth_policy_cmd);
install_element(SGSN_NODE, &cfg_gsup_remote_ip_cmd);
install_element(SGSN_NODE, &cfg_gsup_remote_port_cmd);
- install_element(SGSN_NODE, &cfg_subscriber_expiry_timeout_cmd);
- install_element(SGSN_NODE, &cfg_no_subscriber_expiry_timeout_cmd);
return 0;
}
diff --git a/openbsc/tests/sgsn/sgsn_test.c b/openbsc/tests/sgsn/sgsn_test.c
index 1ae94b0dd..34ad6473f 100644
--- a/openbsc/tests/sgsn/sgsn_test.c
+++ b/openbsc/tests/sgsn/sgsn_test.c
@@ -46,7 +46,6 @@ static struct sgsn_instance sgsn_inst = {
.cfg = {
.gtp_statedir = "./",
.auth_policy = SGSN_AUTH_POLICY_CLOSED,
- .subscriber_expiry_timeout = SGSN_TIMEOUT_NEVER,
},
};
struct sgsn_instance *sgsn = &sgsn_inst;
@@ -218,9 +217,8 @@ static void show_subscrs(FILE *out)
llist_for_each_entry(subscr, &active_subscribers, entry) {
fprintf(out, " Subscriber: %s, "
- "use count: %d, keep: %d, timer: %d\n",
- subscr->imsi, subscr->use_count, subscr->keep_in_ram,
- osmo_timer_pending(&subscr->sgsn_data->timer));
+ "use count: %d\n",
+ subscr->imsi, subscr->use_count);
}
}
@@ -237,7 +235,6 @@ static void test_subscriber(void)
const char *imsi1 = "1234567890";
const char *imsi2 = "9876543210";
const char *imsi3 = "5656565656";
- int saved_expiry_timeout = sgsn->cfg.subscriber_expiry_timeout;
update_subscriber_data_cb = my_dummy_sgsn_update_subscriber_data;
@@ -271,25 +268,12 @@ static void test_subscriber(void)
gprs_subscr_update(s1);
OSMO_ASSERT(last_updated_subscr == s1);
- /* Because of the update, it won't be freed on delete now */
+ /* There is no subscriber cache. Verify it */
gprs_subscr_delete(s1);
+ s1 = NULL;
sfound = gprs_subscr_get_by_imsi(imsi1);
- OSMO_ASSERT(sfound != NULL);
- s1 = sfound;
+ OSMO_ASSERT(sfound == NULL);
- /* Cancel it, so that delete will free it.
- * Refcount it to make sure s1 won't be freed here */
- last_updated_subscr = NULL;
- gprs_subscr_put_and_cancel(subscr_get(s1));
- OSMO_ASSERT(last_updated_subscr == s1);
-
- /* Cancelled entries are still being found */
- assert_subscr(s1, imsi1);
-
- /* Free entry 1 (GPRS_SUBSCRIBER_CANCELLED is set) */
- gprs_subscr_delete(s1);
- s1 = NULL;
- OSMO_ASSERT(gprs_subscr_get_by_imsi(imsi1) == NULL);
assert_subscr(s2, imsi2);
assert_subscr(s3, imsi3);
@@ -301,24 +285,9 @@ static void test_subscriber(void)
assert_subscr(s3, imsi3);
/* Try to delete entry 3 */
- OSMO_ASSERT(sgsn->cfg.subscriber_expiry_timeout == SGSN_TIMEOUT_NEVER);
gprs_subscr_delete(s3);
- assert_subscr(s3, imsi3);
- /* Process timeouts, this shouldn't delete s3 (SGSN_TIMEOUT_NEVER) */
- osmo_timers_update();
- assert_subscr(s3, imsi3);
- s3 = subscr_get(s3);
-
- /* Free entry 3 (TIMEOUT == 0) */
- sgsn->cfg.subscriber_expiry_timeout = 0;
- gprs_subscr_delete(s3);
- assert_subscr(s3, imsi3);
- /* Process timeouts, this should delete s3 */
- osmo_timers_update();
- OSMO_ASSERT(gprs_subscr_get_by_imsi(imsi1) == NULL);
- OSMO_ASSERT(gprs_subscr_get_by_imsi(imsi2) == NULL);
+ s3 = NULL;
OSMO_ASSERT(gprs_subscr_get_by_imsi(imsi3) == NULL);
- sgsn->cfg.subscriber_expiry_timeout = saved_expiry_timeout;
OSMO_ASSERT(llist_empty(&active_subscribers));
@@ -1053,18 +1022,6 @@ int my_subscr_request_auth_info(struct sgsn_mm_ctx *mmctx) {
return 0;
};
-static void cleanup_subscr_by_imsi(const char *imsi)
-{
- struct gsm_subscriber *subscr;
-
- subscr = gprs_subscr_get_by_imsi(imsi);
- OSMO_ASSERT(subscr != NULL);
- subscr->keep_in_ram = 0;
- subscr_put(subscr);
- subscr = gprs_subscr_get_by_imsi(imsi);
- OSMO_ASSERT(subscr == NULL);
-}
-
static void test_gmm_attach_subscr(void)
{
const enum sgsn_auth_policy saved_auth_policy = sgsn->cfg.auth_policy;
@@ -1076,13 +1033,10 @@ static void test_gmm_attach_subscr(void)
subscr = gprs_subscr_get_or_create("123456789012345");
subscr->authorized = 1;
- subscr->keep_in_ram = 1;
- subscr_put(subscr);
printf("Auth policy 'remote': ");
test_gmm_attach(0);
-
- cleanup_subscr_by_imsi("123456789012345");
+ subscr_put(subscr);
assert_no_subscrs();
sgsn->cfg.auth_policy = saved_auth_policy;
@@ -1111,15 +1065,12 @@ static void test_gmm_attach_subscr_fake_auth(void)
subscr = gprs_subscr_get_or_create("123456789012345");
subscr->authorized = 1;
- subscr->keep_in_ram = 1;
sgsn->cfg.require_authentication = 1;
sgsn->cfg.require_update_location = 1;
- subscr_put(subscr);
printf("Auth policy 'remote', auth faked: ");
test_gmm_attach(0);
-
- cleanup_subscr_by_imsi("123456789012345");
+ subscr_put(subscr);
assert_no_subscrs();
sgsn->cfg.auth_policy = saved_auth_policy;
@@ -1154,16 +1105,13 @@ static void test_gmm_attach_subscr_real_auth(void)
subscr = gprs_subscr_get_or_create("123456789012345");
subscr->authorized = 1;
- subscr->keep_in_ram = 1;
sgsn->cfg.require_authentication = 1;
sgsn->cfg.require_update_location = 1;
- subscr_put(subscr);
printf("Auth policy 'remote', triplet based auth: ");
test_gmm_attach(0);
-
- cleanup_subscr_by_imsi("123456789012345");
+ subscr_put(subscr);
assert_no_subscrs();
sgsn->cfg.auth_policy = saved_auth_policy;
@@ -1249,8 +1197,6 @@ static void test_gmm_attach_subscr_gsup_auth(int retry)
printf("Auth policy 'remote', GSUP based auth: ");
test_gmm_attach(retry);
-
- cleanup_subscr_by_imsi("123456789012345");
assert_no_subscrs();
sgsn->cfg.auth_policy = saved_auth_policy;
@@ -1317,7 +1263,6 @@ static void test_gmm_attach_subscr_real_gsup_auth(int retry)
struct gsm_subscriber *subscr;
sgsn_inst.cfg.auth_policy = SGSN_AUTH_POLICY_REMOTE;
- sgsn_inst.cfg.subscriber_expiry_timeout = 0;
gprs_gsup_client_send_cb = my_gprs_gsup_client_send;
sgsn->gsup_client = talloc_zero(tall_bsc_ctx, struct gprs_gsup_client);
@@ -1331,15 +1276,10 @@ static void test_gmm_attach_subscr_real_gsup_auth(int retry)
test_gmm_attach(retry);
subscr = gprs_subscr_get_by_imsi("123456789012345");
- OSMO_ASSERT(subscr != NULL);
- gprs_subscr_delete(subscr);
-
- osmo_timers_update();
-
+ OSMO_ASSERT(subscr == NULL);
assert_no_subscrs();
sgsn->cfg.auth_policy = saved_auth_policy;
- sgsn_inst.cfg.subscriber_expiry_timeout = SGSN_TIMEOUT_NEVER;
gprs_gsup_client_send_cb = __real_gprs_gsup_client_send;
upd_loc_skip = 0;
auth_info_skip = 0;