Support setting and receiving Reverse Charging Indication over ISDN PRI.
authorSean Bright <sean@malleable.com>
Thu, 2 Jul 2009 17:46:14 +0000 (17:46 +0000)
committerSean Bright <sean@malleable.com>
Thu, 2 Jul 2009 17:46:14 +0000 (17:46 +0000)
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: https://origsvn.digium.com/svn/asterisk/trunk@204749 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
channels/chan_dahdi.c
channels/sig_pri.c
channels/sig_pri.h
configs/chan_dahdi.conf.sample
funcs/func_channel.c

diff --git a/CHANGES b/CHANGES
index c0c1546..c74e393 100644 (file)
--- 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
index 7df0b59..8a93673 100644 (file)
@@ -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;
        }
 
index 464dde2..aac4061 100644 (file)
@@ -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",
index 80cfdd1..10f3618 100644 (file)
@@ -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 {
index 742de81..676c83e 100644 (file)
 ;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
index ec97df9..b151c19 100644 (file)
@@ -205,6 +205,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                                                <para>R/O Get the peer's username.</para>
                                        </enum>
                                </enumlist>
+                               <para><emphasis>chan_dahdi</emphasis> provides the following additional options:</para>
+                               <enumlist>
+                                       <enum name="reversecharge">
+                                               <para>R/O Reverse Charging Indication, one of:</para>
+                                               <enumlist>
+                                                       <enum name="-1 - None" />
+                                                       <enum name="1 - Reverse Charging Requested" />
+                                               </enumlist>
+                                       </enum>
+                               </enumlist>
                        </parameter>
                </syntax>
                <description>