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 Feb 14 14:16:14 2017 +0100
Revision:
33:7ba5d53df0f2
Parent:
0:e3fb1267e3c3
Child:
38:645b253e6b50
Changes

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