Home | History | Annotate | Download | only in lwip
      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
     15 extern "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 #define DHCP_CHADDR_LEN 16U
     26 #define DHCP_SNAME_LEN  64U
     27 #define DHCP_FILE_LEN   128U
     28 
     29 struct dhcp
     30 {
     31   /** transaction identifier of last sent request */
     32   u32_t xid;
     33   /** our connection to the DHCP server */
     34   struct udp_pcb *pcb;
     35   /** incoming msg */
     36   struct dhcp_msg *msg_in;
     37   /** current DHCP state machine state */
     38   u8_t state;
     39   /** retries of current request */
     40   u8_t tries;
     41 #if LWIP_DHCP_AUTOIP_COOP
     42   u8_t autoip_coop_state;
     43 #endif
     44   u8_t subnet_mask_given;
     45 
     46   struct pbuf *p_out; /* pbuf of outcoming msg */
     47   struct dhcp_msg *msg_out; /* outgoing msg */
     48   u16_t options_out_len; /* outgoing msg options length */
     49   u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
     50   u16_t t1_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
     51   u16_t t2_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
     52   ip_addr_t server_ip_addr; /* dhcp server address that offered this lease */
     53   ip_addr_t offered_ip_addr;
     54   ip_addr_t offered_sn_mask;
     55   ip_addr_t offered_gw_addr;
     56 
     57   u32_t offered_t0_lease; /* lease period (in seconds) */
     58   u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
     59   u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period)  */
     60   /* @todo: LWIP_DHCP_BOOTP_FILE configuration option?
     61      integrate with possible TFTP-client for booting? */
     62 #if LWIP_DHCP_BOOTP_FILE
     63   ip_addr_t offered_si_addr;
     64   char boot_file_name[DHCP_FILE_LEN];
     65 #endif /* LWIP_DHCP_BOOTPFILE */
     66 };
     67 
     68 /* MUST be compiled with "pack structs" or equivalent! */
     69 #ifdef PACK_STRUCT_USE_INCLUDES
     70 #  include "arch/bpstruct.h"
     71 #endif
     72 PACK_STRUCT_BEGIN
     73 /** minimum set of fields of any DHCP message */
     74 struct dhcp_msg
     75 {
     76   PACK_STRUCT_FIELD(u8_t op);
     77   PACK_STRUCT_FIELD(u8_t htype);
     78   PACK_STRUCT_FIELD(u8_t hlen);
     79   PACK_STRUCT_FIELD(u8_t hops);
     80   PACK_STRUCT_FIELD(u32_t xid);
     81   PACK_STRUCT_FIELD(u16_t secs);
     82   PACK_STRUCT_FIELD(u16_t flags);
     83   PACK_STRUCT_FIELD(ip_addr_p_t ciaddr);
     84   PACK_STRUCT_FIELD(ip_addr_p_t yiaddr);
     85   PACK_STRUCT_FIELD(ip_addr_p_t siaddr);
     86   PACK_STRUCT_FIELD(ip_addr_p_t giaddr);
     87   PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]);
     88   PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]);
     89   PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]);
     90   PACK_STRUCT_FIELD(u32_t cookie);
     91 #define DHCP_MIN_OPTIONS_LEN 68U
     92 /** make sure user does not configure this too small */
     93 #if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))
     94 #  undef DHCP_OPTIONS_LEN
     95 #endif
     96 /** allow this to be configured in lwipopts.h, but not too small */
     97 #if (!defined(DHCP_OPTIONS_LEN))
     98 /** set this to be sufficient for your options in outgoing DHCP msgs */
     99 #  define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN
    100 #endif
    101   PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]);
    102 } PACK_STRUCT_STRUCT;
    103 PACK_STRUCT_END
    104 #ifdef PACK_STRUCT_USE_INCLUDES
    105 #  include "arch/epstruct.h"
    106 #endif
    107 
    108 void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp);
    109 /** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */
    110 #define dhcp_remove_struct(netif) do { (netif)->dhcp = NULL; } while(0)
    111 void dhcp_cleanup(struct netif *netif);
    112 /** start DHCP configuration */
    113 err_t dhcp_start(struct netif *netif);
    114 /** enforce early lease renewal (not needed normally)*/
    115 err_t dhcp_renew(struct netif *netif);
    116 /** release the DHCP lease, usually called before dhcp_stop()*/
    117 err_t dhcp_release(struct netif *netif);
    118 /** stop DHCP configuration */
    119 void dhcp_stop(struct netif *netif);
    120 /** inform server of our manual IP address */
    121 void dhcp_inform(struct netif *netif);
    122 /** Handle a possible change in the network configuration */
    123 void dhcp_network_changed(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, ip_addr_t *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_OP_OFS       0
    137 #define DHCP_HTYPE_OFS    1
    138 #define DHCP_HLEN_OFS     2
    139 #define DHCP_HOPS_OFS     3
    140 #define DHCP_XID_OFS      4
    141 #define DHCP_SECS_OFS     8
    142 #define DHCP_FLAGS_OFS    10
    143 #define DHCP_CIADDR_OFS   12
    144 #define DHCP_YIADDR_OFS   16
    145 #define DHCP_SIADDR_OFS   20
    146 #define DHCP_GIADDR_OFS   24
    147 #define DHCP_CHADDR_OFS   28
    148 #define DHCP_SNAME_OFS    44
    149 #define DHCP_FILE_OFS     108
    150 #define DHCP_MSG_LEN      236
    151 
    152 #define DHCP_COOKIE_OFS   DHCP_MSG_LEN
    153 #define DHCP_OPTIONS_OFS  (DHCP_MSG_LEN + 4)
    154 
    155 #define DHCP_CLIENT_PORT  68
    156 #define DHCP_SERVER_PORT  67
    157 
    158 /** DHCP client states */
    159 #define DHCP_OFF          0
    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 
    173 /** AUTOIP cooperatation flags */
    174 #define DHCP_AUTOIP_COOP_STATE_OFF  0
    175 #define DHCP_AUTOIP_COOP_STATE_ON   1
    176 
    177 #define DHCP_BOOTREQUEST  1
    178 #define DHCP_BOOTREPLY    2
    179 
    180 /** DHCP message types */
    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 /** DHCP hardware type, currently only ethernet is supported */
    191 #define DHCP_HTYPE_ETH 1
    192 
    193 #define DHCP_MAGIC_COOKIE 0x63825363UL
    194 
    195 /* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */
    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 #define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */
    218 #define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */
    219 
    220 #define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */
    221 #define DHCP_OPTION_MAX_MSG_SIZE_LEN 2
    222 
    223 #define DHCP_OPTION_T1 58 /* T1 renewal time */
    224 #define DHCP_OPTION_T2 59 /* T2 rebinding time */
    225 #define DHCP_OPTION_US 60
    226 #define DHCP_OPTION_CLIENT_ID 61
    227 #define DHCP_OPTION_TFTP_SERVERNAME 66
    228 #define DHCP_OPTION_BOOTFILE 67
    229 
    230 /** possible combinations of overloading the file and sname fields with options */
    231 #define DHCP_OVERLOAD_NONE 0
    232 #define DHCP_OVERLOAD_FILE 1
    233 #define DHCP_OVERLOAD_SNAME  2
    234 #define DHCP_OVERLOAD_SNAME_FILE 3
    235 
    236 #ifdef __cplusplus
    237 }
    238 #endif
    239 
    240 #endif /* LWIP_DHCP */
    241 
    242 #endif /*__LWIP_DHCP_H__*/
    243