]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix the analog dial *0 flash-hook of bridged peer feature.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 8 Aug 2012 20:04:44 +0000 (20:04 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 8 Aug 2012 20:04:44 +0000 (20:04 +0000)
The flash-hook the bridged peer feature now correctly determines if the
bridged peer is another chan_dahdi channel, that it is an analog channel,
and that it has the correct signaling for an FXO port.  It now also
flash-hooks the correct channel.
........

Merged revisions 370900 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@370901 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_analog.c
channels/sig_analog.h

index 07b50a503d7981466f0c50242816ac5f477715fd..b7070f2a44801a96fb87f6bcfe5a4d50c0c2a850 100644 (file)
@@ -1580,6 +1580,47 @@ static inline int dahdi_sig_pri_lib_handles(int signaling)
        return handles;
 }
 
+static int analog_lib_handles(int signalling, int radio, int oprmode)
+{
+       switch (signalling) {
+       case SIG_FXOLS:
+       case SIG_FXOGS:
+       case SIG_FXOKS:
+       case SIG_FXSLS:
+       case SIG_FXSGS:
+       case SIG_FXSKS:
+       case SIG_EMWINK:
+       case SIG_EM:
+       case SIG_EM_E1:
+       case SIG_FEATD:
+       case SIG_FEATDMF:
+       case SIG_E911:
+       case SIG_FGC_CAMA:
+       case SIG_FGC_CAMAMF:
+       case SIG_FEATB:
+       case SIG_SFWINK:
+       case SIG_SF:
+       case SIG_SF_FEATD:
+       case SIG_SF_FEATDMF:
+       case SIG_FEATDMF_TA:
+       case SIG_SF_FEATB:
+               break;
+       default:
+               /* The rest of the function should cover the remainder of signalling types */
+               return 0;
+       }
+
+       if (radio) {
+               return 0;
+       }
+
+       if (oprmode) {
+               return 0;
+       }
+
+       return 1;
+}
+
 static enum analog_sigtype dahdisig_to_analogsig(int sig)
 {
        switch (sig) {
@@ -2233,11 +2274,16 @@ static void my_get_and_handle_alarms(void *pvt)
 
 static void *my_get_sigpvt_bridged_channel(struct ast_channel *chan)
 {
-       struct dahdi_pvt *p = ast_bridged_channel(chan)->tech_pvt;
-       if (p)
-               return p->sig_pvt;
-       else
-               return NULL;
+       struct ast_channel *bridged = ast_bridged_channel(chan);
+
+       if (bridged && bridged->tech == &dahdi_tech) {
+               struct dahdi_pvt *p = bridged->tech_pvt;
+
+               if (analog_lib_handles(p->sig, p->radio, p->oprmode)) {
+                       return p->sig_pvt;
+               }
+       }
+       return NULL;
 }
 
 static int my_get_sub_fd(void *pvt, enum analog_sub sub)
@@ -4693,45 +4739,6 @@ static char *dahdi_sig2str(int sig)
 
 #define sig2str dahdi_sig2str
 
-static int analog_lib_handles(int signalling, int radio, int oprmode)
-{
-       switch (signalling) {
-       case SIG_FXOLS:
-       case SIG_FXOGS:
-       case SIG_FXOKS:
-       case SIG_FXSLS:
-       case SIG_FXSGS:
-       case SIG_FXSKS:
-       case SIG_EMWINK:
-       case SIG_EM:
-       case SIG_EM_E1:
-       case SIG_FEATD:
-       case SIG_FEATDMF:
-       case SIG_E911:
-       case SIG_FGC_CAMA:
-       case SIG_FGC_CAMAMF:
-       case SIG_FEATB:
-       case SIG_SFWINK:
-       case SIG_SF:
-       case SIG_SF_FEATD:
-       case SIG_SF_FEATDMF:
-       case SIG_FEATDMF_TA:
-       case SIG_SF_FEATB:
-               break;
-       default:
-               /* The rest of the function should cover the remainder of signalling types */
-               return 0;
-       }
-
-       if (radio)
-               return 0;
-
-       if (oprmode)
-               return 0;
-
-       return 1;
-}
-
 static int conf_add(struct dahdi_pvt *p, struct dahdi_subchannel *c, int idx, int slavechannel)
 {
        /* If the conference already exists, and we're already in it
@@ -13216,7 +13223,6 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
                                analog_p->callwaitingcallerid = conf->chan.callwaitingcallerid;
                                analog_p->ringt = conf->chan.ringt;
                                analog_p->ringt_base = ringt_base;
-                               analog_p->chan_tech = &dahdi_tech;
                                analog_p->onhooktime = time(NULL);
                                if (chan_sig & __DAHDI_SIG_FXO) {
                                        memset(&p, 0, sizeof(p));
index 35593ad055601b7541feba634fbdc96126615db1..eb13eb7f89d221d8b88a2bcde0d054f09f20cc17 100644 (file)
@@ -1708,7 +1708,7 @@ static void analog_get_and_handle_alarms(struct analog_pvt *p)
 static void *analog_get_bridged_channel(struct analog_pvt *p, struct ast_channel *chan)
 {
        if (p->calls->get_sigpvt_bridged_channel) {
-               return p->calls->get_sigpvt_bridged_channel;
+               return p->calls->get_sigpvt_bridged_channel(chan);
        }
        return NULL;
 }
@@ -2312,18 +2312,16 @@ static void *__analog_ss_thread(void *data)
                                struct ast_channel *nbridge = p->subs[ANALOG_SUB_THREEWAY].owner;
                                struct analog_pvt *pbridge = NULL;
                                /* set up the private struct of the bridged one, if any */
-                               if (nbridge && ast_bridged_channel(nbridge)) {
+                               if (nbridge) {
                                        pbridge = analog_get_bridged_channel(p, nbridge);
                                }
-                               if (nbridge && pbridge &&
-                                   (nbridge->tech == p->chan_tech) &&
-                                   (ast_bridged_channel(nbridge)->tech == p->chan_tech) &&
-                                   ISTRUNK(pbridge)) {
+                               if (pbridge && ISTRUNK(pbridge)) {
                                        /* Clear out the dial buffer */
                                        p->dop.dialstr[0] = '\0';
                                        /* flash hookswitch */
-                                       if ((analog_flash(p) == -1) && (errno != EINPROGRESS)) {
-                                               ast_log(LOG_WARNING, "Unable to flash external trunk on channel %s: %s\n",
+                                       if ((analog_flash(pbridge) == -1) && (errno != EINPROGRESS)) {
+                                               ast_log(LOG_WARNING,
+                                                       "Unable to flash-hook bridged trunk from channel %s: %s\n",
                                                        nbridge->name, strerror(errno));
                                        }
                                        analog_swap_subs(p, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY);
index dac5a0b552fadc26ff4f1ddf2dd2b7b3fbfafd39..7b94b2df4e3c3dbf2204f8f7c683ec229ba39c96 100644 (file)
@@ -288,7 +288,6 @@ struct analog_pvt {
        unsigned int use_smdi:1;
        /*! \brief The SMDI interface to get SMDI messages from. */
        struct ast_smdi_interface *smdi_iface;
-       const struct ast_channel_tech *chan_tech;
 
        /* Not used for anything but log messages.  Could be just the TCID */
        int channel;                                    /*!< Channel Number */