diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-01-27 00:06:27 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-01-27 00:06:27 +0000 |
commit | ecdbb3d1d924163e38a91848816353953dd3d5ec (patch) | |
tree | 438a3a6bf7087d6269980a86954277c22ac4e923 /channels | |
parent | 1c60cead78a942a334c181d40d41d8d26f31f724 (diff) |
Merged from revision 304341
https://origsvn.digium.com/svn/asterisk/be/branches/C.3-bier
..........
r304341 | rmudgett | 2011-01-26 16:38:39 -0600 (Wed, 26 Jan 2011) | 7 lines
Add connected line chan_dahdi.conf pricpndialplan option.
* Added from_channel value to prilocaldialplan option.
JIRA ABE-2731
JIRA SWP-2842
..........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@304385 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_dahdi.c | 23 | ||||
-rw-r--r-- | channels/sig_pri.c | 39 | ||||
-rw-r--r-- | channels/sig_pri.h | 1 |
3 files changed, 63 insertions, 0 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 7cf585a31..09f461259 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -12270,6 +12270,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, pris[span].pri.nsf = conf->pri.pri.nsf; pris[span].pri.dialplan = conf->pri.pri.dialplan; pris[span].pri.localdialplan = conf->pri.pri.localdialplan; + pris[span].pri.cpndialplan = conf->pri.pri.cpndialplan; pris[span].pri.pvts[pris[span].pri.numchans++] = tmp->sig_pvt; pris[span].pri.minunused = conf->pri.pri.minunused; pris[span].pri.minidle = conf->pri.pri.minidle; @@ -16971,6 +16972,8 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct confp->pri.pri.localdialplan = PRI_INTERNATIONAL_ISDN + 1; } else if (!strcasecmp(v->value, "local")) { confp->pri.pri.localdialplan = PRI_LOCAL_ISDN + 1; + } else if (!strcasecmp(v->value, "from_channel")) { + confp->pri.pri.localdialplan = 0; } else if (!strcasecmp(v->value, "dynamic")) { confp->pri.pri.localdialplan = -1; } else if (!strcasecmp(v->value, "redundant")) { @@ -16978,6 +16981,26 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct } else { ast_log(LOG_WARNING, "Unknown PRI localdialplan '%s' at line %d.\n", v->value, v->lineno); } + } else if (!strcasecmp(v->name, "pricpndialplan")) { + if (!strcasecmp(v->value, "national")) { + confp->pri.pri.cpndialplan = PRI_NATIONAL_ISDN + 1; + } else if (!strcasecmp(v->value, "unknown")) { + confp->pri.pri.cpndialplan = PRI_UNKNOWN + 1; + } else if (!strcasecmp(v->value, "private")) { + confp->pri.pri.cpndialplan = PRI_PRIVATE + 1; + } else if (!strcasecmp(v->value, "international")) { + confp->pri.pri.cpndialplan = PRI_INTERNATIONAL_ISDN + 1; + } else if (!strcasecmp(v->value, "local")) { + confp->pri.pri.cpndialplan = PRI_LOCAL_ISDN + 1; + } else if (!strcasecmp(v->value, "from_channel")) { + confp->pri.pri.cpndialplan = 0; + } else if (!strcasecmp(v->value, "dynamic")) { + confp->pri.pri.cpndialplan = -1; + } else if (!strcasecmp(v->value, "redundant")) { + confp->pri.pri.cpndialplan = -2; + } else { + ast_log(LOG_WARNING, "Unknown PRI cpndialplan '%s' at line %d.\n", v->value, v->lineno); + } } else if (!strcasecmp(v->name, "switchtype")) { if (!strcasecmp(v->value, "national")) confp->pri.pri.switchtype = PRI_SWITCH_NI2; diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 27e5dcf0b..2efc666ab 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -7253,6 +7253,9 @@ int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, char *rdest, i } else { prilocaldialplan = PRI_LOCAL_ISDN; } + } else if (prilocaldialplan == -1) { + /* Use the numbering plan passed in. */ + prilocaldialplan = ast->connected.id.number.plan; } if (l != NULL) { while (*l > '9' && *l != '*' && *l != '#') { @@ -7558,10 +7561,46 @@ int sig_pri_indicate(struct sig_pri_chan *p, struct ast_channel *chan, int condi ast_debug(1, "Received AST_CONTROL_CONNECTED_LINE on %s\n", chan->name); if (p->pri && !pri_grab(p, p->pri)) { struct pri_party_connected_line connected; + int dialplan; + int prefix_strip; memset(&connected, 0, sizeof(connected)); sig_pri_party_id_from_ast(&connected.id, &chan->connected.id); + /* Determine the connected line numbering plan to actually use. */ + switch (p->pri->cpndialplan) { + case -2:/* redundant */ + case -1:/* dynamic */ + /* compute dynamically */ + prefix_strip = 0; + if (!strncmp(connected.id.number.str, p->pri->internationalprefix, + strlen(p->pri->internationalprefix))) { + prefix_strip = strlen(p->pri->internationalprefix); + dialplan = PRI_INTERNATIONAL_ISDN; + } else if (!strncmp(connected.id.number.str, p->pri->nationalprefix, + strlen(p->pri->nationalprefix))) { + prefix_strip = strlen(p->pri->nationalprefix); + dialplan = PRI_NATIONAL_ISDN; + } else { + dialplan = PRI_LOCAL_ISDN; + } + connected.id.number.plan = dialplan; + + if (prefix_strip && p->pri->cpndialplan != -2) { + /* Strip the prefix from the connected line number. */ + memmove(connected.id.number.str, + connected.id.number.str + prefix_strip, + strlen(connected.id.number.str + prefix_strip) + 1); + } + break; + case 0:/* from_channel */ + /* Use the numbering plan passed in. */ + break; + default: + connected.id.number.plan = p->pri->cpndialplan - 1; + break; + } + pri_connected_line_update(p->pri->pri, p->call, &connected); pri_rel(p->pri); } diff --git a/channels/sig_pri.h b/channels/sig_pri.h index 1c3750800..53a4b8604 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -404,6 +404,7 @@ struct sig_pri_span { unsigned int append_msn_to_user_tag:1; int dialplan; /*!< Dialing plan */ int localdialplan; /*!< Local dialing plan */ + int cpndialplan; /*!< Connected party dialing plan */ char internationalprefix[10]; /*!< country access code ('00' for european dialplans) */ char nationalprefix[10]; /*!< area access code ('0' for european dialplans) */ char localprefix[20]; /*!< area access code + area code ('0'+area code for european dialplans) */ |