summaryrefslogtreecommitdiff
path: root/channels/chan_dahdi.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2011-03-04 15:28:20 +0000
committerRichard Mudgett <rmudgett@digium.com>2011-03-04 15:28:20 +0000
commit928ec2b9903346f6e3d274c4addace48fb8f8624 (patch)
treef3cafb2098bf62294b6581078f8b3e29a8caba83 /channels/chan_dahdi.c
parent3cda82a379fc3714ea82cb45ee10c9aae0094242 (diff)
Merged revisions 309445 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r309445 | rmudgett | 2011-03-04 09:22:04 -0600 (Fri, 04 Mar 2011) | 46 lines 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 ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@309446 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_dahdi.c')
-rw-r--r--channels/chan_dahdi.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 4febe690b..4baee23b9 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -2109,6 +2109,58 @@ static void my_deadlock_avoidance_private(void *pvt)
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
*/
@@ -3294,6 +3346,7 @@ static struct sig_pri_callback dahdi_pri_callbacks =
.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) */
@@ -6792,6 +6845,41 @@ static int dahdi_func_read(struct ast_channel *chan, const char *function, char
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)
} else if (!strcasecmp(data, "reversecharge")) {
@@ -9530,6 +9618,7 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb
ast_module_ref(ast_module_info->self);
+ dahdi_ami_channel_event(i, tmp);
if (startpbx) {
#ifdef HAVE_OPENR2
if (i->mfcr2call) {
@@ -13089,6 +13178,7 @@ static int dahdi_new_pri_nobch_channel(struct sig_pri_span *pri)
nobch_channel = CHAN_PSEUDO - 1;
}
pvt->channel = nobch_channel;
+ pvt->span = pri->span;
chan->channel = pvt->channel;
dahdi_nobch_insert(pri, pvt);