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>
This commit is contained in:
parent
3d8ccb44a6
commit
a2eb2d310a
2 changed files with 31 additions and 5 deletions
33
tap.c
33
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);
|
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
|
* tap_ip_send() - Send IP packet, with L2 headers, calculating L3/L4 checksums
|
||||||
* @c: Execution context
|
* @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->frag_off = 0;
|
||||||
iph->ttl = 255;
|
iph->ttl = 255;
|
||||||
iph->protocol = proto;
|
iph->protocol = proto;
|
||||||
iph->daddr = c->ip4.addr_seen;
|
iph->daddr = tap_ip4_daddr(c);
|
||||||
memcpy(&iph->saddr, &src->s6_addr[12], 4);
|
memcpy(&iph->saddr, &src->s6_addr[12], 4);
|
||||||
|
|
||||||
csum_ip4_header(iph);
|
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->priority = 0;
|
||||||
|
|
||||||
ip6h->saddr = *src;
|
ip6h->saddr = *src;
|
||||||
if (IN6_IS_ADDR_LINKLOCAL(src))
|
ip6h->daddr = *tap_ip6_daddr(c, src);
|
||||||
ip6h->daddr = c->ip6.addr_ll_seen;
|
|
||||||
else
|
|
||||||
ip6h->daddr = c->ip6.addr_seen;
|
|
||||||
|
|
||||||
memcpy(data, in, len);
|
memcpy(data, in, len);
|
||||||
|
|
||||||
|
|
3
tap.h
3
tap.h
|
@ -6,6 +6,9 @@
|
||||||
#ifndef TAP_H
|
#ifndef TAP_H
|
||||||
#define 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,
|
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);
|
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);
|
int tap_send(const struct ctx *c, const void *data, size_t len, int vnet_pre);
|
||||||
|
|
Loading…
Reference in a new issue