[asterisk-commits] rmudgett: branch 1.8 r309445 - in /branches/1.8: ./ channels/ funcs/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Mar 4 09:22:15 CST 2011
Author: rmudgett
Date: Fri Mar 4 09:22:04 2011
New Revision: 309445
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=309445
Log:
Get real channel of a DAHDI call.
Starting with Asterisk v1.8, the DAHDI channel name format was changed for
ISDN calls to: DAHDI/i<span>/<number>[:<subaddress>]-<sequence-number>
There were several reasons that the channel name had to change.
1) Call completion requires a device state for ISDN phones. The generic
device state uses the channel name.
2) Calls do not necessarily have B channels. Calls placed on hold by an
ISDN phone do not have B channels.
3) The B channel a call initially requests may not be the B channel the
call ultimately uses. Changes to the internal implementation of the
Asterisk master channel list caused deadlock problems for chan_dahdi if it
needed to change the channel name. Chan_dahdi no longer changes the
channel name.
4) DTMF attended transfers now work with ISDN phones because the channel
name is "dialable" like the chan_sip channel names.
For various reasons, some people need to know which B channel a DAHDI call
is using.
* Added CHANNEL(dahdi_span), CHANNEL(dahdi_channel), and
CHANNEL(dahdi_type) so the dialplan can determine the B channel currently
in use by the channel. Use CHANNEL(no_media_path) to determine if the
channel even has a B channel.
* Added AMI event DAHDIChannel to associate a DAHDI channel with an
Asterisk channel so AMI applications can passively determine the B channel
currently in use. Calls with "no-media" as the DAHDIChannel do not have
an associated B channel. No-media calls are either on hold or
call-waiting.
(closes issue #17683)
Reported by: mrwho
Tested by: rmudgett
(closes issue #18603)
Reported by: arjankroon
Patches:
issue17683_18603_v1.8_v2.patch uploaded by rmudgett (license 664)
Tested by: stever28, rmudgett
Modified:
branches/1.8/UPGRADE.txt
branches/1.8/channels/chan_dahdi.c
branches/1.8/channels/sig_pri.c
branches/1.8/channels/sig_pri.h
branches/1.8/funcs/func_channel.c
Modified: branches/1.8/UPGRADE.txt
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/UPGRADE.txt?view=diff&rev=309445&r1=309444&r2=309445
==============================================================================
--- branches/1.8/UPGRADE.txt (original)
+++ branches/1.8/UPGRADE.txt Fri Mar 4 09:22:04 2011
@@ -71,6 +71,15 @@
collisions, the channel name format is changed.
The new channel naming for PRI channels is:
DAHDI/i<span>/<number>[:<subaddress>]-<sequence-number>
+
+* Added CHANNEL(dahdi_span), CHANNEL(dahdi_channel), and CHANNEL(dahdi_type)
+ so the dialplan can determine the B channel currently in use by the channel.
+ Use CHANNEL(no_media_path) to determine if the channel even has a B channel.
+
+* Added AMI event DAHDIChannel to associate a DAHDI channel with an Asterisk
+ channel so AMI applications can passively determine the B channel currently
+ in use. Calls with "no-media" as the DAHDIChannel do not have an associated
+ B channel. No-media calls are either on hold or call-waiting.
* The ChanIsAvail application has been changed so the AVAILSTATUS variable
no longer contains both the device state and cause code. The cause code
Modified: branches/1.8/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_dahdi.c?view=diff&rev=309445&r1=309444&r2=309445
==============================================================================
--- branches/1.8/channels/chan_dahdi.c (original)
+++ branches/1.8/channels/chan_dahdi.c Fri Mar 4 09:22:04 2011
@@ -2087,6 +2087,58 @@
DEADLOCK_AVOIDANCE(&p->lock);
}
+/*!
+ * \internal
+ * \brief Post an AMI DAHDI channel association event.
+ * \since 1.8
+ *
+ * \param p DAHDI private pointer
+ * \param chan Channel associated with the private pointer
+ *
+ * \return Nothing
+ */
+static void dahdi_ami_channel_event(struct dahdi_pvt *p, struct ast_channel *chan)
+{
+ char ch_name[20];
+
+ if (p->channel < CHAN_PSEUDO) {
+ /* No B channel */
+ snprintf(ch_name, sizeof(ch_name), "no-media (%d)", p->channel);
+ } else if (p->channel == CHAN_PSEUDO) {
+ /* Pseudo channel */
+ strcpy(ch_name, "pseudo");
+ } else {
+ /* Real channel */
+ snprintf(ch_name, sizeof(ch_name), "%d", p->channel);
+ }
+ ast_manager_event(chan, EVENT_FLAG_CALL, "DAHDIChannel",
+ "Channel: %s\r\n"
+ "Uniqueid: %s\r\n"
+ "DAHDISpan: %d\r\n"
+ "DAHDIChannel: %s\r\n",
+ chan->name,
+ chan->uniqueid,
+ p->span,
+ ch_name);
+}
+
+/*!
+ * \internal
+ * \brief Post an AMI DAHDI channel association event.
+ * \since 1.8
+ *
+ * \param pvt DAHDI private pointer
+ * \param chan Channel associated with the private pointer
+ *
+ * \return Nothing
+ */
+static void my_ami_channel_event(void *pvt, struct ast_channel *chan)
+{
+ struct dahdi_pvt *p = pvt;
+
+ dahdi_ami_channel_event(p, chan);
+}
+
/* linear_mode = 0 - turn linear mode off, >0 - turn linear mode on
* returns the last value of the linear setting
*/
@@ -3272,6 +3324,7 @@
.module_ref = my_module_ref,
.module_unref = my_module_unref,
.open_media = my_pri_open_media,
+ .ami_channel_event = my_ami_channel_event,
};
#endif /* defined(HAVE_PRI) */
@@ -6741,6 +6794,41 @@
} else if (!strcasecmp(data, "txgain")) {
ast_mutex_lock(&p->lock);
snprintf(buf, len, "%f", p->txgain);
+ ast_mutex_unlock(&p->lock);
+ } else if (!strcasecmp(data, "dahdi_channel")) {
+ ast_mutex_lock(&p->lock);
+ snprintf(buf, len, "%d", p->channel);
+ ast_mutex_unlock(&p->lock);
+ } else if (!strcasecmp(data, "dahdi_span")) {
+ ast_mutex_lock(&p->lock);
+ snprintf(buf, len, "%d", p->span);
+ ast_mutex_unlock(&p->lock);
+ } else if (!strcasecmp(data, "dahdi_type")) {
+ ast_mutex_lock(&p->lock);
+ switch (p->sig) {
+#if defined(HAVE_OPENR2)
+ case SIG_MFCR2:
+ ast_copy_string(buf, "mfc/r2", len);
+ break;
+#endif /* defined(HAVE_OPENR2) */
+#if defined(HAVE_PRI)
+ case SIG_PRI_LIB_HANDLE_CASES:
+ ast_copy_string(buf, "pri", len);
+ break;
+#endif /* defined(HAVE_PRI) */
+ case 0:
+ ast_copy_string(buf, "pseudo", len);
+ break;
+#if defined(HAVE_SS7)
+ case SIG_SS7:
+ ast_copy_string(buf, "ss7", len);
+ break;
+#endif /* defined(HAVE_SS7) */
+ default:
+ /* The only thing left is analog ports. */
+ ast_copy_string(buf, "analog", len);
+ break;
+ }
ast_mutex_unlock(&p->lock);
#if defined(HAVE_PRI)
#if defined(HAVE_PRI_REVERSE_CHARGE)
@@ -9463,6 +9551,7 @@
ast_module_ref(ast_module_info->self);
+ dahdi_ami_channel_event(i, tmp);
if (startpbx) {
#ifdef HAVE_OPENR2
if (i->mfcr2call) {
@@ -13003,6 +13092,7 @@
nobch_channel = CHAN_PSEUDO - 1;
}
pvt->channel = nobch_channel;
+ pvt->span = pri->span;
chan->channel = pvt->channel;
dahdi_nobch_insert(pri, pvt);
Modified: branches/1.8/channels/sig_pri.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_pri.c?view=diff&rev=309445&r1=309444&r2=309445
==============================================================================
--- branches/1.8/channels/sig_pri.c (original)
+++ branches/1.8/channels/sig_pri.c Fri Mar 4 09:22:04 2011
@@ -913,6 +913,24 @@
}
}
+/*!
+ * \internal
+ * \brief Post an AMI B channel association event.
+ * \since 1.8
+ *
+ * \param p Channel private control structure.
+ *
+ * \note Assumes the private and owner are locked.
+ *
+ * \return Nothing
+ */
+static void sig_pri_ami_channel_event(struct sig_pri_chan *p)
+{
+ if (p->calls->ami_channel_event) {
+ p->calls->ami_channel_event(p->chan_pvt, p->owner);
+ }
+}
+
struct ast_channel *sig_pri_request(struct sig_pri_chan *p, enum sig_pri_law law, const struct ast_channel *requestor, int transfercapability)
{
struct ast_channel *ast;
@@ -1289,6 +1307,10 @@
* bridged.)
*/
sig_pri_open_media(new_chan);
+ }
+
+ if (new_chan->owner) {
+ sig_pri_ami_channel_event(new_chan);
}
sig_pri_unlock_private(old_chan);
Modified: branches/1.8/channels/sig_pri.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_pri.h?view=diff&rev=309445&r1=309444&r2=309445
==============================================================================
--- branches/1.8/channels/sig_pri.h (original)
+++ branches/1.8/channels/sig_pri.h Fri Mar 4 09:22:04 2011
@@ -139,6 +139,16 @@
void (* const open_media)(void *pvt);
+ /*!
+ * \brief Post an AMI B channel association event.
+ *
+ * \param pvt Private structure of the user of this module.
+ * \param chan Channel associated with the private pointer
+ *
+ * \return Nothing
+ */
+ void (* const ami_channel_event)(void *pvt, struct ast_channel *chan);
+
/*! Reference the parent module. */
void (*module_ref)(void);
/*! Unreference the parent module. */
Modified: branches/1.8/funcs/func_channel.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/funcs/func_channel.c?view=diff&rev=309445&r1=309444&r2=309445
==============================================================================
--- branches/1.8/funcs/func_channel.c (original)
+++ branches/1.8/funcs/func_channel.c Fri Mar 4 09:22:04 2011
@@ -224,6 +224,22 @@
</enumlist>
<para><emphasis>chan_dahdi</emphasis> provides the following additional options:</para>
<enumlist>
+ <enum name="dahdi_channel">
+ <para>R/O DAHDI channel related to this channel.</para>
+ </enum>
+ <enum name="dahdi_span">
+ <para>R/O DAHDI span related to this channel.</para>
+ </enum>
+ <enum name="dahdi_type">
+ <para>R/O DAHDI channel type, one of:</para>
+ <enumlist>
+ <enum name="analog" />
+ <enum name="mfc/r2" />
+ <enum name="pri" />
+ <enum name="pseudo" />
+ <enum name="ss7" />
+ </enumlist>
+ </enum>
<enum name="keypad_digits">
<para>R/O PRI Keypad digits that came in with the SETUP message.</para>
</enum>
More information about the asterisk-commits
mailing list