| Line No. | Rev | Author | Line |
|---|---|---|---|
| 1 | 6 | kaklik | /*! \file dhcp.h \brief DHCP Protocol Library. */ |
| 2 | //***************************************************************************** |
||
| 3 | // |
||
| 4 | // File Name : 'dhcp.h' |
||
| 5 | // Title : DHCP Protocol Library |
||
| 6 | // Author : Pascal Stang |
||
| 7 | // Created : 9/17/2005 |
||
| 8 | // Revised : 9/17/2005 |
||
| 9 | // Version : 0.1 |
||
| 10 | // Target MCU : Atmel AVR series |
||
| 11 | // Editor Tabs : 4 |
||
| 12 | // |
||
| 13 | /// \ingroup network |
||
| 14 | /// \defgroup dhcp DHCP Protocol Library (dhcp.c) |
||
| 15 | /// \code #include "net/dhcp.h" \endcode |
||
| 16 | /// \par Description |
||
| 17 | /// This library provides a limited implementation of DHCP (Dynamic Host |
||
| 18 | /// Configuration Protocol) as described in RFC2131. DHCP allows a |
||
| 19 | /// network device to automatically obtain an IP address and other network |
||
| 20 | /// configuration settings from a DHCP server. |
||
| 21 | /// |
||
| 22 | /// \note This code is currently below version 1.0, and therefore is considered |
||
| 23 | /// to be lacking in some functionality or documentation, or may not be fully |
||
| 24 | /// tested. Nonetheless, you can expect most functions to work. |
||
| 25 | /// |
||
| 26 | // This code is distributed under the GNU Public License |
||
| 27 | // which can be found at http://www.gnu.org/licenses/gpl.txt |
||
| 28 | //***************************************************************************** |
||
| 29 | //@{ |
||
| 30 | |||
| 31 | #ifndef DHCP_H |
||
| 32 | #define DHCP_H |
||
| 33 | |||
| 34 | #include "global.h" |
||
| 35 | #include "net.h" |
||
| 36 | |||
| 37 | //#define DHCP_DEBUG_PRINT |
||
| 38 | //#define DHCP_DEBUG |
||
| 39 | |||
| 40 | /// Bootp Header (DHCP is transported by BOOTP/UDP/IP) |
||
| 41 | struct netBootpHeader |
||
| 42 | { |
||
| 43 | uint8_t op; ///< Message op-code / message type |
||
| 44 | uint8_t htype; ///< Hardware address type (Ethernet=1) |
||
| 45 | uint8_t hlen; ///< Hardware address length (Ethernet=6 byte MAC addr) |
||
| 46 | uint8_t hops; ///< hop count (client set to zero) |
||
| 47 | uint32_t xid; ///< Transaction ID (randomly chosen by client, must remain same) |
||
| 48 | uint16_t secs; ///< Seconds elapsed since DHCP negotiation began (filled by client) |
||
| 49 | uint16_t flags; ///< Flags |
||
| 50 | uint32_t ciaddr; ///< Client IP address (filled only if already bound, renewing, or rebinding) |
||
| 51 | uint32_t yiaddr; ///< 'Your' IP address (client) |
||
| 52 | uint32_t siaddr; ///< Server IP address |
||
| 53 | uint32_t giaddr; ///< Gateway IP address |
||
| 54 | uint8_t chaddr[16]; ///< Client Hardware Address |
||
| 55 | uint8_t sname[64]; ///< Server Host Name |
||
| 56 | uint8_t file[128]; ///< Boot file name (null-term string) |
||
| 57 | } GNUC_PACKED; |
||
| 58 | |||
| 59 | #define BOOTP_HEADER_LEN 236 ///< length of BOOTP header not including options |
||
| 60 | |||
| 61 | #define BOOTP_OP_BOOTREQUEST 1 ///< BOOTP Request operation (message from client to server) |
||
| 62 | #define BOOTP_OP_BOOTREPLY 2 ///< BOOTP Reply operation (message from server to client) |
||
| 63 | |||
| 64 | #define BOOTP_HTYPE_ETHERNET 1 |
||
| 65 | #define BOOTP_HLEN_ETHERNET 6 |
||
| 66 | |||
| 67 | /// DHCP Header |
||
| 68 | struct netDhcpHeader |
||
| 69 | { |
||
| 70 | struct netBootpHeader bootp; ///< BOOTP header |
||
| 71 | uint32_t cookie; ///< magic cookie value |
||
| 72 | uint8_t options[]; ///< DHCP options |
||
| 73 | } GNUC_PACKED; |
||
| 74 | |||
| 75 | #define DHCP_HEADER_LEN 240 ///< length of DHCP header not including options |
||
| 76 | |||
| 77 | #define DHCP_UDP_SERVER_PORT 67 ///< UDP port where DHCP requests should be sent |
||
| 78 | #define DHCP_UDP_CLIENT_PORT 68 ///< UDP port clients will receive DHCP replies |
||
| 79 | |||
| 80 | |||
| 81 | #define DHCP_OPT_PAD 0 ///< token padding value (make be skipped) |
||
| 82 | #define DHCP_OPT_NETMASK 1 ///< subnet mask client should use (4 byte mask) |
||
| 83 | #define DHCP_OPT_ROUTERS 3 ///< routers client should use (IP addr list) |
||
| 84 | #define DHCP_OPT_TIMESERVERS 4 ///< time servers client should use (IP addr list) |
||
| 85 | #define DHCP_OPT_NAMESERVERS 5 ///< name servers client should use (IP addr list) |
||
| 86 | #define DHCP_OPT_DNSSERVERS 6 ///< DNS servers client should use (IP addr list) |
||
| 87 | #define DHCP_OPT_HOSTNAME 12 ///< host name client should use (string) |
||
| 88 | #define DHCP_OPT_DOMAINNAME 15 ///< domain name client should use (string) |
||
| 89 | #define DHCP_OPT_REQUESTEDIP 50 ///< IP address requested by client (IP address) |
||
| 90 | #define DHCP_OPT_LEASETIME 51 ///< DHCP Lease Time (uint32 seconds) |
||
| 91 | #define DHCP_OPT_DHCPMSGTYPE 53 ///< DHCP message type (1 byte) |
||
| 92 | #define DHCP_OPT_SERVERID 54 ///< Server Identifier (IP address) |
||
| 93 | #define DHCP_OPT_PARAMREQLIST 55 ///< Paramerter Request List (n OPT codes) |
||
| 94 | #define DHCP_OPT_RENEWALTIME 58 ///< DHCP Lease Renewal Time (uint32 seconds) |
||
| 95 | #define DHCP_OPT_REBINDTIME 59 ///< DHCP Lease Rebinding Time (uint32 seconds) |
||
| 96 | #define DHCP_OPT_END 255 ///< token end value (marks end of options list) |
||
| 97 | |||
| 98 | #define DHCP_MSG_DHCPDISCOVER 1 ///< DISCOVER is broadcast by client to solicit OFFER from any/all DHCP servers. |
||
| 99 | #define DHCP_MSG_DHCPOFFER 2 ///< OFFER(s) are made to client by server to offer IP address and config info. |
||
| 100 | #define DHCP_MSG_DHCPREQUEST 3 ///< REQUEST is made my client in response to best/favorite OFFER message. |
||
| 101 | #define DHCP_MSG_DHCPDECLINE 4 ///< DECLINE may be sent by client to server to indicate IP already in use. |
||
| 102 | #define DHCP_MSG_DHCPACK 5 ///< ACK is sent to client by server in confirmation of REQUEST, contains config and IP. |
||
| 103 | #define DHCP_MSG_DHCPNAK 6 ///< NAK is sent to client by server to indicate problem with REQUEST. |
||
| 104 | #define DHCP_MSG_DHCPRELEASE 7 ///< RELEASE is sent by client to server to relinquish DHCP lease on IP address, etc. |
||
| 105 | #define DHCP_MSG_DHCPINFORM 8 ///< INFORM is sent by client to server to request config info, IP address configured locally. |
||
| 106 | |||
| 107 | |||
| 108 | /*! Initialize DHCP system. |
||
| 109 | Prepares DHCP for use and initializes lease time to zero. */ |
||
| 110 | void dhcpInit(void); |
||
| 111 | |||
| 112 | /*! Processes incoming DHCP packets from UDP port 68. |
||
| 113 | This function is to be called by the stack when a DHCP packet |
||
| 114 | arrives over the network. The DHCP packet will be parsed, handled, |
||
| 115 | and a response will be generated and sent if needed. When the DHCP |
||
| 116 | process completes, the IP addressing will be automatically updated. */ |
||
| 117 | void dhcpIn(unsigned int len, struct netDhcpHeader* packet); |
||
| 118 | |||
| 119 | /*! Request DHCP assigned network parameters. |
||
| 120 | This function begins the DHCP process. The remainder of operations |
||
| 121 | are handled in dhcpIn(). */ |
||
| 122 | void dhcpRequest(void); |
||
| 123 | |||
| 124 | /*! Release DHCP lease and assigned network parameters. |
||
| 125 | This function releases the DHCP assigned address and allows the |
||
| 126 | DHCP server to reallocate it. */ |
||
| 127 | void dhcpRelease(void); |
||
| 128 | |||
| 129 | /*! Periodic DHCP maintenance. |
||
| 130 | This function is to be called once per second and will |
||
| 131 | expire the DHCP lease. */ |
||
| 132 | void dhcpTimer(void); |
||
| 133 | |||
| 134 | /*! Get a DHCP option from the option list. |
||
| 135 | \param options is a pointer to the options field of a DHCP packet. |
||
| 136 | \param optcode is the desired option number to retrieve. |
||
| 137 | \param optlen is the maximum data length that should be retrieved (less data will be retrieved if option is shorter). |
||
| 138 | \param optvalptr is a pointer to where the option value will be stored. |
||
| 139 | \return actual length of the option data, as stored in the options list. */ |
||
| 140 | uint8_t dhcpGetOption(uint8_t* options, uint8_t optcode, uint8_t optlen, void* optvalptr); |
||
| 141 | |||
| 142 | /*! Set a DHCP option in the option list. |
||
| 143 | \param options is a pointer to the options field of a DHCP packet. |
||
| 144 | \param optcode is the option number to write. |
||
| 145 | \param optlen is the data length of the option value. |
||
| 146 | \param optvalptr is a pointer to the option data to be read. |
||
| 147 | \return pointer to write location of the next option. */ |
||
| 148 | uint8_t* dhcpSetOption(uint8_t* options, uint8_t optcode, uint8_t optlen, void* optvalptr); |
||
| 149 | |||
| 150 | /*! Print diagnotic information about BOOTP/DHCP packet. |
||
| 151 | */ |
||
| 152 | void dhcpPrintHeader(struct netDhcpHeader* packet); |
||
| 153 | |||
| 154 | #endif |
||
| 155 | //@} |
||
| 156 |
Powered by WebSVN v2.8.3