diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-11-14 14:33:04 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-11-14 19:00:28 +0100 |
commit | 4e471670351a76b902e5376da4ee909f68485da2 (patch) | |
tree | b4929673a5e231b250889e5f95fc0e1ce7a1b8bd | |
parent | 71f228d04b5c68b1cf42d95e4e5bbb82af0a0e60 (diff) | |
download | passt-4e471670351a76b902e5376da4ee909f68485da2.tar passt-4e471670351a76b902e5376da4ee909f68485da2.tar.gz passt-4e471670351a76b902e5376da4ee909f68485da2.tar.bz2 passt-4e471670351a76b902e5376da4ee909f68485da2.tar.lz passt-4e471670351a76b902e5376da4ee909f68485da2.tar.xz passt-4e471670351a76b902e5376da4ee909f68485da2.tar.zst passt-4e471670351a76b902e5376da4ee909f68485da2.zip |
ndp: Add ndp_send() helper
ndp() has a conditional on message type generating the reply message, then
a tiny amount of common code, then another conditional to send the reply
with slightly different parameters. We can make this a bit neater by
making a helper function for sending the reply, and call it from each of
the different message type paths.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | ndp.c | 32 |
1 files changed, 18 insertions, 14 deletions
@@ -171,6 +171,21 @@ struct ndp_ns { } __attribute__((packed)); /** + * ndp_send() - Send an NDP message + * @c: Execution context + * @dst: IPv6 address to send the message to + * @buf: ICMPv6 header + message payload + * @l4len: Length of message, including ICMPv6 header + */ +static void ndp_send(const struct ctx *c, const struct in6_addr *dst, + const void *buf, size_t l4len) +{ + const struct in6_addr *src = &c->ip6.our_tap_ll; + + tap_icmp6_send(c, src, dst, buf, l4len); +} + +/** * ndp() - Check for NDP solicitations, reply as needed * @c: Execution context * @ih: ICMPv6 header @@ -223,9 +238,6 @@ int ndp(const struct ctx *c, const struct icmp6hdr *ih, }, }, }; - const struct in6_addr *rsaddr; /* src addr for reply */ - unsigned char *ptr = NULL; - size_t dlen; if (ih->icmp6_type < RS || ih->icmp6_type > NA) return 0; @@ -249,7 +261,9 @@ int ndp(const struct ctx *c, const struct icmp6hdr *ih, sizeof(na.target_addr)); memcpy(na.target_l2_addr.mac, c->our_tap_mac, ETH_ALEN); + ndp_send(c, saddr, &na, sizeof(struct ndp_na)); } else if (ih->icmp6_type == RS) { + unsigned char *ptr = NULL; size_t dns_s_len = 0; int i, n; @@ -332,18 +346,8 @@ int ndp(const struct ctx *c, const struct icmp6hdr *ih, dns_done: memcpy(&ra.source_ll.mac, c->our_tap_mac, ETH_ALEN); - } else { - return 1; - } - rsaddr = &c->ip6.our_tap_ll; - - if (ih->icmp6_type == NS) { - dlen = sizeof(struct ndp_na); - tap_icmp6_send(c, rsaddr, saddr, &na, dlen); - } else if (ih->icmp6_type == RS) { - dlen = ptr - (unsigned char *)&ra; - tap_icmp6_send(c, rsaddr, saddr, &ra, dlen); + ndp_send(c, saddr, &ra, ptr - (unsigned char *)&ra); } return 1; |