diff options
author | Martin Willi <martin@revosec.ch> | 2012-02-27 15:18:58 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2012-03-05 18:08:04 +0100 |
commit | f0f94e2ce6eac9893498c50e5155a0085229fe8c (patch) | |
tree | b73b09693a5de5d87f1b07e2be051a523a6abbb6 /src/libcharon/plugins/eap_radius/eap_radius_plugin.c | |
parent | 990fda9d881e502e2974fc9f6feb07cefce1aa6b (diff) | |
download | strongswan-f0f94e2ce6eac9893498c50e5155a0085229fe8c.tar.bz2 strongswan-f0f94e2ce6eac9893498c50e5155a0085229fe8c.tar.xz |
Moved generic RADIUS protocol support to a dedicated libradius
Diffstat (limited to 'src/libcharon/plugins/eap_radius/eap_radius_plugin.c')
-rw-r--r-- | src/libcharon/plugins/eap_radius/eap_radius_plugin.c | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/src/libcharon/plugins/eap_radius/eap_radius_plugin.c b/src/libcharon/plugins/eap_radius/eap_radius_plugin.c index e544aaf3e..0caecc1ad 100644 --- a/src/libcharon/plugins/eap_radius/eap_radius_plugin.c +++ b/src/libcharon/plugins/eap_radius/eap_radius_plugin.c @@ -19,8 +19,9 @@ #include "eap_radius_accounting.h" #include "eap_radius_dae.h" #include "eap_radius_forward.h" -#include "radius_client.h" -#include "radius_server.h" + +#include <radius_client.h> +#include <radius_server.h> #include <daemon.h> #include <threading/rwlock.h> @@ -261,15 +262,43 @@ plugin_t *eap_radius_plugin_create() /** * See header */ -enumerator_t *eap_radius_create_server_enumerator() +radius_client_t *eap_radius_create_client() { if (instance) { + enumerator_t *enumerator; + radius_server_t *server, *selected = NULL; + int current, best = -1; + instance->lock->read_lock(instance->lock); - return enumerator_create_cleaner( - instance->servers->create_enumerator(instance->servers), - (void*)instance->lock->unlock, instance->lock); + enumerator = instance->servers->create_enumerator(instance->servers); + while (enumerator->enumerate(enumerator, &server)) + { + current = server->get_preference(server); + if (current > best || + /* for two with equal preference, 50-50 chance */ + (current == best && random() % 2 == 0)) + { + DBG2(DBG_CFG, "RADIUS server '%s' is candidate: %d", + server->get_name(server), current); + best = current; + DESTROY_IF(selected); + selected = server->get_ref(server); + } + else + { + DBG2(DBG_CFG, "RADIUS server '%s' skipped: %d", + server->get_name(server), current); + } + } + enumerator->destroy(enumerator); + instance->lock->unlock(instance->lock); + + if (selected) + { + return radius_client_create(selected); + } } - return enumerator_create_empty(); + return NULL; } |