udhcp6: fix releasing
[oweals/busybox.git] / networking / udhcp / d6_common.h
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Copyright (C) 2011 Denys Vlasenko.
4  *
5  * Licensed under GPLv2, see file LICENSE in this source tree.
6  */
7 #ifndef UDHCP_D6_COMMON_H
8 #define UDHCP_D6_COMMON_H 1
9
10 #include <netinet/ip6.h>
11
12 PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
13
14
15 /*** DHCPv6 packet ***/
16
17 /* DHCPv6 protocol. See RFC 3315 */
18 #define D6_MSG_SOLICIT              1
19 #define D6_MSG_ADVERTISE            2
20 #define D6_MSG_REQUEST              3
21 #define D6_MSG_CONFIRM              4
22 #define D6_MSG_RENEW                5
23 #define D6_MSG_REBIND               6
24 #define D6_MSG_REPLY                7
25 #define D6_MSG_RELEASE              8
26 #define D6_MSG_DECLINE              9
27 #define D6_MSG_RECONFIGURE         10
28 #define D6_MSG_INFORMATION_REQUEST 11
29 #define D6_MSG_RELAY_FORW          12
30 #define D6_MSG_RELAY_REPL          13
31
32 struct d6_packet {
33         union {
34                 uint8_t d6_msg_type;
35                 uint32_t d6_xid32;
36         } d6_u;
37         uint8_t d6_options[576 - sizeof(struct iphdr) - sizeof(struct udphdr) - 4
38                         + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS];
39 } PACKED;
40 #define d6_msg_type d6_u.d6_msg_type
41 #define d6_xid32    d6_u.d6_xid32
42
43 struct ip6_udp_d6_packet {
44         struct ip6_hdr ip6;
45         struct udphdr udp;
46         struct d6_packet data;
47 } PACKED;
48
49 struct udp_d6_packet {
50         struct udphdr udp;
51         struct d6_packet data;
52 } PACKED;
53
54 /*** Options ***/
55
56 struct d6_option {
57         uint8_t code_hi;
58         uint8_t code;
59         uint8_t len_hi;
60         uint8_t len;
61         uint8_t data[1];
62 } PACKED;
63
64 #define D6_OPT_CLIENTID       1
65 #define D6_OPT_SERVERID       2
66 #define D6_OPT_IA_NA          3
67 #define D6_OPT_IA_TA          4
68 #define D6_OPT_IAADDR         5
69 #define D6_OPT_ORO            6
70 #define D6_OPT_PREFERENCE     7
71 #define D6_OPT_ELAPSED_TIME   8
72 #define D6_OPT_RELAY_MSG      9
73 #define D6_OPT_AUTH          11
74 #define D6_OPT_UNICAST       12
75 #define D6_OPT_STATUS_CODE   13
76 #define D6_OPT_RAPID_COMMIT  14
77 #define D6_OPT_USER_CLASS    15
78 #define D6_OPT_VENDOR_CLASS  16
79 #define D6_OPT_VENDOR_OPTS   17
80 #define D6_OPT_INTERFACE_ID  18
81 #define D6_OPT_RECONF_MSG    19
82 #define D6_OPT_RECONF_ACCEPT 20
83
84 #define D6_OPT_DNS_SERVERS   23
85 #define D6_OPT_DOMAIN_LIST   24
86
87 #define D6_OPT_IA_PD         25
88 #define D6_OPT_IAPREFIX      26
89
90 #define D6_OPT_CLIENT_FQDN   39
91
92 /*** Other shared functions ***/
93
94 struct client6_data_t {
95         struct d6_option *server_id;
96         struct d6_option *ia_na;
97         char **env_ptr;
98         unsigned env_idx;
99         /* link-local IPv6 address */
100         struct in6_addr ll_ip6;
101 };
102
103 #define client6_data (*(struct client6_data_t*)(&bb_common_bufsiz1[COMMON_BUFSIZE - sizeof(struct client6_data_t)]))
104
105 int FAST_FUNC d6_read_interface(const char *interface, int *ifindex, struct in6_addr *nip6, uint8_t *mac);
106
107 int FAST_FUNC d6_listen_socket(int port, const char *inf);
108
109 int FAST_FUNC d6_recv_kernel_packet(
110                 struct in6_addr *peer_ipv6,
111                 struct d6_packet *packet, int fd
112 );
113
114 int FAST_FUNC d6_send_raw_packet(
115                 struct d6_packet *d6_pkt, unsigned d6_pkt_size,
116                 struct in6_addr *src_ipv6, int source_port,
117                 struct in6_addr *dst_ipv6, int dest_port, const uint8_t *dest_arp,
118                 int ifindex
119 );
120
121 int FAST_FUNC d6_send_kernel_packet(
122                 struct d6_packet *d6_pkt, unsigned d6_pkt_size,
123                 struct in6_addr *src_ipv6, int source_port,
124                 struct in6_addr *dst_ipv6, int dest_port,
125                 int ifindex
126 );
127
128 #if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 2
129 void FAST_FUNC d6_dump_packet(struct d6_packet *packet);
130 #else
131 # define d6_dump_packet(packet) ((void)0)
132 #endif
133
134
135 POP_SAVED_FUNCTION_VISIBILITY
136
137 #endif