Replace the LUFA build system with DMBS.
[pub/USBasp.git] / Demos / Device / ClassDriver / RNDISEthernet / Lib / DHCP.c
index f694f2c..37f4e77 100644 (file)
@@ -1,24 +1,24 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2016.
+
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2016  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
-  Permission to use, copy, modify, distribute, and sell this 
+  Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
-  without fee, provided that the above copyright notice appear in 
+  without fee, provided that the above copyright notice appear in
   all copies and that both that the copyright notice and this
-  permission notice and warranty disclaimer appear in supporting 
-  documentation, and that the name of the author not be used in 
-  advertising or publicity pertaining to distribution of the 
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
-  The author disclaim all warranties with regard to this
+  The author disclaims all warranties with regard to this
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
@@ -34,7 +34,7 @@
  *  handles the automatic IP negotiation to the host, so that the host will use the provided
  *  IP address given to it by the device.
  */
+
 #include "DHCP.h"
 
 /** Processes a DHCP packet inside an Ethernet frame, and writes the appropriate response
@@ -53,13 +53,13 @@ int16_t DHCP_ProcessDHCPPacket(void* IPHeaderInStart,
        IP_Header_t*   IPHeaderIN    = (IP_Header_t*)IPHeaderInStart;
        DHCP_Header_t* DHCPHeaderIN  = (DHCP_Header_t*)DHCPHeaderInStart;
        DHCP_Header_t* DHCPHeaderOUT = (DHCP_Header_t*)DHCPHeaderOutStart;
-       
-       uint8_t* DHCPOptionsINStart  = (uint8_t*)(DHCPHeaderInStart  + sizeof(DHCP_Header_t));
-       uint8_t* DHCPOptionsOUTStart = (uint8_t*)(DHCPHeaderOutStart + sizeof(DHCP_Header_t));
+
+       uint8_t* DHCPOptionsINStart  = ((uint8_t*)DHCPHeaderInStart  + sizeof(DHCP_Header_t));
+       uint8_t* DHCPOptionsOUTStart = ((uint8_t*)DHCPHeaderOutStart + sizeof(DHCP_Header_t));
 
        DecodeDHCPHeader(DHCPHeaderInStart);
 
-       /* Zero out the response DHCP packet, as much of it legacy and left at 0 */
+       /* Zero out the response DHCP packet, as much of it is legacy and left at 0 */
        memset(DHCPHeaderOUT, 0, sizeof(DHCP_Header_t));
 
        /* Fill out the response DHCP packet */
@@ -73,7 +73,7 @@ int16_t DHCP_ProcessDHCPPacket(void* IPHeaderInStart,
        DHCPHeaderOUT->YourIP                = ClientIPAddress;
        memmove(&DHCPHeaderOUT->ClientHardwareAddress, &DHCPHeaderIN->ClientHardwareAddress, sizeof(MAC_Address_t));
        DHCPHeaderOUT->Cookie                = SwapEndian_32(DHCP_MAGIC_COOKIE);
-       
+
        /* Alter the incoming IP packet header so that the corrected IP source and destinations are used - this means that
           when the response IP header is generated, it will use the corrected addresses and not the null/broatcast addresses */
        IPHeaderIN->SourceAddress      = ClientIPAddress;
@@ -81,7 +81,7 @@ int16_t DHCP_ProcessDHCPPacket(void* IPHeaderInStart,
 
        /* Process the incoming DHCP packet options */
        while (DHCPOptionsINStart[0] != DHCP_OPTION_END)
-       {       
+       {
                /* Find the Message Type DHCP option, to determine the type of DHCP packet */
                if (DHCPOptionsINStart[0] == DHCP_OPTION_MESSAGETYPE)
                {
@@ -95,26 +95,35 @@ int16_t DHCP_ProcessDHCPPacket(void* IPHeaderInStart,
                                                                                                                                                                                                : DHCP_MESSAGETYPE_ACK;
 
                                *(DHCPOptionsOUTStart++) = DHCP_OPTION_SUBNETMASK;
-                               *(DHCPOptionsOUTStart++) = 4;
+                               *(DHCPOptionsOUTStart++) = sizeof(IP_Address_t);
                                *(DHCPOptionsOUTStart++) = 0xFF;
                                *(DHCPOptionsOUTStart++) = 0xFF;
                                *(DHCPOptionsOUTStart++) = 0xFF;
                                *(DHCPOptionsOUTStart++) = 0x00;
 
+                               *(DHCPOptionsOUTStart++) = DHCP_OPTION_LEASETIME;
+                               *(DHCPOptionsOUTStart++) = sizeof(uint32_t);
+                               /* Lease Time 86400s (ONE_DAY) */
+                               *(DHCPOptionsOUTStart++) = 0x00;
+                               *(DHCPOptionsOUTStart++) = 0x01;
+                               *(DHCPOptionsOUTStart++) = 0x51;
+                               *(DHCPOptionsOUTStart++) = 0x80;
+
                                *(DHCPOptionsOUTStart++) = DHCP_OPTION_DHCPSERVER;
                                *(DHCPOptionsOUTStart++) = sizeof(IP_Address_t);
                                memcpy(DHCPOptionsOUTStart, &ServerIPAddress, sizeof(IP_Address_t));
                                DHCPOptionsOUTStart     += sizeof(IP_Address_t);
 
                                *(DHCPOptionsOUTStart++) = DHCP_OPTION_END;
-                               
-                               return (sizeof(DHCP_Header_t) + 12 + sizeof(IP_Address_t));
+
+                               return (sizeof(DHCP_Header_t) + 18 + sizeof(IP_Address_t));
                        }
                }
-               
+
                /* Go to the next DHCP option - skip one byte if option is a padding byte, else skip the complete option's size */
                DHCPOptionsINStart += ((DHCPOptionsINStart[0] == DHCP_OPTION_PAD) ? 1 : (DHCPOptionsINStart[1] + 2));
        }
-       
+
        return NO_RESPONSE;
 }
+