Pass RADIUS DAE client address a host_t instead of sockaddr struct

This commit is contained in:
Martin Willi
2012-03-05 18:06:14 +01:00
parent 9756c143f0
commit 964b0c144e
@@ -77,7 +77,7 @@ struct private_eap_radius_dae_t {
*/ */
static void send_response(private_eap_radius_dae_t *this, static void send_response(private_eap_radius_dae_t *this,
radius_message_t *request, radius_message_code_t code, radius_message_t *request, radius_message_code_t code,
struct sockaddr* addr, socklen_t addr_len) host_t *client)
{ {
radius_message_t *response; radius_message_t *response;
chunk_t data; chunk_t data;
@@ -88,7 +88,8 @@ static void send_response(private_eap_radius_dae_t *this,
this->secret, this->hasher, this->signer, NULL); this->secret, this->hasher, this->signer, NULL);
data = response->get_encoding(response); data = response->get_encoding(response);
if (sendto(this->fd, data.ptr, data.len, 0, addr, addr_len) != data.len) if (sendto(this->fd, data.ptr, data.len, 0, client->get_sockaddr(client),
*client->get_sockaddr_len(client)) != data.len)
{ {
DBG1(DBG_CFG, "sending RADIUS DAE response failed: %s", strerror(errno)); DBG1(DBG_CFG, "sending RADIUS DAE response failed: %s", strerror(errno));
} }
@@ -99,7 +100,7 @@ static void send_response(private_eap_radius_dae_t *this,
* Process a DAE disconnect request, send response * Process a DAE disconnect request, send response
*/ */
static void process_disconnect(private_eap_radius_dae_t *this, static void process_disconnect(private_eap_radius_dae_t *this,
radius_message_t *request, struct sockaddr* addr, socklen_t addr_len) radius_message_t *request, host_t *client)
{ {
enumerator_t *enumerator, *sa_enum; enumerator_t *enumerator, *sa_enum;
identification_t *user; identification_t *user;
@@ -107,12 +108,10 @@ static void process_disconnect(private_eap_radius_dae_t *this,
uintptr_t id; uintptr_t id;
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
chunk_t data; chunk_t data;
host_t *host;
int type; int type;
ids = linked_list_create(); ids = linked_list_create();
host = host_create_from_sockaddr(addr);
enumerator = request->create_enumerator(request); enumerator = request->create_enumerator(request);
while (enumerator->enumerate(enumerator, &type, &data)) while (enumerator->enumerate(enumerator, &type, &data))
{ {
@@ -120,7 +119,7 @@ static void process_disconnect(private_eap_radius_dae_t *this,
{ {
user = identification_create_from_data(data); user = identification_create_from_data(data);
DBG1(DBG_CFG, "received RADIUS DAE %N for %Y from %H", DBG1(DBG_CFG, "received RADIUS DAE %N for %Y from %H",
radius_message_code_names, RMC_DISCONNECT_REQUEST, user, host); radius_message_code_names, RMC_DISCONNECT_REQUEST, user, client);
sa_enum = charon->ike_sa_manager->create_enumerator( sa_enum = charon->ike_sa_manager->create_enumerator(
charon->ike_sa_manager, FALSE); charon->ike_sa_manager, FALSE);
while (sa_enum->enumerate(sa_enum, &ike_sa)) while (sa_enum->enumerate(sa_enum, &ike_sa))
@@ -136,7 +135,6 @@ static void process_disconnect(private_eap_radius_dae_t *this,
} }
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
DESTROY_IF(host);
if (ids->get_count(ids)) if (ids->get_count(ids))
{ {
@@ -153,14 +151,14 @@ static void process_disconnect(private_eap_radius_dae_t *this,
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
send_response(this, request, RMC_DISCONNECT_ACK, addr, addr_len); send_response(this, request, RMC_DISCONNECT_ACK, client);
} }
else else
{ {
DBG1(DBG_CFG, "no IKE_SA matches %N, sending %N", DBG1(DBG_CFG, "no IKE_SA matches %N, sending %N",
radius_message_code_names, RMC_DISCONNECT_REQUEST, radius_message_code_names, RMC_DISCONNECT_REQUEST,
radius_message_code_names, RMC_DISCONNECT_NAK); radius_message_code_names, RMC_DISCONNECT_NAK);
send_response(this, request, RMC_DISCONNECT_NAK, addr, addr_len); send_response(this, request, RMC_DISCONNECT_NAK, client);
} }
ids->destroy(ids); ids->destroy(ids);
} }
@@ -176,6 +174,7 @@ static job_requeue_t receive(private_eap_radius_dae_t *this)
char buf[2048]; char buf[2048];
ssize_t len; ssize_t len;
bool oldstate; bool oldstate;
host_t *client;
oldstate = thread_cancelability(TRUE); oldstate = thread_cancelability(TRUE);
len = recvfrom(this->fd, buf, sizeof(buf), 0, len = recvfrom(this->fd, buf, sizeof(buf), 0,
@@ -187,23 +186,27 @@ static job_requeue_t receive(private_eap_radius_dae_t *this)
request = radius_message_parse(chunk_create(buf, len)); request = radius_message_parse(chunk_create(buf, len));
if (request) if (request)
{ {
if (request->verify(request, NULL, this->secret, client = host_create_from_sockaddr((struct sockaddr*)&addr);
this->hasher, this->signer)) if (client)
{ {
switch (request->get_code(request)) if (request->verify(request, NULL, this->secret,
this->hasher, this->signer))
{ {
case RMC_DISCONNECT_REQUEST: switch (request->get_code(request))
process_disconnect(this, request, {
(struct sockaddr*)&addr, addr_len); case RMC_DISCONNECT_REQUEST:
process_disconnect(this, request, client);
break;
case RMC_COA_REQUEST:
/* TODO */
default:
DBG1(DBG_CFG, "ignoring unsupported RADIUS DAE %N "
"message from %H", radius_message_code_names,
request->get_code(request), client);
break; break;
case RMC_COA_REQUEST: }
/* TODO */
default:
DBG1(DBG_CFG, "ignoring unsupported RADIUS DAE %N "
"message", radius_message_code_names,
request->get_code(request));
break;
} }
client->destroy(client);
} }
request->destroy(request); request->destroy(request);
} }