summaryrefslogtreecommitdiff
path: root/accel-pppd/radius/radius_p.h
blob: 6ee130f1ff71bca3ae92a5df7de4a94535b88b24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#ifndef __RADIUS_P_H
#define __RADIUS_P_H

#include <netinet/in.h>
#include <pthread.h>
#include <stdarg.h>

#include "triton.h"
#include "radius.h"
#include "ppp.h"
#include "ipdb.h"

struct rad_server_t;

struct radius_pd_t
{
	struct list_head entry;
	struct ppp_pd_t pd;
	struct ppp_t *ppp;
	pthread_mutex_t lock;
	int authenticated:1;

	struct rad_req_t *auth_req;
	struct rad_req_t *acct_req;
	struct triton_timer_t acct_interim_timer;
	uint32_t acct_input_octets;
	uint32_t acct_output_octets;
	uint32_t acct_input_gigawords;
	uint32_t acct_output_gigawords;

	struct triton_timer_t session_timeout;

	struct rad_packet_t *dm_coa_req;
	struct sockaddr_in dm_coa_addr;

	struct ipdb_item_t ipaddr;
	int acct_interim_interval;
	time_t acct_timestamp;

	uint8_t *attr_class;
	int attr_class_len;
	uint8_t *attr_state;
	int attr_state_len;
	int termination_action;

	struct list_head plugin_list;
};

struct rad_req_t
{
	struct list_head entry;
	struct triton_context_t ctx;
	struct triton_md_handler_t hnd;
	struct triton_timer_t timeout;
	uint8_t RA[16];
	struct rad_packet_t *pack;
	struct rad_packet_t *reply;

	struct radius_pd_t *rpd;
	struct rad_server_t *serv;
	
	in_addr_t server_addr;
	int server_port;
};

struct rad_server_t
{
	struct list_head entry;
	in_addr_t auth_addr;
	int auth_port;
	char *auth_secret;
	in_addr_t acct_addr;
	int acct_port;
	char *acct_secret;
	int max_req_cnt;
	int req_cnt;
	struct list_head req_queue;
	int client_cnt;
	time_t fail_time;
	int conf_fail_time;
	pthread_mutex_t lock;
};


extern int conf_max_try;
extern int conf_timeout;
extern int conf_acct_timeout;
extern int conf_acct_delay_time;
extern int conf_verbose;
extern int conf_interim_verbose;
extern char *conf_nas_identifier;
extern in_addr_t conf_nas_ip_address;
extern in_addr_t conf_bind;
extern in_addr_t conf_gw_ip_address;
extern in_addr_t conf_auth_server;
extern char *conf_dm_coa_secret;
extern int conf_sid_in_auth;
extern int conf_require_nas_ident;
extern in_addr_t conf_dm_coa_server;
extern int conf_dm_coa_port;
extern int conf_acct_interim_interval;

extern unsigned long stat_auth_sent;
extern unsigned long stat_auth_lost;
extern unsigned long stat_acct_sent;
extern unsigned long stat_acct_lost;
extern unsigned long stat_interim_sent;
extern unsigned long stat_interim_lost;

int rad_check_nas_pack(struct rad_packet_t *pack);
struct radius_pd_t *rad_find_session(const char *sessionid, const char *username, int port_id, in_addr_t ipaddr, const char *csid);
struct radius_pd_t *rad_find_session_pack(struct rad_packet_t *pack);

int rad_dict_load(const char *fname);
void rad_dict_free(struct rad_dict_t *dict);

struct rad_req_t *rad_req_alloc(struct radius_pd_t *rpd, int code, const char *username);
int rad_req_acct_fill(struct rad_req_t *);
void rad_req_free(struct rad_req_t *);
int rad_req_send(struct rad_req_t *, int verbose);
int rad_req_wait(struct rad_req_t *, int);

struct radius_pd_t *find_pd(struct ppp_t *ppp);
int rad_proc_attrs(struct rad_req_t *req);

int rad_auth_pap(struct radius_pd_t *rpd, const char *username, va_list args);
int rad_auth_chap_md5(struct radius_pd_t *rpd, const char *username, va_list args);
int rad_auth_mschap_v1(struct radius_pd_t *rpd, const char *username, va_list args);
int rad_auth_mschap_v2(struct radius_pd_t *rpd, const char *username, va_list args);

int rad_acct_start(struct radius_pd_t *rpd);
void rad_acct_stop(struct radius_pd_t *rpd);

struct rad_packet_t *rad_packet_alloc(int code);
int rad_packet_build(struct rad_packet_t *pack, uint8_t *RA);
int rad_packet_recv(int fd, struct rad_packet_t **, struct sockaddr_in *addr);
void rad_packet_free(struct rad_packet_t *);
void rad_packet_print(struct rad_packet_t *pack, void (*print)(const char *fmt, ...));
int rad_packet_send(struct rad_packet_t *pck, int fd, struct sockaddr_in *addr);

void dm_coa_cancel(struct radius_pd_t *pd);

struct rad_server_t *rad_server_get();
void rad_server_put(struct rad_server_t *);
int rad_server_req_enter(struct rad_req_t *);
void rad_server_req_exit(struct rad_req_t *);
int rad_server_realloc(struct rad_req_t *, int);
void rad_server_fail(struct rad_server_t *);

struct stat_accm_t;
struct stat_accm_t *stat_accm_create(unsigned int time);
void stat_accm_add(struct stat_accm_t *, unsigned int);
unsigned long stat_accm_get_cnt(struct stat_accm_t *);
unsigned long stat_accm_get_avg(struct stat_accm_t *);

extern struct stat_accm_t *stat_auth_lost_1m;
extern struct stat_accm_t *stat_auth_lost_5m;
extern struct stat_accm_t *stat_auth_query_1m;
extern struct stat_accm_t *stat_auth_query_5m;

extern struct stat_accm_t *stat_acct_lost_1m;
extern struct stat_accm_t *stat_acct_lost_5m;
extern struct stat_accm_t *stat_acct_query_1m;
extern struct stat_accm_t *stat_acct_query_5m;

extern struct stat_accm_t *stat_interim_lost_1m;
extern struct stat_accm_t *stat_interim_lost_5m;
extern struct stat_accm_t *stat_interim_query_1m;
extern struct stat_accm_t *stat_interim_query_5m;
#endif