Build system modifications to ensure that Asterisk properly builds on Mac OS X 10.6.
[asterisk/asterisk.git] / channels / chan_dahdi.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2008, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
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.
13  *
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.
17  */
18
19 /*! \file
20  *
21  * \brief DAHDI for Pseudo TDM
22  *
23  * \author Mark Spencer <markster@digium.com>
24  *
25  * Connects to the DAHDI telephony library as well as
26  * libpri. Libpri is optional and needed only if you are
27  * going to use ISDN connections.
28  *
29  * You need to install libraries before you attempt to compile
30  * and install the DAHDI channel.
31  *
32  * \par See also
33  * \arg \ref Config_dahdi
34  *
35  * \ingroup channel_drivers
36  *
37  * \todo Deprecate the "musiconhold" configuration option post 1.4
38  */
39
40 /*** MODULEINFO
41         <depend>res_smdi</depend>
42         <depend>dahdi</depend>
43         <depend>tonezone</depend>
44         <use>pri</use>
45         <use>ss7</use>
46         <use>openr2</use>
47  ***/
48
49 #include "asterisk.h"
50
51 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
52
53 #include <values.h>
54 #ifdef __NetBSD__
55 #include <pthread.h>
56 #include <signal.h>
57 #else
58 #include <sys/signal.h>
59 #endif
60 #include <sys/ioctl.h>
61 #include <math.h>
62 #include <ctype.h>
63
64 #include <dahdi/user.h>
65 #include <dahdi/tonezone.h>
66 #include "sig_analog.h"
67 /* Analog signaling is currently still present in chan_dahdi for use with
68  * radio. Sig_analog does not currently handle any radio operations. If
69  * radio only uses analog signaling, then the radio handling logic could
70  * be placed in sig_analog and the duplicated code could be removed.
71  */
72
73 #ifdef HAVE_PRI
74 #include "sig_pri.h"
75 #endif
76
77 #ifdef HAVE_SS7
78 /* put this here until sig_ss7 comes along */
79 #define NUM_DCHANS              4               /*!< No more than 4 d-channels */
80 #define MAX_CHANNELS    672             /*!< No more than a DS3 per trunk group */
81 #include <libss7.h>
82 #endif
83
84 #ifdef HAVE_OPENR2
85 #include <openr2.h>
86 #endif
87
88 #include "asterisk/lock.h"
89 #include "asterisk/channel.h"
90 #include "asterisk/config.h"
91 #include "asterisk/module.h"
92 #include "asterisk/pbx.h"
93 #include "asterisk/file.h"
94 #include "asterisk/ulaw.h"
95 #include "asterisk/alaw.h"
96 #include "asterisk/callerid.h"
97 #include "asterisk/adsi.h"
98 #include "asterisk/cli.h"
99 #include "asterisk/cdr.h"
100 #include "asterisk/cel.h"
101 #include "asterisk/features.h"
102 #include "asterisk/musiconhold.h"
103 #include "asterisk/say.h"
104 #include "asterisk/tdd.h"
105 #include "asterisk/app.h"
106 #include "asterisk/dsp.h"
107 #include "asterisk/astdb.h"
108 #include "asterisk/manager.h"
109 #include "asterisk/causes.h"
110 #include "asterisk/term.h"
111 #include "asterisk/utils.h"
112 #include "asterisk/transcap.h"
113 #include "asterisk/stringfields.h"
114 #include "asterisk/abstract_jb.h"
115 #include "asterisk/smdi.h"
116 #include "asterisk/astobj.h"
117 #include "asterisk/event.h"
118 #include "asterisk/devicestate.h"
119 #include "asterisk/paths.h"
120
121 /*** DOCUMENTATION
122         <application name="DAHDISendKeypadFacility" language="en_US">
123                 <synopsis>
124                         Send digits out of band over a PRI.
125                 </synopsis>
126                 <syntax>
127                         <parameter name="digits" required="true" />
128                 </syntax>
129                 <description>
130                         <para>This application will send the given string of digits in a Keypad
131                         Facility IE over the current channel.</para>
132                 </description>
133         </application>
134         <application name="DAHDISendCallreroutingFacility" language="en_US">
135                 <synopsis>
136                         Send QSIG call rerouting facility over a PRI.
137                 </synopsis>
138                 <syntax argsep=",">
139                         <parameter name="destination" required="true">
140                                 <para>Destination number.</para>
141                         </parameter>
142                         <parameter name="original">
143                                 <para>Original called number.</para>
144                         </parameter>
145                         <parameter name="reason">
146                                 <para>Diversion reason, if not specified defaults to <literal>unknown</literal></para>
147                         </parameter>
148                 </syntax>
149                 <description>
150                         <para>This application will send a Callrerouting Facility IE over the
151                         current channel.</para>
152                 </description>
153         </application>
154         <application name="DAHDIAcceptR2Call" language="en_US">
155                 <synopsis>
156                         Accept an R2 call if its not already accepted (you still need to answer it)
157                 </synopsis>
158                 <syntax>
159                         <parameter name="charge" required="true">
160                                 <para>Yes or No.</para>
161                                 <para>Whether you want to accept the call with charge or without charge.</para>
162                         </parameter>
163                 </syntax>
164                 <description>
165                         <para>This application will Accept the R2 call either with charge or no charge.</para>
166                 </description>
167         </application>
168         <manager name="DAHDITransfer" language="en_US">
169                 <synopsis>
170                         Transfer DAHDI Channel.
171                 </synopsis>
172                 <syntax>
173                         <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
174                         <parameter name="DAHDIChannel" required="true">
175                                 <para>DAHDI channel name to transfer.</para>
176                         </parameter>
177                 </syntax>
178                 <description>
179                         <para>Transfer a DAHDI channel.</para>
180                 </description>
181         </manager>
182         <manager name="DAHDIHangup" language="en_US">
183                 <synopsis>
184                         Hangup DAHDI Channel.
185                 </synopsis>
186                 <syntax>
187                         <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
188                         <parameter name="DAHDIChannel" required="true">
189                                 <para>DAHDI channel name to hangup.</para>
190                         </parameter>
191                 </syntax>
192                 <description>
193                         <para>Hangup a DAHDI channel.</para>
194                 </description>
195         </manager>
196         <manager name="DAHDIDialOffhook" language="en_US">
197                 <synopsis>
198                         Dial over DAHDI channel while offhook.
199                 </synopsis>
200                 <syntax>
201                         <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
202                         <parameter name="DAHDIChannel" required="true" />
203                         <parameter name="Number" required="true" />
204                 </syntax>
205                 <description>
206                 </description>
207         </manager>
208         <manager name="DAHDIDNDon" language="en_US">
209                 <synopsis>
210                         Toggle DAHDI channel Do Not Disturb status ON.
211                 </synopsis>
212                 <syntax>
213                         <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
214                         <parameter name="DAHDIChannel" required="true" />
215                 </syntax>
216                 <description>
217                 </description>
218         </manager>
219         <manager name="DAHDIDNDoff" language="en_US">
220                 <synopsis>
221                         Toggle DAHDI channel Do Not Disturb status OFF.
222                 </synopsis>
223                 <syntax>
224                         <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
225                         <parameter name="DAHDIChannel" required="true" />
226                 </syntax>
227                 <description>
228                 </description>
229         </manager>
230         <manager name="DAHDIShowChannels" language="en_US">
231                 <synopsis>
232                         Show status DAHDI channels.
233                 </synopsis>
234                 <syntax>
235                         <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
236                         <parameter name="DAHDIChannel" required="true" />
237                 </syntax>
238                 <description>
239                 </description>
240         </manager>
241         <manager name="DAHDIRestart" language="en_US">
242                 <synopsis>
243                         Fully Restart DAHDI channels (terminates calls).
244                 </synopsis>
245                 <syntax>
246                         <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
247                 </syntax>
248                 <description>
249                 </description>
250         </manager>
251  ***/
252
253 #define SMDI_MD_WAIT_TIMEOUT 1500 /* 1.5 seconds */
254
255 static const char * const lbostr[] = {
256 "0 db (CSU)/0-133 feet (DSX-1)",
257 "133-266 feet (DSX-1)",
258 "266-399 feet (DSX-1)",
259 "399-533 feet (DSX-1)",
260 "533-655 feet (DSX-1)",
261 "-7.5db (CSU)",
262 "-15db (CSU)",
263 "-22.5db (CSU)"
264 };
265
266 /*! Global jitterbuffer configuration - by default, jb is disabled */
267 static struct ast_jb_conf default_jbconf =
268 {
269         .flags = 0,
270         .max_size = -1,
271         .resync_threshold = -1,
272         .impl = "",
273         .target_extra = -1,
274 };
275 static struct ast_jb_conf global_jbconf;
276
277 /*!
278  * \note Define ZHONE_HACK to cause us to go off hook and then back on hook when
279  * the user hangs up to reset the state machine so ring works properly.
280  * This is used to be able to support kewlstart by putting the zhone in
281  * groundstart mode since their forward disconnect supervision is entirely
282  * broken even though their documentation says it isn't and their support
283  * is entirely unwilling to provide any assistance with their channel banks
284  * even though their web site says they support their products for life.
285  */
286 /* #define ZHONE_HACK */
287
288 /*! \note
289  * Define if you want to check the hook state for an FXO (FXS signalled) interface
290  * before dialing on it.  Certain FXO interfaces always think they're out of
291  * service with this method however.
292  */
293 /* #define DAHDI_CHECK_HOOKSTATE */
294
295 /*! \brief Typically, how many rings before we should send Caller*ID */
296 #define DEFAULT_CIDRINGS 1
297
298 #define AST_LAW(p) (((p)->law == DAHDI_LAW_ALAW) ? AST_FORMAT_ALAW : AST_FORMAT_ULAW)
299
300
301 /*! \brief Signaling types that need to use MF detection should be placed in this macro */
302 #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))
303
304 static const char tdesc[] = "DAHDI Telephony Driver"
305 #if defined(HAVE_PRI) || defined(HAVE_SS7) || defined(HAVE_OPENR2)
306         " w/"
307 #endif
308 #ifdef HAVE_PRI
309         "PRI"
310 #endif
311 #ifdef HAVE_SS7
312         #ifdef HAVE_PRI
313         " & SS7"
314         #else
315         "SS7"
316         #endif
317 #endif
318 #ifdef HAVE_OPENR2
319         #if defined(HAVE_PRI) || defined(HAVE_SS7)
320         " & MFC/R2"
321         #else
322         "MFC/R2"
323         #endif
324 #endif
325 ;
326
327 static const char config[] = "chan_dahdi.conf";
328
329 #define SIG_EM          DAHDI_SIG_EM
330 #define SIG_EMWINK      (0x0100000 | DAHDI_SIG_EM)
331 #define SIG_FEATD       (0x0200000 | DAHDI_SIG_EM)
332 #define SIG_FEATDMF     (0x0400000 | DAHDI_SIG_EM)
333 #define SIG_FEATB       (0x0800000 | DAHDI_SIG_EM)
334 #define SIG_E911        (0x1000000 | DAHDI_SIG_EM)
335 #define SIG_FEATDMF_TA  (0x2000000 | DAHDI_SIG_EM)
336 #define SIG_FGC_CAMA    (0x4000000 | DAHDI_SIG_EM)
337 #define SIG_FGC_CAMAMF  (0x8000000 | DAHDI_SIG_EM)
338 #define SIG_FXSLS       DAHDI_SIG_FXSLS
339 #define SIG_FXSGS       DAHDI_SIG_FXSGS
340 #define SIG_FXSKS       DAHDI_SIG_FXSKS
341 #define SIG_FXOLS       DAHDI_SIG_FXOLS
342 #define SIG_FXOGS       DAHDI_SIG_FXOGS
343 #define SIG_FXOKS       DAHDI_SIG_FXOKS
344 #define SIG_PRI         DAHDI_SIG_CLEAR
345 #define SIG_BRI         (0x2000000 | DAHDI_SIG_CLEAR)
346 #define SIG_BRI_PTMP    (0X4000000 | DAHDI_SIG_CLEAR)
347 #define SIG_SS7         (0x1000000 | DAHDI_SIG_CLEAR)
348 #define SIG_MFCR2       DAHDI_SIG_CAS
349 #define SIG_SF          DAHDI_SIG_SF
350 #define SIG_SFWINK      (0x0100000 | DAHDI_SIG_SF)
351 #define SIG_SF_FEATD    (0x0200000 | DAHDI_SIG_SF)
352 #define SIG_SF_FEATDMF  (0x0400000 | DAHDI_SIG_SF)
353 #define SIG_SF_FEATB    (0x0800000 | DAHDI_SIG_SF)
354 #define SIG_EM_E1       DAHDI_SIG_EM_E1
355
356 #ifdef LOTS_OF_SPANS
357 #define NUM_SPANS       DAHDI_MAX_SPANS
358 #else
359 #define NUM_SPANS               32
360 #endif
361
362 #define CHAN_PSEUDO     -2
363
364 #define CALLPROGRESS_PROGRESS           1
365 #define CALLPROGRESS_FAX_OUTGOING       2
366 #define CALLPROGRESS_FAX_INCOMING       4
367 #define CALLPROGRESS_FAX                (CALLPROGRESS_FAX_INCOMING | CALLPROGRESS_FAX_OUTGOING)
368
369 #define NUM_CADENCE_MAX 25
370 static int num_cadence = 4;
371 static int user_has_defined_cadences = 0;
372
373 static struct dahdi_ring_cadence cadences[NUM_CADENCE_MAX] = {
374         { { 125, 125, 2000, 4000 } },                   /*!< Quick chirp followed by normal ring */
375         { { 250, 250, 500, 1000, 250, 250, 500, 4000 } }, /*!< British style ring */
376         { { 125, 125, 125, 125, 125, 4000 } },  /*!< Three short bursts */
377         { { 1000, 500, 2500, 5000 } },  /*!< Long ring */
378 };
379
380 /*! \brief cidrings says in which pause to transmit the cid information, where the first pause
381  * is 1, the second pause is 2 and so on.
382  */
383
384 static int cidrings[NUM_CADENCE_MAX] = {
385         2,                                                                              /*!< Right after first long ring */
386         4,                                                                              /*!< Right after long part */
387         3,                                                                              /*!< After third chirp */
388         2,                                                                              /*!< Second spell */
389 };
390
391 /* ETSI EN300 659-1 specifies the ring pulse between 200 and 300 mS */
392 static struct dahdi_ring_cadence AS_RP_cadence = {{250, 10000}};
393
394 #define ISTRUNK(p) ((p->sig == SIG_FXSLS) || (p->sig == SIG_FXSKS) || \
395                         (p->sig == SIG_FXSGS) || (p->sig == SIG_PRI))
396
397 #define CANBUSYDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) /* || (p->sig & __DAHDI_SIG_FXO) */)
398 #define CANPROGRESSDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) /* || (p->sig & __DAHDI_SIG_FXO) */)
399
400 static char defaultcic[64] = "";
401 static char defaultozz[64] = "";
402
403 static char parkinglot[AST_MAX_EXTENSION] = "";         /*!< Default parking lot for this channel */
404
405 /*! Run this script when the MWI state changes on an FXO line, if mwimonitor is enabled */
406 static char mwimonitornotify[PATH_MAX] = "";
407 #ifndef HAVE_DAHDI_LINEREVERSE_VMWI
408 static int  mwisend_rpas = 0;
409 #endif
410
411 static char progzone[10] = "";
412
413 static int usedistinctiveringdetection = 0;
414 static int distinctiveringaftercid = 0;
415
416 static int numbufs = 4;
417
418 static int mwilevel = 512;
419 static int dtmfcid_level = 256;
420
421 #define REPORT_CHANNEL_ALARMS 1
422 #define REPORT_SPAN_ALARMS    2 
423 static int report_alarms = REPORT_CHANNEL_ALARMS;
424
425 #ifdef HAVE_PRI
426 static int pridebugfd = -1;
427 static char pridebugfilename[1024] = "";
428 #endif
429
430 /*! \brief Wait up to 16 seconds for first digit (FXO logic) */
431 static int firstdigittimeout = 16000;
432
433 /*! \brief How long to wait for following digits (FXO logic) */
434 static int gendigittimeout = 8000;
435
436 /*! \brief How long to wait for an extra digit, if there is an ambiguous match */
437 static int matchdigittimeout = 3000;
438
439 /*! \brief Protect the interface list (of dahdi_pvt's) */
440 AST_MUTEX_DEFINE_STATIC(iflock);
441
442
443 static int ifcount = 0;
444
445 #ifdef HAVE_PRI
446 AST_MUTEX_DEFINE_STATIC(pridebugfdlock);
447 #endif
448
449 /*! \brief Protect the monitoring thread, so only one process can kill or start it, and not
450    when it's doing something critical. */
451 AST_MUTEX_DEFINE_STATIC(monlock);
452
453 /*! \brief This is the thread for the monitor which checks for input on the channels
454    which are not currently in use. */
455 static pthread_t monitor_thread = AST_PTHREADT_NULL;
456 static ast_cond_t ss_thread_complete;
457 AST_MUTEX_DEFINE_STATIC(ss_thread_lock);
458 AST_MUTEX_DEFINE_STATIC(restart_lock);
459 static int ss_thread_count = 0;
460 static int num_restart_pending = 0;
461
462 static int restart_monitor(void);
463
464 static enum ast_bridge_result dahdi_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms);
465
466 static int dahdi_sendtext(struct ast_channel *c, const char *text);
467
468 static void mwi_event_cb(const struct ast_event *event, void *userdata)
469 {
470         /* This module does not handle MWI in an event-based manner.  However, it
471          * subscribes to MWI for each mailbox that is configured so that the core
472          * knows that we care about it.  Then, chan_dahdi will get the MWI from the
473          * event cache instead of checking the mailbox directly. */
474 }
475
476 /*! \brief Avoid the silly dahdi_getevent which ignores a bunch of events */
477 static inline int dahdi_get_event(int fd)
478 {
479         int j;
480         if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
481                 return -1;
482         return j;
483 }
484
485 /*! \brief Avoid the silly dahdi_waitevent which ignores a bunch of events */
486 static inline int dahdi_wait_event(int fd)
487 {
488         int i, j = 0;
489         i = DAHDI_IOMUX_SIGEVENT;
490         if (ioctl(fd, DAHDI_IOMUX, &i) == -1)
491                 return -1;
492         if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
493                 return -1;
494         return j;
495 }
496
497 /*! Chunk size to read -- we use 20ms chunks to make things happy. */
498 #define READ_SIZE 160
499
500 #define MASK_AVAIL              (1 << 0)        /*!< Channel available for PRI use */
501 #define MASK_INUSE              (1 << 1)        /*!< Channel currently in use */
502
503 #define CALLWAITING_SILENT_SAMPLES      ( (300 * 8) / READ_SIZE) /*!< 300 ms */
504 #define CALLWAITING_REPEAT_SAMPLES      ( (10000 * 8) / READ_SIZE) /*!< 10,000 ms */
505 #define CIDCW_EXPIRE_SAMPLES            ( (500 * 8) / READ_SIZE) /*!< 500 ms */
506 #define MIN_MS_SINCE_FLASH                      ( (2000) )      /*!< 2000 ms */
507 #define DEFAULT_RINGT                           ( (8000 * 8) / READ_SIZE) /*!< 8,000 ms */
508
509 struct dahdi_pvt;
510
511 /*!
512  * \brief Configured ring timeout base.
513  * \note Value computed from "ringtimeout" read in from chan_dahdi.conf if it exists.
514  */
515 static int ringt_base = DEFAULT_RINGT;
516
517 #ifdef HAVE_SS7
518
519 #define LINKSTATE_INALARM       (1 << 0)
520 #define LINKSTATE_STARTING      (1 << 1)
521 #define LINKSTATE_UP            (1 << 2)
522 #define LINKSTATE_DOWN          (1 << 3)
523
524 #define SS7_NAI_DYNAMIC         -1
525
526 #define LINKSET_FLAG_EXPLICITACM (1 << 0)
527
528 struct dahdi_ss7 {
529         pthread_t master;                                               /*!< Thread of master */
530         ast_mutex_t lock;
531         int fds[NUM_DCHANS];
532         int numsigchans;
533         int linkstate[NUM_DCHANS];
534         int numchans;
535         int type;
536         enum {
537                 LINKSET_STATE_DOWN = 0,
538                 LINKSET_STATE_UP
539         } state;
540         char called_nai;                                                /*!< Called Nature of Address Indicator */
541         char calling_nai;                                               /*!< Calling Nature of Address Indicator */
542         char internationalprefix[10];                                   /*!< country access code ('00' for european dialplans) */
543         char nationalprefix[10];                                        /*!< area access code ('0' for european dialplans) */
544         char subscriberprefix[20];                                      /*!< area access code + area code ('0'+area code for european dialplans) */
545         char unknownprefix[20];                                         /*!< for unknown dialplans */
546         struct ss7 *ss7;
547         struct dahdi_pvt *pvts[MAX_CHANNELS];                           /*!< Member channel pvt structs */
548         int flags;                                                      /*!< Linkset flags */
549 };
550
551 static struct dahdi_ss7 linksets[NUM_SPANS];
552
553 static int cur_ss7type = -1;
554 static int cur_linkset = -1;
555 static int cur_pointcode = -1;
556 static int cur_cicbeginswith = -1;
557 static int cur_adjpointcode = -1;
558 static int cur_networkindicator = -1;
559 static int cur_defaultdpc = -1;
560 #endif /* HAVE_SS7 */
561
562 #ifdef HAVE_OPENR2
563 struct dahdi_mfcr2 {
564         pthread_t r2master;                    /*!< Thread of master */
565         openr2_context_t *protocol_context;    /*!< OpenR2 context handle */
566         struct dahdi_pvt *pvts[MAX_CHANNELS];     /*!< Member channel pvt structs */
567         int numchans;                          /*!< Number of channels in this R2 block */
568         int monitored_count;                   /*!< Number of channels being monitored */
569 };
570
571 struct dahdi_mfcr2_conf {
572         openr2_variant_t variant;
573         int mfback_timeout;
574         int metering_pulse_timeout;
575         int max_ani;
576         int max_dnis;
577         signed int get_ani_first:2;
578 #if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
579         signed int skip_category_request:2;
580 #endif
581         unsigned int call_files:1;
582         unsigned int allow_collect_calls:1;
583         unsigned int charge_calls:1;
584         unsigned int accept_on_offer:1;
585         unsigned int forced_release:1;
586         unsigned int double_answer:1;
587         signed int immediate_accept:2;
588         char logdir[OR2_MAX_PATH];
589         char r2proto_file[OR2_MAX_PATH];
590         openr2_log_level_t loglevel;
591         openr2_calling_party_category_t category;
592 };
593
594 /* malloc'd array of malloc'd r2links */
595 static struct dahdi_mfcr2 **r2links;
596 /* how many r2links have been malloc'd */
597 static int r2links_count = 0;
598
599 #endif /* HAVE_OPENR2 */
600
601 #ifdef HAVE_PRI
602
603 struct dahdi_pri {
604         int dchannels[NUM_DCHANS];                                      /*!< What channel are the dchannels on */
605         int mastertrunkgroup;                                           /*!< What trunk group is our master */
606         int prilogicalspan;                                             /*!< Logical span number within trunk group */
607         struct sig_pri_pri pri;
608 };
609
610 static struct dahdi_pri pris[NUM_SPANS];
611
612 #else
613 /*! Shut up the compiler */
614 struct dahdi_pri;
615 #endif
616
617 #define SUB_REAL        0                       /*!< Active call */
618 #define SUB_CALLWAIT    1                       /*!< Call-Waiting call on hold */
619 #define SUB_THREEWAY    2                       /*!< Three-way call */
620
621 /* Polarity states */
622 #define POLARITY_IDLE   0
623 #define POLARITY_REV    1
624
625
626 struct distRingData {
627         int ring[3];
628         int range;
629 };
630 struct ringContextData {
631         char contextData[AST_MAX_CONTEXT];
632 };
633 struct dahdi_distRings {
634         struct distRingData ringnum[3];
635         struct ringContextData ringContext[3];
636 };
637
638 static const char * const subnames[] = {
639         "Real",
640         "Callwait",
641         "Threeway"
642 };
643
644 struct dahdi_subchannel {
645         int dfd;
646         struct ast_channel *owner;
647         int chan;
648         short buffer[AST_FRIENDLY_OFFSET/2 + READ_SIZE];
649         struct ast_frame f;             /*!< One frame for each channel.  How did this ever work before? */
650         unsigned int needringing:1;
651         unsigned int needbusy:1;
652         unsigned int needcongestion:1;
653         unsigned int needanswer:1;
654         unsigned int needflash:1;
655         unsigned int needhold:1;
656         unsigned int needunhold:1;
657         unsigned int linear:1;
658         unsigned int inthreeway:1;
659         struct dahdi_confinfo curconf;
660 };
661
662 #define CONF_USER_REAL          (1 << 0)
663 #define CONF_USER_THIRDCALL     (1 << 1)
664
665 #define MAX_SLAVES      4
666
667 /* States for sending MWI message
668  * First three states are required for send Ring Pulse Alert Signal
669  */
670 typedef enum {
671         MWI_SEND_NULL = 0,
672         MWI_SEND_SA,
673         MWI_SEND_SA_WAIT,
674         MWI_SEND_PAUSE,
675         MWI_SEND_SPILL,
676         MWI_SEND_CLEANUP,
677         MWI_SEND_DONE,
678 } mwisend_states;
679
680 struct mwisend_info {
681         struct  timeval pause;
682         mwisend_states  mwisend_current;
683 };
684
685 /*! Specify the lists dahdi_pvt can be put in. */
686 enum DAHDI_IFLIST {
687         DAHDI_IFLIST_NONE,      /*!< The dahdi_pvt is not in any list. */
688         DAHDI_IFLIST_MAIN,      /*!< The dahdi_pvt is in the main interface list */
689 #if defined(HAVE_PRI)
690         DAHDI_IFLIST_NO_B_CHAN, /*!< The dahdi_pvt is in a no B channel interface list */
691 #endif  /* defined(HAVE_PRI) */
692 };
693
694 struct dahdi_pvt {
695         ast_mutex_t lock;
696         struct callerid_state *cs;
697         struct ast_channel *owner;                      /*!< Our current active owner (if applicable) */
698                                                         /*!< Up to three channels can be associated with this call */
699
700         struct dahdi_subchannel sub_unused;             /*!< Just a safety precaution */
701         struct dahdi_subchannel subs[3];                        /*!< Sub-channels */
702         struct dahdi_confinfo saveconf;                 /*!< Saved conference info */
703
704         struct dahdi_pvt *slaves[MAX_SLAVES];           /*!< Slave to us (follows our conferencing) */
705         struct dahdi_pvt *master;                               /*!< Master to us (we follow their conferencing) */
706         int inconference;                               /*!< If our real should be in the conference */
707
708         int bufsize;                /*!< Size of the buffers */
709         int buf_no;                                     /*!< Number of buffers */
710         int buf_policy;                         /*!< Buffer policy */
711         int faxbuf_no;              /*!< Number of Fax buffers */
712         int faxbuf_policy;          /*!< Fax buffer policy */
713         int sig;                                        /*!< Signalling style */
714         /*!
715          * \brief Nonzero if the signaling type is sent over a radio.
716          * \note Set to a couple of nonzero values but it is only tested like a boolean.
717          */
718         int radio;
719         int outsigmod;                                  /*!< Outbound Signalling style (modifier) */
720         int oprmode;                                    /*!< "Operator Services" mode */
721         struct dahdi_pvt *oprpeer;                              /*!< "Operator Services" peer tech_pvt ptr */
722         /*! \brief Amount of gain to increase during caller id */
723         float cid_rxgain;
724         /*! \brief Rx gain set by chan_dahdi.conf */
725         float rxgain;
726         /*! \brief Tx gain set by chan_dahdi.conf */
727         float txgain;
728
729         float txdrc; /*!< Dynamic Range Compression factor. a number between 1 and 6ish */
730         float rxdrc;
731         
732         int tonezone;                                   /*!< tone zone for this chan, or -1 for default */
733         enum DAHDI_IFLIST which_iflist; /*!< Which interface list is this structure listed? */
734         struct dahdi_pvt *next;                         /*!< Next channel in list */
735         struct dahdi_pvt *prev;                         /*!< Prev channel in list */
736
737         /* flags */
738
739         /*!
740          * \brief TRUE if ADSI (Analog Display Services Interface) available
741          * \note Set from the "adsi" value read in from chan_dahdi.conf
742          */
743         unsigned int adsi:1;
744         /*!
745          * \brief TRUE if we can use a polarity reversal to mark when an outgoing
746          * call is answered by the remote party.
747          * \note Set from the "answeronpolarityswitch" value read in from chan_dahdi.conf
748          */
749         unsigned int answeronpolarityswitch:1;
750         /*!
751          * \brief TRUE if busy detection is enabled.
752          * (Listens for the beep-beep busy pattern.)
753          * \note Set from the "busydetect" value read in from chan_dahdi.conf
754          */
755         unsigned int busydetect:1;
756         /*!
757          * \brief TRUE if call return is enabled.
758          * (*69, if your dialplan doesn't catch this first)
759          * \note Set from the "callreturn" value read in from chan_dahdi.conf
760          */
761         unsigned int callreturn:1;
762         /*!
763          * \brief TRUE if busy extensions will hear the call-waiting tone
764          * and can use hook-flash to switch between callers.
765          * \note Can be disabled by dialing *70.
766          * \note Initialized with the "callwaiting" value read in from chan_dahdi.conf
767          */
768         unsigned int callwaiting:1;
769         /*!
770          * \brief TRUE if send caller ID for Call Waiting
771          * \note Set from the "callwaitingcallerid" value read in from chan_dahdi.conf
772          */
773         unsigned int callwaitingcallerid:1;
774         /*!
775          * \brief TRUE if support for call forwarding enabled.
776          * Dial *72 to enable call forwarding.
777          * Dial *73 to disable call forwarding.
778          * \note Set from the "cancallforward" value read in from chan_dahdi.conf
779          */
780         unsigned int cancallforward:1;
781         /*!
782          * \brief TRUE if support for call parking is enabled.
783          * \note Set from the "canpark" value read in from chan_dahdi.conf
784          */
785         unsigned int canpark:1;
786         /*! \brief TRUE if to wait for a DTMF digit to confirm answer */
787         unsigned int confirmanswer:1;
788         /*!
789          * \brief TRUE if the channel is to be destroyed on hangup.
790          * (Used by pseudo channels.)
791          */
792         unsigned int destroy:1;
793         unsigned int didtdd:1;                          /*!< flag to say its done it once */
794         /*! \brief TRUE if analog type line dialed no digits in Dial() */
795         unsigned int dialednone:1;
796         /*! \brief TRUE if in the process of dialing digits or sending something. */
797         unsigned int dialing:1;
798         /*! \brief TRUE if the transfer capability of the call is digital. */
799         unsigned int digital:1;
800         /*! \brief TRUE if Do-Not-Disturb is enabled, present only for non sig_analog */
801         unsigned int dnd:1;
802         /*! \brief XXX BOOLEAN Purpose??? */
803         unsigned int echobreak:1;
804         /*!
805          * \brief TRUE if echo cancellation enabled when bridged.
806          * \note Initialized with the "echocancelwhenbridged" value read in from chan_dahdi.conf
807          * \note Disabled if the echo canceller is not setup.
808          */
809         unsigned int echocanbridged:1;
810         /*! \brief TRUE if echo cancellation is turned on. */
811         unsigned int echocanon:1;
812         /*! \brief TRUE if a fax tone has already been handled. */
813         unsigned int faxhandled:1;
814         /*! TRUE if dynamic faxbuffers are configured for use, default is OFF */
815         unsigned int usefaxbuffers:1;
816         /*! TRUE while buffer configuration override is in use */
817         unsigned int bufferoverrideinuse:1;
818         /*! \brief TRUE if over a radio and dahdi_read() has been called. */
819         unsigned int firstradio:1;
820         /*!
821          * \brief TRUE if the call will be considered "hung up" on a polarity reversal.
822          * \note Set from the "hanguponpolarityswitch" value read in from chan_dahdi.conf
823          */
824         unsigned int hanguponpolarityswitch:1;
825         /*! \brief TRUE if DTMF detection needs to be done by hardware. */
826         unsigned int hardwaredtmf:1;
827         /*!
828          * \brief TRUE if the outgoing caller ID is blocked/hidden.
829          * \note Caller ID can be disabled by dialing *67.
830          * \note Caller ID can be enabled by dialing *82.
831          * \note Initialized with the "hidecallerid" value read in from chan_dahdi.conf
832          */
833         unsigned int hidecallerid:1;
834         /*!
835          * \brief TRUE if hide just the name not the number for legacy PBX use.
836          * \note Only applies to PRI channels.
837          * \note Set from the "hidecalleridname" value read in from chan_dahdi.conf
838          */
839         unsigned int hidecalleridname:1;
840         /*! \brief TRUE if DTMF detection is disabled. */
841         unsigned int ignoredtmf:1;
842         /*!
843          * \brief TRUE if the channel should be answered immediately
844          * without attempting to gather any digits.
845          * \note Set from the "immediate" value read in from chan_dahdi.conf
846          */
847         unsigned int immediate:1;
848         /*! \brief TRUE if in an alarm condition. */
849         unsigned int inalarm:1;
850         /*! \brief TRUE if TDD in MATE mode */
851         unsigned int mate:1;
852         /*! \brief TRUE if we originated the call leg. */
853         unsigned int outgoing:1;
854         /* unsigned int overlapdial:1;                  unused and potentially confusing */
855         /*!
856          * \brief TRUE if busy extensions will hear the call-waiting tone
857          * and can use hook-flash to switch between callers.
858          * \note Set from the "callwaiting" value read in from chan_dahdi.conf
859          */
860         unsigned int permcallwaiting:1;
861         /*!
862          * \brief TRUE if the outgoing caller ID is blocked/restricted/hidden.
863          * \note Set from the "hidecallerid" value read in from chan_dahdi.conf
864          */
865         unsigned int permhidecallerid:1;
866         /*!
867          * \brief TRUE if PRI congestion/busy indications are sent out-of-band.
868          * \note Set from the "priindication" value read in from chan_dahdi.conf
869          */
870         unsigned int priindication_oob:1;
871         /*!
872          * \brief TRUE if PRI B channels are always exclusively selected.
873          * \note Set from the "priexclusive" value read in from chan_dahdi.conf
874          */
875         unsigned int priexclusive:1;
876         /*!
877          * \brief TRUE if we will pulse dial.
878          * \note Set from the "pulsedial" value read in from chan_dahdi.conf
879          */
880         unsigned int pulse:1;
881         /*! \brief TRUE if a pulsed digit was detected. (Pulse dial phone detected) */
882         unsigned int pulsedial:1;
883         unsigned int restartpending:1;          /*!< flag to ensure counted only once for restart */
884         /*!
885          * \brief TRUE if caller ID is restricted.
886          * \note Set but not used.  Should be deleted.  Redundant with permhidecallerid.
887          * \note Set from the "restrictcid" value read in from chan_dahdi.conf
888          */
889         unsigned int restrictcid:1;
890         /*!
891          * \brief TRUE if three way calling is enabled
892          * \note Set from the "threewaycalling" value read in from chan_dahdi.conf
893          */
894         unsigned int threewaycalling:1;
895         /*!
896          * \brief TRUE if call transfer is enabled
897          * \note For FXS ports (either direct analog or over T1/E1):
898          *   Support flash-hook call transfer
899          * \note For digital ports using ISDN PRI protocols:
900          *   Support switch-side transfer (called 2BCT, RLT or other names)
901          * \note Set from the "transfer" value read in from chan_dahdi.conf
902          */
903         unsigned int transfer:1;
904         /*!
905          * \brief TRUE if caller ID is used on this channel.
906          * \note PRI and SS7 spans will save caller ID from the networking peer.
907          * \note FXS ports will generate the caller ID spill.
908          * \note FXO ports will listen for the caller ID spill.
909          * \note Set from the "usecallerid" value read in from chan_dahdi.conf
910          */
911         unsigned int use_callerid:1;
912         /*!
913          * \brief TRUE if we will use the calling presentation setting
914          * from the Asterisk channel for outgoing calls.
915          * \note Only applies to PRI and SS7 channels.
916          * \note Set from the "usecallingpres" value read in from chan_dahdi.conf
917          */
918         unsigned int use_callingpres:1;
919         /*!
920          * \brief TRUE if distinctive rings are to be detected.
921          * \note For FXO lines
922          * \note Set indirectly from the "usedistinctiveringdetection" value read in from chan_dahdi.conf
923          */
924         unsigned int usedistinctiveringdetection:1;
925         /*!
926          * \brief TRUE if we should use the callerid from incoming call on dahdi transfer.
927          * \note Set from the "useincomingcalleridondahditransfer" value read in from chan_dahdi.conf
928          */
929         unsigned int dahditrcallerid:1;
930         /*!
931          * \brief TRUE if allowed to flash-transfer to busy channels.
932          * \note Set from the "transfertobusy" value read in from chan_dahdi.conf
933          */
934         unsigned int transfertobusy:1;
935         /*!
936          * \brief TRUE if the FXO port monitors for neon type MWI indications from the other end.
937          * \note Set if the "mwimonitor" value read in contains "neon" from chan_dahdi.conf
938          */
939         unsigned int mwimonitor_neon:1;
940         /*!
941          * \brief TRUE if the FXO port monitors for fsk type MWI indications from the other end.
942          * \note Set if the "mwimonitor" value read in contains "fsk" from chan_dahdi.conf
943          */
944         unsigned int mwimonitor_fsk:1;
945         /*!
946          * \brief TRUE if the FXO port monitors for rpas precursor to fsk MWI indications from the other end.
947          * \note RPAS - Ring Pulse Alert Signal
948          * \note Set if the "mwimonitor" value read in contains "rpas" from chan_dahdi.conf
949          */
950         unsigned int mwimonitor_rpas:1;
951         /*! \brief TRUE if an MWI monitor thread is currently active */
952         unsigned int mwimonitoractive:1;
953         /*! \brief TRUE if a MWI message sending thread is active */
954         unsigned int mwisendactive:1;
955         /*!
956          * \brief TRUE if channel is out of reset and ready
957          * \note Set but not used.
958          */
959         unsigned int inservice:1;
960         /*!
961          * \brief TRUE if the channel is locally blocked.
962          * \note Applies to SS7 and MFCR2 channels.
963          */
964         unsigned int locallyblocked:1;
965         /*!
966          * \brief TRUE if the channel is remotely blocked.
967          * \note Applies to SS7 and MFCR2 channels.
968          */
969         unsigned int remotelyblocked:1;
970         /*!
971          * \brief TRUE if the channel alarms will be managed also as Span ones
972          * \note Applies to all channels
973          */
974         unsigned int manages_span_alarms:1;
975
976 #if defined(HAVE_PRI)
977         struct sig_pri_pri *pri;
978         int prioffset;
979         int logicalspan;
980 #endif
981 #if defined(HAVE_PRI) || defined(HAVE_SS7)
982         /*!
983          * \brief XXX BOOLEAN Purpose???
984          * \note Applies to SS7 channels.
985          */
986         unsigned int rlt:1;
987         /*! \brief TRUE if channel is alerting/ringing */
988         unsigned int alerting:1;
989         /*! \brief TRUE if the call has already gone/hungup */
990         unsigned int alreadyhungup:1;
991         /*!
992          * \brief TRUE if call is in a proceeding state.
993          * The call has started working its way through the network.
994          */
995         unsigned int proceeding:1;
996         /*! \brief TRUE if the call has seen progress through the network. */
997         unsigned int progress:1;
998 #endif
999         /*!
1000          * \brief TRUE if SMDI (Simplified Message Desk Interface) is enabled
1001          * \note Set from the "usesmdi" value read in from chan_dahdi.conf
1002          */
1003         unsigned int use_smdi:1;
1004         struct mwisend_info mwisend_data;
1005         /*! \brief The serial port to listen for SMDI data on */
1006         struct ast_smdi_interface *smdi_iface;
1007
1008         /*! \brief Distinctive Ring data */
1009         struct dahdi_distRings drings;
1010
1011         /*!
1012          * \brief The configured context for incoming calls.
1013          * \note The "context" string read in from chan_dahdi.conf
1014          */
1015         char context[AST_MAX_CONTEXT];
1016         /*!
1017          * \brief Saved context string.
1018          */
1019         char defcontext[AST_MAX_CONTEXT];
1020         /*! \brief Extension to use in the dialplan. */
1021         char exten[AST_MAX_EXTENSION];
1022         /*!
1023          * \brief Language configured for calls.
1024          * \note The "language" string read in from chan_dahdi.conf
1025          */
1026         char language[MAX_LANGUAGE];
1027         /*!
1028          * \brief The configured music-on-hold class to use for calls.
1029          * \note The "musicclass" or "mohinterpret" or "musiconhold" string read in from chan_dahdi.conf
1030          */
1031         char mohinterpret[MAX_MUSICCLASS];
1032         /*!
1033          * \brief Suggested music-on-hold class for peer channel to use for calls.
1034          * \note The "mohsuggest" string read in from chan_dahdi.conf
1035          */
1036         char mohsuggest[MAX_MUSICCLASS];
1037         char parkinglot[AST_MAX_EXTENSION]; /*!< Parking lot for this channel */
1038 #if defined(PRI_ANI) || defined(HAVE_SS7)
1039         /*! \brief Automatic Number Identification number (Alternate PRI caller ID number) */
1040         char cid_ani[AST_MAX_EXTENSION];
1041 #endif
1042         /*! \brief Automatic Number Identification code from PRI */
1043         int cid_ani2;
1044         /*! \brief Caller ID number from an incoming call. */
1045         char cid_num[AST_MAX_EXTENSION];
1046         /*! \brief Caller ID Q.931 TON/NPI field values.  Set by PRI. Zero otherwise. */
1047         int cid_ton;
1048         /*! \brief Caller ID name from an incoming call. */
1049         char cid_name[AST_MAX_EXTENSION];
1050         /*! \brief Caller ID subaddress from an incoming call. */
1051         char cid_subaddr[AST_MAX_EXTENSION];
1052         char *origcid_num;                              /*!< malloced original callerid */
1053         char *origcid_name;                             /*!< malloced original callerid */
1054         /*! \brief Call waiting number. */
1055         char callwait_num[AST_MAX_EXTENSION];
1056         /*! \brief Call waiting name. */
1057         char callwait_name[AST_MAX_EXTENSION];
1058         /*! \brief Redirecting Directory Number Information Service (RDNIS) number */
1059         char rdnis[AST_MAX_EXTENSION];
1060         /*! \brief Dialed Number Identifier */
1061         char dnid[AST_MAX_EXTENSION];
1062         /*!
1063          * \brief Bitmapped groups this belongs to.
1064          * \note The "group" bitmapped group string read in from chan_dahdi.conf
1065          */
1066         ast_group_t group;
1067         /*! \brief Active PCM encoding format: DAHDI_LAW_ALAW or DAHDI_LAW_MULAW */
1068         int law;
1069         int confno;                                     /*!< Our conference */
1070         int confusers;                                  /*!< Who is using our conference */
1071         int propconfno;                                 /*!< Propagated conference number */
1072         /*!
1073          * \brief Bitmapped call groups this belongs to.
1074          * \note The "callgroup" bitmapped group string read in from chan_dahdi.conf
1075          */
1076         ast_group_t callgroup;
1077         /*!
1078          * \brief Bitmapped pickup groups this belongs to.
1079          * \note The "pickupgroup" bitmapped group string read in from chan_dahdi.conf
1080          */
1081         ast_group_t pickupgroup;
1082         /*!
1083          * \brief Channel variable list with associated values to set when a channel is created.
1084          * \note The "setvar" strings read in from chan_dahdi.conf
1085          */
1086         struct ast_variable *vars;
1087         int channel;                                    /*!< Channel Number */
1088         int span;                                       /*!< Span number */
1089         time_t guardtime;                               /*!< Must wait this much time before using for new call */
1090         int cid_signalling;                             /*!< CID signalling type bell202 or v23 */
1091         int cid_start;                                  /*!< CID start indicator, polarity or ring or DTMF without warning event */
1092         int dtmfcid_holdoff_state;              /*!< State indicator that allows for line to settle before checking for dtmf energy */
1093         struct timeval  dtmfcid_delay;  /*!< Time value used for allow line to settle */
1094         int callingpres;                                /*!< The value of calling presentation that we're going to use when placing a PRI call */
1095         int callwaitingrepeat;                          /*!< How many samples to wait before repeating call waiting */
1096         int cidcwexpire;                                /*!< When to expire our muting for CID/CW */
1097         /*! \brief Analog caller ID waveform sample buffer */
1098         unsigned char *cidspill;
1099         /*! \brief Position in the cidspill buffer to send out next. */
1100         int cidpos;
1101         /*! \brief Length of the cidspill buffer containing samples. */
1102         int cidlen;
1103         /*! \brief Ring timeout timer?? */
1104         int ringt;
1105         /*!
1106          * \brief Ring timeout base.
1107          * \note Value computed indirectly from "ringtimeout" read in from chan_dahdi.conf
1108          */
1109         int ringt_base;
1110         /*!
1111          * \brief Number of most significant digits/characters to strip from the dialed number.
1112          * \note Feature is deprecated.  Use dialplan logic.
1113          * \note The characters are stripped before the PRI TON/NPI prefix
1114          * characters are processed.
1115          */
1116         int stripmsd;
1117         /*! \brief BOOLEAN. XXX Meaning what?? */
1118         int callwaitcas;
1119         /*! \brief Number of call waiting rings. */
1120         int callwaitrings;
1121         /*! \brief Echo cancel parameters. */
1122         struct {
1123                 struct dahdi_echocanparams head;
1124                 struct dahdi_echocanparam params[DAHDI_MAX_ECHOCANPARAMS];
1125         } echocancel;
1126         /*!
1127          * \brief Echo training time. 0 = disabled
1128          * \note Set from the "echotraining" value read in from chan_dahdi.conf
1129          */
1130         int echotraining;
1131         /*! \brief Filled with 'w'.  XXX Purpose?? */
1132         char echorest[20];
1133         /*!
1134          * \brief Number of times to see "busy" tone before hanging up.
1135          * \note Set from the "busycount" value read in from chan_dahdi.conf
1136          */
1137         int busycount;
1138         /*!
1139          * \brief Length of "busy" tone on time.
1140          * \note Set from the "busypattern" value read in from chan_dahdi.conf
1141          */
1142         int busy_tonelength;
1143         /*!
1144          * \brief Length of "busy" tone off time.
1145          * \note Set from the "busypattern" value read in from chan_dahdi.conf
1146          */
1147         int busy_quietlength;
1148         /*!
1149          * \brief Bitmapped call progress detection flags. CALLPROGRESS_xxx values.
1150          * \note Bits set from the "callprogress" and "faxdetect" values read in from chan_dahdi.conf
1151          */
1152         int callprogress;
1153         /*!
1154          * \brief Number of milliseconds to wait for dialtone.
1155          * \note Set from the "waitfordialtone" value read in from chan_dahdi.conf
1156          */
1157         int waitfordialtone;
1158         struct timeval waitingfordt;                    /*!< Time we started waiting for dialtone */
1159         struct timeval flashtime;                       /*!< Last flash-hook time */
1160         /*! \brief Opaque DSP configuration structure. */
1161         struct ast_dsp *dsp;
1162         /*! \brief DAHDI dial operation command struct for ioctl() call. */
1163         struct dahdi_dialoperation dop;
1164         int whichwink;                                  /*!< SIG_FEATDMF_TA Which wink are we on? */
1165         /*! \brief Second part of SIG_FEATDMF_TA wink operation. */
1166         char finaldial[64];
1167         char accountcode[AST_MAX_ACCOUNT_CODE];         /*!< Account code */
1168         int amaflags;                                   /*!< AMA Flags */
1169         struct tdd_state *tdd;                          /*!< TDD flag */
1170         /*! \brief Accumulated call forwarding number. */
1171         char call_forward[AST_MAX_EXTENSION];
1172         /*!
1173          * \brief Voice mailbox location.
1174          * \note Set from the "mailbox" string read in from chan_dahdi.conf
1175          */
1176         char mailbox[AST_MAX_EXTENSION];
1177         /*! \brief Opaque event subscription parameters for message waiting indication support. */
1178         struct ast_event_sub *mwi_event_sub;
1179         /*! \brief Delayed dialing for E911.  Overlap digits for ISDN. */
1180         char dialdest[256];
1181 #ifdef HAVE_DAHDI_LINEREVERSE_VMWI
1182         struct dahdi_vmwi_info mwisend_setting;                         /*!< Which VMWI methods to use */
1183         unsigned int mwisend_fsk: 1;            /*! Variable for enabling FSK MWI handling in chan_dahdi */
1184         unsigned int mwisend_rpas:1;            /*! Variable for enabling Ring Pulse Alert before MWI FSK Spill */
1185 #endif
1186         int distinctivering;                            /*!< Which distinctivering to use */
1187         int dtmfrelax;                                  /*!< whether to run in relaxed DTMF mode */
1188         /*! \brief Holding place for event injected from outside normal operation. */
1189         int fake_event;
1190         /*!
1191          * \brief Minimal time period (ms) between the answer polarity
1192          * switch and hangup polarity switch.
1193          */
1194         int polarityonanswerdelay;
1195         /*! \brief Start delay time if polarityonanswerdelay is nonzero. */
1196         struct timeval polaritydelaytv;
1197         /*!
1198          * \brief Send caller ID on FXS after this many rings. Set to 1 for US.
1199          * \note Set from the "sendcalleridafter" value read in from chan_dahdi.conf
1200          */
1201         int sendcalleridafter;
1202         /*! \brief Current line interface polarity. POLARITY_IDLE, POLARITY_REV */
1203         int polarity;
1204         /*! \brief DSP feature flags: DSP_FEATURE_xxx */
1205         int dsp_features;
1206 #ifdef HAVE_SS7
1207         /*! \brief SS7 control parameters */
1208         struct dahdi_ss7 *ss7;
1209         /*! \brief Opaque libss7 call control structure */
1210         struct isup_call *ss7call;
1211         char charge_number[50];
1212         char gen_add_number[50];
1213         char gen_dig_number[50];
1214         char orig_called_num[50];
1215         char redirecting_num[50];
1216         char generic_name[50];
1217         unsigned char gen_add_num_plan;
1218         unsigned char gen_add_nai;
1219         unsigned char gen_add_pres_ind;
1220         unsigned char gen_add_type;
1221         unsigned char gen_dig_type;
1222         unsigned char gen_dig_scheme;
1223         char jip_number[50];
1224         unsigned char lspi_type;
1225         unsigned char lspi_scheme;
1226         unsigned char lspi_context;
1227         char lspi_ident[50];
1228         unsigned int call_ref_ident;
1229         unsigned int call_ref_pc;
1230         unsigned char calling_party_cat;
1231         int transcap;
1232         int cic;                                                        /*!< CIC associated with channel */
1233         unsigned int dpc;                                               /*!< CIC's DPC */
1234         unsigned int loopedback:1;
1235 #endif
1236 #ifdef HAVE_OPENR2
1237         struct dahdi_mfcr2 *mfcr2;
1238         openr2_chan_t *r2chan;
1239         openr2_calling_party_category_t mfcr2_recvd_category;
1240         openr2_calling_party_category_t mfcr2_category;
1241         int mfcr2_dnis_index;
1242         int mfcr2_ani_index;
1243         int mfcr2call:1;
1244         int mfcr2_answer_pending:1;
1245         int mfcr2_charge_calls:1;
1246         int mfcr2_allow_collect_calls:1;
1247         int mfcr2_forced_release:1;
1248         int mfcr2_dnis_matched:1;
1249         int mfcr2_call_accepted:1;
1250         int mfcr2_accept_on_offer:1;
1251 #endif
1252         /*! \brief DTMF digit in progress.  0 when no digit in progress. */
1253         char begindigit;
1254         /*! \brief TRUE if confrence is muted. */
1255         int muting;
1256         void *sig_pvt;
1257 };
1258
1259 static struct dahdi_pvt *iflist = NULL; /*!< Main interface list start */
1260 static struct dahdi_pvt *ifend = NULL;  /*!< Main interface list end */
1261
1262 #if defined(HAVE_PRI)
1263 static struct dahdi_parms_pseudo {
1264         int buf_no;                                     /*!< Number of buffers */
1265         int buf_policy;                         /*!< Buffer policy */
1266         int faxbuf_no;              /*!< Number of Fax buffers */
1267         int faxbuf_policy;          /*!< Fax buffer policy */
1268 } dahdi_pseudo_parms;
1269 #endif  /* defined(HAVE_PRI) */
1270
1271 /*! \brief Channel configuration from chan_dahdi.conf .
1272  * This struct is used for parsing the [channels] section of chan_dahdi.conf.
1273  * Generally there is a field here for every possible configuration item.
1274  *
1275  * The state of fields is saved along the parsing and whenever a 'channel'
1276  * statement is reached, the current dahdi_chan_conf is used to configure the
1277  * channel (struct dahdi_pvt)
1278  *
1279  * \see dahdi_chan_init for the default values.
1280  */
1281 struct dahdi_chan_conf {
1282         struct dahdi_pvt chan;
1283 #ifdef HAVE_PRI
1284         struct dahdi_pri pri;
1285 #endif
1286
1287 #ifdef HAVE_SS7
1288         struct dahdi_ss7 ss7;
1289 #endif
1290
1291 #ifdef HAVE_OPENR2
1292         struct dahdi_mfcr2_conf mfcr2;
1293 #endif
1294         struct dahdi_params timing;
1295         int is_sig_auto; /*!< Use channel signalling from DAHDI? */
1296
1297         /*!
1298          * \brief The serial port to listen for SMDI data on
1299          * \note Set from the "smdiport" string read in from chan_dahdi.conf
1300          */
1301         char smdi_port[SMDI_MAX_FILENAME_LEN];
1302 };
1303
1304 /*! returns a new dahdi_chan_conf with default values (by-value) */
1305 static struct dahdi_chan_conf dahdi_chan_conf_default(void)
1306 {
1307         /* recall that if a field is not included here it is initialized
1308          * to 0 or equivalent
1309          */
1310         struct dahdi_chan_conf conf = {
1311 #ifdef HAVE_PRI
1312                 .pri.pri = {
1313                         .nsf = PRI_NSF_NONE,
1314                         .switchtype = PRI_SWITCH_NI2,
1315                         .dialplan = PRI_UNKNOWN + 1,
1316                         .localdialplan = PRI_NATIONAL_ISDN + 1,
1317                         .nodetype = PRI_CPE,
1318                         .qsigchannelmapping = DAHDI_CHAN_MAPPING_PHYSICAL,
1319
1320                         .minunused = 2,
1321                         .idleext = "",
1322                         .idledial = "",
1323                         .internationalprefix = "",
1324                         .nationalprefix = "",
1325                         .localprefix = "",
1326                         .privateprefix = "",
1327                         .unknownprefix = "",
1328                         .resetinterval = -1,
1329                 },
1330 #endif
1331 #ifdef HAVE_SS7
1332                 .ss7 = {
1333                         .called_nai = SS7_NAI_NATIONAL,
1334                         .calling_nai = SS7_NAI_NATIONAL,
1335                         .internationalprefix = "",
1336                         .nationalprefix = "",
1337                         .subscriberprefix = "",
1338                         .unknownprefix = ""
1339                 },
1340 #endif
1341 #ifdef HAVE_OPENR2
1342                 .mfcr2 = {
1343                         .variant = OR2_VAR_ITU,
1344                         .mfback_timeout = -1,
1345                         .metering_pulse_timeout = -1,
1346                         .max_ani = 10,
1347                         .max_dnis = 4,
1348                         .get_ani_first = -1,
1349 #if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
1350                         .skip_category_request = -1,
1351 #endif
1352                         .call_files = 0,
1353                         .allow_collect_calls = 0,
1354                         .charge_calls = 1,
1355                         .accept_on_offer = 1,
1356                         .forced_release = 0,
1357                         .double_answer = 0,
1358                         .immediate_accept = -1,
1359                         .logdir = "",
1360                         .r2proto_file = "",
1361                         .loglevel = OR2_LOG_ERROR | OR2_LOG_WARNING,
1362                         .category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER
1363                 },
1364 #endif
1365                 .chan = {
1366                         .context = "default",
1367                         .cid_num = "",
1368                         .cid_name = "",
1369                         .mohinterpret = "default",
1370                         .mohsuggest = "",
1371                         .parkinglot = "",
1372                         .transfertobusy = 1,
1373
1374                         .cid_signalling = CID_SIG_BELL,
1375                         .cid_start = CID_START_RING,
1376                         .dahditrcallerid = 0,
1377                         .use_callerid = 1,
1378                         .sig = -1,
1379                         .outsigmod = -1,
1380
1381                         .cid_rxgain = +5.0,
1382
1383                         .tonezone = -1,
1384
1385                         .echocancel.head.tap_length = 1,
1386
1387                         .busycount = 3,
1388
1389                         .accountcode = "",
1390
1391                         .mailbox = "",
1392
1393 #ifdef HAVE_DAHDI_LINEREVERSE_VMWI
1394                         .mwisend_fsk = 1,
1395 #endif
1396                         .polarityonanswerdelay = 600,
1397
1398                         .sendcalleridafter = DEFAULT_CIDRINGS,
1399
1400                         .buf_policy = DAHDI_POLICY_IMMEDIATE,
1401                         .buf_no = numbufs,
1402                         .usefaxbuffers = 0,
1403                 },
1404                 .timing = {
1405                         .prewinktime = -1,
1406                         .preflashtime = -1,
1407                         .winktime = -1,
1408                         .flashtime = -1,
1409                         .starttime = -1,
1410                         .rxwinktime = -1,
1411                         .rxflashtime = -1,
1412                         .debouncetime = -1
1413                 },
1414                 .is_sig_auto = 1,
1415                 .smdi_port = "/dev/ttyS0",
1416         };
1417
1418         return conf;
1419 }
1420
1421
1422 static struct ast_channel *dahdi_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause);
1423 static int dahdi_digit_begin(struct ast_channel *ast, char digit);
1424 static int dahdi_digit_end(struct ast_channel *ast, char digit, unsigned int duration);
1425 static int dahdi_sendtext(struct ast_channel *c, const char *text);
1426 static int dahdi_call(struct ast_channel *ast, char *rdest, int timeout);
1427 static int dahdi_hangup(struct ast_channel *ast);
1428 static int dahdi_answer(struct ast_channel *ast);
1429 static struct ast_frame *dahdi_read(struct ast_channel *ast);
1430 static int dahdi_write(struct ast_channel *ast, struct ast_frame *frame);
1431 static struct ast_frame *dahdi_exception(struct ast_channel *ast);
1432 static int dahdi_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen);
1433 static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
1434 static int dahdi_setoption(struct ast_channel *chan, int option, void *data, int datalen);
1435 static int dahdi_queryoption(struct ast_channel *chan, int option, void *data, int *datalen);
1436 static int dahdi_func_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t len);
1437 static int dahdi_func_write(struct ast_channel *chan, const char *function, char *data, const char *value);
1438
1439 static const struct ast_channel_tech dahdi_tech = {
1440         .type = "DAHDI",
1441         .description = tdesc,
1442         .capabilities = AST_FORMAT_SLINEAR | AST_FORMAT_ULAW | AST_FORMAT_ALAW,
1443         .requester = dahdi_request,
1444         .send_digit_begin = dahdi_digit_begin,
1445         .send_digit_end = dahdi_digit_end,
1446         .send_text = dahdi_sendtext,
1447         .call = dahdi_call,
1448         .hangup = dahdi_hangup,
1449         .answer = dahdi_answer,
1450         .read = dahdi_read,
1451         .write = dahdi_write,
1452         .bridge = dahdi_bridge,
1453         .exception = dahdi_exception,
1454         .indicate = dahdi_indicate,
1455         .fixup = dahdi_fixup,
1456         .setoption = dahdi_setoption,
1457         .queryoption = dahdi_queryoption,
1458         .func_channel_read = dahdi_func_read,
1459         .func_channel_write = dahdi_func_write,
1460 };
1461
1462 #define GET_CHANNEL(p) ((p)->channel)
1463
1464 #define SIG_PRI_LIB_HANDLE_CASES        \
1465         SIG_PRI:                                                \
1466         case SIG_BRI:                                   \
1467         case SIG_BRI_PTMP
1468
1469 /*!
1470  * \internal
1471  * \brief Determine if sig_pri handles the signaling.
1472  * \since 1.8
1473  *
1474  * \param signaling Signaling to determine if is for sig_pri.
1475  *
1476  * \return TRUE if the signaling is for sig_pri.
1477  */
1478 static inline int dahdi_sig_pri_lib_handles(int signaling)
1479 {
1480         int handles;
1481
1482         switch (signaling) {
1483         case SIG_PRI_LIB_HANDLE_CASES:
1484                 handles = 1;
1485                 break;
1486         default:
1487                 handles = 0;
1488                 break;
1489         }
1490
1491         return handles;
1492 }
1493
1494 static enum analog_sigtype dahdisig_to_analogsig(int sig)
1495 {
1496         switch (sig) {
1497         case SIG_FXOLS:
1498                 return ANALOG_SIG_FXOLS;
1499         case SIG_FXOGS:
1500                 return ANALOG_SIG_FXOGS;
1501         case SIG_FXOKS:
1502                 return ANALOG_SIG_FXOKS;
1503         case SIG_FXSLS:
1504                 return ANALOG_SIG_FXSLS;
1505         case SIG_FXSGS:
1506                 return ANALOG_SIG_FXSGS;
1507         case SIG_FXSKS:
1508                 return ANALOG_SIG_FXSKS;
1509         case SIG_EMWINK:
1510                 return ANALOG_SIG_EMWINK;
1511         case SIG_EM:
1512                 return ANALOG_SIG_EM;
1513         case SIG_EM_E1:
1514                 return ANALOG_SIG_EM_E1;
1515         case SIG_FEATD:
1516                 return ANALOG_SIG_FEATD;
1517         case SIG_FEATDMF:
1518                 return ANALOG_SIG_FEATDMF;
1519         case SIG_E911:
1520                 return SIG_E911;
1521         case SIG_FGC_CAMA:
1522                 return ANALOG_SIG_FGC_CAMA;
1523         case SIG_FGC_CAMAMF:
1524                 return ANALOG_SIG_FGC_CAMAMF;
1525         case SIG_FEATB:
1526                 return ANALOG_SIG_FEATB;
1527         case SIG_SFWINK:
1528                 return ANALOG_SIG_SFWINK;
1529         case SIG_SF:
1530                 return ANALOG_SIG_SF;
1531         case SIG_SF_FEATD:
1532                 return ANALOG_SIG_SF_FEATD;
1533         case SIG_SF_FEATDMF:
1534                 return ANALOG_SIG_SF_FEATDMF;
1535         case SIG_FEATDMF_TA:
1536                 return ANALOG_SIG_FEATDMF_TA;
1537         case SIG_SF_FEATB:
1538                 return ANALOG_SIG_FEATB;
1539         default:
1540                 return -1;
1541         }
1542 }
1543
1544
1545 static int analog_tone_to_dahditone(enum analog_tone tone)
1546 {
1547         switch (tone) {
1548         case ANALOG_TONE_RINGTONE:
1549                 return DAHDI_TONE_RINGTONE;
1550         case ANALOG_TONE_STUTTER:
1551                 return DAHDI_TONE_STUTTER;
1552         case ANALOG_TONE_CONGESTION:
1553                 return DAHDI_TONE_CONGESTION;
1554         case ANALOG_TONE_DIALTONE:
1555                 return DAHDI_TONE_DIALTONE;
1556         case ANALOG_TONE_DIALRECALL:
1557                 return DAHDI_TONE_DIALRECALL;
1558         case ANALOG_TONE_INFO:
1559                 return DAHDI_TONE_INFO;
1560         default:
1561                 return -1;
1562         }
1563 }
1564
1565 static int analogsub_to_dahdisub(enum analog_sub analogsub)
1566 {
1567         int index;
1568
1569         switch (analogsub) {
1570         case ANALOG_SUB_REAL:
1571                 index = SUB_REAL;
1572                 break;
1573         case ANALOG_SUB_CALLWAIT:
1574                 index = SUB_CALLWAIT;
1575                 break;
1576         case ANALOG_SUB_THREEWAY:
1577                 index = SUB_THREEWAY;
1578                 break;
1579         default:
1580                 ast_log(LOG_ERROR, "Unidentified sub!\n");
1581                 index = SUB_REAL;
1582         }
1583
1584         return index;
1585 }
1586
1587 static enum analog_event dahdievent_to_analogevent(int event);
1588 static int bump_gains(struct dahdi_pvt *p);
1589 static int dahdi_setlinear(int dfd, int linear);
1590
1591 static int my_start_cid_detect(void *pvt, int cid_signalling)
1592 {
1593         struct dahdi_pvt *p = pvt;
1594         int index = SUB_REAL;
1595         p->cs = callerid_new(cid_signalling);
1596         if (!p->cs) {
1597                 ast_log(LOG_ERROR, "Unable to alloc callerid\n");
1598                 return -1;
1599         }
1600         bump_gains(p);
1601         dahdi_setlinear(p->subs[index].dfd, 0);
1602
1603         return 0;
1604 }
1605
1606 static int my_stop_cid_detect(void *pvt)
1607 {
1608         struct dahdi_pvt *p = pvt;
1609         int index = SUB_REAL;
1610         if (p->cs)
1611                 callerid_free(p->cs);
1612         dahdi_setlinear(p->subs[index].dfd, p->subs[index].linear);
1613         return 0;
1614 }
1615
1616 static int my_get_callerid(void *pvt, char *namebuf, char *numbuf, enum analog_event *ev, size_t timeout)
1617 {
1618         struct dahdi_pvt *p = pvt;
1619         struct analog_pvt *analog_p = p->sig_pvt;
1620         struct pollfd poller;
1621         char *name, *num;
1622         int index = SUB_REAL;
1623         int res;
1624         unsigned char buf[256];
1625         int flags;
1626
1627         poller.fd = p->subs[SUB_REAL].dfd;
1628         poller.events = POLLPRI | POLLIN;
1629         poller.revents = 0;
1630
1631         res = poll(&poller, 1, timeout);
1632
1633         if (poller.revents & POLLPRI) {
1634                 *ev = dahdievent_to_analogevent(dahdi_get_event(p->subs[SUB_REAL].dfd));
1635                 return 1;
1636         }
1637
1638         if (poller.revents & POLLIN) {
1639                 /*** NOTES ***/
1640                 /* Change API: remove cid_signalling from get_callerid, add a new start_cid_detect and stop_cid_detect function
1641                  * to enable slin mode and allocate cid detector. get_callerid should be able to be called any number of times until
1642                  * either a timeout occurs or CID is detected (returns 0). returning 1 should be event received, and -1 should be
1643                  * a failure and die, and returning 2 means no event was received. */
1644                 res = read(p->subs[index].dfd, buf, sizeof(buf));
1645                 if (res < 0) {
1646                         if (errno != ELAST) {
1647                                 ast_log(LOG_WARNING, "read returned error: %s\n", strerror(errno));
1648                                 callerid_free(p->cs);
1649                                 return -1;
1650                         }
1651                 }
1652
1653                 if (analog_p->ringt > 0) {
1654                         if (!(--analog_p->ringt)) {
1655                                 /* only return if we timeout from a ring event */
1656                                 return -1;
1657                         }
1658                 }
1659
1660                 if (p->cid_signalling == CID_SIG_V23_JP) {
1661                         res = callerid_feed_jp(p->cs, buf, res, AST_LAW(p));
1662                 } else {
1663                         res = callerid_feed(p->cs, buf, res, AST_LAW(p));
1664                 }
1665
1666                 if (res < 0) {
1667                         ast_log(LOG_WARNING, "CallerID feed failed: %s\n", strerror(errno));
1668                         return -1;
1669                 }
1670
1671                 if (res == 1) {
1672                         callerid_get(p->cs, &name, &num, &flags);
1673                         if (name)
1674                                 ast_copy_string(namebuf, name, ANALOG_MAX_CID);
1675                         if (num)
1676                                 ast_copy_string(numbuf, num, ANALOG_MAX_CID);
1677
1678                         ast_log(LOG_DEBUG, "CallerID number: %s, name: %s, flags=%d\n", num, name, flags);
1679                         return 0;
1680                 }
1681         }
1682
1683         *ev = ANALOG_EVENT_NONE;
1684         return 2;
1685 }
1686
1687 static const char *event2str(int event);
1688 static int restore_gains(struct dahdi_pvt *p);
1689
1690 static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int *ringdata)
1691 {
1692         unsigned char buf[256];
1693         int distMatches;
1694         int curRingData[3];
1695         int receivedRingT;
1696         int counter1;
1697         int counter;
1698         int i;
1699         int res;
1700         int checkaftercid = 0;
1701
1702         struct dahdi_pvt *p = pvt;
1703         struct analog_pvt *analog_p = p->sig_pvt;
1704
1705         if (ringdata == NULL) {
1706                 ringdata = curRingData;
1707         } else {
1708                 checkaftercid = 1;
1709         }
1710
1711         /* We must have a ring by now, so, if configured, lets try to listen for
1712          * distinctive ringing */
1713         if ((checkaftercid && distinctiveringaftercid) || !checkaftercid) {
1714                 /* Clear the current ring data array so we dont have old data in it. */
1715                 for (receivedRingT = 0; receivedRingT < ARRAY_LEN(ringdata); receivedRingT++)
1716                         ringdata[receivedRingT] = 0;
1717                 receivedRingT = 0;
1718                 if (checkaftercid && distinctiveringaftercid)
1719                         ast_verb(3, "Detecting post-CID distinctive ring\n");
1720                 /* Check to see if context is what it should be, if not set to be. */
1721                 else if (strcmp(p->context,p->defcontext) != 0) {
1722                         ast_copy_string(p->context, p->defcontext, sizeof(p->context));
1723                         ast_copy_string(chan->context,p->defcontext,sizeof(chan->context));
1724                 }
1725
1726                 for (;;) {
1727                         i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
1728                         if ((res = ioctl(p->subs[idx].dfd, DAHDI_IOMUX, &i))) {
1729                                 ast_log(LOG_WARNING, "I/O MUX failed: %s\n", strerror(errno));
1730                                 ast_hangup(chan);
1731                                 return 1;
1732                         }
1733                         if (i & DAHDI_IOMUX_SIGEVENT) {
1734                                 res = dahdi_get_event(p->subs[idx].dfd);
1735                                 if (res == DAHDI_EVENT_NOALARM) {
1736                                         p->inalarm = 0;
1737                                         analog_p->inalarm = 0;
1738                                 }
1739                                 ast_log(LOG_NOTICE, "Got event %d (%s)...\n", res, event2str(res));
1740                                 res = 0;
1741                                 /* Let us detect distinctive ring */
1742
1743                                 ringdata[receivedRingT] = analog_p->ringt;
1744
1745                                 if (analog_p->ringt < analog_p->ringt_base/2)
1746                                         break;
1747                                 /* Increment the ringT counter so we can match it against
1748                                    values in chan_dahdi.conf for distinctive ring */
1749                                 if (++receivedRingT == ARRAY_LEN(ringdata))
1750                                         break;
1751                         } else if (i & DAHDI_IOMUX_READ) {
1752                                 res = read(p->subs[idx].dfd, buf, sizeof(buf));
1753                                 if (res < 0) {
1754                                         if (errno != ELAST) {
1755                                                 ast_log(LOG_WARNING, "read returned error: %s\n", strerror(errno));
1756                                                 ast_hangup(chan);
1757                                                 return 1;
1758                                         }
1759                                         break;
1760                                 }
1761                                 if (analog_p->ringt > 0) {
1762                                         if (!(--analog_p->ringt)) {
1763                                                 res = -1;
1764                                                 break;
1765                                         }
1766                                 }
1767                         }
1768                 }
1769         }
1770         if ((checkaftercid && usedistinctiveringdetection) || !checkaftercid) {
1771                 /* this only shows up if you have n of the dring patterns filled in */
1772                 ast_verb(3, "Detected ring pattern: %d,%d,%d\n",ringdata[0],ringdata[1],ringdata[2]);
1773                 for (counter = 0; counter < 3; counter++) {
1774                 /* Check to see if the rings we received match any of the ones in chan_dahdi.conf for this channel */
1775                         distMatches = 0;
1776                         /* this only shows up if you have n of the dring patterns filled in */
1777                         ast_verb(3, "Checking %d,%d,%d\n",
1778                                         p->drings.ringnum[counter].ring[0],
1779                                         p->drings.ringnum[counter].ring[1],
1780                                         p->drings.ringnum[counter].ring[2]);
1781                         for (counter1 = 0; counter1 < 3; counter1++) {
1782                                 ast_verb(3, "Ring pattern check range: %d\n", p->drings.ringnum[counter].range);
1783                                 if (p->drings.ringnum[counter].ring[counter1] == -1) {
1784                                         ast_verb(3, "Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
1785                                         ringdata[counter1]);
1786                                         distMatches++;
1787                                 } else if (ringdata[counter1] <= (p->drings.ringnum[counter].ring[counter1] + p->drings.ringnum[counter].range) &&
1788                                                                                 ringdata[counter1] >= (p->drings.ringnum[counter].ring[counter1] - p->drings.ringnum[counter].range)) {
1789                                         ast_verb(3, "Ring pattern matched in range: %d to %d\n",
1790                                         (p->drings.ringnum[counter].ring[counter1] - p->drings.ringnum[counter].range),
1791                                         (p->drings.ringnum[counter].ring[counter1] + p->drings.ringnum[counter].range));
1792                                         distMatches++;
1793                                 }
1794                         }
1795
1796                         if (distMatches == 3) {
1797                                 /* The ring matches, set the context to whatever is for distinctive ring.. */
1798                                 ast_copy_string(p->context, p->drings.ringContext[counter].contextData, sizeof(p->context));
1799                                 ast_copy_string(chan->context, p->drings.ringContext[counter].contextData, sizeof(chan->context));
1800                                 ast_verb(3, "Distinctive Ring matched context %s\n",p->context);
1801                                 break;
1802                         }
1803                 }
1804         }
1805         /* Restore linear mode (if appropriate) for Caller*ID processing */
1806         dahdi_setlinear(p->subs[idx].dfd, p->subs[idx].linear);
1807         restore_gains(p);
1808
1809         return 0;
1810 }
1811
1812 static int send_callerid(struct dahdi_pvt *p);
1813
1814 static int my_stop_callwait(void *pvt)
1815 {
1816         struct dahdi_pvt *p = pvt;
1817         p->callwaitingrepeat = 0;
1818         p->cidcwexpire = 0;
1819
1820         return 0;
1821 }
1822
1823 static int save_conference(struct dahdi_pvt *p);
1824
1825 static int my_callwait(void *pvt)
1826 {
1827         struct dahdi_pvt *p = pvt;
1828         p->callwaitingrepeat = CALLWAITING_REPEAT_SAMPLES;
1829         if (p->cidspill) {
1830                 ast_log(LOG_WARNING, "Spill already exists?!?\n");
1831                 ast_free(p->cidspill);
1832         }
1833         if (!(p->cidspill = ast_malloc(2400 /* SAS */ + 680 /* CAS */ + READ_SIZE * 4)))
1834                 return -1;
1835         save_conference(p);
1836         /* Silence */
1837         memset(p->cidspill, 0x7f, 2400 + 600 + READ_SIZE * 4);
1838         if (!p->callwaitrings && p->callwaitingcallerid) {
1839                 ast_gen_cas(p->cidspill, 1, 2400 + 680, AST_LAW(p));
1840                 p->callwaitcas = 1;
1841                 p->cidlen = 2400 + 680 + READ_SIZE * 4;
1842         } else {
1843                 ast_gen_cas(p->cidspill, 1, 2400, AST_LAW(p));
1844                 p->callwaitcas = 0;
1845                 p->cidlen = 2400 + READ_SIZE * 4;
1846         }
1847         p->cidpos = 0;
1848         send_callerid(p);
1849
1850         return 0;
1851 }
1852
1853 static int my_send_callerid(void *pvt, int cwcid, struct ast_callerid *cid)
1854 {
1855         struct dahdi_pvt *p = pvt;
1856
1857         ast_debug(2, "Starting cid spill\n");
1858
1859         if (p->cidspill) {
1860                 ast_log(LOG_WARNING, "cidspill already exists??\n");
1861                 ast_free(p->cidspill);
1862         }
1863
1864         if ((p->cidspill = ast_malloc(MAX_CALLERID_SIZE))) {
1865                 if (cwcid == 0) {
1866                         p->cidlen = ast_callerid_generate(p->cidspill, cid->cid_name, cid->cid_num, AST_LAW(p));
1867                 } else {
1868                         p->callwaitcas = 0;
1869                         p->cidcwexpire = 0;
1870                         p->cidlen = ast_callerid_callwaiting_generate(p->cidspill, cid->cid_name, cid->cid_num, AST_LAW(p));
1871                         p->cidlen += READ_SIZE * 4;
1872                 }
1873                 p->cidpos = 0;
1874                 send_callerid(p);
1875         }
1876         return 0;
1877 }
1878
1879 static int my_dsp_reset_and_flush_digits(void *pvt)
1880 {
1881         struct dahdi_pvt *p = pvt;
1882         if (p->dsp)
1883                 ast_dsp_digitreset(p->dsp);
1884
1885         return 0;
1886 }
1887
1888 static int my_dsp_set_digitmode(void *pvt, enum analog_dsp_digitmode mode)
1889 {
1890         struct dahdi_pvt *p = pvt;
1891
1892         if (p->channel == CHAN_PSEUDO)
1893                 ast_log(LOG_ERROR, "You have assumed incorrectly sir!\n");
1894
1895         if (mode == ANALOG_DIGITMODE_DTMF) {
1896                 /* If we do hardware dtmf, no need for a DSP */
1897                 if (p->hardwaredtmf) {
1898                         if (p->dsp) {
1899                                 ast_dsp_free(p->dsp);
1900                                 p->dsp = NULL;
1901                         }
1902                         return 0;
1903                 }
1904
1905                 if (!p->dsp) {
1906                         p->dsp = ast_dsp_new();
1907                         if (!p->dsp) {
1908                                 ast_log(LOG_ERROR, "Unable to allocate DSP\n");
1909                                 return -1;
1910                         }
1911                 }
1912
1913                 ast_dsp_set_digitmode(p->dsp, DSP_DIGITMODE_DTMF | p->dtmfrelax);
1914         } else if (mode == ANALOG_DIGITMODE_MF) {
1915                 if (!p->dsp) {
1916                         p->dsp = ast_dsp_new();
1917                         if (!p->dsp) {
1918                                 ast_log(LOG_ERROR, "Unable to allocate DSP\n");
1919                                 return -1;
1920                         }
1921                 }
1922                 ast_dsp_set_digitmode(p->dsp, DSP_DIGITMODE_MF | p->dtmfrelax);
1923         }
1924         return 0;
1925 }
1926
1927 static int dahdi_wink(struct dahdi_pvt *p, int index);
1928
1929 static int my_wink(void *pvt, enum analog_sub sub)
1930 {
1931         struct dahdi_pvt *p = pvt;
1932         int index = analogsub_to_dahdisub(sub);
1933         if (index != SUB_REAL) {
1934                 ast_log(LOG_ERROR, "We used a sub other than SUB_REAL (incorrect assumption sir)\n");
1935         }
1936         return dahdi_wink(p, index);
1937 }
1938
1939 static void wakeup_sub(struct dahdi_pvt *p, int a);
1940
1941 static int reset_conf(struct dahdi_pvt *p);
1942
1943 static inline int dahdi_confmute(struct dahdi_pvt *p, int muted);
1944
1945 static void my_handle_dtmfup(void *pvt, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest)
1946 {
1947         struct ast_frame *f = *dest;
1948         struct dahdi_pvt *p = pvt;
1949         int idx = analogsub_to_dahdisub(analog_index);
1950
1951         ast_debug(1, "DTMF digit: %c on %s\n", f->subclass.integer, ast->name);
1952
1953         if (f->subclass.integer == 'f') {
1954                 /* Fax tone -- Handle and return NULL */
1955                 if ((p->callprogress & CALLPROGRESS_FAX) && !p->faxhandled) {
1956                         /* If faxbuffers are configured, use them for the fax transmission */
1957                         if (p->usefaxbuffers && !p->bufferoverrideinuse) {
1958                                 struct dahdi_bufferinfo bi = {
1959                                         .txbufpolicy = p->faxbuf_policy,
1960                                         .bufsize = p->bufsize,
1961                                         .numbufs = p->faxbuf_no
1962                                 };
1963                                 int res;
1964
1965                                 if ((res = ioctl(p->subs[idx].dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
1966                                         ast_log(LOG_WARNING, "Channel '%s' unable to set buffer policy, reason: %s\n", ast->name, strerror(errno));
1967                                 } else {
1968                                         p->bufferoverrideinuse = 1;
1969                                 }
1970                         }
1971                         p->faxhandled = 1;
1972                         if (strcmp(ast->exten, "fax")) {
1973                                 const char *target_context = S_OR(ast->macrocontext, ast->context);
1974
1975                                 /* We need to unlock 'ast' here because ast_exists_extension has the
1976                                  * potential to start autoservice on the channel. Such action is prone
1977                                  * to deadlock.
1978                                  */
1979                                 ast_mutex_unlock(&p->lock);
1980                                 ast_channel_unlock(ast);
1981                                 if (ast_exists_extension(ast, target_context, "fax", 1, ast->cid.cid_num)) {
1982                                         ast_channel_lock(ast);
1983                                         ast_mutex_lock(&p->lock);
1984                                         ast_verb(3, "Redirecting %s to fax extension\n", ast->name);
1985                                         /* Save the DID/DNIS when we transfer the fax call to a "fax" extension */
1986                                         pbx_builtin_setvar_helper(ast, "FAXEXTEN", ast->exten);
1987                                         if (ast_async_goto(ast, target_context, "fax", 1))
1988                                                 ast_log(LOG_WARNING, "Failed to async goto '%s' into fax of '%s'\n", ast->name, target_context);
1989                                 } else {
1990                                         ast_channel_lock(ast);
1991                                         ast_mutex_lock(&p->lock);
1992                                         ast_log(LOG_NOTICE, "Fax detected, but no fax extension\n");
1993                                 }
1994                         } else {
1995                                 ast_debug(1, "Already in a fax extension, not redirecting\n");
1996                         }
1997                 } else {
1998                         ast_debug(1, "Fax already handled\n");
1999                 }
2000                 dahdi_confmute(p, 0);
2001                 p->subs[idx].f.frametype = AST_FRAME_NULL;
2002                 p->subs[idx].f.subclass.integer = 0;
2003                 *dest = &p->subs[idx].f;
2004         }
2005 }
2006
2007 static void my_lock_private(void *pvt)
2008 {
2009         struct dahdi_pvt *p = pvt;
2010         ast_mutex_lock(&p->lock);
2011 }
2012
2013 static void my_unlock_private(void *pvt)
2014 {
2015         struct dahdi_pvt *p = pvt;
2016         ast_mutex_unlock(&p->lock);
2017 }
2018
2019 /* linear_mode = 0 - turn linear mode off, >0 - turn linear mode on
2020 *       returns the last value of the linear setting 
2021 */ 
2022 static int my_set_linear_mode(void *pvt, int idx, int linear_mode)
2023 {
2024         struct dahdi_pvt *p = pvt;
2025         int oldval;
2026         
2027     if (0 > linear_mode || !dahdi_setlinear(p->subs[idx].dfd, linear_mode)) {
2028         return -1;
2029     }
2030         oldval = p->subs[idx].linear;
2031         p->subs[idx].linear = linear_mode;
2032         return oldval;
2033 }
2034
2035 static int get_alarms(struct dahdi_pvt *p);
2036 static void handle_alarms(struct dahdi_pvt *p, int alms);
2037 static void my_get_and_handle_alarms(void *pvt)
2038 {
2039         int res;
2040         struct dahdi_pvt *p = pvt;
2041
2042         res = get_alarms(p);
2043         handle_alarms(p, res);
2044 }
2045
2046 static void *my_get_sigpvt_bridged_channel(struct ast_channel *chan)
2047 {
2048         struct dahdi_pvt *p = ast_bridged_channel(chan)->tech_pvt;
2049         if (p)
2050                 return p->sig_pvt;
2051         else
2052                 return NULL;
2053 }
2054
2055 static int my_get_sub_fd(void *pvt, enum analog_sub sub)
2056 {
2057         struct dahdi_pvt *p = pvt;
2058         int dahdi_sub = analogsub_to_dahdisub(sub);
2059         return p->subs[dahdi_sub].dfd;
2060 }
2061
2062 static void my_set_cadence(void *pvt, int *cidrings, struct ast_channel *ast)
2063 {
2064         struct dahdi_pvt *p = pvt;
2065
2066         /* Choose proper cadence */
2067         if ((p->distinctivering > 0) && (p->distinctivering <= num_cadence)) {
2068                 if (ioctl(p->subs[SUB_REAL].dfd, DAHDI_SETCADENCE, &cadences[p->distinctivering - 1]))
2069                         ast_log(LOG_WARNING, "Unable to set distinctive ring cadence %d on '%s': %s\n", p->distinctivering, ast->name, strerror(errno));
2070                 *cidrings = cidrings[p->distinctivering - 1];
2071         } else {
2072                 if (ioctl(p->subs[SUB_REAL].dfd, DAHDI_SETCADENCE, NULL))
2073                         ast_log(LOG_WARNING, "Unable to reset default ring on '%s': %s\n", ast->name, strerror(errno));
2074                 *cidrings = p->sendcalleridafter;
2075         }
2076 }
2077
2078 static void my_set_dialing(void *pvt, int flag)
2079 {
2080         struct dahdi_pvt *p = pvt;
2081         p->dialing = flag;
2082 }
2083
2084 #if defined(HAVE_PRI)
2085 static void my_set_digital(void *pvt, int flag)
2086 {
2087         struct dahdi_pvt *p = pvt;
2088         p->digital = flag;
2089 }
2090 #endif
2091
2092 static void my_set_ringtimeout(void *pvt, int ringt)
2093 {
2094         struct dahdi_pvt *p = pvt;
2095         p->ringt = ringt;
2096 }
2097
2098 static void my_set_waitingfordt(void *pvt, struct ast_channel *ast)
2099 {
2100         struct dahdi_pvt *p = pvt;
2101
2102         if (p->waitfordialtone && CANPROGRESSDETECT(p) && p->dsp) {
2103                 ast_log(LOG_DEBUG, "Defer dialing for %dms or dialtone\n", p->waitfordialtone);
2104                 gettimeofday(&p->waitingfordt, NULL);
2105                 ast_setstate(ast, AST_STATE_OFFHOOK);
2106         }
2107 }
2108
2109 static int my_check_waitingfordt(void *pvt)
2110 {
2111         struct dahdi_pvt *p = pvt;
2112
2113         if (p->waitingfordt.tv_usec) {
2114                 return 1;
2115         }
2116
2117         return 0;
2118 }
2119
2120 static void my_set_confirmanswer(void *pvt, int flag)
2121 {
2122         struct dahdi_pvt *p = pvt;
2123         p->confirmanswer = flag;
2124 }
2125
2126 static int my_check_confirmanswer(void *pvt)
2127 {
2128         struct dahdi_pvt *p = pvt;
2129         if (p->confirmanswer) {
2130                 return 1;
2131         }
2132
2133         return 0;
2134 }
2135
2136 static void my_cancel_cidspill(void *pvt)
2137 {
2138         struct dahdi_pvt *p = pvt;
2139         if (p->cidspill) {
2140                 ast_free(p->cidspill);
2141                 p->cidspill = NULL;
2142         }
2143 }
2144
2145 static int my_confmute(void *pvt, int mute)
2146 {
2147         struct dahdi_pvt *p = pvt;
2148         return dahdi_confmute(p, mute);
2149 }
2150
2151 static void my_set_pulsedial(void *pvt, int flag)
2152 {
2153         struct dahdi_pvt *p = pvt;
2154         p->pulsedial = flag;
2155 }
2156
2157 static void my_increase_ss_count(void)
2158 {
2159         ast_mutex_lock(&ss_thread_lock);
2160         ss_thread_count++;
2161         ast_mutex_unlock(&ss_thread_lock);
2162 }
2163
2164 static void my_decrease_ss_count(void)
2165 {
2166         ast_mutex_lock(&ss_thread_lock);
2167         ss_thread_count--;
2168         ast_cond_signal(&ss_thread_complete);
2169         ast_mutex_unlock(&ss_thread_lock);
2170 }
2171
2172 static void my_all_subchannels_hungup(void *pvt)
2173 {
2174         struct dahdi_pvt *p = pvt;
2175         int res, law;
2176
2177         p->faxhandled = 0;
2178         p->didtdd = 0;
2179
2180         if (p->dsp) {
2181                 ast_dsp_free(p->dsp);
2182                 p->dsp = NULL;
2183         }
2184
2185         law = DAHDI_LAW_DEFAULT;
2186         res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_SETLAW, &law);
2187         if (res < 0)
2188                 ast_log(LOG_WARNING, "Unable to set law on channel %d to default: %s\n", p->channel, strerror(errno));
2189
2190         dahdi_setlinear(p->subs[SUB_REAL].dfd, 0);
2191
2192 #if 1
2193         {
2194         int i;
2195         p->owner = NULL;
2196         /* Cleanup owners here */
2197         for (i = 0; i < 3; i++) {
2198                 p->subs[i].owner = NULL;
2199         }
2200         }
2201 #endif
2202
2203         reset_conf(p);
2204         if (num_restart_pending == 0) {
2205                 restart_monitor();
2206         }
2207 }
2208
2209 static int conf_del(struct dahdi_pvt *p, struct dahdi_subchannel *c, int index);
2210
2211 static int my_conf_del(void *pvt, enum analog_sub sub)
2212 {
2213         struct dahdi_pvt *p = pvt;
2214         int x = analogsub_to_dahdisub(sub);
2215
2216         return conf_del(p, &p->subs[x], x);
2217 }
2218
2219 static int conf_add(struct dahdi_pvt *p, struct dahdi_subchannel *c, int index, int slavechannel);
2220
2221 static int my_conf_add(void *pvt, enum analog_sub sub)
2222 {
2223         struct dahdi_pvt *p = pvt;
2224         int x = analogsub_to_dahdisub(sub);
2225
2226         return conf_add(p, &p->subs[x], x, 0);
2227 }
2228
2229 static int isslavenative(struct dahdi_pvt *p, struct dahdi_pvt **out);
2230
2231 static int my_complete_conference_update(void *pvt, int needconference)
2232 {
2233         struct dahdi_pvt *p = pvt;
2234         int needconf = needconference;
2235         int x;
2236         int useslavenative;
2237         struct dahdi_pvt *slave = NULL;
2238
2239         useslavenative = isslavenative(p, &slave);
2240
2241         /* If we have a slave, add him to our conference now. or DAX
2242            if this is slave native */
2243         for (x = 0; x < MAX_SLAVES; x++) {
2244                 if (p->slaves[x]) {
2245                         if (useslavenative)
2246                                 conf_add(p, &p->slaves[x]->subs[SUB_REAL], SUB_REAL, GET_CHANNEL(p));
2247                         else {
2248                                 conf_add(p, &p->slaves[x]->subs[SUB_REAL], SUB_REAL, 0);
2249                                 needconf++;
2250                         }
2251                 }
2252         }
2253         /* If we're supposed to be in there, do so now */
2254         if (p->inconference && !p->subs[SUB_REAL].inthreeway) {
2255                 if (useslavenative)
2256                         conf_add(p, &p->subs[SUB_REAL], SUB_REAL, GET_CHANNEL(slave));
2257                 else {
2258                         conf_add(p, &p->subs[SUB_REAL], SUB_REAL, 0);
2259                         needconf++;
2260                 }
2261         }
2262         /* If we have a master, add ourselves to his conference */
2263         if (p->master) {
2264                 if (isslavenative(p->master, NULL)) {
2265                         conf_add(p->master, &p->subs[SUB_REAL], SUB_REAL, GET_CHANNEL(p->master));
2266                 } else {
2267                         conf_add(p->master, &p->subs[SUB_REAL], SUB_REAL, 0);
2268                 }
2269         }
2270         if (!needconf) {
2271                 /* Nobody is left (or should be left) in our conference.
2272                    Kill it. */
2273                 p->confno = -1;
2274         }
2275
2276         return 0;
2277 }
2278
2279 static int check_for_conference(struct dahdi_pvt *p);
2280
2281 static int my_check_for_conference(void *pvt)
2282 {
2283         struct dahdi_pvt *p = pvt;
2284         return check_for_conference(p);
2285 }
2286
2287 static void my_swap_subchannels(void *pvt, enum analog_sub a, struct ast_channel *ast_a,  enum analog_sub b, struct ast_channel *ast_b)
2288 {
2289         struct dahdi_pvt *p = pvt;
2290         int da, db;
2291         int tchan;
2292
2293         da = analogsub_to_dahdisub(a);
2294         db = analogsub_to_dahdisub(b);
2295
2296         tchan = p->subs[da].chan;
2297
2298         p->subs[da].chan = p->subs[db].chan;
2299
2300         p->subs[db].chan = tchan;
2301
2302         if (ast_a)
2303                 ast_channel_set_fd(ast_a, 0, p->subs[da].dfd);
2304         if (ast_b)
2305                 ast_channel_set_fd(ast_b, 0, p->subs[db].dfd);
2306
2307         p->subs[da].owner = ast_a;
2308         p->subs[db].owner = ast_b;
2309
2310         wakeup_sub(p, a);
2311         wakeup_sub(p, b);
2312
2313         return;
2314 }
2315
2316 static struct ast_channel *dahdi_new(struct dahdi_pvt *, int, int, int, int, int, const char *);
2317
2318 static struct ast_channel *my_new_analog_ast_channel(void *pvt, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
2319 {
2320         struct dahdi_pvt *p = pvt;
2321         int dsub = analogsub_to_dahdisub(sub);
2322
2323         return dahdi_new(p, state, startpbx, dsub, 0, 0, requestor ? requestor->linkedid : "");
2324 }
2325
2326 #if defined(HAVE_PRI) || defined(HAVE_SS7)
2327 static int dahdi_setlaw(int dfd, int law)
2328 {
2329         int res;
2330         res = ioctl(dfd, DAHDI_SETLAW, &law);
2331         if (res)
2332                 return res;
2333         return 0;
2334 }
2335 #endif
2336
2337 #if defined(HAVE_PRI)
2338 static struct ast_channel *my_new_pri_ast_channel(void *pvt, int state, int startpbx, enum sig_pri_law law, int transfercapability, char *exten, const struct ast_channel *requestor)
2339 {
2340         struct dahdi_pvt *p = pvt;
2341         int audio;
2342         int newlaw = -1;
2343
2344         /* Set to audio mode at this point */
2345         audio = 1;
2346         if (ioctl(p->subs[SUB_REAL].dfd, DAHDI_AUDIOMODE, &audio) == -1)
2347                 ast_log(LOG_WARNING, "Unable to set audio mode on channel %d to %d: %s\n", p->channel, audio, strerror(errno));
2348
2349         if (law != SIG_PRI_DEFLAW) {
2350                 dahdi_setlaw(p->subs[SUB_REAL].dfd, (law == SIG_PRI_ULAW) ? DAHDI_LAW_MULAW : DAHDI_LAW_ALAW);
2351         }
2352
2353         ast_copy_string(p->exten, exten, sizeof(p->exten));
2354
2355         switch (law) {
2356                 case SIG_PRI_DEFLAW:
2357                         newlaw = 0;
2358                         break;
2359                 case SIG_PRI_ALAW:
2360                         newlaw = DAHDI_LAW_ALAW;
2361                         break;
2362                 case SIG_PRI_ULAW:
2363                         newlaw = DAHDI_LAW_MULAW;
2364                         break;
2365         }
2366         return dahdi_new(p, state, startpbx, SUB_REAL, newlaw, transfercapability, requestor ? requestor->linkedid : "");
2367 }
2368 #endif  /* defined(HAVE_PRI) */
2369
2370 static int unalloc_sub(struct dahdi_pvt *p, int x);
2371
2372 static int my_unallocate_sub(void *pvt, enum analog_sub analogsub)
2373 {
2374         struct dahdi_pvt *p = pvt;
2375
2376         return unalloc_sub(p, analogsub_to_dahdisub(analogsub));
2377 }
2378
2379 static int alloc_sub(struct dahdi_pvt *p, int x);
2380
2381 static int my_allocate_sub(void *pvt, enum analog_sub analogsub)
2382 {
2383         struct dahdi_pvt *p = pvt;
2384
2385         return alloc_sub(p, analogsub_to_dahdisub(analogsub));
2386 }
2387
2388 static int has_voicemail(struct dahdi_pvt *p);
2389
2390 static int my_has_voicemail(void *pvt)
2391 {
2392         struct dahdi_pvt *p = pvt;
2393
2394         return has_voicemail(p);
2395 }
2396
2397 static int my_play_tone(void *pvt, enum analog_sub sub, enum analog_tone tone)
2398 {
2399         struct dahdi_pvt *p = pvt;
2400         int index;
2401
2402         index = analogsub_to_dahdisub(sub);
2403
2404         return tone_zone_play_tone(p->subs[index].dfd, analog_tone_to_dahditone(tone));
2405 }
2406
2407 static enum analog_event dahdievent_to_analogevent(int event)
2408 {
2409         enum analog_event res;
2410
2411         switch (event) {
2412         case DAHDI_EVENT_ONHOOK:
2413                 res = ANALOG_EVENT_ONHOOK;
2414                 break;
2415         case DAHDI_EVENT_RINGOFFHOOK:
2416                 res = ANALOG_EVENT_RINGOFFHOOK;
2417                 break;
2418         case DAHDI_EVENT_WINKFLASH:
2419                 res = ANALOG_EVENT_WINKFLASH;
2420                 break;
2421         case DAHDI_EVENT_ALARM:
2422                 res = ANALOG_EVENT_ALARM;
2423                 break;
2424         case DAHDI_EVENT_NOALARM:
2425                 res = ANALOG_EVENT_NOALARM;
2426                 break;
2427         case DAHDI_EVENT_DIALCOMPLETE:
2428                 res = ANALOG_EVENT_DIALCOMPLETE;
2429                 break;
2430         case DAHDI_EVENT_RINGERON:
2431                 res = ANALOG_EVENT_RINGERON;
2432                 break;
2433         case DAHDI_EVENT_RINGEROFF:
2434                 res = ANALOG_EVENT_RINGEROFF;
2435                 break;
2436         case DAHDI_EVENT_HOOKCOMPLETE:
2437                 res = ANALOG_EVENT_HOOKCOMPLETE;
2438                 break;
2439         case DAHDI_EVENT_PULSE_START:
2440                 res = ANALOG_EVENT_PULSE_START;
2441                 break;
2442         case DAHDI_EVENT_POLARITY:
2443                 res = ANALOG_EVENT_POLARITY;
2444                 break;
2445         case DAHDI_EVENT_RINGBEGIN:
2446                 res = ANALOG_EVENT_RINGBEGIN;
2447                 break;
2448         case DAHDI_EVENT_EC_DISABLED:
2449                 res = ANALOG_EVENT_EC_DISABLED;
2450                 break;
2451         case DAHDI_EVENT_REMOVED:
2452                 res = ANALOG_EVENT_REMOVED;
2453                 break;
2454         case DAHDI_EVENT_NEONMWI_ACTIVE:
2455                 res = ANALOG_EVENT_NEONMWI_ACTIVE;
2456                 break;
2457         case DAHDI_EVENT_NEONMWI_INACTIVE:
2458                 res = ANALOG_EVENT_NEONMWI_INACTIVE;
2459                 break;
2460 #ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
2461         case DAHDI_EVENT_TX_CED_DETECTED:
2462                 res = ANALOG_EVENT_TX_CED_DETECTED;
2463                 break;
2464         case DAHDI_EVENT_RX_CED_DETECTED:
2465                 res = ANALOG_EVENT_RX_CED_DETECTED;
2466                 break;
2467         case DAHDI_EVENT_EC_NLP_DISABLED:
2468                 res = ANALOG_EVENT_EC_NLP_DISABLED;
2469                 break;
2470         case DAHDI_EVENT_EC_NLP_ENABLED:
2471                 res = ANALOG_EVENT_EC_NLP_ENABLED;
2472                 break;
2473 #endif
2474         case DAHDI_EVENT_PULSEDIGIT:
2475                 res = ANALOG_EVENT_PULSEDIGIT;
2476                 break;
2477         case DAHDI_EVENT_DTMFDOWN:
2478                 res = ANALOG_EVENT_DTMFDOWN;
2479                 break;
2480         case DAHDI_EVENT_DTMFUP:
2481                 res = ANALOG_EVENT_DTMFUP;
2482                 break;
2483         default:
2484                 switch(event & 0xFFFF0000) {
2485                 case DAHDI_EVENT_PULSEDIGIT:
2486                 case DAHDI_EVENT_DTMFDOWN:
2487                 case DAHDI_EVENT_DTMFUP:
2488                         /* The event includes a digit number in the low word.
2489                          * Converting it to a 'enum analog_event' would remove
2490                          * that information. Thus it is returned as-is.
2491                          */
2492                         return event;
2493                 }
2494
2495                 res = ANALOG_EVENT_ERROR;
2496                 break;
2497         }
2498
2499         return res;
2500 }
2501
2502 static inline int dahdi_wait_event(int fd);
2503
2504 static int my_wait_event(void *pvt)
2505 {
2506         struct dahdi_pvt *p = pvt;
2507
2508         return dahdi_wait_event(p->subs[SUB_REAL].dfd);
2509 }
2510
2511 static int my_get_event(void *pvt)
2512 {
2513         struct dahdi_pvt *p = pvt;
2514         int res;
2515
2516         if (p->fake_event) {
2517                 res = p->fake_event;
2518                 p->fake_event = 0;
2519         } else
2520                 res = dahdi_get_event(p->subs[SUB_REAL].dfd);
2521
2522         return dahdievent_to_analogevent(res);
2523 }
2524
2525 static int my_is_off_hook(void *pvt)
2526 {
2527         struct dahdi_pvt *p = pvt;
2528         int res;
2529         struct dahdi_params par;
2530
2531         memset(&par, 0, sizeof(par));
2532
2533         if (p->subs[SUB_REAL].dfd > -1)
2534                 res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_GET_PARAMS, &par);
2535         else {
2536                 /* Assume not off hook on CVRS */
2537                 res = 0;
2538                 par.rxisoffhook = 0;
2539         }
2540         if (res) {
2541                 ast_log(LOG_WARNING, "Unable to check hook state on channel %d: %s\n", p->channel, strerror(errno));
2542         }
2543
2544         if ((p->sig == SIG_FXSKS) || (p->sig == SIG_FXSGS)) {
2545                 /* When "onhook" that means no battery on the line, and thus
2546                 it is out of service..., if it's on a TDM card... If it's a channel
2547                 bank, there is no telling... */
2548                 return (par.rxbits > -1) || par.rxisoffhook;
2549         }
2550
2551         return par.rxisoffhook;
2552 }
2553
2554 static void dahdi_enable_ec(struct dahdi_pvt *p);
2555 static void dahdi_disable_ec(struct dahdi_pvt *p);
2556
2557 static int my_set_echocanceller(void *pvt, int enable)
2558 {
2559         struct dahdi_pvt *p = pvt;
2560
2561         if (enable)
2562                 dahdi_enable_ec(p);
2563         else
2564                 dahdi_disable_ec(p);
2565
2566         return 0;
2567 }
2568
2569 static int dahdi_ring_phone(struct dahdi_pvt *p);
2570
2571 static int my_ring(void *pvt)
2572 {
2573         struct dahdi_pvt *p = pvt;
2574
2575         return dahdi_ring_phone(p);
2576 }
2577
2578 static int my_flash(void *pvt)
2579 {
2580         struct dahdi_pvt *p = pvt;
2581         int func = DAHDI_FLASH;
2582         return ioctl(p->subs[SUB_REAL].dfd, DAHDI_HOOK, &func);
2583 }
2584
2585 static inline int dahdi_set_hook(int fd, int hs);
2586
2587 static int my_off_hook(void *pvt)
2588 {
2589         struct dahdi_pvt *p = pvt;
2590         return dahdi_set_hook(p->subs[SUB_REAL].dfd, DAHDI_OFFHOOK);
2591 }
2592
2593 static int my_start(void *pvt)
2594 {
2595         struct dahdi_pvt *p = pvt;
2596         int x = DAHDI_START;
2597
2598         return ioctl(p->subs[SUB_REAL].dfd, DAHDI_HOOK, &x);
2599 }
2600
2601 static int my_dial_digits(void *pvt, enum analog_sub sub, struct analog_dialoperation *dop)
2602 {
2603         int index = analogsub_to_dahdisub(sub);
2604         int res;
2605         struct dahdi_pvt *p = pvt;
2606         struct dahdi_dialoperation ddop;
2607
2608         if (dop->op != ANALOG_DIAL_OP_REPLACE) {
2609                 ast_log(LOG_ERROR, "Fix the dial_digits callback!\n");
2610                 return -1;
2611         }
2612
2613         if (sub != ANALOG_SUB_REAL)
2614                 printf("Trying to dial digits on sub %d\n", sub);
2615
2616         ddop.op = DAHDI_DIAL_OP_REPLACE;
2617         strncpy(ddop.dialstr, dop->dialstr, sizeof(ddop.dialstr));
2618
2619         printf("Dialing %s on %d\n", ddop.dialstr, p->channel);
2620
2621         res = ioctl(p->subs[index].dfd, DAHDI_DIAL, &ddop);
2622
2623         if (res == -1)
2624                 ast_log(LOG_DEBUG, "DAHDI_DIAL ioctl failed on %s: %s\n", p->owner->name, strerror(errno));
2625
2626         return res;
2627 }
2628
2629 static void dahdi_train_ec(struct dahdi_pvt *p);
2630
2631 static int my_train_echocanceller(void *pvt)
2632 {
2633         struct dahdi_pvt *p = pvt;
2634
2635         dahdi_train_ec(p);
2636
2637         return 0;
2638 }
2639
2640 static int my_is_dialing(void *pvt, enum analog_sub sub)
2641 {
2642         struct dahdi_pvt *p = pvt;
2643         int index;
2644         int x;
2645
2646         index = analogsub_to_dahdisub(sub);
2647
2648         if (ioctl(p->subs[index].dfd, DAHDI_DIALING, &x)) {
2649                 ast_log(LOG_DEBUG, "DAHDI_DIALING ioctl failed!\n");
2650                 return -1;
2651         }
2652
2653         return x;
2654 }
2655
2656 static int my_on_hook(void *pvt)
2657 {
2658         struct dahdi_pvt *p = pvt;
2659         return dahdi_set_hook(p->subs[ANALOG_SUB_REAL].dfd, DAHDI_ONHOOK);
2660 }
2661
2662 #if defined(HAVE_PRI)
2663 static void my_pri_fixup_chans(void *chan_old, void *chan_new)
2664 {
2665         struct dahdi_pvt *old_chan = chan_old;
2666         struct dahdi_pvt *new_chan = chan_new;
2667
2668         new_chan->owner = old_chan->owner;
2669         old_chan->owner = NULL;
2670         if (new_chan->owner) {
2671                 new_chan->owner->tech_pvt = new_chan;
2672                 new_chan->owner->fds[0] = new_chan->subs[SUB_REAL].dfd;
2673                 new_chan->subs[SUB_REAL].owner = old_chan->subs[SUB_REAL].owner;
2674                 old_chan->subs[SUB_REAL].owner = NULL;
2675         }
2676         /* Copy any DSP that may be present */
2677         new_chan->dsp = old_chan->dsp;
2678         new_chan->dsp_features = old_chan->dsp_features;
2679         old_chan->dsp = NULL;
2680         old_chan->dsp_features = 0;
2681 }
2682
2683 static int sig_pri_tone_to_dahditone(enum sig_pri_tone tone)
2684 {
2685         switch (tone) {
2686         case SIG_PRI_TONE_RINGTONE:
2687                 return DAHDI_TONE_RINGTONE;
2688         case SIG_PRI_TONE_STUTTER:
2689                 return DAHDI_TONE_STUTTER;
2690         case SIG_PRI_TONE_CONGESTION:
2691                 return DAHDI_TONE_CONGESTION;
2692         case SIG_PRI_TONE_DIALTONE:
2693                 return DAHDI_TONE_DIALTONE;
2694         case SIG_PRI_TONE_DIALRECALL:
2695                 return DAHDI_TONE_DIALRECALL;
2696         case SIG_PRI_TONE_INFO:
2697                 return DAHDI_TONE_INFO;
2698         case SIG_PRI_TONE_BUSY:
2699                 return DAHDI_TONE_BUSY;
2700         default:
2701                 return -1;
2702         }
2703 }
2704
2705 static void my_handle_dchan_exception(struct sig_pri_pri *pri, int index)
2706 {
2707         int x, res;
2708
2709         res = ioctl(pri->fds[index], DAHDI_GETEVENT, &x);
2710         if (x) {
2711                 ast_log(LOG_NOTICE, "PRI got event: %s (%d) on D-channel of span %d\n", event2str(x), x, pri->span);
2712         }
2713         /* Keep track of alarm state */
2714         if (x == DAHDI_EVENT_ALARM) {
2715                 pri_event_alarm(pri, index, 0);
2716         } else if (x == DAHDI_EVENT_NOALARM) {
2717                 pri_event_noalarm(pri, index, 0);
2718         }
2719 }
2720
2721 static int my_pri_play_tone(void *pvt, enum sig_pri_tone tone)
2722 {
2723         struct dahdi_pvt *p = pvt;
2724
2725         return tone_zone_play_tone(p->subs[SUB_REAL].dfd, sig_pri_tone_to_dahditone(tone));
2726 }
2727
2728 /*!
2729  * \internal
2730  * \brief Set the caller id information.
2731  * \since 1.8
2732  *
2733  * \param pvt DAHDI private structure
2734  * \param caller Caller-id information to set.
2735  *
2736  * \return Nothing
2737  */
2738 static void my_pri_set_callerid(void *pvt, const struct ast_party_caller *caller)
2739 {
2740         struct dahdi_pvt *p = pvt;
2741
2742         ast_copy_string(p->cid_num, S_OR(caller->id.number, ""), sizeof(p->cid_num));
2743         ast_copy_string(p->cid_name, S_OR(caller->id.name, ""), sizeof(p->cid_name));
2744         if (caller->id.subaddress.valid) {
2745                 ast_copy_string(p->cid_subaddr, S_OR(caller->id.subaddress.str, ""),
2746                         sizeof(p->cid_subaddr));
2747         } else {
2748                 p->cid_subaddr[0] = '\0';
2749         }
2750         p->cid_ton = caller->id.number_type;
2751         p->callingpres = caller->id.number_presentation;
2752         ast_copy_string(p->cid_ani, S_OR(caller->ani, ""), sizeof(p->cid_ani));
2753         p->cid_ani2 = caller->ani2;
2754 }
2755
2756 /*!
2757  * \internal
2758  * \brief Set the Dialed Number Identifier.
2759  * \since 1.8
2760  *
2761  * \param pvt DAHDI private structure
2762  * \param dnid Dialed Number Identifier string.
2763  *
2764  * \return Nothing
2765  */
2766 static void my_pri_set_dnid(void *pvt, const char *dnid)
2767 {
2768         struct dahdi_pvt *p = pvt;
2769
2770         ast_copy_string(p->dnid, dnid, sizeof(p->dnid));
2771 }
2772
2773 /*!
2774  * \internal
2775  * \brief Set the Redirecting Directory Number Information Service (RDNIS).
2776  * \since 1.8
2777  *
2778  * \param pvt DAHDI private structure
2779  * \param rdnis Redirecting Directory Number Information Service (RDNIS) string.
2780  *
2781  * \return Nothing
2782  */
2783 static void my_pri_set_rdnis(void *pvt, const char *rdnis)
2784 {
2785         struct dahdi_pvt *p = pvt;
2786
2787         ast_copy_string(p->rdnis, rdnis, sizeof(p->rdnis));
2788 }
2789
2790 static int dahdi_new_pri_nobch_channel(struct sig_pri_pri *pri);
2791
2792 static struct sig_pri_callback dahdi_pri_callbacks =
2793 {
2794         .handle_dchan_exception = my_handle_dchan_exception,
2795         .play_tone = my_pri_play_tone,
2796         .set_echocanceller = my_set_echocanceller,
2797         .dsp_reset_and_flush_digits = my_dsp_reset_and_flush_digits,
2798         .lock_private = my_lock_private,
2799         .unlock_private = my_unlock_private,
2800         .new_ast_channel = my_new_pri_ast_channel,
2801         .fixup_chans = my_pri_fixup_chans,
2802         .set_dialing = my_set_dialing,
2803         .set_digital = my_set_digital,
2804         .set_callerid = my_pri_set_callerid,
2805         .set_dnid = my_pri_set_dnid,
2806         .set_rdnis = my_pri_set_rdnis,
2807         .new_nobch_intf = dahdi_new_pri_nobch_channel,
2808 };
2809 #endif  /* defined(HAVE_PRI) */
2810
2811 /*!
2812  * \brief Send MWI state change
2813  *
2814  * \arg mailbox_full This is the mailbox associated with the FXO line that the
2815  *      MWI state has changed on.
2816  * \arg thereornot This argument should simply be set to 1 or 0, to indicate
2817  *      whether there are messages waiting or not.
2818  *
2819  *  \return nothing
2820  *
2821  * This function does two things:
2822  *
2823  * 1) It generates an internal Asterisk event notifying any other module that
2824  *    cares about MWI that the state of a mailbox has changed.
2825  *
2826  * 2) It runs the script specified by the mwimonitornotify option to allow
2827  *    some custom handling of the state change.
2828  */
2829 static void notify_message(char *mailbox_full, int thereornot)
2830 {
2831         char s[sizeof(mwimonitornotify) + 80];
2832         struct ast_event *event;
2833         char *mailbox, *context;
2834
2835         /* Strip off @default */
2836         context = mailbox = ast_strdupa(mailbox_full);
2837         strsep(&context, "@");
2838         if (ast_strlen_zero(context))
2839                 context = "default";
2840
2841         if (!(event = ast_event_new(AST_EVENT_MWI,
2842                         AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
2843                         AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
2844                         AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, thereornot,
2845                         AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, thereornot,
2846                         AST_EVENT_IE_END))) {
2847                 return;
2848         }
2849
2850         ast_event_queue_and_cache(event);
2851
2852         if (!ast_strlen_zero(mailbox) && !ast_strlen_zero(mwimonitornotify)) {
2853                 snprintf(s, sizeof(s), "%s %s %d", mwimonitornotify, mailbox, thereornot);
2854                 ast_safe_system(s);
2855         }
2856 }
2857
2858 static void my_handle_notify_message(struct ast_channel *chan, void *pvt, int cid_flags, int neon_mwievent)
2859 {
2860         struct dahdi_pvt *p = pvt;
2861
2862         if (neon_mwievent > -1 && !p->mwimonitor_neon)
2863                 return;
2864
2865         if (neon_mwievent == ANALOG_EVENT_NEONMWI_ACTIVE || cid_flags & CID_MSGWAITING) {
2866                 ast_log(LOG_NOTICE, "MWI: Channel %d message waiting, mailbox %s\n", p->channel, p->mailbox);
2867                 notify_message(p->mailbox, 1);
2868         } else if (neon_mwievent == ANALOG_EVENT_NEONMWI_INACTIVE || cid_flags & CID_NOMSGWAITING) {
2869                 ast_log(LOG_NOTICE, "MWI: Channel %d no message waiting, mailbox %s\n", p->channel, p->mailbox);
2870                 notify_message(p->mailbox, 0);
2871         }
2872         /* If the CID had Message waiting payload, assume that this for MWI only and hangup the call */
2873         /* If generated using Ring Pulse Alert, then ring has been answered as a call and needs to be hungup */
2874         if (neon_mwievent == -1 && p->mwimonitor_rpas) {
2875                 ast_hangup(chan);
2876                 return;
2877         }
2878 }
2879
2880
2881
2882 static struct analog_callback dahdi_analog_callbacks =
2883 {
2884         .play_tone = my_play_tone,
2885         .get_event = my_get_event,
2886         .wait_event = my_wait_event,
2887         .is_off_hook = my_is_off_hook,
2888         .set_echocanceller = my_set_echocanceller,
2889         .ring = my_ring,
2890         .flash = my_flash,
2891         .off_hook = my_off_hook,
2892         .dial_digits = my_dial_digits,
2893         .train_echocanceller = my_train_echocanceller,
2894         .on_hook = my_on_hook,
2895         .is_dialing = my_is_dialing,
2896         .allocate_sub = my_allocate_sub,
2897         .unallocate_sub = my_unallocate_sub,
2898         .swap_subs = my_swap_subchannels,
2899         .has_voicemail = my_has_voicemail,
2900         .check_for_conference = my_check_for_conference,
2901         .conf_add = my_conf_add,
2902         .conf_del = my_conf_del,
2903         .complete_conference_update = my_complete_conference_update,
2904         .start = my_start,
2905         .all_subchannels_hungup = my_all_subchannels_hungup,
2906         .lock_private = my_lock_private,
2907         .unlock_private = my_unlock_private,
2908         .handle_dtmfup = my_handle_dtmfup,
2909         .wink = my_wink,
2910         .new_ast_channel = my_new_analog_ast_channel,
2911         .dsp_set_digitmode = my_dsp_set_digitmode,
2912         .dsp_reset_and_flush_digits = my_dsp_reset_and_flush_digits,
2913         .send_callerid = my_send_callerid,
2914         .callwait = my_callwait,
2915         .stop_callwait = my_stop_callwait,
2916         .get_callerid = my_get_callerid,
2917         .start_cid_detect = my_start_cid_detect,
2918         .stop_cid_detect = my_stop_cid_detect,
2919         .handle_notify_message = my_handle_notify_message,
2920         .increase_ss_count = my_increase_ss_count,
2921         .decrease_ss_count = my_decrease_ss_count,
2922         .distinctive_ring = my_distinctive_ring,
2923         .set_linear_mode = my_set_linear_mode,
2924         .get_and_handle_alarms = my_get_and_handle_alarms,
2925         .get_sigpvt_bridged_channel = my_get_sigpvt_bridged_channel,
2926         .get_sub_fd = my_get_sub_fd,
2927         .set_cadence = my_set_cadence,
2928         .set_dialing = my_set_dialing,
2929         .set_ringtimeout = my_set_ringtimeout,
2930         .set_waitingfordt = my_set_waitingfordt,
2931         .check_waitingfordt = my_check_waitingfordt,
2932         .set_confirmanswer = my_set_confirmanswer,
2933         .check_confirmanswer = my_check_confirmanswer,
2934         .cancel_cidspill = my_cancel_cidspill,
2935         .confmute = my_confmute,
2936         .set_pulsedial = my_set_pulsedial,
2937 };
2938
2939 static struct dahdi_pvt *round_robin[32];
2940
2941 #if defined(HAVE_SS7)
2942 static inline void ss7_rel(struct dahdi_ss7 *ss7)
2943 {
2944         ast_mutex_unlock(&ss7->lock);
2945 }
2946 #endif  /* defined(HAVE_SS7) */
2947
2948 #if defined(HAVE_SS7)
2949 static inline int ss7_grab(struct dahdi_pvt *pvt, struct dahdi_ss7 *pri)
2950 {
2951         int res;
2952         /* Grab the lock first */
2953         do {
2954                 res = ast_mutex_trylock(&pri->lock);
2955                 if (res) {
2956                         DEADLOCK_AVOIDANCE(&pvt->lock);
2957                 }
2958         } while (res);
2959         /* Then break the poll */
2960         if (pri->master != AST_PTHREADT_NULL)
2961                 pthread_kill(pri->master, SIGURG);
2962         return 0;
2963 }
2964 #endif  /* defined(HAVE_SS7) */
2965
2966 static int dahdi_get_index(struct ast_channel *ast, struct dahdi_pvt *p, int nullok)
2967 {
2968         int res;
2969         if (p->subs[SUB_REAL].owner == ast)
2970                 res = 0;
2971         else if (p->subs[SUB_CALLWAIT].owner == ast)
2972                 res = 1;
2973         else if (p->subs[SUB_THREEWAY].owner == ast)
2974                 res = 2;
2975         else {
2976                 res = -1;
2977                 if (!nullok)
2978                         ast_log(LOG_WARNING, "Unable to get index, and nullok is not asserted\n");
2979         }
2980         return res;
2981 }
2982
2983 static void wakeup_sub(struct dahdi_pvt *p, int a)
2984 {
2985         for (;;) {
2986                 if (p->subs[a].owner) {
2987                         if (ast_channel_trylock(p->subs[a].owner)) {
2988                                 DEADLOCK_AVOIDANCE(&p->lock);
2989                         } else {
2990                                 ast_queue_frame(p->subs[a].owner, &ast_null_frame);
2991                                 ast_channel_unlock(p->subs[a].owner);
2992                                 break;
2993                         }
2994                 } else
2995                         break;
2996         }
2997 }
2998
2999 static void dahdi_queue_frame(struct dahdi_pvt *p, struct ast_frame *f, void *data)
3000 {
3001 #ifdef HAVE_SS7
3002         struct dahdi_ss7 *ss7 = (struct dahdi_ss7*) data;
3003
3004         if (data) {
3005                 switch (p->sig) {
3006                 case SIG_SS7:
3007                         ast_mutex_unlock(&ss7->lock);
3008                         break;
3009                 default:
3010                         break;
3011                 }
3012         }
3013 #endif
3014         for (;;) {
3015                 if (p->owner) {
3016                         if (ast_channel_trylock(p->owner)) {
3017                                 DEADLOCK_AVOIDANCE(&p->lock);
3018                         } else {
3019                                 ast_queue_frame(p->owner, f);
3020                                 ast_channel_unlock(p->owner);
3021                                 break;
3022                         }
3023                 } else
3024                         break;
3025         }
3026 #if defined(HAVE_SS7)
3027         if (data) {
3028                 switch (p->sig) {
3029                 case SIG_SS7:
3030                         ast_mutex_lock(&ss7->lock);
3031                         break;
3032                 default:
3033                         break;
3034                 }
3035         }
3036 #endif
3037 }
3038
3039 static void handle_clear_alarms(struct dahdi_pvt *p)
3040 {
3041         if (report_alarms & REPORT_CHANNEL_ALARMS) {
3042                 ast_log(LOG_NOTICE, "Alarm cleared on channel %d\n", p->channel);
3043                 manager_event(EVENT_FLAG_SYSTEM, "AlarmClear", "Channel: %d\r\n", p->channel);
3044         }
3045         if (report_alarms & REPORT_SPAN_ALARMS && p->manages_span_alarms) {
3046                 ast_log(LOG_NOTICE, "Alarm cleared on span %d\n", p->span);
3047                 manager_event(EVENT_FLAG_SYSTEM, "SpanAlarmClear", "Span: %d\r\n", p->span);
3048         }
3049 }
3050
3051 #ifdef HAVE_OPENR2
3052
3053 static int dahdi_r2_answer(struct dahdi_pvt *p)
3054 {
3055         int res = 0;
3056         /* openr2 1.1.0 and older does not even define OR2_LIB_INTERFACE
3057         * and does not has support for openr2_chan_answer_call_with_mode
3058         *  */
3059 #if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
3060         const char *double_answer = pbx_builtin_getvar_helper(p->owner, "MFCR2_DOUBLE_ANSWER");
3061         int wants_double_answer = ast_true(double_answer) ? 1 : 0;
3062         if (!double_answer) {
3063                 /* this still can result in double answer if the channel context
3064                 * was configured that way */
3065                 res = openr2_chan_answer_call(p->r2chan);
3066         } else if (wants_double_answer) {
3067                 res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_DOUBLE);
3068         } else {
3069                 res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_SIMPLE);
3070         }
3071 #else
3072         res = openr2_chan_answer_call(p->r2chan);
3073 #endif
3074         return res;
3075 }
3076
3077
3078
3079 /* should be called with the ast_channel locked */
3080 static openr2_calling_party_category_t dahdi_r2_get_channel_category(struct ast_channel *c)
3081 {
3082         openr2_calling_party_category_t cat;
3083         const char *catstr = pbx_builtin_getvar_helper(c, "MFCR2_CATEGORY");
3084         struct dahdi_pvt *p = c->tech_pvt;
3085         if (ast_strlen_zero(catstr)) {
3086                 ast_debug(1, "No MFC/R2 category specified for chan %s, using default %s\n",
3087                                 c->name, openr2_proto_get_category_string(p->mfcr2_category));
3088                 return p->mfcr2_category;
3089         }
3090         if ((cat = openr2_proto_get_category(catstr)) == OR2_CALLING_PARTY_CATEGORY_UNKNOWN) {
3091                 ast_log(LOG_WARNING, "Invalid category specified '%s' for chan %s, using default %s\n",
3092                                 catstr, c->name, openr2_proto_get_category_string(p->mfcr2_category));
3093                 return p->mfcr2_category;
3094         }
3095         ast_debug(1, "Using category %s\n", catstr);
3096         return cat;
3097 }
3098
3099 static void dahdi_r2_on_call_init(openr2_chan_t *r2chan)
3100 {
3101         struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3102         ast_mutex_lock(&p->lock);
3103         if (p->mfcr2call) {
3104                 ast_mutex_unlock(&p->lock);
3105                 /* TODO: This can happen when some other thread just finished dahdi_request requesting this very same
3106                    interface but has not yet seized the line (dahdi_call), and the far end wins and seize the line,
3107                    can we avoid this somehow?, at this point when dahdi_call send the seize, it is likely that since
3108                    the other end will see our seize as a forced release and drop the call, we will see an invalid
3109                    pattern that will be seen and treated as protocol error. */
3110                 ast_log(LOG_ERROR, "Collision of calls on chan %d detected!.\n", openr2_chan_get_number(r2chan));
3111                 return;
3112         }
3113         p->mfcr2call = 1;
3114         /* better safe than sorry ... */
3115         p->cid_name[0] = '\0';
3116         p->cid_num[0] = '\0';
3117         p->cid_subaddr[0] = '\0';
3118         p->rdnis[0] = '\0';
3119         p->exten[0] = '\0';
3120         p->mfcr2_ani_index = '\0';
3121         p->mfcr2_dnis_index = '\0';
3122         p->mfcr2_dnis_matched = 0;
3123         p->mfcr2_answer_pending = 0;
3124         p->mfcr2_call_accepted = 0;
3125         ast_mutex_unlock(&p->lock);
3126         ast_verbose("New MFC/R2 call detected on chan %d.\n", openr2_chan_get_number(r2chan));
3127 }
3128
3129 static void dahdi_r2_on_hardware_alarm(openr2_chan_t *r2chan, int alarm)
3130 {
3131         int res;
3132         struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3133         ast_mutex_lock(&p->lock);
3134         p->inalarm = alarm ? 1 : 0;
3135         if (p->inalarm) {
3136                 res = get_alarms(p);
3137                 handle_alarms(p, res);
3138         } else {
3139                 handle_clear_alarms(p);
3140         }
3141         ast_mutex_unlock(&p->lock);
3142 }
3143
3144 static void dahdi_r2_on_os_error(openr2_chan_t *r2chan, int errorcode)
3145 {
3146         ast_log(LOG_ERROR, "OS error on chan %d: %s\n", openr2_chan_get_number(r2chan), strerror(errorcode));
3147 }
3148
3149 static void dahdi_r2_on_protocol_error(openr2_chan_t *r2chan, openr2_protocol_error_t reason)
3150 {
3151         struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3152         ast_log(LOG_ERROR, "MFC/R2 protocol error on chan %d: %s\n", openr2_chan_get_number(r2chan), openr2_proto_get_error(reason));
3153         if (p->owner) {
3154                 p->owner->hangupcause = AST_CAUSE_PROTOCOL_ERROR;
3155                 p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
3156         }
3157         ast_mutex_lock(&p->lock);
3158         p->mfcr2call = 0;
3159         ast_mutex_unlock(&p->lock);
3160 }
3161
3162 static void dahdi_r2_disconnect_call(struct dahdi_pvt *p, openr2_call_disconnect_cause_t cause)
3163 {
3164         if (openr2_chan_disconnect_call(p->r2chan, cause)) {
3165                 ast_log(LOG_NOTICE, "Bad! failed to disconnect call on channel %d with reason %s, hope for the best!\n",
3166                    p->channel, openr2_proto_get_disconnect_string(cause));
3167                 /* force the chan to idle and release the call flag now since we will not see a clean on_call_end */
3168                 openr2_chan_set_idle(p->r2chan);
3169                 ast_mutex_lock(&p->lock);
3170                 p->mfcr2call = 0;
3171                 ast_mutex_unlock(&p->lock);
3172         }
3173 }
3174
3175 static void dahdi_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, const char *dnis, openr2_calling_party_category_t category)
3176 {
3177         struct dahdi_pvt *p;
3178         struct ast_channel *c;
3179         ast_verbose("MFC/R2 call offered on chan %d. ANI = %s, DNIS = %s, Category = %s\n",
3180                         openr2_chan_get_number(r2chan), ani ? ani : "(restricted)", dnis,
3181                         openr2_proto_get_category_string(category));
3182         p = openr2_chan_get_client_data(r2chan);
3183         /* if collect calls are not allowed and this is a collect call, reject it! */
3184         if (!p->mfcr2_allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
3185                 ast_log(LOG_NOTICE, "Rejecting MFC/R2 collect call\n");
3186                 dahdi_r2_disconnect_call(p, OR2_CAUSE_COLLECT_CALL_REJECTED);
3187                 return;
3188         }
3189         ast_mutex_lock(&p->lock);
3190         p->mfcr2_recvd_category = category;
3191         /* if we're not supposed to use CID, clear whatever we have */
3192         if (!p->use_callerid) {
3193                 ast_log(LOG_DEBUG, "No CID allowed in configuration, CID is being cleared!\n");
3194                 p->cid_num[0] = 0;
3195                 p->cid_name[0] = 0;
3196         }
3197         /* if we're supposed to answer immediately, clear DNIS and set 's' exten */
3198         if (p->immediate || !openr2_context_get_max_dnis(openr2_chan_get_context(r2chan))) {
3199                 ast_log(LOG_DEBUG, "Setting exten => s because of immediate or 0 DNIS configured\n");
3200                 p->exten[0] = 's';
3201                 p->exten[1] = 0;
3202         }
3203         ast_mutex_unlock(&p->lock);
3204         if (!ast_exists_extension(NULL, p->context, p->exten, 1, p->cid_num)) {
3205                 ast_log(LOG_NOTICE, "MFC/R2 call on channel %d requested non-existent extension '%s' in context '%s'. Rejecting call.\n",
3206                                 p->channel, p->exten, p->context);
3207                 dahdi_r2_disconnect_call(p, OR2_CAUSE_UNALLOCATED_NUMBER);
3208                 return;
3209         }
3210         if (!p->mfcr2_accept_on_offer) {
3211                 /* The user wants us to start the PBX thread right away without accepting the call first */
3212                 c = dahdi_new(p, AST_STATE_RING, 1, SUB_REAL, DAHDI_LAW_ALAW, 0, NULL);
3213                 if (c) {
3214                         /* Done here, don't disable reading now since we still need to generate MF tones to accept
3215                            the call or reject it and detect the tone off condition of the other end, all of this
3216                            will be done in the PBX thread now */
3217                         return;
3218                 }
3219                 ast_log(LOG_WARNING, "Unable to create PBX channel in DAHDI channel %d\n", p->channel);
3220                 dahdi_r2_disconnect_call(p, O