[svn-commits] rmudgett: tag 1.4.11.5 r2135 - in /tags/1.4.11.5: pri_q931.h q921.c q931.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Nov 17 15:24:25 CST 2010
Author: rmudgett
Date: Wed Nov 17 15:24:21 2010
New Revision: 2135
URL: http://svnview.digium.com/svn/libpri?view=rev&rev=2135
Log:
Merged revision 1991 from
https://origsvn.digium.com/svn/libpri/branches/1.4
..........
r1991 | rmudgett | 2010-09-13 16:21:37 -0500 (Mon, 13 Sep 2010) | 9 lines
PRI links do not retain active calls if the link comes back before T309 expires.
The DL-ESTABLISH confirm event was not passed from Q.921 to Q.931 so Q.931
never cancelled the T309 timer.
Refactored q931_dl_tei_removal() and q931_dl_indication() into
q931_dl_event() to allow the DL-ESTABLISH confirm/indication and
DL-RELEASE confirm/indication events to be passed to Q.931.
..........
Modified:
tags/1.4.11.5/pri_q931.h
tags/1.4.11.5/q921.c
tags/1.4.11.5/q931.c
Modified: tags/1.4.11.5/pri_q931.h
URL: http://svnview.digium.com/svn/libpri/tags/1.4.11.5/pri_q931.h?view=diff&rev=2135&r1=2134&r2=2135
==============================================================================
--- tags/1.4.11.5/pri_q931.h (original)
+++ tags/1.4.11.5/pri_q931.h Wed Nov 17 15:24:21 2010
@@ -494,8 +494,15 @@
void q931_destroycall(struct pri *pri, q931_call *c);
-void q931_dl_tei_removal(struct pri *link);
-void q931_dl_indication(struct pri *link, int event);
+enum Q931_DL_EVENT {
+ Q931_DL_EVENT_NONE,
+ Q931_DL_EVENT_DL_ESTABLISH_IND,
+ Q931_DL_EVENT_DL_ESTABLISH_CONFIRM,
+ Q931_DL_EVENT_DL_RELEASE_IND,
+ Q931_DL_EVENT_DL_RELEASE_CONFIRM,
+ Q931_DL_EVENT_TEI_REMOVAL,
+};
+void q931_dl_event(struct pri *link, enum Q931_DL_EVENT event);
int q931_send_hold(struct pri *ctrl, struct q931_call *call);
int q931_send_hold_ack(struct pri *ctrl, struct q931_call *call);
Modified: tags/1.4.11.5/q921.c
URL: http://svnview.digium.com/svn/libpri/tags/1.4.11.5/q921.c?view=diff&rev=2135&r1=2134&r2=2135
==============================================================================
--- tags/1.4.11.5/q921.c (original)
+++ tags/1.4.11.5/q921.c Wed Nov 17 15:24:21 2010
@@ -215,7 +215,7 @@
case Q921_ESTABLISH_AWAITING_TEI:
q921_discard_iqueue(ctrl);
/* DL-RELEASE indication */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_DOWN);
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_IND);
break;
default:
break;
@@ -671,7 +671,7 @@
q921_mdl_error(ctrl, 'G');
q921_setstate(ctrl, Q921_TEI_ASSIGNED);
/* DL-RELEASE indication */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_DOWN);
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_IND);
}
break;
case Q921_AWAITING_RELEASE:
@@ -682,6 +682,7 @@
} else {
q921_mdl_error(ctrl, 'H');
/* DL-RELEASE confirm */
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_CONFIRM);
q921_setstate(ctrl, Q921_TEI_ASSIGNED);
}
break;
@@ -1280,7 +1281,7 @@
static pri_event * q921_sabme_rx(struct pri *ctrl, q921_h *h)
{
pri_event *res = NULL;
- int delay_q931_dl_indication;
+ enum Q931_DL_EVENT delay_q931_dl_event;
switch (ctrl->q921_state) {
case Q921_TIMER_RECOVERY:
@@ -1293,17 +1294,17 @@
if (ctrl->v_s != ctrl->v_a) {
q921_discard_iqueue(ctrl);
/* DL-ESTABLISH indication */
- delay_q931_dl_indication = 1;
+ delay_q931_dl_event = Q931_DL_EVENT_DL_ESTABLISH_IND;
} else {
- delay_q931_dl_indication = 0;
+ delay_q931_dl_event = Q931_DL_EVENT_NONE;
}
stop_t200(ctrl);
start_t203(ctrl);
ctrl->v_s = ctrl->v_a = ctrl->v_r = 0;
q921_setstate(ctrl, Q921_MULTI_FRAME_ESTABLISHED);
- if (delay_q931_dl_indication) {
+ if (delay_q931_dl_event != Q931_DL_EVENT_NONE) {
/* Delayed because Q.931 could send STATUS messages. */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_UP);
+ q931_dl_event(ctrl, delay_q931_dl_event);
}
break;
case Q921_TEI_ASSIGNED:
@@ -1311,17 +1312,16 @@
q921_clear_exception_conditions(ctrl);
ctrl->v_s = ctrl->v_a = ctrl->v_r = 0;
/* DL-ESTABLISH indication */
- //delay_q931_dl_indication = 1;
+ delay_q931_dl_event = Q931_DL_EVENT_DL_ESTABLISH_IND;
if (PTP_MODE(ctrl)) {
ctrl->ev.gen.e = PRI_EVENT_DCHAN_UP;
res = &ctrl->ev;
}
start_t203(ctrl);
q921_setstate(ctrl, Q921_MULTI_FRAME_ESTABLISHED);
- //if (delay_q931_dl_indication)
- {
+ if (delay_q931_dl_event != Q931_DL_EVENT_NONE) {
/* Delayed because Q.931 could send STATUS messages. */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_UP);
+ q931_dl_event(ctrl, delay_q931_dl_event);
}
break;
case Q921_AWAITING_ESTABLISHMENT:
@@ -1360,7 +1360,7 @@
q921_discard_iqueue(ctrl);
q921_send_ua(ctrl, h->u.p_f);
/* DL-RELEASE indication */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_DOWN);
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_IND);
stop_t200(ctrl);
if (ctrl->q921_state == Q921_MULTI_FRAME_ESTABLISHED)
stop_t203(ctrl);
@@ -1402,20 +1402,21 @@
case Q921_AWAITING_ESTABLISHMENT:
q921_discard_iqueue(ctrl);
/* DL-RELEASE indication */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_DOWN);
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_IND);
stop_t200(ctrl);
q921_setstate(ctrl, Q921_TEI_UNASSIGNED);
break;
case Q921_AWAITING_RELEASE:
q921_discard_iqueue(ctrl);
/* DL-RELEASE confirm */
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_CONFIRM);
stop_t200(ctrl);
q921_setstate(ctrl, Q921_TEI_UNASSIGNED);
break;
case Q921_MULTI_FRAME_ESTABLISHED:
q921_discard_iqueue(ctrl);
/* DL-RELEASE indication */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_DOWN);
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_IND);
stop_t200(ctrl);
stop_t203(ctrl);
q921_setstate(ctrl, Q921_TEI_UNASSIGNED);
@@ -1423,7 +1424,7 @@
case Q921_TIMER_RECOVERY:
q921_discard_iqueue(ctrl);
/* DL-RELEASE indication */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_DOWN);
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_IND);
stop_t200(ctrl);
q921_setstate(ctrl, Q921_TEI_UNASSIGNED);
break;
@@ -1433,7 +1434,7 @@
return;
}
- q931_dl_tei_removal(ctrl);
+ q931_dl_event(ctrl, Q931_DL_EVENT_TEI_REMOVAL);
/*
* Negate the TEI value so debug messages will display a
@@ -1711,7 +1712,7 @@
static pri_event *q921_ua_rx(struct pri *ctrl, q921_h *h)
{
pri_event *res = NULL;
- int delay_q931_dl_indication;
+ enum Q931_DL_EVENT delay_q931_dl_event;
if (ctrl->debug & PRI_DEBUG_Q921_STATE) {
pri_message(ctrl, "TEI=%d Got UA\n", ctrl->tei);
@@ -1733,16 +1734,17 @@
break;
}
- delay_q931_dl_indication = 0;
+ delay_q931_dl_event = Q931_DL_EVENT_NONE;
if (!ctrl->l3initiated) {
if (ctrl->v_s != ctrl->v_a) {
q921_discard_iqueue(ctrl);
/* DL-ESTABLISH indication */
- delay_q931_dl_indication = 1;
+ delay_q931_dl_event = Q931_DL_EVENT_DL_ESTABLISH_IND;
}
} else {
ctrl->l3initiated = 0;
/* DL-ESTABLISH confirm */
+ delay_q931_dl_event = Q931_DL_EVENT_DL_ESTABLISH_CONFIRM;
}
if (PTP_MODE(ctrl)) {
@@ -1756,9 +1758,9 @@
ctrl->v_r = ctrl->v_s = ctrl->v_a = 0;
q921_setstate(ctrl, Q921_MULTI_FRAME_ESTABLISHED);
- if (delay_q931_dl_indication) {
+ if (delay_q931_dl_event != Q931_DL_EVENT_NONE) {
/* Delayed because Q.931 could send STATUS messages. */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_UP);
+ q931_dl_event(ctrl, delay_q931_dl_event);
}
break;
case Q921_AWAITING_RELEASE:
@@ -1766,6 +1768,7 @@
q921_mdl_error(ctrl, 'D');
} else {
/* DL-RELEASE confirm */
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_CONFIRM);
stop_t200(ctrl);
q921_setstate(ctrl, Q921_TEI_ASSIGNED);
}
@@ -2181,7 +2184,7 @@
q921_discard_iqueue(ctrl);
/* DL-RELEASE indication */
- q931_dl_indication(ctrl, PRI_EVENT_DCHAN_DOWN);
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_IND);
stop_t200(ctrl);
q921_setstate(ctrl, Q921_TEI_ASSIGNED);
q921_restart_ptp_link_if_needed(ctrl);
@@ -2190,6 +2193,7 @@
if (!h->u.p_f)
break;
/* DL-RELEASE confirm */
+ q931_dl_event(ctrl, Q931_DL_EVENT_DL_RELEASE_CONFIRM);
stop_t200(ctrl);
q921_setstate(ctrl, Q921_TEI_ASSIGNED);
break;
Modified: tags/1.4.11.5/q931.c
URL: http://svnview.digium.com/svn/libpri/tags/1.4.11.5/q931.c?view=diff&rev=2135&r1=2134&r2=2135
==============================================================================
--- tags/1.4.11.5/q931.c (original)
+++ tags/1.4.11.5/q931.c Wed Nov 17 15:24:21 2010
@@ -7739,93 +7739,67 @@
}
/*!
- * \brief Layer 2 is removing the link's TEI.
- *
- * \param link Q.921 link losing it's TEI.
- *
- * \note
- * For NT PTMP, this deviation from the specifications is needed
- * because we have no way to re-associate any T309 calls on the
- * removed TEI.
+ * \internal
+ * \brief Convert the DL event to a string.
+ *
+ * \param event Data-link event to convert to a string.
+ *
+ * \return DL event string
+ */
+static const char *q931_dl_event2str(enum Q931_DL_EVENT event)
+{
+ const char *str;
+
+ str = "Unknown";
+ switch (event) {
+ case Q931_DL_EVENT_NONE:
+ str = "Q931_DL_EVENT_NONE";
+ break;
+ case Q931_DL_EVENT_DL_ESTABLISH_IND:
+ str = "Q931_DL_EVENT_DL_ESTABLISH_IND";
+ break;
+ case Q931_DL_EVENT_DL_ESTABLISH_CONFIRM:
+ str = "Q931_DL_EVENT_DL_ESTABLISH_CONFIRM";
+ break;
+ case Q931_DL_EVENT_DL_RELEASE_IND:
+ str = "Q931_DL_EVENT_DL_RELEASE_IND";
+ break;
+ case Q931_DL_EVENT_DL_RELEASE_CONFIRM:
+ str = "Q931_DL_EVENT_DL_RELEASE_CONFIRM";
+ break;
+ case Q931_DL_EVENT_TEI_REMOVAL:
+ str = "Q931_DL_EVENT_TEI_REMOVAL";
+ break;
+ }
+ return str;
+}
+
+/*!
+ * \brief Receive a DL event from layer 2.
+ *
+ * \param link Q.921 link event occurred on.
+ * \param event Data-link event reporting.
*
* \return Nothing
*/
-void q931_dl_tei_removal(struct pri *link)
+void q931_dl_event(struct pri *link, enum Q931_DL_EVENT event)
{
struct q931_call *cur;
struct q931_call *call;
struct pri *ctrl;
int idx;
+ if (!link) {
+ return;
+ }
+
/* Find the master - He has the call pool */
ctrl = PRI_MASTER(link);
if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
- pri_message(ctrl, "DL TEI removal\n");
- }
-
- if (!BRI_NT_PTMP(ctrl)) {
- /* Only NT PTMP has anything to worry about when the TEI is removed. */
- return;
- }
-
- 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;
- for (idx = 0; idx < ARRAY_LEN(cur->subcalls); ++idx) {
- if (cur->subcalls[idx] && cur->subcalls[idx]->pri == link) {
- /* This subcall is on the link that went down. */
- call = cur->subcalls[idx];
- break;
- }
- }
- if (!call) {
- /* No subcall is on the link that went down. */
- continue;
- }
- } else if (cur->pri != link) {
- /* This call is not on the link that went down. */
- continue;
- } else {
- call = cur;
- }
-
- /*
- * NOTE: We are gambling that no T309 timer's have had a chance
- * to expire. They should not expire since we are either called
- * immediately after the q931_dl_indication() or after a timeout
- * of 0.
- */
- if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
- pri_message(ctrl, "Cancel call cref=%d on channel %d in state %d (%s)\n",
- call->cr, call->channelno, call->ourcallstate,
- q931_call_state_str(call->ourcallstate));
- }
- call->pri = ctrl;/* Point to a safer place until the call is destroyed. */
- pri_schedule_del(ctrl, call->retranstimer);
- call->retranstimer = pri_schedule_event(ctrl, 0, pri_dl_down_cancelcall, call);
- }
-}
-
-/* Receive an indication from Layer 2 */
-void q931_dl_indication(struct pri *link, int event)
-{
- struct q931_call *cur;
- struct q931_call *call;
- struct pri *ctrl;
- int idx;
-
- if (!link) {
- return;
- }
-
- /* Find the master - He has the call pool */
- ctrl = PRI_MASTER(link);
+ pri_message(ctrl, "TEI=%d DL event: %s(%d)\n", link->tei,
+ q931_dl_event2str(event), event);
+ }
if (BRI_TE_PTMP(ctrl)) {
/* The link is always the master */
@@ -7833,10 +7807,62 @@
}
switch (event) {
- case PRI_EVENT_DCHAN_DOWN:
- if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
- pri_message(ctrl, "DL-RELEASE indication (link is DOWN)\n");
- }
+ case Q931_DL_EVENT_TEI_REMOVAL:
+ if (!BRI_NT_PTMP(ctrl)) {
+ /* Only NT PTMP has anything to worry about when the TEI is removed. */
+ break;
+ }
+
+ /*
+ * For NT PTMP, this deviation from the specifications is needed
+ * because we have no way to re-associate any T309 calls on the
+ * 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;
+ for (idx = 0; idx < ARRAY_LEN(cur->subcalls); ++idx) {
+ if (cur->subcalls[idx] && cur->subcalls[idx]->pri == link) {
+ /* This subcall is on the link that went down. */
+ call = cur->subcalls[idx];
+ break;
+ }
+ }
+ if (!call) {
+ /* No subcall is on the link that went down. */
+ continue;
+ }
+ } else if (cur->pri != link) {
+ /* This call is not on the link that went down. */
+ continue;
+ } else {
+ call = cur;
+ }
+
+ /*
+ * NOTE: We are gambling that no T309 timer's have had a chance
+ * to expire. They should not expire since we are either called
+ * immediately after the Q931_DL_EVENT_DL_RELEASE_xxx or after a
+ * timeout of 0.
+ */
+ if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
+ pri_message(ctrl, "Cancel call cref=%d on channel %d in state %d (%s)\n",
+ call->cr, call->channelno, call->ourcallstate,
+ q931_call_state_str(call->ourcallstate));
+ }
+ call->pri = ctrl;/* Point to a safer place until the call is destroyed. */
+ pri_schedule_del(ctrl, call->retranstimer);
+ call->retranstimer = pri_schedule_event(ctrl, 0, pri_dl_down_cancelcall,
+ call);
+ }
+ break;
+ case Q931_DL_EVENT_DL_RELEASE_IND:
+ case Q931_DL_EVENT_DL_RELEASE_CONFIRM:
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. */
@@ -7917,10 +7943,8 @@
}
}
break;
- case PRI_EVENT_DCHAN_UP:
- if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
- pri_message(ctrl, "DL-ESTABLISH indication (link is UP)\n");
- }
+ case Q931_DL_EVENT_DL_ESTABLISH_IND:
+ case Q931_DL_EVENT_DL_ESTABLISH_CONFIRM:
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. */
@@ -7965,6 +7989,14 @@
case Q931_CALL_STATE_RELEASE_REQUEST:
break;
default:
+ if (event == Q931_DL_EVENT_DL_ESTABLISH_CONFIRM) {
+ /*
+ * Lets not send a STATUS message for this call as we
+ * requested the link to be established as a likely
+ * result of this call.
+ */
+ break;
+ }
/*
* The STATUS message sent here is not required by Q.931,
* but it may help anyway.
More information about the svn-commits
mailing list