[svn-commits] rmudgett: branch group/issue14292 r197332 - /team/group/issue14292/channels/
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed May 27 16:11:17 CDT 2009
Author: rmudgett
Date: Wed May 27 16:11:09 2009
New Revision: 197332
URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=197332
Log:
Made compile again from constify the world changes.
* Fixed constify the world conflicts.
* Eliminated many future COLP merge conflicts by restructuring the CCBS/CCNR
PRI event handling code.
Modified:
team/group/issue14292/channels/chan_dahdi.c
Modified: team/group/issue14292/channels/chan_dahdi.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/issue14292/channels/chan_dahdi.c?view=diff&rev=197332&r1=197331&r2=197332
==============================================================================
--- team/group/issue14292/channels/chan_dahdi.c (original)
+++ team/group/issue14292/channels/chan_dahdi.c Wed May 27 16:11:09 2009
@@ -4934,12 +4934,12 @@
}
#if defined(HAVE_PRI)
-static char *dahdi_qsig_ccbsnr_initialize_app = "DAHDIQsigCcbsnrInitialize";
+static const char *dahdi_qsig_ccbsnr_initialize_app = "DAHDIQsigCcbsnrInitialize";
/*
* store the peer for future actions
*/
-static int dahdi_qsig_ccbsnr_initialize_exec(struct ast_channel *ast, void *param)
+static int dahdi_qsig_ccbsnr_initialize_exec(struct ast_channel *ast, const char *param)
{
char buffer[32];
int id;
@@ -4960,14 +4960,14 @@
#endif /* defined(HAVE_PRI) */
#if defined(HAVE_PRI)
-static char *dahdi_qsic_check_ccbsnr_app = "DAHDIQsigCheckCcbsnr";
-
-static int dahdi_qsig_check_ccbsnr_exec(struct ast_channel *ast, void *param)
+static const char *dahdi_qsic_check_ccbsnr_app = "DAHDIQsigCheckCcbsnr";
+
+static int dahdi_qsig_check_ccbsnr_exec(struct ast_channel *ast, const char *param)
{
#define CC_MAX_NOCHANNELS 256
#define MAX_DISSALOWED 4
- char *data = (char *) param;
+ char *data = ast_strdupa(param);
char *parse, *tok, *tokb;
int maxcount = 0;
char *dissalowed_callernum[MAX_DISSALOWED] = {NULL, NULL, NULL, NULL};
@@ -5084,12 +5084,12 @@
#endif /* defined(HAVE_PRI) */
#if defined(HAVE_PRI)
-static char *dahdi_qsic_clear_nochannel_app = "DAHDIQsigClearNoChannel";
-
-static int dahdi_qsig_clear_nochannel_exec(struct ast_channel *ast, void *param)
+static const char *dahdi_qsic_clear_nochannel_app = "DAHDIQsigClearNoChannel";
+
+static int dahdi_qsig_clear_nochannel_exec(struct ast_channel *ast, const char *param)
{
char *callingnum, *callernum;
- char *data = (char *) param;
+ char *data = ast_strdupa(param);
struct ccbsnr_link *cclink;
unsigned int state = 0;
@@ -5164,13 +5164,13 @@
#endif /* defined(HAVE_PRI) */
#if defined(HAVE_PRI)
-static char *dahdi_qsic_ccbsnr_request_app = "DAHDIQsigCcbsnrRequest";
-
-static int dahdi_qsig_ccbsnr_request_exec(struct ast_channel *ast, void *param)
+static const char *dahdi_qsic_ccbsnr_request_app = "DAHDIQsigCcbsnrRequest";
+
+static int dahdi_qsig_ccbsnr_request_exec(struct ast_channel *ast, const char *param)
{
int type;
char *ccbsnrtype, *callingnum, *callernum, *callername, *context, *priority;
- char *data = (char *) param;
+ char *data = ast_strdupa(param);
const char *ccbsnronprispan;
unsigned int prispan;
@@ -14957,19 +14957,15 @@
#error please update libpri
#endif
case PRI_EVENT_FACILITY:
- {
- unsigned int handle;
- int channel = e->facility.channel;
- int ccbsnronprispan = PRI_SPAN(channel);
- int explicit = PRI_EXPLICIT(channel);
- int i;
-
- channel = PRI_CHANNEL(channel);
-
ast_verb(4,
- "PRI_EVENT_CC_FACILITY e->facility.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
- e->facility.channel, ccbsnronprispan, explicit, channel);
- if (channel == 0) {
+ "PRI_EVENT_FACILITY e->facility.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
+ e->facility.channel, PRI_SPAN(e->facility.channel),
+ PRI_EXPLICIT(e->facility.channel), PRI_CHANNEL(e->facility.channel));
+ if (PRI_CHANNEL(e->facility.channel) == 0) {
+ /* No channel Connection */
+ unsigned int handle;
+ int i;
+
for (i = 0; i < e->facility.subcmds.counter_subcmd; i++) {
struct pri_subcommand *subcmd = &e->facility.subcmds.subcmd[i];
@@ -14981,9 +14977,9 @@
ast_verb(4,
"Facility cc-execposible INV cr %d channel %d/%d, span %d\n",
- cr, ccbsnronprispan, channel, pri->span);
-
- handle = CCBS_HANDLE(ccbsnronprispan, cr);
+ cr, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
+
+ handle = CCBS_HANDLE(PRI_SPAN(e->facility.channel), cr);
state = 0;
ast_verb(4,
"Facility cc-execposible: handle=%x\n", handle);
@@ -15004,106 +15000,103 @@
default:
ast_log(LOG_WARNING,
"Illegal subcommand %d in facility request on channel %d/%d span %d\n",
- subcmd->cmd, ccbsnronprispan, channel, pri->span);
+ subcmd->cmd, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
break;
}
}
+ break;
+ }
+
+ chanpos = pri_find_principle(pri, e->facility.channel);
+ if (chanpos < 0) {
+ ast_log(LOG_WARNING, "Facility requested on unconfigured channel %d/%d span %d\n",
+ PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
} else {
- chanpos = pri_find_principle(pri, e->facility.channel);
+ chanpos = pri_fixup_principle(pri, chanpos, e->facility.call);
if (chanpos < 0) {
- ast_log(LOG_WARNING, "Facility requested on unconfigured channel %d/%d span %d\n",
+ ast_log(LOG_WARNING, "Facility requested on channel %d/%d not in use on span %d\n",
PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
} else {
- chanpos = pri_fixup_principle(pri, chanpos, e->facility.call);
- if (chanpos < 0) {
- ast_log(LOG_WARNING, "Facility requested on channel %d/%d not in use on span %d\n",
- PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
- } else {
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- for (i = 0; i < e->facility.subcmds.counter_subcmd; i++) {
- struct pri_subcommand *subcmd = &e->facility.subcmds.subcmd[i];
- struct ast_channel *owner;
-
- switch (subcmd->cmd) {
- case PRI_SUBCMD_CONNECTED_LINE:
- owner = pri->pvts[chanpos]->owner;
- if (owner) {
- struct ast_party_connected_line connected;
- struct pri_subcmd_connected_line *cmdcl;
-
- /* Update the connected line information on the other channel */
- ast_party_connected_line_init(&connected);
- cmdcl = &subcmd->connected_line;
- connected.id.number = cmdcl->party.id.number;
- connected.id.name = cmdcl->party.id.name;
- connected.id.number_type = cmdcl->party.id.number_type;
- connected.id.number_presentation = pri_to_ast_presentation(cmdcl->party.id.number_presentation);
- connected.source = pri_to_ast_connected_line_update_source(cmdcl->party.source);
- ast_channel_queue_connected_line_update(owner, &connected);
-
- ast_copy_string(pri->pvts[chanpos]->lastcid_num, cmdcl->party.id.number, sizeof(pri->pvts[chanpos]->lastcid_num));
- ast_copy_string(pri->pvts[chanpos]->lastcid_name, cmdcl->party.id.name, sizeof(pri->pvts[chanpos]->lastcid_name));
-
- pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
- //dahdi_enable_ec(pri->pvts[chanpos]);
- }
- break;
- case PRI_SUBCMD_REDIRECTING:
- owner = pri->pvts[chanpos]->owner;
- if (owner) {
- struct ast_party_redirecting redirecting = {{0,},};
- struct pri_subcmd_redirecting *cmdr;
-
- cmdr = &subcmd->redirecting;
- redirecting.from.number = cmdr->party.from.number;
- redirecting.from.name = cmdr->party.from.name;
- redirecting.from.number_type = cmdr->party.from.number_type;
- redirecting.from.number_presentation = pri_to_ast_presentation(cmdr->party.from.number_presentation);
- redirecting.to.number = cmdr->party.to.number;
- redirecting.to.name = cmdr->party.to.name;
- redirecting.to.number_type = cmdr->party.to.number_type;
- redirecting.to.number_presentation = pri_to_ast_presentation(cmdr->party.to.number_presentation);
- redirecting.count = 0;
- redirecting.reason = pri_to_ast_reason(cmdr->party.reason);
- ast_channel_queue_redirecting_update(owner, &redirecting);
- }
- break;
- default:
- ast_log(LOG_WARNING,
- "Illegal subcommand %d in facility request on channel %d/%d not in use on span %d\n",
- subcmd->cmd, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
- break;
+ int i;
+
+ ast_mutex_lock(&pri->pvts[chanpos]->lock);
+ for (i = 0; i < e->facility.subcmds.counter_subcmd; i++) {
+ struct pri_subcommand *subcmd = &e->facility.subcmds.subcmd[i];
+ struct ast_channel *owner;
+
+ switch (subcmd->cmd) {
+ case PRI_SUBCMD_CONNECTED_LINE:
+ owner = pri->pvts[chanpos]->owner;
+ if (owner) {
+ struct ast_party_connected_line connected;
+ struct pri_subcmd_connected_line *cmdcl;
+
+ /* Update the connected line information on the other channel */
+ ast_party_connected_line_init(&connected);
+ cmdcl = &subcmd->connected_line;
+ connected.id.number = cmdcl->party.id.number;
+ connected.id.name = cmdcl->party.id.name;
+ connected.id.number_type = cmdcl->party.id.number_type;
+ connected.id.number_presentation = pri_to_ast_presentation(cmdcl->party.id.number_presentation);
+ connected.source = pri_to_ast_connected_line_update_source(cmdcl->party.source);
+ ast_channel_queue_connected_line_update(owner, &connected);
+
+ ast_copy_string(pri->pvts[chanpos]->lastcid_num, cmdcl->party.id.number, sizeof(pri->pvts[chanpos]->lastcid_num));
+ ast_copy_string(pri->pvts[chanpos]->lastcid_name, cmdcl->party.id.name, sizeof(pri->pvts[chanpos]->lastcid_name));
+
+ pri->pvts[chanpos]->subs[SUB_REAL].needcallerid = 1;
+ //dahdi_enable_ec(pri->pvts[chanpos]);
}
+ break;
+ case PRI_SUBCMD_REDIRECTING:
+ owner = pri->pvts[chanpos]->owner;
+ if (owner) {
+ struct ast_party_redirecting redirecting = {{0,},};
+ struct pri_subcmd_redirecting *cmdr;
+
+ cmdr = &subcmd->redirecting;
+ redirecting.from.number = cmdr->party.from.number;
+ redirecting.from.name = cmdr->party.from.name;
+ redirecting.from.number_type = cmdr->party.from.number_type;
+ redirecting.from.number_presentation = pri_to_ast_presentation(cmdr->party.from.number_presentation);
+ redirecting.to.number = cmdr->party.to.number;
+ redirecting.to.name = cmdr->party.to.name;
+ redirecting.to.number_type = cmdr->party.to.number_type;
+ redirecting.to.number_presentation = pri_to_ast_presentation(cmdr->party.to.number_presentation);
+ redirecting.count = 0;
+ redirecting.reason = pri_to_ast_reason(cmdr->party.reason);
+ ast_channel_queue_redirecting_update(owner, &redirecting);
+ }
+ break;
+ default:
+ ast_log(LOG_WARNING,
+ "Illegal subcommand %d in facility request on channel %d/%d not in use on span %d\n",
+ subcmd->cmd, PRI_SPAN(e->facility.channel), PRI_CHANNEL(e->facility.channel), pri->span);
+ break;
}
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
}
+ ast_mutex_unlock(&pri->pvts[chanpos]->lock);
}
}
break;
- }
case PRI_EVENT_ANSWER:
- {
- int channel = e->answer.channel;
- int ccbsnronprispan = PRI_SPAN(channel);
- int explicit = PRI_EXPLICIT(channel);
- int i;
-
- channel = PRI_CHANNEL(channel);
-
ast_verb(4,
"PRI_EVENT_ANSWER e->answer.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
- e->answer.channel, ccbsnronprispan, explicit, channel);
-
- if (channel == 0) { /* No channel Connection */
+ e->answer.channel, PRI_SPAN(e->answer.channel),
+ PRI_EXPLICIT(e->answer.channel), e->answer.channel);
+ if (e->answer.channel == 0) {
+ /* No channel Connection */
+ int i;
+
for (i = 0; i < e->answer.subcmds.counter_subcmd; i++) {
+ struct ccbsnr_link *cclink;
+ unsigned int handle;
+ int cr = e->answer.cref;
struct pri_subcommand *subcmd = &e->answer.subcmds.subcmd[i];
switch (subcmd->cmd) {
case PRI_SUBCMD_CC_CCBSREQUEST_RR:
{
- struct ccbsnr_link *cclink;
- unsigned int handle;
- int cr = e->answer.cref;
int no_path_reservation = subcmd->cc_ccbs_rr.cc_request_res.no_path_reservation;
int retain_service = subcmd->cc_ccbs_rr.cc_request_res.retain_service;
@@ -15111,7 +15104,7 @@
"Answer ccbs-request RR no-path-reservation '%d' retain-service '%d' on channel %d/%d on span %d\n",
no_path_reservation, retain_service,
PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
- handle = CCBS_HANDLE(ccbsnronprispan,cr);
+ handle = CCBS_HANDLE(PRI_SPAN(e->answer.channel),cr);
cclink = ccbsnr_select_link(handle);
if (cclink) {
struct ast_channel *peer;
@@ -15134,16 +15127,13 @@
} else {
ast_verb(3,
"PRI_EVENT_ANSWER: CCBS-List-Obj not found: e->answer.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
- e->answer.channel, ccbsnronprispan, explicit, channel);
+ e->answer.channel, PRI_SPAN(e->answer.channel), PRI_EXPLICIT(e->answer.channel), e->answer.channel);
}
break;
}
case PRI_SUBCMD_CC_CCNRREQUEST_RR:
{
- struct ccbsnr_link *cclink;
- unsigned int handle;
- int cr = e->answer.cref;
int no_path_reservation = subcmd->cc_ccnr_rr.cc_request_res.no_path_reservation;
int retain_service = subcmd->cc_ccnr_rr.cc_request_res.retain_service;
@@ -15151,7 +15141,7 @@
"Answer ccnr-request RR no-path-reservation '%d' retain-service '%d' on channel %d/%d on span %d\n",
no_path_reservation, retain_service,
PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
- handle = CCBS_HANDLE(ccbsnronprispan,cr);
+ handle = CCBS_HANDLE(PRI_SPAN(e->answer.channel),cr);
cclink = ccbsnr_select_link(handle);
if (cclink) {
struct ast_channel *peer;
@@ -15171,7 +15161,7 @@
} else {
ast_verb(3,
"PRI_EVENT_ANSWER: CCBS-List-Obj not found: e->answer.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
- e->answer.channel, ccbsnronprispan, explicit, channel);
+ e->answer.channel, PRI_SPAN(e->answer.channel), PRI_EXPLICIT(e->answer.channel), e->answer.channel);
}
break;
}
@@ -15182,102 +15172,96 @@
break;
}
}
+ break;
+ }
+
+ chanpos = pri_find_principle(pri, e->answer.channel);
+ if (chanpos < 0) {
+ ast_log(LOG_WARNING, "Answer on unconfigured channel %d/%d span %d\n",
+ PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
} else {
- chanpos = pri_find_principle(pri, e->answer.channel);
+ chanpos = pri_fixup_principle(pri, chanpos, e->answer.call);
if (chanpos < 0) {
- ast_log(LOG_WARNING, "Answer on unconfigured channel %d/%d span %d\n",
+ ast_log(LOG_WARNING, "Answer requested on channel %d/%d not in use on span %d\n",
PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
} else {
- chanpos = pri_fixup_principle(pri, chanpos, e->answer.call);
- if (chanpos < 0) {
- ast_log(LOG_WARNING, "Answer requested on channel %d/%d not in use on span %d\n",
- PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span);
+ struct ast_party_connected_line connected;
+ struct ast_channel *owner;
+
+ ast_mutex_lock(&pri->pvts[chanpos]->lock);
+ /* Now we can do call progress detection */
+
+ /* We changed this so it turns on the DSP no matter what... progress or no progress.
+ * By this time, we need DTMF detection and other features that were previously disabled
+ * -- Matt F */
+ if (pri->pvts[chanpos]->dsp && pri->pvts[chanpos]->dsp_features) {
+ ast_dsp_set_features(pri->pvts[chanpos]->dsp, pri->pvts[chanpos]->dsp_features);
+ pri->pvts[chanpos]->dsp_features = 0;
+ }
+ if (pri->pvts[chanpos]->realcall && (pri->pvts[chanpos]->realcall->sig == SIG_FXSKS)) {
+ ast_debug(1, "Starting up GR-303 trunk now that we got CONNECT...\n");
+ x = DAHDI_START;
+ res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_HOOK, &x);
+ if (res < 0) {
+ if (errno != EINPROGRESS) {
+ ast_log(LOG_WARNING, "Unable to start channel: %s\n", strerror(errno));
+ }
+ }
+ } else if (!ast_strlen_zero(pri->pvts[chanpos]->dop.dialstr)) {
+ pri->pvts[chanpos]->dialing = 1;
+ /* Send any "w" waited stuff */
+ res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_DIAL, &pri->pvts[chanpos]->dop);
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d: %s\n", pri->pvts[chanpos]->channel, strerror(errno));
+ pri->pvts[chanpos]->dop.dialstr[0] = '\0';
+ } else
+ ast_debug(1, "Sent deferred digit string: %s\n", pri->pvts[chanpos]->dop.dialstr);
+
+ pri->pvts[chanpos]->dop.dialstr[0] = '\0';
+ } else if (pri->pvts[chanpos]->confirmanswer) {
+ ast_debug(1, "Waiting on answer confirmation on channel %d!\n", pri->pvts[chanpos]->channel);
} else {
- struct ast_party_connected_line connected;
- struct ast_channel *owner;
-
+ pri->pvts[chanpos]->subs[SUB_REAL].needanswer =1;
+ /* Enable echo cancellation if it's not on already */
+ dahdi_enable_ec(pri->pvts[chanpos]);
+ }
+
+ owner = pri->pvts[chanpos]->owner;
+#ifdef SUPPORT_USERUSER
+ if (!ast_strlen_zero(e->answer.useruserinfo)) {
+ ast_mutex_unlock(&pri->pvts[chanpos]->lock);
+ pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->answer.useruserinfo);
ast_mutex_lock(&pri->pvts[chanpos]->lock);
- /* Now we can do call progress detection */
-
- /* We changed this so it turns on the DSP no matter what... progress or no progress.
- * By this time, we need DTMF detection and other features that were previously disabled
- * -- Matt F */
- if (pri->pvts[chanpos]->dsp && pri->pvts[chanpos]->dsp_features) {
- ast_dsp_set_features(pri->pvts[chanpos]->dsp, pri->pvts[chanpos]->dsp_features);
- pri->pvts[chanpos]->dsp_features = 0;
- }
- if (pri->pvts[chanpos]->realcall && (pri->pvts[chanpos]->realcall->sig == SIG_FXSKS)) {
- ast_debug(1, "Starting up GR-303 trunk now that we got CONNECT...\n");
- x = DAHDI_START;
- res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_HOOK, &x);
- if (res < 0) {
- if (errno != EINPROGRESS) {
- ast_log(LOG_WARNING, "Unable to start channel: %s\n", strerror(errno));
- }
- }
- } else if (!ast_strlen_zero(pri->pvts[chanpos]->dop.dialstr)) {
- pri->pvts[chanpos]->dialing = 1;
- /* Send any "w" waited stuff */
- res = ioctl(pri->pvts[chanpos]->subs[SUB_REAL].dfd, DAHDI_DIAL, &pri->pvts[chanpos]->dop);
- if (res < 0) {
- ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d: %s\n", pri->pvts[chanpos]->channel, strerror(errno));
- pri->pvts[chanpos]->dop.dialstr[0] = '\0';
- } else
- ast_debug(1, "Sent deferred digit string: %s\n", pri->pvts[chanpos]->dop.dialstr);
-
- pri->pvts[chanpos]->dop.dialstr[0] = '\0';
- } else if (pri->pvts[chanpos]->confirmanswer) {
- ast_debug(1, "Waiting on answer confirmation on channel %d!\n", pri->pvts[chanpos]->channel);
- } else {
- pri->pvts[chanpos]->subs[SUB_REAL].needanswer =1;
- /* Enable echo cancellation if it's not on already */
- dahdi_enable_ec(pri->pvts[chanpos]);
- }
-
- owner = pri->pvts[chanpos]->owner;
-#ifdef SUPPORT_USERUSER
- if (!ast_strlen_zero(e->answer.useruserinfo)) {
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
- pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->answer.useruserinfo);
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- }
-#endif
-
- if (owner) {
- /* Update the connected line information on the other channel */
- ast_party_connected_line_init(&connected);
- connected.id.name = e->answer.connectedname;
- connected.id.number = e->answer.connectednum;
- connected.id.number_type = e->answer.connectedplan;
- connected.id.number_presentation = pri_to_ast_presentation(e->answer.connectedpres);
- connected.source = pri_to_ast_connected_line_update_source(e->answer.source);
- ast_channel_queue_connected_line_update(owner, &connected);
- }
-
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
}
+#endif
+
+ if (owner) {
+ /* Update the connected line information on the other channel */
+ ast_party_connected_line_init(&connected);
+ connected.id.name = e->answer.connectedname;
+ connected.id.number = e->answer.connectednum;
+ connected.id.number_type = e->answer.connectedplan;
+ connected.id.number_presentation = pri_to_ast_presentation(e->answer.connectedpres);
+ connected.source = pri_to_ast_connected_line_update_source(e->answer.source);
+ ast_channel_queue_connected_line_update(owner, &connected);
+ }
+
+ ast_mutex_unlock(&pri->pvts[chanpos]->lock);
}
}
break;
- }
case PRI_EVENT_HANGUP:
- {
- int errorvalue = 0;
- int channel = e->hangup.channel;
- int ccbsnronprispan = PRI_SPAN(channel);
- int explicit = PRI_EXPLICIT(channel);
- int i;
-
- channel = PRI_CHANNEL(channel);
-
ast_verb(4, "Channel %d/%d, span %d got hangup, cause %d\n",
- ccbsnronprispan, channel, pri->span, e->hangup.cause);
-
- if (channel == 0) { /* No channel Connection */
+ PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel),
+ pri->span, e->hangup.cause);
+ if (PRI_CHANNEL(e->hangup.channel) == 0) {
+ /* No channel Connection */
+ int errorvalue = 0;
struct ccbsnr_link *cclink;
unsigned int handle;
int cr;
unsigned int state;
+ int i;
for (i = 0; i < e->hangup.subcmds.counter_subcmd; i++) {
struct pri_subcommand *subcmd = &e->hangup.subcmds.subcmd[i];
@@ -15306,7 +15290,7 @@
cr = e->hangup.cref;
state = 0;
- handle = CCBS_HANDLE(ccbsnronprispan,cr);
+ handle = CCBS_HANDLE(PRI_SPAN(e->hangup.channel),cr);
cclink = ccbsnr_get_link(handle, &state);
if (cclink) {
switch (state) {
@@ -15315,7 +15299,7 @@
case CC_INVOKED_A_RET:
ast_verb(4,
"PRI_EVENT_HANGUP: CCBS-List-Obj 0x%p: handle %x e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d) error(%d) peer=%p\n",
- cclink, handle, e->hangup.channel, ccbsnronprispan, explicit, channel, errorvalue, cclink->peer);
+ cclink, handle, e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), errorvalue, cclink->peer);
pri_hangup(pri->pri, cclink->call, e->hangup.cause);
cclink->call = NULL;
@@ -15327,97 +15311,99 @@
}
} else {
ast_verb(4, "PRI_EVENT_HANGUP: CCBS-List-Obj not found: e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
- e->hangup.channel, ccbsnronprispan, explicit, channel);
+ e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel));
ast_verb(3, "Hangup on bad channel %d/%d on span %d\n",
PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
}
+ break;
+ }
+
+ chanpos = pri_find_principle(pri, e->hangup.channel);
+ if (chanpos < 0) {
+ ast_log(LOG_WARNING, "Hangup requested on unconfigured channel %d/%d span %d\n",
+ PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
} else {
- chanpos = pri_find_principle(pri, e->hangup.channel);
- if (chanpos < 0) {
- ast_log(LOG_WARNING, "Hangup requested on unconfigured channel %d/%d span %d\n",
- PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
- } else {
- chanpos = pri_fixup_principle(pri, chanpos, e->hangup.call);
- if (chanpos > -1) {
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- if (!pri->pvts[chanpos]->alreadyhungup) {
- /* we're calling here dahdi_hangup so once we get there we need to clear p->call after calling pri_hangup */
- pri->pvts[chanpos]->alreadyhungup = 1;
- if (pri->pvts[chanpos]->realcall)
- pri_hangup_all(pri->pvts[chanpos]->realcall, pri);
- else if (pri->pvts[chanpos]->owner) {
- /* Queue a BUSY instead of a hangup if our cause is appropriate */
- pri->pvts[chanpos]->owner->hangupcause = e->hangup.cause;
- if (pri->pvts[chanpos]->owner->_state == AST_STATE_UP)
+ chanpos = pri_fixup_principle(pri, chanpos, e->hangup.call);
+ if (chanpos > -1) {
+ int i;
+
+ ast_mutex_lock(&pri->pvts[chanpos]->lock);
+ if (!pri->pvts[chanpos]->alreadyhungup) {
+ /* we're calling here dahdi_hangup so once we get there we need to clear p->call after calling pri_hangup */
+ pri->pvts[chanpos]->alreadyhungup = 1;
+ if (pri->pvts[chanpos]->realcall)
+ pri_hangup_all(pri->pvts[chanpos]->realcall, pri);
+ else if (pri->pvts[chanpos]->owner) {
+ /* Queue a BUSY instead of a hangup if our cause is appropriate */
+ pri->pvts[chanpos]->owner->hangupcause = e->hangup.cause;
+ if (pri->pvts[chanpos]->owner->_state == AST_STATE_UP)
+ pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
+ else {
+ switch (e->hangup.cause) {
+ case PRI_CAUSE_USER_BUSY:
+ pri->pvts[chanpos]->subs[SUB_REAL].needbusy =1;
+ break;
+ case PRI_CAUSE_CALL_REJECTED:
+ case PRI_CAUSE_NETWORK_OUT_OF_ORDER:
+ case PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION:
+ case PRI_CAUSE_SWITCH_CONGESTION:
+ case PRI_CAUSE_DESTINATION_OUT_OF_ORDER:
+ case PRI_CAUSE_NORMAL_TEMPORARY_FAILURE:
+ pri->pvts[chanpos]->subs[SUB_REAL].needcongestion =1;
+ break;
+ default:
pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
- else {
- switch (e->hangup.cause) {
- case PRI_CAUSE_USER_BUSY:
- pri->pvts[chanpos]->subs[SUB_REAL].needbusy =1;
- break;
- case PRI_CAUSE_CALL_REJECTED:
- case PRI_CAUSE_NETWORK_OUT_OF_ORDER:
- case PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION:
- case PRI_CAUSE_SWITCH_CONGESTION:
- case PRI_CAUSE_DESTINATION_OUT_OF_ORDER:
- case PRI_CAUSE_NORMAL_TEMPORARY_FAILURE:
- pri->pvts[chanpos]->subs[SUB_REAL].needcongestion =1;
- break;
- default:
- pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
- break;
- }
+ break;
}
}
- ast_verb(3, "Channel %d/%d, span %d got hangup, cause %d\n",
- pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, e->hangup.cause);
- } else {
- pri_hangup(pri->pri, pri->pvts[chanpos]->call, e->hangup.cause);
- pri->pvts[chanpos]->call = NULL;
}
- if (e->hangup.cause == PRI_CAUSE_REQUESTED_CHAN_UNAVAIL) {
- ast_verb(3, "Forcing restart of channel %d/%d on span %d since channel reported in use\n",
- PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
- pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[chanpos]));
- pri->pvts[chanpos]->resetting = 1;
+ ast_verb(3, "Channel %d/%d, span %d got hangup, cause %d\n",
+ pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, e->hangup.cause);
+ } else {
+ pri_hangup(pri->pri, pri->pvts[chanpos]->call, e->hangup.cause);
+ pri->pvts[chanpos]->call = NULL;
+ }
+ if (e->hangup.cause == PRI_CAUSE_REQUESTED_CHAN_UNAVAIL) {
+ ast_verb(3, "Forcing restart of channel %d/%d on span %d since channel reported in use\n",
+ PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
+ pri_reset(pri->pri, PVT_TO_CHANNEL(pri->pvts[chanpos]));
+ pri->pvts[chanpos]->resetting = 1;
+ }
+ if (e->hangup.aoc_units > -1)
+ ast_verb(3, "Channel %d/%d, span %d received AOC-E charging %d unit%s\n",
+ pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, (int)e->hangup.aoc_units, (e->hangup.aoc_units == 1) ? "" : "s");
+
+#ifdef SUPPORT_USERUSER
+ if (pri->pvts[chanpos]->owner && !ast_strlen_zero(e->hangup.useruserinfo)) {
+ struct ast_channel *owner = pri->pvts[chanpos]->owner;
+ ast_mutex_unlock(&pri->pvts[chanpos]->lock);
+ pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->hangup.useruserinfo);
+ ast_mutex_lock(&pri->pvts[chanpos]->lock);
+ }
+#endif
+ for (i = 0; i < e->hangup.subcmds.counter_subcmd; i++) {
+ struct pri_subcommand *subcmd = &e->hangup.subcmds.subcmd[i];
+
+ switch (subcmd->cmd) {
+ case PRI_SUBCMD_CC_RINGOUT_INV:
+ ast_verb(3, "Facility cc-suspend INV on channel %d/%d, span %d\n",
+ pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
+ break;
+
+ default:
+ ast_log(LOG_WARNING, "Illegal subcommand %d in hangup on channel %d/%d not in use on span %d\n",
+ subcmd->cmd, PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
+ break;
}
- if (e->hangup.aoc_units > -1)
- ast_verb(3, "Channel %d/%d, span %d received AOC-E charging %d unit%s\n",
- pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span, (int)e->hangup.aoc_units, (e->hangup.aoc_units == 1) ? "" : "s");
-
-#ifdef SUPPORT_USERUSER
- if (pri->pvts[chanpos]->owner && !ast_strlen_zero(e->hangup.useruserinfo)) {
- struct ast_channel *owner = pri->pvts[chanpos]->owner;
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
- pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->hangup.useruserinfo);
- ast_mutex_lock(&pri->pvts[chanpos]->lock);
- }
-#endif
- for (i = 0; i < e->hangup.subcmds.counter_subcmd; i++) {
- struct pri_subcommand *subcmd = &e->hangup.subcmds.subcmd[i];
-
- switch (subcmd->cmd) {
- case PRI_SUBCMD_CC_RINGOUT_INV:
- ast_verb(3, "Facility cc-suspend INV on channel %d/%d, span %d\n",
- pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
- break;
-
- default:
- ast_log(LOG_WARNING, "Illegal subcommand %d in hangup on channel %d/%d not in use on span %d\n",
- subcmd->cmd, PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
- break;
- }
- }
-
- ast_mutex_unlock(&pri->pvts[chanpos]->lock);
- } else {
- ast_log(LOG_WARNING, "Hangup on bad channel %d/%d on span %d\n",
- PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
}
+
+ ast_mutex_unlock(&pri->pvts[chanpos]->lock);
+ } else {
+ ast_log(LOG_WARNING, "Hangup on bad channel %d/%d on span %d\n",
+ PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span);
}
}
break;
- }
#ifndef PRI_EVENT_HANGUP_REQ
#error please update libpri
#endif
@@ -15485,34 +15471,30 @@
}
break;
case PRI_EVENT_HANGUP_ACK:
- {
- int channel = e->hangup.channel;
- int ccbsnronprispan = PRI_SPAN(channel);
- int explicit = PRI_EXPLICIT(channel);
- channel = PRI_CHANNEL(channel);
-
ast_verb(4, "PRI_EVENT_HANGUP_ACK e->hangup.cause(%d) e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d)\n",
- e->hangup.cause, e->hangup.channel, ccbsnronprispan, explicit, channel);
+ e->hangup.cause, e->hangup.channel, PRI_SPAN(e->hangup.channel),
+ PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel));
ast_verb(3, "Channel %d/%d, span %d got hangup, cause %d\n",
- ccbsnronprispan, channel, pri->span, e->hangup.cause);
- if (channel == 0) { /* No channel Connection */
+ PRI_SPAN(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), pri->span, e->hangup.cause);
+ if (PRI_CHANNEL(e->hangup.channel) == 0) {
+ /* No channel Connection */
struct ccbsnr_link *cclink;
unsigned int handle;
int cr = e->hangup.cref;
unsigned int state = 0;
- handle = CCBS_HANDLE(ccbsnronprispan,cr);
+ handle = CCBS_HANDLE(PRI_SPAN(e->hangup.channel),cr);
cclink = ccbsnr_get_link(handle, &state);
if (cclink) {
ast_verb(4,
"PRI_EVENT_HANGUP_ACK: CCBS-List-Obj 0x%p: handle %x e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d) peer=%p\n",
- cclink, handle, e->hangup.channel, ccbsnronprispan, explicit, channel, cclink->peer);
+ cclink, handle, e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel), cclink->peer);
cclink->call = NULL;
ccbsnr_del_link(handle);
} else {
ast_verb(4,
"PRI_EVENT_HANGUP_ACK: CCBS-List-Obj 0x%p: handle %x e->hangup.channel(0x%x) span(%d) explicit(%d) channel(%d)",
- cclink, handle, e->hangup.channel, ccbsnronprispan, explicit, channel);
+ cclink, handle, e->hangup.channel, PRI_SPAN(e->hangup.channel), PRI_EXPLICIT(e->hangup.channel), PRI_CHANNEL(e->hangup.channel));
}
break;
}
@@ -15544,7 +15526,6 @@
}
}
break;
- }
case PRI_EVENT_CONFIG_ERR:
ast_log(LOG_WARNING, "PRI Error on span %d: %s\n", pri->trunkgroup, e->err.err);
break;
More information about the svn-commits
mailing list