瀏覽代碼

siptrace: use advertise address if set for trace mode 1 callbacks

(cherry picked from commit 9fb15e2ef93a0d606fa4c6d695a2f13a4b0a8031)
Daniel-Constantin Mierla 11 月之前
父節點
當前提交
faf27cef71
共有 1 個文件被更改,包括 30 次插入14 次删除
  1. 30 14
      src/modules/siptrace/siptrace.c

+ 30 - 14
src/modules/siptrace/siptrace.c

@@ -2308,15 +2308,26 @@ int siptrace_net_data_recv(sr_event_param_t *evp)
 		sto.fromip.s = sto.fromip_buff;
 	}
 
-	sto.toip.len = snprintf(sto.toip_buff, SIPTRACE_ADDR_MAX, "%s:%s:%d",
-			siptrace_proto_name(nd->rcv->proto), ip_addr2strz(&nd->rcv->dst_ip),
-			(int)nd->rcv->dst_port);
-	if(sto.toip.len < 0 || sto.toip.len >= SIPTRACE_ADDR_MAX) {
-		LM_ERR("failed to format toip buffer (%d)\n", sto.toip.len);
-		sto.toip.s = SIPTRACE_ANYADDR;
-		sto.toip.len = SIPTRACE_ANYADDR_LEN;
-	} else {
+	if(nd->rcv->bind_address != NULL
+			&& nd->rcv->bind_address->useinfo.sock_str.len > 0
+			&& (nd->rcv->bind_address->useinfo.sock_str.len
+					< SIPTRACE_ADDR_MAX - 1)) {
+		sto.toip.len = nd->rcv->bind_address->useinfo.sock_str.len;
+		memcpy(sto.toip_buff, nd->rcv->bind_address->useinfo.sock_str.s,
+				sto.toip.len);
+		sto.toip_buff[sto.toip.len] = '\0';
 		sto.toip.s = sto.toip_buff;
+	} else {
+		sto.toip.len = snprintf(sto.toip_buff, SIPTRACE_ADDR_MAX, "%s:%s:%d",
+				siptrace_proto_name(nd->rcv->proto),
+				ip_addr2strz(&nd->rcv->dst_ip), (int)nd->rcv->dst_port);
+		if(sto.toip.len < 0 || sto.toip.len >= SIPTRACE_ADDR_MAX) {
+			LM_ERR("failed to format toip buffer (%d)\n", sto.toip.len);
+			sto.toip.s = SIPTRACE_ANYADDR;
+			sto.toip.len = SIPTRACE_ANYADDR_LEN;
+		} else {
+			sto.toip.s = sto.toip_buff;
+		}
 	}
 
 	sto.dir = "in";
@@ -2408,6 +2419,7 @@ int siptrace_net_data_sent(sr_event_param_t *evp)
 	int proto;
 	int evcb_ret;
 	int ret = 0;
+	str vsock;
 
 	if(evp->data == 0)
 		return -1;
@@ -2437,14 +2449,18 @@ int siptrace_net_data_sent(sr_event_param_t *evp)
 		sto.fromip.len = SIPTRACE_ANYADDR_LEN;
 		proto = PROTO_UDP;
 	} else {
-		if(new_dst.send_sock->sock_str.len >= SIPTRACE_ADDR_MAX - 1) {
-			LM_ERR("socket string is too large: %d\n",
-					new_dst.send_sock->sock_str.len);
+		if(new_dst.send_sock->useinfo.sock_str.len > 0) {
+			vsock = new_dst.send_sock->useinfo.sock_str;
+		} else {
+			vsock = new_dst.send_sock->sock_str;
+		}
+		if(vsock.len >= SIPTRACE_ADDR_MAX - 1) {
+			LM_ERR("socket string is too large: %d\n", vsock.len);
 			return -1;
 		}
-		strncpy(sto.fromip_buff, new_dst.send_sock->sock_str.s,
-				new_dst.send_sock->sock_str.len);
-		sto.fromip.len = new_dst.send_sock->sock_str.len;
+		memcpy(sto.fromip_buff, vsock.s, vsock.len);
+		sto.fromip.len = vsock.len;
+		sto.fromip_buff[sto.fromip.len] = '\0';
 		proto = new_dst.send_sock->proto;
 	}
 	sto.fromip.s = sto.fromip_buff;