cron2 has uploaded a new patch set (#8) to the change originally created by plaisthos. ( http://gerrit.openvpn.net/c/openvpn/+/1557?usp=email )
Change subject: Optimise iterating over all clients by remembering highest peer id ...................................................................... Optimise iterating over all clients by remembering highest peer id This keeps track of the highest peer id that is currently allocated to avoid iterating over the empty tail of the m->instances array. Change-Id: If797f3fe178fba3f43fb12898e5484bfb38f05c3 Signed-off-by: Arne Schwabe <[email protected]> Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1557 Message-Id: <[email protected]> URL: https://www.mail-archive.com/[email protected]/msg36577.html Signed-off-by: Gert Doering <[email protected]> --- M src/openvpn/multi.c M src/openvpn/multi.h M src/openvpn/push_util.c 3 files changed, 26 insertions(+), 10 deletions(-) git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/57/1557/8 diff --git a/src/openvpn/multi.c b/src/openvpn/multi.c index 0b03ff1..c7a91ab 100644 --- a/src/openvpn/multi.c +++ b/src/openvpn/multi.c @@ -601,6 +601,13 @@ if (mi->context.c2.tls_multi->peer_id != MAX_PEER_ID) { m->instances[mi->context.c2.tls_multi->peer_id] = NULL; + + /* Adjust the max_peerid as this might have been the highest + * peer id instance */ + while (m->max_peerid > 0 && m->instances[m->max_peerid] == NULL) + { + m->max_peerid--; + } } schedule_remove_entry(m->schedule, (struct schedule_entry *)mi); @@ -652,7 +659,7 @@ { if (m->hash) { - for (int i = 0; i < m->max_clients; i++) + for (uint32_t i = 0; i <= m->max_peerid; i++) { struct multi_instance *mi = m->instances[i]; if (mi) @@ -1326,7 +1333,7 @@ { int count = 0; - for (int i = 0; i < m->max_clients; i++) + for (uint32_t i = 0; i <= m->max_peerid; i++) { struct multi_instance *mi = m->instances[i]; if (mi && mi != new_mi && !mi->halt) @@ -2885,7 +2892,7 @@ #endif mb = mbuf_alloc_buf(buf); - for (int i = 0; i < m->max_clients; i++) + for (uint32_t i = 0; i <= m->max_peerid; i++) { struct multi_instance *mi = m->instances[i]; @@ -3794,7 +3801,7 @@ multi_push_restart_schedule_exit(struct multi_context *m, bool next_server) { /* tell all clients to restart */ - for (int i = 0; i < m->max_clients; i++) + for (uint32_t i = 0; i <= m->max_peerid; i++) { struct multi_instance *mi = m->instances[i]; if (mi && !mi->halt && proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto)) @@ -3876,7 +3883,7 @@ struct multi_context *m = (struct multi_context *)arg; int count = 0; - for (int i = 0; i < m->max_clients; i++) + for (uint32_t i = 0; i <= m->max_peerid; i++) { struct multi_instance *mi = m->instances[i]; if (mi && !mi->halt) @@ -3907,7 +3914,7 @@ maddr.proto = proto; if (mroute_extract_openvpn_sockaddr(&maddr, &saddr, true)) { - for (int i = 0; i < m->max_clients; i++) + for (uint32_t i = 0; i <= m->max_peerid; i++) { struct multi_instance *mi = m->instances[i]; if (mi && !mi->halt && mroute_addr_equal(&maddr, &mi->real)) @@ -4100,8 +4107,14 @@ } /* should not really end up here, since multi_create_instance returns null - * if amount of clients exceeds max_clients */ + * if amount of clients exceeds max_clients and this method would then + * also not have been called */ ASSERT(mi->context.c2.tls_multi->peer_id < m->max_clients); + + if (mi->context.c2.tls_multi->peer_id > m->max_peerid) + { + m->max_peerid = mi->context.c2.tls_multi->peer_id; + } } #if defined(__GNUC__) || defined(__clang__) diff --git a/src/openvpn/multi.h b/src/openvpn/multi.h index 3f4eefe..935bda1 100644 --- a/src/openvpn/multi.h +++ b/src/openvpn/multi.h @@ -160,9 +160,12 @@ */ struct multi_context { - struct multi_instance **instances; /**< Array of multi_instances. An instance can be + struct multi_instance **instances; /**< Array of multi_instances with the size of + * max_clients. An instance can be * accessed using peer-id as an index. */ - + uint32_t max_peerid; /**< highest currently allocated peer-id + * and maximum allocated/valid index in + * instances */ struct hash *hash; /**< VPN tunnel instances indexed by real * address of the remote peer. */ struct hash *vhash; /**< VPN tunnel instances indexed by diff --git a/src/openvpn/push_util.c b/src/openvpn/push_util.c index fe48091..f57f54d 100644 --- a/src/openvpn/push_util.c +++ b/src/openvpn/push_util.c @@ -317,7 +317,7 @@ int count = 0; - for (int i = 0; i < m->max_clients; i++) + for (uint32_t i = 0; i <= m->max_peerid; i++) { struct multi_instance *curr_mi = m->instances[i]; -- To view, visit http://gerrit.openvpn.net/c/openvpn/+/1557?usp=email To unsubscribe, or for help writing mail filters, visit http://gerrit.openvpn.net/settings?usp=email Gerrit-MessageType: newpatchset Gerrit-Project: openvpn Gerrit-Branch: master Gerrit-Change-Id: If797f3fe178fba3f43fb12898e5484bfb38f05c3 Gerrit-Change-Number: 1557 Gerrit-PatchSet: 8 Gerrit-Owner: plaisthos <[email protected]> Gerrit-Reviewer: flichtenheld <[email protected]> Gerrit-CC: openvpn-devel <[email protected]>
_______________________________________________ Openvpn-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openvpn-devel
