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/

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?

UserRevisionLine numberNew 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