*/
static void send_response(private_eap_radius_dae_t *this,
radius_message_t *request, radius_message_code_t code,
- struct sockaddr* addr, socklen_t addr_len)
+ host_t *client)
{
radius_message_t *response;
chunk_t data;
this->secret, this->hasher, this->signer, NULL);
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));
}
* Process a DAE disconnect request, send response
*/
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;
identification_t *user;
uintptr_t id;
ike_sa_t *ike_sa;
chunk_t data;
- host_t *host;
int type;
ids = linked_list_create();
- host = host_create_from_sockaddr(addr);
enumerator = request->create_enumerator(request);
while (enumerator->enumerate(enumerator, &type, &data))
{
{
user = identification_create_from_data(data);
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(
charon->ike_sa_manager, FALSE);
while (sa_enum->enumerate(sa_enum, &ike_sa))
}
}
enumerator->destroy(enumerator);
- DESTROY_IF(host);
if (ids->get_count(ids))
{
}
enumerator->destroy(enumerator);
- send_response(this, request, RMC_DISCONNECT_ACK, addr, addr_len);
+ send_response(this, request, RMC_DISCONNECT_ACK, client);
}
else
{
DBG1(DBG_CFG, "no IKE_SA matches %N, sending %N",
radius_message_code_names, RMC_DISCONNECT_REQUEST,
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);
}
char buf[2048];
ssize_t len;
bool oldstate;
+ host_t *client;
oldstate = thread_cancelability(TRUE);
len = recvfrom(this->fd, buf, sizeof(buf), 0,
request = radius_message_parse(chunk_create(buf, len));
if (request)
{
- if (request->verify(request, NULL, this->secret,
- this->hasher, this->signer))
+ client = host_create_from_sockaddr((struct sockaddr*)&addr);
+ if (client)
{
- switch (request->get_code(request))
+ if (request->verify(request, NULL, this->secret,
+ this->hasher, this->signer))
{
- case RMC_DISCONNECT_REQUEST:
- process_disconnect(this, request,
- (struct sockaddr*)&addr, addr_len);
+ switch (request->get_code(request))
+ {
+ 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;
- 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);
}