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:
Wed Dec 21 16:58:10 2016 +0100
Revision:
0:e3fb1267e3c3
Child:
33:7ba5d53df0f2
initial release

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