-
Notifications
You must be signed in to change notification settings - Fork 31
/
config.h
344 lines (280 loc) · 9.8 KB
/
config.h
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
332
333
334
335
336
337
338
339
340
341
342
343
344
/* $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.
*/
#ifndef _CONFIG_H_
#define _CONFIG_H_
/* definitions of tail-queue types */
TAILQ_HEAD(ia_conflist, ia_conf);
TAILQ_HEAD(pifc_list, prefix_ifconf);
struct dhcp6_poolspec {
char* name;
uint32_t pltime;
uint32_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;
uint32_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) */
/* XXX */
struct duid duid;
struct rawop_list rawops;
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
uint64_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 */
uint32_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)(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,
DHCP6S_EXIT};
struct prefix_ifconf {
TAILQ_ENTRY(prefix_ifconf) link;
char *ifname; /* interface name such as ne0 */
int sla_len; /* SLA ID length in bits */
uint32_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;
uint32_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 */
uint64_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,
IFPARAM_IFID, IFPARAM_IFID_RAND, IFPARAM_IFID_EUI64,
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,
DHCPOPT_RAW };
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 int use_all_config_if;
struct dhcp6_if *ifinit(char *);
int ifreset(struct dhcp6_if *);
int configure_interface(struct cf_namelist *);
int configure_host(struct cf_namelist *);
int configure_keys(struct cf_namelist *);
int configure_authinfo(struct cf_namelist *);
int configure_ia(struct cf_namelist *, iatype_t);
int configure_global_option(void);
void configure_cleanup(void);
void configure_commit(void);
int cfparse(const char *);
struct dhcp6_if *find_ifconfbyname(char *);
struct dhcp6_if *find_ifconfbyid(unsigned int);
struct prefix_ifconf *find_prefixifconf(char *);
struct host_conf *find_hostconf(struct duid *);
struct authinfo *find_authinfo(struct authinfo *, char *);
struct dhcp6_prefix *find_prefix6(struct dhcp6_list *,
struct dhcp6_prefix *);
struct ia_conf *find_iaconf(struct ia_conflist *, int, uint32_t);
struct keyinfo *find_key(char *, size_t, uint32_t);
int configure_pool(struct cf_namelist *);
struct pool_conf *find_pool(const char *);
int is_available_in_pool(struct pool_conf *, struct in6_addr *);
int get_free_address_from_pool(struct pool_conf *,
struct in6_addr *);
struct host_conf *create_dynamic_hostconf(struct duid *,
struct dhcp6_poolspec *);
char *qstrdup(char *);
#endif