@SRC_DIR@/src/libcharon \
@SRC_DIR@/src/libsimaka \
@SRC_DIR@/src/libtls \
+ @SRC_DIR@/src/libradius \
@SRC_DIR@/src/libtnccs \
@SRC_DIR@/src/libtncif \
@SRC_DIR@/src/libfast \
tls=true;
fi
+if test x$eap_radius = xtrue; then
+ radius=true;
+fi
+
if test x$tnc_imc = xtrue -o x$tnc_imv = xtrue -o x$tnccs_11 = xtrue -o x$tnccs_11 = xtrue -o x$tnccs_dynamic = xtrue -o x$eap_tnc = xtrue; then
tnc_tnccs=true;
fi
AM_CONDITIONAL(USE_VSTR, test x$vstr = xtrue)
AM_CONDITIONAL(USE_SIMAKA, test x$simaka = xtrue)
AM_CONDITIONAL(USE_TLS, test x$tls = xtrue)
+AM_CONDITIONAL(USE_RADIUS, test x$radius = xtrue)
AM_CONDITIONAL(USE_IMCV, test x$imcv = xtrue)
AM_CONDITIONAL(USE_PTS, test x$pts = xtrue)
AM_CONDITIONAL(MONOLITHIC, test x$monolithic = xtrue)
src/libfreeswan/Makefile
src/libsimaka/Makefile
src/libtls/Makefile
+ src/libradius/Makefile
src/libtncif/Makefile
src/libtnccs/Makefile
src/libpts/Makefile
SUBDIRS += libtls
endif
+if USE_RADIUS
+ SUBDIRS += libradius
+endif
+
if USE_LIBTNCIF
SUBDIRS += libtncif
endif
libs += $(DESTDIR)$(ipseclibdir)/libtls.so
endif
+if USE_RADIUS
+ deps += $(top_builddir)/src/libradius/libradius.la
+ libs += $(DESTDIR)$(ipseclibdir)/libradius.so
+endif
+
if USE_LIBTNCCS
deps += $(top_builddir)/src/libtnccs/libtnccs.la
libs += $(DESTDIR)$(ipseclibdir)/libtnccs.so
endif
endif
+if USE_RADIUS
+if MONOLITHIC
+ # otherwise this library is linked to eap_radius
+ libcharon_la_LIBADD += $(top_builddir)/src/libradius/libradius.la
+endif
+endif
+
if USE_TNC_IFMAP
SUBDIRS += plugins/tnc_ifmap
if MONOLITHIC
INCLUDES = -I$(top_srcdir)/src/libstrongswan -I$(top_srcdir)/src/libhydra \
- -I$(top_srcdir)/src/libcharon
+ -I$(top_srcdir)/src/libcharon -I$(top_srcdir)/src/libradius
AM_CFLAGS = -rdynamic
if MONOLITHIC
noinst_LTLIBRARIES = libstrongswan-eap-radius.la
else
+libstrongswan_eap_radius_la_LIBADD = $(top_builddir)/src/libradius/libradius.la
plugin_LTLIBRARIES = libstrongswan-eap-radius.la
endif
eap_radius.h eap_radius.c \
eap_radius_accounting.h eap_radius_accounting.c \
eap_radius_dae.h eap_radius_dae.c \
- eap_radius_forward.h eap_radius_forward.c \
- radius_server.h radius_server.c \
- radius_socket.h radius_socket.c \
- radius_client.h radius_client.c \
- radius_message.h radius_message.c
+ eap_radius_forward.h eap_radius_forward.c
libstrongswan_eap_radius_la_LDFLAGS = -module -avoid-version
*/
#include "eap_radius.h"
+#include "eap_radius_plugin.h"
#include "eap_radius_forward.h"
-#include "radius_message.h"
-#include "radius_client.h"
+#include <radius_message.h>
+#include <radius_client.h>
#include <daemon.h>
"charon.plugins.eap-radius.filter_id", FALSE),
);
- this->client = radius_client_create();
+ this->client = eap_radius_create_client();
if (!this->client)
{
free(this);
*/
#include "eap_radius_accounting.h"
+#include "eap_radius_plugin.h"
#include <time.h>
-#include "radius_message.h"
-#include "radius_client.h"
+#include <radius_message.h>
+#include <radius_client.h>
#include <daemon.h>
#include <utils/hashtable.h>
#include <threading/mutex.h>
radius_client_t *client;
bool ack = FALSE;
- client = radius_client_create();
+ client = eap_radius_create_client();
if (client)
{
response = client->request(client, request);
#include "eap_radius_dae.h"
-#include "radius_message.h"
+#include <radius_message.h>
#include <sys/types.h>
#include <sys/stat.h>
/**
* @defgroup eap_radius_forward eap_radius_forward
- * @{ @ingroup
+ * @{ @ingroup eap_radius
*/
#ifndef EAP_RADIUS_FORWARD_H_
#define EAP_RADIUS_FORWARD_H_
-#include "radius_message.h"
+#include <radius_message.h>
#include <bus/listeners/listener.h>
#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>
/**
* 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;
}
#define EAP_RADIUS_PLUGIN_H_
#include <plugins/plugin.h>
-#include <utils/enumerator.h>
+
+#include <radius_client.h>
typedef struct eap_radius_plugin_t eap_radius_plugin_t;
};
/**
- * Create an enumerator over all loaded RADIUS servers.
+ * Get a RADIUS client instance to connect to servers.
*
- * @return enumerator over radius_server_t
+ * @return RADIUS client
*/
-enumerator_t *eap_radius_create_server_enumerator();
+radius_client_t *eap_radius_create_client();
#endif /** EAP_RADIUS_PLUGIN_H_ @}*/
--- /dev/null
+
+INCLUDES = -I$(top_srcdir)/src/libstrongswan
+
+ipseclib_LTLIBRARIES = libradius.la
+libradius_la_SOURCES = \
+ radius_message.h radius_message.c \
+ radius_socket.h radius_socket.c \
+ radius_client.h radius_client.c \
+ radius_server.h radius_server.c
*/
#include "radius_client.h"
-
-#include "eap_radius_plugin.h"
#include "radius_server.h"
#include <unistd.h>
/**
* See header
*/
-radius_client_t *radius_client_create()
+radius_client_t *radius_client_create(radius_server_t *server)
{
private_radius_client_t *this;
- enumerator_t *enumerator;
- radius_server_t *server;
- int current, best = -1;
INIT(this,
.public = {
.get_msk = _get_msk,
.destroy = _destroy,
},
+ .server = server,
);
- enumerator = eap_radius_create_server_enumerator();
- 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(this->server);
- this->server = server->get_ref(server);
- }
- else
- {
- DBG2(DBG_CFG, "RADIUS server '%s' skipped: %d",
- server->get_name(server), current);
- }
- }
- enumerator->destroy(enumerator);
-
- if (!this->server)
- {
- free(this);
- return NULL;
- }
-
return &this->public;
}
-
/**
* @defgroup radius_client radius_client
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
*/
#ifndef RADIUS_CLIENT_H_
#define RADIUS_CLIENT_H_
#include "radius_message.h"
+#include "radius_server.h"
typedef struct radius_client_t radius_client_t;
/**
* Create a RADIUS client.
*
+ * @param server reference to a server configuration, gets owned
* @return radius_client_t object
*/
-radius_client_t *radius_client_create();
+radius_client_t *radius_client_create(radius_server_t *server);
#endif /** RADIUS_CLIENT_H_ @}*/
}
return &this->public;
}
-
*/
/**
+ * @defgroup libradius libradius
+ *
+ * @addtogroup libradius
+ * RADIUS protocol support library.
+ *
* @defgroup radius_message radius_message
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
*/
#ifndef RADIUS_MESSAGE_H_
/**
* @defgroup radius_server radius_server
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
*/
#ifndef RADIUS_SERVER_H_
/**
* @defgroup radius_socket radius_socket
- * @{ @ingroup eap_radius
+ * @{ @ingroup libradius
*/
#ifndef RADIUS_SOCKET_H_