Developer notes for hostapd
===========================

hostapd daemon setup, operations, and shutdown
----------------------------------------------

Files: hostapd.[ch]

Externally called functions:
  hostapd_new_assoc_sta() is called when a station associates with the AP

Event loop functions:
  handle_term() is called on SIGINT and SIGTERM to terminate hostapd process
  handle_reload() is called on SIGHUP to reload configuration
  handle_dump_state() is called on SIGUSR1 to dump station state data to a
	text file
  hostapd_rotate_wep() is called to periodically change WEP keys


Configuration parsing
---------------------

Configuration file parsing and data structure definition.

Files: config.[ch]

Externally called functions:
  hostapd_config_read() is called to read and parse a configuration file;
	allocates and returns configuration data structure
  hostapd_config_free() is called to free configuration data structure
  hostapd_maclist_found() is called to check whether a given address is found
	in a list of MAC addresses


Kernel driver access
--------------------

Helper functions for configuring the Host AP kernel driver and
accessing data from it.

Files: driver.[ch]


IEEE 802.11 frame handling (netdevice wlan#ap)
----------------------------------------------

Receive all incoming IEEE 802.11 frames from the kernel driver via
wlan#ap interface.

Files: receive.c

Externally called functions:
  hostapd_init_sockets() is called to initialize sockets for receiving and
	sending IEEE 802.11 frames via wlan#ap interface

Event loop functions:
  handle_read() is called for each incoming packet from wlan#ap net device


Station table
-------------

Files: sta_info.[ch], ap.h

Event loop functions:
  ap_handle_timer() is called to check station activity and to remove
	inactive stations


IEEE 802.11 management
----------------------

IEEE 802.11 management frame sending and processing (mainly,
authentication and association). IEEE 802.11 station functionality
(authenticate and associate with another AP as an station).

Files: ieee802_11.[ch]

Externally called functions:
  ieee802_11_mgmt() is called for each received IEEE 802.11 management frame
	(from handle_frame() in hostapd.c)
  ieee802_11_mgmt_cb() is called for each received TX callback of IEEE 802.11
	management frame (from handle_tx_callback() in hostapd.c)
  ieee802_11_send_deauth() is called to send deauthentication frame
  ieee802_11_send_disassoc() is called to send disassociation frame
  ieee802_11_parse_elems() is used to parse information elements in
	IEEE 802.11 management frames

Event loop functions:
  ieee802_11_sta_authenticate() called to retry authentication (with another
	AP)
  ieee802_11_sta_associate() called to retry association (with another AP)


IEEE 802.11 authentication
--------------------------

Access control list for IEEE 802.11 authentication. Uses staticly
configured ACL from configuration files or an external RADIUS
server. Results from external RADIUS queries are cached to allow
faster authentication frame processing.

Files: ieee802_11_auth.[ch]

Externally called functions:
  hostapd_acl_init() called once during hostapd startup
  hostapd_acl_deinit() called once during hostapd shutdown
  hostapd_acl_recv_radius() called by IEEE 802.1X code for incoming RADIUS
	Authentication messages (returns 0 if message was processed)
  hostapd_allowed_address() called to check whether a specified station can be
	authenticated

Event loop functions:
  hostapd_acl_expire() is called to expire ACL cache entries


IEEE 802.1X Authenticator
-------------------------

Files: ieee802_1x.[ch]


Externally called functions:
  ieee802_1x_receive() is called for each incoming EAPOL frame from the
	wireless interface
  ieee802_1x_new_station() is called to start IEEE 802.1X authentication when
	a new station completes IEEE 802.11 association

Event loop functions:
  ieee802_1x_receive_auth() called for each incoming RADIUS Authentication
	message


EAPOL state machine
-------------------

IEEE 802.1X state machine for EAPOL.

Files: eapol_sm.[ch]

Externally called functions:
  eapol_sm_step() is called to advance EAPOL state machines after any change
	that could affect their state

Event loop functions:
  eapol_port_timers_tick() called once per second to advance Port Timers state
	machine


IEEE 802.11f (IAPP)
-------------------

Files: iapp.[ch]

Externally called functions:
  iapp_new_station() is called to start accounting session when a new station
	completes IEEE 802.11 association or IEEE 802.1X authentication

Event loop functions:
  iapp_receive_udp() is called for incoming IAPP frames over UDP


Per station accounting
----------------------

Send RADIUS Accounting start and stop messages to a RADIUS Accounting
server. Process incoming RADIUS Accounting messages.

Files: accounting.[ch]

Externally called functions:
  accounting_init() called once during hostapd startup
  accounting_deinit() called once during hostapd shutdown
  accounting_sta_start() called when a station starts new session
  accounting_sta_stop() called when a station session is terminated

Event loop functions:
  accounting_receive() called for each incoming RADIUS Accounting message
  accounting_list_timer() called to retransmit accounting messages and to
	remove expired entries


RADIUS messages
---------------

RADIUS message generation and parsing functions.

Files: radius.[ch]


Event loop
----------

Event loop for registering timeout calls, signal handlers, and socket
read events.

Files: eloop.[ch]


RC4
---

RC4 encryption

Files: rc4.[ch]


MD5
---

MD5 hash and HMAC-MD5.

Files: md5.[ch]


Miscellaneous helper functions
------------------------------

Files: common.[ch]
