亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usage.c

?? 性能優秀的SIP Proxy
?? C
字號:
/* * openser osp module.  * * This module enables openser to communicate with an Open Settlement  * Protocol (OSP) server.  The Open Settlement Protocol is an ETSI  * defined standard for Inter-Domain VoIP pricing, authorization * and usage exchange.  The technical specifications for OSP  * (ETSI TS 101 321 V4.1.1) are available at www.etsi.org. * * Uli Abend was the original contributor to this module. *  * Copyright (C) 2001-2005 Fhg Fokus * * This file is part of openser, a free SIP server. * * openser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * openser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *  * History: * --------- *  2006-03-13  RR functions are loaded via API function (bogdan) */#include "usage.h"#include "sipheader.h"#include "destination.h"#include "osptoolkit.h"#include "../../sr_module.h"#include "../../usr_avp.h"#include "../../str.h"#include "../rr/api.h"#include <string.h>extern OSPTPROVHANDLE _provider;extern char* _device_ip;extern str ORIG_OSPDESTS_LABEL;extern struct rr_binds osp_rrb;int buildUsageFromDestination(OSPTTRANHANDLE transaction, osp_dest* dest, int last_code_for_previous_destination);int reportUsageFromDestination(OSPTTRANHANDLE transaction, osp_dest* dest);int reportUsageFromCooky(char* cooky, OSPTCALLID* call_id, int isOrig, struct sip_msg* msg);#define OSP_ORIG_COOKY "osp-o"#define OSP_TERM_COOKY "osp-t"#define RELEASE_SOURCE_ORIG 0#define RELEASE_SOURCE_TERM 1/* * * */void record_transaction_info(struct sip_msg* msg, OSPTTRANHANDLE transaction, char* uac, char* from, char* to, time_t time_auth, int isOrig){#define RTI_BUF_SIZE 1000	char buf[RTI_BUF_SIZE];	str s;	if (osp_rrb.add_rr_param==0) {		LOG(L_WARN,"WARNING:osp:record_transaction_info: add_rr_param "			"function is not found, can not record information about the "			"OSP transaction\n");		return;	}	s.s = buf;	s.len = snprintf(buf,RTI_BUF_SIZE,		";%s=t%llu_s%s_T%d",		(isOrig==1?OSP_ORIG_COOKY:OSP_TERM_COOKY),		get_transaction_id(transaction),		uac,		(unsigned int)time_auth);	if (s.len<0) {		LOG(L_ERR,"ERROR:osp:record_transaction_info: snprintf() failed\n");		return;	}	/* truncated? */	if (s.len >= RTI_BUF_SIZE)		s.len = RTI_BUF_SIZE -1;	DBG("osp:record_transaction_info: adding rr param '%s'\n",buf);	osp_rrb.add_rr_param( msg, &s);}void record_orig_transaction(struct sip_msg* msg, OSPTTRANHANDLE transaction, char* uac, char* from, char* to, time_t time_auth){	int isOrig = 1;	record_transaction_info(msg,transaction,uac,from,to,time_auth,isOrig);}void record_term_transaction(struct sip_msg* msg, OSPTTRANHANDLE transaction, char* uac, char* from, char* to, time_t time_auth){	int isOrig = 0;	record_transaction_info(msg,transaction,uac,from,to,time_auth,isOrig);}int reportospusage(struct sip_msg* msg, char* ignore1, char* ignore2){	int result = MODULE_RETURNCODE_FALSE;	char route_params[2000];	int  isOrig;	char *tmp;	char *token;	OSPTCALLID* call_id = NULL;	getCallId(msg, &call_id);	if (call_id!=NULL && getRouteParams(msg,route_params,sizeof(route_params))==0) {		for (token = strtok_r(route_params,";",&tmp);		     token;		     token = strtok_r(NULL,";",&tmp)) {			if (strncmp(token,OSP_ORIG_COOKY,strlen(OSP_ORIG_COOKY))==0) {				LOG(L_INFO,"osp: Reporting originating call duration usage for call-id '%.*s'\n",call_id->ospmCallIdLen,call_id->ospmCallIdVal);				isOrig = 1;				reportUsageFromCooky(token+strlen(OSP_ORIG_COOKY)+1, call_id, isOrig, msg);				result = MODULE_RETURNCODE_TRUE;			} else if (strncmp(token,OSP_TERM_COOKY,strlen(OSP_TERM_COOKY))==0) {				LOG(L_INFO,"osp: Reporting terminating call duration usage for call-id '%.*s'\n",call_id->ospmCallIdLen,call_id->ospmCallIdVal);				isOrig = 0;				reportUsageFromCooky(token+strlen(OSP_TERM_COOKY)+1, call_id, isOrig, msg);				result = MODULE_RETURNCODE_TRUE;			} else {				DBG("osp:reportusage: ignoring param '%s'\n",token);			}		}	}	if (call_id!=NULL) {		OSPPCallIdDelete(&call_id);	}	if (result==MODULE_RETURNCODE_FALSE) {		DBG("There is no OSP originating or terminating usage information\n");	}	return result;}int reportUsageFromCooky(char* cooky, OSPTCALLID* call_id, int isOrig, struct sip_msg* msg){	int errorCode = 0;	char *tmp;	char *token;	char name;	char *value;	unsigned long long transaction_id = 0;	char *user_agent_client = "";	time_t auth_time = -1;	time_t end_time = time(NULL);	int release_source;	char first_via[200];	char from[200];	char to[200];	char next_hop[200];	char *calling;	char *called;	char *terminator;	OSPTTRANHANDLE transaction_handle = -1;	DBG("osp:reportUsageFromCooky: '%s' isOrig '%d'\n",cooky,isOrig);	for (token = strtok_r(cooky,"_",&tmp);	     token;	     token = strtok_r(NULL,"_",&tmp)) {		name = *token;		value= token + 1;		switch (name) {			case 't':				transaction_id = atoll(value);				break;			case 'T':				auth_time = atoi(value);				break;			case 's':				user_agent_client = value;				break;			default:				LOG(L_ERR,"osp:reportUsageFromCooky: unexpected tag '%c' / value '%s'\n",name,value);				break;		}	}	getSourceAddress(msg,first_via,sizeof(first_via));	getFromUserpart( msg,from,sizeof(from));	getToUserpart(   msg,to,sizeof(to));	getNextHop(      msg,next_hop,sizeof(next_hop));	if (strcmp(first_via,user_agent_client)==0) {		LOG(L_INFO,"osp: Originator '%s' released the call, call-id '%.*s', transaction-id '%lld'\n",			first_via,call_id->ospmCallIdLen,call_id->ospmCallIdVal,transaction_id);		release_source = RELEASE_SOURCE_ORIG;		calling = from;		called = to;		terminator = next_hop;	} else {		LOG(L_INFO,"osp: Terminator '%s' released the cal, call-id '%.*s', transaction-id '%lld'\n",			first_via,call_id->ospmCallIdLen,call_id->ospmCallIdVal,transaction_id);		release_source = RELEASE_SOURCE_TERM;		calling = to;		called = from;		terminator = first_via;	}	errorCode = OSPPTransactionNew(_provider, &transaction_handle);	DBG("osp:reportUsageFromCooky: created new transaction handle %d / code %d\n",transaction_handle,errorCode);	errorCode = OSPPTransactionBuildUsageFromScratch(		transaction_handle,		transaction_id,		isOrig==1?OSPC_SOURCE:OSPC_DESTINATION,		isOrig==1?_device_ip:user_agent_client,		isOrig==1?terminator:_device_ip,		isOrig==1?user_agent_client:"",		"",		calling,		OSPC_E164,		called,		OSPC_E164,		call_id->ospmCallIdLen,		call_id->ospmCallIdVal,		(enum OSPEFAILREASON)0,		NULL,		NULL);	DBG("osp:reportUsageFromCooky: started building usage handle %d / code %d\n",transaction_handle,errorCode);	report_usage(		transaction_handle,		10016,		end_time - auth_time,		auth_time,		end_time,		0,0,		0,0,		release_source);	return errorCode;}void reportOrigCallSetUpUsage(){	osp_dest*       dest          = NULL;	osp_dest*       last_used_dest= NULL;	struct usr_avp* dest_avp      = NULL;	int_str         dest_val;	int             errorCode     = 0;	OSPTTRANHANDLE  transaction   = -1;	int             last_code_for_previous_destination = 0;	DBG("osp: reportOrigCallSetUpUsage: IN\n");	errorCode = OSPPTransactionNew(_provider, &transaction);	for (	dest_avp=search_first_avp(AVP_NAME_STR|AVP_VAL_STR,(int_str)ORIG_OSPDESTS_LABEL,NULL,0);		dest_avp != NULL;		dest_avp=search_next_avp(dest_avp,NULL)) {		get_avp_val(dest_avp, &dest_val);		/* osp dest is wrapped in a string */		dest = (osp_dest *)dest_val.s.s;		if (dest->used == 1) {			if (dest->reported == 1) {				DBG("osp: reportOrigCallSetUpUsage: source usage has already been reported\n");				break;			}			DBG("osp: reportOrigCallSetUpUsage: iterating through a used destination\n");			dumbDestDebugInfo(dest);			last_used_dest = dest;			errorCode = buildUsageFromDestination(transaction,dest,last_code_for_previous_destination);			last_code_for_previous_destination = dest->last_code;		} else {			DBG("osp: reportOrigCallSetUpUsage: this destination has not been used, breaking out\n");			break;		}	}	if (last_used_dest) {		LOG(L_INFO,"osp: Reporting originating call set-up usage for call-id '%.*s' transaction-id '%lld'\n",			last_used_dest->sizeofcallid,last_used_dest->callid,last_used_dest->tid);		errorCode = reportUsageFromDestination(transaction, last_used_dest);	} 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 'reportUsageFromDestination' will release it.		 */		OSPPTransactionDelete(transaction);	}	DBG("osp: reportOrigCallSetUpUsage: OUT\n");}void reportTermCallSetUpUsage(){	osp_dest*       dest          = NULL;	int             errorCode     = 0;	OSPTTRANHANDLE  transaction   = -1;	DBG("osp: reportTermCallSetUpUsage: IN\n");	if ((dest=getTermDestination())) {		if (dest->reported == 0) {			LOG(L_INFO,"osp: Reporting terminating call set-up usage for call-id '%.*s' transaction-id '%lld'\n",				dest->sizeofcallid,dest->callid,dest->tid);			errorCode = OSPPTransactionNew(_provider, &transaction);			errorCode = buildUsageFromDestination(transaction,dest,0);			errorCode = reportUsageFromDestination(transaction,dest);		} else {			DBG("osp: reporTermtCallSetUpUsage: destination usage has already been reported\n");		}	} else {		DBG("osp: reportTermCallSetUpUsage: There is no term dest to report\n");	}	DBG("osp: reportTermCallSetUpUsage: OUT\n");}int buildUsageFromDestination(OSPTTRANHANDLE transaction, osp_dest* dest, int last_code_for_previous_destination){	int errorCode;	dest->reported = 1;	errorCode = OSPPTransactionBuildUsageFromScratch(		transaction,		dest->tid,		dest->type,		dest->source,		dest->destination,		dest->sourcedevice,		dest->destinationdevice,		dest->callingnumber,		OSPC_E164,		dest->callednumber,		OSPC_E164,		dest->sizeofcallid,		dest->callid,		(enum OSPEFAILREASON)last_code_for_previous_destination,		NULL,		NULL);	return errorCode;}int reportUsageFromDestination(OSPTTRANHANDLE transaction, osp_dest* dest){	report_usage(		transaction,		/* In - Transaction handle */		dest->last_code,	/* In - Release Code */			0,			/* In - Length of call */		dest->time_auth,	/* In - Call start time */		0,			/* In - Call end time */		dest->time_180,		/* In - Call alert time */		dest->time_200,		/* In - Call connect time */		dest->time_180 ? 1:0,	/* In - Is PDD Info present */ 					/* In - Post Dial Delay */		dest->time_180 ? dest->time_180 - dest->time_auth : 0,		0);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美少妇xxx| 在线免费观看日韩欧美| 亚洲第一福利视频在线| 国产欧美日韩精品一区| 欧美日韩成人在线| 色视频成人在线观看免| 99久久国产免费看| 精品无码三级在线观看视频| 婷婷国产v国产偷v亚洲高清| 亚洲一区二区三区四区在线观看| 中文字幕精品三区| 久久精品亚洲麻豆av一区二区| 日韩三级精品电影久久久| 欧美精品色一区二区三区| 本田岬高潮一区二区三区| 国产精品99久久久久久久女警| 婷婷国产在线综合| 天天色天天爱天天射综合| 亚洲精品免费视频| 亚洲人被黑人高潮完整版| 欧美国产乱子伦 | 精品国产99国产精品| 精品久久久影院| 国产日韩欧美制服另类| 亚洲免费在线观看视频| 亚洲高清视频的网址| 日韩国产高清影视| 国产自产高清不卡| 99国产精品久久久| 欧美日韩国产电影| 久久亚洲综合色| 日韩美女精品在线| 婷婷久久综合九色综合伊人色| 激情欧美一区二区三区在线观看| 国产69精品久久久久777| 91免费版在线看| 欧美一区二区精品| 国产日韩欧美电影| 亚洲mv大片欧洲mv大片精品| 久久99日本精品| av不卡一区二区三区| 717成人午夜免费福利电影| 久久久亚洲精品一区二区三区| 综合精品久久久| 美国精品在线观看| 中文字幕乱码亚洲精品一区| 亚洲乱码中文字幕| 欧美aa在线视频| av在线一区二区三区| 欧美一区二区三区在线看| 国产精品美女一区二区三区| 丝袜亚洲另类丝袜在线| 国产suv精品一区二区6| 在线不卡中文字幕播放| 国产欧美一区二区三区在线看蜜臀| 亚洲一区二区中文在线| 国产精品一区二区在线观看网站| 欧美性猛交xxxxxx富婆| 国产欧美日韩卡一| 日本伊人午夜精品| 日本福利一区二区| 久久久国产精华| 日韩在线一二三区| 不卡一卡二卡三乱码免费网站| 欧美一区二视频| 日韩美女久久久| 国产毛片精品一区| 91麻豆精品国产91久久久资源速度| 国产精品三级视频| 九九久久精品视频| 欧美理论在线播放| 一区二区三区视频在线看| 国产盗摄视频一区二区三区| 欧美日韩精品系列| 中文字幕一区二区三区不卡| 精品亚洲欧美一区| 6080亚洲精品一区二区| 亚洲综合在线五月| 99这里只有久久精品视频| 久久久另类综合| 卡一卡二国产精品| 91精品国产综合久久婷婷香蕉| 一区二区三区四区激情| 波多野结衣中文字幕一区二区三区| 精品免费99久久| 人禽交欧美网站| 欧美另类一区二区三区| 亚洲精品免费在线| av不卡在线播放| 国产精品网站导航| 粉嫩欧美一区二区三区高清影视| 欧美α欧美αv大片| 青青草精品视频| 91精品国产丝袜白色高跟鞋| 亚洲国产综合色| 欧美性受xxxx黑人xyx| 亚洲一二三级电影| 欧亚一区二区三区| 一区二区三区日本| 色综合久久久久网| 亚洲男人的天堂在线观看| 99精品视频一区| 亚洲免费av网站| 91色综合久久久久婷婷| 亚洲欧美激情小说另类| 色噜噜狠狠色综合欧洲selulu| 亚洲欧美日韩电影| 99精品在线免费| 一区二区三区在线播| 在线免费观看日本欧美| 亚洲一二三四区不卡| 欧美日韩国产综合一区二区三区| 亚洲国产精品久久人人爱蜜臀| 欧美在线观看一区二区| 亚洲高清视频中文字幕| 欧美一级欧美三级| 久久精品国产第一区二区三区| 欧美大片日本大片免费观看| 久久99久久99| 国产欧美日韩三区| 91社区在线播放| 五月婷婷久久丁香| 日韩欧美中文字幕精品| 精品一区二区三区在线播放视频 | 欧美一区二区三区免费大片| 午夜久久久久久电影| 91精品综合久久久久久| 精品一区二区三区免费| 久久欧美一区二区| 91在线观看一区二区| 亚洲综合在线观看视频| 欧美一级日韩免费不卡| 国产剧情av麻豆香蕉精品| 国产精品福利av| 欧美无砖砖区免费| 国产一区三区三区| 亚洲免费三区一区二区| 欧美一级艳片视频免费观看| 国产成人啪免费观看软件| 亚洲精品国产一区二区三区四区在线| 欧美午夜宅男影院| 国内精品在线播放| 亚洲精品国产第一综合99久久| 欧美日本一道本在线视频| 国产风韵犹存在线视精品| 亚洲精品va在线观看| 日韩免费高清视频| 91网站最新网址| 免费精品99久久国产综合精品| 国产精品美女一区二区三区| 91精品国产全国免费观看| 国产1区2区3区精品美女| 亚洲综合成人在线视频| 精品国产91乱码一区二区三区 | 欧美精品一区二区久久久| 色综合视频一区二区三区高清| 久久成人免费电影| 一区二区三区日韩欧美| 国产色一区二区| 在线电影国产精品| av亚洲精华国产精华精华| 免费观看30秒视频久久| 一区二区三区四区国产精品| 久久久久久久久久久电影| 欧美日韩精品二区第二页| 成人av电影在线观看| 久久精品国产成人一区二区三区| 亚洲精品日韩综合观看成人91| 久久久久国产精品厨房| 欧美日韩国产精品成人| jvid福利写真一区二区三区| 久久99精品国产麻豆不卡| 亚洲国产色一区| 国产精品久久久久久亚洲伦| 日韩欧美国产一区二区三区| 欧美中文字幕亚洲一区二区va在线| 国产麻豆成人传媒免费观看| 日韩成人精品视频| 亚洲另类春色国产| 中文一区二区在线观看| 日韩免费性生活视频播放| 欧美日韩国产精选| 在线观看区一区二| 9久草视频在线视频精品| 国产69精品久久久久毛片| 久久国产婷婷国产香蕉| 天堂成人国产精品一区| 亚洲激情男女视频| 国产精品久久久久国产精品日日| 精品国产乱码久久久久久图片| 欧美日韩性生活| 欧美性做爰猛烈叫床潮| 色综合久久久久综合体桃花网| 高清在线成人网| 成人综合在线网站| 国产成人av电影| 成人三级伦理片| 成人黄色小视频| 99在线精品观看| av不卡在线播放|