diff options
Diffstat (limited to 'src/libmsc')
-rw-r--r-- | src/libmsc/gsm_subscriber.c | 14 | ||||
-rw-r--r-- | src/libmsc/msc_vty.c | 20 |
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 |