On Thu, 21 Dec 2023 17:53:22 +1100
David Gibson <david(a)gibson.dropbear.id.au> wrote:
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(a)gibson.dropbear.id.au>
---
icmp.c | 34 ++++++----------------------------
icmp.h | 2 +-
2 files changed, 7 insertions(+), 29 deletions(-)
diff --git a/icmp.c b/icmp.c
index dd98c7f..02739b9 100644
--- a/icmp.c
+++ b/icmp.c
@@ -56,9 +56,6 @@ struct icmp_id_sock {
/* Indexed by ICMP echo identifier */
static struct icmp_id_sock icmp_id_map[IP_VERSIONS][ICMP_NUM_IDS];
-/* Bitmaps, activity monitoring needed for identifier */
-static uint8_t icmp_act[IP_VERSIONS][DIV_ROUND_UP(ICMP_NUM_IDS, 8)];
-
/**
* icmp_sock_handler() - Handle new data from IPv4 ICMP socket
* @c: Execution context
@@ -194,7 +191,6 @@ int icmp_tap_handler(const struct ctx *c, uint8_t pif, int af,
debug("ICMP: new socket %i for echo ID %i", s, id);
}
icmp_id_map[V4][id].ts = now->tv_sec;
- bitmap_set(icmp_act[V4], id);
sa.sin_addr = *(struct in_addr *)daddr;
if (sendto(s, ih, sizeof(*ih) + plen, MSG_NOSIGNAL,
@@ -237,7 +233,6 @@ int icmp_tap_handler(const struct ctx *c, uint8_t pif, int af,
debug("ICMPv6: new socket %i for echo ID %i", s, id);
}
icmp_id_map[V6][id].ts = now->tv_sec;
- bitmap_set(icmp_act[V6], id);
sa.sin6_addr = *(struct in6_addr *)daddr;
if (sendto(s, ih, sizeof(*ih) + plen, MSG_NOSIGNAL,
@@ -261,20 +256,15 @@ fail_sock:
/**
* icmp_timer_one() - Handler for timed events related to a given identifier
* @c: Execution context
- * @v6: Set for IPv6 echo identifier bindings
- * @id: Echo identifier, host order
+ * @id_map: id socket information to check timers for
It took me a few readings to understand this... what about:
* @id_sock: Socket number and activity timestamp
?
Works for me. Updated.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!