[svn-commits] rmudgett: branch rmudgett/t312 r2220 - /team/rmudgett/t312/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Feb 25 16:29:46 CST 2011


Author: rmudgett
Date: Fri Feb 25 16:29:41 2011
New Revision: 2220

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=2220
Log:
Cannot use retranstimer for the fake clearing anymore.

Modified:
    team/rmudgett/t312/pri_internal.h
    team/rmudgett/t312/q931.c

Modified: team/rmudgett/t312/pri_internal.h
URL: http://svnview.digium.com/svn/libpri/team/rmudgett/t312/pri_internal.h?view=diff&rev=2220&r1=2219&r2=2220
==============================================================================
--- team/rmudgett/t312/pri_internal.h (original)
+++ team/rmudgett/t312/pri_internal.h Fri Feb 25 16:29:41 2011
@@ -579,6 +579,7 @@
 	int t303_timer;
 	int t303_expirycnt;
 	int t312_timer;
+	int fake_clearing_timer;
 
 	int hangupinitiated;
 	/*! \brief TRUE if we broadcast this call's SETUP message. */

Modified: team/rmudgett/t312/q931.c
URL: http://svnview.digium.com/svn/libpri/team/rmudgett/t312/q931.c?view=diff&rev=2220&r1=2219&r2=2220
==============================================================================
--- team/rmudgett/t312/q931.c (original)
+++ team/rmudgett/t312/q931.c Fri Feb 25 16:29:41 2011
@@ -4193,9 +4193,14 @@
 
 static void cleanup_and_free_call(struct q931_call *cur)
 {
+	struct pri *ctrl;
+
+	ctrl = cur->pri;
+	pri_schedule_del(ctrl, cur->retranstimer);
+	pri_schedule_del(ctrl, cur->hold_timer);
+	pri_schedule_del(ctrl, cur->fake_clearing_timer);
 	stop_t303(cur);
 	stop_t312(cur);
-	pri_schedule_del(cur->pri, cur->retranstimer);
 	pri_call_apdu_queue_cleanup(cur);
 	if (cur->cc.record) {
 		/* Unlink CC associations. */
@@ -4342,6 +4347,12 @@
 				}
 			}
 
+			if (cur->fake_clearing_timer) {
+				/* Ooops!  Upper layer likely just lost a B channel.  Must fix! */
+				pri_error(ctrl, "BAD! Fake clearing timer was still running.  cref:%d\n",
+					cur->cr);
+			}
+
 			/* Master call or normal call destruction. */
 			if (prev)
 				prev->next = cur->next;
@@ -4354,7 +4365,6 @@
 					q931_call_state_str(cur->ourcallstate),
 					q931_call_state_str(cur->peercallstate),
 					q931_hold_state_str(cur->hold_state));
-			pri_schedule_del(ctrl, cur->hold_timer);
 			cleanup_and_free_call(cur);
 			return;
 		}
@@ -5723,31 +5733,40 @@
 
 static int pri_internal_clear(struct q931_call *c);
 
-/* Fake RELEASE for NT-PTMP initiated SETUPs w/o response */
-static void pri_fake_clearing(void *data)
-{
-	struct q931_call *c = data;/* Call is not a subcall call record. */
+/*!
+ * \brief Fake RELEASE for NT-PTMP initiated SETUPs w/o response
+ *
+ * \param param call Call is not a subcall call record.
+ */
+static void pri_fake_clearing(struct q931_call *call)
+{
 	struct pri *ctrl;
 
-	ctrl = c->pri;
+	ctrl = call->pri;
 	if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
-		pri_message(ctrl, "Fake clearing.  cref:%d\n", c->cr);
-	}
-	/*
-	 * We cannot clear the retranstimer id because we are called by t303_expiry also.
-	 * Fortunately, it doesn't matter because pri_internal_clear() will stop it if
-	 * it was actually running.
-	 */
-	//c->retranstimer = 0;
-	if (pri_internal_clear(c) == Q931_RES_HAVEEVENT) {
+		pri_message(ctrl, "Fake clearing.  cref:%d\n", call->cr);
+	}
+	if (pri_internal_clear(call) == Q931_RES_HAVEEVENT) {
 		ctrl->schedev = 1;
 	}
 }
 
+static void pri_fake_clearing_expiry(void *data)
+{
+	struct q931_call *call = data;/* Call is not a subcall call record. */
+
+	call->fake_clearing_timer = 0;
+	pri_fake_clearing(call);
+}
+
 static void pri_create_fake_clearing(struct pri *ctrl, struct q931_call *master)
 {
-	pri_schedule_del(ctrl, master->retranstimer);
-	master->retranstimer = pri_schedule_event(ctrl, 0, pri_fake_clearing, master);
+	if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
+		pri_message(ctrl, "Requesting fake clearing.  cref:%d\n", master->cr);
+	}
+	pri_schedule_del(ctrl, master->fake_clearing_timer);
+	master->fake_clearing_timer = pri_schedule_event(ctrl, 0, pri_fake_clearing_expiry,
+		master);
 }
 
 static void t303_expiry(void *data)
@@ -7028,6 +7047,7 @@
 	}
 	cur->t303_timer = 0;/* T303 should only be on on the master call */
 	cur->t312_timer = 0;/* T312 should only be on on the master call */
+	cur->fake_clearing_timer = 0;/* Fake clearing should only be on on the master call */
 	cur->hold_timer = 0;
 	cur->retranstimer = 0;
 




More information about the svn-commits mailing list