summaryrefslogtreecommitdiffstats
path: root/config.h
blob: bf6dae60d41b573330ae1619bea614c6858bd63f (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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
/*	$KAME: config.h,v 1.39 2005/04/01 12:43:36 jinmei Exp $	*/

/*
 * Copyright (C) 2002 WIDE Project.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the project nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/* definitions of tail-queue types */
TAILQ_HEAD(ia_conflist, ia_conf);
TAILQ_HEAD(pifc_list, prefix_ifconf);

struct dhcp6_poolspec {
	char* name;
	u_int32_t pltime;
	u_int32_t vltime;
};

struct dhcp6_range {
	struct in6_addr min;
	struct in6_addr max;
};

struct pool_conf {
	struct pool_conf *next;

	char* name;

	struct in6_addr min;
	struct in6_addr max;
};

/* per-interface information */
struct dhcp6_if {
	struct dhcp6_if *next;

	/* timer for the interface */
	struct dhcp6_timer *timer;

	/* event queue */
	TAILQ_HEAD(, dhcp6_event) event_list;

	/* static parameters of the interface */
	char *ifname;
	unsigned int ifid;
	u_int32_t linkid;	/* to send link-local packets */
	/* multiple global address configuration is not supported now */
	struct in6_addr addr; 	/* global address */

	/* configuration parameters */
	u_long send_flags;
	u_long allow_flags;
#define DHCIFF_INFO_ONLY 0x1
#define DHCIFF_RAPID_COMMIT 0x2

	int server_pref;	/* server preference (server only) */
	struct dhcp6_poolspec pool;	/* address pool (server only) */
	char *scriptpath;	/* path to config script (client only) */

	struct dhcp6_list reqopt_list;
	struct ia_conflist iaconf_list;

	/* authentication information */
	int authproto;		/* protocol */
	/* the followings are valid only if authproto is not UNDEF */
	int authalgorithm;	/* algorithm */
	int authrdm;		/* replay attack detection method */
};

/* run-time authentication parameters */
struct authparam {
	int authproto;
	int authalgorithm;
	int authrdm;
	struct keyinfo *key;
	int flags;
#define AUTHPARAM_FLAGS_NOPREVRD	0x1

	u_int64_t prevrd;	/* previous RD value provided by the peer */
};

struct dhcp6_event {
	TAILQ_ENTRY(dhcp6_event) link;

	struct dhcp6_if *ifp;
	struct dhcp6_timer *timer;

	struct duid serverid;

	struct timeval tv_start; /* timestamp when the 1st msg is sent */

	/* internal timer parameters */
	long retrans;
	long init_retrans;
	long max_retrans_cnt;
	long max_retrans_time;
	long max_retrans_dur;
	int timeouts;		/* number of timeouts */

	u_int32_t xid;		/* current transaction ID */
	int state;

	/* list of known servers */
	struct dhcp6_serverinfo *current_server;
	struct dhcp6_serverinfo *servers;

	/* authentication parameters */
	struct authparam *authparam;

	TAILQ_HEAD(, dhcp6_eventdata) data_list;
};

typedef enum { DHCP6_EVDATA_IAPD, DHCP6_EVDATA_IANA } dhcp6_eventdata_t;

struct dhcp6_eventdata {
	TAILQ_ENTRY(dhcp6_eventdata) link;

	struct dhcp6_event *event;
	dhcp6_eventdata_t type;
	void *data;

	void (*destructor) __P((struct dhcp6_eventdata *));
	void *privdata;
};

struct dhcp6_serverinfo {
	struct dhcp6_serverinfo *next;

	/* option information provided in the advertisement */
	struct dhcp6_optinfo optinfo;

	int pref;		/* preference */
	int active;		/* bool; if this server is active or not */

	struct authparam *authparam; /* authentication parameters */

	/* TODO: remember available information from the server */
};

/* client status code */
enum {DHCP6S_INIT, DHCP6S_SOLICIT, DHCP6S_INFOREQ, DHCP6S_REQUEST,
      DHCP6S_RENEW, DHCP6S_REBIND, DHCP6S_RELEASE, DHCP6S_IDLE};

struct prefix_ifconf {
	TAILQ_ENTRY(prefix_ifconf) link;

	char *ifname;		/* interface name such as ne0 */
	int sla_len;		/* SLA ID length in bits */
	u_int32_t sla_id;	/* need more than 32bits? */
	int ifid_len;		/* interface ID length in bits */
	int ifid_type;		/* EUI-64 and manual (unused?) */
	char ifid[16];		/* Interface ID, up to 128bits */
};
#define IFID_LEN_DEFAULT 64
#define SLA_LEN_DEFAULT 16

typedef enum { IATYPE_PD, IATYPE_NA } iatype_t;
struct ia_conf {
	TAILQ_ENTRY(ia_conf) link;
	/*struct ia_conf *next;*/
	iatype_t type;
	u_int32_t iaid;

	TAILQ_HEAD(, ia) iadata; /* struct ia is an opaque type */

	/* type dependent values follow */
};

struct iapd_conf {
	struct ia_conf iapd_ia;

	/* type dependent values follow */
	struct dhcp6_list iapd_prefix_list;
	struct pifc_list iapd_pif_list;
};
#define iapd_next iapd_ia.next
#define iapd_type iapd_ia.type
#define iapd_id iapd_ia.iaid

struct iana_conf {
	struct ia_conf iana_ia;

	/* type dependent values follow */
	struct dhcp6_list iana_address_list;
};
#define iana_next iana_ia.next

/* per-host configuration */
struct host_conf {
	struct host_conf *next;

	char *name;		/* host name to identify the host */
	struct duid duid;	/* DUID for the host */

	/* prefixes to be delegated to the host */
	struct dhcp6_list prefix_list;
	/* address to be assigned for the host */
	struct dhcp6_list addr_list;
	/* address pool from which addresses are assigned for the host */
	struct dhcp6_poolspec pool;

	/* secret key shared with the client for delayed authentication */
	struct keyinfo *delayedkey;
	/* previous replay detection value from the client */
	int saw_previous_rd;	/* if we remember the previous value */
	u_int64_t previous_rd;
};

/* DHCPv6 authentication information */
struct authinfo {
	struct authinfo *next;

	char *name;		/* auth info name */

	int protocol;		/* authentication protocol */
	int algorithm;		/* authentication algorithm */
	int rdm;		/* random attack detection method */

	/* keys specific to this info? */
};

/* structures and definitions used in the config file parser */
struct cf_namelist {
	struct cf_namelist *next;
	char *name;
	int line;		/* the line number of the config file */
	struct cf_list *params;
};

struct cf_list {
	struct cf_list *next;
	struct cf_list *tail;
	int type;
	int line;		/* the line number of the config file */

	/* type dependent values: */
	long long num;
	struct cf_list *list;
	void *ptr;
};

enum { DECL_SEND, DECL_ALLOW, DECL_INFO_ONLY, DECL_REQUEST, DECL_DUID,
       DECL_PREFIX, DECL_PREFERENCE, DECL_SCRIPT, DECL_DELAYEDKEY,
       DECL_ADDRESS,
       DECL_RANGE, DECL_ADDRESSPOOL,
       IFPARAM_SLA_ID, IFPARAM_SLA_LEN,
       DHCPOPT_RAPID_COMMIT, DHCPOPT_AUTHINFO,
       DHCPOPT_DNS, DHCPOPT_DNSNAME,
       DHCPOPT_IA_PD, DHCPOPT_IA_NA, DHCPOPT_NTP,
       DHCPOPT_REFRESHTIME,
       DHCPOPT_NIS, DHCPOPT_NISNAME, 
       DHCPOPT_NISP, DHCPOPT_NISPNAME, 
       DHCPOPT_BCMCS, DHCPOPT_BCMCSNAME, 
       CFLISTENT_GENERIC,
       IACONF_PIF, IACONF_PREFIX, IACONF_ADDR,
       DHCPOPT_SIP, DHCPOPT_SIPNAME,
       AUTHPARAM_PROTO, AUTHPARAM_ALG, AUTHPARAM_RDM, AUTHPARAM_KEY,
       KEYPARAM_REALM, KEYPARAM_KEYID, KEYPARAM_SECRET, KEYPARAM_EXPIRE };

typedef enum {DHCP6_MODE_SERVER, DHCP6_MODE_CLIENT, DHCP6_MODE_RELAY }
dhcp6_mode_t;

extern const dhcp6_mode_t dhcp6_mode;

extern struct dhcp6_if *dhcp6_if;
extern struct dhcp6_ifconf *dhcp6_iflist;
extern struct prefix_ifconf *prefix_ifconflist;
extern struct dhcp6_list siplist;
extern struct dhcp6_list sipnamelist;
extern struct dhcp6_list dnslist;
extern struct dhcp6_list dnsnamelist;
extern struct dhcp6_list ntplist;
extern struct dhcp6_list nislist;
extern struct dhcp6_list nisnamelist;
extern struct dhcp6_list nisplist;
extern struct dhcp6_list nispnamelist;
extern struct dhcp6_list bcmcslist;
extern struct dhcp6_list bcmcsnamelist;
extern long long optrefreshtime;

extern struct dhcp6_if *ifinit __P((char *));
extern int ifreset __P((struct dhcp6_if *));
extern int configure_interface __P((struct cf_namelist *));
extern int configure_host __P((struct cf_namelist *));
extern int configure_keys __P((struct cf_namelist *));
extern int configure_authinfo __P((struct cf_namelist *));
extern int configure_ia __P((struct cf_namelist *, iatype_t));
extern int configure_global_option __P((void));
extern void configure_cleanup __P((void));
extern void configure_commit __P((void));
extern int cfparse __P((char *));
extern struct dhcp6_if *find_ifconfbyname __P((char *));
extern struct dhcp6_if *find_ifconfbyid __P((unsigned int));
extern struct prefix_ifconf *find_prefixifconf __P((char *));
extern struct host_conf *find_hostconf __P((struct duid *));
extern struct authinfo *find_authinfo __P((struct authinfo *, char *));
extern struct dhcp6_prefix *find_prefix6 __P((struct dhcp6_list *,
					      struct dhcp6_prefix *));
extern struct ia_conf *find_iaconf __P((struct ia_conflist *, int, u_int32_t));
extern struct keyinfo *find_key __P((char *, size_t, u_int32_t));
extern int configure_pool __P((struct cf_namelist *));
extern struct pool_conf *find_pool __P((const char *));
extern int is_available_in_pool __P((struct pool_conf *, struct in6_addr *));
extern int get_free_address_from_pool __P((struct pool_conf *,
	struct in6_addr *));
struct host_conf *create_dynamic_hostconf __P((struct duid *,
	struct dhcp6_poolspec *));
extern char *qstrdup __P((char *));