WIZNet W5500 with additional enhancements

Fork of WIZnetInterface by WIZnet

Committer:
Helmut Tschemernjak
Date:
Wed Oct 11 11:18:41 2017 +0200
Revision:
36:0ba2e8d5274a
Parent:
35:fe3028eda085
More DHCP cleanup, added precise DHCP packet construction
DHCP hostname support (added to the DHCP request) which
allows dynamic DNS updates and routers will show the client name.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Soohwan Kim 0:6f28332c466f 1 // DHCPClient.h 2013/4/10
Soohwan Kim 0:6f28332c466f 2 #ifndef DHCPCLIENT_H
Soohwan Kim 0:6f28332c466f 3 #define DHCPCLIENT_H
Soohwan Kim 0:6f28332c466f 4 #include "eth_arch.h"
Soohwan Kim 0:6f28332c466f 5 #include "UDPSocket.h"
Soohwan Kim 0:6f28332c466f 6
Soohwan Kim 0:6f28332c466f 7 #define DHCP_OFFSET_OP 0
Soohwan Kim 0:6f28332c466f 8 #define DHCP_OFFSET_XID 4
Soohwan Kim 0:6f28332c466f 9 #define DHCP_OFFSET_YIADDR 16
Soohwan Kim 0:6f28332c466f 10 #define DHCP_OFFSET_SIADDR 20
Soohwan Kim 0:6f28332c466f 11 #define DHCP_OFFSET_OPTIONS 240
Soohwan Kim 0:6f28332c466f 12 #define DHCP_MAX_PACKET_SIZE 600
Soohwan Kim 0:6f28332c466f 13
Helmut Tschemernjak 35:fe3028eda085 14 #define DHCP_SERVER_PORT 67
Helmut Tschemernjak 35:fe3028eda085 15 #define DHCP_CLIENT_PORT 68
Helmut Tschemernjak 35:fe3028eda085 16
Soohwan Kim 0:6f28332c466f 17 // DHCP Message Type
Soohwan Kim 0:6f28332c466f 18 #define DHCPDISCOVER 1
Soohwan Kim 0:6f28332c466f 19 #define DHCPOFFER 2
Soohwan Kim 0:6f28332c466f 20 #define DHCPREQUEST 3
Soohwan Kim 0:6f28332c466f 21 #define DHCPDECLINE 4
Soohwan Kim 0:6f28332c466f 22 #define DHCPACK 5
Soohwan Kim 0:6f28332c466f 23 #define DHCPNAK 6
Soohwan Kim 0:6f28332c466f 24 #define DHCPRELEASE 7
Soohwan Kim 0:6f28332c466f 25 #define DHCPINFORM 8
Helmut Tschemernjak 35:fe3028eda085 26 #define DHCP_MAGIC_COOKIE 0x63825363
Helmut Tschemernjak 35:fe3028eda085 27 #define OPT_PAD 0
Helmut Tschemernjak 35:fe3028eda085 28 #define OPT_SUBNET_MASK 1
Helmut Tschemernjak 35:fe3028eda085 29 #define OPT_TIME_OFFSET 2
Helmut Tschemernjak 35:fe3028eda085 30 #define OPT_ROUTER 3
Helmut Tschemernjak 35:fe3028eda085 31 #define OPT_TIME_SERVER 4
Helmut Tschemernjak 35:fe3028eda085 32 #define OPT_IEN116_NAME_SERVER 5
Helmut Tschemernjak 35:fe3028eda085 33 #define OPT_DNS 6
Helmut Tschemernjak 35:fe3028eda085 34 #define OPT_LOG_SERVER 7
Helmut Tschemernjak 35:fe3028eda085 35 #define OPT_COOKIE_SERVER 8
Helmut Tschemernjak 35:fe3028eda085 36 #define OPT_LPR_SERVER 9
Helmut Tschemernjak 35:fe3028eda085 37 #define OPT_IMPRESS_SERVER 10
Helmut Tschemernjak 35:fe3028eda085 38 #define OPT_RESOURCE_LOC_SERVER 11
Helmut Tschemernjak 35:fe3028eda085 39 #define OPT_HOSTNAME 12
Helmut Tschemernjak 35:fe3028eda085 40 #define OPT_BOOTFILE_SIZE 13
Helmut Tschemernjak 35:fe3028eda085 41 #define OPT_MERIT_DUMP 14
Helmut Tschemernjak 35:fe3028eda085 42 #define OPT_DOMAIN_NAME 15
Helmut Tschemernjak 35:fe3028eda085 43 #define OPT_SWAP_SERVER 16
Helmut Tschemernjak 35:fe3028eda085 44 #define OPT_ROOT_PATH 17
Helmut Tschemernjak 35:fe3028eda085 45 #define OPT_EXTENSIONS_PATH 18
Helmut Tschemernjak 35:fe3028eda085 46 #define OPT_IP_FORWARDING 19
Helmut Tschemernjak 35:fe3028eda085 47 #define OPT_NONLOCAL_SOURCE_ROUTING 20
Helmut Tschemernjak 35:fe3028eda085 48 #define OPT_POLICY_FILTER 21
Helmut Tschemernjak 35:fe3028eda085 49 #define OPT_MAX_DATAGRAM_REASS 22
Helmut Tschemernjak 35:fe3028eda085 50 #define OPT_DEFAULT_IP_TTL 23
Helmut Tschemernjak 35:fe3028eda085 51 #define OPT_PATH_MTU_AGING_TIMEOUT 24
Helmut Tschemernjak 35:fe3028eda085 52 #define OPT_PATH_MTU_PLATEAU_TABLE 25
Helmut Tschemernjak 35:fe3028eda085 53 #define OPT_INTERFACE_MTU 26
Helmut Tschemernjak 35:fe3028eda085 54 #define OPT_ALL_SUBNETS_ARE_LOCAL 27
Helmut Tschemernjak 35:fe3028eda085 55 #define OPT_BROADCAST_ADDR 28
Helmut Tschemernjak 35:fe3028eda085 56 #define OPT_STATIC_ROUTE 33
Helmut Tschemernjak 35:fe3028eda085 57 #define OPT_VENDOR 43
Helmut Tschemernjak 35:fe3028eda085 58 #define OPT_NETBIOS_NAME_SERVER 44
Helmut Tschemernjak 35:fe3028eda085 59 #define OPT_NETBIOS_DATA_DIST 45
Helmut Tschemernjak 35:fe3028eda085 60 #define OPT_NETBIOS_NODE_TYPE 46
Helmut Tschemernjak 35:fe3028eda085 61 #define OPT_NETBIOS_SCOPE 47
Helmut Tschemernjak 35:fe3028eda085 62 #define OPT_IP_ADDR_REQ 50
Helmut Tschemernjak 35:fe3028eda085 63 #define OPT_ADDR_LEASE_TIME 51
Helmut Tschemernjak 35:fe3028eda085 64 #define OPT_DHCP_MESSAGE 53
Helmut Tschemernjak 35:fe3028eda085 65 #define OPT_SERVER_IDENT 54
Helmut Tschemernjak 35:fe3028eda085 66 #define OPT_PARAMETER_REQ 55
Helmut Tschemernjak 35:fe3028eda085 67 #define OPT_RENEWAL_TIME 58
Helmut Tschemernjak 35:fe3028eda085 68 #define OPT_REBINDING_TIME 59
Helmut Tschemernjak 35:fe3028eda085 69 #define OPT_CLIENT_IDENT 61
Helmut Tschemernjak 35:fe3028eda085 70 #define OPT_TFTP_SERVER_NAME 66
Helmut Tschemernjak 35:fe3028eda085 71 #define OPT_BOOTFILE_NAME 67
Helmut Tschemernjak 35:fe3028eda085 72 #define OPT_LDAP_URL 95 /* from draft RFC */
Helmut Tschemernjak 35:fe3028eda085 73 #define OPT_DOMAIN_SEARCH 119 /* from draft RFC 3397 */
Helmut Tschemernjak 35:fe3028eda085 74
Helmut Tschemernjak 35:fe3028eda085 75 /* site specific options */
Helmut Tschemernjak 35:fe3028eda085 76 #define SITE_HD 252
Helmut Tschemernjak 35:fe3028eda085 77 #define SITE_BF 253
Helmut Tschemernjak 35:fe3028eda085 78 #define SITE_SA 254
Helmut Tschemernjak 35:fe3028eda085 79 #define OPT_END 255
Soohwan Kim 0:6f28332c466f 80
Soohwan Kim 0:6f28332c466f 81 class DHCPClient {
Soohwan Kim 0:6f28332c466f 82 public:
Soohwan Kim 0:6f28332c466f 83 DHCPClient();
Helmut Tschemernjak 35:fe3028eda085 84 ~DHCPClient();
Helmut Tschemernjak 36:0ba2e8d5274a 85 int setup(const char *hostnane, int timeout_ms = 15*1000);
Soohwan Kim 0:6f28332c466f 86 uint8_t chaddr[6]; // MAC
Soohwan Kim 0:6f28332c466f 87 uint8_t yiaddr[4]; // IP
Helmut Tschemernjak 35:fe3028eda085 88 uint8_t siaddr[4]; // DHCP server
Soohwan Kim 0:6f28332c466f 89 uint8_t dnsaddr[4]; // DNS
Soohwan Kim 0:6f28332c466f 90 uint8_t gateway[4];
Soohwan Kim 0:6f28332c466f 91 uint8_t netmask[4];
Helmut Tschemernjak 35:fe3028eda085 92 uint8_t timesrv[4];
Helmut Tschemernjak 35:fe3028eda085 93 uint8_t leaseTime[4];
Helmut Tschemernjak 35:fe3028eda085 94 char *domainName;
Soohwan Kim 0:6f28332c466f 95 private:
Soohwan Kim 0:6f28332c466f 96 int discover();
Soohwan Kim 0:6f28332c466f 97 int request();
Soohwan Kim 0:6f28332c466f 98 int offer(uint8_t buf[], int size);
Soohwan Kim 0:6f28332c466f 99 void add_buf(uint8_t* buf, int len);
Soohwan Kim 0:6f28332c466f 100 void fill_buf(int len, uint8_t data = 0x00);
Soohwan Kim 0:6f28332c466f 101 void add_buf(uint8_t c);
Soohwan Kim 0:6f28332c466f 102 void add_option(uint8_t code, uint8_t* buf = NULL, int len = 0);
Soohwan Kim 0:6f28332c466f 103 bool verify(uint8_t buf[], int len);
Soohwan Kim 0:6f28332c466f 104 void callback();
Soohwan Kim 0:6f28332c466f 105 UDPSocket* m_udp;
Soohwan Kim 0:6f28332c466f 106 Endpoint m_server;
Soohwan Kim 0:6f28332c466f 107 uint8_t xid[4];
Soohwan Kim 0:6f28332c466f 108 bool exit_flag;
Soohwan Kim 0:6f28332c466f 109 Timer m_interval;
Soohwan Kim 0:6f28332c466f 110 int m_retry;
Soohwan Kim 0:6f28332c466f 111 uint8_t m_buf[DHCP_MAX_PACKET_SIZE];
Soohwan Kim 0:6f28332c466f 112 int m_pos;
Helmut Tschemernjak 36:0ba2e8d5274a 113 const char *_hostname;
Soohwan Kim 0:6f28332c466f 114 WIZnet_Chip* eth;
Soohwan Kim 0:6f28332c466f 115 };
Soohwan Kim 0:6f28332c466f 116 #endif //DHCPCLIENT_H
Soohwan Kim 0:6f28332c466f 117