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