/* * Report OSP usage * SER uses AVP to add RR pararmters * param msg SIP message * param ignore1 * param ignore2 * return MODULE_RETURNCODE_TRUE success, MODULE_RETURNCODE_FALSE failure */ int ospReportUsage( struct sip_msg* msg, char* ignore1, char* ignore2) { int_str cookieval; struct usr_avp* cookieavp = NULL; static const int FROMFLAGS = AVP_TRACK_FROM | AVP_CLASS_URI | AVP_NAME_STR | AVP_VAL_STR; static const int TOFLAGS = AVP_TRACK_TO | AVP_CLASS_URI | AVP_NAME_STR | AVP_VAL_STR; char buffer[OSP_HEADERBUF_SIZE]; OSPTCALLID* callid = NULL; int result = MODULE_RETURNCODE_FALSE; LOG(L_DBG, "osp: ospReportUsage\n"); ospGetCallId(msg, &callid); if (callid != NULL) { if ((cookieavp = search_first_avp(FROMFLAGS, (int_str)OSP_ORIGCOOKIE_NAME, &cookieval, NULL)) != 0 || (cookieavp = search_first_avp(TOFLAGS, (int_str)OSP_ORIGCOOKIE_NAME, &cookieval, NULL)) != 0) { ospCopyStrToBuffer(&cookieval.s, buffer, sizeof(buffer)); LOG(L_DBG, "orig cookie '%s'\n", buffer); LOG(L_INFO, "osp: report orig duration for call_id '%.*s'\n", callid->ospmCallIdLen, callid->ospmCallIdVal); ospReportUsageFromCookie(msg, buffer, callid, OSPC_SOURCE); result = MODULE_RETURNCODE_TRUE; } if ((cookieavp = search_first_avp(FROMFLAGS, (int_str)OSP_TERMCOOKIE_NAME, &cookieval, NULL)) != 0 || (cookieavp = search_first_avp(TOFLAGS, (int_str)OSP_TERMCOOKIE_NAME, &cookieval, NULL)) != 0) { ospCopyStrToBuffer(&cookieval.s, buffer, sizeof(buffer)); LOG(L_DBG, "term cookie '%s'\n", buffer); LOG(L_INFO, "osp: report term duration for call_id '%.*s'\n", callid->ospmCallIdLen, callid->ospmCallIdVal); ospReportUsageFromCookie(msg, buffer, callid, OSPC_DESTINATION); result = MODULE_RETURNCODE_TRUE; } if (result == MODULE_RETURNCODE_FALSE) { LOG(L_DBG, "without orig or term OSP information\n"); LOG(L_INFO, "report other duration for call_id '%.*s'\n", callid->ospmCallIdLen, callid->ospmCallIdVal); ospReportUsageFromCookie(msg, NULL, callid, OSPC_SOURCE); result = MODULE_RETURNCODE_TRUE; } OSPPCallIdDelete(&callid); } if (result == MODULE_RETURNCODE_FALSE) { LOG(L_DBG, "osp: failed to report usage\n"); } return result; }
/* * Report OSP usage * param msg SIP message * param whorelease Who releases the call first, 0 orig, 1 term * param ignore2 * return MODULE_RETURNCODE_TRUE success, MODULE_RETURNCODE_FALSE failure */ int ospReportUsage( struct sip_msg* msg, char* whorelease, char* ignore2) { OSPE_RELEASE release; char* tmp; char* token; char parameters[OSP_HEADERBUF_SIZE]; OSPT_CALL_ID* callid = NULL; int result = MODULE_RETURNCODE_FALSE; ospGetCallId(msg, &callid); if (callid != NULL) { /* Who releases the call first, 0 orig, 1 term */ if (sscanf(whorelease, "%d", &release) != 1 || ((release != OSPC_RELEASE_SOURCE) && (release != OSPC_RELEASE_DESTINATION))) { release = OSPC_RELEASE_UNKNOWN; } LM_DBG("who releases the call first '%d'\n", release); if (ospGetRouteParameters(msg, parameters, sizeof(parameters)) == 0) { for (token = strtok_r(parameters, ";", &tmp); token; token = strtok_r(NULL, ";", &tmp)) { if ((strncmp(token, OSP_ORIG_COOKIE, strlen(OSP_ORIG_COOKIE)) == 0) && (token[strlen(OSP_ORIG_COOKIE)] == '=')) { LM_INFO("report orig duration for call_id '%.*s'\n", callid->Length, callid->Value); ospReportUsageFromCookie(msg, token + strlen(OSP_ORIG_COOKIE) + 1, callid, release, OSPC_ROLE_SOURCE); result = MODULE_RETURNCODE_TRUE; } else if ((strncmp(token, OSP_TERM_COOKIE, strlen(OSP_TERM_COOKIE)) == 0) && (token[strlen(OSP_TERM_COOKIE)] == '=')) { LM_INFO("report term duration for call_id '%.*s'\n", callid->Length, callid->Value); ospReportUsageFromCookie(msg, token + strlen(OSP_TERM_COOKIE) + 1, callid, release, OSPC_ROLE_DESTINATION); result = MODULE_RETURNCODE_TRUE; } else { LM_DBG("ignoring parameter '%s'\n", token); } } } if (result == MODULE_RETURNCODE_FALSE) { LM_DBG("without orig or term OSP information\n"); LM_INFO("report other duration for call_id '%.*s'\n", callid->Length, callid->Value); ospReportUsageFromCookie(msg, NULL, callid, release, OSPC_ROLE_SOURCE); result = MODULE_RETURNCODE_TRUE; } OSPPCallIdDelete(&callid); } if (result == MODULE_RETURNCODE_FALSE) { LM_ERR("failed to report usage\n"); } return result; }