DHCP Client for WIZ820io(W5200)

Dependencies:   EthernetNetIf mbed

Committer:
va009039
Date:
Tue Apr 10 03:38:22 2012 +0000
Revision:
0:db4242c89949

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:db4242c89949 1 // DHCPClient.h 2012/4/10
va009039 0:db4242c89949 2 #ifndef DHCPCLIENT_H
va009039 0:db4242c89949 3 #define DHCPCLIENT_H
va009039 0:db4242c89949 4 #include "UDPSocket.h"
va009039 0:db4242c89949 5
va009039 0:db4242c89949 6 //#define DHCP_VERBOSE
va009039 0:db4242c89949 7
va009039 0:db4242c89949 8 #define DHCP_OFFSET_OP 0
va009039 0:db4242c89949 9 #define DHCP_OFFSET_XID 4
va009039 0:db4242c89949 10 #define DHCP_OFFSET_YIADDR 16
va009039 0:db4242c89949 11 #define DHCP_OFFSET_CHADDR 28
va009039 0:db4242c89949 12 #define DHCP_OFFSET_MAGIC_COOKIE 236
va009039 0:db4242c89949 13 #define DHCP_OFFSET_OPTIONS 240
va009039 0:db4242c89949 14 #define DHCP_MAX_PACKET_SIZE 600
va009039 0:db4242c89949 15
va009039 0:db4242c89949 16 extern void _DHCP_OnEvent(UDPSocketEvent e); // DHCPClient.cpp
va009039 0:db4242c89949 17
va009039 0:db4242c89949 18 class DHCPClient {
va009039 0:db4242c89949 19 int discover(uint8_t buf[], int size) {
va009039 0:db4242c89949 20 memset(buf, 0x00, size);
va009039 0:db4242c89949 21 const uint8_t headers[] = {0x01,0x01,0x06,0x00,
va009039 0:db4242c89949 22 0x12,0x34,0x56,0x78}; // xid
va009039 0:db4242c89949 23 memcpy(buf, headers, sizeof(headers));
va009039 0:db4242c89949 24 int t = clock();
va009039 0:db4242c89949 25 xid[0] = t<<24;
va009039 0:db4242c89949 26 xid[1] = t<<16;
va009039 0:db4242c89949 27 xid[2] = t<<8;
va009039 0:db4242c89949 28 xid[3] = t;
va009039 0:db4242c89949 29 memcpy(buf+DHCP_OFFSET_XID, xid, 4);
va009039 0:db4242c89949 30 W5100.getMACAddress(buf+DHCP_OFFSET_CHADDR);
va009039 0:db4242c89949 31 const uint8_t options[] = {0x63,0x82,0x53,0x63, // magic cookie
va009039 0:db4242c89949 32 0x35,0x01,0x01, // DHCP DISCOVER
va009039 0:db4242c89949 33 0xff};
va009039 0:db4242c89949 34 memcpy(buf+DHCP_OFFSET_MAGIC_COOKIE, options, sizeof(options));
va009039 0:db4242c89949 35 //printHex((u8*)buf, 236);
va009039 0:db4242c89949 36 uint8_t ip[4] = {0,0,0,0};
va009039 0:db4242c89949 37 W5100.setIPAddress(ip);
va009039 0:db4242c89949 38 return DHCP_OFFSET_MAGIC_COOKIE + sizeof(options);
va009039 0:db4242c89949 39 }
va009039 0:db4242c89949 40
va009039 0:db4242c89949 41 int request(uint8_t buf[], int size) {
va009039 0:db4242c89949 42 memset(buf, 0x00, size);
va009039 0:db4242c89949 43 const uint8_t headers[] = {0x01,0x01,0x06,0x00,
va009039 0:db4242c89949 44 0x12,0x34,0x56,0x78}; // xid
va009039 0:db4242c89949 45 memcpy(buf, headers, sizeof(headers));
va009039 0:db4242c89949 46 memcpy(buf+DHCP_OFFSET_XID, xid, 4);
va009039 0:db4242c89949 47 memcpy(buf+DHCP_OFFSET_YIADDR, yiaddr, 4);
va009039 0:db4242c89949 48 W5100.getMACAddress(buf+DHCP_OFFSET_CHADDR);
va009039 0:db4242c89949 49 const uint8_t options[] = {0x63,0x82,0x53,0x63, // magic cookie
va009039 0:db4242c89949 50 0x35,0x01,0x03, // DHCP REQUEST
va009039 0:db4242c89949 51 0x32,0x04,0x00,0x00,0x00,0x00, // request IP
va009039 0:db4242c89949 52 0xff};
va009039 0:db4242c89949 53 memcpy(buf+DHCP_OFFSET_MAGIC_COOKIE, options, sizeof(options));
va009039 0:db4242c89949 54 memcpy(buf+DHCP_OFFSET_MAGIC_COOKIE+9, yiaddr, 4);
va009039 0:db4242c89949 55 return DHCP_OFFSET_MAGIC_COOKIE + sizeof(options);
va009039 0:db4242c89949 56 }
va009039 0:db4242c89949 57
va009039 0:db4242c89949 58 int offer_ack(uint8_t buf[], int size);
va009039 0:db4242c89949 59
va009039 0:db4242c89949 60 bool verify(uint8_t buf[], int len) {
va009039 0:db4242c89949 61 if (len < DHCP_OFFSET_OPTIONS) {
va009039 0:db4242c89949 62 return false;
va009039 0:db4242c89949 63 }
va009039 0:db4242c89949 64 if (buf[DHCP_OFFSET_OP] != 0x02) {
va009039 0:db4242c89949 65 return false;
va009039 0:db4242c89949 66 }
va009039 0:db4242c89949 67 if (memcmp(buf+DHCP_OFFSET_XID, xid, 4) != 0) {
va009039 0:db4242c89949 68 return false;
va009039 0:db4242c89949 69 }
va009039 0:db4242c89949 70 return true;
va009039 0:db4242c89949 71 }
va009039 0:db4242c89949 72 public:
va009039 0:db4242c89949 73 void callback(UDPSocketEvent e);
va009039 0:db4242c89949 74 int setup(int timeout_ms = 15000);
va009039 0:db4242c89949 75 DHCPClient();
va009039 0:db4242c89949 76 uint8_t chaddr[6]; // MAC
va009039 0:db4242c89949 77 uint8_t yiaddr[4]; // IP
va009039 0:db4242c89949 78 uint8_t dnsaddr[4]; // DNS
va009039 0:db4242c89949 79 uint8_t gateway[4];
va009039 0:db4242c89949 80 uint8_t netmask[4];
va009039 0:db4242c89949 81 private:
va009039 0:db4242c89949 82 MyUDPSocket* p_udp;
va009039 0:db4242c89949 83 uint8_t xid[4];
va009039 0:db4242c89949 84 bool exit_flag;
va009039 0:db4242c89949 85 };
va009039 0:db4242c89949 86 #endif //DHCPCLIENT_H