aboutgitcodebugslistschat
path: root/udp.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-03-06 16:34:26 +1100
committerStefano Brivio <sbrivio@redhat.com>2024-03-13 14:37:19 +0100
commitb0419d150ac9d10b53ebbed518f67f2c10d22ad0 (patch)
treed4f3b552d88921d96de5a7eb71bd473e046255d9 /udp.c
parent8a842e03cdc1e841b523f2d408445b1220b3a1ab (diff)
downloadpasst-b0419d150ac9d10b53ebbed518f67f2c10d22ad0.tar
passt-b0419d150ac9d10b53ebbed518f67f2c10d22ad0.tar.gz
passt-b0419d150ac9d10b53ebbed518f67f2c10d22ad0.tar.bz2
passt-b0419d150ac9d10b53ebbed518f67f2c10d22ad0.tar.lz
passt-b0419d150ac9d10b53ebbed518f67f2c10d22ad0.tar.xz
passt-b0419d150ac9d10b53ebbed518f67f2c10d22ad0.tar.zst
passt-b0419d150ac9d10b53ebbed518f67f2c10d22ad0.zip
udp: Re-order udp_update_hdr[46] for clarity and brevity
The order of things in these functions is a bit odd for historical reasons. We initialise some IP header fields early, the more later after making some tests. Likewise we declare some variables without initialisation, but then unconditionally set them to values we could calculate at the start of the function. Previous cleanups have removed the reasons for some of these choices, so reorder for clarity, and where possible move the first assignment into an initialiser. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
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));
}
/**