Navigation


source: freeDiameter/freeDiameter/config.c @ 20:277ec00d793e

Last change on this file since 20:277ec00d793e was 20:277ec00d793e, checked in by Sebastien Decugis <sdecugis@nict.go.jp>, 12 years ago

Backup before typhoon... Progress on server side

File size: 10.2 KB
Line 
1/*********************************************************************************************************
2* Software License Agreement (BSD License)                                                               *
3* Author: Sebastien Decugis <sdecugis@nict.go.jp>                                                        *
4*                                                                                                        *
5* Copyright (c) 2009, 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#include "fD.h"
37
38/* Configuration management */
39
40#ifndef GNUTLS_DEFAULT_PRIORITY
41# define GNUTLS_DEFAULT_PRIORITY "NORMAL"
42#endif /* GNUTLS_DEFAULT_PRIORITY */
43#ifndef GNUTLS_DEFAULT_DHBITS
44# define GNUTLS_DEFAULT_DHBITS 1024
45#endif /* GNUTLS_DEFAULT_DHBITS */
46
47/* Initialize the fd_g_config structure to default values */
48int fd_conf_init()
49{
50        TRACE_ENTRY();
51       
52        fd_g_config->cnf_eyec = EYEC_CONFIG;
53        fd_g_config->cnf_file = DEFAULT_CONF_FILE;
54       
55        fd_g_config->cnf_timer_tc = 30;
56        fd_g_config->cnf_timer_tw = 30;
57       
58        fd_g_config->cnf_port     = 3868;
59        fd_g_config->cnf_port_tls = 3869;
60        fd_g_config->cnf_sctp_str = 30;
61        fd_list_init(&fd_g_config->cnf_endpoints, NULL);
62        fd_list_init(&fd_g_config->cnf_apps, NULL);
63        #ifdef DISABLE_SCTP
64        fd_g_config->cnf_flags.no_sctp = 1;
65        #endif /* DISABLE_SCTP */
66       
67        fd_g_config->cnf_orstateid = (uint32_t) time(NULL);
68       
69        CHECK_FCT( fd_dict_init(&fd_g_config->cnf_dict) );
70        CHECK_FCT( fd_fifo_new(&fd_g_config->cnf_main_ev) );
71       
72        /* TLS parameters */
73        CHECK_GNUTLS_DO( gnutls_certificate_allocate_credentials (&fd_g_config->cnf_sec_data.credentials), return ENOMEM );
74        CHECK_GNUTLS_DO( gnutls_dh_params_init (&fd_g_config->cnf_sec_data.dh_cache), return ENOMEM );
75
76        return 0;
77}
78
79void fd_conf_dump()
80{
81        if (!TRACE_BOOL(INFO))
82                return;
83       
84        fd_log_debug("-- Configuration :\n");
85        fd_log_debug("  Debug trace level ...... : %+d\n", fd_g_debug_lvl);
86        fd_log_debug("  Configuration file ..... : %s\n", fd_g_config->cnf_file);
87        fd_log_debug("  Diameter Identity ...... : %s (l:%Zi)\n", fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len);
88        fd_log_debug("  Diameter Realm ......... : %s (l:%Zi)\n", fd_g_config->cnf_diamrlm, fd_g_config->cnf_diamrlm_len);
89        fd_log_debug("  Tc Timer ............... : %u\n", fd_g_config->cnf_timer_tc);
90        fd_log_debug("  Tw Timer ............... : %u\n", fd_g_config->cnf_timer_tw);
91        fd_log_debug("  Local port ............. : %hu\n", fd_g_config->cnf_port);
92        fd_log_debug("  Local secure port ...... : %hu\n", fd_g_config->cnf_port_tls);
93        fd_log_debug("  Number of SCTP streams . : %hu\n", fd_g_config->cnf_sctp_str);
94        if (FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints)) {
95                fd_log_debug("  Local endpoints ........ : Default (use all available)\n");
96        } else {
97                struct fd_list * li = fd_g_config->cnf_endpoints.next;
98                fd_log_debug("  Local endpoints ........ : ");
99                while (li != &fd_g_config->cnf_endpoints) {
100                        struct fd_endpoint * ep = (struct fd_endpoint *)li;
101                        if (li != fd_g_config->cnf_endpoints.next) fd_log_debug("                             ");
102                        sSA_DUMP_NODE( &ep->ss, NI_NUMERICHOST );
103                        fd_log_debug("\n");
104                        li = li->next;
105                }
106        }
107        if (FD_IS_LIST_EMPTY(&fd_g_config->cnf_apps)) {
108                fd_log_debug("  Local applications ..... : (none)\n");
109        } else {
110                struct fd_list * li = fd_g_config->cnf_apps.next;
111                fd_log_debug("  Local applications ..... : ");
112                while (li != &fd_g_config->cnf_apps) {
113                        struct fd_app * app = (struct fd_app *)li;
114                        if (li != fd_g_config->cnf_apps.next) fd_log_debug("                             ");
115                        fd_log_debug("App: %u\t%s%s%s\tVnd: %u\n", 
116                                        app->appid,
117                                        app->flags.auth ? "Au" : "--",
118                                        app->flags.acct ? "Ac" : "--",
119                                        app->flags.common ? "C" : "-",
120                                        app->vndid);
121                        li = li->next;
122                }
123        }
124       
125        fd_log_debug("  Flags : - IP ........... : %s\n", fd_g_config->cnf_flags.no_ip4 ? "DISABLED" : "Enabled");
126        fd_log_debug("          - IPv6 ......... : %s\n", fd_g_config->cnf_flags.no_ip6 ? "DISABLED" : "Enabled");
127        fd_log_debug("          - Relay app .... : %s\n", fd_g_config->cnf_flags.no_fwd ? "DISABLED" : "Enabled");
128        fd_log_debug("          - TCP .......... : %s\n", fd_g_config->cnf_flags.no_tcp ? "DISABLED" : "Enabled");
129        #ifdef DISABLE_SCTP
130        fd_log_debug("          - SCTP ......... : DISABLED (at compilation)\n");
131        #else /* DISABLE_SCTP */
132        fd_log_debug("          - SCTP ......... : %s\n", fd_g_config->cnf_flags.no_sctp ? "DISABLED" : "Enabled");
133        #endif /* DISABLE_SCTP */
134        fd_log_debug("          - Pref. proto .. : %s\n", fd_g_config->cnf_flags.pr_tcp ? "TCP" : "SCTP");
135        fd_log_debug("          - TLS method ... : %s\n", fd_g_config->cnf_flags.tls_alg ? "INBAND" : "Separate port");
136       
137        fd_log_debug("  TLS :   - Certificate .. : %s\n", fd_g_config->cnf_sec_data.cert_file ?: "(NONE)");
138        fd_log_debug("          - Private key .. : %s\n", fd_g_config->cnf_sec_data.key_file ?: "(NONE)");
139        fd_log_debug("          - CA (trust) ... : %s\n", fd_g_config->cnf_sec_data.ca_file ?: "(none)");
140        fd_log_debug("          - CRL .......... : %s\n", fd_g_config->cnf_sec_data.crl_file ?: "(none)");
141        fd_log_debug("          - Priority ..... : %s\n", fd_g_config->cnf_sec_data.prio_string ?: "(default: '" GNUTLS_DEFAULT_PRIORITY "')");
142        fd_log_debug("          - DH bits ...... : %d\n", fd_g_config->cnf_sec_data.dh_bits ?: GNUTLS_DEFAULT_DHBITS);
143       
144        fd_log_debug("  Origin-State-Id ........ : %u\n", fd_g_config->cnf_orstateid);
145}
146
147/* Parse the configuration file (using the yacc parser) */
148int fd_conf_parse()
149{
150        extern FILE * fddin;
151       
152        TRACE_DEBUG (FULL, "Parsing configuration file: %s", fd_g_config->cnf_file);
153       
154        fddin = fopen(fd_g_config->cnf_file, "r");
155        if (fddin == NULL) {
156                int ret = errno;
157                fprintf(stderr, "Unable to open configuration file %s for reading: %s\n", fd_g_config->cnf_file, strerror(ret));
158                return ret;
159        }
160       
161        /* call yacc parser */
162        CHECK_FCT(  fddparse(fd_g_config)  );
163       
164        /* close the file */
165        fclose(fddin);
166       
167        /* Check that TLS private key was given */
168        if (! fd_g_config->cnf_sec_data.key_file) {
169                fprintf(stderr, "Missing private key configuration for TLS. Please provide the TLS_cred configuration directive.\n");
170                return EINVAL;
171        }
172       
173        /* Resolve hostname if not provided */
174        if (fd_g_config->cnf_diamid == NULL) {
175#ifndef HOST_NAME_MAX
176#define HOST_NAME_MAX 1024
177#endif /* HOST_NAME_MAX */
178                char buf[HOST_NAME_MAX + 1];
179                struct addrinfo hints, *info;
180                int ret;
181               
182                /* local host name */
183                CHECK_SYS(gethostname(buf, sizeof(buf)));
184               
185                /* get FQDN */
186                memset(&hints, 0, sizeof hints);
187                hints.ai_flags = AI_CANONNAME;
188
189                ret = getaddrinfo(buf, NULL, &hints, &info);
190                if (ret != 0) {
191                        fprintf(stderr, "Error resolving local FQDN :\n"
192                                        " '%s' : %s\n"
193                                        "Please provide LocalIdentity in configuration file.\n",
194                                        buf, gai_strerror(ret));
195                        return EINVAL;
196                }
197                CHECK_MALLOC( fd_g_config->cnf_diamid = strdup(info->ai_canonname) );
198                freeaddrinfo(info);
199        }
200       
201        /* cache the length of the diameter id for the session module */
202        fd_g_config->cnf_diamid_len = strlen(fd_g_config->cnf_diamid);
203       
204        /* Handle the realm part */
205        if (fd_g_config->cnf_diamrlm == NULL) {
206                char * start = NULL;
207               
208                /* Check the diameter identity is a fqdn */
209                start = strchr(fd_g_config->cnf_diamid, '.');
210                if ((start == NULL) || (start[1] == '\0')) {
211                        fprintf(stderr, "Unable to extract realm from the LocalIdentity '%s'.\n"
212                                        "Please fix your LocalIdentity setting or provide LocalRealm.\n",
213                                        fd_g_config->cnf_diamid);
214                        return EINVAL;
215                }               
216               
217                CHECK_MALLOC( fd_g_config->cnf_diamrlm = strdup( start + 1 )  ); 
218        }
219        fd_g_config->cnf_diamrlm_len = strlen(fd_g_config->cnf_diamrlm);
220       
221        /* Validate some flags */
222        if (fd_g_config->cnf_flags.no_ip4 && fd_g_config->cnf_flags.no_ip6) {
223                fprintf(stderr, "IP and IPv6 cannot be disabled at the same time.\n");
224                return EINVAL;
225        }
226        if (fd_g_config->cnf_flags.no_tcp && fd_g_config->cnf_flags.no_sctp) {
227                fprintf(stderr, "TCP and SCTP cannot be disabled at the same time.\n");
228                return EINVAL;
229        }
230       
231        /* Configure TLS default parameters */
232        if (! fd_g_config->cnf_sec_data.prio_string) {
233                const char * err_pos = NULL;
234                CHECK_GNUTLS_DO( gnutls_priority_init( 
235                                        &fd_g_config->cnf_sec_data.prio_cache,
236                                        GNUTLS_DEFAULT_PRIORITY,
237                                        &err_pos),
238                                 { TRACE_DEBUG(INFO, "Error in priority string at position : %s", err_pos); return EINVAL; } );
239        }
240        if (! fd_g_config->cnf_sec_data.dh_bits) {
241                TRACE_DEBUG(FULL, "Generating DH parameters...");
242                CHECK_GNUTLS_DO( gnutls_dh_params_generate2( 
243                                        fd_g_config->cnf_sec_data.dh_cache,
244                                        GNUTLS_DEFAULT_DHBITS),
245                                 { TRACE_DEBUG(INFO, "Error in DH bits value : %d", GNUTLS_DEFAULT_DHBITS); return EINVAL; } );
246                TRACE_DEBUG(FULL, "DH parameters generated.");
247        }
248       
249       
250        return 0;
251}
Note: See TracBrowser for help on using the repository browser.