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