From: Antonio Quartulli Date: Thu, 23 Mar 2023 08:03:41 +0000 (+0100) Subject: dco-freebsd: use m->instances[] instead of m->hash X-Git-Tag: v2.7_alpha1~502 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=03145f223236df90b35d1db444319fd3f785792b;p=thirdparty%2Fopenvpn.git dco-freebsd: use m->instances[] instead of m->hash When retrieving the multi_instance of a specific peer, there is no need to peform a linear search across the whole m->hash list. We can directly access the needed object via m->instances[peer-id] in constant time (and just one line of code). Adapt the dco-freebsd code to do so. v4: use "peerid" everywhere as that's what FreeBSD does, change message text Cc: Kristof Provost Change-Id: I8d8af6f872146604a9710edf443db65df48ac3cb Signed-off-by: Antonio Quartulli Acked-by: Arne Schwabe Acked-by: Kristof Provost Message-Id: <20230323080341.51624-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/search?l=mid&q=20230323080341.51624-1-gert@greenie.muc.de Signed-off-by: Gert Doering --- diff --git a/src/openvpn/dco_freebsd.c b/src/openvpn/dco_freebsd.c index 225b3cf88..a334d5d2a 100644 --- a/src/openvpn/dco_freebsd.c +++ b/src/openvpn/dco_freebsd.c @@ -674,27 +674,17 @@ dco_event_set(dco_context_t *dco, struct event_set *es, void *arg) static void dco_update_peer_stat(struct multi_context *m, uint32_t peerid, const nvlist_t *nvl) { - struct hash_element *he; - struct hash_iterator hi; - hash_iterator_init(m->hash, &hi); - - while ((he = hash_iterator_next(&hi))) + if (peerid >= m->max_clients || !m->instances[peerid]) { - struct multi_instance *mi = (struct multi_instance *) he->value; - - if (mi->context.c2.tls_multi->peer_id != peerid) - { - continue; - } - - mi->context.c2.dco_read_bytes = nvlist_get_number(nvl, "in"); - mi->context.c2.dco_write_bytes = nvlist_get_number(nvl, "out"); - + msg(M_WARN, "dco_update_peer_stat: invalid peer ID %d returned by kernel", peerid); return; } - msg(M_INFO, "Peer %d returned by kernel, but not found locally", peerid); + struct multi_instance *mi = m->instances[peerid]; + + mi->context.c2.dco_read_bytes = nvlist_get_number(nvl, "in"); + mi->context.c2.dco_write_bytes = nvlist_get_number(nvl, "out"); } int