summaryrefslogtreecommitdiff
path: root/channels/chan_dahdi.c
diff options
context:
space:
mode:
authorJeff Peeler <jpeeler@digium.com>2009-11-24 17:12:25 +0000
committerJeff Peeler <jpeeler@digium.com>2009-11-24 17:12:25 +0000
commitac9a4cecf3f2f50d38292be56c792a8210815014 (patch)
tree505fbfc8efc53b76ad51e5b4bb25057d77528553 /channels/chan_dahdi.c
parent1c7dd506d6a6c6210b863cbc44429e816a421810 (diff)
Fix problem on digital channels due to digital flag not getting set
Changed areas in sig_pri to set the digital flag using a callback that will also set the corresponding flag in chan_dahdi. Modified dahdi_request slightly so that if a bearer is marked as digital, that information is available when creating the new channel. (closes issue #16151) Reported by: alecdavis Patch based on bug_16151.diff.txt uploaded by alecdavis (license 585) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@231058 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_dahdi.c')
-rw-r--r--channels/chan_dahdi.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index e71f2ed91..0da2ded8c 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -2069,6 +2069,14 @@ static void my_set_dialing(void *pvt, int flag)
p->dialing = flag;
}
+#if defined(HAVE_PRI)
+static void my_set_digital(void *pvt, int flag)
+{
+ struct dahdi_pvt *p = pvt;
+ p->digital = flag;
+}
+#endif
+
static void my_set_ringtimeout(void *pvt, int ringt)
{
struct dahdi_pvt *p = pvt;
@@ -2780,6 +2788,7 @@ static struct sig_pri_callback dahdi_pri_callbacks =
.new_ast_channel = my_new_pri_ast_channel,
.fixup_chans = my_pri_fixup_chans,
.set_dialing = my_set_dialing,
+ .set_digital = my_set_digital,
.set_callerid = my_pri_set_callerid,
.set_dnid = my_pri_set_dnid,
.set_rdnis = my_pri_set_rdnis,
@@ -8696,7 +8705,7 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb
tmp->cid.cid_pres = i->callingpres;
tmp->cid.cid_ton = i->cid_ton;
tmp->cid.cid_ani2 = i->cid_ani2;
-#if defined(HAVE_PRI) || defined(HAVE_SS7)
+#if defined(HAVE_SS7)
tmp->transfercapability = transfercapability;
pbx_builtin_setvar_helper(tmp, "TRANSFERCAPABILITY", ast_transfercapability2str(transfercapability));
if (transfercapability & AST_TRANS_CAP_DIGITAL)
@@ -12009,6 +12018,7 @@ static struct ast_channel *dahdi_request(const char *type, format_t format, cons
struct dahdi_pvt *exitpvt;
int channelmatched = 0;
int groupmatched = 0;
+ int transcapdigital = 0;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(group); /* channel/group token */
//AST_APP_ARG(ext); /* extension token */
@@ -12124,21 +12134,6 @@ static struct ast_channel *dahdi_request(const char *type, format_t format, cons
break;
}
}
- p->outgoing = 1;
- if (analog_lib_handles(p->sig, p->radio, p->oprmode)) {
- tmp = analog_request(p->sig_pvt, &callwait, requestor);
-#ifdef HAVE_PRI
- } else if (dahdi_sig_pri_lib_handles(p->sig)) {
- sig_pri_extract_called_num_subaddr(p->sig_pvt, data, p->dnid,
- sizeof(p->dnid));
- tmp = sig_pri_request(p->sig_pvt, SIG_PRI_DEFLAW, requestor);
-#endif
- } else {
- tmp = dahdi_new(p, AST_STATE_RESERVED, 0, p->owner ? SUB_CALLWAIT : SUB_REAL, 0, 0, requestor ? requestor->linkedid : "");
- }
- if (!tmp) {
- p->outgoing = 0;
- }
/* Make special notes */
if (res > 1) {
@@ -12153,13 +12148,27 @@ static struct ast_channel *dahdi_request(const char *type, format_t format, cons
p->distinctivering = y;
} else if (opt == 'd') {
/* If this is an ISDN call, make it digital */
- p->digital = 1;
- if (tmp)
- tmp->transfercapability = AST_TRANS_CAP_DIGITAL;
+ transcapdigital = AST_TRANS_CAP_DIGITAL;
} else {
ast_log(LOG_WARNING, "Unknown option '%c' in '%s'\n", opt, (char *)data);
}
}
+
+ p->outgoing = 1;
+ if (analog_lib_handles(p->sig, p->radio, p->oprmode)) {
+ tmp = analog_request(p->sig_pvt, &callwait, requestor);
+#ifdef HAVE_PRI
+ } else if (dahdi_sig_pri_lib_handles(p->sig)) {
+ sig_pri_extract_called_num_subaddr(p->sig_pvt, data, p->dnid,
+ sizeof(p->dnid));
+ tmp = sig_pri_request(p->sig_pvt, SIG_PRI_DEFLAW, requestor, transcapdigital);
+#endif
+ } else {
+ tmp = dahdi_new(p, AST_STATE_RESERVED, 0, p->owner ? SUB_CALLWAIT : SUB_REAL, 0, transcapdigital, requestor ? requestor->linkedid : "");
+ }
+ if (!tmp) {
+ p->outgoing = 0;
+ }
/* Note if the call is a call waiting call */
if (tmp && callwait)
tmp->cdrflags |= AST_CDR_CALLWAIT;