From 0071975778c7b36b5c63d55df350397e63c45b3b Mon Sep 17 00:00:00 2001 From: seanbright Date: Thu, 2 Jul 2009 17:46:14 +0000 Subject: Support setting and receiving Reverse Charging Indication over ISDN PRI. This is a continuation of revision 885 to LibPRI (Capture and expose the Reverse Charging Indication IE on ISDN PRI) which added the ability to get/set Reverse Charging Indication in LibPRI. This patch adds the ability to specify RCI on the outbound leg of a PRI call from within Asterisk, by prefixing the dialed number with a capital 'C' like: ...,Dial(DAHDI/g1/C4445556666) And to read it off an inbound channel: exten => s,1,Set(RCI=${CHANNEL(reversecharge)}) Thanks again to rmudgett for the thorough review. (closes issue #13760) Reported by: mrgabu Review: https://reviewboard.asterisk.org/r/303/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@204749 f38db490-d61c-443f-a65b-d21fe96a405b --- CHANGES | 5 +++++ channels/chan_dahdi.c | 15 +++++++++++++-- channels/sig_pri.c | 11 +++++++++-- channels/sig_pri.h | 1 + configs/chan_dahdi.conf.sample | 5 +++++ funcs/func_channel.c | 10 ++++++++++ 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index c0c1546f2..c74e39336 100644 --- a/CHANGES +++ b/CHANGES @@ -47,6 +47,11 @@ IAX2 Changes * Added rtsavesysname option into iax.conf to allow the systname to be saved on realtime updates. +DAHDI Changes +------------- + * Added Reverse Charging Indication receipt & transmission (requires latest + LibPRI). + Applications ------------ * Added progress option to the app_dial D() option. When progress DTMF is diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 7df0b592b..8a93673d0 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -5403,7 +5403,7 @@ static int dahdi_func_read(struct ast_channel *chan, const char *function, char { struct dahdi_pvt *p = chan->tech_pvt; int res = 0; - + if (!strcasecmp(data, "rxgain")) { ast_mutex_lock(&p->lock); snprintf(buf, len, "%f", p->rxgain); @@ -5412,8 +5412,19 @@ 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); +#ifdef HAVE_PRI + } else if (!strcasecmp(data, "reversecharge")) { + ast_mutex_lock(&p->lock); + if (p->sig == SIG_PRI || p->sig == SIG_BRI || p->sig == SIG_BRI_PTMP) { + snprintf(buf, len, "%d", ((struct sig_pri_chan *) p->sig_pvt)->reverse_charging_indication); + } else { + *buf = '\0'; + res = -1; + } + ast_mutex_unlock(&p->lock); +#endif } else { - ast_copy_string(buf, "", len); + *buf = '\0'; res = -1; } diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 464dde23a..aac40616e 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -1163,7 +1163,8 @@ static void *pri_dchannel(void *vpri) pbx_builtin_setvar_helper(c, "CALLEDTON", calledtonstr); if (e->ring.redirectingreason >= 0) pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason)); - + pri->pvts[chanpos]->reverse_charging_indication = e->ring.reversecharge; + sig_pri_lock_private(pri->pvts[chanpos]); ast_mutex_lock(&pri->lock); @@ -1208,7 +1209,8 @@ static void *pri_dchannel(void *vpri) if (e->ring.redirectingreason >= 0) pbx_builtin_setvar_helper(c, "PRIREDIRECTREASON", redirectingreason2str(e->ring.redirectingreason)); - + pri->pvts[chanpos]->reverse_charging_indication = e->ring.reversecharge; + snprintf(calledtonstr, sizeof(calledtonstr)-1, "%d", e->ring.calledplan); pbx_builtin_setvar_helper(c, "CALLEDTON", calledtonstr); @@ -1888,6 +1890,11 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i case 'r': pridialplan = PRI_NPI_RESERVED | (pridialplan & 0xf0); break; +#if defined(PRI_REVERSECHARGE_REQUESTED) + case 'C': + pri_sr_set_reversecharge(sr, PRI_REVERSECHARGE_REQUESTED); + break; +#endif default: if (isalpha(c[p->stripmsd])) { ast_log(LOG_WARNING, "Unrecognized pridialplan %s modifier: %c\n", diff --git a/channels/sig_pri.h b/channels/sig_pri.h index 80cfdd190..10f3618ac 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -162,6 +162,7 @@ struct sig_pri_chan { struct sig_pri_callback *calls; void *chan_pvt; ast_mutex_t service_lock; /*!< Mutex for service messages */ + int reverse_charging_indication; }; struct sig_pri_pri { diff --git a/configs/chan_dahdi.conf.sample b/configs/chan_dahdi.conf.sample index 742de81bd..676c83ec9 100644 --- a/configs/chan_dahdi.conf.sample +++ b/configs/chan_dahdi.conf.sample @@ -77,6 +77,11 @@ ;service_message_support=yes ; Enable service message support for channel. Must be set after switchtype. ; +; PRI Reverse Charging Indication: Indicate to the called party that the +; call will be reverse charged. To enable, prefix the dialed number with one +; of the following letters: +; C - Reverse Charge Indication Requested +; ; PRI Dialplan: The ISDN-level Type Of Number (TON) or numbering plan, used for ; the dialed number. For most installations, leaving this as 'unknown' (the ; default) works in the most cases. In some very unusual circumstances, you diff --git a/funcs/func_channel.c b/funcs/func_channel.c index ec97df9d6..b151c19d1 100644 --- a/funcs/func_channel.c +++ b/funcs/func_channel.c @@ -205,6 +205,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") R/O Get the peer's username. + chan_dahdi provides the following additional options: + + + R/O Reverse Charging Indication, one of: + + + + + + -- cgit v1.2.3