Add subscriber delete command
diff mbox

Message ID 1408906587-4485-1-git-send-email-meskio@sindominio.net
State Accepted
Headers show

Commit Message

Ruben Pollan Aug. 24, 2014, 6:56 p.m. UTC
---
 openbsc/include/openbsc/gsm_subscriber.h  |  1 +
 openbsc/src/libbsc/gsm_subscriber_base.c  |  2 +-
 openbsc/src/libmsc/vty_interface_layer3.c | 24 +++++++++++++++++++++++-
 3 files changed, 25 insertions(+), 2 deletions(-)

Comments

Ruben Pollan Aug. 24, 2014, 7:02 p.m. UTC | #1
This patch comes from some needs of rhizmoatica. It looks good in our tests, but 
today it's my first time looking at openbsc code and I might miss something.

Cheers.
Holger Freyther Aug. 31, 2014, 10:42 a.m. UTC | #2
On Sun, Aug 24, 2014 at 02:02:16PM -0500, Ruben Pollan wrote:

Hi!

> This patch comes from some needs of rhizmoatica. It looks good in our tests, but 
> today it's my first time looking at openbsc code and I might miss something.

sorry, I intendted to reply right-away and then had to rush and
dropped the ball. To make sure your feature continue to work you
should definately add an end-to-end test.

There is one technical issue. The subscriber record is reference
counted. So if you free the memory while someobody else is using
it you will crash.

Third, for machine to machine interaction we have the control
interface which already has a command to delete the subscriber.
Please have a look at

 src/libmsc/ctrl_commands.c:set_subscriber_delete


cheers
	holger
Ruben Pollan Aug. 31, 2014, 10:11 p.m. UTC | #3
Quoting Holger Hans Peter Freyther (2014-08-31 05:42:56)
> On Sun, Aug 24, 2014 at 02:02:16PM -0500, Ruben Pollan wrote:
> 
> Hi!
> 
> > This patch comes from some needs of rhizmoatica. It looks good in our tests, but 
> > today it's my first time looking at openbsc code and I might miss something.
> 
> sorry, I intendted to reply right-away and then had to rush and
> dropped the ball. To make sure your feature continue to work you
> should definately add an end-to-end test.
> 
> There is one technical issue. The subscriber record is reference
> counted. So if you free the memory while someobody else is using
> it you will crash.
> 
> Third, for machine to machine interaction we have the control
> interface which already has a command to delete the subscriber.
> Please have a look at
> 
>  src/libmsc/ctrl_commands.c:set_subscriber_delete

It makes sense, I just fixed. The new patch comes in a following email.

Thanks for the review.

Patch
diff mbox

diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h
index 7aae4c3..120111b 100644
--- a/openbsc/include/openbsc/gsm_subscriber.h
+++ b/openbsc/include/openbsc/gsm_subscriber.h
@@ -101,6 +101,7 @@  int subscr_pending_kick(struct gsm_subscriber *subscr);
 
 char *subscr_name(struct gsm_subscriber *subscr);
 
+void subscr_free(struct gsm_subscriber *subscr);
 int subscr_purge_inactive(struct gsm_network *net);
 void subscr_update_from_db(struct gsm_subscriber *subscr);
 void subscr_expire(struct gsm_network *net);
diff --git a/openbsc/src/libbsc/gsm_subscriber_base.c b/openbsc/src/libbsc/gsm_subscriber_base.c
index 5e00443..2b31e95 100644
--- a/openbsc/src/libbsc/gsm_subscriber_base.c
+++ b/openbsc/src/libbsc/gsm_subscriber_base.c
@@ -66,7 +66,7 @@  struct gsm_subscriber *subscr_alloc(void)
 	return s;
 }
 
-static void subscr_free(struct gsm_subscriber *subscr)
+void subscr_free(struct gsm_subscriber *subscr)
 {
 	llist_del(&subscr->entry);
 	talloc_free(subscr);
diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c
index 064eca9..6b53f65 100644
--- a/openbsc/src/libmsc/vty_interface_layer3.c
+++ b/openbsc/src/libmsc/vty_interface_layer3.c
@@ -465,7 +465,28 @@  DEFUN(subscriber_ussd_notify,
 	return CMD_SUCCESS;
 }
 
-DEFUN(ena_subscr_authorizde,
+DEFUN(ena_subscr_delete,
+      ena_subscr_delete_cmd,
+      "subscriber " SUBSCR_TYPES " ID delete",
+	SUBSCR_HELP "Delete subscriber in HLR\n")
+{
+	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;
+	}
+
+	db_subscriber_delete(subscr);
+	subscr_free(subscr);
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(ena_subscr_authorized,
       ena_subscr_authorized_cmd,
       "subscriber " SUBSCR_TYPES " ID authorized (0|1)",
 	SUBSCR_HELP "(De-)Authorize subscriber in HLR\n"
@@ -982,6 +1003,7 @@  int bsc_vty_init_extra(void)
 	install_element_ve(&show_stats_cmd);
 	install_element_ve(&show_smsqueue_cmd);
 
+	install_element(ENABLE_NODE, &ena_subscr_delete_cmd);
 	install_element(ENABLE_NODE, &ena_subscr_name_cmd);
 	install_element(ENABLE_NODE, &ena_subscr_extension_cmd);
 	install_element(ENABLE_NODE, &ena_subscr_authorized_cmd);