aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2022-10-19 11:43:49 +1100
committerStefano Brivio <sbrivio@redhat.com>2022-10-19 03:34:38 +0200
commita2eb2d310a28aa916d47c41d98dfddcc7619f639 (patch)
treee6cddc367cd3c694121b7c9f248d38206900cd11
parent3d8ccb44a6a3dc74b9bf7b765c7a2ae41f771d40 (diff)
downloadpasst-a2eb2d310a28aa916d47c41d98dfddcc7619f639.tar
passt-a2eb2d310a28aa916d47c41d98dfddcc7619f639.tar.gz
passt-a2eb2d310a28aa916d47c41d98dfddcc7619f639.tar.bz2
passt-a2eb2d310a28aa916d47c41d98dfddcc7619f639.tar.lz
passt-a2eb2d310a28aa916d47c41d98dfddcc7619f639.tar.xz
passt-a2eb2d310a28aa916d47c41d98dfddcc7619f639.tar.zst
passt-a2eb2d310a28aa916d47c41d98dfddcc7619f639.zip
Add helpers for normal inbound packet destination addresses
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 <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--tap.c33
-rw-r--r--tap.h3
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
@@ -97,6 +97,32 @@ int tap_send(const struct ctx *c, const void *data, size_t len, int vnet_pre)
}
/**
+ * 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
* @src: IPv6 source address, IPv4-mapped for IPv4 sources
@@ -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);