aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/eap_radius/eap_radius_plugin.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2012-02-27 15:18:58 +0100
committerMartin Willi <martin@revosec.ch>2012-03-05 18:08:04 +0100
commitf0f94e2ce6eac9893498c50e5155a0085229fe8c (patch)
treeb73b09693a5de5d87f1b07e2be051a523a6abbb6 /src/libcharon/plugins/eap_radius/eap_radius_plugin.c
parent990fda9d881e502e2974fc9f6feb07cefce1aa6b (diff)
downloadstrongswan-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.c43
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;
}