1845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project/*
2845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * hostapd / RADIUS client
3845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Copyright (c) 2002-2005, Jouni Malinen <j@w1.fi>
4845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
5845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * This program is free software; you can redistribute it and/or modify
6845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * it under the terms of the GNU General Public License version 2 as
7845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * published by the Free Software Foundation.
8845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
9845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * Alternatively, this software may be distributed under the terms of BSD
10845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * license.
11845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project *
12845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project * See README and COPYING for more details.
13845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project */
14845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
15845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#ifndef RADIUS_CLIENT_H
16845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#define RADIUS_CLIENT_H
17845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
18845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#include "config_types.h"
19845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
20845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstruct radius_msg;
21845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
22845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstruct hostapd_radius_server {
23845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* MIB prefix for shared variables:
24845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	 * @ = radiusAuth or radiusAcc depending on the type of the server */
25845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct hostapd_ip_addr addr; /* @ServerAddress */
26845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int port; /* @ClientServerPortNumber */
27845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u8 *shared_secret;
28845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	size_t shared_secret_len;
29845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
30845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* Dynamic (not from configuration file) MIB data */
31845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int index; /* @ServerIndex */
32845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int round_trip_time; /* @ClientRoundTripTime; in hundredths of a
33845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			      * second */
34845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 requests; /* @Client{Access,}Requests */
35845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 retransmissions; /* @Client{Access,}Retransmissions */
36845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 access_accepts; /* radiusAuthClientAccessAccepts */
37845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 access_rejects; /* radiusAuthClientAccessRejects */
38845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 access_challenges; /* radiusAuthClientAccessChallenges */
39845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 responses; /* radiusAccClientResponses */
40845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 malformed_responses; /* @ClientMalformed{Access,}Responses */
41845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 bad_authenticators; /* @ClientBadAuthenticators */
42845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 timeouts; /* @ClientTimeouts */
43845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 unknown_types; /* @ClientUnknownTypes */
44845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	u32 packets_dropped; /* @ClientPacketsDropped */
45845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* @ClientPendingRequests: length of hapd->radius->msgs for matching
46845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	 * msg_type */
47845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project};
48845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
49845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstruct hostapd_radius_servers {
50845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	/* RADIUS Authentication and Accounting servers in priority order */
51845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct hostapd_radius_server *auth_servers, *auth_server;
52845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int num_auth_servers;
53845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	struct hostapd_radius_server *acct_servers, *acct_server;
54845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int num_acct_servers;
55845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
56845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int retry_primary_interval;
57845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int acct_interim_interval;
58845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
59845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	int msg_dumps;
60845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project};
61845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
62845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
63845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projecttypedef enum {
64845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	RADIUS_AUTH,
65845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	RADIUS_ACCT,
66845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	RADIUS_ACCT_INTERIM /* used only with radius_client_send(); just like
67845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			     * RADIUS_ACCT, but removes any pending interim
68845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			     * RADIUS Accounting packages for the same STA
69845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			     * before sending the new interim update */
70845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} RadiusType;
71845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
72845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projecttypedef enum {
73845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	RADIUS_RX_PROCESSED,
74845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	RADIUS_RX_QUEUED,
75845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	RADIUS_RX_UNKNOWN,
76845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project	RADIUS_RX_INVALID_AUTHENTICATOR
77845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project} RadiusRxResult;
78845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
79845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstruct radius_client_data;
80845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
81845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectint radius_client_register(struct radius_client_data *radius,
82845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			   RadiusType msg_type,
83845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			   RadiusRxResult (*handler)
84845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			   (struct radius_msg *msg, struct radius_msg *req,
85845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    u8 *shared_secret, size_t shared_secret_len,
86845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			    void *data),
87845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			   void *data);
88845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectint radius_client_send(struct radius_client_data *radius,
89845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       struct radius_msg *msg,
90845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       RadiusType msg_type, const u8 *addr);
91845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectu8 radius_client_get_id(struct radius_client_data *radius);
92845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
93845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid radius_client_flush(struct radius_client_data *radius, int only_auth);
94845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstruct radius_client_data *
95845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectradius_client_init(void *ctx, struct hostapd_radius_servers *conf);
96845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid radius_client_deinit(struct radius_client_data *radius);
97845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectvoid radius_client_flush_auth(struct radius_client_data *radius, u8 *addr);
98845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectint radius_client_get_mib(struct radius_client_data *radius, char *buf,
99845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project			  size_t buflen);
100845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectstruct radius_client_data *
101845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Projectradius_client_reconfig(struct radius_client_data *old, void *ctx,
102845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       struct hostapd_radius_servers *oldconf,
103845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project		       struct hostapd_radius_servers *newconf);
104845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project
105845e0124d42b67ef926fbae32a7f61d2e5109ebdThe Android Open Source Project#endif /* RADIUS_CLIENT_H */
106