diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 7306fb02faef1567a9e55064c392bd8a98d2b26a..f10508d0184e20da42f9689cba4131cb3ca613c7 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -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 */ @@ -546,14 +556,14 @@ struct dahdi_subchannel { * First three states are required for send Ring Pulse Alert Signal */ typedef enum { - MWI_SEND_NULL = 0, - MWI_SEND_SA, - MWI_SEND_SA_WAIT, - MWI_SEND_PAUSE, - MWI_SEND_SPILL, - MWI_SEND_CLEANUP, - MWI_SEND_DONE, -} mwisend_states ; + MWI_SEND_NULL = 0, + MWI_SEND_SA, + MWI_SEND_SA_WAIT, + MWI_SEND_PAUSE, + MWI_SEND_SPILL, + MWI_SEND_CLEANUP, + MWI_SEND_DONE, +} mwisend_states; struct mwisend_info { struct timeval pause; @@ -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,8 +3572,7 @@ 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'; + p->exten[0] = '\0'; ast_debug(1, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n", p->channel, idx, p->subs[SUB_REAL].dfd, p->subs[SUB_CALLWAIT].dfd, p->subs[SUB_THREEWAY].dfd); @@ -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,8 +9725,9 @@ 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; - stringp=dest + 1; + char *stringp; + + stringp = dest + 1; s = strsep(&stringp, "/"); if ((res = sscanf(s, "%d%c%d", &x, &opt, &y)) < 1) { ast_log(LOG_WARNING, "Unable to determine group for data %s\n", (char *)data); @@ -9372,8 +9754,9 @@ static struct ast_channel *dahdi_request(const char *type, int format, void *dat roundrobin = 1; } } else { - char *stringp=NULL; - stringp=dest; + char *stringp; + + stringp = dest; s = strsep(&stringp, "/"); p = iflist; if (!strcasecmp(s, "pseudo")) { @@ -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) { diff --git a/configs/chan_dahdi.conf.sample b/configs/chan_dahdi.conf.sample index fb9d695461bf90d75159eaef10897616517040ed..ba53933570d97946deb3e075e86d802038d8437b 100644 --- a/configs/chan_dahdi.conf.sample +++ b/configs/chan_dahdi.conf.sample @@ -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 ;