UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/
Dhcp.h@39:deeb00b81cc9, 2018-01-23 (annotated)
- Committer:
- cassyarduino
- Date:
- Tue Jan 23 15:08:43 2018 +0100
- Revision:
- 39:deeb00b81cc9
- Parent:
- 38:645b253e6b50
Release: 2.0.4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cassyarduino | 0:e3fb1267e3c3 | 1 | // DHCP Library v0.3 - April 25, 2009 |
cassyarduino | 0:e3fb1267e3c3 | 2 | // Author: Jordan Terrell - blog.jordanterrell.com |
cassyarduino | 0:e3fb1267e3c3 | 3 | |
cassyarduino | 0:e3fb1267e3c3 | 4 | #ifndef Dhcp_h |
cassyarduino | 0:e3fb1267e3c3 | 5 | #define Dhcp_h |
cassyarduino | 0:e3fb1267e3c3 | 6 | |
cassyarduino | 33:7ba5d53df0f2 | 7 | #include "utility/uipopt.h" |
cassyarduino | 0:e3fb1267e3c3 | 8 | |
cassyarduino | 0:e3fb1267e3c3 | 9 | /* DHCP state machine. */ |
cassyarduino | 0:e3fb1267e3c3 | 10 | #define STATE_DHCP_START 0 |
cassyarduino | 0:e3fb1267e3c3 | 11 | #define STATE_DHCP_DISCOVER 1 |
cassyarduino | 0:e3fb1267e3c3 | 12 | #define STATE_DHCP_REQUEST 2 |
cassyarduino | 0:e3fb1267e3c3 | 13 | #define STATE_DHCP_LEASED 3 |
cassyarduino | 0:e3fb1267e3c3 | 14 | #define STATE_DHCP_REREQUEST 4 |
cassyarduino | 0:e3fb1267e3c3 | 15 | #define STATE_DHCP_RELEASE 5 |
cassyarduino | 0:e3fb1267e3c3 | 16 | |
cassyarduino | 0:e3fb1267e3c3 | 17 | #define DHCP_FLAGSBROADCAST 0x8000 |
cassyarduino | 0:e3fb1267e3c3 | 18 | |
cassyarduino | 0:e3fb1267e3c3 | 19 | /* UDP port numbers for DHCP */ |
cassyarduino | 0:e3fb1267e3c3 | 20 | #define DHCP_SERVER_PORT 67 /* from server to client */ |
cassyarduino | 0:e3fb1267e3c3 | 21 | #define DHCP_CLIENT_PORT 68 /* from client to server */ |
cassyarduino | 0:e3fb1267e3c3 | 22 | |
cassyarduino | 0:e3fb1267e3c3 | 23 | /* DHCP message OP code */ |
cassyarduino | 0:e3fb1267e3c3 | 24 | #define DHCP_BOOTREQUEST 1 |
cassyarduino | 0:e3fb1267e3c3 | 25 | #define DHCP_BOOTREPLY 2 |
cassyarduino | 0:e3fb1267e3c3 | 26 | |
cassyarduino | 0:e3fb1267e3c3 | 27 | /* DHCP message type */ |
cassyarduino | 0:e3fb1267e3c3 | 28 | #define DHCP_DISCOVER 1 |
cassyarduino | 0:e3fb1267e3c3 | 29 | #define DHCP_OFFER 2 |
cassyarduino | 0:e3fb1267e3c3 | 30 | #define DHCP_REQUEST 3 |
cassyarduino | 0:e3fb1267e3c3 | 31 | #define DHCP_DECLINE 4 |
cassyarduino | 0:e3fb1267e3c3 | 32 | #define DHCP_ACK 5 |
cassyarduino | 0:e3fb1267e3c3 | 33 | #define DHCP_NAK 6 |
cassyarduino | 0:e3fb1267e3c3 | 34 | #define DHCP_RELEASE 7 |
cassyarduino | 0:e3fb1267e3c3 | 35 | #define DHCP_INFORM 8 |
cassyarduino | 0:e3fb1267e3c3 | 36 | |
cassyarduino | 0:e3fb1267e3c3 | 37 | #define DHCP_HTYPE10MB 1 |
cassyarduino | 0:e3fb1267e3c3 | 38 | #define DHCP_HTYPE100MB 2 |
cassyarduino | 0:e3fb1267e3c3 | 39 | |
cassyarduino | 0:e3fb1267e3c3 | 40 | #define DHCP_HLENETHERNET 6 |
cassyarduino | 0:e3fb1267e3c3 | 41 | #define DHCP_HOPS 0 |
cassyarduino | 0:e3fb1267e3c3 | 42 | #define DHCP_SECS 0 |
cassyarduino | 0:e3fb1267e3c3 | 43 | |
cassyarduino | 0:e3fb1267e3c3 | 44 | #define MAGIC_COOKIE 0x63825363 |
cassyarduino | 0:e3fb1267e3c3 | 45 | #define MAX_DHCP_OPT 16 |
cassyarduino | 0:e3fb1267e3c3 | 46 | |
cassyarduino | 0:e3fb1267e3c3 | 47 | #define HOST_NAME "ENC28J" |
cassyarduino | 0:e3fb1267e3c3 | 48 | #define DEFAULT_LEASE (900) //default lease time in seconds |
cassyarduino | 38:645b253e6b50 | 49 | #define DHCP_TIMEOUT 60000 |
cassyarduino | 38:645b253e6b50 | 50 | #define DHCP_RESPONSE_TIMEOUT 4000 |
cassyarduino | 0:e3fb1267e3c3 | 51 | |
cassyarduino | 0:e3fb1267e3c3 | 52 | #define DHCP_CHECK_NONE (0) |
cassyarduino | 0:e3fb1267e3c3 | 53 | #define DHCP_CHECK_RENEW_FAIL (1) |
cassyarduino | 0:e3fb1267e3c3 | 54 | #define DHCP_CHECK_RENEW_OK (2) |
cassyarduino | 0:e3fb1267e3c3 | 55 | #define DHCP_CHECK_REBIND_FAIL (3) |
cassyarduino | 0:e3fb1267e3c3 | 56 | #define DHCP_CHECK_REBIND_OK (4) |
cassyarduino | 0:e3fb1267e3c3 | 57 | |
cassyarduino | 33:7ba5d53df0f2 | 58 | #if UIP_UDP |
cassyarduino | 33:7ba5d53df0f2 | 59 | #include "UIPUdp.h" |
cassyarduino | 33:7ba5d53df0f2 | 60 | |
cassyarduino | 0:e3fb1267e3c3 | 61 | enum |
cassyarduino | 0:e3fb1267e3c3 | 62 | { |
cassyarduino | 0:e3fb1267e3c3 | 63 | padOption = 0, |
cassyarduino | 0:e3fb1267e3c3 | 64 | subnetMask = 1, |
cassyarduino | 0:e3fb1267e3c3 | 65 | timerOffset = 2, |
cassyarduino | 0:e3fb1267e3c3 | 66 | routersOnSubnet = 3, |
cassyarduino | 0:e3fb1267e3c3 | 67 | /* timeServer = 4, |
cassyarduino | 0:e3fb1267e3c3 | 68 | nameServer = 5,*/ |
cassyarduino | 0:e3fb1267e3c3 | 69 | dns = 6, |
cassyarduino | 0:e3fb1267e3c3 | 70 | /*logServer = 7, |
cassyarduino | 0:e3fb1267e3c3 | 71 | cookieServer = 8, |
cassyarduino | 0:e3fb1267e3c3 | 72 | lprServer = 9, |
cassyarduino | 0:e3fb1267e3c3 | 73 | impressServer = 10, |
cassyarduino | 0:e3fb1267e3c3 | 74 | resourceLocationServer = 11,*/ |
cassyarduino | 0:e3fb1267e3c3 | 75 | hostName = 12, |
cassyarduino | 0:e3fb1267e3c3 | 76 | /*bootFileSize = 13, |
cassyarduino | 0:e3fb1267e3c3 | 77 | meritDumpFile = 14,*/ |
cassyarduino | 0:e3fb1267e3c3 | 78 | domainName = 15, |
cassyarduino | 0:e3fb1267e3c3 | 79 | /*swapServer = 16, |
cassyarduino | 0:e3fb1267e3c3 | 80 | rootPath = 17, |
cassyarduino | 0:e3fb1267e3c3 | 81 | extentionsPath = 18, |
cassyarduino | 0:e3fb1267e3c3 | 82 | IPforwarding = 19, |
cassyarduino | 0:e3fb1267e3c3 | 83 | nonLocalSourceRouting = 20, |
cassyarduino | 0:e3fb1267e3c3 | 84 | policyFilter = 21, |
cassyarduino | 0:e3fb1267e3c3 | 85 | maxDgramReasmSize = 22, |
cassyarduino | 0:e3fb1267e3c3 | 86 | defaultIPTTL = 23, |
cassyarduino | 0:e3fb1267e3c3 | 87 | pathMTUagingTimeout = 24, |
cassyarduino | 0:e3fb1267e3c3 | 88 | pathMTUplateauTable = 25, |
cassyarduino | 0:e3fb1267e3c3 | 89 | ifMTU = 26, |
cassyarduino | 0:e3fb1267e3c3 | 90 | allSubnetsLocal = 27, |
cassyarduino | 0:e3fb1267e3c3 | 91 | broadcastAddr = 28, |
cassyarduino | 0:e3fb1267e3c3 | 92 | performMaskDiscovery = 29, |
cassyarduino | 0:e3fb1267e3c3 | 93 | maskSupplier = 30, |
cassyarduino | 0:e3fb1267e3c3 | 94 | performRouterDiscovery = 31, |
cassyarduino | 0:e3fb1267e3c3 | 95 | routerSolicitationAddr = 32, |
cassyarduino | 0:e3fb1267e3c3 | 96 | staticRoute = 33, |
cassyarduino | 0:e3fb1267e3c3 | 97 | trailerEncapsulation = 34, |
cassyarduino | 0:e3fb1267e3c3 | 98 | arpCacheTimeout = 35, |
cassyarduino | 0:e3fb1267e3c3 | 99 | ethernetEncapsulation = 36, |
cassyarduino | 0:e3fb1267e3c3 | 100 | tcpDefaultTTL = 37, |
cassyarduino | 0:e3fb1267e3c3 | 101 | tcpKeepaliveInterval = 38, |
cassyarduino | 0:e3fb1267e3c3 | 102 | tcpKeepaliveGarbage = 39, |
cassyarduino | 0:e3fb1267e3c3 | 103 | nisDomainName = 40, |
cassyarduino | 0:e3fb1267e3c3 | 104 | nisServers = 41, |
cassyarduino | 0:e3fb1267e3c3 | 105 | ntpServers = 42, |
cassyarduino | 0:e3fb1267e3c3 | 106 | vendorSpecificInfo = 43, |
cassyarduino | 0:e3fb1267e3c3 | 107 | netBIOSnameServer = 44, |
cassyarduino | 0:e3fb1267e3c3 | 108 | netBIOSdgramDistServer = 45, |
cassyarduino | 0:e3fb1267e3c3 | 109 | netBIOSnodeType = 46, |
cassyarduino | 0:e3fb1267e3c3 | 110 | netBIOSscope = 47, |
cassyarduino | 0:e3fb1267e3c3 | 111 | xFontServer = 48, |
cassyarduino | 0:e3fb1267e3c3 | 112 | xDisplayManager = 49,*/ |
cassyarduino | 0:e3fb1267e3c3 | 113 | dhcpRequestedIPaddr = 50, |
cassyarduino | 0:e3fb1267e3c3 | 114 | dhcpIPaddrLeaseTime = 51, |
cassyarduino | 0:e3fb1267e3c3 | 115 | /*dhcpOptionOverload = 52,*/ |
cassyarduino | 0:e3fb1267e3c3 | 116 | dhcpMessageType = 53, |
cassyarduino | 0:e3fb1267e3c3 | 117 | dhcpServerIdentifier = 54, |
cassyarduino | 0:e3fb1267e3c3 | 118 | dhcpParamRequest = 55, |
cassyarduino | 0:e3fb1267e3c3 | 119 | /*dhcpMsg = 56, |
cassyarduino | 0:e3fb1267e3c3 | 120 | dhcpMaxMsgSize = 57,*/ |
cassyarduino | 0:e3fb1267e3c3 | 121 | dhcpT1value = 58, |
cassyarduino | 0:e3fb1267e3c3 | 122 | dhcpT2value = 59, |
cassyarduino | 0:e3fb1267e3c3 | 123 | /*dhcpClassIdentifier = 60,*/ |
cassyarduino | 0:e3fb1267e3c3 | 124 | dhcpClientIdentifier = 61, |
cassyarduino | 0:e3fb1267e3c3 | 125 | endOption = 255 |
cassyarduino | 0:e3fb1267e3c3 | 126 | }; |
cassyarduino | 0:e3fb1267e3c3 | 127 | |
cassyarduino | 0:e3fb1267e3c3 | 128 | typedef struct _RIP_MSG_FIXED |
cassyarduino | 0:e3fb1267e3c3 | 129 | { |
cassyarduino | 0:e3fb1267e3c3 | 130 | uint8_t op; |
cassyarduino | 0:e3fb1267e3c3 | 131 | uint8_t htype; |
cassyarduino | 0:e3fb1267e3c3 | 132 | uint8_t hlen; |
cassyarduino | 0:e3fb1267e3c3 | 133 | uint8_t hops; |
cassyarduino | 0:e3fb1267e3c3 | 134 | uint32_t xid; |
cassyarduino | 0:e3fb1267e3c3 | 135 | uint16_t secs; |
cassyarduino | 0:e3fb1267e3c3 | 136 | uint16_t flags; |
cassyarduino | 0:e3fb1267e3c3 | 137 | uint8_t ciaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 138 | uint8_t yiaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 139 | uint8_t siaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 140 | uint8_t giaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 141 | uint8_t chaddr[6]; |
cassyarduino | 0:e3fb1267e3c3 | 142 | }RIP_MSG_FIXED; |
cassyarduino | 0:e3fb1267e3c3 | 143 | |
cassyarduino | 38:645b253e6b50 | 144 | typedef struct |
cassyarduino | 38:645b253e6b50 | 145 | { |
cassyarduino | 38:645b253e6b50 | 146 | uint8_t LocalIp[4]; |
cassyarduino | 38:645b253e6b50 | 147 | uint8_t SubnetMask[4]; |
cassyarduino | 38:645b253e6b50 | 148 | uint8_t GatewayIp[4]; |
cassyarduino | 38:645b253e6b50 | 149 | uint8_t DhcpServerIp[4]; |
cassyarduino | 38:645b253e6b50 | 150 | uint8_t DnsServerIp[4]; |
cassyarduino | 38:645b253e6b50 | 151 | } TIPV4Struct; |
cassyarduino | 38:645b253e6b50 | 152 | |
cassyarduino | 0:e3fb1267e3c3 | 153 | class DhcpClass { |
cassyarduino | 0:e3fb1267e3c3 | 154 | private: |
cassyarduino | 0:e3fb1267e3c3 | 155 | uint32_t _dhcpInitialTransactionId; |
cassyarduino | 0:e3fb1267e3c3 | 156 | uint32_t _dhcpTransactionId; |
cassyarduino | 0:e3fb1267e3c3 | 157 | uint8_t _dhcpMacAddr[6]; |
cassyarduino | 38:645b253e6b50 | 158 | TIPV4Struct _dhcpipv4struct; |
cassyarduino | 0:e3fb1267e3c3 | 159 | uint32_t _dhcpLeaseTime; |
cassyarduino | 0:e3fb1267e3c3 | 160 | uint32_t _dhcpT1, _dhcpT2; |
cassyarduino | 0:e3fb1267e3c3 | 161 | signed long _renewInSec; |
cassyarduino | 0:e3fb1267e3c3 | 162 | signed long _rebindInSec; |
cassyarduino | 0:e3fb1267e3c3 | 163 | signed long _lastCheck; |
cassyarduino | 0:e3fb1267e3c3 | 164 | unsigned long _secTimeout; |
cassyarduino | 0:e3fb1267e3c3 | 165 | uint8_t _dhcp_state; |
cassyarduino | 0:e3fb1267e3c3 | 166 | UIPUDP _dhcpUdpSocket; |
cassyarduino | 0:e3fb1267e3c3 | 167 | |
cassyarduino | 0:e3fb1267e3c3 | 168 | int request_DHCP_lease(void); |
cassyarduino | 0:e3fb1267e3c3 | 169 | void reset_DHCP_lease(void); |
cassyarduino | 0:e3fb1267e3c3 | 170 | void presend_DHCP(void); |
cassyarduino | 0:e3fb1267e3c3 | 171 | void send_DHCP_MESSAGE(uint8_t, uint16_t); |
cassyarduino | 0:e3fb1267e3c3 | 172 | void printByte(char *, uint8_t); |
cassyarduino | 0:e3fb1267e3c3 | 173 | |
cassyarduino | 38:645b253e6b50 | 174 | uint8_t parseDHCPResponse(uint32_t& transactionId); |
cassyarduino | 0:e3fb1267e3c3 | 175 | public: |
cassyarduino | 0:e3fb1267e3c3 | 176 | IPAddress getLocalIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 177 | IPAddress getSubnetMask(void); |
cassyarduino | 0:e3fb1267e3c3 | 178 | IPAddress getGatewayIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 179 | IPAddress getDhcpServerIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 180 | IPAddress getDnsServerIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 181 | |
cassyarduino | 38:645b253e6b50 | 182 | int beginWithDHCP(uint8_t *); |
cassyarduino | 0:e3fb1267e3c3 | 183 | int checkLease(void); |
cassyarduino | 0:e3fb1267e3c3 | 184 | }; |
cassyarduino | 0:e3fb1267e3c3 | 185 | #endif |
cassyarduino | 33:7ba5d53df0f2 | 186 | #endif |