aboutsummaryrefslogtreecommitdiffstats
path: root/src/gprs/gprs_sgsn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gprs/gprs_sgsn.c')
-rw-r--r--src/gprs/gprs_sgsn.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/gprs/gprs_sgsn.c b/src/gprs/gprs_sgsn.c
index dc0e7c07..efbae220 100644
--- a/src/gprs/gprs_sgsn.c
+++ b/src/gprs/gprs_sgsn.c
@@ -489,6 +489,17 @@ void sgsn_pdp_ctx_free(struct sgsn_pdp_ctx *pdp)
talloc_free(pdp);
}
+void sgsn_ggsn_ctx_check_echo_timer(struct sgsn_ggsn_ctx *ggc)
+{
+ if (llist_empty(&ggc->pdp_list) || ggc->echo_interval <= 0) {
+ if (osmo_timer_pending(&ggc->echo_timer))
+ osmo_timer_del(&ggc->echo_timer);
+ } else {
+ if (!osmo_timer_pending(&ggc->echo_timer))
+ osmo_timer_schedule(&ggc->echo_timer, ggc->echo_interval, 0);
+ }
+}
+
/* GGSN contexts */
static void echo_timer_cb(void *data)
{
@@ -742,15 +753,14 @@ int sgsn_ggsn_ctx_drop_all_pdp_except(struct sgsn_ggsn_ctx *ggsn, struct sgsn_pd
void sgsn_ggsn_ctx_add_pdp(struct sgsn_ggsn_ctx *ggc, struct sgsn_pdp_ctx *pdp)
{
- if (llist_empty(&ggc->pdp_list) && ggc->echo_interval > 0)
- osmo_timer_schedule(&ggc->echo_timer, ggc->echo_interval, 0);
+ sgsn_ggsn_ctx_check_echo_timer(ggc);
+
llist_add(&pdp->ggsn_list, &ggc->pdp_list);
}
void sgsn_ggsn_ctx_remove_pdp(struct sgsn_ggsn_ctx *ggc, struct sgsn_pdp_ctx *pdp)
{
llist_del(&pdp->ggsn_list);
- if (llist_empty(&ggc->pdp_list) && osmo_timer_pending(&ggc->echo_timer))
- osmo_timer_del(&ggc->echo_timer);
+ sgsn_ggsn_ctx_check_echo_timer(ggc);
if (pdp->destroy_ggsn)
sgsn_ggsn_ctx_free(pdp->ggsn);
pdp->ggsn = NULL;