1/** @file
2 */
3
4#ifndef __LWIP_DHCP_H__
5#define __LWIP_DHCP_H__
6
7#include "lwip/opt.h"
8
9#if LWIP_DHCP                   /* don't build if not configured for use in lwipopts.h */
10
11#include "lwip/netif.h"
12#include "lwip/udp.h"
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/** period (in seconds) of the application calling dhcp_coarse_tmr() */
19#define DHCP_COARSE_TIMER_SECS 60
20/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */
21#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL)
22/** period (in milliseconds) of the application calling dhcp_fine_tmr() */
23#define DHCP_FINE_TIMER_MSECS 500
24
25    struct dhcp {
26  /** current DHCP state machine state */
27        u8_t state;
28  /** retries of current request */
29        u8_t tries;
30  /** transaction identifier of last sent request */
31        u32_t xid;
32  /** our connection to the DHCP server */
33        struct udp_pcb *pcb;
34  /** (first) pbuf of incoming msg */
35        struct pbuf *p;
36  /** incoming msg */
37        struct dhcp_msg *msg_in;
38  /** incoming msg options */
39        struct dhcp_msg *options_in;
40  /** ingoing msg options length */
41        u16_t options_in_len;
42
43        struct pbuf *p_out;     /* pbuf of outcoming msg */
44        struct dhcp_msg *msg_out;       /* outgoing msg */
45        u16_t options_out_len;  /* outgoing msg options length */
46        u16_t request_timeout;  /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
47        u16_t t1_timeout;       /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
48        u16_t t2_timeout;       /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
49        struct ip_addr server_ip_addr;  /* dhcp server address that offered this lease */
50        struct ip_addr offered_ip_addr;
51        struct ip_addr offered_sn_mask;
52        struct ip_addr offered_gw_addr;
53        struct ip_addr offered_bc_addr;
54#define DHCP_MAX_DNS 2
55        u32_t dns_count;        /* actual number of DNS servers obtained */
56        struct ip_addr offered_dns_addr[DHCP_MAX_DNS];  /* DNS server addresses */
57
58        u32_t offered_t0_lease; /* lease period (in seconds) */
59        u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
60        u32_t offered_t2_rebind;        /* recommended rebind time (usually 66% of lease period)  */
61#if LWIP_DHCP_AUTOIP_COOP
62        u8_t autoip_coop_state;
63#endif
64/** Patch #1308
65 *  TODO: See dhcp.c "TODO"s
66 */
67#if 0
68        struct ip_addr offered_si_addr;
69        u8_t *boot_file_name;
70#endif
71    };
72
73/* MUST be compiled with "pack structs" or equivalent! */
74#ifdef PACK_STRUCT_USE_INCLUDES
75#include "arch/bpstruct.h"
76#endif
77     PACK_STRUCT_BEGIN
78/** minimum set of fields of any DHCP message */
79      struct dhcp_msg {
80        PACK_STRUCT_FIELD(u8_t op);
81        PACK_STRUCT_FIELD(u8_t htype);
82        PACK_STRUCT_FIELD(u8_t hlen);
83        PACK_STRUCT_FIELD(u8_t hops);
84        PACK_STRUCT_FIELD(u32_t xid);
85        PACK_STRUCT_FIELD(u16_t secs);
86        PACK_STRUCT_FIELD(u16_t flags);
87        PACK_STRUCT_FIELD(struct ip_addr ciaddr);
88         PACK_STRUCT_FIELD(struct ip_addr yiaddr);
89         PACK_STRUCT_FIELD(struct ip_addr siaddr);
90         PACK_STRUCT_FIELD(struct ip_addr giaddr);
91#define DHCP_CHADDR_LEN 16U
92         PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]);
93#define DHCP_SNAME_LEN 64U
94         PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]);
95#define DHCP_FILE_LEN 128U
96         PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]);
97         PACK_STRUCT_FIELD(u32_t cookie);
98#define DHCP_MIN_OPTIONS_LEN 68U
99/** make sure user does not configure this too small */
100#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))
101#undef DHCP_OPTIONS_LEN
102#endif
103/** allow this to be configured in lwipopts.h, but not too small */
104#if (!defined(DHCP_OPTIONS_LEN))
105/** set this to be sufficient for your options in outgoing DHCP msgs */
106#define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN
107#endif
108         PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]);
109    } PACK_STRUCT_STRUCT;
110     PACK_STRUCT_END
111#ifdef PACK_STRUCT_USE_INCLUDES
112#include "arch/epstruct.h"
113#endif
114/** start DHCP configuration */
115     err_t dhcp_start(struct netif *netif);
116/** enforce early lease renewal (not needed normally)*/
117    err_t dhcp_renew(struct netif *netif);
118/** release the DHCP lease, usually called before dhcp_stop()*/
119    err_t dhcp_release(struct netif *netif);
120/** stop DHCP configuration */
121    void dhcp_stop(struct netif *netif);
122/** inform server of our manual IP address */
123    void dhcp_inform(struct netif *netif);
124
125/** if enabled, check whether the offered IP address is not in use, using ARP */
126#if DHCP_DOES_ARP_CHECK
127    void dhcp_arp_reply(struct netif *netif, struct ip_addr *addr);
128#endif
129
130/** to be called every minute */
131    void dhcp_coarse_tmr(void);
132/** to be called every half second */
133    void dhcp_fine_tmr(void);
134
135/** DHCP message item offsets and length */
136#define DHCP_MSG_OFS (UDP_DATA_OFS)
137#define DHCP_OP_OFS (DHCP_MSG_OFS + 0)
138#define DHCP_HTYPE_OFS (DHCP_MSG_OFS + 1)
139#define DHCP_HLEN_OFS (DHCP_MSG_OFS + 2)
140#define DHCP_HOPS_OFS (DHCP_MSG_OFS + 3)
141#define DHCP_XID_OFS (DHCP_MSG_OFS + 4)
142#define DHCP_SECS_OFS (DHCP_MSG_OFS + 8)
143#define DHCP_FLAGS_OFS (DHCP_MSG_OFS + 10)
144#define DHCP_CIADDR_OFS (DHCP_MSG_OFS + 12)
145#define DHCP_YIADDR_OFS (DHCP_MSG_OFS + 16)
146#define DHCP_SIADDR_OFS (DHCP_MSG_OFS + 20)
147#define DHCP_GIADDR_OFS (DHCP_MSG_OFS + 24)
148#define DHCP_CHADDR_OFS (DHCP_MSG_OFS + 28)
149#define DHCP_SNAME_OFS (DHCP_MSG_OFS + 44)
150#define DHCP_FILE_OFS (DHCP_MSG_OFS + 108)
151#define DHCP_MSG_LEN 236
152
153#define DHCP_COOKIE_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN)
154#define DHCP_OPTIONS_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN + 4)
155
156#define DHCP_CLIENT_PORT 68
157#define DHCP_SERVER_PORT 67
158
159/** DHCP client states */
160#define DHCP_REQUESTING 1
161#define DHCP_INIT 2
162#define DHCP_REBOOTING 3
163#define DHCP_REBINDING 4
164#define DHCP_RENEWING 5
165#define DHCP_SELECTING 6
166#define DHCP_INFORMING 7
167#define DHCP_CHECKING 8
168#define DHCP_PERMANENT 9
169#define DHCP_BOUND 10
170/** not yet implemented #define DHCP_RELEASING 11 */
171#define DHCP_BACKING_OFF 12
172#define DHCP_OFF 13
173
174/** AUTOIP cooperatation flags */
175#define DHCP_AUTOIP_COOP_STATE_OFF 0
176#define DHCP_AUTOIP_COOP_STATE_ON 1
177
178#define DHCP_BOOTREQUEST 1
179#define DHCP_BOOTREPLY 2
180
181#define DHCP_DISCOVER 1
182#define DHCP_OFFER 2
183#define DHCP_REQUEST 3
184#define DHCP_DECLINE 4
185#define DHCP_ACK 5
186#define DHCP_NAK 6
187#define DHCP_RELEASE 7
188#define DHCP_INFORM 8
189
190#define DHCP_HTYPE_ETH 1
191
192#define DHCP_HLEN_ETH 6
193
194#define DHCP_BROADCAST_FLAG 15
195#define DHCP_BROADCAST_MASK (1 << DHCP_FLAG_BROADCAST)
196
197/** BootP options */
198#define DHCP_OPTION_PAD 0
199#define DHCP_OPTION_SUBNET_MASK 1       /* RFC 2132 3.3 */
200#define DHCP_OPTION_ROUTER 3
201#define DHCP_OPTION_DNS_SERVER 6
202#define DHCP_OPTION_HOSTNAME 12
203#define DHCP_OPTION_IP_TTL 23
204#define DHCP_OPTION_MTU 26
205#define DHCP_OPTION_BROADCAST 28
206#define DHCP_OPTION_TCP_TTL 37
207#define DHCP_OPTION_END 255
208
209/** DHCP options */
210#define DHCP_OPTION_REQUESTED_IP 50     /* RFC 2132 9.1, requested IP address */
211#define DHCP_OPTION_LEASE_TIME 51       /* RFC 2132 9.2, time in seconds, in 4 bytes */
212#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */
213
214#define DHCP_OPTION_MESSAGE_TYPE 53     /* RFC 2132 9.6, important for DHCP */
215#define DHCP_OPTION_MESSAGE_TYPE_LEN 1
216
217
218#define DHCP_OPTION_SERVER_ID 54        /* RFC 2132 9.7, server IP address */
219#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55   /* RFC 2132 9.8, requested option types */
220
221#define DHCP_OPTION_MAX_MSG_SIZE 57     /* RFC 2132 9.10, message size accepted >= 576 */
222#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2
223
224#define DHCP_OPTION_T1 58       /* T1 renewal time */
225#define DHCP_OPTION_T2 59       /* T2 rebinding time */
226#define DHCP_OPTION_US 60
227#define DHCP_OPTION_CLIENT_ID 61
228#define DHCP_OPTION_TFTP_SERVERNAME 66
229#define DHCP_OPTION_BOOTFILE 67
230
231/** possible combinations of overloading the file and sname fields with options */
232#define DHCP_OVERLOAD_NONE 0
233#define DHCP_OVERLOAD_FILE 1
234#define DHCP_OVERLOAD_SNAME  2
235#define DHCP_OVERLOAD_SNAME_FILE 3
236
237#ifdef __cplusplus
238}
239#endif
240#endif                          /* LWIP_DHCP */
241#endif /*__LWIP_DHCP_H__*/
242