aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2017-12-27 19:34:15 +0100
committerHarald Welte <laforge@gnumonks.org>2018-01-05 10:10:35 +0000
commitdcc193d3a6f2325af74b609f6a28c1ad04588a6a (patch)
treea27585a8681fbe95e84c61887a7af528a24a72f5
parenta263bb215b3e159fed6b6f6a1fd15ce8b8cc3176 (diff)
Add control command to expire subscriber
It's equivalent of existing vty command: common part is extracted into shared helper function. Change-Id: I267886b7c79ed6d9c2f34a2e60d2972b7f4f4036
-rw-r--r--include/osmocom/msc/vlr.h2
-rw-r--r--src/libmsc/ctrl_commands.c38
-rw-r--r--src/libmsc/vty_interface_layer3.c5
-rw-r--r--src/libvlr/vlr.c21
4 files changed, 56 insertions, 10 deletions
diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h
index b4bb27f6f..0b61a59f6 100644
--- a/include/osmocom/msc/vlr.h
+++ b/include/osmocom/msc/vlr.h
@@ -279,7 +279,7 @@ void vlr_loc_update_conn_timeout(struct osmo_fsm_inst *fi);
/* tell the VLR that the subscriber connection is gone */
int vlr_subscr_disconnected(struct vlr_subscr *vsub);
-
+bool vlr_subscr_expire(struct vlr_subscr *vsub);
int vlr_subscr_rx_id_resp(struct vlr_subscr *vsub, const uint8_t *mi, size_t mi_len);
int vlr_subscr_rx_auth_resp(struct vlr_subscr *vsub, bool is_r99, bool is_utran,
const uint8_t *res, uint8_t res_len);
diff --git a/src/libmsc/ctrl_commands.c b/src/libmsc/ctrl_commands.c
index c6236ed57..b0625bb0f 100644
--- a/src/libmsc/ctrl_commands.c
+++ b/src/libmsc/ctrl_commands.c
@@ -59,11 +59,49 @@ static int get_subscriber_list(struct ctrl_cmd *cmd, void *d)
}
CTRL_CMD_DEFINE_RO(subscriber_list, "subscriber-list-active-v1");
+CTRL_CMD_DEFINE_WO_NOVRF(sub_expire, "subscriber-expire");
+static int set_sub_expire(struct ctrl_cmd *cmd, void *data)
+{
+ struct vlr_subscr *vsub;
+
+ if (!msc_ctrl_net) {
+ cmd->reply = "MSC CTRL commands not initialized";
+ return CTRL_CMD_ERROR;
+ }
+
+ if (!msc_ctrl_net->vlr) {
+ cmd->reply = "VLR not initialized";
+ return CTRL_CMD_ERROR;
+ }
+
+ vsub = vlr_subscr_find_by_imsi(msc_ctrl_net->vlr, cmd->value);
+ if (!vsub) {
+ LOGP(DCTRL, LOGL_ERROR, "Attempt to expire unknown subscriber IMSI=%s\n", cmd->value);
+ cmd->reply = "IMSI unknown";
+ return CTRL_CMD_ERROR;
+ }
+
+ LOGP(DCTRL, LOGL_NOTICE, "Expiring subscriber IMSI=%s\n", cmd->value);
+
+ if (vlr_subscr_expire(vsub))
+ LOGP(DCTRL, LOGL_NOTICE, "VLR released subscriber %s\n", vlr_subscr_name(vsub));
+
+ if (vsub->use_count > 1)
+ LOGP(DCTRL, LOGL_NOTICE, "Subscriber %s is still in use, should be released soon\n",
+ vlr_subscr_name(vsub));
+
+ vlr_subscr_put(vsub);
+
+ return CTRL_CMD_REPLY;
+}
+
int msc_ctrl_cmds_install(struct gsm_network *net)
{
int rc = 0;
msc_ctrl_net = net;
rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_list);
+ rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_sub_expire);
+
return rc;
}
diff --git a/src/libmsc/vty_interface_layer3.c b/src/libmsc/vty_interface_layer3.c
index 65ba1783e..c7ec586a4 100644
--- a/src/libmsc/vty_interface_layer3.c
+++ b/src/libmsc/vty_interface_layer3.c
@@ -572,12 +572,9 @@ DEFUN(ena_subscr_expire,
return CMD_WARNING;
}
- if (vsub->lu_complete) {
- vsub->lu_complete = false;
- vlr_subscr_put(vsub);
+ if (vlr_subscr_expire(vsub))
vty_out(vty, "%% VLR released subscriber %s%s",
vlr_subscr_name(vsub), VTY_NEWLINE);
- }
if (vsub->use_count > 1)
vty_out(vty, "%% Subscriber %s is still in use,"
diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c
index 73c3f1329..f57df8e75 100644
--- a/src/libvlr/vlr.c
+++ b/src/libvlr/vlr.c
@@ -948,17 +948,28 @@ int vlr_subscr_rx_tmsi_reall_compl(struct vlr_subscr *vsub)
}
}
+bool vlr_subscr_expire(struct vlr_subscr *vsub)
+{
+ if (vsub->lu_complete) {
+ vsub->lu_complete = false;
+ vlr_subscr_put(vsub);
+
+ return true;
+ }
+
+ return false;
+}
+
int vlr_subscr_rx_imsi_detach(struct vlr_subscr *vsub)
{
/* paranoia: should any LU or PARQ FSMs still be running, stop them. */
vlr_subscr_cancel(vsub, GMM_CAUSE_IMPL_DETACHED);
vsub->imsi_detached_flag = true;
- if (vsub->lu_complete) {
- vsub->lu_complete = false;
- /* balancing the get from vlr_lu_compl_fsm_success() */
- vlr_subscr_put(vsub);
- }
+
+ /* balancing the get from vlr_lu_compl_fsm_success() */
+ vlr_subscr_expire(vsub);
+
return 0;
}