blob: b6c0911a7984c51576b3ad9a6b192737226282b8 [file] [log] [blame]
Brian Waters13d96012017-12-08 16:53:31 -06001/*********************************************************************************************************
2* Software License Agreement (BSD License) *
3* Author: Sebastien Decugis <sdecugis@freediameter.net> *
4* *
5* Copyright (c) 2013, WIDE Project and NICT *
6* All rights reserved. *
7* *
8* Redistribution and use of this software in source and binary forms, with or without modification, are *
9* permitted provided that the following conditions are met: *
10* *
11* * Redistributions of source code must retain the above *
12* copyright notice, this list of conditions and the *
13* following disclaimer. *
14* *
15* * Redistributions in binary form must reproduce the above *
16* copyright notice, this list of conditions and the *
17* following disclaimer in the documentation and/or other *
18* materials provided with the distribution. *
19* *
20* * Neither the name of the WIDE Project or NICT nor the *
21* names of its contributors may be used to endorse or *
22* promote products derived from this software without *
23* specific prior written permission of WIDE Project and *
24* NICT. *
25* *
26* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
27* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
28* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
29* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
30* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
31* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
32* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
33* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
34*********************************************************************************************************/
35
36/* This file contains the definitions for the app_radgw internal use. */
37
38#ifndef _RGW_H
39#define _RGW_H
40
41/* include the common definitions */
42#include "rgw_common.h"
43
44/* RADIUS messages + metadata */
45struct rgw_radius_msg_meta {
46
47 /* The RADIUS message */
48 struct radius_msg radius;
49
50 /* Metadata */
51 struct {
52 /* The port it was sent from, in network byte order */
53 unsigned port :16;
54
55 /* received on ACCT or AUTH port? */
56 unsigned serv_type :2;
57
58 /* The message has a valid Message-Authenticator attribute */
59 unsigned valid_mac :1;
60 };
61
62 /* For Proxy-State attributes: */
63 int ps_first; /* The index of the first Proxy-State attribute in radius.attr_pos. It is always >= radius.attr_used */
64 int ps_nb; /* The number of Proxy-State attributes. The real radius.attr_pos size is attr_used + ps_nb */
65};
66void rgw_msg_free(struct rgw_radius_msg_meta ** msg);
67int rgw_msg_parse(unsigned char * buf, size_t len, struct rgw_radius_msg_meta ** msg);
68void rgw_msg_dump(struct rgw_radius_msg_meta * msg, int has_meta);
69
70/* Local RADIUS server(s) configuration */
71struct rgw_serv {
72 unsigned disabled :1;
73 unsigned ip_disabled :1;
74 unsigned ip6_disabled :1;
75 unsigned :13; /* padding */
76
77 uint16_t port; /* stored in network byte order */
78
79 struct in_addr ip_endpoint;
80 struct in6_addr ip6_endpoint;
81};
82
83extern struct rgw_servs {
84 struct rgw_serv auth_serv;
85 struct rgw_serv acct_serv;
86} rgw_servers;
87
88int rgw_servers_init(void);
89int rgw_servers_start(void);
90void rgw_servers_dump(void);
91int rgw_servers_send(int type, unsigned char *buf, size_t buflen, struct sockaddr *to, uint16_t to_port);
92void rgw_servers_fini(void);
93
94
95/* Clients management */
96enum rgw_cli_type { RGW_CLI_NAS, RGW_CLI_PXY };
97int rgw_clients_auth_check(struct rgw_radius_msg_meta * msg, struct rgw_client * cli, uint8_t * req_auth);
98int rgw_clients_add( struct sockaddr * ip_port, unsigned char ** key, size_t keylen, enum rgw_cli_type type );
99int rgw_clients_getkey(struct rgw_client * cli, unsigned char **key, size_t *key_len);
100int rgw_clients_gettype(struct rgw_client * cli, enum rgw_cli_type *type);
101int rgw_clients_search(struct sockaddr * ip_port, struct rgw_client ** ref);
102int rgw_clients_check_dup(struct rgw_radius_msg_meta **msg, struct rgw_client *cli);
103int rgw_clients_create_origin(struct rgw_radius_msg_meta *msg, struct rgw_client * cli, struct msg ** diam);
104int rgw_client_finish_send(struct radius_msg ** msg, struct rgw_radius_msg_meta * req, struct rgw_client * cli);
105int rgw_client_finish_nosend(struct rgw_radius_msg_meta * req, struct rgw_client * cli);
106void rgw_clients_dispose(struct rgw_client ** ref);
107void rgw_clients_dump(void);
108int rgw_clients_init(void);
109void rgw_clients_fini(void);
110int rgw_client_session_add(struct rgw_client * cli, struct session *sess, char * dest_realm, char * dest_host, application_id_t appid);
111int rgw_client_session_stop(struct rgw_client * cli, struct session * sess, int32_t reason);
112
113
114/* Management of plugins */
115int rgw_plg_add( char * plgfile, char * conffile, int port, unsigned char ** codes_array, size_t codes_sz );
116void rgw_plg_dump(void);
117void rgw_plg_start_cache(void);
118int rgw_plg_loop_req(struct rgw_radius_msg_meta **rad, struct msg **diam_msg, struct rgw_client * cli);
119int rgw_plg_loop_ans(struct rgw_radius_msg_meta *req, struct msg **diam_ans, struct radius_msg ** rad_ans, struct rgw_client * cli);
120void rgw_plg_fini(void);
121
122
123/* Parse configuration file */
124int rgw_conf_handle(char * conffile);
125
126
127/* Worker module, process incoming RADIUS messages (in separated threads) */
128int rgw_work_start(void);
129int rgw_work_add(struct rgw_radius_msg_meta * msg, struct rgw_client * client);
130void rgw_work_fini(void);
131
132
133#endif /* _RGW_H */
134