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 + -
显示快捷键?