WIZNet W5500 with additional enhancements

Fork of WIZnetInterface by WIZnet

Socket/DHCPClient.h

Committer:
Helmut Tschemernjak
Date:
2017-10-12
Revision:
38:67e763cdde02
Parent:
36:0ba2e8d5274a

File content as of revision 38:67e763cdde02:

// DHCPClient.h 2013/4/10
#ifndef DHCPCLIENT_H
#define DHCPCLIENT_H
#include "eth_arch.h"
#include "UDPSocket.h"

#define DHCP_OFFSET_OP 0
#define DHCP_OFFSET_XID 4
#define DHCP_OFFSET_YIADDR 16
#define DHCP_OFFSET_SIADDR 20
#define DHCP_OFFSET_OPTIONS 240
#define DHCP_MAX_PACKET_SIZE 600

#define DHCP_SERVER_PORT 67
#define DHCP_CLIENT_PORT 68

// DHCP Message Type
#define DHCPDISCOVER 1
#define DHCPOFFER    2
#define DHCPREQUEST  3
#define DHCPDECLINE  4
#define DHCPACK      5
#define DHCPNAK      6
#define DHCPRELEASE  7
#define DHCPINFORM   8
#define DHCP_MAGIC_COOKIE	0x63825363
#define OPT_PAD				0
#define OPT_SUBNET_MASK			1
#define OPT_TIME_OFFSET			2
#define OPT_ROUTER			3
#define OPT_TIME_SERVER			4
#define OPT_IEN116_NAME_SERVER		5
#define OPT_DNS				6
#define OPT_LOG_SERVER			7
#define OPT_COOKIE_SERVER		8
#define OPT_LPR_SERVER			9
#define OPT_IMPRESS_SERVER		10
#define OPT_RESOURCE_LOC_SERVER		11
#define OPT_HOSTNAME			12
#define OPT_BOOTFILE_SIZE		13
#define OPT_MERIT_DUMP			14
#define OPT_DOMAIN_NAME			15
#define OPT_SWAP_SERVER			16
#define OPT_ROOT_PATH			17
#define OPT_EXTENSIONS_PATH		18
#define OPT_IP_FORWARDING		19
#define OPT_NONLOCAL_SOURCE_ROUTING	20
#define OPT_POLICY_FILTER		21
#define OPT_MAX_DATAGRAM_REASS	22
#define OPT_DEFAULT_IP_TTL		23
#define OPT_PATH_MTU_AGING_TIMEOUT	24
#define OPT_PATH_MTU_PLATEAU_TABLE	25
#define OPT_INTERFACE_MTU		26
#define OPT_ALL_SUBNETS_ARE_LOCAL	27
#define OPT_BROADCAST_ADDR		28
#define OPT_STATIC_ROUTE		33
#define OPT_VENDOR			43
#define OPT_NETBIOS_NAME_SERVER	44
#define OPT_NETBIOS_DATA_DIST	45
#define OPT_NETBIOS_NODE_TYPE	46
#define OPT_NETBIOS_SCOPE		47
#define OPT_IP_ADDR_REQ			50
#define OPT_ADDR_LEASE_TIME		51
#define OPT_DHCP_MESSAGE		53
#define OPT_SERVER_IDENT		54
#define OPT_PARAMETER_REQ		55
#define OPT_RENEWAL_TIME		58
#define OPT_REBINDING_TIME		59
#define OPT_CLIENT_IDENT		61
#define OPT_TFTP_SERVER_NAME		66
#define OPT_BOOTFILE_NAME		67
#define OPT_LDAP_URL			95	/* from draft RFC */
#define OPT_DOMAIN_SEARCH		119	/* from draft RFC 3397 */

/* site specific options */
#define SITE_HD				252
#define SITE_BF				253
#define SITE_SA				254
#define OPT_END				255

class DHCPClient {
public:
    DHCPClient();
    ~DHCPClient();
    int setup(const char *hostnane, int timeout_ms = 15*1000);
    uint8_t chaddr[6]; // MAC
    uint8_t yiaddr[4]; // IP
    uint8_t siaddr[4]; // DHCP server
    uint8_t dnsaddr[4]; // DNS
    uint8_t gateway[4];
    uint8_t netmask[4];
    uint8_t timesrv[4];
    uint8_t leaseTime[4];
    char *domainName;
private:
    int discover();
    int request();
    int offer(uint8_t buf[], int size);
    void add_buf(uint8_t* buf, int len);
    void fill_buf(int len, uint8_t data = 0x00);
    void add_buf(uint8_t c);
    void add_option(uint8_t code, uint8_t* buf = NULL, int len = 0);
    bool verify(uint8_t buf[], int len);
    void callback();
    UDPSocket* m_udp;
    Endpoint m_server;
    uint8_t xid[4];
    bool exit_flag;
    Timer m_interval;
    int m_retry;
    uint8_t m_buf[DHCP_MAX_PACKET_SIZE];
    int m_pos;
    const char *_hostname;
    WIZnet_Chip* eth;
};
#endif //DHCPCLIENT_H