aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmsc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmsc')
-rw-r--r--src/libmsc/gsm_subscriber.c14
-rw-r--r--src/libmsc/msc_vty.c20
2 files changed, 33 insertions, 1 deletions
diff --git a/src/libmsc/gsm_subscriber.c b/src/libmsc/gsm_subscriber.c
index a013e0eb6..b3d38d1e8 100644
--- a/src/libmsc/gsm_subscriber.c
+++ b/src/libmsc/gsm_subscriber.c
@@ -76,7 +76,10 @@ int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
return -EINVAL;
}
- if (event == GSM_PAGING_SUCCEEDED)
+ osmo_timer_del(&vsub->cs.paging_response_timer);
+
+ if (event == GSM_PAGING_SUCCEEDED
+ || event == GSM_PAGING_EXPIRED)
msc_stop_paging(vsub);
/* Inform parts of the system we don't know */
@@ -126,6 +129,12 @@ int msc_paging_request(struct vlr_subscr *vsub)
return -EINVAL;
}
+static void paging_response_timer_cb(void *data)
+{
+ struct vlr_subscr *vsub = data;
+ subscr_paging_dispatch(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED, NULL, NULL, vsub);
+}
+
/*! \brief Start a paging request for vsub, call cbfn(param) when done.
* \param vsub subscriber to page.
* \param cbfn function to call when the conn is established.
@@ -138,6 +147,7 @@ struct subscr_request *subscr_request_conn(struct vlr_subscr *vsub,
{
int rc;
struct subscr_request *request;
+ struct gsm_network *net = vsub->vlr->user_ctx;
/* Start paging.. we know it is async so we can do it before */
if (!vsub->cs.is_paging) {
@@ -152,6 +162,8 @@ struct subscr_request *subscr_request_conn(struct vlr_subscr *vsub,
/* reduced on the first paging callback */
vlr_subscr_get(vsub);
vsub->cs.is_paging = true;
+ osmo_timer_setup(&vsub->cs.paging_response_timer, paging_response_timer_cb, vsub);
+ osmo_timer_schedule(&vsub->cs.paging_response_timer, net->paging_response_timer, 0);
} else {
LOGP(DMM, LOGL_DEBUG, "Subscriber %s already paged.\n",
vlr_subscr_name(vsub));
diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c
index 14ad19ec1..c1c9f6bcf 100644
--- a/src/libmsc/msc_vty.c
+++ b/src/libmsc/msc_vty.c
@@ -109,6 +109,22 @@ DEFUN(cfg_msc_auth_tuple_reuse_on_error, cfg_msc_auth_tuple_reuse_on_error_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_msc_paging_response_timer, cfg_msc_paging_response_timer_cmd,
+ "paging response-timer (default|<1-65535>)",
+ "Configure Paging\n"
+ "Set Paging timeout, the minimum time to pass between (unsuccessful) Pagings sent towards"
+ " BSS or RNC\n"
+ "Set to default timeout (" OSMO_STRINGIFY_VAL(MSC_PAGING_RESPONSE_TIMER_DEFAULT) " seconds)\n"
+ "Set paging timeout in seconds\n")
+{
+ struct gsm_network *gsmnet = gsmnet_from_vty(vty);
+ if (!strcmp(argv[1], "default"))
+ gsmnet->paging_response_timer = MSC_PAGING_RESPONSE_TIMER_DEFAULT;
+ else
+ gsmnet->paging_response_timer = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
static int config_write_msc(struct vty *vty)
{
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
@@ -130,6 +146,9 @@ static int config_write_msc(struct vty *vty)
vty_out(vty, " auth-tuple-reuse-on-error 1%s",
VTY_NEWLINE);
+ if (gsmnet->paging_response_timer != MSC_PAGING_RESPONSE_TIMER_DEFAULT)
+ vty_out(vty, " paging response-timer %u%s", gsmnet->paging_response_timer, VTY_NEWLINE);
+
mgcp_client_config_write(vty, " ");
#ifdef BUILD_IU
ranap_iu_vty_config_write(vty, " ");
@@ -186,6 +205,7 @@ void msc_vty_init(struct gsm_network *msc_network)
install_element(MSC_NODE, &cfg_msc_auth_tuple_reuse_on_error_cmd);
install_element(MSC_NODE, &cfg_msc_cs7_instance_a_cmd);
install_element(MSC_NODE, &cfg_msc_cs7_instance_iu_cmd);
+ install_element(MSC_NODE, &cfg_msc_paging_response_timer_cmd);
mgcp_client_vty_init(msc_network, MSC_NODE, &msc_network->mgw.conf);
#ifdef BUILD_IU