diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 9ce0d3ccd0154679deb6e3f5943999690ef9f5c3..f34795f99f2f577a9e821b25bf2cce96b1f7fed0 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -2848,6 +2848,9 @@ static void my_set_callerid(void *pvt, const struct ast_party_caller *caller) } p->cid_ton = caller->id.number_type; p->callingpres = caller->id.number_presentation; + if (caller->id.tag) { + ast_copy_string(p->cid_tag, caller->id.tag, sizeof(p->cid_tag)); + } ast_copy_string(p->cid_ani, S_OR(caller->ani, ""), sizeof(p->cid_ani)); p->cid_ani2 = caller->ani2; } @@ -5805,6 +5808,7 @@ static int dahdi_hangup(struct ast_channel *ast) p->subs[SUB_REAL].owner = NULL; p->subs[SUB_REAL].needbusy = 0; p->owner = NULL; + p->cid_tag[0] = '\0'; p->ringt = 0;/* Probably not used in this mode. Reset anyway. */ p->distinctivering = 0;/* Probably not used in this mode. Reset anyway. */ p->confirmanswer = 0;/* Probably not used in this mode. Reset anyway. */ @@ -11913,6 +11917,8 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, pris[span].pri.aoc_passthrough_flag = conf->pri.pri.aoc_passthrough_flag; pris[span].pri.aoce_delayhangup = conf->pri.pri.aoce_delayhangup; #endif /* defined(HAVE_PRI_AOC_EVENTS) */ + pris[span].pri.append_msn_to_user_tag = conf->pri.pri.append_msn_to_user_tag; + ast_copy_string(pris[span].pri.initial_user_tag, conf->chan.cid_tag, sizeof(pris[span].pri.initial_user_tag)); ast_copy_string(pris[span].pri.msn_list, conf->pri.pri.msn_list, sizeof(pris[span].pri.msn_list)); #if defined(HAVE_PRI_MWI) ast_copy_string(pris[span].pri.mwi_mailboxes, @@ -12156,7 +12162,14 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, tmp->cid_num[0] = '\0'; tmp->cid_name[0] = '\0'; } - ast_copy_string(tmp->cid_tag, conf->chan.cid_tag, sizeof(tmp->cid_tag)); +#if defined(HAVE_PRI) + if (dahdi_sig_pri_lib_handles(tmp->sig)) { + tmp->cid_tag[0] = '\0'; + } else +#endif /* defined(HAVE_PRI) */ + { + ast_copy_string(tmp->cid_tag, conf->chan.cid_tag, sizeof(tmp->cid_tag)); + } tmp->cid_subaddr[0] = '\0'; ast_copy_string(tmp->mailbox, conf->chan.mailbox, sizeof(tmp->mailbox)); if (channel != CHAN_PSEUDO && !ast_strlen_zero(tmp->mailbox)) { @@ -16760,6 +16773,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct ast_copy_string(confp->pri.pri.mwi_mailboxes, v->value, sizeof(confp->pri.pri.mwi_mailboxes)); #endif /* defined(HAVE_PRI_MWI) */ + } else if (!strcasecmp(v->name, "append_msn_to_cid_tag")) { + confp->pri.pri.append_msn_to_user_tag = ast_true(v->value); #endif /* HAVE_PRI */ #if defined(HAVE_SS7) } else if (!strcasecmp(v->name, "ss7type")) { diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 5af0974eba28c5c7880d684c06268fb02ccb64a3..2a0c8eff528068d060f94ce24a5ebcb6b54c926e 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -216,6 +216,7 @@ static void sig_pri_set_caller_id(struct sig_pri_chan *p) } caller.id.number_type = p->cid_ton; caller.id.number_presentation = p->callingpres; + caller.id.tag = p->user_tag; caller.ani = p->cid_ani; caller.ani2 = p->cid_ani2; p->calls->set_callerid(p->chan_pvt, &caller); @@ -1146,6 +1147,7 @@ static int pri_fixup_principle(struct sig_pri_pri *pri, int principle, q931_call new_chan->aoc_s_request_invoke_id = old_chan->aoc_s_request_invoke_id; new_chan->aoc_e = old_chan->aoc_e; #endif /* defined(HAVE_PRI_AOC_EVENTS) */ + strcpy(new_chan->user_tag, old_chan->user_tag); if (new_chan->no_b_channel) { /* Copy the real channel configuration to the no B channel interface. */ @@ -1490,6 +1492,17 @@ static void *pri_ss_thread(void *data) ast_free(chan->cid.cid_dnid); } chan->cid.cid_dnid = ast_strdup(exten); + + if (p->pri->append_msn_to_user_tag && p->pri->nodetype != PRI_NETWORK) { + /* + * Update the user tag for party id's from this device for this call + * now that we have a complete MSN from the network. + */ + snprintf(p->user_tag, sizeof(p->user_tag), "%s_%s", p->pri->initial_user_tag, + exten); + ast_free(chan->cid.cid_tag); + chan->cid.cid_tag = ast_strdup(p->user_tag); + } } sig_pri_play_tone(p, -1); if (ast_exists_extension(chan, chan->context, exten, 1, p->cid_num)) { @@ -3461,6 +3474,7 @@ static void sig_pri_handle_subcmds(struct sig_pri_pri *pri, int chanpos, int eve ast_party_connected_line_init(&ast_connected); sig_pri_party_id_convert(&ast_connected.id, &subcmd->u.connected_line.id, pri); + ast_connected.id.tag = ast_strdup(pri->pvts[chanpos]->user_tag); caller_id_update = 0; if (ast_connected.id.name) { @@ -3517,6 +3531,8 @@ static void sig_pri_handle_subcmds(struct sig_pri_pri *pri, int chanpos, int eve if (owner) { sig_pri_redirecting_convert(&ast_redirecting, &subcmd->u.redirecting, &owner->redirecting, pri); + ast_redirecting.from.tag = ast_strdup(pri->pvts[chanpos]->user_tag); + ast_redirecting.to.tag = ast_strdup(pri->pvts[chanpos]->user_tag); /*! \todo XXX Original called data can be put in a channel data store that is inherited. */ @@ -3568,6 +3584,8 @@ static void sig_pri_handle_subcmds(struct sig_pri_pri *pri, int chanpos, int eve } sig_pri_redirecting_convert(&ast_redirecting, &pri_deflection, &owner->redirecting, pri); + ast_redirecting.from.tag = ast_strdup(pri->pvts[chanpos]->user_tag); + ast_redirecting.to.tag = ast_strdup(pri->pvts[chanpos]->user_tag); ast_channel_set_redirecting(owner, &ast_redirecting); ast_party_redirecting_free(&ast_redirecting); @@ -4452,6 +4470,19 @@ static void *pri_dchannel(void *vpri) pri->pvts[chanpos]->cid_ton = 0; pri->pvts[chanpos]->callingpres = 0; } + + /* Setup the user tag for party id's from this device for this call. */ + if (pri->append_msn_to_user_tag) { + snprintf(pri->pvts[chanpos]->user_tag, + sizeof(pri->pvts[chanpos]->user_tag), "%s_%s", + pri->initial_user_tag, + pri->nodetype == PRI_NETWORK + ? plancallingnum : e->ring.callednum); + } else { + ast_copy_string(pri->pvts[chanpos]->user_tag, + pri->initial_user_tag, sizeof(pri->pvts[chanpos]->user_tag)); + } + sig_pri_set_caller_id(pri->pvts[chanpos]); /* Set DNID on all incoming calls -- even immediate */ @@ -5493,6 +5524,7 @@ int sig_pri_hangup(struct sig_pri_chan *p, struct ast_channel *ast) p->cid_num[0] = '\0'; p->cid_subaddr[0] = '\0'; p->cid_name[0] = '\0'; + p->user_tag[0] = '\0'; p->exten[0] = '\0'; sig_pri_set_dialing(p, 0); @@ -5899,6 +5931,23 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i } #endif /* defined(HAVE_PRI_AOC_EVENTS) */ + /* Setup the user tag for party id's from this device for this call. */ + if (p->pri->append_msn_to_user_tag) { + snprintf(p->user_tag, sizeof(p->user_tag), "%s_%s", p->pri->initial_user_tag, + p->pri->nodetype == PRI_NETWORK + ? c + p->stripmsd + dp_strip + : S_OR(ast->connected.id.number, "")); + } else { + ast_copy_string(p->user_tag, p->pri->initial_user_tag, sizeof(p->user_tag)); + } + + /* + * Replace the caller id tag from the channel creation + * with the actual tag value. + */ + ast_free(ast->cid.cid_tag); + ast->cid.cid_tag = ast_strdup(p->user_tag); + ldp_strip = 0; prilocaldialplan = p->pri->localdialplan - 1; if ((l != NULL) && (prilocaldialplan == -2 || prilocaldialplan == -3)) { /* compute dynamically */ diff --git a/channels/sig_pri.h b/channels/sig_pri.h index 7fbac27703aa521dcdffa2a8218b415eee410004..ef5c29b4f3a038380d53f1e16d19e1fb1f0e9704 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -190,6 +190,8 @@ struct sig_pri_chan { char cid_subaddr[AST_MAX_EXTENSION]; char cid_name[AST_MAX_EXTENSION]; char cid_ani[AST_MAX_EXTENSION]; + /*! \brief User tag for party id's sent from this device driver. */ + char user_tag[AST_MAX_EXTENSION]; char exten[AST_MAX_EXTENSION]; /* Internal variables -- Don't touch */ @@ -316,6 +318,11 @@ struct sig_pri_pri { /*! \brief TRUE if we will allow incoming ISDN call waiting calls. */ unsigned int allow_call_waiting_calls:1; #endif /* defined(HAVE_PRI_CALL_WAITING) */ + /*! + * TRUE if a new call's sig_pri_chan.user_tag[] has the MSN + * appended to the initial_user_tag[]. + */ + unsigned int append_msn_to_user_tag:1; int dialplan; /*!< Dialing plan */ int localdialplan; /*!< Local dialing plan */ char internationalprefix[10]; /*!< country access code ('00' for european dialplans) */ @@ -335,6 +342,11 @@ struct sig_pri_pri { */ char mwi_mailboxes[SIG_PRI_MAX_MWI_MAILBOX_STR]; #endif /* defined(HAVE_PRI_MWI) */ + /*! + * \brief Initial user tag for party id's sent from this device driver. + * \note String set by config file. + */ + char initial_user_tag[AST_MAX_EXTENSION]; char msn_list[AST_MAX_EXTENSION]; /*!< Comma separated list of MSNs to handle. Empty if disabled. */ char idleext[AST_MAX_EXTENSION]; /*!< Where to idle extra calls */ char idlecontext[AST_MAX_CONTEXT]; /*!< What context to use for idle */ diff --git a/configs/chan_dahdi.conf.sample b/configs/chan_dahdi.conf.sample index 00df580c041e52b09929cc8244d1b62e61b2b49b..0bc4ac82eb04aa8edb65002fa4277723f5672a38 100644 --- a/configs/chan_dahdi.conf.sample +++ b/configs/chan_dahdi.conf.sample @@ -727,7 +727,23 @@ pickupgroup=1 ; return to the caller performing the transfer (default is yes). ; ;transfertobusy=no + +; Calls will have the party id user tag set to this string value. +; +;cid_tag= + +; With this set, you can automatically append the MSN of a party +; to the cid_tag. An '_' is used to separate the tag from the MSN. +; Applies to ISDN spans. +; Default is no. ; +; Table of what number is appended: +; outgoing incoming +; net dialed caller +; cpe caller dialed +; +;append_msn_to_cid_tag=no + ; caller ID can be set to "asreceived" or a specific number if you want to ; override it. Note that "asreceived" only applies to trunk interfaces. ; fullname sets just the