Skip to content

Commit

Permalink
[hep][bugfix] correctly store ports/addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
ionutrazvanionita committed Apr 28, 2016
1 parent e7c14bc commit 7b1359a
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 39 deletions.
63 changes: 34 additions & 29 deletions modules/proto_hep/hep.c
Expand Up @@ -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);

/*
*
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -150,55 +154,55 @@ 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);

/* 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 */
else if(from_su->s.sa_family == AF_INET6) {
/* 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);

/* 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));
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);

Expand Down
11 changes: 7 additions & 4 deletions modules/proto_hep/hep.h
Expand Up @@ -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)
Expand Down Expand Up @@ -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

8 changes: 4 additions & 4 deletions modules/siptrace/siptrace.c
Expand Up @@ -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,
Expand Down Expand Up @@ -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 */;
Expand Down Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions modules/siptrace/siptrace.h
Expand Up @@ -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);


Expand Down

0 comments on commit 7b1359a

Please sign in to comment.