passt/pif.h
David Gibson 4e2d36e83f flow: Common address information for target side
Require the address and port information for the target (non
initiating) side to be populated when a flow enters TGT state.
Implement that for TCP and ICMP.  For now this leaves some information
redundantly recorded in both generic and type specific fields.  We'll
fix that in later patches.

For TCP we now use the information from the flow to construct the
destination socket address in both tcp_conn_from_tap() and
tcp_splice_connect().

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
2024-07-19 18:32:37 +02:00

63 lines
1.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright Red Hat
* Author: David Gibson <david@gibson.dropbear.id.au>
*
* Passt/pasta interface types and IDs
*/
#ifndef PIF_H
#define PIF_H
union inany_addr;
union sockaddr_inany;
/**
* enum pif_type - Type of passt/pasta interface ("pif")
*
* pifs can be an L4 level channel (sockets) or an L2 level channel (tap device
* or qemu socket).
*/
enum pif_type {
/* Invalid or not present pif */
PIF_NONE = 0,
/* Host socket interface */
PIF_HOST,
/* Qemu socket or namespace tuntap interface */
PIF_TAP,
/* Namespace socket interface for splicing */
PIF_SPLICE,
PIF_NUM_TYPES,
};
#define PIF_NAMELEN 8
extern const char *pif_type_str[];
static inline const char *pif_type(enum pif_type pt)
{
if (pt < PIF_NUM_TYPES)
return pif_type_str[pt];
else
return "?";
}
static inline const char *pif_name(uint8_t pif)
{
return pif_type(pif);
}
/**
* pif_is_socket() - Is interface implemented via L4 sockets?
* @pif: pif to check
*
* Return: true of @pif is an L4 socket based interface, otherwise false
*/
static inline bool pif_is_socket(uint8_t pif)
{
return pif == PIF_HOST || pif == PIF_SPLICE;
}
void pif_sockaddr(const struct ctx *c, union sockaddr_inany *sa, socklen_t *sl,
uint8_t pif, const union inany_addr *addr, in_port_t port);
#endif /* PIF_H */