Message ID | 1408906587-4485-1-git-send-email-meskio@sindominio.net |
---|---|
State | Accepted |
Headers | show |
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.
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
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.
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);