1. Added reporting operator names in AuthReq.

2. Added retrieving operator names from AuthRsp and exporting them.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@237250 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
TransNexus OSP Development 2010-01-04 03:38:29 +00:00
parent 0078b3bc5c
commit fb4870a74a
1 changed files with 107 additions and 26 deletions

View File

@ -312,40 +312,42 @@ struct osp_provider {
/* Call ID */
struct osp_callid {
unsigned char buf[OSP_SIZE_NORSTR]; /* Call ID string */
unsigned int len; /* Call ID length */
unsigned char buf[OSP_SIZE_NORSTR]; /* Call ID string */
unsigned int len; /* Call ID length */
};
/* Number Portability Parameters */
struct osp_npparam {
const char* rn; /* Rounding number */
const char* cic; /* Carrier Identification Code */
int npdi; /* NP Database Dip Indicator */
/* Number Portability Data */
struct osp_npdata {
const char* rn; /* Rounding Number */
const char* cic; /* Carrier Identification Code */
int npdi; /* NP Database Dip Indicator */
const char* opname[OSPC_OPNAME_NUMBER]; /* Operator Names */
};
/* SIP Diversion Header Parameters */
struct osp_diversion {
const char* user; /* Diversion header user info */
const char* host; /* Diversion header host info */
const char* user; /* Diversion header user info */
const char* host; /* Diversion header host info */
};
/* OSP Application In/Output Results */
struct osp_results {
int inhandle; /* Inbound transaction handle */
int outhandle; /* Outbound transaction handle */
unsigned int intimelimit; /* Inbound duration limit */
unsigned int outtimelimit; /* Outbound duration limit */
char tech[OSP_SIZE_TECHSTR]; /* Outbound Asterisk TECH string */
char dest[OSP_SIZE_NORSTR]; /* Outbound destination IP address */
char calling[OSP_SIZE_NORSTR]; /* Outbound calling number, may be translated */
char called[OSP_SIZE_NORSTR]; /* Outbound called number, may be translated */
char token[OSP_SIZE_TOKSTR]; /* Outbound OSP token */
char networkid[OSP_SIZE_NORSTR]; /* Outbound network ID */
char nprn[OSP_SIZE_NORSTR]; /* Outbound NP routing number */
char npcic[OSP_SIZE_NORSTR]; /* Outbound NP carrier identification code */
int npdi; /* Outbound NP database dip indicator */
unsigned int numdests; /* Number of remain outbound destinations */
struct osp_callid outcallid; /* Outbound call ID */
int inhandle; /* Inbound transaction handle */
int outhandle; /* Outbound transaction handle */
unsigned int intimelimit; /* Inbound duration limit */
unsigned int outtimelimit; /* Outbound duration limit */
char tech[OSP_SIZE_TECHSTR]; /* Outbound Asterisk TECH string */
char dest[OSP_SIZE_NORSTR]; /* Outbound destination IP address */
char calling[OSP_SIZE_NORSTR]; /* Outbound calling number, may be translated */
char called[OSP_SIZE_NORSTR]; /* Outbound called number, may be translated */
char token[OSP_SIZE_TOKSTR]; /* Outbound OSP token */
char networkid[OSP_SIZE_NORSTR]; /* Outbound network ID */
char nprn[OSP_SIZE_NORSTR]; /* Outbound NP routing number */
char npcic[OSP_SIZE_NORSTR]; /* Outbound NP carrier identification code */
int npdi; /* Outbound NP database dip indicator */
char opname[OSPC_OPNAME_NUMBER][OSP_SIZE_NORSTR]; /* Outbound Operator names */
unsigned int numdests; /* Number of remain outbound destinations */
struct osp_callid outcallid; /* Outbound call ID */
};
/* OSP Call Leg */
@ -924,6 +926,7 @@ static int osp_check_destination(
OSPE_DEST_OSPENABLED enabled;
OSPE_DEST_PROTOCOL protocol;
char dest[OSP_SIZE_NORSTR];
OSPE_OPERATOR_NAME type;
int error;
if ((provider == NULL) || (reason == NULL) || (results == NULL)) {
@ -961,6 +964,14 @@ static int osp_check_destination(
results->npdi = 0;
}
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
error = OSPPTransactionGetOperatorName(results->outhandle, type, sizeof(results->opname[type]), results->opname[type]);
if (error != OSPC_ERR_NO_ERROR) {
ast_debug(1, "OSP: Unable to get operator name of type '%d', error '%d'\n", type, error);
results->opname[type][0] = '\0';
}
}
if ((error = OSPPTransactionGetDestProtocol(results->outhandle, &protocol)) != OSPC_ERR_NO_ERROR) {
ast_debug(1, "OSP: Unable to get destination protocol, error '%d'\n", error);
*reason = OSPC_FAIL_NORMAL_UNSPECIFIED;
@ -969,6 +980,9 @@ static int osp_check_destination(
results->nprn[0] = '\0';
results->npcic[0] = '\0';
results->npdi = 0;
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
results->opname[type][0] = '\0';
}
return OSP_ERROR;
}
@ -1025,6 +1039,9 @@ static int osp_check_destination(
results->nprn[0] = '\0';
results->npcic[0] = '\0';
results->npdi = 0;
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
results->opname[type][0] = '\0';
}
res = OSP_FAILED;
break;
}
@ -1226,7 +1243,7 @@ static int osp_lookup(
const char* calling,
const char* called,
const char* snetid,
struct osp_npparam* np,
struct osp_npdata* np,
struct osp_diversion* div,
const char* cinfo[],
struct osp_results* results)
@ -1268,6 +1285,9 @@ static int osp_lookup(
results->nprn[0] = '\0';
results->npcic[0] = '\0';
results->npdi = 0;
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
results->opname[type][0] = '\0';
}
results->numdests = 0;
results->outtimelimit = OSP_DEF_TIMELIMIT;
@ -1291,6 +1311,10 @@ static int osp_lookup(
OSPPTransactionSetNumberPortability(results->outhandle, np->rn, np->cic, np->npdi);
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
OSPPTransactionSetOperatorName(results->outhandle, type, np->opname[type]);
}
osp_convert_inout(div->host, host, sizeof(host));
OSPPTransactionSetDiversion(results->outhandle, div->user, host);
@ -1490,6 +1514,7 @@ static int osp_next(
unsigned int tokenlen;
char token[OSP_SIZE_TOKSTR];
OSPEFAILREASON reason;
OSPE_OPERATOR_NAME type;
int error;
if (results == NULL) {
@ -1506,6 +1531,9 @@ static int osp_next(
results->nprn[0] = '\0';
results->npcic[0] = '\0';
results->npdi = 0;
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
results->opname[type][0] = '\0';
}
results->outtimelimit = OSP_DEF_TIMELIMIT;
if ((res = osp_get_provider(name, &provider)) <= 0) {
@ -2026,7 +2054,8 @@ static int osplookup_exec(
struct ast_var_t* current;
const char* srcdev = "";
const char* snetid = "";
struct osp_npparam np;
struct osp_npdata np;
OSPE_OPERATOR_NAME type;
struct osp_diversion div;
unsigned int i;
const char* cinfo[OSP_MAX_CUSTOMINFO] = { NULL };
@ -2080,6 +2109,9 @@ static int osplookup_exec(
np.rn = "";
np.cic = "";
np.npdi = 0;
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
np.opname[type] = "";
}
div.user = "";
div.host = "";
@ -2106,6 +2138,18 @@ static int osplookup_exec(
if (ast_true(ast_var_value(current))) {
np.npdi = 1;
}
} else if (!strcasecmp(ast_var_name(current), "OSPINSPID")) {
np.opname[OSPC_OPNAME_SPID] = ast_var_value(current);
} else if (!strcasecmp(ast_var_name(current), "OSPINOCN")) {
np.opname[OSPC_OPNAME_OCN] = ast_var_value(current);
} else if (!strcasecmp(ast_var_name(current), "OSPINSPN")) {
np.opname[OSPC_OPNAME_SPN] = ast_var_value(current);
} else if (!strcasecmp(ast_var_name(current), "OSPINALTSPN")) {
np.opname[OSPC_OPNAME_ALTSPN] = ast_var_value(current);
} else if (!strcasecmp(ast_var_name(current), "OSPINMCC")) {
np.opname[OSPC_OPNAME_MCC] = ast_var_value(current);
} else if (!strcasecmp(ast_var_name(current), "OSPINMNC")) {
np.opname[OSPC_OPNAME_MNC] = ast_var_value(current);
} else if (!strcasecmp(ast_var_name(current), "OSPINTOHOST")) {
ast_copy_string(results.dest, ast_var_value(current), sizeof(results.dest));
} else if (!strcasecmp(ast_var_name(current), "OSPINDIVUSER")) {
@ -2137,6 +2181,12 @@ static int osplookup_exec(
ast_debug(1, "OSPLookup: OSPINNPRN '%s'\n", np.rn);
ast_debug(1, "OSPLookup: OSPINNPCIC '%s'\n", np.cic);
ast_debug(1, "OSPLookup: OSPINNPDI '%d'\n", np.npdi);
ast_debug(1, "OSPLookup: OSPINSPID '%s'\n", np.opname[OSPC_OPNAME_SPID]);
ast_debug(1, "OSPLookup: OSPINOCN '%s'\n", np.opname[OSPC_OPNAME_OCN]);
ast_debug(1, "OSPLookup: OSPINSPN '%s'\n", np.opname[OSPC_OPNAME_SPN]);
ast_debug(1, "OSPLookup: OSPINALTSPN '%s'\n", np.opname[OSPC_OPNAME_ALTSPN]);
ast_debug(1, "OSPLookup: OSPINMCC '%s'\n", np.opname[OSPC_OPNAME_MCC]);
ast_debug(1, "OSPLookup: OSPINMNC '%s'\n", np.opname[OSPC_OPNAME_MNC]);
ast_debug(1, "OSPLookup: OSPINTOHOST '%s'\n", results.dest);
ast_debug(1, "OSPLookup: OSPINDIVUSER '%s'\n", div.user);
ast_debug(1, "OSPLookup: OSPINDIVHOST'%s'\n", div.host);
@ -2162,6 +2212,9 @@ static int osplookup_exec(
results.nprn[0] = '\0';
results.npcic[0] = '\0';
results.npdi = 0;
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
results.opname[type][0] = '\0';
}
results.numdests = 0;
results.outtimelimit = OSP_DEF_TIMELIMIT;
results.outcallid.buf[0] = '\0';
@ -2193,6 +2246,18 @@ static int osplookup_exec(
snprintf(buffer, sizeof(buffer), "%d", results.npdi);
pbx_builtin_setvar_helper(chan, "OSPOUTNPDI", buffer);
ast_debug(1, "OSPLookup: OSPOUTNPDI'%s'\n", buffer);
pbx_builtin_setvar_helper(chan, "OSPOUTSPID", results.opname[OSPC_OPNAME_SPID]);
ast_debug(1, "OSPLookup: OSPOUTSPID '%s'\n", results.opname[OSPC_OPNAME_SPID]);
pbx_builtin_setvar_helper(chan, "OSPOUTOCN", results.opname[OSPC_OPNAME_OCN]);
ast_debug(1, "OSPLookup: OSPOUTOCN '%s'\n", results.opname[OSPC_OPNAME_OCN]);
pbx_builtin_setvar_helper(chan, "OSPOUTSPN", results.opname[OSPC_OPNAME_SPN]);
ast_debug(1, "OSPLookup: OSPOUTSPN '%s'\n", results.opname[OSPC_OPNAME_SPN]);
pbx_builtin_setvar_helper(chan, "OSPOUTALTSPN", results.opname[OSPC_OPNAME_ALTSPN]);
ast_debug(1, "OSPLookup: OSPOUTALTSPN '%s'\n", results.opname[OSPC_OPNAME_ALTSPN]);
pbx_builtin_setvar_helper(chan, "OSPOUTMCC", results.opname[OSPC_OPNAME_MCC]);
ast_debug(1, "OSPLookup: OSPOUTMCC '%s'\n", results.opname[OSPC_OPNAME_MCC]);
pbx_builtin_setvar_helper(chan, "OSPOUTMNC", results.opname[OSPC_OPNAME_MNC]);
ast_debug(1, "OSPLookup: OSPOUTMNC '%s'\n", results.opname[OSPC_OPNAME_MNC]);
pbx_builtin_setvar_helper(chan, "OSPOUTTOKEN", results.token);
ast_debug(1, "OSPLookup: OSPOUTTOKEN size '%zd'\n", strlen(results.token));
snprintf(buffer, sizeof(buffer), "%d", results.numdests);
@ -2261,6 +2326,7 @@ static int ospnext_exec(
struct varshead* headp;
struct ast_var_t* current;
struct osp_results results;
OSPE_OPERATOR_NAME type;
char buffer[OSP_SIZE_TOKSTR];
unsigned int callidtypes = OSP_CALLID_UNDEF;
const char* status;
@ -2341,6 +2407,9 @@ static int ospnext_exec(
results.nprn[0] = '\0';
results.npcic[0] = '\0';
results.npdi = 0;
for (type = OSPC_OPNAME_START; type < OSPC_OPNAME_NUMBER; type++) {
results.opname[type][0] = '\0';
}
results.numdests = 0;
results.outtimelimit = OSP_DEF_TIMELIMIT;
results.outcallid.buf[0] = '\0';
@ -2369,6 +2438,18 @@ static int ospnext_exec(
snprintf(buffer, sizeof(buffer), "%d", results.npdi);
pbx_builtin_setvar_helper(chan, "OSPOUTNPDI", buffer);
ast_debug(1, "OSPLookup: OSPOUTNPDI'%s'\n", buffer);
pbx_builtin_setvar_helper(chan, "OSPOUTSPID", results.opname[OSPC_OPNAME_SPID]);
ast_debug(1, "OSPLookup: OSPOUTSPID '%s'\n", results.opname[OSPC_OPNAME_SPID]);
pbx_builtin_setvar_helper(chan, "OSPOUTOCN", results.opname[OSPC_OPNAME_OCN]);
ast_debug(1, "OSPLookup: OSPOUTOCN '%s'\n", results.opname[OSPC_OPNAME_OCN]);
pbx_builtin_setvar_helper(chan, "OSPOUTSPN", results.opname[OSPC_OPNAME_SPN]);
ast_debug(1, "OSPLookup: OSPOUTSPN '%s'\n", results.opname[OSPC_OPNAME_SPN]);
pbx_builtin_setvar_helper(chan, "OSPOUTALTSPN", results.opname[OSPC_OPNAME_ALTSPN]);
ast_debug(1, "OSPLookup: OSPOUTALTSPN '%s'\n", results.opname[OSPC_OPNAME_ALTSPN]);
pbx_builtin_setvar_helper(chan, "OSPOUTMCC", results.opname[OSPC_OPNAME_MCC]);
ast_debug(1, "OSPLookup: OSPOUTMCC '%s'\n", results.opname[OSPC_OPNAME_MCC]);
pbx_builtin_setvar_helper(chan, "OSPOUTMNC", results.opname[OSPC_OPNAME_MNC]);
ast_debug(1, "OSPLookup: OSPOUTMNC '%s'\n", results.opname[OSPC_OPNAME_MNC]);
pbx_builtin_setvar_helper(chan, "OSPOUTTOKEN", results.token);
ast_debug(1, "OSPNext: OSPOUTTOKEN size '%zd'\n", strlen(results.token));
snprintf(buffer, sizeof(buffer), "%d", results.numdests);