aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-12-28 22:21:55 +0100
committerHarald Welte <laforge@gnumonks.org>2010-12-29 09:13:10 +0100
commit20a6f1ff079c53bf3f7d86f8aa5273b4ede14543 (patch)
tree620ceec3e366b80d270e45c4ec3afc66e2cc0816
parentc6bca864a1bce78081d498dbd16bcaa8f5c7bce7 (diff)
subscr: Make it possible to clear pending requests for a subscriber
-rw-r--r--openbsc/include/openbsc/gsm_subscriber.h1
-rw-r--r--openbsc/src/gsm_subscriber.c15
-rw-r--r--openbsc/src/vty_interface_layer3.c24
3 files changed, 40 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h
index 0f44a101e..134dee4f3 100644
--- a/openbsc/include/openbsc/gsm_subscriber.h
+++ b/openbsc/include/openbsc/gsm_subscriber.h
@@ -89,6 +89,7 @@ struct gsm_subscriber *subscr_active_by_imsi(struct gsm_network *net,
const char *imsi);
int subscr_pending_requests(struct gsm_subscriber *subscr);
+int subscr_pending_clear(struct gsm_subscriber *subscr);
char *subscr_name(struct gsm_subscriber *subscr);
diff --git a/openbsc/src/gsm_subscriber.c b/openbsc/src/gsm_subscriber.c
index 2de951fef..1ab6dc882 100644
--- a/openbsc/src/gsm_subscriber.c
+++ b/openbsc/src/gsm_subscriber.c
@@ -357,3 +357,18 @@ int subscr_pending_requests(struct gsm_subscriber *sub)
return pending;
}
+
+int subscr_pending_clear(struct gsm_subscriber *sub)
+{
+ int deleted = 0;
+ struct subscr_request *req, *tmp;
+
+ llist_for_each_entry_safe(req, tmp, &sub->requests, entry) {
+ subscr_put(req->subscr);
+ llist_del(&req->entry);
+ talloc_free(req);
+ deleted += 1;
+ }
+
+ return deleted;
+}
diff --git a/openbsc/src/vty_interface_layer3.c b/openbsc/src/vty_interface_layer3.c
index 13de49a0e..b90fac036 100644
--- a/openbsc/src/vty_interface_layer3.c
+++ b/openbsc/src/vty_interface_layer3.c
@@ -480,6 +480,29 @@ DEFUN(ena_subscr_extension,
return CMD_SUCCESS;
}
+DEFUN(ena_subscr_clear,
+ ena_subscr_clear_cmd,
+ "subscriber " SUBSCR_TYPES " ID clear-requests",
+ SUBSCR_HELP "Clear the paging requests for this subscriber\n")
+{
+ int del;
+ struct gsm_network *gsmnet = gsmnet_from_vty(vty);
+ struct gsm_subscriber *subscr =
+ get_subscr_by_argv(gsmnet, argv[0], argv[1]);
+
+ if (!subscr) {
+ vty_out(vty, "%% No subscriber found for %s %s%s",
+ argv[0], argv[1], VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ del = subscr_pending_clear(subscr);
+ vty_out(vty, "Cleared %d pending requests.%s", del, VTY_NEWLINE);
+ subscr_put(subscr);
+
+ return CMD_SUCCESS;
+}
+
#define A3A8_ALG_TYPES "(none|xor|comp128v1)"
#define A3A8_ALG_HELP \
"Use No A3A8 algorithm\n" \
@@ -713,6 +736,7 @@ int bsc_vty_init_extra(void)
install_element(ENABLE_NODE, &ena_subscr_extension_cmd);
install_element(ENABLE_NODE, &ena_subscr_authorized_cmd);
install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd);
+ install_element(ENABLE_NODE, &ena_subscr_clear_cmd);
install_element(ENABLE_NODE, &subscriber_purge_cmd);
install_element(ENABLE_NODE, &smsqueue_trigger_cmd);
install_element(ENABLE_NODE, &smsqueue_max_cmd);