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@0:e3fb1267e3c3, 2016-12-21 (annotated)
- Committer:
- cassyarduino
- Date:
- Wed Dec 21 16:58:10 2016 +0100
- Revision:
- 0:e3fb1267e3c3
- Child:
- 33:7ba5d53df0f2
initial release
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 | 0:e3fb1267e3c3 | 7 | #include "UIPUdp.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 | 0:e3fb1267e3c3 | 49 | |
cassyarduino | 0:e3fb1267e3c3 | 50 | #define DHCP_CHECK_NONE (0) |
cassyarduino | 0:e3fb1267e3c3 | 51 | #define DHCP_CHECK_RENEW_FAIL (1) |
cassyarduino | 0:e3fb1267e3c3 | 52 | #define DHCP_CHECK_RENEW_OK (2) |
cassyarduino | 0:e3fb1267e3c3 | 53 | #define DHCP_CHECK_REBIND_FAIL (3) |
cassyarduino | 0:e3fb1267e3c3 | 54 | #define DHCP_CHECK_REBIND_OK (4) |
cassyarduino | 0:e3fb1267e3c3 | 55 | |
cassyarduino | 0:e3fb1267e3c3 | 56 | enum |
cassyarduino | 0:e3fb1267e3c3 | 57 | { |
cassyarduino | 0:e3fb1267e3c3 | 58 | padOption = 0, |
cassyarduino | 0:e3fb1267e3c3 | 59 | subnetMask = 1, |
cassyarduino | 0:e3fb1267e3c3 | 60 | timerOffset = 2, |
cassyarduino | 0:e3fb1267e3c3 | 61 | routersOnSubnet = 3, |
cassyarduino | 0:e3fb1267e3c3 | 62 | /* timeServer = 4, |
cassyarduino | 0:e3fb1267e3c3 | 63 | nameServer = 5,*/ |
cassyarduino | 0:e3fb1267e3c3 | 64 | dns = 6, |
cassyarduino | 0:e3fb1267e3c3 | 65 | /*logServer = 7, |
cassyarduino | 0:e3fb1267e3c3 | 66 | cookieServer = 8, |
cassyarduino | 0:e3fb1267e3c3 | 67 | lprServer = 9, |
cassyarduino | 0:e3fb1267e3c3 | 68 | impressServer = 10, |
cassyarduino | 0:e3fb1267e3c3 | 69 | resourceLocationServer = 11,*/ |
cassyarduino | 0:e3fb1267e3c3 | 70 | hostName = 12, |
cassyarduino | 0:e3fb1267e3c3 | 71 | /*bootFileSize = 13, |
cassyarduino | 0:e3fb1267e3c3 | 72 | meritDumpFile = 14,*/ |
cassyarduino | 0:e3fb1267e3c3 | 73 | domainName = 15, |
cassyarduino | 0:e3fb1267e3c3 | 74 | /*swapServer = 16, |
cassyarduino | 0:e3fb1267e3c3 | 75 | rootPath = 17, |
cassyarduino | 0:e3fb1267e3c3 | 76 | extentionsPath = 18, |
cassyarduino | 0:e3fb1267e3c3 | 77 | IPforwarding = 19, |
cassyarduino | 0:e3fb1267e3c3 | 78 | nonLocalSourceRouting = 20, |
cassyarduino | 0:e3fb1267e3c3 | 79 | policyFilter = 21, |
cassyarduino | 0:e3fb1267e3c3 | 80 | maxDgramReasmSize = 22, |
cassyarduino | 0:e3fb1267e3c3 | 81 | defaultIPTTL = 23, |
cassyarduino | 0:e3fb1267e3c3 | 82 | pathMTUagingTimeout = 24, |
cassyarduino | 0:e3fb1267e3c3 | 83 | pathMTUplateauTable = 25, |
cassyarduino | 0:e3fb1267e3c3 | 84 | ifMTU = 26, |
cassyarduino | 0:e3fb1267e3c3 | 85 | allSubnetsLocal = 27, |
cassyarduino | 0:e3fb1267e3c3 | 86 | broadcastAddr = 28, |
cassyarduino | 0:e3fb1267e3c3 | 87 | performMaskDiscovery = 29, |
cassyarduino | 0:e3fb1267e3c3 | 88 | maskSupplier = 30, |
cassyarduino | 0:e3fb1267e3c3 | 89 | performRouterDiscovery = 31, |
cassyarduino | 0:e3fb1267e3c3 | 90 | routerSolicitationAddr = 32, |
cassyarduino | 0:e3fb1267e3c3 | 91 | staticRoute = 33, |
cassyarduino | 0:e3fb1267e3c3 | 92 | trailerEncapsulation = 34, |
cassyarduino | 0:e3fb1267e3c3 | 93 | arpCacheTimeout = 35, |
cassyarduino | 0:e3fb1267e3c3 | 94 | ethernetEncapsulation = 36, |
cassyarduino | 0:e3fb1267e3c3 | 95 | tcpDefaultTTL = 37, |
cassyarduino | 0:e3fb1267e3c3 | 96 | tcpKeepaliveInterval = 38, |
cassyarduino | 0:e3fb1267e3c3 | 97 | tcpKeepaliveGarbage = 39, |
cassyarduino | 0:e3fb1267e3c3 | 98 | nisDomainName = 40, |
cassyarduino | 0:e3fb1267e3c3 | 99 | nisServers = 41, |
cassyarduino | 0:e3fb1267e3c3 | 100 | ntpServers = 42, |
cassyarduino | 0:e3fb1267e3c3 | 101 | vendorSpecificInfo = 43, |
cassyarduino | 0:e3fb1267e3c3 | 102 | netBIOSnameServer = 44, |
cassyarduino | 0:e3fb1267e3c3 | 103 | netBIOSdgramDistServer = 45, |
cassyarduino | 0:e3fb1267e3c3 | 104 | netBIOSnodeType = 46, |
cassyarduino | 0:e3fb1267e3c3 | 105 | netBIOSscope = 47, |
cassyarduino | 0:e3fb1267e3c3 | 106 | xFontServer = 48, |
cassyarduino | 0:e3fb1267e3c3 | 107 | xDisplayManager = 49,*/ |
cassyarduino | 0:e3fb1267e3c3 | 108 | dhcpRequestedIPaddr = 50, |
cassyarduino | 0:e3fb1267e3c3 | 109 | dhcpIPaddrLeaseTime = 51, |
cassyarduino | 0:e3fb1267e3c3 | 110 | /*dhcpOptionOverload = 52,*/ |
cassyarduino | 0:e3fb1267e3c3 | 111 | dhcpMessageType = 53, |
cassyarduino | 0:e3fb1267e3c3 | 112 | dhcpServerIdentifier = 54, |
cassyarduino | 0:e3fb1267e3c3 | 113 | dhcpParamRequest = 55, |
cassyarduino | 0:e3fb1267e3c3 | 114 | /*dhcpMsg = 56, |
cassyarduino | 0:e3fb1267e3c3 | 115 | dhcpMaxMsgSize = 57,*/ |
cassyarduino | 0:e3fb1267e3c3 | 116 | dhcpT1value = 58, |
cassyarduino | 0:e3fb1267e3c3 | 117 | dhcpT2value = 59, |
cassyarduino | 0:e3fb1267e3c3 | 118 | /*dhcpClassIdentifier = 60,*/ |
cassyarduino | 0:e3fb1267e3c3 | 119 | dhcpClientIdentifier = 61, |
cassyarduino | 0:e3fb1267e3c3 | 120 | endOption = 255 |
cassyarduino | 0:e3fb1267e3c3 | 121 | }; |
cassyarduino | 0:e3fb1267e3c3 | 122 | |
cassyarduino | 0:e3fb1267e3c3 | 123 | typedef struct _RIP_MSG_FIXED |
cassyarduino | 0:e3fb1267e3c3 | 124 | { |
cassyarduino | 0:e3fb1267e3c3 | 125 | uint8_t op; |
cassyarduino | 0:e3fb1267e3c3 | 126 | uint8_t htype; |
cassyarduino | 0:e3fb1267e3c3 | 127 | uint8_t hlen; |
cassyarduino | 0:e3fb1267e3c3 | 128 | uint8_t hops; |
cassyarduino | 0:e3fb1267e3c3 | 129 | uint32_t xid; |
cassyarduino | 0:e3fb1267e3c3 | 130 | uint16_t secs; |
cassyarduino | 0:e3fb1267e3c3 | 131 | uint16_t flags; |
cassyarduino | 0:e3fb1267e3c3 | 132 | uint8_t ciaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 133 | uint8_t yiaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 134 | uint8_t siaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 135 | uint8_t giaddr[4]; |
cassyarduino | 0:e3fb1267e3c3 | 136 | uint8_t chaddr[6]; |
cassyarduino | 0:e3fb1267e3c3 | 137 | }RIP_MSG_FIXED; |
cassyarduino | 0:e3fb1267e3c3 | 138 | |
cassyarduino | 0:e3fb1267e3c3 | 139 | class DhcpClass { |
cassyarduino | 0:e3fb1267e3c3 | 140 | private: |
cassyarduino | 0:e3fb1267e3c3 | 141 | uint32_t _dhcpInitialTransactionId; |
cassyarduino | 0:e3fb1267e3c3 | 142 | uint32_t _dhcpTransactionId; |
cassyarduino | 0:e3fb1267e3c3 | 143 | uint8_t _dhcpMacAddr[6]; |
cassyarduino | 0:e3fb1267e3c3 | 144 | uint8_t _dhcpLocalIp[4]; |
cassyarduino | 0:e3fb1267e3c3 | 145 | uint8_t _dhcpSubnetMask[4]; |
cassyarduino | 0:e3fb1267e3c3 | 146 | uint8_t _dhcpGatewayIp[4]; |
cassyarduino | 0:e3fb1267e3c3 | 147 | uint8_t _dhcpDhcpServerIp[4]; |
cassyarduino | 0:e3fb1267e3c3 | 148 | uint8_t _dhcpDnsServerIp[4]; |
cassyarduino | 0:e3fb1267e3c3 | 149 | uint32_t _dhcpLeaseTime; |
cassyarduino | 0:e3fb1267e3c3 | 150 | uint32_t _dhcpT1, _dhcpT2; |
cassyarduino | 0:e3fb1267e3c3 | 151 | signed long _renewInSec; |
cassyarduino | 0:e3fb1267e3c3 | 152 | signed long _rebindInSec; |
cassyarduino | 0:e3fb1267e3c3 | 153 | signed long _lastCheck; |
cassyarduino | 0:e3fb1267e3c3 | 154 | unsigned long _timeout; |
cassyarduino | 0:e3fb1267e3c3 | 155 | unsigned long _responseTimeout; |
cassyarduino | 0:e3fb1267e3c3 | 156 | unsigned long _secTimeout; |
cassyarduino | 0:e3fb1267e3c3 | 157 | uint8_t _dhcp_state; |
cassyarduino | 0:e3fb1267e3c3 | 158 | UIPUDP _dhcpUdpSocket; |
cassyarduino | 0:e3fb1267e3c3 | 159 | |
cassyarduino | 0:e3fb1267e3c3 | 160 | int request_DHCP_lease(void); |
cassyarduino | 0:e3fb1267e3c3 | 161 | void reset_DHCP_lease(void); |
cassyarduino | 0:e3fb1267e3c3 | 162 | void presend_DHCP(void); |
cassyarduino | 0:e3fb1267e3c3 | 163 | void send_DHCP_MESSAGE(uint8_t, uint16_t); |
cassyarduino | 0:e3fb1267e3c3 | 164 | void printByte(char *, uint8_t); |
cassyarduino | 0:e3fb1267e3c3 | 165 | |
cassyarduino | 0:e3fb1267e3c3 | 166 | uint8_t parseDHCPResponse(unsigned long responseTimeout, uint32_t& transactionId); |
cassyarduino | 0:e3fb1267e3c3 | 167 | public: |
cassyarduino | 0:e3fb1267e3c3 | 168 | IPAddress getLocalIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 169 | IPAddress getSubnetMask(void); |
cassyarduino | 0:e3fb1267e3c3 | 170 | IPAddress getGatewayIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 171 | IPAddress getDhcpServerIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 172 | IPAddress getDnsServerIp(void); |
cassyarduino | 0:e3fb1267e3c3 | 173 | |
cassyarduino | 0:e3fb1267e3c3 | 174 | int beginWithDHCP(uint8_t *, unsigned long timeout = 60000, unsigned long responseTimeout = 4000); |
cassyarduino | 0:e3fb1267e3c3 | 175 | int checkLease(void); |
cassyarduino | 0:e3fb1267e3c3 | 176 | }; |
cassyarduino | 0:e3fb1267e3c3 | 177 | |
cassyarduino | 0:e3fb1267e3c3 | 178 | #endif |