public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
8a1d8f933a5bb3b8c03ee0e5d4227a9644731339 blob 5044 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 
/* SPDX-License-Identifier: GPL-2.0-or-later
 * Copyright (c) 2021 Red Hat GmbH
 * Author: Stefano Brivio <sbrivio@redhat.com>
 */

#ifndef TAP_H
#define TAP_H

#include <stddef.h>
#include <stdint.h>

#include "passt.h"

/** L2_MAX_LEN_PASTA - Maximum frame length for pasta mode (with L2 header)
 *
 * The kernel tuntap device imposes a maximum frame size of 65535 including
 * 'hard_header_len' (14 bytes for L2 Ethernet in the case of "tap" mode).
 */
#define L2_MAX_LEN_PASTA	USHRT_MAX

/** L2_MAX_LEN_PASST - Maximum frame length for passt mode (with L2 header)
 *
 * The only structural limit the QEMU socket protocol imposes on frames is
 * (2^32-1) bytes, but that would be ludicrously long in practice.  For now,
 * limit it somewhat arbitrarily to 65535 bytes.  FIXME: Work out an appropriate
 * limit with more precision.
 */
#define L2_MAX_LEN_PASST	USHRT_MAX

/** L2_MAX_LEN_VU - Maximum frame length for vhost-user mode (with L2 header)
 *
 * vhost-user allows multiple buffers per frame, each of which can be quite
 * large, so the inherent frame size limit is rather large.  Much larger than is
 * actually useful for IP.  For now limit arbitrarily to 65535 bytes. FIXME:
 * Work out an appropriate limit with more precision.
 */
#define L2_MAX_LEN_VU		USHRT_MAX

struct udphdr;

/**
 * struct tap_hdr - tap backend specific headers
 * @vnet_len:	Frame length (for qemu socket transport)
 */
struct tap_hdr {
	uint32_t vnet_len;
} __attribute__((packed));

/**
 * tap_hdr_iov() - struct iovec for a tap header
 * @c:		Execution context
 * @taph:	Pointer to tap specific header buffer
 *
 * Return: a struct iovec covering the correct portion of @taph to use as the
 *         tap specific header in the current configuration.
 */
static inline struct iovec tap_hdr_iov(const struct ctx *c,
				       struct tap_hdr *thdr)
{
	return (struct iovec){
		.iov_base = thdr,
		.iov_len = c->mode == MODE_PASST ? sizeof(*thdr) : 0,
	};
}

/**
 * tap_hdr_update() - Update the tap specific header for a frame
 * @taph:	Tap specific header buffer to update
 * @l2len:	Frame length (including L2 headers)
 */
static inline void tap_hdr_update(struct tap_hdr *thdr, size_t l2len)
{
	thdr->vnet_len = htonl(l2len);
}

unsigned long tap_l2_max_len(const struct ctx *c);
void *tap_push_l2h(const struct ctx *c, void *buf,
		   const void *src_mac, uint16_t proto);
void *tap_push_ip4h(struct iphdr *ip4h, struct in_addr src,
		     struct in_addr dst, size_t l4len, uint8_t proto);
void *tap_push_uh4(struct udphdr *uh, struct in_addr src, in_port_t sport,
		   struct in_addr dst, in_port_t dport,
		   const void *in, size_t dlen);
void *tap_push_uh6(struct udphdr *uh,
		   const struct in6_addr *src, in_port_t sport,
		   const struct in6_addr *dst, in_port_t dport,
		   void *in, size_t dlen);
void *tap_push_ip4h(struct iphdr *ip4h, struct in_addr src,
		    struct in_addr dst, size_t l4len, uint8_t proto);
void *tap_push_ip6h(struct ipv6hdr *ip6h,
		    const struct in6_addr *src,
		    const struct in6_addr *dst,
		    size_t l4len, uint8_t proto, uint32_t flow);
void tap_udp4_send(const struct ctx *c, unsigned int qpair, struct in_addr src,
		   in_port_t sport, struct in_addr dst, in_port_t dport,
		   const void *in, size_t dlen);
void tap_icmp4_send(const struct ctx *c, unsigned int qpair, struct in_addr src,
		    struct in_addr dst, const void *in, const void *src_mac,
		    size_t l4len);
const struct in6_addr *tap_ip6_daddr(const struct ctx *c,
				     const struct in6_addr *src);
void *tap_push_ip6h(struct ipv6hdr *ip6h,
		    const struct in6_addr *src, const struct in6_addr *dst,
		    size_t l4len, uint8_t proto, uint32_t flow);
void tap_udp6_send(const struct ctx *c, unsigned int qpair,
		   const struct in6_addr *src, in_port_t sport,
		   const struct in6_addr *dst, in_port_t dport,
		   uint32_t flow, void *in, size_t dlen);
void tap_icmp6_send(const struct ctx *c, unsigned int qpair,
		    const struct in6_addr *src, const struct in6_addr *dst,
		    const void *in, const void *src_mac, size_t l4len);
void tap_send_single(const struct ctx *c, unsigned int qpair, const void *data, size_t l2len);
size_t tap_send_frames(const struct ctx *c, const struct iovec *iov,
		       size_t bufs_per_frame, size_t nframes);
void eth_update_mac(struct ethhdr *eh,
		    const unsigned char *eth_d, const unsigned char *eth_s);
bool tap_is_ready(const struct ctx *c);
void tap_listen_handler(struct ctx *c, unsigned int qpair, uint32_t events);
void tap_handler_pasta(struct ctx *c, uint32_t events,
		       const struct timespec *now);
void tap_handler_passt(struct ctx *c, uint32_t events,
		       const struct timespec *now);
int tap_sock_unix_open(char *sock_path);
void tap_sock_reset(struct ctx *c);
void tap_backend_init(struct ctx *c);
void tap_flush_pools(unsigned int qpair);
void tap_handler(struct ctx *c, unsigned int qpair, const struct timespec *now);
void tap_add_packet(struct ctx *c, unsigned int qpair, struct iov_tail *data,
		    const struct timespec *now);
#endif /* TAP_H */
debug log:

solving 8a1d8f933a5b ...
found 8a1d8f933a5b in https://archives.passt.top/passt-dev/20260616171052.3785909-2-lvivier@redhat.com/
found ecb12de372b5 in https://archives.passt.top/passt-dev/20260616125130.1324274-5-lvivier@redhat.com/
found 07ca0965215c in https://passt.top/passt
preparing index
index prepared:
100644 07ca0965215c1592e6ac55e395c766655b79a93f	tap.h

applying [1/2] https://archives.passt.top/passt-dev/20260616125130.1324274-5-lvivier@redhat.com/
diff --git a/tap.h b/tap.h
index 07ca0965215c..ecb12de372b5 100644


applying [2/2] https://archives.passt.top/passt-dev/20260616171052.3785909-2-lvivier@redhat.com/
diff --git a/tap.h b/tap.h
index ecb12de372b5..8a1d8f933a5b 100644

Checking patch tap.h...
Applied patch tap.h cleanly.
Checking patch tap.h...
Applied patch tap.h cleanly.

index at:
100644 8a1d8f933a5bb3b8c03ee0e5d4227a9644731339	tap.h

Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).