From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id E636C5A0269 for ; Wed, 19 Oct 2022 02:44:06 +0200 (CEST) Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4MsX6S179Yz4xGs; Wed, 19 Oct 2022 11:44:00 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1666140240; bh=QpMl1B6oVx1U/6eTooKzad+SvQKJG9AVhGVtWXCsi+o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MBtQCMdqeYQcY/Hg8ZoglagBPkRywv67Pe+La7Pdv+Oj7Wu6fNALFECZXIQ36nvvi Ag2nRA2ecDqNeY8kyPIijd7ieIUA/9t+KRAiiEHpdeBJuy1IiJ7z/wXX5kQxIOljO3 K0W1zctvyUKcEqAZfB5zB6EBynf4a+naoHspkvzU= From: David Gibson To: Stefano Brivio Subject: [PATCH v2 06/14] Add helpers for normal inbound packet destination addresses Date: Wed, 19 Oct 2022 11:43:49 +1100 Message-Id: <20221019004357.1454325-7-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221019004357.1454325-1-david@gibson.dropbear.id.au> References: <20221019004357.1454325-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: ELYHWMVPIG5BDO5HGV5O5DHUQLKQNK25 X-Message-ID-Hash: ELYHWMVPIG5BDO5HGV5O5DHUQLKQNK25 X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top, David Gibson X-Mailman-Version: 3.3.3 Precedence: list List-Id: Development discussion and patches for passt Archived-At: <> Archived-At: List-Archive: <> List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: tap_ip_send() doesn't take a destination address, because it's specifically for inbound packets, and the IP addresses of the guest/namespace are already known to us. Rather than open-coding this destination address logic, make helper functions for it which will enable some later cleanups. Signed-off-by: David Gibson --- tap.c | 33 ++++++++++++++++++++++++++++----- tap.h | 3 +++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/tap.c b/tap.c index de02c56..89be383 100644 --- a/tap.c +++ b/tap.c @@ -96,6 +96,32 @@ int tap_send(const struct ctx *c, const void *data, size_t len, int vnet_pre) return write(c->fd_tap, (char *)data + (vnet_pre ? 4 : 0), len); } +/** + * tap_ip4_daddr() - Normal IPv4 destination address for inbound packets + * @c: Execution context + * + * Returns: IPv4 address, network order + */ +in_addr_t tap_ip4_daddr(const struct ctx *c) +{ + return c->ip4.addr_seen; +} + +/** + * tap_ip6_daddr() - Normal IPv4 destination address for inbound packets + * @c: Execution context + * @src: Source address + * + * Returns: pointer to IPv6 address + */ +const struct in6_addr *tap_ip6_daddr(const struct ctx *c, + const struct in6_addr *src) +{ + if (IN6_IS_ADDR_LINKLOCAL(src)) + return &c->ip6.addr_ll_seen; + return &c->ip6.addr_seen; +} + /** * tap_ip_send() - Send IP packet, with L2 headers, calculating L3/L4 checksums * @c: Execution context @@ -132,7 +158,7 @@ void tap_ip_send(const struct ctx *c, const struct in6_addr *src, uint8_t proto, iph->frag_off = 0; iph->ttl = 255; iph->protocol = proto; - iph->daddr = c->ip4.addr_seen; + iph->daddr = tap_ip4_daddr(c); memcpy(&iph->saddr, &src->s6_addr[12], 4); csum_ip4_header(iph); @@ -163,10 +189,7 @@ void tap_ip_send(const struct ctx *c, const struct in6_addr *src, uint8_t proto, ip6h->priority = 0; ip6h->saddr = *src; - if (IN6_IS_ADDR_LINKLOCAL(src)) - ip6h->daddr = c->ip6.addr_ll_seen; - else - ip6h->daddr = c->ip6.addr_seen; + ip6h->daddr = *tap_ip6_daddr(c, src); memcpy(data, in, len); diff --git a/tap.h b/tap.h index df3aec0..a6764b4 100644 --- a/tap.h +++ b/tap.h @@ -6,6 +6,9 @@ #ifndef TAP_H #define TAP_H +in_addr_t tap_ip4_daddr(const struct ctx *c); +const struct in6_addr *tap_ip6_daddr(const struct ctx *c, + const struct in6_addr *src); void tap_ip_send(const struct ctx *c, const struct in6_addr *src, uint8_t proto, const char *in, size_t len, uint32_t flow); int tap_send(const struct ctx *c, const void *data, size_t len, int vnet_pre); -- 2.37.3