diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:43:02 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:43:02 +0000 |
commit | f2c49875c1ce6e1d3c51968f7b058b1b0c55428c (patch) | |
tree | 233b80410596436a63c870ab8e22e4e828867515 /config.h | |
parent | Initial commit. (diff) | |
download | wide-dhcpv6-f2c49875c1ce6e1d3c51968f7b058b1b0c55428c.tar.xz wide-dhcpv6-f2c49875c1ce6e1d3c51968f7b058b1b0c55428c.zip |
Adding upstream version 20080615.upstream/20080615upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'config.h')
-rw-r--r-- | config.h | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/config.h b/config.h new file mode 100644 index 0000000..bf6dae6 --- /dev/null +++ b/config.h @@ -0,0 +1,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 *)); |