diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 80d7b93f13..6c9723e65a 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -2353,7 +2353,6 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout) } } - 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); @@ -2434,6 +2433,56 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout) pridialplan = PRI_LOCAL_ISDN; } } + while (c[p->stripmsd] > '9' && c[p->stripmsd] != '*' && c[p->stripmsd] != '#') { + switch (c[p->stripmsd]) { + case 'U': + pridialplan = (PRI_TON_UNKNOWN << 4) | (pridialplan & 0xf); + break; + case 'I': + pridialplan = (PRI_TON_INTERNATIONAL << 4) | (pridialplan & 0xf); + break; + case 'N': + pridialplan = (PRI_TON_NATIONAL << 4) | (pridialplan & 0xf); + break; + case 'L': + pridialplan = (PRI_TON_NET_SPECIFIC << 4) | (pridialplan & 0xf); + break; + case 'S': + pridialplan = (PRI_TON_SUBSCRIBER << 4) | (pridialplan & 0xf); + break; + case 'A': + pridialplan = (PRI_TON_ABBREVIATED << 4) | (pridialplan & 0xf); + break; + case 'R': + pridialplan = (PRI_TON_RESERVED << 4) | (pridialplan & 0xf); + break; + case 'u': + pridialplan = PRI_NPI_UNKNOWN | (pridialplan & 0xf0); + break; + case 'e': + pridialplan = PRI_NPI_E163_E164 | (pridialplan & 0xf0); + break; + case 'x': + pridialplan = PRI_NPI_X121 | (pridialplan & 0xf0); + break; + case 'f': + pridialplan = PRI_NPI_F69 | (pridialplan & 0xf0); + break; + case 'n': + pridialplan = PRI_NPI_NATIONAL | (pridialplan & 0xf0); + break; + case 'p': + pridialplan = PRI_NPI_PRIVATE | (pridialplan & 0xf0); + break; + case 'r': + 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); + } + c++; + } pri_sr_set_called(sr, c + p->stripmsd + dp_strip, pridialplan, s ? 1 : 0); ldp_strip = 0; @@ -2453,6 +2502,58 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout) prilocaldialplan = PRI_LOCAL_ISDN; } } + if (l != NULL) { + while (*l > '9' && *l != '*' && *l != '#') { + switch (*l) { + case 'U': + prilocaldialplan = (PRI_TON_UNKNOWN << 4) | (prilocaldialplan & 0xf); + break; + case 'I': + prilocaldialplan = (PRI_TON_INTERNATIONAL << 4) | (prilocaldialplan & 0xf); + break; + case 'N': + prilocaldialplan = (PRI_TON_NATIONAL << 4) | (prilocaldialplan & 0xf); + break; + case 'L': + prilocaldialplan = (PRI_TON_NET_SPECIFIC << 4) | (prilocaldialplan & 0xf); + break; + case 'S': + prilocaldialplan = (PRI_TON_SUBSCRIBER << 4) | (prilocaldialplan & 0xf); + break; + case 'A': + prilocaldialplan = (PRI_TON_ABBREVIATED << 4) | (prilocaldialplan & 0xf); + break; + case 'R': + prilocaldialplan = (PRI_TON_RESERVED << 4) | (prilocaldialplan & 0xf); + break; + case 'u': + prilocaldialplan = PRI_NPI_UNKNOWN | (prilocaldialplan & 0xf0); + break; + case 'e': + prilocaldialplan = PRI_NPI_E163_E164 | (prilocaldialplan & 0xf0); + break; + case 'x': + prilocaldialplan = PRI_NPI_X121 | (prilocaldialplan & 0xf0); + break; + case 'f': + prilocaldialplan = PRI_NPI_F69 | (prilocaldialplan & 0xf0); + break; + case 'n': + prilocaldialplan = PRI_NPI_NATIONAL | (prilocaldialplan & 0xf0); + break; + case 'p': + prilocaldialplan = PRI_NPI_PRIVATE | (prilocaldialplan & 0xf0); + break; + case 'r': + 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); + } + l++; + } + } pri_sr_set_caller(sr, l ? (l + ldp_strip) : NULL, n, prilocaldialplan, p->use_callingpres ? ast->cid.cid_pres : (l ? PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN : PRES_NUMBER_NOT_AVAILABLE)); if ((rr_str = pbx_builtin_getvar_helper(ast, "PRIREDIRECTREASON"))) { diff --git a/configs/zapata.conf.sample b/configs/zapata.conf.sample index 13cfe3ee8d..c2ee8e4544 100644 --- a/configs/zapata.conf.sample +++ b/configs/zapata.conf.sample @@ -87,14 +87,41 @@ ; unknown: Unknown ; private: Private ISDN ; local: Local ISDN -; national: National ISDN +; national: National ISDN ; international: International ISDN -; dynamic: Dynamically selects the appropriate dialplan +; dynamic: Dynamically selects the appropriate dialplan ; redundant: Same as dynamic, except that the underlying number is not ; changed (not common) ; ;pridialplan=national ;prilocaldialplan=national +; +; pridialplan may be also set at dialtime, by prefixing the dialled number with +; one of the following letters: +; U - Unknown +; P - Private +; L - Local +; N - National +; I - International +; D - Dynamic +; R - Redundant +; +; Additionally, you may also set the following NPI bits (also by prefixing the +; dialled string with one of the following letters): +; u - Unknown +; e - E.163/E.164 +; x - X.121 +; f - F.69 +; n - National +; p - Private +; r - Reserved +; +; You may also set the prilocaldialplan in the same way, but by prefixing the +; Caller*ID Number, rather than the dialled number. Please note that telcos +; which require this kind of additional manipulation of the TON/NPI are *rare*. +; Most telco PRIs will work fine simply by setting pridialplan to unknown or +; dynamic. +; ; ; PRI caller ID prefixes based on the given TON/NPI (dialplan) ; This is especially needed for EuroISDN E1-PRIs