From 7b1359adfcd55f12fd3739c04e30e1c12b91a71b Mon Sep 17 00:00:00 2001 From: ionutrazvanionita Date: Thu, 28 Apr 2016 17:11:26 +0300 Subject: [PATCH] [hep][bugfix] correctly store ports/addresses --- modules/proto_hep/hep.c | 63 ++++++++++++++++++++----------------- modules/proto_hep/hep.h | 11 ++++--- modules/siptrace/siptrace.c | 8 ++--- modules/siptrace/siptrace.h | 4 +-- 4 files changed, 47 insertions(+), 39 deletions(-) diff --git a/modules/proto_hep/hep.c b/modules/proto_hep/hep.c index 80654f9c49d..218378b40f1 100644 --- a/modules/proto_hep/hep.c +++ b/modules/proto_hep/hep.c @@ -50,10 +50,12 @@ extern int payload_compression; extern compression_api_t compression_api; -static int pack_hepv3(union sockaddr_union* from_su, union sockaddr_union* to_su, - int proto, char *payload, int plen, char **retbuf, int *retlen); -static int pack_hepv2(union sockaddr_union* from_su, union sockaddr_union* to_su, - int proto, char *payload, int plen, char **retbuf, int *retlen); +static int pack_hepv3(struct sip_msg* msg, union sockaddr_union* from_su, + union sockaddr_union* to_su, int proto, char *payload, int plen, + char **retbuf, int *retlen); +static int pack_hepv2(struct sip_msg* msg, union sockaddr_union* from_su, + union sockaddr_union* to_su, int proto, char *payload, int plen, + char **retbuf, int *retlen); /* * @@ -67,21 +69,22 @@ static int pack_hepv2(union sockaddr_union* from_su, union sockaddr_union* to_su * @out2 packed buffer length * it's your job to free the buffers */ -int pack_hep(union sockaddr_union* from_su, union sockaddr_union* to_su, - int proto, char *payload, int plen, char **retbuf, int *retlen) +int pack_hep(struct sip_msg* msg, union sockaddr_union* from_su, + union sockaddr_union* to_su, int proto, char *payload, int plen, + char **retbuf, int *retlen) { switch (hep_version) { case 1: case 2: - if (pack_hepv2(from_su, to_su, proto, payload, + if (pack_hepv2(msg, from_su, to_su, proto, payload, plen, retbuf, retlen) < 0) { LM_ERR("failed to pack using hep protocol version 3\n"); return -1; } break; case 3: - if (pack_hepv3(from_su, to_su, proto, payload, + if (pack_hepv3(msg, from_su, to_su, proto, payload, plen, retbuf, retlen) < 0) { LM_ERR("failed to pack using hep protocol version 3\n"); return -1; @@ -107,8 +110,9 @@ int pack_hep(union sockaddr_union* from_su, union sockaddr_union* to_su, * @out1 packed buffer (pkg) * @out2 packed buffer length */ -static int pack_hepv3(union sockaddr_union* from_su, union sockaddr_union* to_su, - int proto, char *payload, int plen, char **retbuf, int *retlen) +static int pack_hepv3(struct sip_msg* msg, union sockaddr_union* from_su, + union sockaddr_union* to_su, int proto, char *payload, int plen, + char **retbuf, int *retlen) { int rc; int buflen, iplen=0, tlen; @@ -150,13 +154,13 @@ static int pack_hepv3(union sockaddr_union* from_su, union sockaddr_union* to_su /* SRC IP */ src_ip4.chunk.vendor_id = htons(GENERIC_VENDOR_ID); src_ip4.chunk.type_id = htons(0x0003); - src_ip4.data = from_su->sin.sin_addr; + src_ip4.data = *(struct in_addr*)msg->rcv.src_ip.u.addr; src_ip4.chunk.length = htons(sizeof(src_ip4)); /* DST IP */ dst_ip4.chunk.vendor_id = htons(GENERIC_VENDOR_ID); dst_ip4.chunk.type_id = htons(0x0004); - dst_ip4.data = to_su->sin.sin_addr; + dst_ip4.data = *(struct in_addr*)msg->rcv.dst_ip.u.addr; dst_ip4.chunk.length = htons(sizeof(dst_ip4)); iplen = sizeof(dst_ip4) + sizeof(src_ip4); @@ -164,13 +168,13 @@ static int pack_hepv3(union sockaddr_union* from_su, union sockaddr_union* to_su /* SRC PORT */ hg.src_port.chunk.vendor_id = htons(GENERIC_VENDOR_ID); hg.src_port.chunk.type_id = htons(0x0007); - hg.src_port.data = htons(from_su->sin.sin_port); + hg.src_port.data = htons(msg->rcv.src_port); hg.src_port.chunk.length = htons(sizeof(hg.src_port)); /* DST PORT */ hg.dst_port.chunk.vendor_id = htons(GENERIC_VENDOR_ID); hg.dst_port.chunk.type_id = htons(0x0008); - hg.dst_port.data = htons(to_su->sin.sin_port); + hg.dst_port.data = htons(msg->rcv.dst_port); hg.dst_port.chunk.length = htons(sizeof(hg.dst_port)); } /* IPv6 */ @@ -178,13 +182,13 @@ static int pack_hepv3(union sockaddr_union* from_su, union sockaddr_union* to_su /* SRC IPv6 */ src_ip6.chunk.vendor_id = htons(GENERIC_VENDOR_ID); src_ip6.chunk.type_id = htons(0x0005); - src_ip6.data = from_su->sin6.sin6_addr; + src_ip6.data = *(struct in6_addr*)msg->rcv.src_ip.u.addr; src_ip6.chunk.length = htonl(sizeof(src_ip6)); /* DST IPv6 */ dst_ip6.chunk.vendor_id = htons(GENERIC_VENDOR_ID); dst_ip6.chunk.type_id = htons(0x0006); - dst_ip6.data = from_su->sin6.sin6_addr; + dst_ip6.data = *(struct in6_addr*)msg->rcv.dst_ip.u.addr; dst_ip6.chunk.length = htonl(sizeof(dst_ip6)); iplen = sizeof(dst_ip6) + sizeof(src_ip6); @@ -192,13 +196,13 @@ static int pack_hepv3(union sockaddr_union* from_su, union sockaddr_union* to_su /* SRC PORT */ hg.src_port.chunk.vendor_id = htons(GENERIC_VENDOR_ID); hg.src_port.chunk.type_id = htons(0x0007); - hg.src_port.data = htons(from_su->sin6.sin6_port); + hg.src_port.data = htons(msg->rcv.src_port); hg.src_port.chunk.length = htons(sizeof(hg.src_port)); /* DST PORT */ hg.dst_port.chunk.vendor_id = htons(GENERIC_VENDOR_ID); hg.dst_port.chunk.type_id = htons(0x0008); - hg.dst_port.data = htons(to_su->sin6.sin6_port); + hg.dst_port.data = htons(msg->rcv.dst_port); hg.dst_port.chunk.length = htons(sizeof(hg.dst_port)); } @@ -316,8 +320,9 @@ static int pack_hepv3(union sockaddr_union* from_su, union sockaddr_union* to_su * @out2 packed buffer length */ -static int pack_hepv2(union sockaddr_union* from_su, union sockaddr_union* to_su, - int proto, char *payload, int plen, char **retbuf, int *retlen) +static int pack_hepv2(struct sip_msg* msg, union sockaddr_union* from_su, + union sockaddr_union* to_su, int proto, char *payload, int plen, + char **retbuf, int *retlen) { char* buffer; unsigned int totlen=0, buflen=0; @@ -373,28 +378,28 @@ static int pack_hepv2(union sockaddr_union* from_su, union sockaddr_union* to_su switch (hdr.hp_f) { case AF_INET: /* Source && Destination ipaddresses*/ - hep_ipheader.hp_src = from_su->sin.sin_addr; - hep_ipheader.hp_dst = to_su->sin.sin_addr; + hep_ipheader.hp_src = *(struct in_addr*)msg->rcv.src_ip.u.addr; + hep_ipheader.hp_dst = *(struct in_addr*)msg->rcv.dst_ip.u.addr; /* copy hep ipheader */ memcpy((void*)buffer + buflen, &hep_ipheader, sizeof(struct hep_iphdr)); buflen += sizeof(struct hep_iphdr); - hdr.hp_sport = htons(from_su->sin.sin_port); /* src port */ - hdr.hp_dport = htons(to_su->sin.sin_port); /* dst port */ + hdr.hp_sport = htons(msg->rcv.src_port); + hdr.hp_dport = htons(msg->rcv.dst_port); break; case AF_INET6: /* Source && Destination ipv6addresses*/ - hep_ip6header.hp6_src = from_su->sin6.sin6_addr; - hep_ip6header.hp6_dst = to_su->sin6.sin6_addr; + hep_ip6header.hp6_src = *(struct in6_addr*)msg->rcv.src_ip.u.addr; + hep_ip6header.hp6_dst = *(struct in6_addr*)msg->rcv.dst_ip.u.addr; /* copy hep6 ipheader */ memcpy((void*)buffer + buflen, &hep_ip6header, sizeof(struct hep_ip6hdr)); buflen += sizeof(struct hep_ip6hdr); - hdr.hp_sport = htons(from_su->sin6.sin6_port); /* src port */ - hdr.hp_dport = htons(to_su->sin6.sin6_port); /* dst port */ + hdr.hp_sport = htons(msg->rcv.src_port); + hdr.hp_dport = htons(msg->rcv.dst_port); break; } @@ -650,7 +655,7 @@ int unpack_hepv3(char *buf, int len, struct hep_desc *h) h3.hg.dst_port = *((hep_chunk_uint16_t*)buf); CONVERT_TO_HBO(h3.hg.dst_port.chunk); - h3.hg.dst_port.data = ntohs(h3.hg.src_port.data); + h3.hg.dst_port.data = ntohs(h3.hg.dst_port.data); UPDATE_BUFFER(buf, tlen, h3.hg.dst_port.chunk.length); diff --git a/modules/proto_hep/hep.h b/modules/proto_hep/hep.h index c3d6c5afa8d..76dac79fc29 100644 --- a/modules/proto_hep/hep.h +++ b/modules/proto_hep/hep.h @@ -27,6 +27,7 @@ #define _HEP_H #include "../../ip_addr.h" +#include "../../parser/msg_parser.h" #define HEP_HEADER_ID "\x48\x45\x50\x33" #define HEP_HEADER_ID_LEN (sizeof(HEP_HEADER_ID) - 1) @@ -230,15 +231,17 @@ struct hep_context { int resume_with_sip; }; -int pack_hep(union sockaddr_union* from_su, union sockaddr_union* to_su, - int proto, char *payload, int plen, char **retbuf, int *retlen); +int pack_hep(struct sip_msg* msg, union sockaddr_union* from_su, + union sockaddr_union* to_su, int proto, char *payload, int plen, + char **retbuf, int *retlen); int unpack_hepv2(char *buf, int len, struct hep_desc* h); int unpack_hepv3(char *buf, int len, struct hep_desc *h); int unpack_hep(char *buf, int len, int version, struct hep_desc* h); -typedef int (*pack_hep_t)(union sockaddr_union* from_su, union sockaddr_union* to_su, - int proto, char *payload, int plen, char **retbuf, int *retlen); +typedef int (*pack_hep_t)(struct sip_msg* msg, union sockaddr_union* from_su, + union sockaddr_union* to_su, int proto, char *payload, int plen, + char **retbuf, int *retlen); typedef int (*get_hep_ctx_id_t)(void); #endif diff --git a/modules/siptrace/siptrace.c b/modules/siptrace/siptrace.c index c1064d47726..148a61be1e2 100644 --- a/modules/siptrace/siptrace.c +++ b/modules/siptrace/siptrace.c @@ -904,7 +904,7 @@ static int save_siptrace(struct sip_msg *msg, db_key_t *keys, db_val_t *vals, switch (it->type) { case TYPE_HEP: - if (trace_send_hep_duplicate(&db_vals[0].val.blob_val, + if (trace_send_hep_duplicate(msg, &db_vals[0].val.blob_val, &db_vals[4].val.str_val, &db_vals[5].val.str_val, db_vals[6].val.int_val, &db_vals[7].val.str_val, &db_vals[8].val.str_val, db_vals[9].val.int_val, @@ -2210,8 +2210,8 @@ static int trace_send_duplicate(char *buf, int len, struct sip_uri *uri) return ret; } -static int trace_send_hep_duplicate(str *body, str *fromproto, str *fromip, - unsigned short fromport, str *toproto, str *toip, +static int trace_send_hep_duplicate(struct sip_msg* msg, str *body, str *fromproto, + str *fromip, unsigned short fromport, str *toproto, str *toip, unsigned short toport, struct sip_uri *uri) { struct proxy_l * p=NULL /* make gcc happy */; @@ -2256,7 +2256,7 @@ static int trace_send_hep_duplicate(str *body, str *fromproto, str *fromip, hostent2su(to, &p->host, p->addr_idx, (p->port)?p->port:SIP_PORT); - if (hep_api.pack_hep(&from_su, to, proto, body->s, body->len, + if (hep_api.pack_hep(msg, &from_su, to, proto, body->s, body->len, &hepbuf, &heplen)) { LM_ERR("failed to do hep packing\n"); return -1; diff --git a/modules/siptrace/siptrace.h b/modules/siptrace/siptrace.h index 497a4a41d04..cf105abf71a 100644 --- a/modules/siptrace/siptrace.h +++ b/modules/siptrace/siptrace.h @@ -107,8 +107,8 @@ static void trace_slack_in(struct sip_msg* req, str *buffer,int rpl_code, static struct mi_root* sip_trace_mi(struct mi_root* cmd, void* param ); static int trace_send_duplicate(char *buf, int len, struct sip_uri *uri); -static int trace_send_hep_duplicate(str *body, str *fromproto, str *fromip, - unsigned short fromport, str *toproto, str *toip, +static int trace_send_hep_duplicate(struct sip_msg* msg, str *body, str *fromproto, + str *fromip, unsigned short fromport, str *toproto, str *toip, unsigned short toport, struct sip_uri *uri);