public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>, passt-dev@passt.top
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH 2/6] ndp: Add ndp_send() helper
Date: Tue, 12 Nov 2024 15:06:14 +1100	[thread overview]
Message-ID: <20241112040618.1804081-3-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20241112040618.1804081-1-david@gibson.dropbear.id.au>

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>
---
 ndp.c | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/ndp.c b/ndp.c
index ab80898..fa1b67a 100644
--- a/ndp.c
+++ b/ndp.c
@@ -170,6 +170,21 @@ struct ndp_ns {
 	struct in6_addr target_addr;
 } __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
@@ -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;
-- 
@@ -170,6 +170,21 @@ struct ndp_ns {
 	struct in6_addr target_addr;
 } __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
@@ -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;
-- 
2.47.0


  parent reply	other threads:[~2024-11-12  4:06 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-12  4:06 [PATCH 0/6] ndp: Unsolicited RAs David Gibson
2024-11-12  4:06 ` [PATCH 1/6] ndp: Remove redundant update to addr_seen David Gibson
2024-11-12  4:06 ` David Gibson [this message]
2024-11-12  4:06 ` [PATCH 3/6] ndp: Split out helpers for sending specific NDP message types David Gibson
2024-11-13  1:14   ` Stefano Brivio
2024-11-13  2:07     ` David Gibson
2024-11-12  4:06 ` [PATCH 4/6] ndp: Use struct assignment in preference to memcpy() for IPv6 addresses David Gibson
2024-11-12  4:06 ` [PATCH 5/6] ndp: Make route lifetime a #define David Gibson
2024-11-12  4:06 ` [PATCH 6/6] ndp: Send unsolicited Router Advertisements David Gibson
2024-11-13  1:14   ` Stefano Brivio
2024-11-13  3:01     ` David Gibson
2024-11-13  8:18       ` Stefano Brivio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241112040618.1804081-3-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).