[libpri-commits] rmudgett: branch rmudgett/link_q931 r2040 - /team/rmudgett/link_q931/

SVN commits to the libpri project libpri-commits at lists.digium.com
Fri Oct 15 21:55:29 CDT 2010


Author: rmudgett
Date: Fri Oct 15 21:55:25 2010
New Revision: 2040

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=2040
Log:
* Destroy NT PTMP global call records on removed TEI.  Avoid a stale
pointer crash.

* Add protection from inappropriate creation of broadcast TEI call
records.

* Add some notes about RESTART message support.

Modified:
    team/rmudgett/link_q931/pri_q931.h
    team/rmudgett/link_q931/q931.c

Modified: team/rmudgett/link_q931/pri_q931.h
URL: http://svnview.digium.com/svn/libpri/team/rmudgett/link_q931/pri_q931.h?view=diff&rev=2040&r1=2039&r2=2040
==============================================================================
--- team/rmudgett/link_q931/pri_q931.h (original)
+++ team/rmudgett/link_q931/pri_q931.h Fri Oct 15 21:55:25 2010
@@ -450,8 +450,6 @@
 
 extern int maintenance_service(struct pri *pri, int span, int channel, int changestatus);
 
-extern int maintenance_service_ack(struct pri *pri, q931_call *call);
-
 
 /* Q.SIG specific */
 #define QSIG_IE_TRANSIT_COUNT		0x31

Modified: team/rmudgett/link_q931/q931.c
URL: http://svnview.digium.com/svn/libpri/team/rmudgett/link_q931/q931.c?view=diff&rev=2040&r1=2039&r2=2040
==============================================================================
--- team/rmudgett/link_q931/q931.c (original)
+++ team/rmudgett/link_q931/q931.c Fri Oct 15 21:55:25 2010
@@ -3947,6 +3947,7 @@
 static struct q931_call *q931_getcall(struct pri *link, int cr)
 {
 	struct q931_call *cur;
+	struct pri *ctrl;
 
 	cur = q931_find_call(link, cr);
 	if (cur) {
@@ -3954,6 +3955,14 @@
 	}
 	if (cr == Q931_DUMMY_CALL_REFERENCE) {
 		/* Do not create new dummy call records. */
+		return NULL;
+	}
+	ctrl = PRI_MASTER(link);
+	if (link->tei == Q921_TEI_GROUP
+		&& BRI_NT_PTMP(ctrl)) {
+		/* Do not create NT PTMP broadcast call records here. */
+		pri_error(ctrl,
+			"NT PTMP cannot create call record for cref %d on the broadcast TEI.\n", cr);
 		return NULL;
 	}
 
@@ -4494,7 +4503,7 @@
 	*mhb = mh;
 }
 
-static int q931_xmit(struct pri *link, q931_h *h, int len, int cr, int uiframe)
+static void q931_xmit(struct pri *link, q931_h *h, int len, int cr, int uiframe)
 {
 	struct pri *ctrl;
 
@@ -4503,6 +4512,10 @@
 	ctrl->q931_txcount++;
 #endif
 	if (uiframe) {
+		if (link->tei != Q921_TEI_GROUP) {
+			pri_error(ctrl, "Huh?! Attempting to send UI-frame on TEI %d\n", link->tei);
+			return;
+		}
 		q921_transmit_uiframe(link, h, len);
 		if (ctrl->debug & PRI_DEBUG_Q931_DUMP) {
 			/*
@@ -4525,7 +4538,6 @@
 		}
 		q921_transmit_iframe(link, h, len, cr);
 	}
-	return 0;
 }
 
 /*!
@@ -4638,7 +4650,7 @@
 
 static int maintenance_service_ies[] = { Q931_IE_CHANGE_STATUS, Q931_CHANNEL_IDENT, -1 };
 
-int maintenance_service_ack(struct pri *ctrl, q931_call *c)
+static int maintenance_service_ack(struct pri *ctrl, q931_call *c)
 {
 	int pd = MAINTENANCE_PROTOCOL_DISCRIMINATOR_1;
 	int mt = ATT_SERVICE_ACKNOWLEDGE;
@@ -4650,13 +4662,15 @@
 	return send_message(ctrl, c, (pd << 8) | mt, maintenance_service_ies);
 }
 
+/*!
+ * \note Maintenance service messages only supported in PRI mode.
+ */
 int maintenance_service(struct pri *ctrl, int span, int channel, int changestatus)
 {
 	struct q931_call *c;
 	int pd = MAINTENANCE_PROTOCOL_DISCRIMINATOR_1;
 	int mt = ATT_SERVICE;
 
-/* BUGBUG need a link */
 	c = q931_getcall(ctrl, 0 | Q931_CALL_REFERENCE_FLAG);
 	if (!c) {
 		return -1;
@@ -5153,11 +5167,36 @@
 
 static int restart_ies[] = { Q931_CHANNEL_IDENT, Q931_RESTART_INDICATOR, -1 };
 
+/*!
+ * \brief Send the RESTART message to the peer.
+ *
+ * \param ctrl D channel controller.
+ * \param channel Encoded channel id to use.
+ *
+ * \note
+ * Sending RESTART in NT PTMP mode is not supported at the
+ * present time.
+ *
+ * \note
+ * NT PTMP should broadcast the RESTART if there is a TEI
+ * allocated.  Otherwise it should immediately ACK the RESTART
+ * itself to avoid the T316 timeout delay (2 minutes) since
+ * there might not be anything connected.  The broadcast could
+ * be handled in a similar manner to the broadcast SETUP.
+ *
+ * \todo Need to implement T316 to protect against missing
+ * RESTART_ACKNOWLEDGE and STATUS messages.
+ *
+ * \todo NT PTMP mode should implement some protection from
+ * receiving a RESTART on channels in use by another TEI.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
 int q931_restart(struct pri *ctrl, int channel)
 {
 	struct q931_call *c;
 
-/* BUGBUG need a link */
 	c = q931_getcall(ctrl, 0 | Q931_CALL_REFERENCE_FLAG);
 	if (!c)
 		return -1;
@@ -8580,10 +8619,6 @@
 		 * removed TEI.
 		 */
 		for (cur = *ctrl->callpool; cur; cur = cur->next) {
-			if (!(cur->cr & ~Q931_CALL_REFERENCE_FLAG)) {
-				/* Don't do anything on the global call reference call record. */
-				continue;
-			}
 			if (cur->outboundbroadcast) {
 				/* Does this master call have a subcall on the link that went down? */
 				call = NULL;
@@ -8603,6 +8638,16 @@
 				continue;
 			} else {
 				call = cur;
+			}
+
+			if (!(cur->cr & ~Q931_CALL_REFERENCE_FLAG)) {
+				/* Simply destroy the global call reference call record. */
+				if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
+					pri_message(ctrl, "TEI=%d Destroying global call record\n",
+						link->tei);
+				}
+				q931_destroycall(ctrl, call);
+				continue;
 			}
 
 			/*




More information about the libpri-commits mailing list