channels/chan_dahdi.c
* Added doxygen comments to the major dahdi structures. * Fixed PRI and SS7 using an incorrect string value if the extension delimiter is not present in the Dial() function. * Fixed SS7 not checking if the dialed extension is at least as long as the stripmsd option. * Fixed PRI not handling unknown TON/NPI prefix letters correctly. * Fixed some uninitialized string variables on FXS ports. configs/chan_dahdi.conf.sample * Updated some documentation. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@172400 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
20fafad005
commit
953f62cb29
|
@ -371,6 +371,10 @@ static inline int dahdi_wait_event(int fd)
|
|||
|
||||
struct dahdi_pvt;
|
||||
|
||||
/*!
|
||||
* \brief Configured ring timeout base.
|
||||
* \note Value computed from "ringtimeout" read in from chan_dahdi.conf if it exists.
|
||||
*/
|
||||
static int ringt_base = DEFAULT_RINGT;
|
||||
|
||||
#ifdef HAVE_SS7
|
||||
|
@ -455,17 +459,23 @@ struct dahdi_pri {
|
|||
struct pri *dchans[NUM_DCHANS]; /*!< Actual d-channels */
|
||||
int dchanavail[NUM_DCHANS]; /*!< Whether each channel is available */
|
||||
struct pri *pri; /*!< Currently active D-channel */
|
||||
/*! \brief TRUE if to dump PRI event info (Tested but never set) */
|
||||
int debug;
|
||||
int fds[NUM_DCHANS]; /*!< FD's for d-channels */
|
||||
/*! \brief Value set but not used */
|
||||
int offset;
|
||||
/*! \brief Span number put into user output messages */
|
||||
int span;
|
||||
/*! \brief TRUE if span is being reset/restarted */
|
||||
int resetting;
|
||||
/*! \brief Current position during a reset (-1 if not started) */
|
||||
int resetpos;
|
||||
#ifdef HAVE_PRI_INBANDDISCONNECT
|
||||
unsigned int inbanddisconnect:1; /*!< Should we support inband audio after receiving DISCONNECT? */
|
||||
#endif
|
||||
time_t lastreset; /*!< time when unused channels were last reset */
|
||||
long resetinterval; /*!< Interval (in seconds) for resetting unused channels */
|
||||
/*! \brief ISDN signalling type (SIG_PRI, SIG_BRI, SIG_BRI_PTMP, etc...) */
|
||||
int sig;
|
||||
struct dahdi_pvt *pvts[MAX_CHANNELS]; /*!< Member channel pvt structs */
|
||||
struct dahdi_pvt *crvs; /*!< Member CRV structs */
|
||||
|
@ -576,117 +586,375 @@ static struct dahdi_pvt {
|
|||
int buf_no; /*!< Number of buffers */
|
||||
int buf_policy; /*!< Buffer policy */
|
||||
int sig; /*!< Signalling style */
|
||||
int radio; /*!< radio type */
|
||||
/*!
|
||||
* \brief Nonzero if the signaling type is sent over a radio.
|
||||
* \note Set to a couple of nonzero values but it is only tested like a boolean.
|
||||
*/
|
||||
int radio;
|
||||
int outsigmod; /*!< Outbound Signalling style (modifier) */
|
||||
int oprmode; /*!< "Operator Services" mode */
|
||||
struct dahdi_pvt *oprpeer; /*!< "Operator Services" peer tech_pvt ptr */
|
||||
float cid_rxgain; /*!< "Gain to apply during caller id */
|
||||
/*! \brief Amount of gain to increase during caller id */
|
||||
float cid_rxgain;
|
||||
/*! \brief Rx gain set by chan_dahdi.conf */
|
||||
float rxgain;
|
||||
/*! \brief Tx gain set by chan_dahdi.conf */
|
||||
float txgain;
|
||||
int tonezone; /*!< tone zone for this chan, or -1 for default */
|
||||
struct dahdi_pvt *next; /*!< Next channel in list */
|
||||
struct dahdi_pvt *prev; /*!< Prev channel in list */
|
||||
|
||||
/* flags */
|
||||
|
||||
/*!
|
||||
* \brief TRUE if ADSI (Analog Display Services Interface) available
|
||||
* \note Set from the "adsi" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int adsi:1;
|
||||
/*!
|
||||
* \brief TRUE if we can use a polarity reversal to mark when an outgoing
|
||||
* call is answered by the remote party.
|
||||
* \note Set from the "answeronpolarityswitch" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int answeronpolarityswitch:1;
|
||||
/*!
|
||||
* \brief TRUE if busy detection is enabled.
|
||||
* (Listens for the beep-beep busy pattern.)
|
||||
* \note Set from the "busydetect" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int busydetect:1;
|
||||
/*!
|
||||
* \brief TRUE if call return is enabled.
|
||||
* (*69, if your dialplan doesn't catch this first)
|
||||
* \note Set from the "callreturn" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int callreturn:1;
|
||||
/*!
|
||||
* \brief TRUE if busy extensions will hear the call-waiting tone
|
||||
* and can use hook-flash to switch between callers.
|
||||
* \note Can be disabled by dialing *70.
|
||||
* \note Initialized with the "callwaiting" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int callwaiting:1;
|
||||
/*!
|
||||
* \brief TRUE if send caller ID for Call Waiting
|
||||
* \note Set from the "callwaitingcallerid" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int callwaitingcallerid:1;
|
||||
/*!
|
||||
* \brief TRUE if support for call forwarding enabled.
|
||||
* Dial *72 to enable call forwarding.
|
||||
* Dial *73 to disable call forwarding.
|
||||
* \note Set from the "cancallforward" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int cancallforward:1;
|
||||
/*!
|
||||
* \brief TRUE if support for call parking is enabled.
|
||||
* \note Set from the "canpark" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int canpark:1;
|
||||
unsigned int confirmanswer:1; /*!< Wait for '#' to confirm answer */
|
||||
/*! \brief TRUE if to wait for a DTMF digit to confirm answer */
|
||||
unsigned int confirmanswer:1;
|
||||
/*!
|
||||
* \brief TRUE if the channel is to be destroyed on hangup.
|
||||
* (Used by pseudo channels.)
|
||||
*/
|
||||
unsigned int destroy:1;
|
||||
unsigned int didtdd:1; /*!< flag to say its done it once */
|
||||
/*! \brief TRUE if analog type line dialed no digits in Dial() */
|
||||
unsigned int dialednone:1;
|
||||
/*! \brief TRUE if in the process of dialing digits or sending something. */
|
||||
unsigned int dialing:1;
|
||||
/*! \brief TRUE if the transfer capability of the call is digital. */
|
||||
unsigned int digital:1;
|
||||
/*! \brief TRUE if Do-Not-Disturb is enabled. */
|
||||
unsigned int dnd:1;
|
||||
/*! \brief XXX BOOLEAN Purpose??? */
|
||||
unsigned int echobreak:1;
|
||||
/*!
|
||||
* \brief TRUE if echo cancellation enabled when bridged.
|
||||
* \note Initialized with the "echocancelwhenbridged" value read in from chan_dahdi.conf
|
||||
* \note Disabled if the echo canceller is not setup.
|
||||
*/
|
||||
unsigned int echocanbridged:1;
|
||||
/*! \brief TRUE if echo cancellation is turned on. */
|
||||
unsigned int echocanon:1;
|
||||
unsigned int faxhandled:1; /*!< Has a fax tone already been handled? */
|
||||
/*! \brief TRUE if a fax tone has already been handled. */
|
||||
unsigned int faxhandled:1;
|
||||
/*! \brief TRUE if over a radio and dahdi_read() has been called. */
|
||||
unsigned int firstradio:1;
|
||||
/*!
|
||||
* \brief TRUE if the call will be considered "hung up" on a polarity reversal.
|
||||
* \note Set from the "hanguponpolarityswitch" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int hanguponpolarityswitch:1;
|
||||
/*! \brief TRUE if DTMF detection needs to be done by hardware. */
|
||||
unsigned int hardwaredtmf:1;
|
||||
/*!
|
||||
* \brief TRUE if the outgoing caller ID is blocked/hidden.
|
||||
* \note Caller ID can be disabled by dialing *67.
|
||||
* \note Caller ID can be enabled by dialing *82.
|
||||
* \note Initialized with the "hidecallerid" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int hidecallerid:1;
|
||||
unsigned int hidecalleridname:1; /*!< Hide just the name not the number for legacy PBX use */
|
||||
/*!
|
||||
* \brief TRUE if hide just the name not the number for legacy PBX use.
|
||||
* \note Only applies to PRI channels.
|
||||
* \note Set from the "hidecalleridname" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int hidecalleridname:1;
|
||||
/*! \brief TRUE if DTMF detection is disabled. */
|
||||
unsigned int ignoredtmf:1;
|
||||
unsigned int immediate:1; /*!< Answer before getting digits? */
|
||||
/*!
|
||||
* \brief TRUE if the channel should be answered immediately
|
||||
* without attempting to gather any digits.
|
||||
* \note Set from the "immediate" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int immediate:1;
|
||||
/*! \brief TRUE if in an alarm condition. */
|
||||
unsigned int inalarm:1;
|
||||
unsigned int mate:1; /*!< flag to say its in MATE mode */
|
||||
/*! \brief TRUE if TDD in MATE mode */
|
||||
unsigned int mate:1;
|
||||
/*! \brief TRUE if we originated the call leg. */
|
||||
unsigned int outgoing:1;
|
||||
/* unsigned int overlapdial:1; unused and potentially confusing */
|
||||
/*!
|
||||
* \brief TRUE if busy extensions will hear the call-waiting tone
|
||||
* and can use hook-flash to switch between callers.
|
||||
* \note Set from the "callwaiting" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int permcallwaiting:1;
|
||||
unsigned int permhidecallerid:1; /*!< Whether to hide our outgoing caller ID or not */
|
||||
/*!
|
||||
* \brief TRUE if the outgoing caller ID is blocked/restricted/hidden.
|
||||
* \note Set from the "hidecallerid" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int permhidecallerid:1;
|
||||
/*!
|
||||
* \brief TRUE if PRI congestion/busy indications are sent out-of-band.
|
||||
* \note Set from the "priindication" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int priindication_oob:1;
|
||||
/*!
|
||||
* \brief TRUE if PRI B channels are always exclusively selected.
|
||||
* \note Set from the "priexclusive" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int priexclusive:1;
|
||||
/*!
|
||||
* \brief TRUE if we will pulse dial.
|
||||
* \note Set from the "pulsedial" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int pulse:1;
|
||||
unsigned int pulsedial:1; /*!< whether a pulse dial phone is detected */
|
||||
/*! \brief TRUE if a pulsed digit was detected. (Pulse dial phone detected) */
|
||||
unsigned int pulsedial:1;
|
||||
unsigned int restartpending:1; /*!< flag to ensure counted only once for restart */
|
||||
unsigned int restrictcid:1; /*!< Whether restrict the callerid -> only send ANI */
|
||||
/*!
|
||||
* \brief TRUE if caller ID is restricted.
|
||||
* \note Set but not used. Should be deleted. Redundant with permhidecallerid.
|
||||
* \note Set from the "restrictcid" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int restrictcid:1;
|
||||
/*!
|
||||
* \brief TRUE if three way calling is enabled
|
||||
* \note Set from the "threewaycalling" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int threewaycalling:1;
|
||||
/*!
|
||||
* \brief TRUE if call transfer is enabled
|
||||
* \note For FXS ports (either direct analog or over T1/E1):
|
||||
* Support flash-hook call transfer
|
||||
* \note For digital ports using ISDN PRI protocols:
|
||||
* Support switch-side transfer (called 2BCT, RLT or other names)
|
||||
* \note Set from the "transfer" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int transfer:1;
|
||||
unsigned int use_callerid:1; /*!< Whether or not to use caller id on this channel */
|
||||
unsigned int use_callingpres:1; /*!< Whether to use the callingpres the calling switch sends */
|
||||
/*!
|
||||
* \brief TRUE if caller ID is used on this channel.
|
||||
* \note PRI and SS7 spans will save caller ID from the networking peer.
|
||||
* \note FXS ports will generate the caller ID spill.
|
||||
* \note FXO ports will listen for the caller ID spill.
|
||||
* \note Set from the "usecallerid" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int use_callerid:1;
|
||||
/*!
|
||||
* \brief TRUE if we will use the calling presentation setting
|
||||
* from the Asterisk channel for outgoing calls.
|
||||
* \note Only applies to PRI and SS7 channels.
|
||||
* \note Set from the "usecallingpres" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int use_callingpres:1;
|
||||
/*!
|
||||
* \brief TRUE if distinctive rings are to be detected.
|
||||
* \note For FXO lines
|
||||
* \note Set indirectly from the "usedistinctiveringdetection" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int usedistinctiveringdetection:1;
|
||||
unsigned int dahditrcallerid:1; /*!< should we use the callerid from incoming call on dahdi transfer or not */
|
||||
unsigned int transfertobusy:1; /*!< allow flash-transfers to busy channels */
|
||||
unsigned int mwimonitor_neon:1; /*!< monitor this FXO port for neon type MWI indication from other end */
|
||||
unsigned int mwimonitor_fsk:1; /*!< monitor this FXO port for fsk MWI indication from other end */
|
||||
unsigned int mwimonitor_rpas:1; /*!< monitor this FXO port for rpas precursor to fsk MWI indication */
|
||||
unsigned int mwimonitoractive:1; /*!< an MWI monitor thread is currently active */
|
||||
unsigned int mwisendactive:1; /*!< a MWI message sending thread is active */
|
||||
/* Channel state or unavilability flags */
|
||||
/*!
|
||||
* \brief TRUE if we should use the callerid from incoming call on dahdi transfer.
|
||||
* \note Set from the "useincomingcalleridondahditransfer" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int dahditrcallerid:1;
|
||||
/*!
|
||||
* \brief TRUE if allowed to flash-transfer to busy channels.
|
||||
* \note Set from the "transfertobusy" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int transfertobusy:1;
|
||||
/*!
|
||||
* \brief TRUE if the FXO port monitors for neon type MWI indications from the other end.
|
||||
* \note Set if the "mwimonitor" value read in contains "neon" from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int mwimonitor_neon:1;
|
||||
/*!
|
||||
* \brief TRUE if the FXO port monitors for fsk type MWI indications from the other end.
|
||||
* \note Set if the "mwimonitor" value read in contains "fsk" from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int mwimonitor_fsk:1;
|
||||
/*!
|
||||
* \brief TRUE if the FXO port monitors for rpas precursor to fsk MWI indications from the other end.
|
||||
* \note RPAS - Ring Pulse Alert Signal
|
||||
* \note Set if the "mwimonitor" value read in contains "rpas" from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int mwimonitor_rpas:1;
|
||||
/*! \brief TRUE if an MWI monitor thread is currently active */
|
||||
unsigned int mwimonitoractive:1;
|
||||
/*! \brief TRUE if a MWI message sending thread is active */
|
||||
unsigned int mwisendactive:1;
|
||||
/*!
|
||||
* \brief TRUE if channel is out of reset and ready
|
||||
* \note Set but not used.
|
||||
*/
|
||||
unsigned int inservice:1;
|
||||
/*!
|
||||
* \brief TRUE if the channel is locally blocked.
|
||||
* \note Applies to SS7 channels.
|
||||
*/
|
||||
unsigned int locallyblocked:1;
|
||||
/*!
|
||||
* \brief TRUE if the channel is remotely blocked.
|
||||
* \note Applies to SS7 channels.
|
||||
*/
|
||||
unsigned int remotelyblocked:1;
|
||||
#if defined(HAVE_PRI) || defined(HAVE_SS7)
|
||||
/*!
|
||||
* \brief XXX BOOLEAN Purpose???
|
||||
* \note Applies to SS7 channels.
|
||||
*/
|
||||
unsigned int rlt:1;
|
||||
/*! \brief TRUE if channel is alerting/ringing */
|
||||
unsigned int alerting:1;
|
||||
/*! \brief TRUE if the call has already gone/hungup */
|
||||
unsigned int alreadyhungup:1;
|
||||
/*!
|
||||
* \brief TRUE if this is an idle call
|
||||
* \note Applies to PRI channels.
|
||||
*/
|
||||
unsigned int isidlecall:1;
|
||||
/*!
|
||||
* \brief TRUE if call is in a proceeding state.
|
||||
* The call has started working its way through the network.
|
||||
*/
|
||||
unsigned int proceeding:1;
|
||||
/*! \brief TRUE if the call has seen progress through the network. */
|
||||
unsigned int progress:1;
|
||||
/*!
|
||||
* \brief TRUE if this channel is being reset/restarted
|
||||
* \note Applies to PRI channels.
|
||||
*/
|
||||
unsigned int resetting:1;
|
||||
/*!
|
||||
* \brief TRUE if this channel has received a SETUP_ACKNOWLEDGE
|
||||
* \note Applies to PRI channels.
|
||||
*/
|
||||
unsigned int setup_ack:1;
|
||||
#endif
|
||||
unsigned int use_smdi:1; /* Whether to use SMDI on this channel */
|
||||
/*!
|
||||
* \brief TRUE if SMDI (Simplified Message Desk Interface) is enabled
|
||||
* \note Set from the "usesmdi" value read in from chan_dahdi.conf
|
||||
*/
|
||||
unsigned int use_smdi:1;
|
||||
struct mwisend_info mwisend_data;
|
||||
struct ast_smdi_interface *smdi_iface; /* The serial port to listen for SMDI data on */
|
||||
/*! \brief The serial port to listen for SMDI data on */
|
||||
struct ast_smdi_interface *smdi_iface;
|
||||
|
||||
/*! \brief Distinctive Ring data */
|
||||
struct dahdi_distRings drings;
|
||||
|
||||
/*!
|
||||
* \brief The configured context for incoming calls.
|
||||
* \note The "context" string read in from chan_dahdi.conf
|
||||
*/
|
||||
char context[AST_MAX_CONTEXT];
|
||||
/*!
|
||||
* \brief Saved context string.
|
||||
*/
|
||||
char defcontext[AST_MAX_CONTEXT];
|
||||
/*! \brief Extension to use in the dialplan. */
|
||||
char exten[AST_MAX_EXTENSION];
|
||||
/*!
|
||||
* \brief Language configured for calls.
|
||||
* \note The "language" string read in from chan_dahdi.conf
|
||||
*/
|
||||
char language[MAX_LANGUAGE];
|
||||
/*!
|
||||
* \brief The configured music-on-hold class to use for calls.
|
||||
* \note The "musicclass" or "mohinterpret" or "musiconhold" string read in from chan_dahdi.conf
|
||||
*/
|
||||
char mohinterpret[MAX_MUSICCLASS];
|
||||
/*!
|
||||
* \brief Sugggested music-on-hold class for peer channel to use for calls.
|
||||
* \note The "mohsuggest" string read in from chan_dahdi.conf
|
||||
*/
|
||||
char mohsuggest[MAX_MUSICCLASS];
|
||||
char parkinglot[AST_MAX_EXTENSION]; /*!< Parking lot for this channel */
|
||||
#if defined(PRI_ANI) || defined(HAVE_SS7)
|
||||
/*! \brief Automatic Number Identification number (Alternate PRI caller ID number) */
|
||||
char cid_ani[AST_MAX_EXTENSION];
|
||||
#endif
|
||||
/*! \brief Automatic Number Identification code from PRI */
|
||||
int cid_ani2;
|
||||
/*! \brief Caller ID number from an incoming call. */
|
||||
char cid_num[AST_MAX_EXTENSION];
|
||||
int cid_ton; /*!< Type Of Number (TON) */
|
||||
/*! \brief Caller ID Q.931 TON/NPI field values. Set by PRI. Zero otherwise. */
|
||||
int cid_ton;
|
||||
/*! \brief Caller ID name from an incoming call. */
|
||||
char cid_name[AST_MAX_EXTENSION];
|
||||
/*! \brief Last Caller ID number from an incoming call. */
|
||||
char lastcid_num[AST_MAX_EXTENSION];
|
||||
/*! \brief Last Caller ID name from an incoming call. */
|
||||
char lastcid_name[AST_MAX_EXTENSION];
|
||||
char *origcid_num; /*!< malloced original callerid */
|
||||
char *origcid_name; /*!< malloced original callerid */
|
||||
/*! \brief Call waiting number. */
|
||||
char callwait_num[AST_MAX_EXTENSION];
|
||||
/*! \brief Call waiting name. */
|
||||
char callwait_name[AST_MAX_EXTENSION];
|
||||
/*! \brief Redirecting Directory Number Information Service (RDNIS) number */
|
||||
char rdnis[AST_MAX_EXTENSION];
|
||||
/*! \brief Dialed Number Identifier */
|
||||
char dnid[AST_MAX_EXTENSION];
|
||||
/*!
|
||||
* \brief Bitmapped groups this belongs to.
|
||||
* \note The "group" bitmapped group string read in from chan_dahdi.conf
|
||||
*/
|
||||
ast_group_t group;
|
||||
/*! \brief Active PCM encoding format: DAHDI_LAW_ALAW or DAHDI_LAW_MULAW */
|
||||
int law;
|
||||
int confno; /*!< Our conference */
|
||||
int confusers; /*!< Who is using our conference */
|
||||
int propconfno; /*!< Propagated conference number */
|
||||
/*!
|
||||
* \brief Bitmapped call groups this belongs to.
|
||||
* \note The "callgroup" bitmapped group string read in from chan_dahdi.conf
|
||||
*/
|
||||
ast_group_t callgroup;
|
||||
/*!
|
||||
* \brief Bitmapped pickup groups this belongs to.
|
||||
* \note The "pickupgroup" bitmapped group string read in from chan_dahdi.conf
|
||||
*/
|
||||
ast_group_t pickupgroup;
|
||||
/*!
|
||||
* \brief Channel variable list with associated values to set when a channel is created.
|
||||
* \note The "setvar" strings read in from chan_dahdi.conf
|
||||
*/
|
||||
struct ast_variable *vars;
|
||||
int channel; /*!< Channel Number or CRV */
|
||||
int span; /*!< Span number */
|
||||
|
@ -696,41 +964,96 @@ static struct dahdi_pvt {
|
|||
int callingpres; /*!< The value of calling presentation that we're going to use when placing a PRI call */
|
||||
int callwaitingrepeat; /*!< How many samples to wait before repeating call waiting */
|
||||
int cidcwexpire; /*!< When to expire our muting for CID/CW */
|
||||
/*! \brief Analog caller ID waveform sample buffer */
|
||||
unsigned char *cidspill;
|
||||
/*! \brief Position in the cidspill buffer to send out next. */
|
||||
int cidpos;
|
||||
/*! \brief Length of the cidspill buffer containing samples. */
|
||||
int cidlen;
|
||||
/*! \brief Ring timeout timer?? */
|
||||
int ringt;
|
||||
/*!
|
||||
* \brief Ring timeout base.
|
||||
* \note Value computed indirectly from "ringtimeout" read in from chan_dahdi.conf
|
||||
*/
|
||||
int ringt_base;
|
||||
/*!
|
||||
* \brief Number of most significant digits/characters to strip from the dialed number.
|
||||
* \note Feature is deprecated. Use dialplan logic.
|
||||
* \note The characters are stripped before the PRI TON/NPI prefix
|
||||
* characters are processed.
|
||||
*/
|
||||
int stripmsd;
|
||||
/*! \brief BOOLEAN. XXX Meaning what?? */
|
||||
int callwaitcas;
|
||||
/*! \brief Number of call waiting rings. */
|
||||
int callwaitrings;
|
||||
/*! \brief Echo cancel parameters. */
|
||||
struct {
|
||||
struct dahdi_echocanparams head;
|
||||
struct dahdi_echocanparam params[DAHDI_MAX_ECHOCANPARAMS];
|
||||
} echocancel;
|
||||
/*!
|
||||
* \brief Echo training time. 0 = disabled
|
||||
* \note Set from the "echotraining" value read in from chan_dahdi.conf
|
||||
*/
|
||||
int echotraining;
|
||||
/*! \brief Filled with 'w'. XXX Purpose?? */
|
||||
char echorest[20];
|
||||
/*!
|
||||
* \brief Number of times to see "busy" tone before hanging up.
|
||||
* \note Set from the "busycount" value read in from chan_dahdi.conf
|
||||
*/
|
||||
int busycount;
|
||||
/*!
|
||||
* \brief Length of "busy" tone on time.
|
||||
* \note Set from the "busypattern" value read in from chan_dahdi.conf
|
||||
*/
|
||||
int busy_tonelength;
|
||||
/*!
|
||||
* \brief Length of "busy" tone off time.
|
||||
* \note Set from the "busypattern" value read in from chan_dahdi.conf
|
||||
*/
|
||||
int busy_quietlength;
|
||||
/*!
|
||||
* \brief Bitmapped call progress detection flags. CALLPROGRESS_xxx values.
|
||||
* \note Bits set from the "callprogress" and "faxdetect" values read in from chan_dahdi.conf
|
||||
*/
|
||||
int callprogress;
|
||||
/*!
|
||||
* \brief Number of milliseconds to wait for dialtone.
|
||||
* \note Set from the "waitfordialtone" value read in from chan_dahdi.conf
|
||||
*/
|
||||
int waitfordialtone;
|
||||
struct timeval waitingfordt; /*!< Time we started waiting for dialtone */
|
||||
struct timeval flashtime; /*!< Last flash-hook time */
|
||||
/*! \brief Opaque DSP configuration structure. */
|
||||
struct ast_dsp *dsp;
|
||||
int cref; /*!< Call reference number */
|
||||
//int cref; /*!< Call reference number (Not used) */
|
||||
/*! \brief DAHDI dial operation command struct for ioctl() call. */
|
||||
struct dahdi_dialoperation dop;
|
||||
int whichwink; /*!< SIG_FEATDMF_TA Which wink are we on? */
|
||||
/*! \brief Second part of SIG_FEATDMF_TA wink operation. */
|
||||
char finaldial[64];
|
||||
char accountcode[AST_MAX_ACCOUNT_CODE]; /*!< Account code */
|
||||
int amaflags; /*!< AMA Flags */
|
||||
struct tdd_state *tdd; /*!< TDD flag */
|
||||
/*! \brief Accumulated call forwarding number. */
|
||||
char call_forward[AST_MAX_EXTENSION];
|
||||
/*!
|
||||
* \brief Voice mailbox location.
|
||||
* \note Set from the "mailbox" string read in from chan_dahdi.conf
|
||||
*/
|
||||
char mailbox[AST_MAX_EXTENSION];
|
||||
/*! \brief Opaque event subscription parameters for message waiting indication support. */
|
||||
struct ast_event_sub *mwi_event_sub;
|
||||
/*! \brief Delayed dialing for E911. Overlap digits for ISDN. */
|
||||
char dialdest[256];
|
||||
/*! \brief Time the interface went on-hook. */
|
||||
int onhooktime;
|
||||
/*! \brief TRUE if the FXS port is off-hook */
|
||||
int fxsoffhookstate;
|
||||
/*! \brief -1 = unknown, 0 = no messages, 1 = new messages available */
|
||||
int msgstate;
|
||||
#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
|
||||
struct dahdi_vmwi_info mwisend_setting; /*!< Which VMWI methods to use */
|
||||
|
@ -740,22 +1063,42 @@ static struct dahdi_pvt {
|
|||
int distinctivering; /*!< Which distinctivering to use */
|
||||
int cidrings; /*!< Which ring to deliver CID on */
|
||||
int dtmfrelax; /*!< whether to run in relaxed DTMF mode */
|
||||
/*! \brief Holding place for event injected from outside normal operation. */
|
||||
int fake_event;
|
||||
/*!
|
||||
* \brief Minimal time period (ms) between the answer polarity
|
||||
* switch and hangup polarity switch.
|
||||
*/
|
||||
int polarityonanswerdelay;
|
||||
/*! \brief Start delay time if polarityonanswerdelay is nonzero. */
|
||||
struct timeval polaritydelaytv;
|
||||
/*!
|
||||
* \brief Send caller ID after this many rings.
|
||||
* \note Set from the "sendcalleridafter" value read in from chan_dahdi.conf
|
||||
*/
|
||||
int sendcalleridafter;
|
||||
#ifdef HAVE_PRI
|
||||
/*! \brief DAHDI PRI control parameters */
|
||||
struct dahdi_pri *pri;
|
||||
/*! \brief XXX Purpose??? */
|
||||
struct dahdi_pvt *bearer;
|
||||
/*! \brief XXX Purpose??? */
|
||||
struct dahdi_pvt *realcall;
|
||||
/*! \brief Opaque libpri call control structure */
|
||||
q931_call *call;
|
||||
/*! \brief Channel number in span. */
|
||||
int prioffset;
|
||||
/*! \brief Logical span number within trunk group */
|
||||
int logicalspan;
|
||||
#endif
|
||||
/*! \brief Current line interface polarity. POLARITY_IDLE, POLARITY_REV */
|
||||
int polarity;
|
||||
/*! \brief DSP feature flags: DSP_FEATURE_xxx */
|
||||
int dsp_features;
|
||||
#ifdef HAVE_SS7
|
||||
/*! \brief SS7 control parameters */
|
||||
struct dahdi_ss7 *ss7;
|
||||
/*! \brief Opaque libss7 call control structure */
|
||||
struct isup_call *ss7call;
|
||||
char charge_number[50];
|
||||
char gen_add_number[50];
|
||||
|
@ -782,7 +1125,9 @@ static struct dahdi_pvt {
|
|||
unsigned int dpc; /*!< CIC's DPC */
|
||||
unsigned int loopedback:1;
|
||||
#endif
|
||||
/*! \brief DTMF digit in progress. 0 when no digit in progress. */
|
||||
char begindigit;
|
||||
/*! \brief TRUE if confrence is muted. */
|
||||
int muting;
|
||||
} *iflist = NULL, *ifend = NULL;
|
||||
|
||||
|
@ -808,6 +1153,10 @@ struct dahdi_chan_conf {
|
|||
struct dahdi_params timing;
|
||||
int is_sig_auto; /*!< Use channel signalling from DAHDI? */
|
||||
|
||||
/*!
|
||||
* \brief The serial port to listen for SMDI data on
|
||||
* \note Set from the "smdiport" string read in from chan_dahdi.conf
|
||||
*/
|
||||
char smdi_port[SMDI_MAX_FILENAME_LEN];
|
||||
};
|
||||
|
||||
|
@ -2481,10 +2830,16 @@ static int dahdi_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
const char *send_far = NULL;
|
||||
|
||||
c = strchr(dest, '/');
|
||||
if (c)
|
||||
if (c) {
|
||||
c++;
|
||||
else
|
||||
c = dest;
|
||||
} else {
|
||||
c = "";
|
||||
}
|
||||
if (strlen(c) < p->stripmsd) {
|
||||
ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
|
||||
ast_mutex_unlock(&p->lock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!p->hidecallerid) {
|
||||
l = ast->cid.cid_num;
|
||||
|
@ -2608,14 +2963,14 @@ static int dahdi_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
int redirect_reason;
|
||||
|
||||
c = strchr(dest, '/');
|
||||
if (c)
|
||||
if (c) {
|
||||
c++;
|
||||
else
|
||||
c = dest;
|
||||
} else {
|
||||
c = "";
|
||||
}
|
||||
|
||||
l = NULL;
|
||||
n = NULL;
|
||||
|
||||
if (!p->hidecallerid) {
|
||||
l = ast->cid.cid_num;
|
||||
if (!p->hidecalleridname) {
|
||||
|
@ -2749,8 +3104,11 @@ static int dahdi_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
pridialplan = PRI_NPI_RESERVED | (pridialplan & 0xf0);
|
||||
break;
|
||||
default:
|
||||
if (isalpha(*c))
|
||||
ast_log(LOG_WARNING, "Unrecognized pridialplan %s modifier: %c\n", *c > 'Z' ? "NPI" : "TON", *c);
|
||||
if (isalpha(c[p->stripmsd])) {
|
||||
ast_log(LOG_WARNING, "Unrecognized pridialplan %s modifier: %c\n",
|
||||
c[p->stripmsd] > 'Z' ? "NPI" : "TON", c[p->stripmsd]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
c++;
|
||||
}
|
||||
|
@ -2819,8 +3177,12 @@ static int dahdi_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
prilocaldialplan = PRI_NPI_RESERVED | (prilocaldialplan & 0xf0);
|
||||
break;
|
||||
default:
|
||||
if (isalpha(*l))
|
||||
ast_log(LOG_WARNING, "Unrecognized prilocaldialplan %s modifier: %c\n", *c > 'Z' ? "NPI" : "TON", *c);
|
||||
if (isalpha(*l)) {
|
||||
ast_log(LOG_WARNING,
|
||||
"Unrecognized prilocaldialplan %s modifier: %c\n",
|
||||
*l > 'Z' ? "NPI" : "TON", *l);
|
||||
}
|
||||
break;
|
||||
}
|
||||
l++;
|
||||
}
|
||||
|
@ -3210,7 +3572,6 @@ static int dahdi_hangup(struct ast_channel *ast)
|
|||
}
|
||||
if (p->dsp)
|
||||
ast_dsp_set_digitmode(p->dsp, DSP_DIGITMODE_DTMF | p->dtmfrelax);
|
||||
if (p->exten)
|
||||
p->exten[0] = '\0';
|
||||
|
||||
ast_debug(1, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
|
||||
|
@ -3697,7 +4058,8 @@ static int dahdi_setoption(struct ast_channel *chan, int option, void *data, int
|
|||
dahdi_disable_ec(p);
|
||||
/* otherwise, turn it on */
|
||||
if (!p->didtdd) { /* if havent done it yet */
|
||||
unsigned char mybuf[41000], *buf;
|
||||
unsigned char mybuf[41000];/*! \todo XXX This is an abuse of the stack!! */
|
||||
unsigned char *buf;
|
||||
int size, res, fd, len;
|
||||
struct pollfd fds[1];
|
||||
|
||||
|
@ -4427,7 +4789,7 @@ static void dahdi_handle_dtmfup(struct ast_channel *ast, int idx, struct ast_fra
|
|||
} else if (f->subclass == 'f') {
|
||||
/* Fax tone -- Handle and return NULL */
|
||||
if ((p->callprogress & CALLPROGRESS_FAX) && !p->faxhandled) {
|
||||
p->faxhandled++;
|
||||
p->faxhandled = 1;
|
||||
if (strcmp(ast->exten, "fax")) {
|
||||
const char *target_context = S_OR(ast->macrocontext, ast->context);
|
||||
|
||||
|
@ -5034,14 +5396,16 @@ static struct ast_frame *dahdi_handle_event(struct ast_channel *ast)
|
|||
}
|
||||
p->subs[SUB_REAL].needunhold = 1;
|
||||
} else if (!p->subs[SUB_THREEWAY].owner) {
|
||||
char cid_num[256];
|
||||
char cid_name[256];
|
||||
|
||||
if (!p->threewaycalling) {
|
||||
/* Just send a flash if no 3-way calling */
|
||||
p->subs[SUB_REAL].needflash = 1;
|
||||
goto winkflashdone;
|
||||
} else if (!check_for_conference(p)) {
|
||||
char cid_num[256];
|
||||
char cid_name[256];
|
||||
|
||||
cid_num[0] = 0;
|
||||
cid_name[0] = 0;
|
||||
if (p->dahditrcallerid && p->owner) {
|
||||
if (p->owner->cid.cid_num)
|
||||
ast_copy_string(cid_num, p->owner->cid.cid_num, sizeof(cid_num));
|
||||
|
@ -7178,7 +7542,7 @@ static void *ss_thread(void *data)
|
|||
|
||||
/* We must have a ring by now, so, if configured, lets try to listen for
|
||||
* distinctive ringing */
|
||||
if (p->usedistinctiveringdetection == 1) {
|
||||
if (p->usedistinctiveringdetection) {
|
||||
len = 0;
|
||||
distMatches = 0;
|
||||
/* Clear the current ring data array so we dont have old data in it. */
|
||||
|
@ -7453,7 +7817,7 @@ static void *ss_thread(void *data)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (p->usedistinctiveringdetection == 1) {
|
||||
if (p->usedistinctiveringdetection) {
|
||||
/* this only shows up if you have n of the dring patterns filled in */
|
||||
ast_verb(3, "Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]);
|
||||
|
||||
|
@ -9332,6 +9696,23 @@ static struct ast_channel *dahdi_request(const char *type, int format, void *dat
|
|||
int channelmatched = 0;
|
||||
int groupmatched = 0;
|
||||
|
||||
/*
|
||||
* data is ---v
|
||||
* Dial(DAHDI/pseudo[/extension])
|
||||
* Dial(DAHDI/<channel#>[c|r<cadance#>|d][/extension])
|
||||
* Dial(DAHDI/<trunk_group#>:<crv#>[c|r<cadance#>|d][/extension])
|
||||
* Dial(DAHDI/(g|G|r|R)<group#(0-63)>[c|r<cadance#>|d][/extension])
|
||||
*
|
||||
* g - channel group allocation search forward
|
||||
* G - channel group allocation search backward
|
||||
* r - channel group allocation round robin search forward
|
||||
* R - channel group allocation round robin search backward
|
||||
*
|
||||
* c - Wait for DTMF digit to confirm answer
|
||||
* r<cadance#> - Set distintive ring cadance number
|
||||
* d - Force bearer capability for ISDN/SS7 call to digital.
|
||||
*/
|
||||
|
||||
/* Assume we're locking the iflock */
|
||||
lock = &iflock;
|
||||
start = iflist;
|
||||
|
@ -9344,7 +9725,8 @@ static struct ast_channel *dahdi_request(const char *type, int format, void *dat
|
|||
}
|
||||
if (toupper(dest[0]) == 'G' || toupper(dest[0])=='R') {
|
||||
/* Retrieve the group number */
|
||||
char *stringp=NULL;
|
||||
char *stringp;
|
||||
|
||||
stringp = dest + 1;
|
||||
s = strsep(&stringp, "/");
|
||||
if ((res = sscanf(s, "%d%c%d", &x, &opt, &y)) < 1) {
|
||||
|
@ -9372,7 +9754,8 @@ static struct ast_channel *dahdi_request(const char *type, int format, void *dat
|
|||
roundrobin = 1;
|
||||
}
|
||||
} else {
|
||||
char *stringp=NULL;
|
||||
char *stringp;
|
||||
|
||||
stringp = dest;
|
||||
s = strsep(&stringp, "/");
|
||||
p = iflist;
|
||||
|
@ -11999,7 +12382,7 @@ static char *handle_pri_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_a
|
|||
}
|
||||
span = atoi(a->argv[5]);
|
||||
if ((span < 1) || (span > NUM_SPANS)) {
|
||||
ast_cli(a->fd, "Invalid span %s. Should be a number %d to %d\n", a->argv[4], 1, NUM_SPANS);
|
||||
ast_cli(a->fd, "Invalid span %s. Should be a number %d to %d\n", a->argv[5], 1, NUM_SPANS);
|
||||
return CLI_SUCCESS;
|
||||
}
|
||||
if (!pris[span-1].pri) {
|
||||
|
|
|
@ -415,12 +415,14 @@ callwaiting=yes
|
|||
; Whether or not restrict outgoing caller ID (will be sent as ANI only, not
|
||||
; available for the user)
|
||||
; Mostly use with FXS ports
|
||||
; Does nothing. Use hidecallerid instead.
|
||||
;
|
||||
;restrictcid=no
|
||||
;
|
||||
; Whether or not use the caller ID presentation for the outgoing call that the
|
||||
; calling switch is sending.
|
||||
; See README.callingpres. FIXME: file no longer exists.
|
||||
; Whether or not to use the caller ID presentation from the Asterisk channel
|
||||
; for outgoing calls.
|
||||
; See dialplan function CALLERID(pres) for more information.
|
||||
; Only applies to PRI and SS7 channels.
|
||||
;
|
||||
usecallingpres=yes
|
||||
;
|
||||
|
|
Reference in New Issue