eap-radius: Add support to specify and bind a specific source address

Using a specific address can be useful in scenarios where dynamic routing
could change the path to the RADIUS server and a changing source address
is a problem for the server.

Closes strongswan/strongswan#2598
This commit is contained in:
Tobias Brunner
2025-02-28 16:16:48 +01:00
parent c3ae859b9b
commit 57703fa089
6 changed files with 67 additions and 23 deletions
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013 Tobias Brunner
* Copyright (C) 2013-2025 Tobias Brunner
* Copyright (C) 2009 Martin Willi
*
* Copyright (C) secunet Security Networks AG
@@ -119,7 +119,7 @@ static void load_configs(private_eap_radius_plugin_t *this)
{
enumerator_t *enumerator;
radius_config_t *config;
char *nas_identifier, *secret, *address, *section;
char *nas_identifier, *secret, *address, *source, *section;
int auth_port, acct_port, sockets, preference;
u_int retransmit_tries;
double retransmit_timeout, retransmit_base;
@@ -135,6 +135,8 @@ static void load_configs(private_eap_radius_plugin_t *this)
DBG1(DBG_CFG, "no RADIUS secret defined");
return;
}
source = lib->settings->get_str(lib->settings,
"%s.plugins.eap-radius.source", NULL, lib->ns);
nas_identifier = lib->settings->get_str(lib->settings,
"%s.plugins.eap-radius.nas_identifier", "strongSwan",
lib->ns);
@@ -150,7 +152,7 @@ static void load_configs(private_eap_radius_plugin_t *this)
retransmit_base = lib->settings->get_double(lib->settings,
"%s.plugins.eap-radius.retransmit_base", 1.4, lib->ns);
config = radius_config_create(address, address, auth_port, ACCT_PORT,
config = radius_config_create(address, address, source, auth_port, ACCT_PORT,
nas_identifier, secret, sockets, 0,
retransmit_tries, retransmit_timeout,
retransmit_base);
@@ -183,6 +185,11 @@ static void load_configs(private_eap_radius_plugin_t *this)
DBG1(DBG_CFG, "RADIUS server '%s' misses secret, skipped", section);
continue;
}
source = lib->settings->get_str(lib->settings,
"%s.plugins.eap-radius.servers.%s.source",
lib->settings->get_str(lib->settings,
"%s.plugins.eap-radius.source", NULL, lib->ns),
lib->ns, section);
nas_identifier = lib->settings->get_str(lib->settings,
"%s.plugins.eap-radius.servers.%s.nas_identifier",
lib->settings->get_str(lib->settings,
@@ -228,7 +235,7 @@ static void load_configs(private_eap_radius_plugin_t *this)
"%s.plugins.eap-radius.servers.%s.preference", 0,
lib->ns, section);
config = radius_config_create(section, address, auth_port, acct_port,
config = radius_config_create(section, address, source, auth_port, acct_port,
nas_identifier, secret, sockets, preference,
retransmit_tries, retransmit_timeout,
retransmit_base);