xref: /freebsd/contrib/wpa/src/radius/radius_client.h (revision 39beb93c3f8bdbf72a61fda42300b5ebed7390c8)
139beb93cSSam Leffler /*
239beb93cSSam Leffler  * hostapd / RADIUS client
339beb93cSSam Leffler  * Copyright (c) 2002-2005, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
539beb93cSSam Leffler  * This program is free software; you can redistribute it and/or modify
639beb93cSSam Leffler  * it under the terms of the GNU General Public License version 2 as
739beb93cSSam Leffler  * published by the Free Software Foundation.
839beb93cSSam Leffler  *
939beb93cSSam Leffler  * Alternatively, this software may be distributed under the terms of BSD
1039beb93cSSam Leffler  * license.
1139beb93cSSam Leffler  *
1239beb93cSSam Leffler  * See README and COPYING for more details.
1339beb93cSSam Leffler  */
1439beb93cSSam Leffler 
1539beb93cSSam Leffler #ifndef RADIUS_CLIENT_H
1639beb93cSSam Leffler #define RADIUS_CLIENT_H
1739beb93cSSam Leffler 
1839beb93cSSam Leffler #include "ip_addr.h"
1939beb93cSSam Leffler 
2039beb93cSSam Leffler struct radius_msg;
2139beb93cSSam Leffler 
2239beb93cSSam Leffler struct hostapd_radius_server {
2339beb93cSSam Leffler 	/* MIB prefix for shared variables:
2439beb93cSSam Leffler 	 * @ = radiusAuth or radiusAcc depending on the type of the server */
2539beb93cSSam Leffler 	struct hostapd_ip_addr addr; /* @ServerAddress */
2639beb93cSSam Leffler 	int port; /* @ClientServerPortNumber */
2739beb93cSSam Leffler 	u8 *shared_secret;
2839beb93cSSam Leffler 	size_t shared_secret_len;
2939beb93cSSam Leffler 
3039beb93cSSam Leffler 	/* Dynamic (not from configuration file) MIB data */
3139beb93cSSam Leffler 	int index; /* @ServerIndex */
3239beb93cSSam Leffler 	int round_trip_time; /* @ClientRoundTripTime; in hundredths of a
3339beb93cSSam Leffler 			      * second */
3439beb93cSSam Leffler 	u32 requests; /* @Client{Access,}Requests */
3539beb93cSSam Leffler 	u32 retransmissions; /* @Client{Access,}Retransmissions */
3639beb93cSSam Leffler 	u32 access_accepts; /* radiusAuthClientAccessAccepts */
3739beb93cSSam Leffler 	u32 access_rejects; /* radiusAuthClientAccessRejects */
3839beb93cSSam Leffler 	u32 access_challenges; /* radiusAuthClientAccessChallenges */
3939beb93cSSam Leffler 	u32 responses; /* radiusAccClientResponses */
4039beb93cSSam Leffler 	u32 malformed_responses; /* @ClientMalformed{Access,}Responses */
4139beb93cSSam Leffler 	u32 bad_authenticators; /* @ClientBadAuthenticators */
4239beb93cSSam Leffler 	u32 timeouts; /* @ClientTimeouts */
4339beb93cSSam Leffler 	u32 unknown_types; /* @ClientUnknownTypes */
4439beb93cSSam Leffler 	u32 packets_dropped; /* @ClientPacketsDropped */
4539beb93cSSam Leffler 	/* @ClientPendingRequests: length of hapd->radius->msgs for matching
4639beb93cSSam Leffler 	 * msg_type */
4739beb93cSSam Leffler };
4839beb93cSSam Leffler 
4939beb93cSSam Leffler struct hostapd_radius_servers {
5039beb93cSSam Leffler 	/* RADIUS Authentication and Accounting servers in priority order */
5139beb93cSSam Leffler 	struct hostapd_radius_server *auth_servers, *auth_server;
5239beb93cSSam Leffler 	int num_auth_servers;
5339beb93cSSam Leffler 	struct hostapd_radius_server *acct_servers, *acct_server;
5439beb93cSSam Leffler 	int num_acct_servers;
5539beb93cSSam Leffler 
5639beb93cSSam Leffler 	int retry_primary_interval;
5739beb93cSSam Leffler 	int acct_interim_interval;
5839beb93cSSam Leffler 
5939beb93cSSam Leffler 	int msg_dumps;
6039beb93cSSam Leffler 
6139beb93cSSam Leffler 	struct hostapd_ip_addr client_addr;
6239beb93cSSam Leffler 	int force_client_addr;
6339beb93cSSam Leffler };
6439beb93cSSam Leffler 
6539beb93cSSam Leffler 
6639beb93cSSam Leffler typedef enum {
6739beb93cSSam Leffler 	RADIUS_AUTH,
6839beb93cSSam Leffler 	RADIUS_ACCT,
6939beb93cSSam Leffler 	RADIUS_ACCT_INTERIM /* used only with radius_client_send(); just like
7039beb93cSSam Leffler 			     * RADIUS_ACCT, but removes any pending interim
7139beb93cSSam Leffler 			     * RADIUS Accounting packages for the same STA
7239beb93cSSam Leffler 			     * before sending the new interim update */
7339beb93cSSam Leffler } RadiusType;
7439beb93cSSam Leffler 
7539beb93cSSam Leffler typedef enum {
7639beb93cSSam Leffler 	RADIUS_RX_PROCESSED,
7739beb93cSSam Leffler 	RADIUS_RX_QUEUED,
7839beb93cSSam Leffler 	RADIUS_RX_UNKNOWN,
7939beb93cSSam Leffler 	RADIUS_RX_INVALID_AUTHENTICATOR
8039beb93cSSam Leffler } RadiusRxResult;
8139beb93cSSam Leffler 
8239beb93cSSam Leffler struct radius_client_data;
8339beb93cSSam Leffler 
8439beb93cSSam Leffler int radius_client_register(struct radius_client_data *radius,
8539beb93cSSam Leffler 			   RadiusType msg_type,
8639beb93cSSam Leffler 			   RadiusRxResult (*handler)
8739beb93cSSam Leffler 			   (struct radius_msg *msg, struct radius_msg *req,
8839beb93cSSam Leffler 			    const u8 *shared_secret, size_t shared_secret_len,
8939beb93cSSam Leffler 			    void *data),
9039beb93cSSam Leffler 			   void *data);
9139beb93cSSam Leffler int radius_client_send(struct radius_client_data *radius,
9239beb93cSSam Leffler 		       struct radius_msg *msg,
9339beb93cSSam Leffler 		       RadiusType msg_type, const u8 *addr);
9439beb93cSSam Leffler u8 radius_client_get_id(struct radius_client_data *radius);
9539beb93cSSam Leffler 
9639beb93cSSam Leffler void radius_client_flush(struct radius_client_data *radius, int only_auth);
9739beb93cSSam Leffler struct radius_client_data *
9839beb93cSSam Leffler radius_client_init(void *ctx, struct hostapd_radius_servers *conf);
9939beb93cSSam Leffler void radius_client_deinit(struct radius_client_data *radius);
10039beb93cSSam Leffler void radius_client_flush_auth(struct radius_client_data *radius, u8 *addr);
10139beb93cSSam Leffler int radius_client_get_mib(struct radius_client_data *radius, char *buf,
10239beb93cSSam Leffler 			  size_t buflen);
10339beb93cSSam Leffler struct radius_client_data *
10439beb93cSSam Leffler radius_client_reconfig(struct radius_client_data *old, void *ctx,
10539beb93cSSam Leffler 		       struct hostapd_radius_servers *oldconf,
10639beb93cSSam Leffler 		       struct hostapd_radius_servers *newconf);
10739beb93cSSam Leffler 
10839beb93cSSam Leffler #endif /* RADIUS_CLIENT_H */
109