Add RNDIS Device support to the Webserver project, so that the files stored on the device can be viewed from a web-browser while the board is plugged into a host machine.
	
		
	
				
					
				
			
							parent
							
								
									e349974aa9
								
							
						
					
					
						commit
						3cba88e4c0
					
				
											
												
													File diff suppressed because one or more lines are too long
												
											
										
									
								@ -0,0 +1,52 @@
 | 
				
			||||
;     Windows LUFA RNDIS Setup File
 | 
				
			||||
; Copyright (c) 2000 Microsoft Corporation
 | 
				
			||||
 | 
				
			||||
[Version]
 | 
				
			||||
Signature           = "$Windows NT$"
 | 
				
			||||
Class               = Net
 | 
				
			||||
ClassGUID           = {4d36e972-e325-11ce-bfc1-08002be10318}
 | 
				
			||||
Provider            = %COMPANY%
 | 
				
			||||
DriverVer           = 06/21/2006,6.0.6000.16384
 | 
				
			||||
;CatalogFile        = device.cat
 | 
				
			||||
 | 
				
			||||
[Manufacturer]
 | 
				
			||||
%COMPANY%         = RndisDevices,NTx86,NTamd64,NTia64
 | 
				
			||||
 | 
				
			||||
; Decoration for x86 architecture
 | 
				
			||||
[RndisDevices.NTx86]
 | 
				
			||||
%RNDISDEV%    = RNDIS.NT.5.1, USB\VID_03EB&PID_2069&MI_00
 | 
				
			||||
 | 
				
			||||
; Decoration for x64 architecture
 | 
				
			||||
[RndisDevices.NTamd64]
 | 
				
			||||
%RNDISDEV%    = RNDIS.NT.5.1, USB\VID_03EB&PID_2069&MI_00
 | 
				
			||||
 | 
				
			||||
; Decoration for ia64 architecture
 | 
				
			||||
[RndisDevices.NTia64]
 | 
				
			||||
%RNDISDEV%    = RNDIS.NT.5.1, USB\VID_03EB&PID_2069&MI_00
 | 
				
			||||
 | 
				
			||||
;@@@ This is the common setting for setup
 | 
				
			||||
[ControlFlags]
 | 
				
			||||
ExcludeFromSelect=*
 | 
				
			||||
 | 
				
			||||
; DDInstall section
 | 
				
			||||
; References the in-build Netrndis.inf
 | 
				
			||||
[RNDIS.NT.5.1]
 | 
				
			||||
Characteristics = 0x84   ; NCF_PHYSICAL + NCF_HAS_UI
 | 
				
			||||
BusType         = 15
 | 
				
			||||
; NEVER REMOVE THE FOLLOWING REFERENCE FOR NETRNDIS.INF
 | 
				
			||||
include         = netrndis.inf
 | 
				
			||||
needs           = Usb_Rndis.ndi
 | 
				
			||||
AddReg          = Rndis_AddReg_Vista
 | 
				
			||||
 | 
				
			||||
; DDInstal.Services section
 | 
				
			||||
[RNDIS.NT.5.1.Services]
 | 
				
			||||
include     = netrndis.inf
 | 
				
			||||
needs       = Usb_Rndis.ndi.Services
 | 
				
			||||
 | 
				
			||||
; No sys copyfiles - the sys files are already in-build 
 | 
				
			||||
; (part of the operating system).
 | 
				
			||||
 | 
				
			||||
; Modify these strings for your device as needed.
 | 
				
			||||
[Strings] 
 | 
				
			||||
COMPANY="LUFA Library"
 | 
				
			||||
RNDISDEV="LUFA USB RNDIS Webserver"
 | 
				
			||||
@ -0,0 +1,102 @@
 | 
				
			||||
/*
 | 
				
			||||
             LUFA Library
 | 
				
			||||
     Copyright (C) Dean Camera, 2011.
 | 
				
			||||
 | 
				
			||||
  dean [at] fourwalledcubicle [dot] com
 | 
				
			||||
           www.lufa-lib.org
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
				
			||||
 | 
				
			||||
  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
 | 
				
			||||
  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
 | 
				
			||||
  software without specific, written prior permission.
 | 
				
			||||
 | 
				
			||||
  The author disclaim 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
 | 
				
			||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
				
			||||
  in an action of contract, negligence or other tortious action,
 | 
				
			||||
  arising out of or in connection with the use or performance of
 | 
				
			||||
  this software.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#if defined(ENABLE_DHCP_CLIENT) || defined(ENABLE_DHCP_SERVER) || defined(__DOXYGEN__)
 | 
				
			||||
 | 
				
			||||
/** \file
 | 
				
			||||
 *
 | 
				
			||||
 *  Common DHCP routines to manage DHCP packet data.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#include "DHCPCommon.h"
 | 
				
			||||
 | 
				
			||||
/** Sets the given DHCP option in the DHCP packet's option list. This automatically moves the
 | 
				
			||||
 *  end of options terminator past the new option in the options list.
 | 
				
			||||
 *
 | 
				
			||||
 *  \param[in,out] DHCPOptionList  Pointer to the start of the DHCP packet's options list
 | 
				
			||||
 *  \param[in]     Option          DHCP option to add to the list
 | 
				
			||||
 *  \param[in]     DataLen         Size in bytes of the option data to add
 | 
				
			||||
 *  \param[in]     OptionData      Buffer where the option's data is to be sourced from
 | 
				
			||||
 *
 | 
				
			||||
 *  \return Number of bytes added to the DHCP packet
 | 
				
			||||
 */
 | 
				
			||||
uint8_t DHCPCommon_SetOption(uint8_t* DHCPOptionList,
 | 
				
			||||
                             const uint8_t Option,
 | 
				
			||||
                             const uint8_t DataLen,
 | 
				
			||||
                             void* const OptionData)
 | 
				
			||||
{
 | 
				
			||||
	/* Skip through the DHCP options list until the terminator option is found */
 | 
				
			||||
	while (*DHCPOptionList != DHCP_OPTION_END)
 | 
				
			||||
	  DHCPOptionList += (DHCPOptionList[1] + 2);
 | 
				
			||||
 | 
				
			||||
	/* Overwrite the existing terminator with the new option, add a new terminator at the end of the list */
 | 
				
			||||
	DHCPOptionList[0] = Option;
 | 
				
			||||
	DHCPOptionList[1] = DataLen;
 | 
				
			||||
	memcpy(&DHCPOptionList[2], OptionData, DataLen);
 | 
				
			||||
	DHCPOptionList[2 + DataLen] = DHCP_OPTION_END;
 | 
				
			||||
 | 
				
			||||
	/* Calculate the total number of bytes added to the outgoing packet */
 | 
				
			||||
	return (2 + DataLen);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
/** Retrieves the given option's data (if present) from the DHCP packet's options list.
 | 
				
			||||
 *
 | 
				
			||||
 *  \param[in,out] DHCPOptionList  Pointer to the start of the DHCP packet's options list
 | 
				
			||||
 *  \param[in]     Option          DHCP option to retrieve to the list
 | 
				
			||||
 *  \param[out]    Destination     Buffer where the option's data is to be written to if found
 | 
				
			||||
 *
 | 
				
			||||
 *  \return Boolean true if the option was found in the DHCP packet's options list, false otherwise
 | 
				
			||||
 */
 | 
				
			||||
bool DHCPCommon_GetOption(const uint8_t* DHCPOptionList,
 | 
				
			||||
                          const uint8_t Option,
 | 
				
			||||
                          void* const Destination)
 | 
				
			||||
{
 | 
				
			||||
	/* Look through the incoming DHCP packet's options list for the requested option */
 | 
				
			||||
	while (*DHCPOptionList != DHCP_OPTION_END)
 | 
				
			||||
	{
 | 
				
			||||
		/* Check if the current DHCP option in the packet is the one requested */
 | 
				
			||||
		if (DHCPOptionList[0] == Option)
 | 
				
			||||
		{
 | 
				
			||||
			/* Copy request option's data to the destination buffer */
 | 
				
			||||
			memcpy(Destination, &DHCPOptionList[2], DHCPOptionList[1]);
 | 
				
			||||
 | 
				
			||||
			/* Indicate that the requested option data was successfully retrieved */
 | 
				
			||||
			return true;
 | 
				
			||||
		}
 | 
				
			||||
 | 
				
			||||
		/* Skip to next DHCP option in the options list */
 | 
				
			||||
		DHCPOptionList += (DHCPOptionList[1] + 2);
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	/* Requested option not found in the incoming packet's DHCP options list */
 | 
				
			||||
	return false;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,157 @@
 | 
				
			||||
/*
 | 
				
			||||
             LUFA Library
 | 
				
			||||
     Copyright (C) Dean Camera, 2011.
 | 
				
			||||
 | 
				
			||||
  dean [at] fourwalledcubicle [dot] com
 | 
				
			||||
           www.lufa-lib.org
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
				
			||||
 | 
				
			||||
  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
 | 
				
			||||
  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
 | 
				
			||||
  software without specific, written prior permission.
 | 
				
			||||
 | 
				
			||||
  The author disclaim 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
 | 
				
			||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
				
			||||
  in an action of contract, negligence or other tortious action,
 | 
				
			||||
  arising out of or in connection with the use or performance of
 | 
				
			||||
  this software.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
/** \file
 | 
				
			||||
 *
 | 
				
			||||
 *  Header file for common DHCP defines.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef _DHCP_COMMON_H_
 | 
				
			||||
#define _DHCP_COMMON_H_
 | 
				
			||||
 | 
				
			||||
	/* Includes: */
 | 
				
			||||
		#include <stdint.h>
 | 
				
			||||
		#include <stdbool.h>
 | 
				
			||||
		#include <string.h>
 | 
				
			||||
		
 | 
				
			||||
		#include <uip.h>
 | 
				
			||||
 | 
				
			||||
	/* Macros: */
 | 
				
			||||
		/** UDP listen port for a BOOTP server. */
 | 
				
			||||
		#define DHCP_SERVER_PORT          67
 | 
				
			||||
 | 
				
			||||
		/** UDP listen port for a BOOTP client. */
 | 
				
			||||
		#define DHCP_CLIENT_PORT          68
 | 
				
			||||
 | 
				
			||||
		/** BOOTP message type for a BOOTP REQUEST message. */
 | 
				
			||||
		#define DHCP_OP_BOOTREQUEST       0x01
 | 
				
			||||
 | 
				
			||||
		/** BOOTP message type for a BOOTP REPLY message. */
 | 
				
			||||
		#define DHCP_OP_BOOTREPLY         0x02
 | 
				
			||||
 | 
				
			||||
		/** BOOTP flag for a BOOTP broadcast message. */
 | 
				
			||||
		#define BOOTP_BROADCAST           0x8000
 | 
				
			||||
 | 
				
			||||
		/** Magic DHCP cookie for a BOOTP message to identify it as a DHCP message. */
 | 
				
			||||
		#define DHCP_MAGIC_COOKIE         0x63538263
 | 
				
			||||
 | 
				
			||||
		/** Unique transaction ID used to identify DHCP responses to the client. */
 | 
				
			||||
		#define DHCP_TRANSACTION_ID       0x13245466
 | 
				
			||||
 | 
				
			||||
		/** DHCP message type for a DISCOVER message. */
 | 
				
			||||
		#define DHCP_DISCOVER             1
 | 
				
			||||
 | 
				
			||||
		/** DHCP message type for an OFFER message. */
 | 
				
			||||
		#define DHCP_OFFER                2
 | 
				
			||||
 | 
				
			||||
		/** DHCP message type for a REQUEST message. */
 | 
				
			||||
		#define DHCP_REQUEST              3
 | 
				
			||||
 | 
				
			||||
		/** DHCP message type for a DECLINE message. */
 | 
				
			||||
		#define DHCP_DECLINE              4
 | 
				
			||||
 | 
				
			||||
		/** DHCP message type for an ACK message. */
 | 
				
			||||
		#define DHCP_ACK                  5
 | 
				
			||||
 | 
				
			||||
		/** DHCP message type for a NAK message. */
 | 
				
			||||
		#define DHCP_NAK                  6
 | 
				
			||||
 | 
				
			||||
		/** DHCP message type for a RELEASE message. */
 | 
				
			||||
		#define DHCP_RELEASE              7
 | 
				
			||||
 | 
				
			||||
		/** DHCP medium type for standard Ethernet. */
 | 
				
			||||
		#define DHCP_HTYPE_ETHERNET       1
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the network subnet mask. */
 | 
				
			||||
		#define DHCP_OPTION_SUBNET_MASK   1
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the network gateway IP. */
 | 
				
			||||
		#define DHCP_OPTION_ROUTER        3
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the network DNS server. */
 | 
				
			||||
		#define DHCP_OPTION_DNS_SERVER    6
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the requested client IP address. */
 | 
				
			||||
		#define DHCP_OPTION_REQ_IPADDR    50
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the IP address lease time. */
 | 
				
			||||
		#define DHCP_OPTION_LEASE_TIME    51
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the DHCP message type. */
 | 
				
			||||
		#define DHCP_OPTION_MSG_TYPE      53
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the DHCP server IP. */
 | 
				
			||||
		#define DHCP_OPTION_SERVER_ID     54
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the list of required options from the server. */
 | 
				
			||||
		#define DHCP_OPTION_REQ_LIST      55
 | 
				
			||||
 | 
				
			||||
		/** DHCP message option for the options list terminator. */
 | 
				
			||||
		#define DHCP_OPTION_END           255
 | 
				
			||||
 | 
				
			||||
	/* Type Defines: */
 | 
				
			||||
		/** Type define for a DHCP packet inside an Ethernet frame. */
 | 
				
			||||
		typedef struct
 | 
				
			||||
		{
 | 
				
			||||
			uint8_t      Operation; /**< DHCP operation, either DHCP_OP_BOOTREQUEST or DHCP_OP_BOOTREPLY */
 | 
				
			||||
			uint8_t      HardwareType; /**< Hardware carrier type constant */
 | 
				
			||||
			uint8_t      HardwareAddressLength;  /**< Length in bytes of a hardware (MAC) address on the network */
 | 
				
			||||
			uint8_t      Hops; /**< Number of hops required to reach the server, unused */
 | 
				
			||||
 | 
				
			||||
			uint32_t     TransactionID; /**< Unique ID of the DHCP packet, for positive matching between sent and received packets */
 | 
				
			||||
 | 
				
			||||
			uint16_t     ElapsedSeconds; /**< Elapsed seconds since the request was made */
 | 
				
			||||
			uint16_t     Flags; /**< BOOTP packet flags */
 | 
				
			||||
 | 
				
			||||
			uip_ipaddr_t ClientIP; /**< Client IP address, if already leased an IP */
 | 
				
			||||
			uip_ipaddr_t YourIP; /**< Client IP address */
 | 
				
			||||
			uip_ipaddr_t NextServerIP; /**< Legacy BOOTP protocol field, unused for DHCP */
 | 
				
			||||
			uip_ipaddr_t RelayAgentIP; /**< Legacy BOOTP protocol field, unused for DHCP */
 | 
				
			||||
 | 
				
			||||
			uint8_t      ClientHardwareAddress[16]; /**< Hardware (MAC) address of the client making a request to the DHCP server */
 | 
				
			||||
			uint8_t      ServerHostnameString[64]; /**< Legacy BOOTP protocol field, unused for DHCP */
 | 
				
			||||
			uint8_t      BootFileName[128]; /**< Legacy BOOTP protocol field, unused for DHCP */
 | 
				
			||||
 | 
				
			||||
			uint32_t     Cookie; /**< Magic BOOTP protocol cookie to indicate a valid packet */
 | 
				
			||||
 | 
				
			||||
			uint8_t      Options[]; /**< DHCP message options */
 | 
				
			||||
		} DHCP_Header_t;
 | 
				
			||||
 | 
				
			||||
	/* Function Prototypes: */
 | 
				
			||||
		uint8_t  DHCPCommon_SetOption(uint8_t* DHCPOptionList,
 | 
				
			||||
			                          const uint8_t Option,
 | 
				
			||||
			                          const uint8_t DataLen,
 | 
				
			||||
			                          void* const OptionData);
 | 
				
			||||
		bool     DHCPCommon_GetOption(const uint8_t* DHCPOptionList,
 | 
				
			||||
			                          const uint8_t Option,
 | 
				
			||||
			                          void* const Destination);
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,237 @@
 | 
				
			||||
/*
 | 
				
			||||
             LUFA Library
 | 
				
			||||
     Copyright (C) Dean Camera, 2011.
 | 
				
			||||
 | 
				
			||||
  dean [at] fourwalledcubicle [dot] com
 | 
				
			||||
           www.lufa-lib.org
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
				
			||||
 | 
				
			||||
  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
 | 
				
			||||
  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
 | 
				
			||||
  software without specific, written prior permission.
 | 
				
			||||
 | 
				
			||||
  The author disclaim 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
 | 
				
			||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
				
			||||
  in an action of contract, negligence or other tortious action,
 | 
				
			||||
  arising out of or in connection with the use or performance of
 | 
				
			||||
  this software.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#if defined(ENABLE_DHCP_SERVER) || defined(__DOXYGEN__)
 | 
				
			||||
 | 
				
			||||
/** \file
 | 
				
			||||
 *
 | 
				
			||||
 *  DHCP Server Application. When connected to the uIP stack, this will send IP configuration settings to a
 | 
				
			||||
 *  DHCP client on the network.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#define  INCLUDE_FROM_DHCPSERVERAPP_C
 | 
				
			||||
#include "DHCPServerApp.h"
 | 
				
			||||
 | 
				
			||||
struct uip_conn* BroadcastConnection;
 | 
				
			||||
 | 
				
			||||
uint8_t LeasedIPs[255 / 8];
 | 
				
			||||
	
 | 
				
			||||
/** Initialization function for the DHCP server. */
 | 
				
			||||
void DHCPServerApp_Init(void)
 | 
				
			||||
{
 | 
				
			||||
	/* Listen on port 67 for DHCP server connections from hosts */
 | 
				
			||||
	uip_listen(HTONS(DHCP_SERVER_PORT));
 | 
				
			||||
	
 | 
				
			||||
	/* Create a new UDP connection to the DHCP server port for the DHCP solicitation */
 | 
				
			||||
	struct uip_udp_conn* BroadcastConnection = uip_udp_new(&uip_broadcast_addr, HTONS(DHCP_CLIENT_PORT));
 | 
				
			||||
 | 
				
			||||
	/* If the connection was successfully created, bind it to the local DHCP client port */
 | 
				
			||||
	if (BroadcastConnection != NULL)
 | 
				
			||||
	  uip_udp_bind(BroadcastConnection, HTONS(DHCP_SERVER_PORT));
 | 
				
			||||
	  
 | 
				
			||||
	/* Set all IP addresses as unleased */
 | 
				
			||||
	memset(LeasedIPs, 0x00, sizeof(LeasedIPs));
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
/** uIP stack application callback for the DHCP server. This function must be called each time the TCP/IP stack
 | 
				
			||||
 *  needs a UDP packet to be processed.
 | 
				
			||||
 */
 | 
				
			||||
void DHCPServerApp_Callback(void)
 | 
				
			||||
{
 | 
				
			||||
	DHCP_Header_t* const AppData     = (DHCP_Header_t*)uip_appdata;
 | 
				
			||||
	uint16_t             AppDataSize = 0;
 | 
				
			||||
 | 
				
			||||
	uint8_t DHCPMessageType;
 | 
				
			||||
	if (!(DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &DHCPMessageType)))
 | 
				
			||||
		return;
 | 
				
			||||
 | 
				
			||||
	uip_ipaddr_t Netmask, GatewayIPAddress;
 | 
				
			||||
	struct uip_eth_addr RemoteMACAddress;
 | 
				
			||||
	uint32_t            TransactionID;
 | 
				
			||||
 | 
				
			||||
	memcpy(&RemoteMACAddress, &AppData->ClientHardwareAddress, sizeof(struct uip_eth_addr));
 | 
				
			||||
	uip_getnetmask(&Netmask);
 | 
				
			||||
	uip_getdraddr(&GatewayIPAddress);	
 | 
				
			||||
	TransactionID = AppData->TransactionID;
 | 
				
			||||
 | 
				
			||||
	switch (DHCPMessageType)
 | 
				
			||||
	{
 | 
				
			||||
		case DHCP_DISCOVER:
 | 
				
			||||
			AppDataSize += DHCPServerApp_FillDHCPHeader(AppData, DHCP_OFFER, &RemoteMACAddress, TransactionID);
 | 
				
			||||
 | 
				
			||||
			AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_SUBNET_MASK,
 | 
				
			||||
			                                    sizeof(uip_ipaddr_t), &Netmask);
 | 
				
			||||
			AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_ROUTER,
 | 
				
			||||
			                                    sizeof(uip_ipaddr_t), &GatewayIPAddress);
 | 
				
			||||
			
 | 
				
			||||
			/* Send the DHCP OFFER packet */
 | 
				
			||||
			uip_poll_conn(BroadcastConnection);
 | 
				
			||||
			memcpy(&uip_udp_conn->ripaddr, &uip_broadcast_addr, sizeof(uip_ipaddr_t));
 | 
				
			||||
			uip_udp_send(AppDataSize);
 | 
				
			||||
 | 
				
			||||
			break;
 | 
				
			||||
		case DHCP_REQUEST:
 | 
				
			||||
			if (!(DHCPServerApp_CheckIfIPLeased(&AppData->YourIP)))
 | 
				
			||||
			{
 | 
				
			||||
				AppDataSize += DHCPServerApp_FillDHCPHeader(AppData, DHCP_ACK, &RemoteMACAddress, TransactionID);
 | 
				
			||||
 | 
				
			||||
				AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_SUBNET_MASK,
 | 
				
			||||
													sizeof(uip_ipaddr_t), &Netmask);
 | 
				
			||||
				AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_ROUTER,
 | 
				
			||||
													sizeof(uip_ipaddr_t), &GatewayIPAddress);
 | 
				
			||||
 | 
				
			||||
				DHCPServerApp_LeaseIP(&AppData->YourIP);
 | 
				
			||||
			}
 | 
				
			||||
			else
 | 
				
			||||
			{
 | 
				
			||||
				AppDataSize += DHCPServerApp_FillDHCPHeader(AppData, DHCP_NAK, &RemoteMACAddress, TransactionID);			
 | 
				
			||||
			}
 | 
				
			||||
			
 | 
				
			||||
			/* Send the DHCP ACK or NAK packet */
 | 
				
			||||
			uip_poll_conn(BroadcastConnection);
 | 
				
			||||
			memcpy(&uip_udp_conn->ripaddr, &uip_broadcast_addr, sizeof(uip_ipaddr_t));
 | 
				
			||||
			uip_udp_send(AppDataSize);
 | 
				
			||||
		
 | 
				
			||||
			break;
 | 
				
			||||
		case DHCP_RELEASE:
 | 
				
			||||
			/* Mark the IP address as released in the allocation table */
 | 
				
			||||
			DHCPServerApp_UnleaseIP(&uip_udp_conn->ripaddr);
 | 
				
			||||
			break;
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
/** Fills the DHCP packet response with the appropriate BOOTP header for DHCP. This fills out all the required
 | 
				
			||||
 *  fields, leaving only the additional DHCP options to be added to the packet before it is sent to the DHCP client.
 | 
				
			||||
 *
 | 
				
			||||
 *  \param[out] DHCPHeader             Location in the packet buffer where the BOOTP header should be written to
 | 
				
			||||
 *  \param[in]  DHCPMessageType        DHCP Message type, such as DHCP_DISCOVER
 | 
				
			||||
 *  \param[in]  ClientHardwareAddress  Client MAC address the created transaction should be directed to
 | 
				
			||||
 *  \param[in]  TransactionID          Transaction ID the created transaction should be associated with
 | 
				
			||||
 *
 | 
				
			||||
 *  \return Size in bytes of the created DHCP packet
 | 
				
			||||
 */
 | 
				
			||||
static uint16_t DHCPServerApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader,
 | 
				
			||||
                                             const uint8_t DHCPMessageType,
 | 
				
			||||
                                             struct uip_eth_addr* ClientHardwareAddress,
 | 
				
			||||
                                             uint32_t TransactionID)
 | 
				
			||||
{
 | 
				
			||||
	/* Erase existing packet data so that we start will all 0x00 DHCP header data */
 | 
				
			||||
 	memset(DHCPHeader, 0, sizeof(DHCP_Header_t));
 | 
				
			||||
 | 
				
			||||
	DHCPHeader->Operation             = DHCPMessageType;
 | 
				
			||||
	DHCPHeader->HardwareType          = DHCP_HTYPE_ETHERNET;
 | 
				
			||||
	DHCPHeader->HardwareAddressLength = sizeof(MACAddress);
 | 
				
			||||
	DHCPHeader->Hops                  = 0;
 | 
				
			||||
	DHCPHeader->TransactionID         = TransactionID;
 | 
				
			||||
	DHCPHeader->ElapsedSeconds        = 0;
 | 
				
			||||
	DHCPHeader->Flags                 = 0;
 | 
				
			||||
	memcpy(&DHCPHeader->NextServerIP, &uip_hostaddr, sizeof(uip_ipaddr_t));
 | 
				
			||||
	if (uip_ipaddr_cmp(&DHCPHeader->YourIP, &uip_all_zeroes_addr))
 | 
				
			||||
	  DHCPServerApp_GetUnleasedIP(&DHCPHeader->YourIP);
 | 
				
			||||
	memcpy(&DHCPHeader->ClientHardwareAddress, ClientHardwareAddress, sizeof(struct uip_eth_addr));
 | 
				
			||||
	DHCPHeader->Cookie                = DHCP_MAGIC_COOKIE;
 | 
				
			||||
	  
 | 
				
			||||
	/* Add a DHCP message type and terminator options to the start of the DHCP options field */
 | 
				
			||||
	DHCPHeader->Options[0]            = DHCP_OPTION_MSG_TYPE;
 | 
				
			||||
	DHCPHeader->Options[1]            = 1;
 | 
				
			||||
	DHCPHeader->Options[2]            = DHCPMessageType;
 | 
				
			||||
	DHCPHeader->Options[3]            = DHCP_OPTION_END;
 | 
				
			||||
 | 
				
			||||
	/* Calculate the total number of bytes added to the outgoing packet */
 | 
				
			||||
	return (sizeof(DHCP_Header_t) + 4);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
/** Checks to see if the nominated IP address has already been allocated to a client.
 | 
				
			||||
 *
 | 
				
			||||
 *  \param[in] IPAddress  IP Address whose lease status should be checked
 | 
				
			||||
 *
 | 
				
			||||
 *  \pre The IP address must be within the same /24 subnet as the virtual webserver.
 | 
				
			||||
 *
 | 
				
			||||
 *  \return Boolean true if the IP has already been leased to a client, false otherwise.
 | 
				
			||||
 */
 | 
				
			||||
static bool DHCPServerApp_CheckIfIPLeased(uip_ipaddr_t* IPAddress)
 | 
				
			||||
{
 | 
				
			||||
	uint8_t Byte = (IPAddress->u8[3] / 8);
 | 
				
			||||
	uint8_t Mask = (1 << (IPAddress->u8[3] % 8));
 | 
				
			||||
	
 | 
				
			||||
	if (!(IPAddress->u8[3] == uip_hostaddr.u8[3]) && !(LeasedIPs[Byte] & Mask))
 | 
				
			||||
	  return false;
 | 
				
			||||
	else
 | 
				
			||||
	  return true;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
/** Retrieves the next unleased IP in the IP address pool.
 | 
				
			||||
 *
 | 
				
			||||
 *  \param[out] NewIPAddress  Location where the generated IP Address should be stored
 | 
				
			||||
 */
 | 
				
			||||
static void DHCPServerApp_GetUnleasedIP(uip_ipaddr_t* NewIPAddress)
 | 
				
			||||
{
 | 
				
			||||
	uip_ipaddr_copy(NewIPAddress, &uip_hostaddr);
 | 
				
			||||
	
 | 
				
			||||
	for (uint8_t IP = 1; IP < 254; IP++)
 | 
				
			||||
	{
 | 
				
			||||
		NewIPAddress->u8[3] = IP;
 | 
				
			||||
		
 | 
				
			||||
		if (!(DHCPServerApp_CheckIfIPLeased(NewIPAddress)))
 | 
				
			||||
		  return;
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
/** Marks the given IP Address as leased in the address pool, so that it will not be
 | 
				
			||||
 *  allocated to another client unless it is first released.
 | 
				
			||||
 *
 | 
				
			||||
 *  \param[in] IPAddress  IP Address to mark as leased
 | 
				
			||||
 *
 | 
				
			||||
 *  \pre The IP address must be within the same /24 subnet as the virtual webserver.
 | 
				
			||||
 */
 | 
				
			||||
static void DHCPServerApp_LeaseIP(uip_ipaddr_t* IPAddress)
 | 
				
			||||
{
 | 
				
			||||
	uint8_t Byte = (IPAddress->u8[3] / 8);
 | 
				
			||||
	uint8_t Mask = (1 << (IPAddress->u8[3] % 8));
 | 
				
			||||
	
 | 
				
			||||
	LeasedIPs[Byte] |= Mask;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
/** Marks the given IP Address as not leased in the address pool, so that it can be
 | 
				
			||||
 *  allocated to another client upon request.
 | 
				
			||||
 *
 | 
				
			||||
 *  \param[in] IPAddress  IP Address to mark as not leased
 | 
				
			||||
 *
 | 
				
			||||
 *  \pre The IP address must be within the same /24 subnet as the virtual webserver.
 | 
				
			||||
 */
 | 
				
			||||
static void DHCPServerApp_UnleaseIP(uip_ipaddr_t* IPAddress)
 | 
				
			||||
{
 | 
				
			||||
	uint8_t Byte = (IPAddress->u8[3] / 8);
 | 
				
			||||
	uint8_t Mask = (1 << (IPAddress->u8[3] % 8));
 | 
				
			||||
	
 | 
				
			||||
	LeasedIPs[Byte] &= ~Mask;
 | 
				
			||||
}
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,62 @@
 | 
				
			||||
/*
 | 
				
			||||
             LUFA Library
 | 
				
			||||
     Copyright (C) Dean Camera, 2011.
 | 
				
			||||
 | 
				
			||||
  dean [at] fourwalledcubicle [dot] com
 | 
				
			||||
           www.lufa-lib.org
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
				
			||||
 | 
				
			||||
  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
 | 
				
			||||
  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
 | 
				
			||||
  software without specific, written prior permission.
 | 
				
			||||
 | 
				
			||||
  The author disclaim 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
 | 
				
			||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
				
			||||
  in an action of contract, negligence or other tortious action,
 | 
				
			||||
  arising out of or in connection with the use or performance of
 | 
				
			||||
  this software.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
/** \file
 | 
				
			||||
 *
 | 
				
			||||
 *  Header file for DHCPServerApp.c.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#ifndef _DHCPSERVER_APP_H_
 | 
				
			||||
#define _DHCPSERVER_APP_H_
 | 
				
			||||
 | 
				
			||||
	/* Includes: */
 | 
				
			||||
		#include <stdio.h>
 | 
				
			||||
 | 
				
			||||
		#include <uip.h>
 | 
				
			||||
 | 
				
			||||
		#include "../Webserver.h"
 | 
				
			||||
		#include "DHCPCommon.h"
 | 
				
			||||
 | 
				
			||||
	/* Function Prototypes: */
 | 
				
			||||
		void DHCPServerApp_Init(void);
 | 
				
			||||
		void DHCPServerApp_Callback(void);
 | 
				
			||||
 | 
				
			||||
		#if defined(INCLUDE_FROM_DHCPSERVERAPP_C)
 | 
				
			||||
		static uint16_t DHCPServerApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader,
 | 
				
			||||
		                                             const uint8_t DHCPMessageType,
 | 
				
			||||
		                                             struct uip_eth_addr* ClientHardwareAddress,
 | 
				
			||||
		                                             uint32_t TransactionID);
 | 
				
			||||
		static bool DHCPServerApp_CheckIfIPLeased(uip_ipaddr_t* IPAddress);
 | 
				
			||||
		static void DHCPServerApp_GetUnleasedIP(uip_ipaddr_t* NewIPAddress);
 | 
				
			||||
		static void DHCPServerApp_LeaseIP(uip_ipaddr_t* IPAddress);
 | 
				
			||||
		static void DHCPServerApp_UnleaseIP(uip_ipaddr_t* IPAddress);
 | 
				
			||||
		#endif
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
											
												
													File diff suppressed because one or more lines are too long
												
											
										
									
								
					Loading…
					
					
				
		Reference in new issue