diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2022-10-19 11:43:49 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2022-10-19 03:34:38 +0200 |
commit | a2eb2d310a28aa916d47c41d98dfddcc7619f639 (patch) | |
tree | e6cddc367cd3c694121b7c9f248d38206900cd11 | |
parent | 3d8ccb44a6a3dc74b9bf7b765c7a2ae41f771d40 (diff) | |
download | passt-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.c | 33 | ||||
-rw-r--r-- | tap.h | 3 |
2 files changed, 31 insertions, 5 deletions
@@ -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); @@ -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); |