Example application using RADIUS client as a library
Copyright (c) 2007, Jouni Malinen <j@w1.fi>

This software may be distributed under the terms of the BSD license.
See the parent directory README for more details.


This directory contains an example showing how the RADIUS client
functionality from hostapd can be used as a library in another
program. The example program initializes the RADIUS client and send a
Access-Request using User-Name and User-Password attributes. A reply
from the RADIUS authentication server will be processed and it is used
as a trigger to terminate the example program.

The RADIUS library links in couple of helper functions from src/utils and
src/crypto directories. Most of these are suitable as-is, but it may
be desirable to replace the debug output code in src/utils/wpa_debug.c
by dropping this file from the library and re-implementing the
functions there in a way that better fits in with the main
application.

RADIUS client implementation takes care of receiving messages,
timeouts, and retransmissions of packets. Consequently, it requires
functionality for registering timeouts and received packet
notifications. This is implemented using the generic event loop
implementation (see src/utils/eloop.h).

The main application may either use the included event loop
implementation or alternatively, implement eloop_* wrapper functions
to use whatever event loop design is used in the main program. This
would involve removing src/utils/eloop.o from the library and
implementing following functions defines in src/utils/eloop.h:
eloop_register_timeout(), eloop_cancel_timeout(),
eloop_register_read_sock(), eloop_unregister_read_sock(), and
eloop_terminated().
