362 lines
11 KiB
C
Executable File
362 lines
11 KiB
C
Executable File
/* $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 */
|
|
#if defined(TCSUPPORT_CT_DHCP6C_STATUS_CODE)
|
|
unsigned char handle_error_type;
|
|
#endif
|
|
|
|
};
|
|
|
|
/* 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_DSLITENAME,DHCPOPT_DSLITEADDRESS,
|
|
DHCPOPT_VENDOR_CLASS,DHCPOPT_VENDOR_OPTS,
|
|
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;
|
|
|
|
#if defined(TCSUPPORT_CT_WAN_CHILD_PREFIX)
|
|
#define IATYPE_NA_IA_ID 210
|
|
|
|
#define PREFIX_ORIGN_DFT 0
|
|
#define PREFIX_ORIGN_SLLA 1
|
|
#define PREFIX_ORIGN_DHCP 2
|
|
#define PREFIX_ORIGN_STATIC 3
|
|
#define PREFIX_ORIGN_NONE 4
|
|
|
|
#ifndef O_RDONLY
|
|
#define O_RDONLY 00000000
|
|
#endif
|
|
#ifndef O_WRONLY
|
|
#define O_WRONLY 00000001
|
|
#endif
|
|
#define INET6_S16_ADDR_BYTES 8
|
|
#define MAX_PD_PREFIX 64
|
|
#endif
|
|
#if defined(TCSUPPORT_CT_DHCP6C_STATUS_CODE)
|
|
#define ENABLE_DHCP6C_ERROR_HANDLE 1
|
|
#define DISABLE_DHCP6C_ERROR_HANDLE 0
|
|
#define DHCP6C_HANDLE_STATUS_CODE_PATH "/etc/dhcp6c_handle_err.conf"
|
|
#endif
|
|
|
|
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 *));
|