|
|
|
@ -89,12 +89,13 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
|
|
|
|
|
p->ip6h = SCMalloc(sizeof(IPV6Hdr));
|
|
|
|
|
if (p->ip6h == NULL)
|
|
|
|
|
return NULL;
|
|
|
|
|
goto error;
|
|
|
|
|
memset(p->ip6h, 0, sizeof(IPV6Hdr));
|
|
|
|
|
p->ip6h->s_ip6_nxt = ipproto;
|
|
|
|
|
p->ip6h->s_ip6_plen = htons(payload_len + sizeof(TCPHdr));
|
|
|
|
|
|
|
|
|
|
inet_pton(AF_INET6, src, &in);
|
|
|
|
|
if (inet_pton(AF_INET6, src, &in) <= 0)
|
|
|
|
|
goto error;
|
|
|
|
|
p->src.addr_data32[0] = in[0];
|
|
|
|
|
p->src.addr_data32[1] = in[1];
|
|
|
|
|
p->src.addr_data32[2] = in[2];
|
|
|
|
@ -105,7 +106,8 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
p->ip6h->ip6_src[2] = in[2];
|
|
|
|
|
p->ip6h->ip6_src[3] = in[3];
|
|
|
|
|
|
|
|
|
|
inet_pton(AF_INET6, dst, &in);
|
|
|
|
|
if (inet_pton(AF_INET6, dst, &in) <= 0)
|
|
|
|
|
goto error;
|
|
|
|
|
p->dst.addr_data32[0] = in[0];
|
|
|
|
|
p->dst.addr_data32[1] = in[1];
|
|
|
|
|
p->dst.addr_data32[2] = in[2];
|
|
|
|
@ -118,13 +120,25 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
|
|
|
|
|
p->tcph = SCMalloc(sizeof(TCPHdr));
|
|
|
|
|
if (p->tcph == NULL)
|
|
|
|
|
return NULL;
|
|
|
|
|
goto error;
|
|
|
|
|
memset(p->tcph, 0, sizeof(TCPHdr));
|
|
|
|
|
p->tcph->th_sport = htons(sport);
|
|
|
|
|
p->tcph->th_dport = htons(dport);
|
|
|
|
|
|
|
|
|
|
SET_PKT_LEN(p, sizeof(IPV6Hdr) + sizeof(TCPHdr) + payload_len);
|
|
|
|
|
return p;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
if (p != NULL) {
|
|
|
|
|
if (p->ip6h != NULL) {
|
|
|
|
|
SCFree(p->ip6h);
|
|
|
|
|
}
|
|
|
|
|
if (p->tcph != NULL) {
|
|
|
|
|
SCFree(p->tcph);
|
|
|
|
|
}
|
|
|
|
|
SCFree(p);
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -162,17 +176,19 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
p->payload_len = payload_len;
|
|
|
|
|
p->proto = ipproto;
|
|
|
|
|
|
|
|
|
|
inet_pton(AF_INET, src, &in);
|
|
|
|
|
if (inet_pton(AF_INET, src, &in) <= 0)
|
|
|
|
|
goto error;
|
|
|
|
|
p->src.addr_data32[0] = in.s_addr;
|
|
|
|
|
p->sp = sport;
|
|
|
|
|
|
|
|
|
|
inet_pton(AF_INET, dst, &in);
|
|
|
|
|
if (inet_pton(AF_INET, dst, &in) <= 0)
|
|
|
|
|
goto error;
|
|
|
|
|
p->dst.addr_data32[0] = in.s_addr;
|
|
|
|
|
p->dp = dport;
|
|
|
|
|
|
|
|
|
|
p->ip4h = (IPV4Hdr *)GET_PKT_DATA(p);
|
|
|
|
|
if (p->ip4h == NULL)
|
|
|
|
|
return NULL;
|
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
p->ip4h->ip_src.s_addr = p->src.addr_data32[0];
|
|
|
|
|
p->ip4h->ip_dst.s_addr = p->dst.addr_data32[0];
|
|
|
|
@ -185,7 +201,7 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
case IPPROTO_UDP:
|
|
|
|
|
p->udph = (UDPHdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr));
|
|
|
|
|
if (p->udph == NULL)
|
|
|
|
|
return NULL;
|
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
p->udph->uh_sport = sport;
|
|
|
|
|
p->udph->uh_dport = dport;
|
|
|
|
@ -194,7 +210,7 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
case IPPROTO_TCP:
|
|
|
|
|
p->tcph = (TCPHdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr));
|
|
|
|
|
if (p->tcph == NULL)
|
|
|
|
|
return NULL;
|
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
p->tcph->th_sport = htons(sport);
|
|
|
|
|
p->tcph->th_dport = htons(dport);
|
|
|
|
@ -203,7 +219,7 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
case IPPROTO_ICMP:
|
|
|
|
|
p->icmpv4h = (ICMPV4Hdr *)(GET_PKT_DATA(p) + sizeof(IPV4Hdr));
|
|
|
|
|
if (p->icmpv4h == NULL)
|
|
|
|
|
return NULL;
|
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
hdr_offset += sizeof(ICMPV4Hdr);
|
|
|
|
|
break;
|
|
|
|
@ -217,6 +233,10 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len,
|
|
|
|
|
p->payload = GET_PKT_DATA(p)+hdr_offset;
|
|
|
|
|
|
|
|
|
|
return p;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
SCFree(p);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|