Voicemail: Remove mailbox identifier format (box@context) assumptions in the system.
[asterisk/asterisk.git] / channels / chan_dahdi.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2013 Digium, Inc.
5  *
6  * Richard Mudgett <rmudgett@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 /*!
20  * \file
21  * \brief DAHDI internal API definitions.
22  *
23  * \author Richard Mudgett <rmudgett@digium.com>
24  *
25  * See Also:
26  * \arg \ref AstCREDITS
27  */
28
29 #ifndef _ASTERISK_CHAN_DAHDI_H
30 #define _ASTERISK_CHAN_DAHDI_H
31
32 #if defined(HAVE_OPENR2)
33 #include <openr2.h>
34 #endif  /* defined(HAVE_OPENR2) */
35
36 #include <dahdi/user.h>
37 #include <dahdi/tonezone.h>
38
39 #include "asterisk/channel.h"
40 #include "asterisk/dsp.h"
41 #include "asterisk/app.h"
42
43 #if defined(__cplusplus) || defined(c_plusplus)
44 extern "C" {
45 #endif
46
47 /* ------------------------------------------------------------------- */
48
49 #if defined(HAVE_PRI)
50 struct sig_pri_span;
51 #endif  /* defined(HAVE_PRI) */
52 #if defined(HAVE_SS7)
53 struct sig_ss7_linkset;
54 #endif  /* defined(HAVE_SS7) */
55
56 #define SUB_REAL                0                       /*!< Active call */
57 #define SUB_CALLWAIT    1                       /*!< Call-Waiting call on hold */
58 #define SUB_THREEWAY    2                       /*!< Three-way call */
59
60
61 struct distRingData {
62         int ring[3];
63         int range;
64 };
65 struct ringContextData {
66         char contextData[AST_MAX_CONTEXT];
67 };
68 struct dahdi_distRings {
69         struct distRingData ringnum[3];
70         struct ringContextData ringContext[3];
71 };
72
73
74 extern const char * const subnames[];
75
76 struct dahdi_subchannel {
77         int dfd;
78         struct ast_channel *owner;
79         int chan;
80         short buffer[AST_FRIENDLY_OFFSET/2 + READ_SIZE];
81         struct ast_frame f;             /*!< One frame for each channel.  How did this ever work before? */
82         unsigned int needringing:1;
83         unsigned int needbusy:1;
84         unsigned int needcongestion:1;
85         unsigned int needanswer:1;
86         unsigned int needflash:1;
87         unsigned int needhold:1;
88         unsigned int needunhold:1;
89         unsigned int linear:1;
90         unsigned int inthreeway:1;
91         struct dahdi_confinfo curconf;
92 };
93
94 #define MAX_SLAVES      4
95
96 /* States for sending MWI message
97  * First three states are required for send Ring Pulse Alert Signal
98  */
99 typedef enum {
100         MWI_SEND_NULL = 0,
101         MWI_SEND_SA,
102         MWI_SEND_SA_WAIT,
103         MWI_SEND_PAUSE,
104         MWI_SEND_SPILL,
105         MWI_SEND_CLEANUP,
106         MWI_SEND_DONE,
107 } mwisend_states;
108
109 struct mwisend_info {
110         struct timeval pause;
111         mwisend_states mwisend_current;
112 };
113
114 /*! Specify the lists dahdi_pvt can be put in. */
115 enum DAHDI_IFLIST {
116         DAHDI_IFLIST_NONE,      /*!< The dahdi_pvt is not in any list. */
117         DAHDI_IFLIST_MAIN,      /*!< The dahdi_pvt is in the main interface list */
118 #if defined(HAVE_PRI)
119         DAHDI_IFLIST_NO_B_CHAN, /*!< The dahdi_pvt is in a no B channel interface list */
120 #endif  /* defined(HAVE_PRI) */
121 };
122
123 struct dahdi_pvt {
124         ast_mutex_t lock;                                       /*!< Channel private lock. */
125         struct callerid_state *cs;
126         struct ast_channel *owner;                      /*!< Our current active owner (if applicable) */
127                                                         /*!< Up to three channels can be associated with this call */
128
129         struct dahdi_subchannel sub_unused;             /*!< Just a safety precaution */
130         struct dahdi_subchannel subs[3];                        /*!< Sub-channels */
131         struct dahdi_confinfo saveconf;                 /*!< Saved conference info */
132
133         struct dahdi_pvt *slaves[MAX_SLAVES];           /*!< Slave to us (follows our conferencing) */
134         struct dahdi_pvt *master;                               /*!< Master to us (we follow their conferencing) */
135         int inconference;                               /*!< If our real should be in the conference */
136
137         int bufsize;                /*!< Size of the buffers */
138         int buf_no;                                     /*!< Number of buffers */
139         int buf_policy;                         /*!< Buffer policy */
140         int faxbuf_no;              /*!< Number of Fax buffers */
141         int faxbuf_policy;          /*!< Fax buffer policy */
142         int sig;                                        /*!< Signalling style */
143         /*!
144          * \brief Nonzero if the signaling type is sent over a radio.
145          * \note Set to a couple of nonzero values but it is only tested like a boolean.
146          */
147         int radio;
148         int outsigmod;                                  /*!< Outbound Signalling style (modifier) */
149         int oprmode;                                    /*!< "Operator Services" mode */
150         struct dahdi_pvt *oprpeer;                              /*!< "Operator Services" peer tech_pvt ptr */
151         /*! \brief Hardware Rx gain set by chan_dahdi.conf */
152         float hwrxgain;
153         /*! \brief Hardware Tx gain set by chan_dahdi.conf */
154         float hwtxgain;
155         /*! \brief Amount of gain to increase during caller id */
156         float cid_rxgain;
157         /*! \brief Software Rx gain set by chan_dahdi.conf */
158         float rxgain;
159         /*! \brief Software Tx gain set by chan_dahdi.conf */
160         float txgain;
161
162         float txdrc; /*!< Dynamic Range Compression factor. a number between 1 and 6ish */
163         float rxdrc;
164
165         int tonezone;                                   /*!< tone zone for this chan, or -1 for default */
166         enum DAHDI_IFLIST which_iflist; /*!< Which interface list is this structure listed? */
167         struct dahdi_pvt *next;                         /*!< Next channel in list */
168         struct dahdi_pvt *prev;                         /*!< Prev channel in list */
169
170         /* flags */
171
172         /*!
173          * \brief TRUE if ADSI (Analog Display Services Interface) available
174          * \note Set from the "adsi" value read in from chan_dahdi.conf
175          */
176         unsigned int adsi:1;
177         /*!
178          * \brief TRUE if we can use a polarity reversal to mark when an outgoing
179          * call is answered by the remote party.
180          * \note Set from the "answeronpolarityswitch" value read in from chan_dahdi.conf
181          */
182         unsigned int answeronpolarityswitch:1;
183         /*!
184          * \brief TRUE if busy detection is enabled.
185          * (Listens for the beep-beep busy pattern.)
186          * \note Set from the "busydetect" value read in from chan_dahdi.conf
187          */
188         unsigned int busydetect:1;
189         /*!
190          * \brief TRUE if call return is enabled.
191          * (*69, if your dialplan doesn't catch this first)
192          * \note Set from the "callreturn" value read in from chan_dahdi.conf
193          */
194         unsigned int callreturn:1;
195         /*!
196          * \brief TRUE if busy extensions will hear the call-waiting tone
197          * and can use hook-flash to switch between callers.
198          * \note Can be disabled by dialing *70.
199          * \note Initialized with the "callwaiting" value read in from chan_dahdi.conf
200          */
201         unsigned int callwaiting:1;
202         /*!
203          * \brief TRUE if send caller ID for Call Waiting
204          * \note Set from the "callwaitingcallerid" value read in from chan_dahdi.conf
205          */
206         unsigned int callwaitingcallerid:1;
207         /*!
208          * \brief TRUE if support for call forwarding enabled.
209          * Dial *72 to enable call forwarding.
210          * Dial *73 to disable call forwarding.
211          * \note Set from the "cancallforward" value read in from chan_dahdi.conf
212          */
213         unsigned int cancallforward:1;
214         /*!
215          * \brief TRUE if support for call parking is enabled.
216          * \note Set from the "canpark" value read in from chan_dahdi.conf
217          */
218         unsigned int canpark:1;
219         /*! \brief TRUE if to wait for a DTMF digit to confirm answer */
220         unsigned int confirmanswer:1;
221         /*!
222          * \brief TRUE if the channel is to be destroyed on hangup.
223          * (Used by pseudo channels.)
224          */
225         unsigned int destroy:1;
226         unsigned int didtdd:1;                          /*!< flag to say its done it once */
227         /*! \brief TRUE if analog type line dialed no digits in Dial() */
228         unsigned int dialednone:1;
229         /*!
230          * \brief TRUE if in the process of dialing digits or sending something.
231          * \note This is used as a receive squelch for ISDN until connected.
232          */
233         unsigned int dialing:1;
234         /*! \brief TRUE if the transfer capability of the call is digital. */
235         unsigned int digital:1;
236         /*! \brief TRUE if Do-Not-Disturb is enabled, present only for non sig_analog */
237         unsigned int dnd:1;
238         /*! \brief XXX BOOLEAN Purpose??? */
239         unsigned int echobreak:1;
240         /*!
241          * \brief TRUE if echo cancellation enabled when bridged.
242          * \note Initialized with the "echocancelwhenbridged" value read in from chan_dahdi.conf
243          * \note Disabled if the echo canceller is not setup.
244          */
245         unsigned int echocanbridged:1;
246         /*! \brief TRUE if echo cancellation is turned on. */
247         unsigned int echocanon:1;
248         /*! \brief TRUE if a fax tone has already been handled. */
249         unsigned int faxhandled:1;
250         /*! TRUE if dynamic faxbuffers are configured for use, default is OFF */
251         unsigned int usefaxbuffers:1;
252         /*! TRUE while buffer configuration override is in use */
253         unsigned int bufferoverrideinuse:1;
254         /*! \brief TRUE if over a radio and dahdi_read() has been called. */
255         unsigned int firstradio:1;
256         /*!
257          * \brief TRUE if the call will be considered "hung up" on a polarity reversal.
258          * \note Set from the "hanguponpolarityswitch" value read in from chan_dahdi.conf
259          */
260         unsigned int hanguponpolarityswitch:1;
261         /*! \brief TRUE if DTMF detection needs to be done by hardware. */
262         unsigned int hardwaredtmf:1;
263         /*!
264          * \brief TRUE if the outgoing caller ID is blocked/hidden.
265          * \note Caller ID can be disabled by dialing *67.
266          * \note Caller ID can be enabled by dialing *82.
267          * \note Initialized with the "hidecallerid" value read in from chan_dahdi.conf
268          */
269         unsigned int hidecallerid:1;
270         /*!
271          * \brief TRUE if hide just the name not the number for legacy PBX use.
272          * \note Only applies to PRI channels.
273          * \note Set from the "hidecalleridname" value read in from chan_dahdi.conf
274          */
275         unsigned int hidecalleridname:1;
276         /*! \brief TRUE if DTMF detection is disabled. */
277         unsigned int ignoredtmf:1;
278         /*!
279          * \brief TRUE if the channel should be answered immediately
280          * without attempting to gather any digits.
281          * \note Set from the "immediate" value read in from chan_dahdi.conf
282          */
283         unsigned int immediate:1;
284         /*! \brief TRUE if in an alarm condition. */
285         unsigned int inalarm:1;
286         /*! \brief TRUE if TDD in MATE mode */
287         unsigned int mate:1;
288         /*! \brief TRUE if we originated the call leg. */
289         unsigned int outgoing:1;
290         /*!
291          * \brief TRUE if busy extensions will hear the call-waiting tone
292          * and can use hook-flash to switch between callers.
293          * \note Set from the "callwaiting" value read in from chan_dahdi.conf
294          */
295         unsigned int permcallwaiting:1;
296         /*!
297          * \brief TRUE if the outgoing caller ID is blocked/restricted/hidden.
298          * \note Set from the "hidecallerid" value read in from chan_dahdi.conf
299          */
300         unsigned int permhidecallerid:1;
301         /*!
302          * \brief TRUE if PRI congestion/busy indications are sent out-of-band.
303          * \note Set from the "priindication" value read in from chan_dahdi.conf
304          */
305         unsigned int priindication_oob:1;
306         /*!
307          * \brief TRUE if PRI B channels are always exclusively selected.
308          * \note Set from the "priexclusive" value read in from chan_dahdi.conf
309          */
310         unsigned int priexclusive:1;
311         /*!
312          * \brief TRUE if we will pulse dial.
313          * \note Set from the "pulsedial" value read in from chan_dahdi.conf
314          */
315         unsigned int pulse:1;
316         /*! \brief TRUE if a pulsed digit was detected. (Pulse dial phone detected) */
317         unsigned int pulsedial:1;
318         unsigned int restartpending:1;          /*!< flag to ensure counted only once for restart */
319         /*!
320          * \brief TRUE if caller ID is restricted.
321          * \note Set but not used.  Should be deleted.  Redundant with permhidecallerid.
322          * \note Set from the "restrictcid" value read in from chan_dahdi.conf
323          */
324         unsigned int restrictcid:1;
325         /*!
326          * \brief TRUE if three way calling is enabled
327          * \note Set from the "threewaycalling" value read in from chan_dahdi.conf
328          */
329         unsigned int threewaycalling:1;
330         /*!
331          * \brief TRUE if call transfer is enabled
332          * \note For FXS ports (either direct analog or over T1/E1):
333          *   Support flash-hook call transfer
334          * \note For digital ports using ISDN PRI protocols:
335          *   Support switch-side transfer (called 2BCT, RLT or other names)
336          * \note Set from the "transfer" value read in from chan_dahdi.conf
337          */
338         unsigned int transfer:1;
339         /*!
340          * \brief TRUE if caller ID is used on this channel.
341          * \note PRI and SS7 spans will save caller ID from the networking peer.
342          * \note FXS ports will generate the caller ID spill.
343          * \note FXO ports will listen for the caller ID spill.
344          * \note Set from the "usecallerid" value read in from chan_dahdi.conf
345          */
346         unsigned int use_callerid:1;
347         /*!
348          * \brief TRUE if we will use the calling presentation setting
349          * from the Asterisk channel for outgoing calls.
350          * \note Only applies to PRI and SS7 channels.
351          * \note Set from the "usecallingpres" value read in from chan_dahdi.conf
352          */
353         unsigned int use_callingpres:1;
354         /*!
355          * \brief TRUE if distinctive rings are to be detected.
356          * \note For FXO lines
357          * \note Set indirectly from the "usedistinctiveringdetection" value read in from chan_dahdi.conf
358          */
359         unsigned int usedistinctiveringdetection:1;
360         /*!
361          * \brief TRUE if we should use the callerid from incoming call on dahdi transfer.
362          * \note Set from the "useincomingcalleridondahditransfer" value read in from chan_dahdi.conf
363          */
364         unsigned int dahditrcallerid:1;
365         /*!
366          * \brief TRUE if allowed to flash-transfer to busy channels.
367          * \note Set from the "transfertobusy" value read in from chan_dahdi.conf
368          */
369         unsigned int transfertobusy:1;
370         /*!
371          * \brief TRUE if the FXO port monitors for neon type MWI indications from the other end.
372          * \note Set if the "mwimonitor" value read in contains "neon" from chan_dahdi.conf
373          */
374         unsigned int mwimonitor_neon:1;
375         /*!
376          * \brief TRUE if the FXO port monitors for fsk type MWI indications from the other end.
377          * \note Set if the "mwimonitor" value read in contains "fsk" from chan_dahdi.conf
378          */
379         unsigned int mwimonitor_fsk:1;
380         /*!
381          * \brief TRUE if the FXO port monitors for rpas precursor to fsk MWI indications from the other end.
382          * \note RPAS - Ring Pulse Alert Signal
383          * \note Set if the "mwimonitor" value read in contains "rpas" from chan_dahdi.conf
384          */
385         unsigned int mwimonitor_rpas:1;
386         /*! \brief TRUE if an MWI monitor thread is currently active */
387         unsigned int mwimonitoractive:1;
388         /*! \brief TRUE if a MWI message sending thread is active */
389         unsigned int mwisendactive:1;
390         /*!
391          * \brief TRUE if channel is out of reset and ready
392          * \note Set but not used.
393          */
394         unsigned int inservice:1;
395         /*!
396          * \brief TRUE if the channel is locally blocked.
397          * \note Applies to SS7 and MFCR2 channels.
398          */
399         unsigned int locallyblocked:1;
400         /*!
401          * \brief TRUE if the channel is remotely blocked.
402          * \note Applies to SS7 and MFCR2 channels.
403          */
404         unsigned int remotelyblocked:1;
405         /*!
406          * \brief TRUE if the channel alarms will be managed also as Span ones
407          * \note Applies to all channels
408          */
409         unsigned int manages_span_alarms:1;
410         /*! \brief TRUE if hardware Rx gain set by Asterisk */
411         unsigned int hwrxgain_enabled;
412         /*! \brief TRUE if hardware Tx gain set by Asterisk */
413         unsigned int hwtxgain_enabled;
414
415 #if defined(HAVE_PRI)
416         struct sig_pri_span *pri;
417         int logicalspan;
418 #endif  /* defined(HAVE_PRI) */
419         /*!
420          * \brief TRUE if SMDI (Simplified Message Desk Interface) is enabled
421          * \note Set from the "usesmdi" value read in from chan_dahdi.conf
422          */
423         unsigned int use_smdi:1;
424         struct mwisend_info mwisend_data;
425         /*! \brief The SMDI interface to get SMDI messages from. */
426         struct ast_smdi_interface *smdi_iface;
427
428         /*! \brief Distinctive Ring data */
429         struct dahdi_distRings drings;
430
431         /*!
432          * \brief The configured context for incoming calls.
433          * \note The "context" string read in from chan_dahdi.conf
434          */
435         char context[AST_MAX_CONTEXT];
436         /*!
437          * \brief A description for the channel configuration
438          * \note The "description" string read in from chan_dahdi.conf
439          */
440         char description[32];
441         /*!
442          * \brief Saved context string.
443          */
444         char defcontext[AST_MAX_CONTEXT];
445         /*! \brief Extension to use in the dialplan. */
446         char exten[AST_MAX_EXTENSION];
447         /*!
448          * \brief Language configured for calls.
449          * \note The "language" string read in from chan_dahdi.conf
450          */
451         char language[MAX_LANGUAGE];
452         /*!
453          * \brief The configured music-on-hold class to use for calls.
454          * \note The "musicclass" or "mohinterpret" or "musiconhold" string read in from chan_dahdi.conf
455          */
456         char mohinterpret[MAX_MUSICCLASS];
457         /*!
458          * \brief Suggested music-on-hold class for peer channel to use for calls.
459          * \note The "mohsuggest" string read in from chan_dahdi.conf
460          */
461         char mohsuggest[MAX_MUSICCLASS];
462         char parkinglot[AST_MAX_EXTENSION]; /*!< Parking lot for this channel */
463 #if defined(HAVE_PRI) || defined(HAVE_SS7)
464         /*! \brief Automatic Number Identification number (Alternate PRI caller ID number) */
465         char cid_ani[AST_MAX_EXTENSION];
466 #endif  /* defined(HAVE_PRI) || defined(HAVE_SS7) */
467         /*! \brief Automatic Number Identification code from PRI */
468         int cid_ani2;
469         /*! \brief Caller ID number from an incoming call. */
470         char cid_num[AST_MAX_EXTENSION];
471         /*!
472          * \brief Caller ID tag from incoming call
473          * \note the "cid_tag" string read in from chan_dahdi.conf
474          */
475         char cid_tag[AST_MAX_EXTENSION];
476         /*! \brief Caller ID Q.931 TON/NPI field values.  Set by PRI. Zero otherwise. */
477         int cid_ton;
478         /*! \brief Caller ID name from an incoming call. */
479         char cid_name[AST_MAX_EXTENSION];
480         /*! \brief Caller ID subaddress from an incoming call. */
481         char cid_subaddr[AST_MAX_EXTENSION];
482         char *origcid_num;                              /*!< malloced original callerid */
483         char *origcid_name;                             /*!< malloced original callerid */
484         /*! \brief Call waiting number. */
485         char callwait_num[AST_MAX_EXTENSION];
486         /*! \brief Call waiting name. */
487         char callwait_name[AST_MAX_EXTENSION];
488         /*! \brief Redirecting Directory Number Information Service (RDNIS) number */
489         char rdnis[AST_MAX_EXTENSION];
490         /*! \brief Dialed Number Identifier */
491         char dnid[AST_MAX_EXTENSION];
492         /*!
493          * \brief Bitmapped groups this belongs to.
494          * \note The "group" bitmapped group string read in from chan_dahdi.conf
495          */
496         ast_group_t group;
497         /*! \brief Default call PCM encoding format: DAHDI_LAW_ALAW or DAHDI_LAW_MULAW. */
498         int law_default;
499         /*! \brief Active PCM encoding format: DAHDI_LAW_ALAW or DAHDI_LAW_MULAW */
500         int law;
501         int confno;                                     /*!< Our conference */
502         int confusers;                                  /*!< Who is using our conference */
503         int propconfno;                                 /*!< Propagated conference number */
504         /*!
505          * \brief Bitmapped call groups this belongs to.
506          * \note The "callgroup" bitmapped group string read in from chan_dahdi.conf
507          */
508         ast_group_t callgroup;
509         /*!
510          * \brief Bitmapped pickup groups this belongs to.
511          * \note The "pickupgroup" bitmapped group string read in from chan_dahdi.conf
512          */
513         ast_group_t pickupgroup;
514         /*!
515          * \brief Named call groups this belongs to.
516          * \note The "namedcallgroup" string read in from chan_dahdi.conf
517          */
518         struct ast_namedgroups *named_callgroups;
519         /*!
520          * \brief Named pickup groups this belongs to.
521          * \note The "namedpickupgroup" string read in from chan_dahdi.conf
522          */
523         struct ast_namedgroups *named_pickupgroups;
524         /*!
525          * \brief Channel variable list with associated values to set when a channel is created.
526          * \note The "setvar" strings read in from chan_dahdi.conf
527          */
528         struct ast_variable *vars;
529         int channel;                                    /*!< Channel Number */
530         int span;                                       /*!< Span number */
531         time_t guardtime;                               /*!< Must wait this much time before using for new call */
532         int cid_signalling;                             /*!< CID signalling type bell202 or v23 */
533         int cid_start;                                  /*!< CID start indicator, polarity or ring or DTMF without warning event */
534         int dtmfcid_holdoff_state;              /*!< State indicator that allows for line to settle before checking for dtmf energy */
535         struct timeval  dtmfcid_delay;  /*!< Time value used for allow line to settle */
536         int callingpres;                                /*!< The value of calling presentation that we're going to use when placing a PRI call */
537         int callwaitingrepeat;                          /*!< How many samples to wait before repeating call waiting */
538         int cidcwexpire;                                /*!< When to stop waiting for CID/CW CAS response (In samples) */
539         int cid_suppress_expire;                /*!< How many samples to suppress after a CID spill. */
540         /*! \brief Analog caller ID waveform sample buffer */
541         unsigned char *cidspill;
542         /*! \brief Position in the cidspill buffer to send out next. */
543         int cidpos;
544         /*! \brief Length of the cidspill buffer containing samples. */
545         int cidlen;
546         /*! \brief Ring timeout timer?? */
547         int ringt;
548         /*!
549          * \brief Ring timeout base.
550          * \note Value computed indirectly from "ringtimeout" read in from chan_dahdi.conf
551          */
552         int ringt_base;
553         /*!
554          * \brief Number of most significant digits/characters to strip from the dialed number.
555          * \note Feature is deprecated.  Use dialplan logic.
556          * \note The characters are stripped before the PRI TON/NPI prefix
557          * characters are processed.
558          */
559         int stripmsd;
560         /*!
561          * \brief TRUE if Call Waiting (CW) CPE Alert Signal (CAS) is being sent.
562          * \note
563          * After CAS is sent, the call waiting caller id will be sent if the phone
564          * gives a positive reply.
565          */
566         int callwaitcas;
567         /*! \brief Number of call waiting rings. */
568         int callwaitrings;
569         /*! \brief Echo cancel parameters. */
570         struct {
571                 struct dahdi_echocanparams head;
572                 struct dahdi_echocanparam params[DAHDI_MAX_ECHOCANPARAMS];
573         } echocancel;
574         /*!
575          * \brief Echo training time. 0 = disabled
576          * \note Set from the "echotraining" value read in from chan_dahdi.conf
577          */
578         int echotraining;
579         /*! \brief Filled with 'w'.  XXX Purpose?? */
580         char echorest[20];
581         /*!
582          * \brief Number of times to see "busy" tone before hanging up.
583          * \note Set from the "busycount" value read in from chan_dahdi.conf
584          */
585         int busycount;
586         /*!
587          * \brief Busy cadence pattern description.
588          * \note Set from the "busypattern" value read from chan_dahdi.conf
589          */
590         struct ast_dsp_busy_pattern busy_cadence;
591         /*!
592          * \brief Bitmapped call progress detection flags. CALLPROGRESS_xxx values.
593          * \note Bits set from the "callprogress" and "faxdetect" values read in from chan_dahdi.conf
594          */
595         int callprogress;
596         /*!
597          * \brief Number of milliseconds to wait for dialtone.
598          * \note Set from the "waitfordialtone" value read in from chan_dahdi.conf
599          */
600         int waitfordialtone;
601         /*!
602          * \brief Number of frames to watch for dialtone in incoming calls
603          * \note Set from the "dialtone_detect" value read in from chan_dahdi.conf
604          */
605         int dialtone_detect;
606         int dialtone_scanning_time_elapsed;     /*!< Amount of audio scanned for dialtone, in frames */
607         struct timeval waitingfordt;                    /*!< Time we started waiting for dialtone */
608         struct timeval flashtime;                       /*!< Last flash-hook time */
609         /*! \brief Opaque DSP configuration structure. */
610         struct ast_dsp *dsp;
611         /*! \brief DAHDI dial operation command struct for ioctl() call. */
612         struct dahdi_dialoperation dop;
613         int whichwink;                                  /*!< SIG_FEATDMF_TA Which wink are we on? */
614         /*! \brief Second part of SIG_FEATDMF_TA wink operation. */
615         char finaldial[64];
616         char accountcode[AST_MAX_ACCOUNT_CODE];         /*!< Account code */
617         int amaflags;                                   /*!< AMA Flags */
618         struct tdd_state *tdd;                          /*!< TDD flag */
619         /*! \brief Accumulated call forwarding number. */
620         char call_forward[AST_MAX_EXTENSION];
621         /*!
622          * \brief Voice mailbox location.
623          * \note Set from the "mailbox" string read in from chan_dahdi.conf
624          */
625         char mailbox[AST_MAX_MAILBOX_UNIQUEID];
626         /*! \brief Opaque event subscription parameters for message waiting indication support. */
627         struct stasis_subscription *mwi_event_sub;
628         /*! \brief Delayed dialing for E911.  Overlap digits for ISDN. */
629         char dialdest[256];
630 #ifdef HAVE_DAHDI_LINEREVERSE_VMWI
631         struct dahdi_vmwi_info mwisend_setting;                         /*!< Which VMWI methods to use */
632         unsigned int mwisend_fsk: 1;            /*! Variable for enabling FSK MWI handling in chan_dahdi */
633         unsigned int mwisend_rpas:1;            /*! Variable for enabling Ring Pulse Alert before MWI FSK Spill */
634 #endif
635         int distinctivering;                            /*!< Which distinctivering to use */
636         int dtmfrelax;                                  /*!< whether to run in relaxed DTMF mode */
637         /*! \brief Holding place for event injected from outside normal operation. */
638         int fake_event;
639         /*!
640          * \brief Minimal time period (ms) between the answer polarity
641          * switch and hangup polarity switch.
642          */
643         int polarityonanswerdelay;
644         /*! \brief Start delay time if polarityonanswerdelay is nonzero. */
645         struct timeval polaritydelaytv;
646         /*!
647          * \brief Send caller ID on FXS after this many rings. Set to 1 for US.
648          * \note Set from the "sendcalleridafter" value read in from chan_dahdi.conf
649          */
650         int sendcalleridafter;
651         /*! \brief Current line interface polarity. POLARITY_IDLE, POLARITY_REV */
652         int polarity;
653         /*! \brief DSP feature flags: DSP_FEATURE_xxx */
654         int dsp_features;
655 #if defined(HAVE_SS7)
656         /*! \brief SS7 control parameters */
657         struct sig_ss7_linkset *ss7;
658 #endif  /* defined(HAVE_SS7) */
659 #if defined(HAVE_OPENR2)
660         struct dahdi_mfcr2 *mfcr2;
661         openr2_chan_t *r2chan;
662         openr2_calling_party_category_t mfcr2_recvd_category;
663         openr2_calling_party_category_t mfcr2_category;
664         int mfcr2_dnis_index;
665         int mfcr2_ani_index;
666         int mfcr2call:1;
667         int mfcr2_answer_pending:1;
668         int mfcr2_charge_calls:1;
669         int mfcr2_allow_collect_calls:1;
670         int mfcr2_forced_release:1;
671         int mfcr2_dnis_matched:1;
672         int mfcr2_call_accepted:1;
673         int mfcr2_accept_on_offer:1;
674         int mfcr2_progress_sent:1;
675 #endif  /* defined(HAVE_OPENR2) */
676         /*! \brief DTMF digit in progress.  0 when no digit in progress. */
677         char begindigit;
678         /*! \brief TRUE if confrence is muted. */
679         int muting;
680         void *sig_pvt;
681         struct ast_cc_config_params *cc_params;
682         /* DAHDI channel names may differ greatly from the
683          * string that was provided to an app such as Dial. We
684          * need to save the original string passed to dahdi_request
685          * for call completion purposes. This way, we can replicate
686          * the original dialed string later.
687          */
688         char dialstring[AST_CHANNEL_NAME];
689 };
690
691
692 /* Analog signaling */
693 #define SIG_EM          DAHDI_SIG_EM
694 #define SIG_EMWINK      (0x0100000 | DAHDI_SIG_EM)
695 #define SIG_FEATD       (0x0200000 | DAHDI_SIG_EM)
696 #define SIG_FEATDMF     (0x0400000 | DAHDI_SIG_EM)
697 #define SIG_FEATB       (0x0800000 | DAHDI_SIG_EM)
698 #define SIG_E911        (0x1000000 | DAHDI_SIG_EM)
699 #define SIG_FEATDMF_TA  (0x2000000 | DAHDI_SIG_EM)
700 #define SIG_FGC_CAMA    (0x4000000 | DAHDI_SIG_EM)
701 #define SIG_FGC_CAMAMF  (0x8000000 | DAHDI_SIG_EM)
702 #define SIG_FXSLS       DAHDI_SIG_FXSLS
703 #define SIG_FXSGS       DAHDI_SIG_FXSGS
704 #define SIG_FXSKS       DAHDI_SIG_FXSKS
705 #define SIG_FXOLS       DAHDI_SIG_FXOLS
706 #define SIG_FXOGS       DAHDI_SIG_FXOGS
707 #define SIG_FXOKS       DAHDI_SIG_FXOKS
708 #define SIG_SF          DAHDI_SIG_SF
709 #define SIG_SFWINK      (0x0100000 | DAHDI_SIG_SF)
710 #define SIG_SF_FEATD    (0x0200000 | DAHDI_SIG_SF)
711 #define SIG_SF_FEATDMF  (0x0400000 | DAHDI_SIG_SF)
712 #define SIG_SF_FEATB    (0x0800000 | DAHDI_SIG_SF)
713 #define SIG_EM_E1       DAHDI_SIG_EM_E1
714
715 /* PRI signaling */
716 #define SIG_PRI         DAHDI_SIG_CLEAR
717 #define SIG_BRI         (0x2000000 | DAHDI_SIG_CLEAR)
718 #define SIG_BRI_PTMP    (0X4000000 | DAHDI_SIG_CLEAR)
719
720 /* SS7 signaling */
721 #define SIG_SS7         (0x1000000 | DAHDI_SIG_CLEAR)
722
723 /* MFC/R2 signaling */
724 #define SIG_MFCR2       DAHDI_SIG_CAS
725
726
727 #define SIG_PRI_LIB_HANDLE_CASES        \
728         SIG_PRI:                                                \
729         case SIG_BRI:                                   \
730         case SIG_BRI_PTMP
731
732 /*!
733  * \internal
734  * \brief Determine if sig_pri handles the signaling.
735  * \since 1.8
736  *
737  * \param signaling Signaling to determine if is for sig_pri.
738  *
739  * \return TRUE if the signaling is for sig_pri.
740  */
741 static inline int dahdi_sig_pri_lib_handles(int signaling)
742 {
743         int handles;
744
745         switch (signaling) {
746         case SIG_PRI_LIB_HANDLE_CASES:
747                 handles = 1;
748                 break;
749         default:
750                 handles = 0;
751                 break;
752         }
753
754         return handles;
755 }
756
757 static inline int dahdi_analog_lib_handles(int signalling, int radio, int oprmode)
758 {
759         switch (signalling) {
760         case SIG_FXOLS:
761         case SIG_FXOGS:
762         case SIG_FXOKS:
763         case SIG_FXSLS:
764         case SIG_FXSGS:
765         case SIG_FXSKS:
766         case SIG_EMWINK:
767         case SIG_EM:
768         case SIG_EM_E1:
769         case SIG_FEATD:
770         case SIG_FEATDMF:
771         case SIG_E911:
772         case SIG_FGC_CAMA:
773         case SIG_FGC_CAMAMF:
774         case SIG_FEATB:
775         case SIG_SFWINK:
776         case SIG_SF:
777         case SIG_SF_FEATD:
778         case SIG_SF_FEATDMF:
779         case SIG_FEATDMF_TA:
780         case SIG_SF_FEATB:
781                 break;
782         default:
783                 /* The rest of the function should cover the remainder of signalling types */
784                 return 0;
785         }
786
787         if (radio) {
788                 return 0;
789         }
790
791         if (oprmode) {
792                 return 0;
793         }
794
795         return 1;
796 }
797
798 #define dahdi_get_index(ast, p, nullok) _dahdi_get_index(ast, p, nullok, __PRETTY_FUNCTION__, __LINE__)
799 int _dahdi_get_index(struct ast_channel *ast, struct dahdi_pvt *p, int nullok, const char *fname, unsigned long line);
800
801 void dahdi_dtmf_detect_disable(struct dahdi_pvt *p);
802 void dahdi_dtmf_detect_enable(struct dahdi_pvt *p);
803
804 void dahdi_ec_enable(struct dahdi_pvt *p);
805 void dahdi_ec_disable(struct dahdi_pvt *p);
806
807 void dahdi_conf_update(struct dahdi_pvt *p);
808 void dahdi_master_slave_link(struct dahdi_pvt *slave, struct dahdi_pvt *master);
809 void dahdi_master_slave_unlink(struct dahdi_pvt *slave, struct dahdi_pvt *master, int needlock);
810
811 /* ------------------------------------------------------------------- */
812
813 #if defined(__cplusplus) || defined(c_plusplus)
814 }
815 #endif
816
817 #endif  /* _ASTERISK_CHAN_DAHDI_H */