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: http://svn.digium.com/svn/asterisk/trunk@309446 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
08689bd8a0
commit
7edf19861b
|
@ -72,6 +72,15 @@ From 1.6.2 to 1.8:
|
|||
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
|
||||
is now available in the AVAILCAUSECODE variable. If existing dialplan logic
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -932,6 +932,24 @@ static void sig_pri_open_media(struct sig_pri_chan *p)
|
|||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \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;
|
||||
|
@ -1333,6 +1351,10 @@ static int pri_fixup_principle(struct sig_pri_span *pri, int principle, q931_cal
|
|||
sig_pri_open_media(new_chan);
|
||||
}
|
||||
|
||||
if (new_chan->owner) {
|
||||
sig_pri_ami_channel_event(new_chan);
|
||||
}
|
||||
|
||||
sig_pri_unlock_private(old_chan);
|
||||
if (new_chan->owner) {
|
||||
ast_channel_unlock(new_chan->owner);
|
||||
|
|
|
@ -200,6 +200,16 @@ struct sig_pri_callback {
|
|||
|
||||
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. */
|
||||
|
|
|
@ -224,6 +224,22 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||
</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>
|
||||
|
|
Reference in New Issue