From 84b2560da538af9d4a805d152ca34a7d91ae9b0c Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Thu, 28 Mar 2013 16:40:22 +0000 Subject: [PATCH] Fix hole in layer2_persistence option for TE PTMP links. If the network stops responding, according to Q.921 we are supposed to remove the TEI. With the layer2_persistence option enabled, we are supposed to keep trying to bring layer 2 back up. Unfortunately, when the network stops responding, we stopped the restart timer and removed the TEI. As a result, layer 2 does not immediately come back up. * Made not stop the restart timer if we are removing the TEI on the CPE side. Also handle the timer expiration in relevant unassigned TEI states. (closes issue LIBPRI-72) Reported by: Trey Blancher Patches: jira_dahdi_1001_libpri_v1.4.patch (license #5621) patch uploaded by rmudgett git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.4@2315 2fbb986a-6c06-0410-b554-c9c1f0a7f128 --- q921.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/q921.c b/q921.c index d7a83a9..9e902dd 100644 --- a/q921.c +++ b/q921.c @@ -557,7 +557,7 @@ static void kick_start_link(struct q921_link *link) break; case Q921_ASSIGN_AWAITING_TEI: if (ctrl->debug & PRI_DEBUG_Q921_STATE) { - pri_message(ctrl, "Kick starting link when get TEI.\n"); + pri_message(ctrl, "Kick starting link when awaiting TEI.\n"); } q921_setstate(link, Q921_ESTABLISH_AWAITING_TEI); break; @@ -586,6 +586,8 @@ static void restart_timer_expire(void *vlink) link->restart_timer = 0; switch (link->state) { + case Q921_TEI_UNASSIGNED: + case Q921_ASSIGN_AWAITING_TEI: case Q921_TEI_ASSIGNED: /* Try to bring layer 2 up. */ kick_start_link(link); @@ -1911,7 +1913,9 @@ static void q921_mdl_remove(struct q921_link *link) switch (link->state) { case Q921_TEI_ASSIGNED: - restart_timer_stop(link); + if (mdl_free_me) { + restart_timer_stop(link); + } /* XXX: deviation! Since we don't have a UI queue, we just discard our I-queue */ q921_discard_iqueue(link); q921_setstate(link, Q921_TEI_UNASSIGNED);