2011-11-07 20:25:39 +05:30
|
|
|
/* vi: set sw=4 ts=4: */
|
|
|
|
/*
|
|
|
|
* Copyright (C) 2011 Denys Vlasenko.
|
|
|
|
*
|
|
|
|
* Licensed under GPLv2, see file LICENSE in this source tree.
|
|
|
|
*/
|
|
|
|
#ifndef UDHCP_D6_COMMON_H
|
|
|
|
#define UDHCP_D6_COMMON_H 1
|
|
|
|
|
|
|
|
#include <netinet/ip6.h>
|
|
|
|
|
|
|
|
PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
|
|
|
|
|
|
|
|
|
|
|
|
/*** DHCPv6 packet ***/
|
|
|
|
|
|
|
|
/* DHCPv6 protocol. See RFC 3315 */
|
|
|
|
#define D6_MSG_SOLICIT 1
|
|
|
|
#define D6_MSG_ADVERTISE 2
|
|
|
|
#define D6_MSG_REQUEST 3
|
|
|
|
#define D6_MSG_CONFIRM 4
|
|
|
|
#define D6_MSG_RENEW 5
|
|
|
|
#define D6_MSG_REBIND 6
|
|
|
|
#define D6_MSG_REPLY 7
|
|
|
|
#define D6_MSG_RELEASE 8
|
|
|
|
#define D6_MSG_DECLINE 9
|
|
|
|
#define D6_MSG_RECONFIGURE 10
|
|
|
|
#define D6_MSG_INFORMATION_REQUEST 11
|
|
|
|
#define D6_MSG_RELAY_FORW 12
|
|
|
|
#define D6_MSG_RELAY_REPL 13
|
|
|
|
|
|
|
|
struct d6_packet {
|
|
|
|
union {
|
|
|
|
uint8_t d6_msg_type;
|
|
|
|
uint32_t d6_xid32;
|
|
|
|
} d6_u;
|
2019-08-10 00:13:40 +05:30
|
|
|
uint8_t d6_options[576 - sizeof(struct ip6_hdr) - sizeof(struct udphdr) - 4
|
2011-11-07 20:25:39 +05:30
|
|
|
+ CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS];
|
|
|
|
} PACKED;
|
|
|
|
#define d6_msg_type d6_u.d6_msg_type
|
|
|
|
#define d6_xid32 d6_u.d6_xid32
|
|
|
|
|
|
|
|
struct ip6_udp_d6_packet {
|
|
|
|
struct ip6_hdr ip6;
|
|
|
|
struct udphdr udp;
|
|
|
|
struct d6_packet data;
|
|
|
|
} PACKED;
|
|
|
|
|
|
|
|
struct udp_d6_packet {
|
|
|
|
struct udphdr udp;
|
|
|
|
struct d6_packet data;
|
|
|
|
} PACKED;
|
|
|
|
|
|
|
|
/*** Options ***/
|
|
|
|
|
|
|
|
struct d6_option {
|
|
|
|
uint8_t code_hi;
|
2011-11-07 20:51:24 +05:30
|
|
|
uint8_t code;
|
2011-11-07 20:25:39 +05:30
|
|
|
uint8_t len_hi;
|
2011-11-07 20:51:24 +05:30
|
|
|
uint8_t len;
|
2011-11-07 20:25:39 +05:30
|
|
|
uint8_t data[1];
|
|
|
|
} PACKED;
|
|
|
|
|
|
|
|
#define D6_OPT_CLIENTID 1
|
|
|
|
#define D6_OPT_SERVERID 2
|
|
|
|
#define D6_OPT_IA_NA 3
|
|
|
|
#define D6_OPT_IA_TA 4
|
|
|
|
#define D6_OPT_IAADDR 5
|
|
|
|
#define D6_OPT_ORO 6
|
|
|
|
#define D6_OPT_PREFERENCE 7
|
|
|
|
#define D6_OPT_ELAPSED_TIME 8
|
|
|
|
#define D6_OPT_RELAY_MSG 9
|
|
|
|
#define D6_OPT_AUTH 11
|
|
|
|
#define D6_OPT_UNICAST 12
|
|
|
|
#define D6_OPT_STATUS_CODE 13
|
|
|
|
#define D6_OPT_RAPID_COMMIT 14
|
|
|
|
#define D6_OPT_USER_CLASS 15
|
|
|
|
#define D6_OPT_VENDOR_CLASS 16
|
|
|
|
#define D6_OPT_VENDOR_OPTS 17
|
|
|
|
#define D6_OPT_INTERFACE_ID 18
|
|
|
|
#define D6_OPT_RECONF_MSG 19
|
|
|
|
#define D6_OPT_RECONF_ACCEPT 20
|
|
|
|
|
2017-03-28 01:52:09 +05:30
|
|
|
#define D6_OPT_DNS_SERVERS 23
|
|
|
|
#define D6_OPT_DOMAIN_LIST 24
|
|
|
|
|
2011-11-17 00:47:12 +05:30
|
|
|
#define D6_OPT_IA_PD 25
|
|
|
|
#define D6_OPT_IAPREFIX 26
|
|
|
|
|
2017-06-27 22:01:08 +05:30
|
|
|
/* RFC 4704 "The DHCPv6 Client FQDN Option"
|
|
|
|
* uint16 option-code OPTION_CLIENT_FQDN (39)
|
|
|
|
* uint16 option-len 1 + length of domain name
|
|
|
|
* uint8 flags
|
|
|
|
* char[] domain-name partial or fully qualified domain name
|
|
|
|
*
|
|
|
|
* Flags format is |MBZ|N|O|S|
|
|
|
|
* The "S" bit indicates whether the server SHOULD or SHOULD NOT perform
|
|
|
|
* the AAAA RR (FQDN-to-address) DNS updates. A client sets the bit to
|
|
|
|
* 0 to indicate that the server SHOULD NOT perform the updates and 1 to
|
|
|
|
* indicate that the server SHOULD perform the updates. The state of
|
|
|
|
* the bit in the reply from the server indicates the action to be taken
|
|
|
|
* by the server; if it is 1, the server has taken responsibility for
|
|
|
|
* AAAA RR updates for the FQDN.
|
|
|
|
* The "O" bit indicates whether the server has overridden the client's
|
|
|
|
* preference for the "S" bit. A client MUST set this bit to 0. A
|
|
|
|
* server MUST set this bit to 1 if the "S" bit in its reply to the
|
|
|
|
* client does not match the "S" bit received from the client.
|
|
|
|
* The "N" bit indicates whether the server SHOULD NOT perform any DNS
|
|
|
|
* updates. A client sets this bit to 0 to request that the server
|
|
|
|
* SHOULD perform updates (the PTR RR and possibly the AAAA RR based on
|
|
|
|
* the "S" bit) or to 1 to request that the server SHOULD NOT perform
|
|
|
|
* any DNS updates. A server sets the "N" bit to indicate whether the
|
|
|
|
* server SHALL (0) or SHALL NOT (1) perform DNS updates. If the "N"
|
|
|
|
* bit is 1, the "S" bit MUST be 0.
|
|
|
|
*
|
|
|
|
* If a client knows only part of its name, it MAY send a name that is not
|
|
|
|
* fully qualified, indicating that it knows part of the name but does not
|
|
|
|
* necessarily know the zone in which the name is to be embedded.
|
|
|
|
* To send a fully qualified domain name, the Domain Name field is set
|
|
|
|
* to the DNS-encoded domain name including the terminating zero-length
|
|
|
|
* label. To send a partial name, the Domain Name field is set to the
|
|
|
|
* DNS-encoded domain name without the terminating zero-length label.
|
|
|
|
* A client MAY also leave the Domain Name field empty if it desires the
|
|
|
|
* server to provide a name.
|
|
|
|
*/
|
2017-03-28 01:52:09 +05:30
|
|
|
#define D6_OPT_CLIENT_FQDN 39
|
|
|
|
|
2017-06-26 23:12:48 +05:30
|
|
|
#define D6_OPT_TZ_POSIX 41
|
|
|
|
#define D6_OPT_TZ_NAME 42
|
|
|
|
|
2018-05-14 09:59:12 +05:30
|
|
|
#define D6_OPT_BOOT_URL 59
|
|
|
|
#define D6_OPT_BOOT_PARAM 60
|
|
|
|
|
2011-11-07 20:25:39 +05:30
|
|
|
/*** Other shared functions ***/
|
|
|
|
|
|
|
|
struct client6_data_t {
|
|
|
|
struct d6_option *server_id;
|
|
|
|
struct d6_option *ia_na;
|
2018-01-17 02:09:14 +05:30
|
|
|
struct d6_option *ia_pd;
|
2011-11-17 00:47:12 +05:30
|
|
|
char **env_ptr;
|
|
|
|
unsigned env_idx;
|
2017-03-28 01:40:15 +05:30
|
|
|
/* link-local IPv6 address */
|
|
|
|
struct in6_addr ll_ip6;
|
2019-05-26 17:52:44 +05:30
|
|
|
} FIX_ALIASING;
|
2011-11-07 20:25:39 +05:30
|
|
|
|
|
|
|
#define client6_data (*(struct client6_data_t*)(&bb_common_bufsiz1[COMMON_BUFSIZE - sizeof(struct client6_data_t)]))
|
|
|
|
|
2019-04-14 20:31:10 +05:30
|
|
|
int FAST_FUNC d6_read_interface(
|
|
|
|
const char *interface,
|
|
|
|
int *ifindex,
|
|
|
|
struct in6_addr *nip6,
|
|
|
|
uint8_t *mac
|
|
|
|
);
|
2017-03-28 01:40:15 +05:30
|
|
|
|
2011-11-07 20:25:39 +05:30
|
|
|
int FAST_FUNC d6_listen_socket(int port, const char *inf);
|
|
|
|
|
|
|
|
int FAST_FUNC d6_recv_kernel_packet(
|
|
|
|
struct in6_addr *peer_ipv6,
|
|
|
|
struct d6_packet *packet, int fd
|
|
|
|
);
|
|
|
|
|
2020-12-16 02:25:15 +05:30
|
|
|
int FAST_FUNC d6_send_raw_packet_from_client_data_ifindex(
|
2011-11-07 20:25:39 +05:30
|
|
|
struct d6_packet *d6_pkt, unsigned d6_pkt_size,
|
|
|
|
struct in6_addr *src_ipv6, int source_port,
|
2020-12-16 02:25:15 +05:30
|
|
|
struct in6_addr *dst_ipv6, int dest_port, const uint8_t *dest_arp
|
2011-11-07 20:25:39 +05:30
|
|
|
);
|
|
|
|
|
2020-12-16 02:25:15 +05:30
|
|
|
int FAST_FUNC d6_send_kernel_packet_from_client_data_ifindex(
|
2011-11-07 20:25:39 +05:30
|
|
|
struct d6_packet *d6_pkt, unsigned d6_pkt_size,
|
|
|
|
struct in6_addr *src_ipv6, int source_port,
|
2020-12-16 02:25:15 +05:30
|
|
|
struct in6_addr *dst_ipv6, int dest_port
|
2011-11-07 20:25:39 +05:30
|
|
|
);
|
|
|
|
|
2012-04-20 18:18:00 +05:30
|
|
|
#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 2
|
2011-11-07 20:25:39 +05:30
|
|
|
void FAST_FUNC d6_dump_packet(struct d6_packet *packet);
|
2012-04-20 18:18:00 +05:30
|
|
|
#else
|
|
|
|
# define d6_dump_packet(packet) ((void)0)
|
|
|
|
#endif
|
2011-11-07 20:25:39 +05:30
|
|
|
|
|
|
|
|
|
|
|
POP_SAVED_FUNCTION_VISIBILITY
|
|
|
|
|
|
|
|
#endif
|