2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 1999 - 2006, Digium, Inc.
6 * Mark Spencer <markster@digium.com>
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
21 * \brief Zaptel Pseudo TDM interface
23 * \author Mark Spencer <markster@digium.com>
25 * Connects to the zaptel telephony library as well as
26 * libpri. Libpri is optional and needed only if you are
27 * going to use ISDN connections.
29 * You need to install libraries before you attempt to compile
30 * and install the zaptel channel.
33 * \arg \ref Config_zap
35 * \ingroup channel_drivers
37 * \todo Deprecate the "musiconhold" configuration option post 1.4
41 <depend>zaptel</depend>
42 <depend>tonezone</depend>
49 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
57 #include <sys/signal.h>
61 #if !defined(SOLARIS) && !defined(__FreeBSD__)
65 #include <sys/ioctl.h>
68 #include <zaptel/zaptel.h>
69 #include <zaptel/tonezone.h>
79 #include "asterisk/lock.h"
80 #include "asterisk/channel.h"
81 #include "asterisk/config.h"
82 #include "asterisk/logger.h"
83 #include "asterisk/module.h"
84 #include "asterisk/pbx.h"
85 #include "asterisk/options.h"
86 #include "asterisk/file.h"
87 #include "asterisk/ulaw.h"
88 #include "asterisk/alaw.h"
89 #include "asterisk/callerid.h"
90 #include "asterisk/adsi.h"
91 #include "asterisk/cli.h"
92 #include "asterisk/cdr.h"
93 #include "asterisk/features.h"
94 #include "asterisk/musiconhold.h"
95 #include "asterisk/say.h"
96 #include "asterisk/tdd.h"
97 #include "asterisk/app.h"
98 #include "asterisk/dsp.h"
99 #include "asterisk/astdb.h"
100 #include "asterisk/manager.h"
101 #include "asterisk/causes.h"
102 #include "asterisk/term.h"
103 #include "asterisk/utils.h"
104 #include "asterisk/transcap.h"
105 #include "asterisk/stringfields.h"
106 #include "asterisk/abstract_jb.h"
107 #include "asterisk/smdi.h"
108 #include "asterisk/astobj.h"
109 #define SMDI_MD_WAIT_TIMEOUT 1500 /* 1.5 seconds */
111 /*! Global jitterbuffer configuration - by default, jb is disabled */
112 static struct ast_jb_conf default_jbconf =
116 .resync_threshold = -1,
119 static struct ast_jb_conf global_jbconf;
121 #if !defined(ZT_SIG_EM_E1) || (defined(HAVE_PRI) && !defined(ZT_SIG_HARDHDLC))
122 #error "Your zaptel is too old. Please update"
125 #ifndef ZT_TONEDETECT
126 /* Work around older code with no tone detect */
127 #define ZT_EVENT_DTMFDOWN 0
128 #define ZT_EVENT_DTMFUP 0
131 /* define this to send PRI user-user information elements */
132 #undef SUPPORT_USERUSER
135 * \note Define ZHONE_HACK to cause us to go off hook and then back on hook when
136 * the user hangs up to reset the state machine so ring works properly.
137 * This is used to be able to support kewlstart by putting the zhone in
138 * groundstart mode since their forward disconnect supervision is entirely
139 * broken even though their documentation says it isn't and their support
140 * is entirely unwilling to provide any assistance with their channel banks
141 * even though their web site says they support their products for life.
143 /* #define ZHONE_HACK */
146 * Define if you want to check the hook state for an FXO (FXS signalled) interface
147 * before dialing on it. Certain FXO interfaces always think they're out of
148 * service with this method however.
150 /* #define ZAP_CHECK_HOOKSTATE */
152 /*! \brief Typically, how many rings before we should send Caller*ID */
153 #define DEFAULT_CIDRINGS 1
155 #define CHANNEL_PSEUDO -12
157 #define AST_LAW(p) (((p)->law == ZT_LAW_ALAW) ? AST_FORMAT_ALAW : AST_FORMAT_ULAW)
159 /*! \brief Signaling types that need to use MF detection should be placed in this macro */
160 #define NEED_MFDETECT(p) (((p)->sig == SIG_FEATDMF) || ((p)->sig == SIG_FEATDMF_TA) || ((p)->sig == SIG_E911) || ((p)->sig == SIG_FGC_CAMA) || ((p)->sig == SIG_FGC_CAMAMF) || ((p)->sig == SIG_FEATB))
162 static const char tdesc[] = "Zapata Telephony Driver"
171 static const char config[] = "zapata.conf";
173 #define SIG_EM ZT_SIG_EM
174 #define SIG_EMWINK (0x0100000 | ZT_SIG_EM)
175 #define SIG_FEATD (0x0200000 | ZT_SIG_EM)
176 #define SIG_FEATDMF (0x0400000 | ZT_SIG_EM)
177 #define SIG_FEATB (0x0800000 | ZT_SIG_EM)
178 #define SIG_E911 (0x1000000 | ZT_SIG_EM)
179 #define SIG_FEATDMF_TA (0x2000000 | ZT_SIG_EM)
180 #define SIG_FGC_CAMA (0x4000000 | ZT_SIG_EM)
181 #define SIG_FGC_CAMAMF (0x8000000 | ZT_SIG_EM)
182 #define SIG_FXSLS ZT_SIG_FXSLS
183 #define SIG_FXSGS ZT_SIG_FXSGS
184 #define SIG_FXSKS ZT_SIG_FXSKS
185 #define SIG_FXOLS ZT_SIG_FXOLS
186 #define SIG_FXOGS ZT_SIG_FXOGS
187 #define SIG_FXOKS ZT_SIG_FXOKS
188 #define SIG_PRI ZT_SIG_CLEAR
189 #define SIG_SS7 (0x1000000 | ZT_SIG_CLEAR)
190 #define SIG_SF ZT_SIG_SF
191 #define SIG_SFWINK (0x0100000 | ZT_SIG_SF)
192 #define SIG_SF_FEATD (0x0200000 | ZT_SIG_SF)
193 #define SIG_SF_FEATDMF (0x0400000 | ZT_SIG_SF)
194 #define SIG_SF_FEATB (0x0800000 | ZT_SIG_SF)
195 #define SIG_EM_E1 ZT_SIG_EM_E1
196 #define SIG_GR303FXOKS (0x0100000 | ZT_SIG_FXOKS)
197 #define SIG_GR303FXSKS (0x0100000 | ZT_SIG_FXSKS)
200 #define NUM_DCHANS 4 /*!< No more than 4 d-channels */
201 #define MAX_CHANNELS 672 /*!< No more than a DS3 per trunk group */
203 #define CHAN_PSEUDO -2
205 #define DCHAN_PROVISIONED (1 << 0)
206 #define DCHAN_NOTINALARM (1 << 1)
207 #define DCHAN_UP (1 << 2)
209 #define DCHAN_AVAILABLE (DCHAN_PROVISIONED | DCHAN_NOTINALARM | DCHAN_UP)
211 static char context[AST_MAX_CONTEXT] = "default";
212 static char cid_num[256] = "";
213 static char cid_name[256] = "";
214 static char defaultcic[64] = "";
215 static char defaultozz[64] = "";
217 static char language[MAX_LANGUAGE] = "";
218 static char mohinterpret[MAX_MUSICCLASS] = "default";
219 static char mohsuggest[MAX_MUSICCLASS] = "";
220 static char progzone[10] = "";
222 static int usedistinctiveringdetection = 0;
223 static int distinctiveringaftercid = 0;
225 static int transfertobusy = 1;
227 static int use_callerid = 1;
228 static int cid_signalling = CID_SIG_BELL;
229 static int cid_start = CID_START_RING;
230 static int zaptrcallerid = 0;
231 static int cur_radio = 0;
232 static int cur_signalling = -1;
233 static int cur_outsignalling = -1;
235 static ast_group_t cur_group = 0;
236 static ast_group_t cur_callergroup = 0;
237 static ast_group_t cur_pickupgroup = 0;
238 static int relaxdtmf = 0;
240 static int immediate = 0;
242 static int stripmsd = 0;
244 static int callwaiting = 0;
246 static int callwaitingcallerid = 0;
248 static int hidecallerid = 0;
250 static int hidecalleridname = 0;
252 static int restrictcid = 0;
254 static int use_callingpres = 0;
256 static int callreturn = 0;
258 static int threewaycalling = 0;
260 static int transfer = 0;
262 static int canpark = 0;
264 static int cancallforward = 0;
266 static float rxgain = 0.0;
268 static float txgain = 0.0;
270 static int tonezone = -1;
272 static int echocancel;
274 static int echotraining;
278 static int echocanbridged = 0;
280 static int busydetect = 0;
282 static int busycount = 3;
283 static int busy_tonelength = 0;
284 static int busy_quietlength = 0;
286 static int callprogress = 0;
288 static char accountcode[AST_MAX_ACCOUNT_CODE] = "";
290 static char mailbox[AST_MAX_EXTENSION];
292 static int amaflags = 0;
295 static int use_smdi = 0;
296 static char smdi_port[SMDI_MAX_FILENAME_LEN] = "/dev/ttyS0";
297 static int numbufs = 4;
299 static int cur_prewink = -1;
300 static int cur_preflash = -1;
301 static int cur_wink = -1;
302 static int cur_flash = -1;
303 static int cur_start = -1;
304 static int cur_rxwink = -1;
305 static int cur_rxflash = -1;
306 static int cur_debounce = -1;
307 static int cur_priexclusive = 0;
309 static int priindication_oob = 0;
312 static int minunused = 2;
313 static int minidle = 0;
314 static char idleext[AST_MAX_EXTENSION];
315 static char idledial[AST_MAX_EXTENSION];
316 static int overlapdial = 0;
317 static int facilityenable = 0;
318 static char internationalprefix[10] = "";
319 static char nationalprefix[10] = "";
320 static char localprefix[20] = "";
321 static char privateprefix[20] = "";
322 static char unknownprefix[20] = "";
323 static long resetinterval = 3600; /*!< How often (in seconds) to reset unused channels. Default 1 hour. */
324 static struct ast_channel inuse;
325 #ifdef PRI_GETSET_TIMERS
326 static int pritimers[PRI_MAX_TIMERS];
328 static int pridebugfd = -1;
329 static char pridebugfilename[1024] = "";
332 /*! \brief Wait up to 16 seconds for first digit (FXO logic) */
333 static int firstdigittimeout = 16000;
335 /*! \brief How long to wait for following digits (FXO logic) */
336 static int gendigittimeout = 8000;
338 /*! \brief How long to wait for an extra digit, if there is an ambiguous match */
339 static int matchdigittimeout = 3000;
341 /*! \brief Protect the interface list (of zt_pvt's) */
342 AST_MUTEX_DEFINE_STATIC(iflock);
345 static int ifcount = 0;
348 AST_MUTEX_DEFINE_STATIC(pridebugfdlock);
351 /*! \brief Whether we answer on a Polarity Switch event */
352 static int answeronpolarityswitch = 0;
354 /*! \brief Whether we hang up on a Polarity Switch event */
355 static int hanguponpolarityswitch = 0;
357 /*! \brief How long (ms) to ignore Polarity Switch events after we answer a call */
358 static int polarityonanswerdelay = 600;
360 /*! \brief When to send the CallerID signals (rings) */
361 static int sendcalleridafter = DEFAULT_CIDRINGS;
363 /*! \brief Protect the monitoring thread, so only one process can kill or start it, and not
364 when it's doing something critical. */
365 AST_MUTEX_DEFINE_STATIC(monlock);
367 /*! \brief This is the thread for the monitor which checks for input on the channels
368 which are not currently in use. */
369 static pthread_t monitor_thread = AST_PTHREADT_NULL;
371 static int restart_monitor(void);
373 static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms);
375 static int zt_sendtext(struct ast_channel *c, const char *text);
377 /*! \brief Avoid the silly zt_getevent which ignores a bunch of events */
378 static inline int zt_get_event(int fd)
381 if (ioctl(fd, ZT_GETEVENT, &j) == -1)
386 /*! \brief Avoid the silly zt_waitevent which ignores a bunch of events */
387 static inline int zt_wait_event(int fd)
390 i = ZT_IOMUX_SIGEVENT;
391 if (ioctl(fd, ZT_IOMUX, &i) == -1)
393 if (ioctl(fd, ZT_GETEVENT, &j) == -1)
398 /*! Chunk size to read -- we use 20ms chunks to make things happy. */
399 #define READ_SIZE 160
401 #define MASK_AVAIL (1 << 0) /*!< Channel available for PRI use */
402 #define MASK_INUSE (1 << 1) /*!< Channel currently in use */
404 #define CALLWAITING_SILENT_SAMPLES ( (300 * 8) / READ_SIZE) /*!< 300 ms */
405 #define CALLWAITING_REPEAT_SAMPLES ( (10000 * 8) / READ_SIZE) /*!< 300 ms */
406 #define CIDCW_EXPIRE_SAMPLES ( (500 * 8) / READ_SIZE) /*!< 500 ms */
407 #define MIN_MS_SINCE_FLASH ( (2000) ) /*!< 2000 ms */
408 #define DEFAULT_RINGT ( (8000 * 8) / READ_SIZE)
412 static int ringt_base = DEFAULT_RINGT;
416 #define LINKSTATE_INALARM (1 << 0)
417 #define LINKSTATE_STARTING (1 << 1)
418 #define LINKSTATE_UP (1 << 2)
419 #define LINKSTATE_DOWN (1 << 3)
422 pthread_t master; /*!< Thread of master */
426 int linkstate[NUM_DCHANS];
430 struct zt_pvt *pvts[MAX_CHANNELS]; /*!< Member channel pvt structs */
433 static struct zt_ss7 linksets[NUM_SPANS];
435 static int cur_ss7type = -1;
436 static int cur_linkset = -1;
437 static int cur_pointcode = -1;
438 static int cur_cicbeginswith = -1;
439 static int cur_adjpointcode = -1;
440 static int cur_networkindicator = -1;
441 static int cur_defaultdpc = -1;
442 #endif /* HAVE_SS7 */
446 #define PVT_TO_CHANNEL(p) (((p)->prioffset) | ((p)->logicalspan << 8) | (p->pri->mastertrunkgroup ? 0x10000 : 0))
447 #define PRI_CHANNEL(p) ((p) & 0xff)
448 #define PRI_SPAN(p) (((p) >> 8) & 0xff)
449 #define PRI_EXPLICIT(p) (((p) >> 16) & 0x01)
452 pthread_t master; /*!< Thread of master */
453 ast_mutex_t lock; /*!< Mutex */
454 char idleext[AST_MAX_EXTENSION]; /*!< Where to idle extra calls */
455 char idlecontext[AST_MAX_CONTEXT]; /*!< What context to use for idle */
456 char idledial[AST_MAX_EXTENSION]; /*!< What to dial before dumping */
457 int minunused; /*!< Min # of channels to keep empty */
458 int minidle; /*!< Min # of "idling" calls to keep active */
459 int nodetype; /*!< Node type */
460 int switchtype; /*!< Type of switch to emulate */
461 int nsf; /*!< Network-Specific Facilities */
462 int dialplan; /*!< Dialing plan */
463 int localdialplan; /*!< Local dialing plan */
464 char internationalprefix[10]; /*!< country access code ('00' for european dialplans) */
465 char nationalprefix[10]; /*!< area access code ('0' for european dialplans) */
466 char localprefix[20]; /*!< area access code + area code ('0'+area code for european dialplans) */
467 char privateprefix[20]; /*!< for private dialplans */
468 char unknownprefix[20]; /*!< for unknown dialplans */
469 int dchannels[NUM_DCHANS]; /*!< What channel are the dchannels on */
470 int trunkgroup; /*!< What our trunkgroup is */
471 int mastertrunkgroup; /*!< What trunk group is our master */
472 int prilogicalspan; /*!< Logical span number within trunk group */
473 int numchans; /*!< Num of channels we represent */
474 int overlapdial; /*!< In overlap dialing mode */
475 int facilityenable; /*!< Enable facility IEs */
476 struct pri *dchans[NUM_DCHANS]; /*!< Actual d-channels */
477 int dchanavail[NUM_DCHANS]; /*!< Whether each channel is available */
478 struct pri *pri; /*!< Currently active D-channel */
480 int fds[NUM_DCHANS]; /*!< FD's for d-channels */
485 time_t lastreset; /*!< time when unused channels were last reset */
486 long resetinterval; /*!< Interval (in seconds) for resetting unused channels */
487 struct zt_pvt *pvts[MAX_CHANNELS]; /*!< Member channel pvt structs */
488 struct zt_pvt *crvs; /*!< Member CRV structs */
489 struct zt_pvt *crvend; /*!< Pointer to end of CRV structs */
493 static struct zt_pri pris[NUM_SPANS];
495 static int pritype = PRI_CPE;
498 #define DEFAULT_PRI_DEBUG (PRI_DEBUG_Q931_DUMP | PRI_DEBUG_Q921_DUMP | PRI_DEBUG_Q921_RAW | PRI_DEBUG_Q921_STATE)
500 #define DEFAULT_PRI_DEBUG 0
503 static inline void pri_rel(struct zt_pri *pri)
505 ast_mutex_unlock(&pri->lock);
508 static int switchtype = PRI_SWITCH_NI2;
509 static int nsf = PRI_NSF_NONE;
510 static int dialplan = PRI_NATIONAL_ISDN + 1;
511 static int localdialplan = PRI_NATIONAL_ISDN + 1;
514 /*! Shut up the compiler */
518 #define SUB_REAL 0 /*!< Active call */
519 #define SUB_CALLWAIT 1 /*!< Call-Waiting call on hold */
520 #define SUB_THREEWAY 2 /*!< Three-way call */
522 /* Polarity states */
523 #define POLARITY_IDLE 0
524 #define POLARITY_REV 1
527 static struct zt_distRings drings;
529 struct distRingData {
532 struct ringContextData {
533 char contextData[AST_MAX_CONTEXT];
535 struct zt_distRings {
536 struct distRingData ringnum[3];
537 struct ringContextData ringContext[3];
540 static char *subnames[] = {
546 struct zt_subchannel {
548 struct ast_channel *owner;
550 short buffer[AST_FRIENDLY_OFFSET/2 + READ_SIZE];
551 struct ast_frame f; /*!< One frame for each channel. How did this ever work before? */
552 unsigned int needringing:1;
553 unsigned int needbusy:1;
554 unsigned int needcongestion:1;
555 unsigned int needcallerid:1;
556 unsigned int needanswer:1;
557 unsigned int needflash:1;
558 unsigned int needhold:1;
559 unsigned int needunhold:1;
560 unsigned int linear:1;
561 unsigned int inthreeway:1;
565 #define CONF_USER_REAL (1 << 0)
566 #define CONF_USER_THIRDCALL (1 << 1)
570 static struct zt_pvt {
572 struct ast_channel *owner; /*!< Our current active owner (if applicable) */
573 /*!< Up to three channels can be associated with this call */
575 struct zt_subchannel sub_unused; /*!< Just a safety precaution */
576 struct zt_subchannel subs[3]; /*!< Sub-channels */
577 struct zt_confinfo saveconf; /*!< Saved conference info */
579 struct zt_pvt *slaves[MAX_SLAVES]; /*!< Slave to us (follows our conferencing) */
580 struct zt_pvt *master; /*!< Master to us (we follow their conferencing) */
581 int inconference; /*!< If our real should be in the conference */
583 int sig; /*!< Signalling style */
584 int radio; /*!< radio type */
585 int outsigmod; /*!< Outbound Signalling style (modifier) */
586 int oprmode; /*!< "Operator Services" mode */
587 struct zt_pvt *oprpeer; /*!< "Operator Services" peer tech_pvt ptr */
590 int tonezone; /*!< tone zone for this chan, or -1 for default */
591 struct zt_pvt *next; /*!< Next channel in list */
592 struct zt_pvt *prev; /*!< Prev channel in list */
596 unsigned int answeronpolarityswitch:1;
597 unsigned int busydetect:1;
598 unsigned int callreturn:1;
599 unsigned int callwaiting:1;
600 unsigned int callwaitingcallerid:1;
601 unsigned int cancallforward:1;
602 unsigned int canpark:1;
603 unsigned int confirmanswer:1; /*!< Wait for '#' to confirm answer */
604 unsigned int destroy:1;
605 unsigned int didtdd:1; /*!< flag to say its done it once */
606 unsigned int dialednone:1;
607 unsigned int dialing:1;
608 unsigned int digital:1;
610 unsigned int echobreak:1;
611 unsigned int echocanbridged:1;
612 unsigned int echocanon:1;
613 unsigned int faxhandled:1; /*!< Has a fax tone already been handled? */
614 unsigned int firstradio:1;
615 unsigned int hanguponpolarityswitch:1;
616 unsigned int hardwaredtmf:1;
617 unsigned int hidecallerid;
618 unsigned int hidecalleridname; /*!< Hide just the name not the number for legacy PBX use */
619 unsigned int ignoredtmf:1;
620 unsigned int immediate:1; /*!< Answer before getting digits? */
621 unsigned int inalarm:1;
622 unsigned int mate:1; /*!< flag to say its in MATE mode */
623 unsigned int outgoing:1;
624 unsigned int overlapdial:1;
625 unsigned int permcallwaiting:1;
626 unsigned int permhidecallerid:1; /*!< Whether to hide our outgoing caller ID or not */
627 unsigned int priindication_oob:1;
628 unsigned int priexclusive:1;
629 unsigned int pulse:1;
630 unsigned int pulsedial:1; /*!< whether a pulse dial phone is detected */
631 unsigned int restrictcid:1; /*!< Whether restrict the callerid -> only send ANI */
632 unsigned int threewaycalling:1;
633 unsigned int transfer:1;
634 unsigned int use_callerid:1; /*!< Whether or not to use caller id on this channel */
635 unsigned int use_callingpres:1; /*!< Whether to use the callingpres the calling switch sends */
636 unsigned int usedistinctiveringdetection:1;
637 unsigned int zaptrcallerid:1; /*!< should we use the callerid from incoming call on zap transfer or not */
638 unsigned int transfertobusy:1; /*!< allow flash-transfers to busy channels */
639 /* Channel state or unavilability flags */
640 unsigned int inservice:1;
641 unsigned int locallyblocked:1;
642 unsigned int remotelyblocked:1;
643 #if defined(HAVE_PRI)
644 unsigned int alerting:1;
645 unsigned int alreadyhungup:1;
646 unsigned int isidlecall:1;
647 unsigned int proceeding:1;
648 unsigned int progress:1;
649 unsigned int resetting:1;
650 unsigned int setup_ack:1;
652 unsigned int use_smdi:1; /* Whether to use SMDI on this channel */
653 struct ast_smdi_interface *smdi_iface; /* The serial port to listen for SMDI data on */
655 struct zt_distRings drings;
657 char context[AST_MAX_CONTEXT];
658 char defcontext[AST_MAX_CONTEXT];
659 char exten[AST_MAX_EXTENSION];
660 char language[MAX_LANGUAGE];
661 char mohinterpret[MAX_MUSICCLASS];
662 char mohsuggest[MAX_MUSICCLASS];
664 char cid_ani[AST_MAX_EXTENSION];
666 char cid_num[AST_MAX_EXTENSION];
667 int cid_ton; /*!< Type Of Number (TON) */
668 char cid_name[AST_MAX_EXTENSION];
669 char lastcid_num[AST_MAX_EXTENSION];
670 char lastcid_name[AST_MAX_EXTENSION];
671 char *origcid_num; /*!< malloced original callerid */
672 char *origcid_name; /*!< malloced original callerid */
673 char callwait_num[AST_MAX_EXTENSION];
674 char callwait_name[AST_MAX_EXTENSION];
675 char rdnis[AST_MAX_EXTENSION];
676 char dnid[AST_MAX_EXTENSION];
679 int confno; /*!< Our conference */
680 int confusers; /*!< Who is using our conference */
681 int propconfno; /*!< Propagated conference number */
682 ast_group_t callgroup;
683 ast_group_t pickupgroup;
684 int channel; /*!< Channel Number or CRV */
685 int span; /*!< Span number */
686 time_t guardtime; /*!< Must wait this much time before using for new call */
687 int cid_signalling; /*!< CID signalling type bell202 or v23 */
688 int cid_start; /*!< CID start indicator, polarity or ring */
689 int callingpres; /*!< The value of callling presentation that we're going to use when placing a PRI call */
690 int callwaitingrepeat; /*!< How many samples to wait before repeating call waiting */
691 int cidcwexpire; /*!< When to expire our muting for CID/CW */
692 unsigned char *cidspill;
705 int busy_quietlength;
707 struct timeval flashtime; /*!< Last flash-hook time */
709 int cref; /*!< Call reference number */
710 ZT_DIAL_OPERATION dop;
711 int whichwink; /*!< SIG_FEATDMF_TA Which wink are we on? */
713 char accountcode[AST_MAX_ACCOUNT_CODE]; /*!< Account code */
714 int amaflags; /*!< AMA Flags */
715 struct tdd_state *tdd; /*!< TDD flag */
716 char call_forward[AST_MAX_EXTENSION];
717 char mailbox[AST_MAX_EXTENSION];
721 int distinctivering; /*!< Which distinctivering to use */
722 int cidrings; /*!< Which ring to deliver CID on */
723 int dtmfrelax; /*!< whether to run in relaxed DTMF mode */
725 int polarityonanswerdelay;
726 struct timeval polaritydelaytv;
727 int sendcalleridafter;
730 struct zt_pvt *bearer;
731 struct zt_pvt *realcall;
740 struct isup_call *ss7call;
742 int cic; /*!< CIC associated with channel */
745 } *iflist = NULL, *ifend = NULL;
747 static struct ast_channel *zt_request(const char *type, int format, void *data, int *cause);
748 static int zt_digit_begin(struct ast_channel *ast, char digit);
749 static int zt_digit_end(struct ast_channel *ast, char digit);
750 static int zt_sendtext(struct ast_channel *c, const char *text);
751 static int zt_call(struct ast_channel *ast, char *rdest, int timeout);
752 static int zt_hangup(struct ast_channel *ast);
753 static int zt_answer(struct ast_channel *ast);
754 static struct ast_frame *zt_read(struct ast_channel *ast);
755 static int zt_write(struct ast_channel *ast, struct ast_frame *frame);
756 static struct ast_frame *zt_exception(struct ast_channel *ast);
757 static int zt_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen);
758 static int zt_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
759 static int zt_setoption(struct ast_channel *chan, int option, void *data, int datalen);
760 static int zt_func_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len);
762 static const struct ast_channel_tech zap_tech = {
764 .description = tdesc,
765 .capabilities = AST_FORMAT_SLINEAR | AST_FORMAT_ULAW | AST_FORMAT_ALAW,
766 .requester = zt_request,
767 .send_digit_begin = zt_digit_begin,
768 .send_digit_end = zt_digit_end,
769 .send_text = zt_sendtext,
776 .exception = zt_exception,
777 .indicate = zt_indicate,
779 .setoption = zt_setoption,
780 .func_channel_read = zt_func_read,
784 #define GET_CHANNEL(p) ((p)->bearer ? (p)->bearer->channel : p->channel)
786 #define GET_CHANNEL(p) ((p)->channel)
789 struct zt_pvt *round_robin[32];
792 static inline int pri_grab(struct zt_pvt *pvt, struct zt_pri *pri)
795 /* Grab the lock first */
797 res = ast_mutex_trylock(&pri->lock);
799 ast_mutex_unlock(&pvt->lock);
800 /* Release the lock and try again */
802 ast_mutex_lock(&pvt->lock);
805 /* Then break the poll */
806 pthread_kill(pri->master, SIGURG);
812 static inline void ss7_rel(struct zt_ss7 *ss7)
814 ast_mutex_unlock(&ss7->lock);
817 static inline int ss7_grab(struct zt_pvt *pvt, struct zt_ss7 *pri)
820 /* Grab the lock first */
822 res = ast_mutex_trylock(&pri->lock);
824 ast_mutex_unlock(&pvt->lock);
825 /* Release the lock and try again */
827 ast_mutex_lock(&pvt->lock);
830 /* Then break the poll */
831 pthread_kill(pri->master, SIGURG);
835 #define NUM_CADENCE_MAX 25
836 static int num_cadence = 4;
837 static int user_has_defined_cadences = 0;
839 static struct zt_ring_cadence cadences[NUM_CADENCE_MAX] = {
840 { { 125, 125, 2000, 4000 } }, /*!< Quick chirp followed by normal ring */
841 { { 250, 250, 500, 1000, 250, 250, 500, 4000 } }, /*!< British style ring */
842 { { 125, 125, 125, 125, 125, 4000 } }, /*!< Three short bursts */
843 { { 1000, 500, 2500, 5000 } }, /*!< Long ring */
846 /*! \brief cidrings says in which pause to transmit the cid information, where the first pause
847 * is 1, the second pause is 2 and so on.
850 static int cidrings[NUM_CADENCE_MAX] = {
851 2, /*!< Right after first long ring */
852 4, /*!< Right after long part */
853 3, /*!< After third chirp */
854 2, /*!< Second spell */
857 #define ISTRUNK(p) ((p->sig == SIG_FXSLS) || (p->sig == SIG_FXSKS) || \
858 (p->sig == SIG_FXSGS) || (p->sig == SIG_PRI))
860 #define CANBUSYDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) /* || (p->sig & __ZT_SIG_FXO) */)
861 #define CANPROGRESSDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) /* || (p->sig & __ZT_SIG_FXO) */)
863 static int zt_get_index(struct ast_channel *ast, struct zt_pvt *p, int nullok)
866 if (p->subs[0].owner == ast)
868 else if (p->subs[1].owner == ast)
870 else if (p->subs[2].owner == ast)
875 ast_log(LOG_WARNING, "Unable to get index, and nullok is not asserted\n");
881 static void wakeup_sub(struct zt_pvt *p, int a, struct zt_pri *pri)
883 static void wakeup_sub(struct zt_pvt *p, int a, void *pri)
888 ast_mutex_unlock(&pri->lock);
891 if (p->subs[a].owner) {
892 if (ast_mutex_trylock(&p->subs[a].owner->lock)) {
893 ast_mutex_unlock(&p->lock);
895 ast_mutex_lock(&p->lock);
897 ast_queue_frame(p->subs[a].owner, &ast_null_frame);
898 ast_mutex_unlock(&p->subs[a].owner->lock);
906 ast_mutex_lock(&pri->lock);
910 static void zap_queue_frame(struct zt_pvt *p, struct ast_frame *f, void *data)
913 struct zt_pri *pri = (struct zt_pri*) data;
916 struct zt_ss7 *ss7 = (struct zt_ss7*) data;
918 /* We must unlock the PRI to avoid the possibility of a deadlock */
919 #if defined(HAVE_PRI) || defined(HAVE_SS7)
924 ast_mutex_unlock(&pri->lock);
929 ast_mutex_unlock(&ss7->lock);
939 if (ast_mutex_trylock(&p->owner->lock)) {
940 ast_mutex_unlock(&p->lock);
942 ast_mutex_lock(&p->lock);
944 ast_queue_frame(p->owner, f);
945 ast_mutex_unlock(&p->owner->lock);
951 #if defined(HAVE_PRI) || defined(HAVE_SS7)
956 ast_mutex_lock(&pri->lock);
961 ast_mutex_lock(&ss7->lock);
972 static int restore_gains(struct zt_pvt *p);
974 static void swap_subs(struct zt_pvt *p, int a, int b)
978 struct ast_channel *towner;
981 ast_log(LOG_DEBUG, "Swapping %d and %d\n", a, b);
983 tchan = p->subs[a].chan;
984 towner = p->subs[a].owner;
985 tinthreeway = p->subs[a].inthreeway;
987 p->subs[a].chan = p->subs[b].chan;
988 p->subs[a].owner = p->subs[b].owner;
989 p->subs[a].inthreeway = p->subs[b].inthreeway;
991 p->subs[b].chan = tchan;
992 p->subs[b].owner = towner;
993 p->subs[b].inthreeway = tinthreeway;
995 if (p->subs[a].owner)
996 p->subs[a].owner->fds[0] = p->subs[a].zfd;
997 if (p->subs[b].owner)
998 p->subs[b].owner->fds[0] = p->subs[b].zfd;
999 wakeup_sub(p, a, NULL);
1000 wakeup_sub(p, b, NULL);
1003 static int zt_open(char *fn)
1011 for (x = 0; x < strlen(fn); x++) {
1012 if (!isdigit(fn[x])) {
1020 ast_log(LOG_WARNING, "Invalid channel number '%s'\n", fn);
1023 fn = "/dev/zap/channel";
1025 fd = open(fn, O_RDWR | O_NONBLOCK);
1027 ast_log(LOG_WARNING, "Unable to open '%s': %s\n", fn, strerror(errno));
1031 if (ioctl(fd, ZT_SPECIFY, &chan)) {
1035 ast_log(LOG_WARNING, "Unable to specify channel %d: %s\n", chan, strerror(errno));
1040 if (ioctl(fd, ZT_SET_BLOCKSIZE, &bs) == -1) return -1;
1044 static void zt_close(int fd)
1050 static int zt_setlinear(int zfd, int linear)
1053 res = ioctl(zfd, ZT_SETLINEAR, &linear);
1060 static int alloc_sub(struct zt_pvt *p, int x)
1064 if (p->subs[x].zfd < 0) {
1065 p->subs[x].zfd = zt_open("/dev/zap/pseudo");
1066 if (p->subs[x].zfd > -1) {
1067 res = ioctl(p->subs[x].zfd, ZT_GET_BUFINFO, &bi);
1069 bi.txbufpolicy = ZT_POLICY_IMMEDIATE;
1070 bi.rxbufpolicy = ZT_POLICY_IMMEDIATE;
1071 bi.numbufs = numbufs;
1072 res = ioctl(p->subs[x].zfd, ZT_SET_BUFINFO, &bi);
1074 ast_log(LOG_WARNING, "Unable to set buffer policy on channel %d\n", x);
1077 ast_log(LOG_WARNING, "Unable to check buffer policy on channel %d\n", x);
1078 if (ioctl(p->subs[x].zfd, ZT_CHANNO, &p->subs[x].chan) == 1) {
1079 ast_log(LOG_WARNING, "Unable to get channel number for pseudo channel on FD %d\n", p->subs[x].zfd);
1080 zt_close(p->subs[x].zfd);
1081 p->subs[x].zfd = -1;
1085 ast_log(LOG_DEBUG, "Allocated %s subchannel on FD %d channel %d\n", subnames[x], p->subs[x].zfd, p->subs[x].chan);
1088 ast_log(LOG_WARNING, "Unable to open pseudo channel: %s\n", strerror(errno));
1091 ast_log(LOG_WARNING, "%s subchannel of %d already in use\n", subnames[x], p->channel);
1095 static int unalloc_sub(struct zt_pvt *p, int x)
1098 ast_log(LOG_WARNING, "Trying to unalloc the real channel %d?!?\n", p->channel);
1102 ast_log(LOG_DEBUG, "Released sub %d of channel %d\n", x, p->channel);
1103 if (p->subs[x].zfd > -1) {
1104 zt_close(p->subs[x].zfd);
1106 p->subs[x].zfd = -1;
1107 p->subs[x].linear = 0;
1108 p->subs[x].chan = 0;
1109 p->subs[x].owner = NULL;
1110 p->subs[x].inthreeway = 0;
1111 p->polarity = POLARITY_IDLE;
1112 memset(&p->subs[x].curconf, 0, sizeof(p->subs[x].curconf));
1116 static int digit_to_dtmfindex(char digit)
1119 return ZT_TONE_DTMF_BASE + (digit - '0');
1120 else if (digit >= 'A' && digit <= 'D')
1121 return ZT_TONE_DTMF_A + (digit - 'A');
1122 else if (digit >= 'a' && digit <= 'd')
1123 return ZT_TONE_DTMF_A + (digit - 'a');
1124 else if (digit == '*')
1125 return ZT_TONE_DTMF_s;
1126 else if (digit == '#')
1127 return ZT_TONE_DTMF_p;
1132 static int zt_digit_begin(struct ast_channel *chan, char digit)
1138 pvt = chan->tech_pvt;
1140 ast_mutex_lock(&pvt->lock);
1142 index = zt_get_index(chan, pvt, 0);
1144 if ((index != SUB_REAL) || !pvt->owner)
1148 if ((pvt->sig == SIG_PRI) && (chan->_state == AST_STATE_DIALING) && !pvt->proceeding) {
1149 if (pvt->setup_ack) {
1150 if (!pri_grab(pvt, pvt->pri)) {
1151 pri_information(pvt->pri->pri, pvt->call, digit);
1154 ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", pvt->span);
1155 } else if (strlen(pvt->dialdest) < sizeof(pvt->dialdest) - 1) {
1158 ast_log(LOG_DEBUG, "Queueing digit '%c' since setup_ack not yet received\n", digit);
1159 res = strlen(pvt->dialdest);
1160 pvt->dialdest[res++] = digit;
1161 pvt->dialdest[res] = '\0';
1166 if ((dtmf = digit_to_dtmfindex(digit)) == -1)
1169 if (pvt->pulse || ioctl(pvt->subs[SUB_REAL].zfd, ZT_SENDTONE, &dtmf)) {
1171 ZT_DIAL_OPERATION zo = {
1172 .op = ZT_DIAL_OP_APPEND,
1174 .dialstr[1] = digit,
1177 if ((res = ioctl(pvt->subs[SUB_REAL].zfd, ZT_DIAL, &zo)))
1178 ast_log(LOG_WARNING, "Couldn't dial digit %c\n", digit);
1183 ast_log(LOG_DEBUG, "Started VLDTMF digit '%c'\n", digit);
1185 pvt->begindigit = digit;
1189 ast_mutex_unlock(&pvt->lock);
1191 return 0; /* Tell Asterisk not to generate inband indications */
1194 static int zt_digit_end(struct ast_channel *chan, char digit)
1201 pvt = chan->tech_pvt;
1203 ast_mutex_lock(&pvt->lock);
1205 index = zt_get_index(chan, pvt, 0);
1207 if ((index != SUB_REAL) || !pvt->owner || pvt->pulse)
1211 /* This means that the digit was already sent via PRI signalling */
1212 if (pvt->sig == SIG_PRI && !pvt->begindigit)
1216 if (pvt->begindigit) {
1219 ast_log(LOG_DEBUG, "Ending VLDTMF digit '%c'\n", digit);
1220 res = ioctl(pvt->subs[SUB_REAL].zfd, ZT_SENDTONE, &x);
1222 pvt->begindigit = 0;
1226 ast_mutex_unlock(&pvt->lock);
1231 static char *events[] = {
1244 "Hook Transition Complete",
1249 "Polarity Reversal",
1257 { ZT_ALARM_RED, "Red Alarm" },
1258 { ZT_ALARM_YELLOW, "Yellow Alarm" },
1259 { ZT_ALARM_BLUE, "Blue Alarm" },
1260 { ZT_ALARM_RECOVER, "Recovering" },
1261 { ZT_ALARM_LOOPBACK, "Loopback" },
1262 { ZT_ALARM_NOTOPEN, "Not Open" },
1263 { ZT_ALARM_NONE, "None" },
1266 static char *alarm2str(int alarm)
1269 for (x = 0; x < sizeof(alarms) / sizeof(alarms[0]); x++) {
1270 if (alarms[x].alarm & alarm)
1271 return alarms[x].name;
1273 return alarm ? "Unknown Alarm" : "No Alarm";
1276 static char *event2str(int event)
1278 static char buf[256];
1279 if ((event < (sizeof(events) / sizeof(events[0]))) && (event > -1))
1280 return events[event];
1281 sprintf(buf, "Event %d", event); /* safe */
1286 static char *dialplan2str(int dialplan)
1288 if (dialplan == -1) {
1289 return("Dynamically set dialplan in ISDN");
1291 return (pri_plan2str(dialplan));
1295 static char *zap_sig2str(int sig)
1297 static char buf[256];
1300 return "E & M Immediate";
1302 return "E & M Wink";
1306 return "Feature Group D (DTMF)";
1308 return "Feature Group D (MF)";
1309 case SIG_FEATDMF_TA:
1310 return "Feature Groud D (MF) Tandem Access";
1312 return "Feature Group B (MF)";
1316 return "FGC/CAMA (Dialpulse)";
1317 case SIG_FGC_CAMAMF:
1318 return "FGC/CAMA (MF)";
1320 return "FXS Loopstart";
1322 return "FXS Groundstart";
1324 return "FXS Kewlstart";
1326 return "FXO Loopstart";
1328 return "FXO Groundstart";
1330 return "FXO Kewlstart";
1332 return "PRI Signalling";
1334 return "SS7 Signalling";
1336 return "SF (Tone) Signalling Immediate";
1338 return "SF (Tone) Signalling Wink";
1340 return "SF (Tone) Signalling with Feature Group D (DTMF)";
1341 case SIG_SF_FEATDMF:
1342 return "SF (Tone) Signalling with Feature Group D (MF)";
1344 return "SF (Tone) Signalling with Feature Group B (MF)";
1345 case SIG_GR303FXOKS:
1346 return "GR-303 Signalling with FXOKS";
1347 case SIG_GR303FXSKS:
1348 return "GR-303 Signalling with FXSKS";
1350 return "Pseudo Signalling";
1352 snprintf(buf, sizeof(buf), "Unknown signalling %d", sig);
1357 #define sig2str zap_sig2str
1359 static int conf_add(struct zt_pvt *p, struct zt_subchannel *c, int index, int slavechannel)
1361 /* If the conference already exists, and we're already in it
1362 don't bother doing anything */
1365 memset(&zi, 0, sizeof(zi));
1368 if (slavechannel > 0) {
1369 /* If we have only one slave, do a digital mon */
1370 zi.confmode = ZT_CONF_DIGITALMON;
1371 zi.confno = slavechannel;
1374 /* Real-side and pseudo-side both participate in conference */
1375 zi.confmode = ZT_CONF_REALANDPSEUDO | ZT_CONF_TALKER | ZT_CONF_LISTENER |
1376 ZT_CONF_PSEUDO_TALKER | ZT_CONF_PSEUDO_LISTENER;
1378 zi.confmode = ZT_CONF_CONF | ZT_CONF_TALKER | ZT_CONF_LISTENER;
1379 zi.confno = p->confno;
1381 if ((zi.confno == c->curconf.confno) && (zi.confmode == c->curconf.confmode))
1385 if (ioctl(c->zfd, ZT_SETCONF, &zi)) {
1386 ast_log(LOG_WARNING, "Failed to add %d to conference %d/%d\n", c->zfd, zi.confmode, zi.confno);
1389 if (slavechannel < 1) {
1390 p->confno = zi.confno;
1392 memcpy(&c->curconf, &zi, sizeof(c->curconf));
1394 ast_log(LOG_DEBUG, "Added %d to conference %d/%d\n", c->zfd, c->curconf.confmode, c->curconf.confno);
1398 static int isourconf(struct zt_pvt *p, struct zt_subchannel *c)
1400 /* If they're listening to our channel, they're ours */
1401 if ((p->channel == c->curconf.confno) && (c->curconf.confmode == ZT_CONF_DIGITALMON))
1403 /* If they're a talker on our (allocated) conference, they're ours */
1404 if ((p->confno > 0) && (p->confno == c->curconf.confno) && (c->curconf.confmode & ZT_CONF_TALKER))
1409 static int conf_del(struct zt_pvt *p, struct zt_subchannel *c, int index)
1412 if (/* Can't delete if there's no zfd */
1414 /* Don't delete from the conference if it's not our conference */
1416 /* Don't delete if we don't think it's conferenced at all (implied) */
1418 memset(&zi, 0, sizeof(zi));
1422 if (ioctl(c->zfd, ZT_SETCONF, &zi)) {
1423 ast_log(LOG_WARNING, "Failed to drop %d from conference %d/%d\n", c->zfd, c->curconf.confmode, c->curconf.confno);
1427 ast_log(LOG_DEBUG, "Removed %d from conference %d/%d\n", c->zfd, c->curconf.confmode, c->curconf.confno);
1428 memcpy(&c->curconf, &zi, sizeof(c->curconf));
1432 static int isslavenative(struct zt_pvt *p, struct zt_pvt **out)
1436 struct zt_pvt *slave = NULL;
1437 /* Start out optimistic */
1439 /* Update conference state in a stateless fashion */
1440 for (x = 0; x < 3; x++) {
1441 /* Any three-way calling makes slave native mode *definitely* out
1443 if ((p->subs[x].zfd > -1) && p->subs[x].inthreeway)
1446 /* If we don't have any 3-way calls, check to see if we have
1447 precisely one slave */
1448 if (useslavenative) {
1449 for (x = 0; x < MAX_SLAVES; x++) {
1452 /* Whoops already have a slave! No
1453 slave native and stop right away */
1458 /* We have one slave so far */
1459 slave = p->slaves[x];
1464 /* If no slave, slave native definitely out */
1467 else if (slave->law != p->law) {
1473 return useslavenative;
1476 static int reset_conf(struct zt_pvt *p)
1479 memset(&zi, 0, sizeof(zi));
1481 memset(&p->subs[SUB_REAL].curconf, 0, sizeof(p->subs[SUB_REAL].curconf));
1482 if (p->subs[SUB_REAL].zfd > -1) {
1483 if (ioctl(p->subs[SUB_REAL].zfd, ZT_SETCONF, &zi))
1484 ast_log(LOG_WARNING, "Failed to reset conferencing on channel %d!\n", p->channel);
1489 static int update_conf(struct zt_pvt *p)
1494 struct zt_pvt *slave = NULL;
1496 useslavenative = isslavenative(p, &slave);
1497 /* Start with the obvious, general stuff */
1498 for (x = 0; x < 3; x++) {
1499 /* Look for three way calls */
1500 if ((p->subs[x].zfd > -1) && p->subs[x].inthreeway) {
1501 conf_add(p, &p->subs[x], x, 0);
1504 conf_del(p, &p->subs[x], x);
1507 /* If we have a slave, add him to our conference now. or DAX
1508 if this is slave native */
1509 for (x = 0; x < MAX_SLAVES; x++) {
1512 conf_add(p, &p->slaves[x]->subs[SUB_REAL], SUB_REAL, GET_CHANNEL(p));
1514 conf_add(p, &p->slaves[x]->subs[SUB_REAL], SUB_REAL, 0);
1519 /* If we're supposed to be in there, do so now */
1520 if (p->inconference && !p->subs[SUB_REAL].inthreeway) {
1522 conf_add(p, &p->subs[SUB_REAL], SUB_REAL, GET_CHANNEL(slave));
1524 conf_add(p, &p->subs[SUB_REAL], SUB_REAL, 0);
1528 /* If we have a master, add ourselves to his conference */
1530 if (isslavenative(p->master, NULL)) {
1531 conf_add(p->master, &p->subs[SUB_REAL], SUB_REAL, GET_CHANNEL(p->master));
1533 conf_add(p->master, &p->subs[SUB_REAL], SUB_REAL, 0);
1537 /* Nobody is left (or should be left) in our conference.
1542 ast_log(LOG_DEBUG, "Updated conferencing on %d, with %d conference users\n", p->channel, needconf);
1546 static void zt_enable_ec(struct zt_pvt *p)
1554 ast_log(LOG_DEBUG, "Echo cancellation already on\n");
1559 ast_log(LOG_DEBUG, "Echo cancellation isn't required on digital connection\n");
1562 if (p->echocancel) {
1563 if ((p->sig == SIG_PRI) || (p->sig == SIG_SS7)) {
1565 res = ioctl(p->subs[SUB_REAL].zfd, ZT_AUDIOMODE, &x);
1567 ast_log(LOG_WARNING, "Unable to enable echo cancellation on channel %d\n", p->channel);
1570 res = ioctl(p->subs[SUB_REAL].zfd, ZT_ECHOCANCEL, &x);
1572 ast_log(LOG_WARNING, "Unable to enable echo cancellation on channel %d\n", p->channel);
1576 ast_log(LOG_DEBUG, "Enabled echo cancellation on channel %d\n", p->channel);
1580 ast_log(LOG_DEBUG, "No echo cancellation requested\n");
1584 static void zt_train_ec(struct zt_pvt *p)
1588 if (p && p->echocancel && p->echotraining) {
1589 x = p->echotraining;
1590 res = ioctl(p->subs[SUB_REAL].zfd, ZT_ECHOTRAIN, &x);
1592 ast_log(LOG_WARNING, "Unable to request echo training on channel %d\n", p->channel);
1595 ast_log(LOG_DEBUG, "Engaged echo training on channel %d\n", p->channel);
1599 ast_log(LOG_DEBUG, "No echo training requested\n");
1603 static void zt_disable_ec(struct zt_pvt *p)
1607 if (p->echocancel) {
1609 res = ioctl(p->subs[SUB_REAL].zfd, ZT_ECHOCANCEL, &x);
1611 ast_log(LOG_WARNING, "Unable to disable echo cancellation on channel %d\n", p->channel);
1614 ast_log(LOG_DEBUG, "disabled echo cancellation on channel %d\n", p->channel);
1620 static void fill_txgain(struct zt_gains *g, float gain, int law)
1624 float linear_gain = pow(10.0, gain / 20.0);
1628 for (j = 0; j < (sizeof(g->txgain) / sizeof(g->txgain[0])); j++) {
1630 k = (int) (((float) AST_ALAW(j)) * linear_gain);
1631 if (k > 32767) k = 32767;
1632 if (k < -32767) k = -32767;
1633 g->txgain[j] = AST_LIN2A(k);
1640 for (j = 0; j < (sizeof(g->txgain) / sizeof(g->txgain[0])); j++) {
1642 k = (int) (((float) AST_MULAW(j)) * linear_gain);
1643 if (k > 32767) k = 32767;
1644 if (k < -32767) k = -32767;
1645 g->txgain[j] = AST_LIN2MU(k);
1654 static void fill_rxgain(struct zt_gains *g, float gain, int law)
1658 float linear_gain = pow(10.0, gain / 20.0);
1662 for (j = 0; j < (sizeof(g->rxgain) / sizeof(g->rxgain[0])); j++) {
1664 k = (int) (((float) AST_ALAW(j)) * linear_gain);
1665 if (k > 32767) k = 32767;
1666 if (k < -32767) k = -32767;
1667 g->rxgain[j] = AST_LIN2A(k);
1674 for (j = 0; j < (sizeof(g->rxgain) / sizeof(g->rxgain[0])); j++) {
1676 k = (int) (((float) AST_MULAW(j)) * linear_gain);
1677 if (k > 32767) k = 32767;
1678 if (k < -32767) k = -32767;
1679 g->rxgain[j] = AST_LIN2MU(k);
1688 static int set_actual_txgain(int fd, int chan, float gain, int law)
1693 memset(&g, 0, sizeof(g));
1695 res = ioctl(fd, ZT_GETGAINS, &g);
1698 ast_log(LOG_DEBUG, "Failed to read gains: %s\n", strerror(errno));
1702 fill_txgain(&g, gain, law);
1704 return ioctl(fd, ZT_SETGAINS, &g);
1707 static int set_actual_rxgain(int fd, int chan, float gain, int law)
1712 memset(&g, 0, sizeof(g));
1714 res = ioctl(fd, ZT_GETGAINS, &g);
1717 ast_log(LOG_DEBUG, "Failed to read gains: %s\n", strerror(errno));
1721 fill_rxgain(&g, gain, law);
1723 return ioctl(fd, ZT_SETGAINS, &g);
1726 static int set_actual_gain(int fd, int chan, float rxgain, float txgain, int law)
1728 return set_actual_txgain(fd, chan, txgain, law) | set_actual_rxgain(fd, chan, rxgain, law);
1731 static int bump_gains(struct zt_pvt *p)
1735 /* Bump receive gain by 5.0db */
1736 res = set_actual_gain(p->subs[SUB_REAL].zfd, 0, p->rxgain + 5.0, p->txgain, p->law);
1738 ast_log(LOG_WARNING, "Unable to bump gain: %s\n", strerror(errno));
1745 static int restore_gains(struct zt_pvt *p)
1749 res = set_actual_gain(p->subs[SUB_REAL].zfd, 0, p->rxgain, p->txgain, p->law);
1751 ast_log(LOG_WARNING, "Unable to restore gains: %s\n", strerror(errno));
1758 static inline int zt_set_hook(int fd, int hs)
1762 res = ioctl(fd, ZT_HOOK, &x);
1765 if (errno == EINPROGRESS) return 0;
1766 ast_log(LOG_WARNING, "zt hook failed: %s\n", strerror(errno));
1771 static inline int zt_confmute(struct zt_pvt *p, int muted)
1775 if ((p->sig == SIG_PRI) || (p->sig == SIG_SS7)) {
1777 res = ioctl(p->subs[SUB_REAL].zfd, ZT_AUDIOMODE, &y);
1779 ast_log(LOG_WARNING, "Unable to set audio mode on '%d'\n", p->channel);
1781 res = ioctl(p->subs[SUB_REAL].zfd, ZT_CONFMUTE, &x);
1783 ast_log(LOG_WARNING, "zt confmute(%d) failed on channel %d: %s\n", muted, p->channel, strerror(errno));
1787 static int save_conference(struct zt_pvt *p)
1789 struct zt_confinfo c;
1791 if (p->saveconf.confmode) {
1792 ast_log(LOG_WARNING, "Can't save conference -- already in use\n");
1795 p->saveconf.chan = 0;
1796 res = ioctl(p->subs[SUB_REAL].zfd, ZT_GETCONF, &p->saveconf);
1798 ast_log(LOG_WARNING, "Unable to get conference info: %s\n", strerror(errno));
1799 p->saveconf.confmode = 0;
1804 c.confmode = ZT_CONF_NORMAL;
1805 res = ioctl(p->subs[SUB_REAL].zfd, ZT_SETCONF, &c);
1807 ast_log(LOG_WARNING, "Unable to set conference info: %s\n", strerror(errno));
1811 ast_log(LOG_DEBUG, "Disabled conferencing\n");
1815 static int restore_conference(struct zt_pvt *p)
1818 if (p->saveconf.confmode) {
1819 res = ioctl(p->subs[SUB_REAL].zfd, ZT_SETCONF, &p->saveconf);
1820 p->saveconf.confmode = 0;
1822 ast_log(LOG_WARNING, "Unable to restore conference info: %s\n", strerror(errno));
1827 ast_log(LOG_DEBUG, "Restored conferencing\n");
1831 static int send_callerid(struct zt_pvt *p);
1833 static int send_cwcidspill(struct zt_pvt *p)
1837 if (!(p->cidspill = ast_malloc(MAX_CALLERID_SIZE)))
1839 p->cidlen = ast_callerid_callwaiting_generate(p->cidspill, p->callwait_name, p->callwait_num, AST_LAW(p));
1840 /* Make sure we account for the end */
1841 p->cidlen += READ_SIZE * 4;
1844 if (option_verbose > 2)
1845 ast_verbose(VERBOSE_PREFIX_3 "CPE supports Call Waiting Caller*ID. Sending '%s/%s'\n", p->callwait_name, p->callwait_num);
1849 static int has_voicemail(struct zt_pvt *p)
1852 return ast_app_has_voicemail(p->mailbox, NULL);
1855 static int send_callerid(struct zt_pvt *p)
1857 /* Assumes spill in p->cidspill, p->cidlen in length and we're p->cidpos into it */
1859 /* Take out of linear mode if necessary */
1860 if (p->subs[SUB_REAL].linear) {
1861 p->subs[SUB_REAL].linear = 0;
1862 zt_setlinear(p->subs[SUB_REAL].zfd, 0);
1864 while (p->cidpos < p->cidlen) {
1865 res = write(p->subs[SUB_REAL].zfd, p->cidspill + p->cidpos, p->cidlen - p->cidpos);
1867 if (errno == EAGAIN)
1870 ast_log(LOG_WARNING, "write failed: %s\n", strerror(errno));
1880 if (p->callwaitcas) {
1881 /* Wait for CID/CW to expire */
1882 p->cidcwexpire = CIDCW_EXPIRE_SAMPLES;
1884 restore_conference(p);
1888 static int zt_callwait(struct ast_channel *ast)
1890 struct zt_pvt *p = ast->tech_pvt;
1891 p->callwaitingrepeat = CALLWAITING_REPEAT_SAMPLES;
1893 ast_log(LOG_WARNING, "Spill already exists?!?\n");
1896 if (!(p->cidspill = ast_malloc(2400 /* SAS */ + 680 /* CAS */ + READ_SIZE * 4)))
1900 memset(p->cidspill, 0x7f, 2400 + 600 + READ_SIZE * 4);
1901 if (!p->callwaitrings && p->callwaitingcallerid) {
1902 ast_gen_cas(p->cidspill, 1, 2400 + 680, AST_LAW(p));
1904 p->cidlen = 2400 + 680 + READ_SIZE * 4;
1906 ast_gen_cas(p->cidspill, 1, 2400, AST_LAW(p));
1908 p->cidlen = 2400 + READ_SIZE * 4;
1916 static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
1918 struct zt_pvt *p = ast->tech_pvt;
1919 int x, res, index,mysig;
1924 char dest[256]; /* must be same length as p->dialdest */
1925 ast_mutex_lock(&p->lock);
1926 ast_copy_string(dest, rdest, sizeof(dest));
1927 ast_copy_string(p->dialdest, rdest, sizeof(p->dialdest));
1928 if ((ast->_state == AST_STATE_BUSY)) {
1929 p->subs[SUB_REAL].needbusy = 1;
1930 ast_mutex_unlock(&p->lock);
1933 if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
1934 ast_log(LOG_WARNING, "zt_call called on %s, neither down nor reserved\n", ast->name);
1935 ast_mutex_unlock(&p->lock);
1939 if ((p->radio || (p->oprmode < 0))) /* if a radio channel, up immediately */
1941 /* Special pseudo -- automatically up */
1942 ast_setstate(ast, AST_STATE_UP);
1943 ast_mutex_unlock(&p->lock);
1946 x = ZT_FLUSH_READ | ZT_FLUSH_WRITE;
1947 res = ioctl(p->subs[SUB_REAL].zfd, ZT_FLUSH, &x);
1949 ast_log(LOG_WARNING, "Unable to flush input on channel %d\n", p->channel);
1952 set_actual_gain(p->subs[SUB_REAL].zfd, 0, p->rxgain, p->txgain, p->law);
1955 if (p->outsigmod > -1)
1956 mysig = p->outsigmod;
1962 if (p->owner == ast) {
1963 /* Normal ring, on hook */
1965 /* Don't send audio while on hook, until the call is answered */
1967 if (p->use_callerid) {
1968 /* Generate the Caller-ID spill if desired */
1970 ast_log(LOG_WARNING, "cidspill already exists??\n");
1974 if ((p->cidspill = ast_malloc(MAX_CALLERID_SIZE))) {
1975 p->cidlen = ast_callerid_generate(p->cidspill, ast->cid.cid_name, ast->cid.cid_num, AST_LAW(p));
1980 /* Choose proper cadence */
1981 if ((p->distinctivering > 0) && (p->distinctivering <= num_cadence)) {
1982 if (ioctl(p->subs[SUB_REAL].zfd, ZT_SETCADENCE, &cadences[p->distinctivering - 1]))
1983 ast_log(LOG_WARNING, "Unable to set distinctive ring cadence %d on '%s'\n", p->distinctivering, ast->name);
1984 p->cidrings = cidrings[p->distinctivering - 1];
1986 if (ioctl(p->subs[SUB_REAL].zfd, ZT_SETCADENCE, NULL))
1987 ast_log(LOG_WARNING, "Unable to reset default ring on '%s'\n", ast->name);
1988 p->cidrings = p->sendcalleridafter;
1991 /* nick@dccinc.com 4/3/03 mods to allow for deferred dialing */
1992 c = strchr(dest, '/');
1995 if (c && (strlen(c) < p->stripmsd)) {
1996 ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
2000 p->dop.op = ZT_DIAL_OP_REPLACE;
2001 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "Tw%s", c);
2003 ast_log(LOG_DEBUG, "FXO: setup deferred dialstring: %s\n", c);
2005 p->dop.dialstr[0] = '\0';
2008 if (ioctl(p->subs[SUB_REAL].zfd, ZT_HOOK, &x) && (errno != EINPROGRESS)) {
2009 ast_log(LOG_WARNING, "Unable to ring phone: %s\n", strerror(errno));
2010 ast_mutex_unlock(&p->lock);
2015 /* Call waiting call */
2016 p->callwaitrings = 0;
2017 if (ast->cid.cid_num)
2018 ast_copy_string(p->callwait_num, ast->cid.cid_num, sizeof(p->callwait_num));
2020 p->callwait_num[0] = '\0';
2021 if (ast->cid.cid_name)
2022 ast_copy_string(p->callwait_name, ast->cid.cid_name, sizeof(p->callwait_name));
2024 p->callwait_name[0] = '\0';
2025 /* Call waiting tone instead */
2026 if (zt_callwait(ast)) {
2027 ast_mutex_unlock(&p->lock);
2030 /* Make ring-back */
2031 if (tone_zone_play_tone(p->subs[SUB_CALLWAIT].zfd, ZT_TONE_RINGTONE))
2032 ast_log(LOG_WARNING, "Unable to generate call-wait ring-back on channel %s\n", ast->name);
2035 n = ast->cid.cid_name;
2036 l = ast->cid.cid_num;
2038 ast_copy_string(p->lastcid_num, l, sizeof(p->lastcid_num));
2040 p->lastcid_num[0] = '\0';
2042 ast_copy_string(p->lastcid_name, n, sizeof(p->lastcid_name));
2044 p->lastcid_name[0] = '\0';
2045 ast_setstate(ast, AST_STATE_RINGING);
2046 index = zt_get_index(ast, p, 0);
2048 p->subs[index].needringing = 1;
2061 case SIG_FGC_CAMAMF:
2066 case SIG_SF_FEATDMF:
2067 case SIG_FEATDMF_TA:
2069 c = strchr(dest, '/');
2074 if (strlen(c) < p->stripmsd) {
2075 ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
2076 ast_mutex_unlock(&p->lock);
2080 /* Start the trunk, if not GR-303 */
2084 res = ioctl(p->subs[SUB_REAL].zfd, ZT_HOOK, &x);
2086 if (errno != EINPROGRESS) {
2087 ast_log(LOG_WARNING, "Unable to start channel: %s\n", strerror(errno));
2088 ast_mutex_unlock(&p->lock);
2096 ast_log(LOG_DEBUG, "Dialing '%s'\n", c);
2097 p->dop.op = ZT_DIAL_OP_REPLACE;
2103 l = ast->cid.cid_num;
2105 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T*%s*%s*", l, c);
2107 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T**%s*", c);
2110 l = ast->cid.cid_num;
2112 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*00%s#*%s#", l, c);
2114 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*02#*%s#", c);
2116 case SIG_FEATDMF_TA:
2118 const char *cic, *ozz;
2120 /* If you have to go through a Tandem Access point you need to use this */
2121 ozz = pbx_builtin_getvar_helper(p->owner, "FEATDMF_OZZ");
2124 cic = pbx_builtin_getvar_helper(p->owner, "FEATDMF_CIC");
2128 ast_log(LOG_WARNING, "Unable to dial channel of type feature group D MF tandem access without CIC or OZZ set\n");
2129 ast_mutex_unlock(&p->lock);
2132 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s%s#", ozz, cic);
2133 snprintf(p->finaldial, sizeof(p->finaldial), "M*%s#", c);
2138 ast_copy_string(p->dop.dialstr, "M*911#", sizeof(p->dop.dialstr));
2141 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%s", c);
2143 case SIG_FGC_CAMAMF:
2145 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s#", c);
2149 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%sw", c);
2151 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%sw", c);
2155 if (p->echotraining && (strlen(p->dop.dialstr) > 4)) {
2156 memset(p->echorest, 'w', sizeof(p->echorest) - 1);
2157 strcpy(p->echorest + (p->echotraining / 400) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);
2158 p->echorest[sizeof(p->echorest) - 1] = '\0';
2160 p->dop.dialstr[strlen(p->dop.dialstr)-2] = '\0';
2164 if (ioctl(p->subs[SUB_REAL].zfd, ZT_DIAL, &p->dop)) {
2166 ioctl(p->subs[SUB_REAL].zfd, ZT_HOOK, &x);
2167 ast_log(LOG_WARNING, "Dialing failed on channel %d: %s\n", p->channel, strerror(errno));
2168 ast_mutex_unlock(&p->lock);
2173 ast_log(LOG_DEBUG, "Deferring dialing...\n");
2176 if (ast_strlen_zero(c))
2178 ast_setstate(ast, AST_STATE_DIALING);
2181 /* Special pseudo -- automatically up*/
2182 ast_setstate(ast, AST_STATE_UP);
2186 /* We'll get it in a moment -- but use dialdest to store pre-setup_ack digits */
2187 p->dialdest[0] = '\0';
2191 ast_log(LOG_DEBUG, "not yet implemented\n");
2192 ast_mutex_unlock(&p->lock);
2197 c = strchr(dest, '/');
2203 if (!p->hidecallerid) {
2204 l = ast->cid.cid_num;
2209 ss7_grab(p, p->ss7);
2210 p->digital = IS_DIGITAL(ast->transfercapability);
2211 p->ss7call = isup_new_call(p->ss7->ss7);
2215 ast_mutex_unlock(&p->lock);
2216 ast_log(LOG_ERROR, "Unable to allocate new SS7 call!\n");
2220 isup_init_call(p->ss7->ss7, p->ss7call, p->cic, c + p->stripmsd, l);
2222 isup_iam(p->ss7->ss7, p->ss7call);
2225 #endif /* HAVE_SS7 */
2229 #ifdef SUPPORT_USERUSER
2230 const char *useruser;
2234 int prilocaldialplan;
2238 int redirect_reason;
2240 c = strchr(dest, '/');
2245 if (!p->hidecalleridname)
2246 n = ast->cid.cid_name;
2249 if (!p->hidecallerid) {
2250 l = ast->cid.cid_num;
2251 n = ast->cid.cid_name;
2256 if (strlen(c) < p->stripmsd) {
2257 ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
2258 ast_mutex_unlock(&p->lock);
2261 if (mysig != SIG_FXSKS) {
2262 p->dop.op = ZT_DIAL_OP_REPLACE;
2263 s = strchr(c + p->stripmsd, 'w');
2266 snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%s", s);
2268 p->dop.dialstr[0] = '\0';
2271 p->dop.dialstr[0] = '\0';
2274 if (pri_grab(p, p->pri)) {
2275 ast_log(LOG_WARNING, "Failed to grab PRI!\n");
2276 ast_mutex_unlock(&p->lock);
2279 if (!(p->call = pri_new_call(p->pri->pri))) {
2280 ast_log(LOG_WARNING, "Unable to create call on channel %d\n", p->channel);
2282 ast_mutex_unlock(&p->lock);
2285 if (!(sr = pri_sr_new())) {
2286 ast_log(LOG_WARNING, "Failed to allocate setup request channel %d\n", p->channel);
2288 ast_mutex_unlock(&p->lock);
2290 if (p->bearer || (mysig == SIG_FXSKS)) {
2293 ast_log(LOG_DEBUG, "Oooh, I have a bearer on %d (%d:%d)\n", PVT_TO_CHANNEL(p->bearer), p->bearer->logicalspan, p->bearer->channel);
2294 p->bearer->call = p->call;
2297 ast_log(LOG_DEBUG, "I'm being setup with no bearer right now...\n");
2299 pri_set_crv(p->pri->pri, p->call, p->channel, 0);
2301 p->digital = IS_DIGITAL(ast->transfercapability);
2302 /* Add support for exclusive override */
2303 if (p->priexclusive)
2306 /* otherwise, traditional behavior */
2307 if (p->pri->nodetype == PRI_NETWORK)
2313 pri_sr_set_channel(sr, p->bearer ? PVT_TO_CHANNEL(p->bearer) : PVT_TO_CHANNEL(p), exclusive, 1);
2314 pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : ast->transfercapability,
2316 ((p->law == ZT_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW)));
2317 if (p->pri->facilityenable)
2318 pri_facility_enable(p->pri->pri);
2320 if (option_verbose > 2)
2321 ast_verbose(VERBOSE_PREFIX_3 "Requested transfer capability: 0x%.2x - %s\n", ast->transfercapability, ast_transfercapability2str(ast->transfercapability));
2323 pridialplan = p->pri->dialplan - 1;
2324 if (pridialplan == -2) { /* compute dynamically */
2325 if (strncmp(c + p->stripmsd, p->pri->internationalprefix, strlen(p->pri->internationalprefix)) == 0) {
2326 dp_strip = strlen(p->pri->internationalprefix);
2327 pridialplan = PRI_INTERNATIONAL_ISDN;
2328 } else if (strncmp(c + p->stripmsd, p->pri->nationalprefix, strlen(p->pri->nationalprefix)) == 0) {
2329 dp_strip = strlen(p->pri->nationalprefix);
2330 pridialplan = PRI_NATIONAL_ISDN;
2332 pridialplan = PRI_LOCAL_ISDN;
2335 pri_sr_set_called(sr, c + p->stripmsd + dp_strip, pridialplan, s ? 1 : 0);
2338 prilocaldialplan = p->pri->localdialplan - 1;
2339 if ((l != NULL) && (prilocaldialplan == -2)) { /* compute dynamically */
2340 if (strncmp(l, p->pri->internationalprefix, strlen(p->pri->internationalprefix)) == 0) {
2341 ldp_strip = strlen(p->pri->internationalprefix);
2342 prilocaldialplan = PRI_INTERNATIONAL_ISDN;
2343 } else if (strncmp(l, p->pri->nationalprefix, strlen(p->pri->nationalprefix)) == 0) {
2344 ldp_strip = strlen(p->pri->nationalprefix);
2345 prilocaldialplan = PRI_NATIONAL_ISDN;
2347 prilocaldialplan = PRI_LOCAL_ISDN;
2350 pri_sr_set_caller(sr, l ? (l + ldp_strip) : NULL, n, prilocaldialplan,
2351 p->use_callingpres ? ast->cid.cid_pres : (l ? PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN : PRES_NUMBER_NOT_AVAILABLE));
2352 if ((rr_str = pbx_builtin_getvar_helper(ast, "PRIREDIRECTREASON"))) {
2353 if (!strcasecmp(rr_str, "UNKNOWN"))
2354 redirect_reason = 0;
2355 else if (!strcasecmp(rr_str, "BUSY"))
2356 redirect_reason = 1;
2357 else if (!strcasecmp(rr_str, "NO_REPLY"))
2358 redirect_reason = 2;
2359 else if (!strcasecmp(rr_str, "UNCONDITIONAL"))
2360 redirect_reason = 15;
2362 redirect_reason = PRI_REDIR_UNCONDITIONAL;
2364 redirect_reason = PRI_REDIR_UNCONDITIONAL;
2365 pri_sr_set_redirecting(sr, ast->cid.cid_rdnis, p->pri->localdialplan - 1, PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, redirect_reason);
2367 #ifdef SUPPORT_USERUSER
2368 /* User-user info */
2369 useruser = pbx_builtin_getvar_helper(p->owner, "USERUSERINFO");
2372 pri_sr_set_useruser(sr, useruser);
2375 if (pri_setup(p->pri->pri, p->call, sr)) {
2376 ast_log(LOG_WARNING, "Unable to setup call to %s (using %s)\n",
2377 c + p->stripmsd + dp_strip, dialplan2str(p->pri->dialplan));
2379 ast_mutex_unlock(&p->lock);
2384 ast_setstate(ast, AST_STATE_DIALING);
2388 ast_mutex_unlock(&p->lock);
2392 static void destroy_zt_pvt(struct zt_pvt **pvt)
2394 struct zt_pvt *p = *pvt;
2395 /* Remove channel from the list */
2397 p->prev->next = p->next;
2399 p->next->prev = p->prev;
2401 ASTOBJ_UNREF(p->smdi_iface, ast_smdi_interface_destroy);
2402 ast_mutex_destroy(&p->lock);
2407 static int destroy_channel(struct zt_pvt *prev, struct zt_pvt *cur, int now)
2417 for (i = 0; i < 3; i++) {
2418 if (cur->subs[i].owner) {
2424 prev->next = cur->next;
2426 prev->next->prev = prev;
2432 iflist->prev = NULL;
2436 if (cur->subs[SUB_REAL].zfd > -1) {
2437 zt_close(cur->subs[SUB_REAL].zfd);
2439 destroy_zt_pvt(&cur);
2443 prev->next = cur->next;
2445 prev->next->prev = prev;
2451 iflist->prev = NULL;
2455 if (cur->subs[SUB_REAL].zfd > -1) {
2456 zt_close(cur->subs[SUB_REAL].zfd);
2458 destroy_zt_pvt(&cur);
2464 static char *zap_send_keypad_facility_app = "ZapSendKeypadFacility";
2466 static char *zap_send_keypad_facility_synopsis = "Send digits out of band over a PRI";
2468 static char *zap_send_keypad_facility_descrip =
2469 " ZapSendKeypadFacility(): This application will send the given string of digits in a Keypad Facility\n"
2470 " IE over the current channel.\n";
2472 static int zap_send_keypad_facility_exec(struct ast_channel *chan, void *data)
2474 /* Data will be our digit string */
2476 char *digits = (char *) data;
2478 if (ast_strlen_zero(digits)) {
2480 ast_log(LOG_DEBUG, "No digit string sent to application!\n");
2484 p = (struct zt_pvt *)chan->tech_pvt;
2488 ast_log(LOG_DEBUG, "Unable to find technology private\n");
2492 ast_mutex_lock(&p->lock);
2494 if (!p->pri || !p->call) {
2496 ast_log(LOG_DEBUG, "Unable to find pri or call on channel!\n");
2497 ast_mutex_unlock(&p->lock);
2501 if (!pri_grab(p, p->pri)) {
2502 pri_keypad_facility(p->pri->pri, p->call, digits);
2506 ast_log(LOG_DEBUG, "Unable to grab pri to send keypad facility!\n");
2507 ast_mutex_unlock(&p->lock);
2511 ast_mutex_unlock(&p->lock);
2516 static int pri_is_up(struct zt_pri *pri)
2519 for (x = 0; x < NUM_DCHANS; x++) {
2520 if (pri->dchanavail[x] == DCHAN_AVAILABLE)
2526 static int pri_assign_bearer(struct zt_pvt *crv, struct zt_pri *pri, struct zt_pvt *bearer)
2528 bearer->owner = &inuse;
2529 bearer->realcall = crv;
2530 crv->subs[SUB_REAL].zfd = bearer->subs[SUB_REAL].zfd;
2531 if (crv->subs[SUB_REAL].owner)
2532 crv->subs[SUB_REAL].owner->fds[0] = crv->subs[SUB_REAL].zfd;
2533 crv->bearer = bearer;
2534 crv->call = bearer->call;
2539 static char *pri_order(int level)
2549 return "Quaternary";
2555 /* Returns fd of the active dchan */
2556 static int pri_active_dchan_fd(struct zt_pri *pri)
2560 for (x = 0; x < NUM_DCHANS; x++) {
2561 if ((pri->dchans[x] == pri->pri))
2568 static int pri_find_dchan(struct zt_pri *pri)
2575 for (x = 0; x < NUM_DCHANS; x++) {
2576 if ((pri->dchanavail[x] == DCHAN_AVAILABLE) && (newslot < 0))
2578 if (pri->dchans[x] == old) {
2584 ast_log(LOG_WARNING, "No D-channels available! Using Primary channel %d as D-channel anyway!\n",
2585 pri->dchannels[newslot]);
2587 if (old && (oldslot != newslot))
2588 ast_log(LOG_NOTICE, "Switching from from d-channel %d to channel %d!\n",
2589 pri->dchannels[oldslot], pri->dchannels[newslot]);
2590 pri->pri = pri->dchans[newslot];
2595 static int zt_hangup(struct ast_channel *ast)
2599 /*static int restore_gains(struct zt_pvt *p);*/
2600 struct zt_pvt *p = ast->tech_pvt;
2601 struct zt_pvt *tmp = NULL;
2602 struct zt_pvt *prev = NULL;
2606 ast_log(LOG_DEBUG, "zt_hangup(%s)\n", ast->name);
2607 if (!ast->tech_pvt) {
2608 ast_log(LOG_WARNING, "Asked to hangup channel not connected\n");
2612 ast_mutex_lock(&p->lock);
2614 index = zt_get_index(ast, p, 1);
2616 if ((p->sig == SIG_PRI) || (p->sig == SIG_SS7)) {
2618 ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0);
2624 if (p->origcid_num) {
2625 ast_copy_string(p->cid_num, p->origcid_num, sizeof(p->cid_num));
2626 free(p->origcid_num);
2627 p->origcid_num = NULL;
2629 if (p->origcid_name) {
2630 ast_copy_string(p->cid_name, p->origcid_name, sizeof(p->cid_name));
2631 free(p->origcid_name);
2632 p->origcid_name = NULL;
2635 ast_dsp_digitmode(p->dsp,DSP_DIGITMODE_DTMF | p->dtmfrelax);
2640 ast_log(LOG_DEBUG, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
2641 p->channel, index, p->subs[SUB_REAL].zfd, p->subs[SUB_CALLWAIT].zfd, p->subs[SUB_THREEWAY].zfd);
2645 /* Real channel, do some fixup */
2646 p->subs[index].owner = NULL;
2647 p->subs[index].needanswer = 0;
2648 p->subs[index].needflash = 0;
2649 p->subs[index].needringing = 0;
2650 p->subs[index].needbusy = 0;
2651 p->subs[index].needcongestion = 0;
2652 p->subs[index].linear = 0;
2653 p->subs[index].needcallerid = 0;
2654 p->polarity = POLARITY_IDLE;
2655 zt_setlinear(p->subs[index].zfd, 0);
2656 if (index == SUB_REAL) {
2657 if ((p->subs[SUB_CALLWAIT].zfd > -1) && (p->subs[SUB_THREEWAY].zfd > -1)) {
2659 ast_log(LOG_DEBUG, "Normal call hung up with both three way call and a call waiting call in place?\n");
2660 if (p->subs[SUB_CALLWAIT].inthreeway) {
2661 /* We had flipped over to answer a callwait and now it's gone */
2663 ast_log(LOG_DEBUG, "We were flipped over to the callwait, moving back and unowning.\n");
2664 /* Move to the call-wait, but un-own us until they flip back. */
2665 swap_subs(p, SUB_CALLWAIT, SUB_REAL);
2666 unalloc_sub(p, SUB_CALLWAIT);
2669 /* The three way hung up, but we still have a call wait */
2671 ast_log(LOG_DEBUG, "We were in the threeway and have a callwait still. Ditching the threeway.\n");
2672 swap_subs(p, SUB_THREEWAY, SUB_REAL);
2673 unalloc_sub(p, SUB_THREEWAY);
2674 if (p->subs[SUB_REAL].inthreeway) {
2675 /* This was part of a three way call. Immediately make way for
2678 ast_log(LOG_DEBUG, "Call was complete, setting owner to former third call\n");
2679 p->owner = p->subs[SUB_REAL].owner;
2681 /* This call hasn't been completed yet... Set owner to NULL */
2683 ast_log(LOG_DEBUG, "Call was incomplete, setting owner to NULL\n");
2686 p->subs[SUB_REAL].inthreeway = 0;
2688 } else if (p->subs[SUB_CALLWAIT].zfd > -1) {
2689 /* Move to the call-wait and switch back to them. */
2690 swap_subs(p, SUB_CALLWAIT, SUB_REAL);
2691 unalloc_sub(p, SUB_CALLWAIT);
2692 p->owner = p->subs[SUB_REAL].owner;
2693 if (p->owner->_state != AST_STATE_UP)
2694 p->subs[SUB_REAL].needanswer = 1;
2695 if (ast_bridged_channel(p->subs[SUB_REAL].owner))
2696 ast_queue_control(p->subs[SUB_REAL].owner, AST_CONTROL_UNHOLD);
2697 } else if (p->subs[SUB_THREEWAY].zfd > -1) {
2698 swap_subs(p, SUB_THREEWAY, SUB_REAL);
2699 unalloc_sub(p, SUB_THREEWAY);
2700 if (p->subs[SUB_REAL].inthreeway) {
2701 /* This was part of a three way call. Immediately make way for
2704 ast_log(LOG_DEBUG, "Call was complete, setting owner to former third call\n");
2705 p->owner = p->subs[SUB_REAL].owner;
2707 /* This call hasn't been completed yet... Set owner to NULL */
2709 ast_log(LOG_DEBUG, "Call was incomplete, setting owner to NULL\n");
2712 p->subs[SUB_REAL].inthreeway = 0;
2714 } else if (index == SUB_CALLWAIT) {
2715 /* Ditch the holding callwait call, and immediately make it availabe */
2716 if (p->subs[SUB_CALLWAIT].inthreeway) {
2717 /* This is actually part of a three way, placed on hold. Place the third part
2718 on music on hold now */
2719 if (p->subs[SUB_THREEWAY].owner && ast_bridged_channel(p->subs[SUB_THREEWAY].owner)) {
2720 ast_queue_control_data(p->subs[SUB_THREEWAY].owner, AST_CONTROL_HOLD,
2721 S_OR(p->mohsuggest, NULL),
2722 !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
2724 p->subs[SUB_THREEWAY].inthreeway = 0;
2725 /* Make it the call wait now */
2726 swap_subs(p, SUB_CALLWAIT, SUB_THREEWAY);
2727 unalloc_sub(p, SUB_THREEWAY);
2729 unalloc_sub(p, SUB_CALLWAIT);
2730 } else if (index == SUB_THREEWAY) {
2731 if (p->subs[SUB_CALLWAIT].inthreeway) {
2732 /* The other party of the three way call is currently in a call-wait state.
2733 Start music on hold for them, and take the main guy out of the third call */
2734 if (p->subs[SUB_CALLWAIT].owner && ast_bridged_channel(p->subs[SUB_CALLWAIT].owner)) {
2735 ast_queue_control_data(p->subs[SUB_CALLWAIT].owner, AST_CONTROL_HOLD,
2736 S_OR(p->mohsuggest, NULL),
2737 !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0);
2739 p->subs[SUB_CALLWAIT].inthreeway = 0;
2741 p->subs[SUB_REAL].inthreeway = 0;
2742 /* If this was part of a three way call index, let us make
2743 another three way call */
2744 unalloc_sub(p, SUB_THREEWAY);
2746 /* This wasn't any sort of call, but how are we an index? */
2747 ast_log(LOG_WARNING, "Index found but not any type of call?\n");
2751 if (!p->subs[SUB_REAL].owner && !p->subs[SUB_CALLWAIT].owner && !p->subs[SUB_THREEWAY].owner) {
2754 p->distinctivering = 0;
2755 p->confirmanswer = 0;
2761 p->onhooktime = time(NULL);
2769 ast_dsp_free(p->dsp);
2773 law = ZT_LAW_DEFAULT;
2774 res = ioctl(p->subs[SUB_REAL].zfd, ZT_SETLAW, &law);
2776 ast_log(LOG_WARNING, "Unable to set law on channel %d to default\n", p->channel);
2777 /* Perform low level hangup if no owner left */
2781 if (!ss7_grab(p, p->ss7)) {
2782 if (!p->alreadyhungup) {
2783 isup_rel(p->ss7->ss7, p->ss7call, ast->hangupcause ? ast->hangupcause : -1);
2785 p->alreadyhungup = 1;
2787 ast_log(LOG_WARNING, "Trying to hangup twice!\n");
2789 ast_log(LOG_WARNING, "Unable to grab SS7 on CIC %d\n", p->cic);
2797 #ifdef SUPPORT_USERUSER
2798 const char *useruser = pbx_builtin_getvar_helper(ast,"USERUSERINFO");
2801 /* Make sure we have a call (or REALLY have a call in the case of a PRI) */
2802 if (p->call && (!p->bearer || (p->bearer->call == p->call))) {
2803 if (!pri_grab(p, p->pri)) {
2804 if (p->alreadyhungup) {
2806 ast_log(LOG_DEBUG, "Already hungup... Calling hangup once, and clearing call\n");
2808 #ifdef SUPPORT_USERUSER
2809 pri_call_set_useruser(p->call, useruser);
2812 pri_hangup(p->pri->pri, p->call, -1);
2815 p->bearer->call = NULL;
2817 const char *cause = pbx_builtin_getvar_helper(ast,"PRI_CAUSE");
2818 int icause = ast->hangupcause ? ast->hangupcause : -1;
2820 ast_log(LOG_DEBUG, "Not yet hungup... Calling hangup once with icause, and clearing call\n");
2822 #ifdef SUPPORT_USERUSER
2823 pri_call_set_useruser(p->call, useruser);
2826 p->alreadyhungup = 1;
2828 p->bearer->alreadyhungup = 1;
2831 icause = atoi(cause);
2833 pri_hangup(p->pri->pri, p->call, icause);
2836 ast_log(LOG_WARNING, "pri_disconnect failed\n");
2839 ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", p->span);
2845 ast_log(LOG_DEBUG, "Bearer call is %p, while ours is still %p\n", p->bearer->call, p->call);
2851 if (p->sig && ((p->sig != SIG_PRI) && (p->sig != SIG_SS7)))
2852 res = zt_set_hook(p->subs[SUB_REAL].zfd, ZT_ONHOOK);
2854 ast_log(LOG_WARNING, "Unable to hangup line %s\n", ast->name);
2860 res = ioctl(p->subs[SUB_REAL].zfd, ZT_GET_PARAMS, &par);
2864 ast_log(LOG_DEBUG, "Hanging up channel %d, offhook = %d\n", p->channel, par.rxisoffhook);
2866 /* If they're off hook, try playing congestion */
2867 if ((par.rxisoffhook) && (!(p->radio || (p->oprmode < 0))))
2868 tone_zone_play_tone(p->subs[SUB_REAL].zfd, ZT_TONE_CONGESTION);
2870 tone_zone_play_tone(p->subs[SUB_REAL].zfd, -1);
2876 /* Make sure we're not made available for at least two seconds assuming
2877 we were actually used for an inbound or outbound call. */
2878 if (ast->_state != AST_STATE_RESERVED) {
2879 time(&p->guardtime);
2884 tone_zone_play_tone(p->subs[SUB_REAL].zfd, -1);
2891 ast_channel_setoption(ast,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0);
2892 ast_channel_setoption(ast,AST_OPTION_TDD,&x,sizeof(char),0);
2896 p->callwaiting = p->permcallwaiting;
2897 p->hidecallerid = p->permhidecallerid;
2902 /* Restore data mode */
2903 if ((p->sig == SIG_PRI) || (p->sig == SIG_SS7)) {
2905 ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0);
2910 ast_log(LOG_DEBUG, "Freeing up bearer channel %d\n", p->bearer->channel);
2911 /* Free up the bearer channel as well, and
2912 don't use its file descriptor anymore */
2913 update_conf(p->bearer);
2914 reset_conf(p->bearer);
2915 p->bearer->owner = NULL;
2916 p->bearer->realcall = NULL;
2918 p->subs[SUB_REAL].zfd = -1;
2925 p->callwaitingrepeat = 0;
2928 ast->tech_pvt = NULL;
2929 ast_mutex_unlock(&p->lock);
2930 if (option_verbose > 2)
2931 ast_verbose( VERBOSE_PREFIX_3 "Hungup '%s'\n", ast->name);
2933 ast_mutex_lock(&iflock);
2939 destroy_channel(prev, tmp, 0);
2947 ast_mutex_unlock(&iflock);
2951 static int zt_answer(struct ast_channel *ast)
2953 struct zt_pvt *p = ast->tech_pvt;
2956 int oldstate = ast->_state;
2957 ast_setstate(ast, AST_STATE_UP);
2958 ast_mutex_lock(&p->lock);
2959 index = zt_get_index(ast, p, 0);
2962 /* nothing to do if a radio channel */
2963 if ((p->radio || (p->oprmode < 0))) {
2964 ast_mutex_unlock(&p->lock);
2978 case SIG_FEATDMF_TA:
2981 case SIG_FGC_CAMAMF:
2986 case SIG_SF_FEATDMF:
2991 /* Pick up the line */
2993 ast_log(LOG_DEBUG, "Took %s off hook\n", ast->name);
2994 if (p->hanguponpolarityswitch) {
2995 gettimeofday(&p->polaritydelaytv, NULL);
2997 res = zt_set_hook(p->subs[SUB_REAL].zfd, ZT_OFFHOOK);
2998 tone_zone_play_tone(p->subs[index].zfd, -1);
3000 if ((index == SUB_REAL) && p->subs[SUB_THREEWAY].inthreeway) {
3001 if (oldstate == AST_STATE_RINGING) {
3003 ast_log(LOG_DEBUG, "Finally swapping real and threeway\n");
3004 tone_zone_play_tone(p->subs[SUB_THREEWAY].zfd, -1);
3005 swap_subs(p, SUB_THREEWAY, SUB_REAL);
3006 p->owner = p->subs[SUB_REAL].owner;
3009 if (p->sig & __ZT_SIG_FXS) {
3016 /* Send a pri acknowledge */
3017 if (!pri_grab(p, p->pri)) {
3019 res = pri_answer(p->pri->pri, p->call, 0, !p->digital);
3022 ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", p->span);
3029 if (!ss7_grab(p, p->ss7)) {
3031 res = isup_anm(p->ss7->ss7, p->ss7call);
3034 ast_log(LOG_WARNING, "Unable to grab SS7 on span %d\n", p->span);
3040 ast_mutex_unlock(&p->lock);
3043 ast_log(LOG_WARNING, "Don't know how to answer signalling %d (channel %d)\n", p->sig, p->channel);
3046 ast_mutex_unlock(&p->lock);
3050 static int zt_setoption(struct ast_channel *chan, int option, void *data, int datalen)
3056 struct zt_pvt *p = chan->tech_pvt, *pp;
3057 struct oprmode *oprmode;
3060 /* all supported options require data */
3061 if (!data || (datalen < 1)) {
3067 case AST_OPTION_TXGAIN:
3068 scp = (signed char *) data;
3069 index = zt_get_index(chan, p, 0);
3071 ast_log(LOG_WARNING, "No index in TXGAIN?\n");
3075 ast_log(LOG_DEBUG, "Setting actual tx gain on %s to %f\n", chan->name, p->txgain + (float) *scp);
3076 return set_actual_txgain(p->subs[index].zfd, 0, p->txgain + (float) *scp, p->law);
3077 case AST_OPTION_RXGAIN:
3078 scp = (signed char *) data;
3079 index = zt_get_index(chan, p, 0);
3081 ast_log(LOG_WARNING, "No index in RXGAIN?\n");
3085 ast_log(LOG_DEBUG, "Setting actual rx gain on %s to %f\n", chan->name, p->rxgain + (float) *scp);
3086 return set_actual_rxgain(p->subs[index].zfd, 0, p->rxgain + (float) *scp, p->law);
3087 case AST_OPTION_TONE_VERIFY:
3094 ast_log(LOG_DEBUG, "Set option TONE VERIFY, mode: MUTECONF(1) on %s\n",chan->name);
3095 ast_dsp_digitmode(p->dsp,DSP_DIGITMODE_MUTECONF | p->dtmfrelax); /* set mute mode if desired */
3099 ast_log(LOG_DEBUG, "Set option TONE VERIFY, mode: MUTECONF/MAX(2) on %s\n",chan->name);
3100 ast_dsp_digitmode(p->dsp,DSP_DIGITMODE_MUTECONF | DSP_DIGITMODE_MUTEMAX | p->dtmfrelax); /* set mute mode if desired */
3104 ast_log(LOG_DEBUG, "Set option TONE VERIFY, mode: OFF(0) on %s\n",chan->name);
3105 ast_dsp_digitmode(p->dsp,DSP_DIGITMODE_DTMF | p->dtmfrelax); /* set mute mode if desired */
3109 case AST_OPTION_TDD:
3110 /* turn on or off TDD */
3113 if (!*cp) { /* turn it off */
3115 ast_log(LOG_DEBUG, "Set option TDD MODE, value: OFF(0) on %s\n",chan->name);
3122 ast_log(LOG_DEBUG, "Set option TDD MODE, value: %s(%d) on %s\n",
3123 (*cp == 2) ? "MATE" : "ON", (int) *cp, chan->name);
3125 /* otherwise, turn it on */
3126 if (!p->didtdd) { /* if havent done it yet */
3127 unsigned char mybuf[41000], *buf;
3128 int size, res, fd, len;
3129 struct pollfd fds[1];
3132 memset(buf, 0x7f, sizeof(mybuf)); /* set to silence */
3133 ast_tdd_gen_ecdisa(buf + 16000, 16000); /* put in tone */
3135 index = zt_get_index(chan, p, 0);
3137 ast_log(LOG_WARNING, "No index in TDD?\n");
3140 fd = p->subs[index].zfd;
3142 if (ast_check_hangup(chan))
3145 if (size > READ_SIZE)
3148 fds[0].events = POLLPRI | POLLOUT;
3150 res = poll(fds, 1, -1);
3153 ast_log(LOG_DEBUG, "poll (for write) ret. 0 on channel %d\n", p->channel);
3156 /* if got exception */
3157 if (fds[0].revents & POLLPRI)
3159 if (!(fds[0].revents & POLLOUT)) {
3161 ast_log(LOG_DEBUG, "write fd not ready on channel %d\n", p->channel);
3164 res = write(fd, buf, size);
3166 if (res == -1) return -1;
3168 ast_log(LOG_DEBUG, "Write returned %d (%s) on channel %d\n", res, strerror(errno), p->channel);
3174 p->didtdd = 1; /* set to have done it now */
3176 if (*cp == 2) { /* Mate mode */
3183 if (!p->tdd) { /* if we dont have one yet */
3184 p->tdd = tdd_new(); /* allocate one */
3187 case AST_OPTION_RELAXDTMF: /* Relax DTMF decoding (or not) */
3192 ast_log(LOG_DEBUG, "Set option RELAX DTMF, value: %s(%d) on %s\n",
3193 *cp ? "ON" : "OFF", (int) *cp, chan->name);
3194 ast_dsp_digitmode(p->dsp, ((*cp) ? DSP_DIGITMODE_RELAXDTMF : DSP_DIGITMODE_DTMF) | p->dtmfrelax);
3196 case AST_OPTION_AUDIO_MODE: /* Set AUDIO mode (or not) */
3200 ast_log(LOG_DEBUG, "Set option AUDIO MODE, value: OFF(0) on %s\n", chan->name);
3205 ast_log(LOG_DEBUG, "Set option AUDIO MODE, value: ON(1) on %s\n", chan->name);
3208 if (ioctl(p->subs[SUB_REAL].zfd, ZT_AUDIOMODE, &x) == -1)
3209 ast_log(LOG_WARNING, "Unable to set audio mode on channel %d to %d\n", p->channel, x);
3211 case AST_OPTION_OPRMODE: /* Operator services mode */
3212 oprmode = (struct oprmode *) data;
3213 pp = oprmode->peer->tech_pvt;
3214 p->oprmode = pp->oprmode = 0;
3218 /* setup modes, if any */
3221 pp->oprmode = oprmode->mode;
3222 p->oprmode = -oprmode->mode;
3225 ast_log(LOG_DEBUG, "Set Operator Services mode, value: %d on %s/%s\n",
3226 oprmode->mode, chan->name,oprmode->peer->name);
3228 case AST_OPTION_ECHOCAN:
3232 ast_log(LOG_DEBUG, "Enabling echo cancelation on %s\n", chan->name);
3236 ast_log(LOG_DEBUG, "Disabling echo cancelation on %s\n", chan->name);
3246 static int zt_func_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len)
3248 struct zt_pvt *p = chan->tech_pvt;
3250 if (!strcasecmp(data, "rxgain")) {
3251 ast_mutex_lock(&p->lock);
3252 snprintf(buf, len, "%f", p->rxgain);
3253 ast_mutex_unlock(&p->lock);
3254 } else if (!strcasecmp(data, "txgain")) {
3255 ast_mutex_lock(&p->lock);
3256 snprintf(buf, len, "%f", p->txgain);
3257 ast_mutex_unlock(&p->lock);
3259 ast_copy_string(buf, "", len);
3265 static void zt_unlink(struct zt_pvt *slave, struct zt_pvt *master, int needlock)
3267 /* Unlink a specific slave or all slaves/masters from a given master */
3273 ast_mutex_lock(&master->lock);
3275 while (ast_mutex_trylock(&slave->lock)) {
3276 ast_mutex_unlock(&master->lock);
3278 ast_mutex_lock(&master->lock);
3283 for (x = 0; x < MAX_SLAVES; x++) {
3284 if (master->slaves[x]) {
3285 if (!slave || (master->slaves[x] == slave)) {
3286 /* Take slave out of the conference */
3288 ast_log(LOG_DEBUG, "Unlinking slave %d from %d\n", master->slaves[x]->channel, master->channel);
3289 conf_del(master, &master->slaves[x]->subs[SUB_REAL], SUB_REAL);
3290 conf_del(master->slaves[x], &master->subs[SUB_REAL], SUB_REAL);
3291 master->slaves[x]->master = NULL;
3292 master->slaves[x] = NULL;
3297 master->inconference = 0;
3300 if (master->master) {
3301 /* Take master out of the conference */
3302 conf_del(master->master, &master->subs[SUB_REAL], SUB_REAL);
3303 conf_del(master, &master->master->subs[SUB_REAL], SUB_REAL);
3305 for (x = 0; x < MAX_SLAVES; x++) {
3306 if (master->master->slaves[x] == master)
3307 master->master->slaves[x] = NULL;
3308 else if (master->master->slaves[x])
3312 master->master->inconference = 0;
3314 master->master = NULL;
3316 update_conf(master);
3319 ast_mutex_unlock(&slave->lock);
3320 ast_mutex_unlock(&master->lock);
3324 static void zt_link(struct zt_pvt *slave, struct zt_pvt *master) {
3326 if (!slave || !master) {
3327 ast_log(LOG_WARNING, "Tried to link to/from NULL??\n");
3330 for (x = 0; x < MAX_SLAVES; x++) {
3331 if (!master->slaves[x]) {
3332 master->slaves[x] = slave;
3336 if (x >= MAX_SLAVES) {
3337 ast_log(LOG_WARNING, "Replacing slave %d with new slave, %d\n", master->slaves[MAX_SLAVES - 1]->channel, slave->channel);
3338 master->slaves[MAX_SLAVES - 1] = slave;
3341 ast_log(LOG_WARNING, "Replacing master %d with new master, %d\n", slave->master->channel, master->channel);
3342 slave->master = master;
3345 ast_log(LOG_DEBUG, "Making %d slave to master %d at %d\n", slave->channel, master->channel, x);
3348 static void disable_dtmf_detect(struct zt_pvt *p)
3350 #ifdef ZT_TONEDETECT
3356 #ifdef ZT_TONEDETECT
3358 ioctl(p->subs[SUB_REAL].zfd, ZT_TONEDETECT, &val);
3360 if (!p->hardwaredtmf && p->dsp) {
3361 p->dsp_features &= ~DSP_FEATURE_DTMF_DETECT;
3362 ast_dsp_set_features(p->dsp, p->dsp_features);
3366 static void enable_dtmf_detect(struct zt_pvt *p)
3368 #ifdef ZT_TONEDETECT
3372 if (p->channel == CHAN_PSEUDO)
3377 #ifdef ZT_TONEDETECT
3378 val = ZT_TONEDETECT_ON | ZT_TONEDETECT_MUTE;
3379 ioctl(p->subs[SUB_REAL].zfd, ZT_TONEDETECT, &val);
3381 if (!p->hardwaredtmf && p->dsp) {
3382 p->dsp_features |= DSP_FEATURE_DTMF_DETECT;
3383 ast_dsp_set_features(p->dsp, p->dsp_features);
3387 static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms)
3389 struct ast_channel *who;
3390 struct zt_pvt *p0, *p1, *op0, *op1;
3391 struct zt_pvt *master = NULL, *slave = NULL;
3392 struct ast_frame *f;
3396 int oi0, oi1, i0 = -1, i1 = -1, t0, t1;
3397 int os0 = -1, os1 = -1;
3399 struct ast_channel *oc0, *oc1;
3400 enum ast_bridge_result res;
3403 int triedtopribridge = 0;
3404 q931_call *q931c0 = NULL, *q931c1 = NULL;
3407 /* For now, don't attempt to native bridge if either channel needs DTMF detection.
3408 There is code below to handle it properly until DTMF is actually seen,
3409 but due to currently unresolved issues it's ignored...
3412 if (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1))
3413 return AST_BRIDGE_FAILED_NOWARN;
3415 ast_mutex_lock(&c0->lock);
3416 ast_mutex_lock(&c1->lock);
3420 /* cant do pseudo-channels here */
3421 if (!p0 || (!p0->sig) || !p1 || (!p1->sig)) {
3422 ast_mutex_unlock(&c0->lock);
3423 ast_mutex_unlock(&c1->lock);
3424 return AST_BRIDGE_FAILED_NOWARN;
3427 oi0 = zt_get_index(c0, p0, 0);
3428 oi1 = zt_get_index(c1, p1, 0);
3429 if ((oi0 < 0) || (oi1 < 0)) {
3430 ast_mutex_unlock(&c0->lock);
3431 ast_mutex_unlock(&c1->lock);
3432 return AST_BRIDGE_FAILED;
3435 op0 = p0 = c0->tech_pvt;
3436 op1 = p1 = c1->tech_pvt;
3442 if (ast_mutex_trylock(&p0->lock)) {
3443 /* Don't block, due to potential for deadlock */
3444 ast_mutex_unlock(&c0->lock);
3445 ast_mutex_unlock(&c1->lock);
3446 ast_log(LOG_NOTICE, "Avoiding deadlock...\n");
3447 return AST_BRIDGE_RETRY;
3449 if (ast_mutex_trylock(&p1->lock)) {
3450 /* Don't block, due to potential for deadlock */
3451 ast_mutex_unlock(&p0->lock);
3452 ast_mutex_unlock(&c0->lock);
3453 ast_mutex_unlock(&c1->lock);
3454 ast_log(LOG_NOTICE, "Avoiding deadlock...\n");
3455 return AST_BRIDGE_RETRY;
3458 if ((oi0 == SUB_REAL) && (oi1 == SUB_REAL)) {
3459 if (p0->owner && p1->owner) {
3460 /* If we don't have a call-wait in a 3-way, and we aren't in a 3-way, we can be master */
3461 if (!p0->subs[SUB_CALLWAIT].inthreeway && !p1->subs[SUB_REAL].inthreeway) {
3465 } else if (!p1->subs[SUB_CALLWAIT].inthreeway && !p0->subs[SUB_REAL].inthreeway) {
3470 ast_log(LOG_WARNING, "Huh? Both calls are callwaits or 3-ways? That's clever...?\n");
3471 ast_log(LOG_WARNING, "p0: chan %d/%d/CW%d/3W%d, p1: chan %d/%d/CW%d/3W%d\n",
3473 oi0, (p0->subs[SUB_CALLWAIT].zfd > -1) ? 1 : 0,
3474 p0->subs[SUB_REAL].inthreeway, p0->channel,