bb70811183
Implement a packet abstraction providing boundary and size checks based on packet descriptors: packets stored in a buffer can be queued into a pool (without storage of its own), and data can be retrieved referring to an index in the pool, specifying offset and length. Checks ensure data is not read outside the boundaries of buffer and descriptors, and that packets added to a pool are within the buffer range with valid offset and indices. This implies a wider rework: usage of the "queueing" part of the abstraction mostly affects tap_handler_{passt,pasta}() functions and their callees, while the "fetching" part affects all the guest or tap facing implementations: TCP, UDP, ICMP, ARP, NDP, DHCP and DHCPv6 handlers. Suggested-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
41 lines
983 B
C
41 lines
983 B
C
/* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
* Copyright (c) 2021 Red Hat GmbH
|
|
* Author: Stefano Brivio <sbrivio@redhat.com>
|
|
*/
|
|
|
|
#ifndef ICMP_H
|
|
#define ICMP_H
|
|
|
|
#define ICMP_TIMER_INTERVAL 1000 /* ms */
|
|
|
|
struct ctx;
|
|
|
|
void icmp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
|
|
struct timespec *now);
|
|
int icmp_tap_handler(struct ctx *c, int af, void *addr, struct pool *p,
|
|
struct timespec *now);
|
|
void icmp_timer(struct ctx *c, struct timespec *ts);
|
|
|
|
/**
|
|
* union icmp_epoll_ref - epoll reference portion for ICMP tracking
|
|
* @v6: Set for IPv6 sockets or connections
|
|
* @u32: Opaque u32 value of reference
|
|
* @id: Associated echo identifier, needed if bind() fails
|
|
*/
|
|
union icmp_epoll_ref {
|
|
struct {
|
|
uint32_t v6:1,
|
|
id:16;
|
|
} icmp;
|
|
uint32_t u32;
|
|
};
|
|
|
|
/**
|
|
* struct icmp_ctx - Execution context for ICMP routines
|
|
* @timer_run: Timestamp of most recent timer run
|
|
*/
|
|
struct icmp_ctx {
|
|
struct timespec timer_run;
|
|
};
|
|
|
|
#endif /* ICMP_H */
|