
DHCP Client for WIZ820io(W5200)
Dependencies: EthernetNetIf mbed
DHCPClient.h@0:db4242c89949, 2012-04-10 (annotated)
- Committer:
- va009039
- Date:
- Tue Apr 10 03:38:22 2012 +0000
- Revision:
- 0:db4242c89949
Who changed what in which revision?
User | Revision | Line number | New 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 |