/* * @in1 buffer = hep + sip * @in2 buffer length * @in3 version - needed to make the difference betwen 3 and the first 2 protos * @out1 structure containing hep details + headers | see hep.h */ int unpack_hep(char *buf, int len, int version, struct hep_desc* h) { int err; if (version == 3) err = unpack_hepv3(buf, len, h); else err = unpack_hepv2(buf, len, h); return err; }
static int hep_udp_read_req(struct socket_info *si, int* bytes_read) { struct receive_info ri; int len; #ifdef DYN_BUF char* buf; #else static char buf [BUF_SIZE+1]; #endif char *tmp; unsigned int fromlen; str msg; struct hep_desc h; int ret = 0; #ifdef DYN_BUF buf=pkg_malloc(BUF_SIZE+1); if (buf==0){ LM_ERR("could not allocate receive buffer\n"); goto error; } #endif fromlen=sockaddru_len(si->su); len=recvfrom(bind_address->socket, buf, BUF_SIZE,0,&ri.src_su.s,&fromlen); if (len==-1){ if (errno==EAGAIN) return 0; if ((errno==EINTR)||(errno==EWOULDBLOCK)|| (errno==ECONNREFUSED)) return -1; LM_ERR("recvfrom:[%d] %s\n", errno, strerror(errno)); return -2; } if (len<MIN_UDP_PACKET) { LM_DBG("probing packet received len = %d\n", len); return 0; } /* we must 0-term the messages, receive_msg expects it */ buf[len]=0; /* no need to save the previous char */ ri.bind_address = si; ri.dst_port = si->port_no; ri.dst_ip = si->address; ri.proto = si->proto; ri.proto_reserved1 = ri.proto_reserved2 = 0; su2ip_addr(&ri.src_ip, &ri.src_su); ri.src_port=su_getport(&ri.src_su); msg.s = buf; msg.len = len; /* if udp we are sure that version 1 or 2 of the * protocol is used */ if (unpack_hepv2(buf, len, &h)) { LM_ERR("hep unpacking failed\n"); return -1; } /* run hep callbacks if looks like non-SIP message*/ if( !isalpha(msg.s[0]) ) { /* not-SIP related */ ret=run_hep_cbs(&h, &ri); if (ret < 0) { LM_ERR("failed to run hep callbacks\n"); return -1; } /* remove the hep header; leave only the payload */ memmove(buf, h.u.hepv12.payload, /* also copy '\0' character */ strlen(h.u.hepv12.payload)+1); msg.s = buf; msg.len = strlen(buf); } if (ri.src_port==0){ tmp=ip_addr2a(&ri.src_ip); LM_INFO("dropping 0 port packet for %s\n", tmp); return 0; } if (ret != HEP_SCRIPT_SKIP) { /* receive_msg must free buf too!*/ receive_msg( msg.s, msg.len, &ri); } return 0; }