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