1 /* 2 * RADIUS client 3 * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15 #ifndef RADIUS_CLIENT_H 16 #define RADIUS_CLIENT_H 17 18 #include "ip_addr.h" 19 20 struct radius_msg; 21 22 /** 23 * struct hostapd_radius_server - RADIUS server information for RADIUS client 24 * 25 * This structure contains information about a RADIUS server. The values are 26 * mainly for MIB information. The MIB variable prefix (radiusAuth or 27 * radiusAcc) depends on whether this is an authentication or accounting 28 * server. 29 * 30 * radiusAuthClientPendingRequests (or radiusAccClientPendingRequests) is the 31 * number struct radius_client_data::msgs for matching msg_type. 32 */ 33 struct hostapd_radius_server { 34 /** 35 * addr - radiusAuthServerAddress or radiusAccServerAddress 36 */ 37 struct hostapd_ip_addr addr; 38 39 /** 40 * port - radiusAuthClientServerPortNumber or radiusAccClientServerPortNumber 41 */ 42 int port; 43 44 /** 45 * shared_secret - Shared secret for authenticating RADIUS messages 46 */ 47 u8 *shared_secret; 48 49 /** 50 * shared_secret_len - Length of shared_secret in octets 51 */ 52 size_t shared_secret_len; 53 54 /* Dynamic (not from configuration file) MIB data */ 55 56 /** 57 * index - radiusAuthServerIndex or radiusAccServerIndex 58 */ 59 int index; 60 61 /** 62 * round_trip_time - radiusAuthClientRoundTripTime or radiusAccClientRoundTripTime 63 * Round-trip time in hundredths of a second. 64 */ 65 int round_trip_time; 66 67 /** 68 * requests - radiusAuthClientAccessRequests or radiusAccClientRequests 69 */ 70 u32 requests; 71 72 /** 73 * retransmissions - radiusAuthClientAccessRetransmissions or radiusAccClientRetransmissions 74 */ 75 u32 retransmissions; 76 77 /** 78 * access_accepts - radiusAuthClientAccessAccepts 79 */ 80 u32 access_accepts; 81 82 /** 83 * access_rejects - radiusAuthClientAccessRejects 84 */ 85 u32 access_rejects; 86 87 /** 88 * access_challenges - radiusAuthClientAccessChallenges 89 */ 90 u32 access_challenges; 91 92 /** 93 * responses - radiusAccClientResponses 94 */ 95 u32 responses; 96 97 /** 98 * malformed_responses - radiusAuthClientMalformedAccessResponses or radiusAccClientMalformedResponses 99 */ 100 u32 malformed_responses; 101 102 /** 103 * bad_authenticators - radiusAuthClientBadAuthenticators or radiusAccClientBadAuthenticators 104 */ 105 u32 bad_authenticators; 106 107 /** 108 * timeouts - radiusAuthClientTimeouts or radiusAccClientTimeouts 109 */ 110 u32 timeouts; 111 112 /** 113 * unknown_types - radiusAuthClientUnknownTypes or radiusAccClientUnknownTypes 114 */ 115 u32 unknown_types; 116 117 /** 118 * packets_dropped - radiusAuthClientPacketsDropped or radiusAccClientPacketsDropped 119 */ 120 u32 packets_dropped; 121 }; 122 123 /** 124 * struct hostapd_radius_servers - RADIUS servers for RADIUS client 125 */ 126 struct hostapd_radius_servers { 127 /** 128 * auth_servers - RADIUS Authentication servers in priority order 129 */ 130 struct hostapd_radius_server *auth_servers; 131 132 /** 133 * num_auth_servers - Number of auth_servers entries 134 */ 135 int num_auth_servers; 136 137 /** 138 * auth_server - The current Authentication server 139 */ 140 struct hostapd_radius_server *auth_server; 141 142 /** 143 * acct_servers - RADIUS Accounting servers in priority order 144 */ 145 struct hostapd_radius_server *acct_servers; 146 147 /** 148 * num_acct_servers - Number of acct_servers entries 149 */ 150 int num_acct_servers; 151 152 /** 153 * acct_server - The current Accounting server 154 */ 155 struct hostapd_radius_server *acct_server; 156 157 /** 158 * retry_primary_interval - Retry interval for trying primary server 159 * 160 * This specifies a retry interval in sexconds for trying to return to 161 * the primary RADIUS server. RADIUS client code will automatically try 162 * to use the next server when the current server is not replying to 163 * requests. If this interval is set (non-zero), the primary server 164 * will be retried after the specified number of seconds has passed 165 * even if the current used secondary server is still working. 166 */ 167 int retry_primary_interval; 168 169 /** 170 * msg_dumps - Whether RADIUS message details are shown in stdout 171 */ 172 int msg_dumps; 173 174 /** 175 * client_addr - Client (local) address to use if force_client_addr 176 */ 177 struct hostapd_ip_addr client_addr; 178 179 /** 180 * force_client_addr - Whether to force client (local) address 181 */ 182 int force_client_addr; 183 }; 184 185 186 /** 187 * RadiusType - RADIUS server type for RADIUS client 188 */ 189 typedef enum { 190 /** 191 * RADIUS authentication 192 */ 193 RADIUS_AUTH, 194 195 /** 196 * RADIUS_ACCT - RADIUS accounting 197 */ 198 RADIUS_ACCT, 199 200 /** 201 * RADIUS_ACCT_INTERIM - RADIUS interim accounting message 202 * 203 * Used only with radius_client_send(). This behaves just like 204 * RADIUS_ACCT, but removes any pending interim RADIUS Accounting 205 * messages for the same STA before sending the new interim update. 206 */ 207 RADIUS_ACCT_INTERIM 208 } RadiusType; 209 210 /** 211 * RadiusRxResult - RADIUS client RX handler result 212 */ 213 typedef enum { 214 /** 215 * RADIUS_RX_PROCESSED - Message processed 216 * 217 * This stops handler calls and frees the message. 218 */ 219 RADIUS_RX_PROCESSED, 220 221 /** 222 * RADIUS_RX_QUEUED - Message has been queued 223 * 224 * This stops handler calls, but does not free the message; the handler 225 * that returned this is responsible for eventually freeing the 226 * message. 227 */ 228 RADIUS_RX_QUEUED, 229 230 /** 231 * RADIUS_RX_UNKNOWN - Message is not for this handler 232 */ 233 RADIUS_RX_UNKNOWN, 234 235 /** 236 * RADIUS_RX_INVALID_AUTHENTICATOR - Message has invalid Authenticator 237 */ 238 RADIUS_RX_INVALID_AUTHENTICATOR 239 } RadiusRxResult; 240 241 struct radius_client_data; 242 243 int radius_client_register(struct radius_client_data *radius, 244 RadiusType msg_type, 245 RadiusRxResult (*handler) 246 (struct radius_msg *msg, struct radius_msg *req, 247 const u8 *shared_secret, size_t shared_secret_len, 248 void *data), 249 void *data); 250 int radius_client_send(struct radius_client_data *radius, 251 struct radius_msg *msg, 252 RadiusType msg_type, const u8 *addr); 253 u8 radius_client_get_id(struct radius_client_data *radius); 254 void radius_client_flush(struct radius_client_data *radius, int only_auth); 255 struct radius_client_data * 256 radius_client_init(void *ctx, struct hostapd_radius_servers *conf); 257 void radius_client_deinit(struct radius_client_data *radius); 258 void radius_client_flush_auth(struct radius_client_data *radius, 259 const u8 *addr); 260 int radius_client_get_mib(struct radius_client_data *radius, char *buf, 261 size_t buflen); 262 263 #endif /* RADIUS_CLIENT_H */ 264