15be1bfd81
Currently we use icmp_act[] to scan for ICMP ids which might have an open socket which could time out. However icmp_act[] contains no information that's not already in icmp_id_map[] - it's just an "index" which allows scanning for relevant entries with less cache footprint. We only scan for ICMP socket expiry every 1s, though, so it's not clear that cache footprint really matters. Furthermore, there's no strong reason we need to scan even that often - the timeout is fairly arbitrary and approximate. So, eliminate icmp_act[] in favour of directly scanning icmp_id_map[] and compensate for the cache impact by reducing the scan frequency to once every 10s. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
40 lines
1 KiB
C
40 lines
1 KiB
C
/* SPDX-License-Identifier: GPL-2.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 10000 /* ms */
|
|
|
|
struct ctx;
|
|
|
|
void icmp_sock_handler(const struct ctx *c, union epoll_ref ref);
|
|
void icmpv6_sock_handler(const struct ctx *c, union epoll_ref ref);
|
|
int icmp_tap_handler(const struct ctx *c, uint8_t pif, int af,
|
|
const void *saddr, const void *daddr,
|
|
const struct pool *p, const struct timespec *now);
|
|
void icmp_timer(const struct ctx *c, const struct timespec *now);
|
|
void icmp_init(void);
|
|
|
|
/**
|
|
* 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 {
|
|
uint16_t id;
|
|
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 */
|