Module: kamailio Branch: master Commit: 1771f7e489b060290b38fc0a428058ca7e2b5f42 URL: https://github.com/kamailio/kamailio/commit/1771f7e489b060290b38fc0a428058ca...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2016-01-11T12:41:48+01:00
siptrace: new parameter trace_mode
- if set to 1, is using the SREV_NET_DATA_SEND event for sending HEP packets to sipcapture server for packets sent to the network
---
Modified: modules/siptrace/siptrace.c
---
Diff: https://github.com/kamailio/kamailio/commit/1771f7e489b060290b38fc0a428058ca... Patch: https://github.com/kamailio/kamailio/commit/1771f7e489b060290b38fc0a428058ca...
---
diff --git a/modules/siptrace/siptrace.c b/modules/siptrace/siptrace.c index 158d2f1..7c689c3 100644 --- a/modules/siptrace/siptrace.c +++ b/modules/siptrace/siptrace.c @@ -50,6 +50,7 @@ #include "../../modules/sl/sl.h" #include "../../str.h" #include "../../onsend.h" +#include "../../events.h"
#include "../../modules/sipcapture/hep.h"
@@ -106,6 +107,9 @@ static void trace_sl_ack_in(sl_cbp_t *slcb); static int trace_send_hep_duplicate(str *body, str *from, str *to, struct dest_info*); static int pipport2su (char *pipport, union sockaddr_union *tmp_su, unsigned int *proto);
+int siptrace_net_data_send(void *data); +static int _siptrace_mode = 0; +
static struct mi_root* sip_trace_mi(struct mi_root* cmd, void* param );
@@ -211,6 +215,7 @@ static param_export_t params[] = { {"hep_version", INT_PARAM, &hep_version }, {"hep_capture_id", INT_PARAM, &hep_capture_id }, {"trace_delayed", INT_PARAM, &trace_delayed }, + {"trace_mode", PARAM_INT, &_siptrace_mode }, {0, 0, 0} };
@@ -448,6 +453,9 @@ static int mod_init(void) trace_table_avp_type = 0; }
+ if(_siptrace_mode==1) { + sr_event_register_cb(SREV_NET_DATA_SEND, siptrace_net_data_send); + } return 0; }
@@ -1906,6 +1914,53 @@ static int pipport2su (char *pipport, union sockaddr_union *tmp_su, unsigned int return -1; }
+/** + * + */ +int siptrace_net_data_send(void *data) +{ + sr_net_info_t *nd; + struct dest_info new_dst; + struct _siptrace_data sto; + + if(data==0) + return -1; + + nd = (sr_net_info_t*)data; + if(nd->dst==NULL || nd->data.s==NULL || nd->data.len<=0) + return -1; + + new_dst=*nd->dst; + new_dst.send_sock=get_send_socket(0, &nd->dst->to, nd->dst->proto); + + memset(&sto, 0, sizeof(struct _siptrace_data)); + + sto.body.s = nd->data.s; + sto.body.len = nd->data.len; + + if (unlikely(new_dst.send_sock==0)) { + LM_WARN("no sending socket found\n"); + strcpy(sto.fromip_buff, "any:255.255.255.255:5060"); + } else { + strncpy(sto.fromip_buff, new_dst.send_sock->sock_str.s, + new_dst.send_sock->sock_str.len); + } + sto.fromip.s = sto.fromip_buff; + sto.fromip.len = strlen(sto.fromip_buff); + + siptrace_copy_proto(new_dst.send_sock->proto, sto.toip_buff); + strcat(sto.toip_buff, suip2a(&new_dst.to, sizeof(new_dst.to))); + strcat(sto.toip_buff,":"); + strcat(sto.toip_buff, int2str((int)su_getport(&new_dst.to), NULL)); + sto.toip.s = sto.toip_buff; + sto.toip.len = strlen(sto.toip_buff); + + sto.dir = "out"; + + trace_send_hep_duplicate(&sto.body, &sto.fromip, &sto.toip, NULL); + return 0; +} + static void siptrace_rpc_status (rpc_t* rpc, void* c) { str status = {0, 0};
@@ -1956,4 +2011,3 @@ static int siptrace_init_rpc(void) } return 0; } -