1*6d49e1aeSJan Lentfer /* 2*6d49e1aeSJan Lentfer * hostapd / RADIUS client 3*6d49e1aeSJan Lentfer * Copyright (c) 2002-2005, Jouni Malinen <j@w1.fi> 4*6d49e1aeSJan Lentfer * 5*6d49e1aeSJan Lentfer * This program is free software; you can redistribute it and/or modify 6*6d49e1aeSJan Lentfer * it under the terms of the GNU General Public License version 2 as 7*6d49e1aeSJan Lentfer * published by the Free Software Foundation. 8*6d49e1aeSJan Lentfer * 9*6d49e1aeSJan Lentfer * Alternatively, this software may be distributed under the terms of BSD 10*6d49e1aeSJan Lentfer * license. 11*6d49e1aeSJan Lentfer * 12*6d49e1aeSJan Lentfer * See README and COPYING for more details. 13*6d49e1aeSJan Lentfer */ 14*6d49e1aeSJan Lentfer 15*6d49e1aeSJan Lentfer #ifndef RADIUS_CLIENT_H 16*6d49e1aeSJan Lentfer #define RADIUS_CLIENT_H 17*6d49e1aeSJan Lentfer 18*6d49e1aeSJan Lentfer #include "ip_addr.h" 19*6d49e1aeSJan Lentfer 20*6d49e1aeSJan Lentfer struct radius_msg; 21*6d49e1aeSJan Lentfer 22*6d49e1aeSJan Lentfer struct hostapd_radius_server { 23*6d49e1aeSJan Lentfer /* MIB prefix for shared variables: 24*6d49e1aeSJan Lentfer * @ = radiusAuth or radiusAcc depending on the type of the server */ 25*6d49e1aeSJan Lentfer struct hostapd_ip_addr addr; /* @ServerAddress */ 26*6d49e1aeSJan Lentfer int port; /* @ClientServerPortNumber */ 27*6d49e1aeSJan Lentfer u8 *shared_secret; 28*6d49e1aeSJan Lentfer size_t shared_secret_len; 29*6d49e1aeSJan Lentfer 30*6d49e1aeSJan Lentfer /* Dynamic (not from configuration file) MIB data */ 31*6d49e1aeSJan Lentfer int index; /* @ServerIndex */ 32*6d49e1aeSJan Lentfer int round_trip_time; /* @ClientRoundTripTime; in hundredths of a 33*6d49e1aeSJan Lentfer * second */ 34*6d49e1aeSJan Lentfer u32 requests; /* @Client{Access,}Requests */ 35*6d49e1aeSJan Lentfer u32 retransmissions; /* @Client{Access,}Retransmissions */ 36*6d49e1aeSJan Lentfer u32 access_accepts; /* radiusAuthClientAccessAccepts */ 37*6d49e1aeSJan Lentfer u32 access_rejects; /* radiusAuthClientAccessRejects */ 38*6d49e1aeSJan Lentfer u32 access_challenges; /* radiusAuthClientAccessChallenges */ 39*6d49e1aeSJan Lentfer u32 responses; /* radiusAccClientResponses */ 40*6d49e1aeSJan Lentfer u32 malformed_responses; /* @ClientMalformed{Access,}Responses */ 41*6d49e1aeSJan Lentfer u32 bad_authenticators; /* @ClientBadAuthenticators */ 42*6d49e1aeSJan Lentfer u32 timeouts; /* @ClientTimeouts */ 43*6d49e1aeSJan Lentfer u32 unknown_types; /* @ClientUnknownTypes */ 44*6d49e1aeSJan Lentfer u32 packets_dropped; /* @ClientPacketsDropped */ 45*6d49e1aeSJan Lentfer /* @ClientPendingRequests: length of hapd->radius->msgs for matching 46*6d49e1aeSJan Lentfer * msg_type */ 47*6d49e1aeSJan Lentfer }; 48*6d49e1aeSJan Lentfer 49*6d49e1aeSJan Lentfer struct hostapd_radius_servers { 50*6d49e1aeSJan Lentfer /* RADIUS Authentication and Accounting servers in priority order */ 51*6d49e1aeSJan Lentfer struct hostapd_radius_server *auth_servers, *auth_server; 52*6d49e1aeSJan Lentfer int num_auth_servers; 53*6d49e1aeSJan Lentfer struct hostapd_radius_server *acct_servers, *acct_server; 54*6d49e1aeSJan Lentfer int num_acct_servers; 55*6d49e1aeSJan Lentfer 56*6d49e1aeSJan Lentfer int retry_primary_interval; 57*6d49e1aeSJan Lentfer int acct_interim_interval; 58*6d49e1aeSJan Lentfer 59*6d49e1aeSJan Lentfer int msg_dumps; 60*6d49e1aeSJan Lentfer 61*6d49e1aeSJan Lentfer struct hostapd_ip_addr client_addr; 62*6d49e1aeSJan Lentfer int force_client_addr; 63*6d49e1aeSJan Lentfer }; 64*6d49e1aeSJan Lentfer 65*6d49e1aeSJan Lentfer 66*6d49e1aeSJan Lentfer typedef enum { 67*6d49e1aeSJan Lentfer RADIUS_AUTH, 68*6d49e1aeSJan Lentfer RADIUS_ACCT, 69*6d49e1aeSJan Lentfer RADIUS_ACCT_INTERIM /* used only with radius_client_send(); just like 70*6d49e1aeSJan Lentfer * RADIUS_ACCT, but removes any pending interim 71*6d49e1aeSJan Lentfer * RADIUS Accounting packages for the same STA 72*6d49e1aeSJan Lentfer * before sending the new interim update */ 73*6d49e1aeSJan Lentfer } RadiusType; 74*6d49e1aeSJan Lentfer 75*6d49e1aeSJan Lentfer typedef enum { 76*6d49e1aeSJan Lentfer RADIUS_RX_PROCESSED, 77*6d49e1aeSJan Lentfer RADIUS_RX_QUEUED, 78*6d49e1aeSJan Lentfer RADIUS_RX_UNKNOWN, 79*6d49e1aeSJan Lentfer RADIUS_RX_INVALID_AUTHENTICATOR 80*6d49e1aeSJan Lentfer } RadiusRxResult; 81*6d49e1aeSJan Lentfer 82*6d49e1aeSJan Lentfer struct radius_client_data; 83*6d49e1aeSJan Lentfer 84*6d49e1aeSJan Lentfer int radius_client_register(struct radius_client_data *radius, 85*6d49e1aeSJan Lentfer RadiusType msg_type, 86*6d49e1aeSJan Lentfer RadiusRxResult (*handler) 87*6d49e1aeSJan Lentfer (struct radius_msg *msg, struct radius_msg *req, 88*6d49e1aeSJan Lentfer const u8 *shared_secret, size_t shared_secret_len, 89*6d49e1aeSJan Lentfer void *data), 90*6d49e1aeSJan Lentfer void *data); 91*6d49e1aeSJan Lentfer int radius_client_send(struct radius_client_data *radius, 92*6d49e1aeSJan Lentfer struct radius_msg *msg, 93*6d49e1aeSJan Lentfer RadiusType msg_type, const u8 *addr); 94*6d49e1aeSJan Lentfer u8 radius_client_get_id(struct radius_client_data *radius); 95*6d49e1aeSJan Lentfer 96*6d49e1aeSJan Lentfer void radius_client_flush(struct radius_client_data *radius, int only_auth); 97*6d49e1aeSJan Lentfer struct radius_client_data * 98*6d49e1aeSJan Lentfer radius_client_init(void *ctx, struct hostapd_radius_servers *conf); 99*6d49e1aeSJan Lentfer void radius_client_deinit(struct radius_client_data *radius); 100*6d49e1aeSJan Lentfer void radius_client_flush_auth(struct radius_client_data *radius, u8 *addr); 101*6d49e1aeSJan Lentfer int radius_client_get_mib(struct radius_client_data *radius, char *buf, 102*6d49e1aeSJan Lentfer size_t buflen); 103*6d49e1aeSJan Lentfer struct radius_client_data * 104*6d49e1aeSJan Lentfer radius_client_reconfig(struct radius_client_data *old, void *ctx, 105*6d49e1aeSJan Lentfer struct hostapd_radius_servers *oldconf, 106*6d49e1aeSJan Lentfer struct hostapd_radius_servers *newconf); 107*6d49e1aeSJan Lentfer 108*6d49e1aeSJan Lentfer #endif /* RADIUS_CLIENT_H */ 109