*/
#pragma once
-#define ALL_DHCPV6_RELAYS {{{0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02}}}
+#include "odhcpd.h"
-#define ALL_DHCPV6_SERVERS {{{0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03}}}
+#define ALL_DHCPV6_RELAYS "ff02::1:2"
+
+#define ALL_DHCPV6_SERVERS "ff05::1:3"
#define DHCPV6_CLIENT_PORT 546
#define DHCPV6_SERVER_PORT 547
#define DHCPV6_MSG_INFORMATION_REQUEST 11
#define DHCPV6_MSG_RELAY_FORW 12
#define DHCPV6_MSG_RELAY_REPL 13
+#define DHCPV6_MSG_DHCPV4_QUERY 20
+#define DHCPV6_MSG_DHCPV4_RESPONSE 21
#define DHCPV6_OPT_CLIENTID 1
#define DHCPV6_OPT_SERVERID 2
#define DHCPV6_OPT_STATUS 13
#define DHCPV6_OPT_RELAY_MSG 9
#define DHCPV6_OPT_AUTH 11
+#define DHCPV6_OPT_RAPID_COMMIT 14
+#define DHCPV6_OPT_USER_CLASS 15
#define DHCPV6_OPT_INTERFACE_ID 18
#define DHCPV6_OPT_RECONF_MSG 19
#define DHCPV6_OPT_RECONF_ACCEPT 20
#define DHCPV6_OPT_DNS_DOMAIN 24
#define DHCPV6_OPT_IA_PD 25
#define DHCPV6_OPT_IA_PREFIX 26
+#define DHCPV6_OPT_SNTP_SERVERS 31
#define DHCPV6_OPT_INFO_REFRESH 32
#define DHCPV6_OPT_FQDN 39
-
-#ifdef EXT_PREFIX_CLASS
-/* draft-bhandari-dhc-class-based-prefix, not yet standardized */
-#define DHCPV6_OPT_PREFIX_CLASS EXT_PREFIX_CLASS
-#endif
+#define DHCPV6_OPT_NTP_SERVERS 56
+#define DHCPV6_OPT_SOL_MAX_RT 82
+#define DHCPV6_OPT_INF_MAX_RT 83
+#define DHCPV6_OPT_DHCPV4_MSG 87
+#define DHCPV6_OPT_4O6_SERVER 88
#define DHCPV6_DUID_VENDOR 2
#define DHCPV6_STATUS_NOADDRSAVAIL 2
#define DHCPV6_STATUS_NOBINDING 3
#define DHCPV6_STATUS_NOTONLINK 4
+#define DHCPV6_STATUS_USEMULTICAST 5
#define DHCPV6_STATUS_NOPREFIXAVAIL 6
// I just remembered I have an old one lying around...
#define DHCPV6_HOP_COUNT_LIMIT 32
+#define DHCPV6_REC_TIMEOUT 2000 /* msec */
+#define DHCPV6_REC_MAX_RC 8
+
struct dhcpv6_client_header {
uint8_t msg_type;
uint8_t transaction_id[3];
struct dhcpv6_ia_prefix {
uint16_t type;
uint16_t len;
- uint32_t preferred;
- uint32_t valid;
+ uint32_t preferred_lt;
+ uint32_t valid_lt;
uint8_t prefix;
struct in6_addr addr;
} _packed;
uint16_t type;
uint16_t len;
struct in6_addr addr;
- uint32_t preferred;
- uint32_t valid;
+ uint32_t preferred_lt;
+ uint32_t valid_lt;
} _packed;
-struct dhcpv6_assignment {
- struct list_head head;
- struct sockaddr_in6 peer;
- time_t valid_until;
- time_t reconf_sent;
- bool all_class;
- uint8_t classes_cnt;
- uint16_t *classes;
- int reconf_cnt;
- char *hostname;
- uint8_t key[16];
- uint32_t assigned;
- uint32_t iaid;
- uint8_t mac[6];
- uint8_t length; // length == 128 -> IA_NA, length <= 64 -> IA_PD
- bool accept_reconf;
- uint8_t clid_len;
- uint8_t clid_data[];
+struct dhcpv6_cer_id {
+ uint16_t type;
+ uint16_t len;
+ uint16_t reserved;
+ uint16_t auth_type;
+ uint8_t auth[16];
+ struct in6_addr addr;
};
-
-
#define dhcpv6_for_each_option(start, end, otype, olen, odata)\
for (uint8_t *_o = (uint8_t*)(start); _o + 4 <= (end) &&\
((otype) = _o[0] << 8 | _o[1]) && ((odata) = (void*)&_o[4]) &&\
((olen) = _o[2] << 8 | _o[3]) + (odata) <= (end); \
_o += 4 + (_o[2] << 8 | _o[3]))
-
-int dhcpv6_init_ia(struct interface *iface, int socket);
-size_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface,
- const struct sockaddr_in6 *addr, const void *data, const uint8_t *end);
-int dhcpv6_ia_init(void);
-int setup_dhcpv6_ia_interface(struct interface *iface, bool enable);
-void dhcpv6_write_statefile(void);