diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 8897bb6954..36d2c08110 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -1645,6 +1645,7 @@ static int my_callwait(void *pvt)
static int my_send_callerid(void *pvt, int cwcid, struct ast_party_caller *caller)
{
struct dahdi_pvt *p = pvt;
+ struct analog_pvt *analog_p = p->sig_pvt;
ast_debug(2, "Starting cid spill\n");
@@ -1656,13 +1657,20 @@ static int my_send_callerid(void *pvt, int cwcid, struct ast_party_caller *calle
if ((p->cidspill = ast_malloc(MAX_CALLERID_SIZE))) {
int pres = ast_party_id_presentation(&caller->id);
if (cwcid == 0) {
+ /* Some CPE support additional parameters for on-hook Caller*ID,
+ * such as redirecting reason and call qualifier, so send those
+ * if available.
+ * I don't know of any CPE that supports this for Call Waiting (unfortunately),
+ * so don't send those for call waiting as that will just lengthen the CID spill
+ * for no good reason.
+ */
p->cidlen = ast_callerid_full_generate(p->cidspill,
caller->id.name.str,
caller->id.number.str,
NULL,
- -1,
+ analog_p->redirecting_reason,
pres,
- 0,
+ analog_p->call_qualifier,
CID_TYPE_MDMF,
AST_LAW(p));
} else {
diff --git a/channels/sig_analog.c b/channels/sig_analog.c
index 8d5ccd64fc..9addccbb89 100644
--- a/channels/sig_analog.c
+++ b/channels/sig_analog.c
@@ -1073,6 +1073,8 @@ int analog_call(struct analog_pvt *p, struct ast_channel *ast, const char *rdest
}
}
+
+ /* Name and Number */
n = ast_channel_connected(ast)->id.name.valid ? ast_channel_connected(ast)->id.name.str : NULL;
l = ast_channel_connected(ast)->id.number.valid ? ast_channel_connected(ast)->id.number.str : NULL;
if (l) {
@@ -1087,12 +1089,25 @@ int analog_call(struct analog_pvt *p, struct ast_channel *ast, const char *rdest
}
if (p->use_callerid) {
+ const char *qual_var;
+
+ /* Caller ID Name and Number */
p->caller.id.name.str = p->lastcid_name;
p->caller.id.number.str = p->lastcid_num;
p->caller.id.name.valid = ast_channel_connected(ast)->id.name.valid;
p->caller.id.number.valid = ast_channel_connected(ast)->id.number.valid;
p->caller.id.name.presentation = ast_channel_connected(ast)->id.name.presentation;
p->caller.id.number.presentation = ast_channel_connected(ast)->id.number.presentation;
+
+ /* Redirecting Reason */
+ p->redirecting_reason = ast_channel_redirecting(ast)->from.number.valid ? ast_channel_redirecting(ast)->reason.code : -1;
+
+ /* Call Qualifier */
+ ast_channel_lock(ast);
+ /* XXX In the future, we may want to make this a CALLERID or CHANNEL property and fetch it from there. */
+ qual_var = pbx_builtin_getvar_helper(ast, "CALL_QUALIFIER");
+ p->call_qualifier = ast_true(qual_var) ? 1 : 0;
+ ast_channel_unlock(ast);
}
ast_setstate(ast, AST_STATE_RINGING);
diff --git a/channels/sig_analog.h b/channels/sig_analog.h
index 07e1cdd2aa..690326bfda 100644
--- a/channels/sig_analog.h
+++ b/channels/sig_analog.h
@@ -342,12 +342,15 @@ struct analog_pvt {
* gives a positive reply.
*/
unsigned int callwaitcas:1;
+ unsigned int call_qualifier:1; /*!< Call qualifier delivery */
char callwait_num[AST_MAX_EXTENSION];
char callwait_name[AST_MAX_EXTENSION];
char lastcid_num[AST_MAX_EXTENSION];
char lastcid_name[AST_MAX_EXTENSION];
struct ast_party_caller caller;
+ int redirecting_reason; /*!< Redirecting reason */
+
int cidrings; /*!< Which ring to deliver CID on */
char echorest[20];
int polarity;
diff --git a/configs/samples/chan_dahdi.conf.sample b/configs/samples/chan_dahdi.conf.sample
index c54f482566..2dadb31af9 100644
--- a/configs/samples/chan_dahdi.conf.sample
+++ b/configs/samples/chan_dahdi.conf.sample
@@ -572,6 +572,15 @@ context=public
;
usecallerid=yes
;
+; NOTE: If the CALL_QUALIFIER variable on the channel is set to 1,
+; the Stentor Call Qualifier parameter will be sent for Caller ID spills
+; using the Multiple Data Message Format (MDMF).
+; This is used by capable Caller ID units to activate the
+; "LDC" (Long Distance Call) indicator.
+; This variable is not automatically set anywhere. You are responsible
+; for setting it in the dialplan if you want to activate the indicator,
+; and you must have compatible CPE.
+;
; Type of caller ID signalling in use
; bell = bell202 as used in US (default)
; v23 = v23 as used in the UK
diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c
index 448f54696d..7ecf9f9c6e 100644
--- a/funcs/func_callerid.c
+++ b/funcs/func_callerid.c
@@ -182,6 +182,21 @@
Number Unavailable.
+
+
+ This is a special Caller ID-related variable
+ that can be used to enable sending the Call Qualifier
+ parameter in MDMF (Multiple Data Message Format)
+ Caller ID spills.
+ This variable is not automatically set by Asterisk.
+ You are responsible for setting it if/when needed.
+ Supporting Caller ID units will display the LDC
+ (Long Distance Call) indicator when they receive this parameter.
+ This option must be used with a channel driver
+ that allows Asterisk to generate the Caller ID spill,
+ which currently only includes chan_dahdi.
+
+