int pv_get_sndto(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { struct onsend_info* snd_inf; struct ip_addr ip; str s; snd_inf=get_onsend_info(); if (! likely(snd_inf && snd_inf->send_sock)) return pv_get_null(msg, param, res); switch(param->pvn.u.isname.name.n) { case 1: /* af */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->address.af); case 2: /* port */ return pv_get_uintval(msg, param, res, (int)su_getport(snd_inf->to)); case 3: /* proto */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->proto); case 4: /* buf */ s.s = snd_inf->buf; s.len = snd_inf->len; return pv_get_strval(msg, param, res, &s); case 5: /* len */ return pv_get_uintval(msg, param, res, (int)snd_inf->len); case 6: /* sproto */ if(get_valid_proto_string((int)snd_inf->send_sock->proto, 0, 0, &s)<0) return pv_get_null(msg, param, res); return pv_get_strval(msg, param, res, &s); default: /* 0 - ip */ su2ip_addr(&ip, snd_inf->to); s.s = ip_addr2a(&ip); s.len = strlen(s.s); return pv_get_strval(msg, param, res, &s); } return 0; }
int pv_get_sndfrom(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) { struct onsend_info* snd_inf; str s; snd_inf=get_onsend_info(); if (! likely(snd_inf && snd_inf->send_sock)) return pv_get_null(msg, param, res); switch(param->pvn.u.isname.name.n) { case 1: /* af */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->address.af); case 2: /* port */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->port_no); case 3: /* proto */ return pv_get_uintval(msg, param, res, (int)snd_inf->send_sock->proto); case 4: /* buf */ s.s = snd_inf->buf; s.len = snd_inf->len; return pv_get_strval(msg, param, res, &s); case 5: /* len */ return pv_get_uintval(msg, param, res, (int)snd_inf->len); default: /* 0 - ip */ return pv_get_strval(msg, param, res, &snd_inf->send_sock->address_str); } return 0; }
static int sip_trace(struct sip_msg *msg, struct dest_info * dst, char *dir) { struct _siptrace_data sto; struct onsend_info *snd_inf = NULL; if (dst){ if (dst->send_sock == 0){ dst->send_sock=get_send_socket(0, &dst->to, dst->proto); if (dst->send_sock==0){ LM_ERR("can't forward to af %d, proto %d no corresponding" " listening socket\n", dst->to.s.sa_family, dst->proto); return -1; } } } if(msg==NULL) { LM_DBG("nothing to trace\n"); return -1; } memset(&sto, 0, sizeof(struct _siptrace_data)); if(traced_user_avp.n!=0) sto.avp=search_first_avp(traced_user_avp_type, traced_user_avp, &sto.avp_value, &sto.state); if((sto.avp==NULL) && (trace_on_flag==NULL || *trace_on_flag==0)) { LM_DBG("trace off...\n"); return -1; } if(sip_trace_prepare(msg)<0) return -1; sto.callid = msg->callid->body; if(msg->first_line.type==SIP_REQUEST) { sto.method = msg->first_line.u.request.method; } else { if(parse_headers(msg, HDR_CSEQ_F, 0) != 0 || msg->cseq==NULL || msg->cseq->parsed==NULL) { LM_ERR("cannot parse cseq header\n"); return -1; } sto.method = get_cseq(msg)->method; } if(msg->first_line.type==SIP_REPLY) { sto.status = msg->first_line.u.reply.status; } else { sto.status.s = ""; sto.status.len = 0; } snd_inf=get_onsend_info(); if(snd_inf==NULL) { sto.body.s = msg->buf; sto.body.len = msg->len; siptrace_copy_proto(msg->rcv.proto, sto.fromip_buff); strcat(sto.fromip_buff, ip_addr2a(&msg->rcv.src_ip)); strcat(sto.fromip_buff,":"); strcat(sto.fromip_buff, int2str(msg->rcv.src_port, NULL)); sto.fromip.s = sto.fromip_buff; sto.fromip.len = strlen(sto.fromip_buff); siptrace_copy_proto(msg->rcv.proto, sto.toip_buff); strcat(sto.toip_buff, ip_addr2a(&msg->rcv.dst_ip)); strcat(sto.toip_buff,":"); strcat(sto.toip_buff, int2str(msg->rcv.dst_port, NULL)); sto.toip.s = sto.toip_buff; sto.toip.len = strlen(sto.toip_buff); sto.dir = (dir)?dir:"in"; } else { sto.body.s = snd_inf->buf; sto.body.len = snd_inf->len; strncpy(sto.fromip_buff, snd_inf->send_sock->sock_str.s, snd_inf->send_sock->sock_str.len); sto.fromip.s = sto.fromip_buff; sto.fromip.len = strlen(sto.fromip_buff); siptrace_copy_proto(snd_inf->send_sock->proto, sto.toip_buff); strcat(sto.toip_buff, suip2a(snd_inf->to, sizeof(*snd_inf->to))); strcat(sto.toip_buff,":"); strcat(sto.toip_buff, int2str((int)su_getport(snd_inf->to), NULL)); sto.toip.s = sto.toip_buff; sto.toip.len = strlen(sto.toip_buff); sto.dir = "out"; } sto.fromtag = get_from(msg)->tag_value; sto.totag = get_to(msg)->tag_value; #ifdef STATISTICS if(msg->first_line.type==SIP_REPLY) { sto.stat = siptrace_rpl; } else { sto.stat = siptrace_req; } #endif return sip_trace_store(&sto, dst); }