414 lines
15 KiB
C
414 lines
15 KiB
C
/*
|
|
******************************************************************************
|
|
* INTERPEAK API HEADER FILE
|
|
*
|
|
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipdhcps6_option.h,v $ $Revision: 1.18.42.1 $
|
|
* $Source: /home/interpeak/CVSRoot/ipdhcps6/include/ipdhcps6_option.h,v $
|
|
* $Author: ulf $ $Date: 2011-11-16 10:33:28 $
|
|
* $State: Exp $ $Locker: $
|
|
*
|
|
* INTERPEAK_COPYRIGHT_STRING
|
|
* Design and implementation by Kenneth Jonsson <kenneth@interpeak.se>
|
|
******************************************************************************
|
|
*/
|
|
#ifndef IPDHCPS6_OPTION_H
|
|
#define IPDHCPS6_OPTION_H
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 1 DESCRIPTION
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 2 CONFIGURATION
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include "ipdhcps6_config.h"
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 3 INCLUDE FILES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include <ipcom_cstyle.h>
|
|
#include <ipcom_hash.h>
|
|
#include <ipcom_sock6.h>
|
|
#include <ipcom_type.h>
|
|
|
|
#include "ipdhcps6_duid.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 4 DEFINES
|
|
****************************************************************************
|
|
*/
|
|
|
|
/* DHCP Options */
|
|
#define IPDHCPS6_OPTION_CLIENTID 1
|
|
#define IPDHCPS6_OPTION_SERVERID 2
|
|
#define IPDHCPS6_OPTION_IA_NA 3
|
|
#define IPDHCPS6_OPTION_IA_TA 4
|
|
#define IPDHCPS6_OPTION_IAADDR 5
|
|
#define IPDHCPS6_OPTION_ORO 6
|
|
#define IPDHCPS6_OPTION_PREFERENCE 7
|
|
#define IPDHCPS6_OPTION_ELAPSED_TIME 8
|
|
#define IPDHCPS6_OPTION_RELAY_MSG 9
|
|
#define IPDHCPS6_OPTION_AUTH 11
|
|
#define IPDHCPS6_OPTION_UNICAST 12
|
|
#define IPDHCPS6_OPTION_STATUS_CODE 13
|
|
#define IPDHCPS6_OPTION_RAPID_COMMIT 14
|
|
#define IPDHCPS6_OPTION_USER_CLASS 15
|
|
#define IPDHCPS6_OPTION_VENDOR_CLASS 16
|
|
#define IPDHCPS6_OPTION_VENDOR_OPTS 17
|
|
#define IPDHCPS6_OPTION_INTERFACE_ID 18
|
|
#define IPDHCPS6_OPTION_RECONF_MSG 19
|
|
#define IPDHCPS6_OPTION_RECONF_ACCEPT 20
|
|
#define IPDHCPS6_OPTION_SIP_SERVER_D 21
|
|
#define IPDHCPS6_OPTION_SIP_SERVER_A 22
|
|
#define IPDHCPS6_OPTION_DNS_SERVERS 23
|
|
#define IPDHCPS6_OPTION_DOMAIN_LIST 24
|
|
#define IPDHCPS6_OPTION_IA_PD 25
|
|
#define IPDHCPS6_OPTION_IAPREFIX 26
|
|
|
|
#define IPDHCPS6_OPTION_SNTP_SERVERS 31
|
|
#define IPDHCPS6_OPTION_INFORMATION_REFRESH_TIME 32
|
|
#define IPDHCPS6_OPTION_FQDN 39
|
|
|
|
/* local options, ONLY used for configuration */
|
|
#define IPDHCPS6_OPTION_CONF_BASE 0xf000
|
|
#define IPDHCPS6_OPTION_CONF_RENEW_TIME (IPDHCPS6_OPTION_CONF_BASE)
|
|
#define IPDHCPS6_OPTION_CONF_REBIND_TIME (IPDHCPS6_OPTION_CONF_BASE + 1)
|
|
|
|
#define IPDHCPS6_OPTION_HDR_LEN 4
|
|
|
|
/** OBSOLETE: DEAD DRAFTS; MAINTAINED FOR BACKWARDS COMPATIBILITY FOR NOW
|
|
* WILL BE REMOVED EVENTUALLY */
|
|
|
|
#define IPDHCPS6_OPTION_TIME_ZONE 60003 /* OLD VALUE: 28 */
|
|
#define IPDHCPS6_OPTION_NTP_SERVERS 60004 /* OLD VALUE: 33 */
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 5 TYPES
|
|
****************************************************************************
|
|
*/
|
|
|
|
struct Ipdhcps6_authtrans_dbentry;
|
|
struct Ipdhcps6_message_struct;
|
|
|
|
/* start-of packed structures */
|
|
#include "ipcom_align16.h"
|
|
/* Forward declarations */
|
|
struct Ipdhcps6_prefix_struct;
|
|
|
|
IP_PACKED1 struct Ipdhcps6_option_status_code_data
|
|
{
|
|
/* The numeric code for the status encoded in this option
|
|
(IPDHCPS6_CODE_xxx). */
|
|
Ip_u16 code;
|
|
/* A UTF-8 encoded text string suitable for
|
|
display to an end user, which MUST NOT be null-terminated. */
|
|
char message[1];
|
|
} IP_PACKED2;
|
|
|
|
typedef IP_PACKED1 struct Ipdhcps6_option_ia_xx_struct
|
|
{
|
|
/* Must be IPDHCPS6_OPTION_IA_XX */
|
|
Ip_u16 code;
|
|
/* len is 12 + options */
|
|
Ip_u16 len;
|
|
/* The unique identifier for this IA_XX */
|
|
Ip_u32 iaid;
|
|
/* The time (in seconds) at which the client contacts the
|
|
server from which the addresses in the IA_XX
|
|
were obtained to extend the lifetimes of the
|
|
addresses assigned to the IA_XX */
|
|
Ip_u32 t1;
|
|
/* The time (in seconds) at which the client contacts any
|
|
available server to extend the lifetimes of
|
|
the addresses assigned to the IA_XX */
|
|
Ip_u32 t2;
|
|
/* Options associated with this IA_XX */
|
|
Ip_u8 options[1];
|
|
}
|
|
IP_PACKED2 Ipdhcps6_option_ia_xx;
|
|
|
|
typedef IP_PACKED1 struct Ipdhcps6_option_iaaddr_struct
|
|
{
|
|
/* Must be IPDHCPS6_OPTION_IAADDR */
|
|
Ip_u16 code;
|
|
/* len is 24 + options */
|
|
Ip_u16 len;
|
|
/* An IPv6 address */
|
|
struct Ip_in6_addr ipv6_address;
|
|
/* The preferred lifetime for the IPv6 address in
|
|
the option, expressed in units of seconds. */
|
|
Ip_u32 preferred_lifetime;
|
|
/* The valid lifetime for the IPv6 address in the
|
|
option, expressed in units of seconds. */
|
|
Ip_u32 valid_lifetime;
|
|
/* IAaddr-options Options associated with this address. */
|
|
Ip_u8 options[1];
|
|
}
|
|
IP_PACKED2 Ipdhcps6_option_iaaddr;
|
|
|
|
|
|
/* Prefix deligation options (draft-ietf-dhc-dhcpv6-opt-prefix-delegation-05.txt) */
|
|
|
|
/* Prefix option */
|
|
typedef IP_PACKED1 struct Ipdhcps6_option_iaprefix_struct
|
|
{
|
|
/* Must be IPDHCPS6_OPTION_IAPREFIX */
|
|
Ip_u16 code;
|
|
/* len is 25 + length of IAprefix-options field */
|
|
Ip_u16 len;
|
|
/* The recommended preferred lifetime for the IPv6
|
|
prefix in the option, expressed in units of
|
|
seconds. A value of 0xFFFFFFFF represents
|
|
infinity.*/
|
|
Ip_u32 preferred_lifetime;
|
|
/* The valid lifetime for the IPv6 prefix in the
|
|
option, expressed in units of seconds. A value of
|
|
0xFFFFFFFF represents infinity. */
|
|
Ip_u32 valid_lifetime;
|
|
/* 1 byte prefix len and 16 byte prefix */
|
|
Ip_u8 prefix_buf[1 + sizeof(struct Ip_in6_addr) + IPDHCPS6_OPTION_HDR_LEN];
|
|
}
|
|
IP_PACKED2 Ipdhcps6_option_iaprefix;
|
|
|
|
#define IPDHCPS6_OPTION_IAPREFIX_SET_LEN(opt, len) \
|
|
((opt)->prefix_buf[0] = len)
|
|
|
|
#define IPDHCPS6_OPTION_IAPREFIX_GET_LEN(opt) \
|
|
((opt)->prefix_buf[0])
|
|
|
|
#define IPDHCPS6_OPTION_IAPREFIX_GET_PREFIX_PTR(opt) \
|
|
((struct Ip_in6_addr *) &(opt)->prefix_buf[1])
|
|
|
|
#define IPDHCPS6_OPTION_IAPREFIX_GET_OPTIONS_PTR(opt) \
|
|
((Ipdhcps6_option *) &(opt)->prefix_buf[1 + sizeof(struct Ip_in6_addr)])
|
|
|
|
/* Prefix deligation data */
|
|
IP_PACKED1 struct Ipdhcps6_option_prefix_delegation_data
|
|
{
|
|
/* The unique identifier for this IA_PD; the IAID must
|
|
be unique among the identifiers for all of this
|
|
requesting router's IA_PDs. */
|
|
Ip_u8 iaid[4];
|
|
/* The time at which the requesting router contacts
|
|
the delegating router from which the prefixes in
|
|
the IA_PD were obtained to extend the lifetimes of
|
|
the prefixes delegated to the IA_PD; T1 is a time
|
|
duration relative to the current time expressed in
|
|
units of seconds. */
|
|
Ip_u32 t1;
|
|
/* The time at which the requesting router contacts
|
|
any available delegating router to extend the
|
|
lifetimes of the prefixes assigned to the IA_PD; T2
|
|
is a time duration relative to the current time
|
|
expressed in units of seconds. */
|
|
Ip_u32 t2;
|
|
/* Options associated with this IA_PD */
|
|
Ipdhcps6_option_iaprefix options[1];
|
|
} IP_PACKED2;
|
|
|
|
|
|
union Ipdhcps6_option_data
|
|
{
|
|
Ip_u8 generic[1];
|
|
/* IPDHCPS6_OPTION_CLIENTID */
|
|
union Ipdhcps6_duid_data clientid;
|
|
/* IPDHCPS6_OPTION_SERVERID */
|
|
union Ipdhcps6_duid_data serverid;
|
|
/* IPDHCPS6_OPTION_ORO (one or more options) */
|
|
Ip_u16 request_oro[1];
|
|
/* IPDHCPS6_OPTION_STATUS_CODE */
|
|
struct Ipdhcps6_option_status_code_data status_code;
|
|
/* IPDHCPS6_OPTION_DNS_SERVERS (one or more IPv6 addresses) */
|
|
struct Ip_in6_addr dns_servers[1];
|
|
/* IPDHCPS6_OPTION_IA_PD */
|
|
struct Ipdhcps6_option_prefix_delegation_data ia_pd;
|
|
/* IPDHCPS6_OPTION_RECONF_MSG */
|
|
Ip_u8 reconf_msg_type;
|
|
/* IPDHCPS6_OPTION_TIME_ZONE */
|
|
char time_zone[1];
|
|
};
|
|
|
|
/*
|
|
The format of DHCP options is:
|
|
|
|
0 1 2 3
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
| option-code | option-len |
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
| option-data |
|
|
| (option-len octets) |
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
|
|
option-code An unsigned integer identifying the specific option
|
|
type carried in this option.
|
|
|
|
option-len An unsigned integer giving the length of the
|
|
option-data field in this option in octets.
|
|
|
|
option-data The data for the option; the format of this data
|
|
depends on the definition of the option.
|
|
*/
|
|
typedef struct Ipdhcps6_option_struct
|
|
{
|
|
Ip_u16 code;
|
|
Ip_u16 len;
|
|
union Ipdhcps6_option_data data;
|
|
}
|
|
Ipdhcps6_option;
|
|
|
|
/* end-of packed structures */
|
|
#include "ipcom_align16.h"
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 6 FUNCTIONS
|
|
****************************************************************************
|
|
*/
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_check(Ipdhcps6_option *options, Ip_u16 optlen);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_exist(Ipdhcps6_option *opts, Ip_u16 optslen,
|
|
Ip_u16 code);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_get(Ipdhcps6_option *opts, Ip_u16 optslen,
|
|
Ip_u16 code,
|
|
Ipdhcps6_option *opt, Ip_u16 optlen, Ip_u16 *bytes_written);
|
|
|
|
IP_GLOBAL Ipdhcps6_option *
|
|
ipdhcps6_option_get_ptr(Ipdhcps6_option *opts, Ip_u16 optslen,
|
|
Ip_u16 code);
|
|
|
|
IP_GLOBAL Ipdhcps6_option *
|
|
ipdhcps6_option_next(Ipdhcps6_option *options, Ip_u16 *optlen);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_merge(Ipcom_hash *result_opts, Ipcom_hash *opts);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_add_server_id(Ipdhcps6_option *opt, Ip_u16 optlen, Ip_u16 *bytes_written);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_add_status_code(Ipdhcps6_option *opt, Ip_u16 optlen, Ip_u16 *bytes_written,
|
|
Ip_u16 code, const char *message);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_add_auth (struct Ipdhcps6_authtrans_dbentry *db,
|
|
Ip_u8 *authKey,
|
|
Ip_size_t authKeyLen,
|
|
Ip_u8 *authrealm,
|
|
Ip_size_t authrealm_len,
|
|
struct Ipdhcps6_message_struct *msg,
|
|
Ipdhcps6_option *opt,
|
|
Ip_u16 optlen,
|
|
Ip_u16 *bytes_written);
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_verify_auth_option (struct Ipdhcps6_authtrans_dbentry *db,
|
|
Ip_u8 *authKey,
|
|
Ip_size_t authKeyLen,
|
|
Ip_u8 *authrealm,
|
|
Ip_size_t authrealm_len,
|
|
struct Ipdhcps6_message_struct *msg,
|
|
Ipdhcps6_option *opt,
|
|
Ip_u16 optlen);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_add_iaprefix(Ipdhcps6_option_iaprefix *opt, Ip_u16 optlen, Ip_u16 *bytes_written,
|
|
struct Ipdhcps6_prefix_struct *prefix);
|
|
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_add_relay_message(Ipdhcps6_option *dhcp_relay_opt,
|
|
Ip_u16 optlen,
|
|
Ip_u16 *bytes_written,
|
|
void *relayed_msg,
|
|
Ip_u16 relayed_msg_len);
|
|
IP_GLOBAL Ip_err
|
|
ipdhcps6_option_add_interface_id(Ipdhcps6_option *opt,
|
|
Ip_u16 optlen,
|
|
Ip_u16 *bytes_written,
|
|
Ip_u32 interface_id);
|
|
|
|
IP_GLOBAL Ipcom_hash *
|
|
ipdhcps6_option_new_db(void);
|
|
|
|
IP_GLOBAL void
|
|
ipdhcps6_option_delete_db(Ipcom_hash *options);
|
|
|
|
IP_GLOBAL Ipdhcps6_option_ia_xx *
|
|
ipdhcps6_option_add_ia_xx_start(Ipdhcps6_option *opt,
|
|
Ip_u16 code,
|
|
Ip_u16 opt_buf_len,
|
|
Ip_u16 *bytes_written);
|
|
|
|
IP_GLOBAL void
|
|
ipdhcps6_option_add_ia_xx_finish(Ipdhcps6_option_ia_xx *ia_na,
|
|
Ip_u16 opt_buf_len,
|
|
Ip_u32 iaid,
|
|
Ip_u32 t1,
|
|
Ip_u32 t2);
|
|
|
|
IP_GLOBAL Ipdhcps6_option_iaaddr *
|
|
ipdhcps6_option_add_iaaddr_start(Ipdhcps6_option *opt,
|
|
Ip_u16 opt_buf_len,
|
|
Ip_u16 *bytes_written);
|
|
|
|
IP_GLOBAL void
|
|
ipdhcps6_option_add_iaaddr_finish(Ipdhcps6_option_iaaddr *iaddr,
|
|
Ip_u16 opt_buf_len,
|
|
IP_CONST struct Ip_in6_addr *addr,
|
|
Ip_u32 preferred_lifetime,
|
|
Ip_u32 valid_lifetime);
|
|
|
|
IP_GLOBAL Ipdhcps6_option_iaprefix *
|
|
ipdhcps6_option_add_iaprefix_start(Ipdhcps6_option *opt,
|
|
Ip_u16 opt_buf_len,
|
|
Ip_u16 *bytes_written);
|
|
|
|
IP_GLOBAL void
|
|
ipdhcps6_option_add_iaprefix_finish(Ipdhcps6_option_iaprefix *iaprefix,
|
|
Ip_u16 opt_buf_len,
|
|
IP_CONST struct Ip_in6_addr *prefix,
|
|
Ip_u8 prefix_len,
|
|
Ip_u32 preferred_lifetime,
|
|
Ip_u32 valid_lifetime);
|
|
struct Ipdhcps6_host_struct;
|
|
struct Ipdhcps6_subnet_entry_struct;
|
|
|
|
IP_GLOBAL Ipdhcps6_option *
|
|
ipdhcps6_option_get_configured(struct Ipdhcps6_host_struct *host,
|
|
struct Ipdhcps6_subnet_entry_struct *subnet,
|
|
Ip_u16 ocode);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/*
|
|
****************************************************************************
|
|
* END OF FILE
|
|
****************************************************************************
|
|
*/
|