aboutgitcodebugslistschat
path: root/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'udp.c')
-rw-r--r--udp.c40
1 files changed, 14 insertions, 26 deletions
diff --git a/udp.c b/udp.c
index e20f537..d3b9f5f 100644
--- a/udp.c
+++ b/udp.c
@@ -574,17 +574,9 @@ static size_t udp_update_hdr4(const struct ctx *c, struct udp4_l2_buf_t *b,
in_port_t dstport, size_t datalen,
const struct timespec *now)
{
- const struct in_addr *src;
- in_port_t srcport;
- size_t ip_len;
-
- ip_len = datalen + sizeof(b->iph) + sizeof(b->uh);
-
- b->iph.tot_len = htons(ip_len);
- b->iph.daddr = c->ip4.addr_seen.s_addr;
-
- src = &b->s_in.sin_addr;
- srcport = ntohs(b->s_in.sin_port);
+ size_t ip_len = datalen + sizeof(b->iph) + sizeof(b->uh);
+ const struct in_addr *src = &b->s_in.sin_addr;
+ in_port_t srcport = ntohs(b->s_in.sin_port);
if (!IN4_IS_ADDR_UNSPECIFIED(&c->ip4.dns_match) &&
IN4_ARE_ADDR_EQUAL(src, &c->ip4.dns_host) && srcport == 53) {
@@ -603,10 +595,13 @@ static size_t udp_update_hdr4(const struct ctx *c, struct udp4_l2_buf_t *b,
src = &c->ip4.gw;
}
- b->iph.saddr = src->s_addr;
+ b->iph.tot_len = htons(ip_len);
+ b->iph.daddr = c->ip4.addr_seen.s_addr;
+ b->iph.saddr = src->s_addr;
b->iph.check = csum_ip4_header(b->iph.tot_len, IPPROTO_UDP,
*src, c->ip4.addr_seen);
+
b->uh.source = b->s_in.sin_port;
b->uh.dest = htons(dstport);
b->uh.len = htons(datalen + sizeof(b->uh));
@@ -628,19 +623,10 @@ static size_t udp_update_hdr6(const struct ctx *c, struct udp6_l2_buf_t *b,
in_port_t dstport, size_t datalen,
const struct timespec *now)
{
- const struct in6_addr *src, *dst;
- uint16_t payload_len;
- in_port_t srcport;
- size_t ip_len;
-
- dst = &c->ip6.addr_seen;
- src = &b->s_in6.sin6_addr;
- srcport = ntohs(b->s_in6.sin6_port);
-
- ip_len = datalen + sizeof(b->ip6h) + sizeof(b->uh);
-
- payload_len = datalen + sizeof(b->uh);
- b->ip6h.payload_len = htons(payload_len);
+ const struct in6_addr *src = &b->s_in6.sin6_addr;
+ const struct in6_addr *dst = &c->ip6.addr_seen;
+ uint16_t payload_len = datalen + sizeof(b->uh);
+ in_port_t srcport = ntohs(b->s_in6.sin6_port);
if (IN6_IS_ADDR_LINKLOCAL(src)) {
dst = &c->ip6.addr_ll_seen;
@@ -674,6 +660,8 @@ static size_t udp_update_hdr6(const struct ctx *c, struct udp6_l2_buf_t *b,
src = &c->ip6.addr_ll;
}
+
+ b->ip6h.payload_len = htons(payload_len);
b->ip6h.daddr = *dst;
b->ip6h.saddr = *src;
b->ip6h.version = 6;
@@ -688,7 +676,7 @@ static size_t udp_update_hdr6(const struct ctx *c, struct udp6_l2_buf_t *b,
proto_ipv6_header_psum(payload_len, IPPROTO_UDP,
src, dst));
- return tap_iov_len(c, &b->taph, ip_len);
+ return tap_iov_len(c, &b->taph, payload_len + sizeof(b->ip6h));
}
/**