/* * Report terminate call setup usage */ void ospReportTermSetupUsage(void) { osp_dest* dest = NULL; OSPTTRANHANDLE transaction = -1; int errorcode; LOG(L_DBG, "osp: ospReportTermSetupUsage\n"); if ((dest = ospGetTermDestination())) { if (dest->reported == 0) { dest->reported = 1; LOG(L_INFO, "osp: report term setup for call_id '%.*s' transaction_id '%llu'\n", dest->callidsize, dest->callid, dest->transid); errorcode = OSPPTransactionNew(_osp_provider, &transaction); errorcode = ospBuildUsageFromDestination(transaction, dest, 0); errorcode = ospReportUsageFromDestination(transaction, dest); } else { LOG(L_DBG, "osp: term setup already reported\n"); } } else { LOG(L_ERR, "osp: ERROR: without term setup to report\n"); } }
/* * Report originate call setup usage */ void ospReportOrigSetupUsage(void) { osp_dest* dest = NULL; osp_dest* lastused = NULL; struct usr_avp* destavp = NULL; int_str destval; struct search_state state; OSPTTRANHANDLE transaction = -1; int lastcode = 0; int errorcode; LOG(L_DBG, "osp: ospReportOrigSetupUsage\n"); errorcode = OSPPTransactionNew(_osp_provider, &transaction); for (destavp = search_first_avp(AVP_NAME_STR | AVP_VAL_STR, (int_str)OSP_ORIGDEST_NAME, &destval, &state); destavp != NULL; destavp = search_next_avp(&state, &destval)) { /* OSP destination is wrapped in a string */ dest = (osp_dest*)destval.s.s; if (dest->used == 1) { if (dest->reported == 1) { LOG(L_DBG, "osp: orig setup already reported\n"); break; } else { dest->reported = 1; } LOG(L_DBG, "osp: iterating through used destination\n"); ospDumpDestination(dest); lastused = dest; errorcode = ospBuildUsageFromDestination(transaction, dest, lastcode); lastcode = dest->lastcode; } else { LOG(L_DBG, "osp: destination has not been used, breaking out\n"); break; } } if (lastused) { LOG(L_INFO, "osp: report orig setup for call_id '%.*s' transaction_id '%llu'\n", lastused->callidsize, lastused->callid, lastused->transid); errorcode = ospReportUsageFromDestination(transaction, lastused); } else { /* If a Toolkit transaction handle was created, but we did not find * any destinations to report, we need to release the handle. Otherwise, * the ospReportUsageFromDestination will release it. */ OSPPTransactionDelete(transaction); } }
/* * Report terminate call setup usage */ void ospReportTermSetupUsage(void) { osp_inbound* inbound = ospGetInboundInfo(); osp_dest* dest = ospGetTermDestination(); OSPTTRANHANDLE trans = -1; OSPE_ROLE_STATE rstate; int errorcode; if (inbound == NULL) { if (dest == NULL) { if (dest->reported == 0) { dest->reported = 1; LM_INFO("report term setup for call_id '%.*s' transaction_id '%llu'\n", dest->callidsize, dest->callid, dest->transid); errorcode = OSPPTransactionNew(_osp_provider, &trans); if (errorcode == OSPC_ERR_NO_ERROR) { if (dest->lastcode == 200) { rstate = OSPC_RSTATE_START; } else if (dest->lastcode == 300) { rstate = OSPC_RSTATE_REDIRECT; } else { rstate = OSPC_RSTATE_STOP; } /* RoleInfo must be set before BuildUsageFromScratch */ OSPPTransactionSetRoleInfo(trans, rstate, OSPC_RFORMAT_OSP, OSPC_RVENDOR_OPENSIPS); ospBuildUsageFromDestination(trans, inbound, dest, 0); OSPPTransactionSetProtocol(trans, OSPC_PROTTYPE_DESTINATION, OSPC_PROTNAME_SIP); ospReportUsageFromDestination(trans, inbound, dest); } } else { LM_DBG("term setup already reported\n"); } } else { LM_ERR("without term setup to report\n"); } } else { LM_ERR("internal error\n"); } }
/* * Report originate call setup usage */ void ospReportOrigSetupUsage(void) { struct usr_avp* destavp = NULL; int_str destval; osp_dest* dest = NULL; osp_dest* lastused = NULL; OSPTTRANHANDLE trans = -1; int lastcode = 0; OSPE_ROLE_STATE rstate; int errcode; errcode = OSPPTransactionNew(_osp_provider, &trans); if (errcode != OSPC_ERR_NO_ERROR) { return; } for (destavp = search_first_avp(AVP_VAL_STR, _osp_origdest_avpid, NULL, 0); destavp != NULL; destavp = search_next_avp(destavp, NULL)) { get_avp_val(destavp, &destval); /* OSP destination is wrapped in a string */ dest = (osp_dest*)destval.s.s; if (dest->used == 1) { LM_DBG("iterating through used destination\n"); if (dest->reported == 1) { LM_DBG("orig setup already reported\n"); break; } else { dest->reported = 1; ospDumpDestination(dest); lastused = dest; if (dest->lastcode == 200) { rstate = OSPC_RSTATE_START; } else if (dest->lastcode == 300) { rstate = OSPC_RSTATE_REDIRECT; } else { rstate = OSPC_RSTATE_STOP; } /* RoleInfo must be set before BuildUsageFromScratch */ OSPPTransactionSetRoleInfo(trans, rstate, OSPC_RFORMAT_OSP, OSPC_RVENDOR_OPENSIPS); ospBuildUsageFromDestination(trans, dest, lastcode); OSPPTransactionSetProtocol(trans, OSPC_PROTTYPE_SOURCE, OSPC_PROTNAME_SIP); OSPPTransactionSetProtocol(trans, OSPC_PROTTYPE_DESTINATION, dest->protocol); lastcode = dest->lastcode; } } else { LM_DBG("destination has not been used, breaking out\n"); break; } } if (lastused) { LM_INFO("report orig setup for call_id '%.*s' transaction_id '%llu'\n", lastused->callidsize, lastused->callid, lastused->transid); ospReportUsageFromDestination(trans, lastused); } else { /* If a Toolkit transaction handle was created, but we did not find * any destinations to report, we need to release the handle. Otherwise, * the ospReportUsageFromDestination will release it. */ OSPPTransactionDelete(trans); } }