siptrace.c

来自「性能优秀的SIP Proxy」· C语言 代码 · 共 1,245 行 · 第 1/3 页

C
1,245
字号
error:	return -1;}static void trace_onreq_in(struct cell* t, int type, struct tmcb_params *ps){	struct sip_msg* msg;	int_str        avp_name;	int_str        avp_value;	struct usr_avp *avp;	DBG("trace_onreq_in: =================================\n");	if(t==NULL || ps==NULL)	{		DBG("trace_onreq_in: no uas request, local transaction\n");		return;	}		msg = ps->req;	if(msg==NULL)	{		DBG("trace_onreq_in: no uas request, local transaction\n");		return;	}		avp = NULL;	avp_name.n = traced_user_avp;	avp=search_first_avp(0, avp_name, &avp_value, 0);		if((avp==NULL) && (trace_flag==0 || trace_on_flag==NULL || 				*trace_on_flag==0 || isflagset(msg, trace_flag)!=1))	{		DBG("trace_onreq_in: trace off...\n");		return;	}		if(parse_from_header(msg)==-1 || msg->from==NULL || get_from(msg)==NULL)	{		LOG(L_ERR, "trace_onreq_in: ERROR cannot parse FROM header\n");		return;	}	if(parse_headers(msg, HDR_CALLID_F, 0)!=0)	{		LOG(L_ERR, "trace_onreq_in: ERROR cannot parse call-id\n");		return;	}	if (msg->REQ_METHOD==METHOD_INVITE)	{		DBG("trace_onreq_in: noisy_timer set for tracing\n");		t->flags |= T_NOISY_CTIMER_FLAG;	}	if(tmb.register_tmcb( 0, t, TMCB_REQUEST_BUILT, trace_onreq_out, 0) <=0)	{		LOG(L_ERR,"trace_onreq_in:ERROR: can't register trace_onreq_out\n");		return;	}	if(tmb.register_tmcb( 0, t, TMCB_RESPONSE_IN, trace_onreply_in, 0) <=0)	{		LOG(L_ERR,			"trace_onreq_in:ERROR: can't register trace_onreply_in\n");		return;	}	if(tmb.register_tmcb( 0, t, TMCB_RESPONSE_OUT, trace_onreply_out, 0) <=0)	{		LOG(L_ERR,			"trace_onreq_in:ERROR: can't register trace_onreply_out\n");		return;	}}static void trace_onreq_out(struct cell* t, int type, struct tmcb_params *ps){	db_key_t db_keys[NR_KEYS];	db_val_t db_vals[NR_KEYS];	static char fromip_buff[IP_ADDR_MAX_STR_SIZE+12];	static char toip_buff[IP_ADDR_MAX_STR_SIZE+12];	struct sip_msg* msg;	int_str        avp_name;	int_str        avp_value;	struct usr_avp *avp;	struct ip_addr to_ip;	int len;	str *sbuf;	struct dest_info *dst;		DBG("trace_onreq_out: =================================\n");	if(t==NULL || ps==NULL)	{		DBG("trace_onreq_out: no uas request, local transaction\n");		return;	}	msg=ps->req;	if(msg==NULL)	{		DBG("trace_onreq_out: no uas msg, local transaction\n");		return;	}		avp = NULL;	avp_name.n = traced_user_avp;	avp=search_first_avp(0, avp_name, &avp_value, 0);		if((avp==NULL) && (trace_flag==0 || trace_on_flag==NULL 				|| *trace_on_flag==0 || isflagset(msg, trace_flag)!=1))	{		DBG("trace_onreq_out: trace off...\n");		return;	}	if(parse_from_header(msg)==-1 || msg->from==NULL || get_from(msg)==NULL)	{		LOG(L_ERR, "trace_onreq_out: ERROR cannot parse FROM header\n");		goto error;	}	if(parse_headers(msg, HDR_CALLID_F, 0)!=0)	{		LOG(L_ERR, "trace_onreq_out: ERROR cannot parse call-id\n");		return;	}	db_keys[0] = msg_column;	db_vals[0].type = DB_BLOB;	db_vals[0].nul = 0;	sbuf = (str*)ps->extra1;	if(sbuf!=NULL && sbuf->len>0)	{		db_vals[0].val.blob_val.s   = sbuf->s;		db_vals[0].val.blob_val.len = sbuf->len;	} else {		db_vals[0].val.blob_val.s   = "No request buffer";		db_vals[0].val.blob_val.len = sizeof("No request buffer")-1;	}		/* check Call-ID header */	if(msg->callid==NULL || msg->callid->body.s==NULL)	{		LOG(L_ERR, "trace_onreq_out: ERROR cannot find Call-ID header!\n");		goto error;	}	db_keys[1] = callid_column;	db_vals[1].type = DB_STR;	db_vals[1].nul = 0;	db_vals[1].val.str_val.s = msg->callid->body.s;	db_vals[1].val.str_val.len = msg->callid->body.len;		db_keys[2] = method_column;	db_vals[2].type = DB_STR;	db_vals[2].nul = 0;	sbuf = (str*)ps->extra1;	if(sbuf!=NULL && sbuf->len > 7 && !strncasecmp(sbuf->s, "CANCEL ", 7))	{		db_vals[2].val.str_val.s = "CANCEL";		db_vals[2].val.str_val.len = 6;	} else {		db_vals[2].val.str_val.s = t->method.s;		db_vals[2].val.str_val.len = t->method.len;	}			db_keys[3] = status_column;	db_vals[3].type = DB_STR;	db_vals[3].nul = 0;	db_vals[3].val.str_val.s = "";	db_vals[3].val.str_val.len = 0;			db_keys[4] = fromip_column;	db_vals[4].type = DB_STRING;	db_vals[4].nul = 0;	strcpy(fromip_buff, ip_addr2a(&msg->rcv.src_ip));	strcat(fromip_buff,":");	strcat(fromip_buff, int2str(msg->rcv.src_port, NULL));	db_vals[4].val.string_val = fromip_buff;		db_keys[5] = toip_column;	db_vals[5].type = DB_STRING;	db_vals[5].nul = 0;	memset(&to_ip, 0, sizeof(struct ip_addr));	dst = (struct dest_info*)ps->extra2;	if(dst==0)	{		db_vals[5].val.string_val = "255.255.255.255";	} else {		su2ip_addr(&to_ip, &dst->to);		if(dst->proto==PROTO_TCP) {			memcpy(toip_buff, "tcp:", 4);		} else if(dst->proto==PROTO_TLS) {			memcpy(toip_buff, "tls:", 4);		} else {			memcpy(toip_buff, "udp:", 4);		}		strcpy(toip_buff+4, ip_addr2a(&to_ip));		strcat(toip_buff+4, ":");		strcat(toip_buff+4,				int2str((unsigned long)su_getport(&dst->to), &len));		DBG("siptrace:trace_onreq_out: dest [%s]\n", toip_buff);		db_vals[5].val.string_val = toip_buff;	}		db_keys[6] = date_column;	db_vals[6].type = DB_DATETIME;	db_vals[6].nul = 0;	db_vals[6].val.int_val = time(NULL);		db_keys[7] = direction_column;	db_vals[7].type = DB_STRING;	db_vals[7].nul = 0;	db_vals[7].val.string_val = "out";		db_keys[8] = fromtag_column;	db_vals[8].type = DB_STR;	db_vals[8].nul = 0;	db_vals[8].val.str_val.s = get_from(msg)->tag_value.s;	db_vals[8].val.str_val.len = get_from(msg)->tag_value.len;		db_funcs.use_table(db_con, table);	db_keys[9] = traced_user_column;	db_vals[9].type = DB_STR;	db_vals[9].nul = 0;	if(trace_flag!=0 && trace_on_flag!=NULL 				&& *trace_on_flag!=0 && isflagset(msg, trace_flag)==1) {		db_vals[9].val.str_val.s   = "";		db_vals[9].val.str_val.len = 0;			DBG("trace_onreq_out: storing info...\n");		if(db_funcs.insert(db_con, db_keys, db_vals, NR_KEYS) < 0)		{			LOG(L_ERR, "trace_onreq_out: error storing trace\n");			goto error;		}#ifdef STATISTICS		update_stat(siptrace_req, 1);#endif	}		if(avp==NULL)		goto done;		trace_send_duplicate(db_vals[0].val.blob_val.s,			db_vals[0].val.blob_val.len);		db_vals[9].val.str_val.s = avp_value.s.s;	db_vals[9].val.str_val.len = avp_value.s.len;	DBG("trace_onreq_out: storing info...\n");	if(db_funcs.insert(db_con, db_keys, db_vals, NR_KEYS) < 0)	{		LOG(L_ERR, "trace_onreq_out: error storing trace\n");		goto error;	}	avp = search_next_avp( avp, &avp_value);	while(avp!=NULL)	{		db_vals[9].val.str_val.s = avp_value.s.s;		db_vals[9].val.str_val.len = avp_value.s.len;		DBG("trace_onreq_out: storing info...\n");		if(db_funcs.insert(db_con, db_keys, db_vals, NR_KEYS) < 0)		{			LOG(L_ERR, "trace_onreq_out: error storing trace\n");			goto error;		}		avp = search_next_avp( avp, &avp_value);	}	done:		return;error:	return;}static void trace_onreply_in(struct cell* t, int type, struct tmcb_params *ps){	struct sip_msg* msg;	DBG("trace_onreply_in: =================================\n");	if(t==NULL || t->uas.request==0 || ps==NULL)	{		DBG("trace_onreply_in: no uas request, local transaction\n");		return;	}	msg = ps->rpl;	if(msg==NULL || msg==FAKED_REPLY)	{		DBG("trace_onreply_in: no reply, local transaction\n");		return;	}		if(trace_flag==0 || trace_on_flag==NULL || *trace_on_flag==0 ||			isflagset(msg, trace_flag)!=1)	{		DBG("trace_onreply_in: trace off...\n");		return;	}}static void trace_onreply_out(struct cell* t, int type, struct tmcb_params *ps){	db_key_t db_keys[NR_KEYS];	db_val_t db_vals[NR_KEYS];	int faked = 0;	static char fromip_buff[IP_ADDR_MAX_STR_SIZE+12];	static char toip_buff[IP_ADDR_MAX_STR_SIZE+12];	struct sip_msg* msg;	int_str        avp_name;	int_str        avp_value;	struct usr_avp *avp;	struct ip_addr to_ip;	int len;	char statusbuf[8];	str *sbuf;	struct dest_info *dst;	DBG("trace_onreply_out: =================================\n");		if (t==NULL || t->uas.request==0 || ps==NULL)	{		DBG("trace_onreply_out: no uas request, local transaction\n");		return;	}		avp = NULL;	avp_name.n = traced_user_avp;	avp=search_first_avp(0, avp_name, &avp_value, 0);		if((avp==NULL) && (trace_flag==0 || trace_on_flag==NULL			|| *trace_on_flag==0 || isflagset(t->uas.request, trace_flag)!=1))	{		DBG("trace_onreply_out: trace off...\n");		return;	}		msg = ps->rpl;	if(msg==NULL || msg==FAKED_REPLY)	{		msg = t->uas.request;		faked = 1;	}	if(parse_from_header(msg)==-1 || msg->from==NULL || get_from(msg)==NULL)	{		LOG(L_ERR, "trace_onreply_out: ERROR cannot parse FROM header\n");		goto error;	}	if(parse_headers(msg, HDR_CALLID_F, 0)!=0)	{		LOG(L_ERR, "trace_onreply_out: ERROR cannot parse call-id\n");		return;	}	db_keys[0] = msg_column;	db_vals[0].type = DB_BLOB;	db_vals[0].nul = 0;	sbuf = (str*)ps->extra1;	if(faked==0)	{		if(sbuf!=0 && sbuf->len>0) {			db_vals[0].val.blob_val.s   = sbuf->s;			db_vals[0].val.blob_val.len = sbuf->len;		} else if(t->uas.response.buffer.s!=NULL) {			db_vals[0].val.blob_val.s   = t->uas.response.buffer.s;			db_vals[0].val.blob_val.len = t->uas.response.buffer.len;		} else if(msg->len>0) {			db_vals[0].val.blob_val.s   = msg->buf;			db_vals[0].val.blob_val.len = msg->len;		} else {			db_vals[0].val.blob_val.s   = "No reply buffer";			db_vals[0].val.blob_val.len = sizeof("No reply buffer")-1;		}	} else {		if(sbuf!=0 && sbuf->len>0) {			db_vals[0].val.blob_val.s   = sbuf->s;			db_vals[0].val.blob_val.len = sbuf->len;		} else if(t->uas.response.buffer.s==NULL) {			db_vals[0].val.blob_val.s = "No reply buffer";			db_vals[0].val.blob_val.len = sizeof("No reply buffer")-1;		} else {			db_vals[0].val.blob_val.s = t->uas.response.buffer.s;			db_vals[0].val.blob_val.len = t->uas.response.buffer.len;		}	}		/* check Call-ID header */	if(msg->callid==NULL || msg->callid->body.s==NULL)	{		LOG(L_ERR, "trace_onreply_out: ERROR cannot find Call-ID header!\n");		goto error;	}	db_keys[1] = callid_column;	db_vals[1].type = DB_STR;	db_vals[1].nul = 0;	db_vals[1].val.str_val.s = msg->callid->body.s;	db_vals[1].val.str_val.len = msg->callid->body.len;		db_keys[2] = method_column;	db_vals[2].type = DB_STR;	db_vals[2].nul = 0;	db_vals[2].val.str_val.s = t->method.s;	db_vals[2].val.str_val.len = t->method.len;			db_keys[4] = fromip_column;	db_vals[4].type = DB_STRING;	db_vals[4].nul = 0;	if(faked==1)	{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?