@@ -674,27 +674,24 @@ 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;
+ struct multi_instance *mi;
- hash_iterator_init(m->hash, &hi);
-
- while ((he = hash_iterator_next(&hi)))
+ if (peer_id >= m->max_clients)
{
- 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, "Cannot retrieve stats for peer %u. ID is invalid (out of bound)!",
+ peerid);
+ return;
+ }
+ mi = m->instances[peer_id];
+ if (!mi)
+ {
+ msg(M_INFO, "Peer %u returned by kernel, but not found locally", peerid);
return;
}
- msg(M_INFO, "Peer %d returned by kernel, but not found locally", peerid);
+ mi->context.c2.dco_read_bytes = nvlist_get_number(nvl, "in");
+ mi->context.c2.dco_write_bytes = nvlist_get_number(nvl, "out");
}
int
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. Cc: Kristof Provost <kp@netgate.com> Change-Id: I8d8af6f872146604a9710edf443db65df48ac3cb Signed-off-by: Antonio Quartulli <a@unstable.cc> --- NOTE: not tested because I have no FreeBSD environment Changes from v1: * added boundary check on peer-id --- src/openvpn/dco_freebsd.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)