summaryrefslogtreecommitdiff
path: root/channels/chan_dahdi.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2012-08-08 20:17:02 +0000
committerRichard Mudgett <rmudgett@digium.com>2012-08-08 20:17:02 +0000
commitf1dce57742ce5fdcdad03706136c9398588af453 (patch)
tree342f57cd04cbbefb4d586f31c8b63e9f9bec2e76 /channels/chan_dahdi.c
parent35bf5efeaf9c6aefb16ddd9fa603e796aef4a501 (diff)
Fix the analog dial *0 flash-hook of bridged peer feature.
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 ........ Merged revisions 370901 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@370902 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_dahdi.c')
-rw-r--r--channels/chan_dahdi.c96
1 files changed, 51 insertions, 45 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index f87b500f9..ffd9bcaff 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -1598,6 +1598,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) {
@@ -2256,11 +2297,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_channel_tech_pvt(ast_bridged_channel(chan));
- if (p)
- return p->sig_pvt;
- else
- return NULL;
+ struct ast_channel *bridged = ast_bridged_channel(chan);
+
+ if (bridged && ast_channel_tech(bridged) == &dahdi_tech) {
+ struct dahdi_pvt *p = ast_channel_tech_pvt(bridged);
+
+ 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)
@@ -4765,45 +4811,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
@@ -13376,7 +13383,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));