diff options
author | Drashna Jaelre <drashna@live.com> | 2019-08-02 14:02:40 -0700 |
---|---|---|
committer | skullydazed <skullydazed@users.noreply.github.com> | 2019-08-30 15:01:52 -0700 |
commit | cf4575b94a3c65e6535a159fc71fc885aebc2620 (patch) | |
tree | 2354f2b7a200e02246a564afefedc32357e62b8e /lib/lufa/Projects/Webserver/Lib | |
parent | 75ee8df19e0f14ba466f41ab673dde2fe2fdae9c (diff) |
Fix the LUFA lib to use a submodule instead of just files (#6245)
* Remove LUFA files
* Update descriptions for newer version of LUFA
* Create PR6245.md
* Fix CDC(Serial) type errors
* Fix missed merge conflict for AUDIO_DTYPE_CSInterface
Diffstat (limited to 'lib/lufa/Projects/Webserver/Lib')
34 files changed, 0 insertions, 13754 deletions
diff --git a/lib/lufa/Projects/Webserver/Lib/DHCPClientApp.c b/lib/lufa/Projects/Webserver/Lib/DHCPClientApp.c deleted file mode 100644 index 760718127e..0000000000 --- a/lib/lufa/Projects/Webserver/Lib/DHCPClientApp.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 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 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 - 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 - * - * DHCP Client Application. When connected to the uIP stack, this will retrieve IP configuration settings from the - * DHCP server on the network. - */ - -#define INCLUDE_FROM_DHCPCLIENTAPP_C -#include "DHCPClientApp.h" - -#if defined(ENABLE_DHCP_CLIENT) || defined(__DOXYGEN__) - -/** Initialization function for the DHCP client. */ -void DHCPClientApp_Init(void) -{ - /* Create a new UDP connection to the DHCP server port for the DHCP solicitation */ - struct uip_udp_conn* Connection = uip_udp_new(&uip_broadcast_addr, HTONS(DHCP_SERVER_PORT)); - - /* If the connection was successfully created, bind it to the local DHCP client port */ - if (Connection != NULL) - { - uip_udp_appstate_t* const AppState = &Connection->appstate; - uip_udp_bind(Connection, HTONS(DHCP_CLIENT_PORT)); - - /* Set the initial client state */ - AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; - - /* Set timeout period to half a second for a DHCP server to respond */ - timer_set(&AppState->DHCPClient.Timeout, CLOCK_SECOND / 2); - } -} - -/** uIP stack application callback for the DHCP client. This function must be called each time the TCP/IP stack - * needs a UDP packet to be processed. - */ -void DHCPClientApp_Callback(void) -{ - uip_udp_appstate_t* const AppState = &uip_udp_conn->appstate; - DHCP_Header_t* const AppData = (DHCP_Header_t*)uip_appdata; - uint16_t AppDataSize = 0; - - switch (AppState->DHCPClient.CurrentState) - { - case DHCP_STATE_SendDiscover: - /* Clear all DHCP settings, reset client IP address */ - memset(&AppState->DHCPClient.DHCPOffer_Data, 0x00, sizeof(AppState->DHCPClient.DHCPOffer_Data)); - uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP); - - /* Fill out the DHCP response header */ - AppDataSize += DHCPClientApp_FillDHCPHeader(AppData, DHCP_DISCOVER, AppState); - - /* Add the required DHCP options list to the packet */ - uint8_t RequiredOptionList[] = {DHCP_OPTION_SUBNET_MASK, DHCP_OPTION_ROUTER, DHCP_OPTION_DNS_SERVER}; - AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_REQ_LIST, sizeof(RequiredOptionList), - RequiredOptionList); - - /* Send the DHCP DISCOVER packet */ - uip_udp_send(AppDataSize); - - /* Reset the timeout timer, progress to next state */ - timer_reset(&AppState->DHCPClient.Timeout); - AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForOffer; - - break; - case DHCP_STATE_WaitForOffer: - if (!(uip_newdata())) - { - /* Check if the DHCP timeout period has expired while waiting for a response */ - if (timer_expired(&AppState->DHCPClient.Timeout)) - AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; - - break; - } - - uint8_t OfferResponse_MessageType; - if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && - DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &OfferResponse_MessageType) && - (OfferResponse_MessageType == DHCP_OFFER)) - { - /* Received a DHCP offer for an IP address, copy over values for later request */ - memcpy(&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP, &AppData->YourIP, sizeof(uip_ipaddr_t)); - DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_SUBNET_MASK, &AppState->DHCPClient.DHCPOffer_Data.Netmask); - DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_ROUTER, &AppState->DHCPClient.DHCPOffer_Data.GatewayIP); - DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_SERVER_ID, &AppState->DHCPClient.DHCPOffer_Data.ServerIP); - - timer_reset(&AppState->DHCPClient.Timeout); - AppState->DHCPClient.CurrentState = DHCP_STATE_SendRequest; - } - - break; - case DHCP_STATE_SendRequest: - /* Fill out the DHCP response header */ - AppDataSize += DHCPClientApp_FillDHCPHeader(AppData, DHCP_REQUEST, AppState); - - /* Add the DHCP REQUESTED IP ADDRESS option to the packet */ - AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_REQ_IPADDR, sizeof(uip_ipaddr_t), - &AppState->DHCPClient.DHCPOffer_Data.AllocatedIP); - - /* Add the DHCP SERVER IP ADDRESS option to the packet */ - AppDataSize += DHCPCommon_SetOption(AppData->Options, DHCP_OPTION_SERVER_ID, sizeof(uip_ipaddr_t), - &AppState->DHCPClient.DHCPOffer_Data.ServerIP); - - /* Send the DHCP REQUEST packet */ - uip_udp_send(AppDataSize); - - /* Reset the timeout timer, progress to next state */ - timer_reset(&AppState->DHCPClient.Timeout); - AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForACK; - - break; - case DHCP_STATE_WaitForACK: - if (!(uip_newdata())) - { - /* Check if the DHCP timeout period has expired while waiting for a response */ - if (timer_expired(&AppState->DHCPClient.Timeout)) - AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; - - break; - } - - uint8_t RequestResponse_MessageType; - if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && - DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &RequestResponse_MessageType) && - (RequestResponse_MessageType == DHCP_ACK)) - { - /* Set the new network parameters from the DHCP server */ - uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP); - uip_setnetmask((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.Netmask); - uip_setdraddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.GatewayIP); - - AppState->DHCPClient.CurrentState = DHCP_STATE_AddressLeased; - } - - 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 server. - * - * \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] AppState Application state of the current UDP connection - * - * \return Size in bytes of the created DHCP packet - */ -static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader, - const uint8_t DHCPMessageType, - uip_udp_appstate_t* const AppState) -{ - /* Erase existing packet data so that we start will all 0x00 DHCP header data */ - memset(DHCPHeader, 0, sizeof(DHCP_Header_t)); - - /* Fill out the DHCP packet header */ - DHCPHeader->Operation = DHCP_OP_BOOTREQUEST; - DHCPHeader->HardwareType = DHCP_HTYPE_ETHERNET; - DHCPHeader->HardwareAddressLength = sizeof(MACAddress); - DHCPHeader->Hops = 0; - DHCPHeader->TransactionID = DHCP_TRANSACTION_ID; - DHCPHeader->ElapsedSeconds = 0; - DHCPHeader->Flags = HTONS(BOOTP_BROADCAST); - memcpy(&DHCPHeader->ClientIP, &uip_hostaddr, sizeof(uip_ipaddr_t)); - memcpy(&DHCPHeader->YourIP, &AppState->DHCPClient.DHCPOffer_Data.AllocatedIP, sizeof(uip_ipaddr_t)); - memcpy(&DHCPHeader->NextServerIP, &AppState->DHCPClient.DHCPOffer_Data.ServerIP, sizeof(uip_ipaddr_t)); - memcpy(&DHCPHeader->ClientHardwareAddress, &MACAddress, 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); -} - -#endif - diff --git a/lib/lufa/Projects/Webserver/Lib/DHCPClientApp.h b/lib/lufa/Projects/Webserver/Lib/DHCPClientApp.h deleted file mode 100644 index 0aec00331c..0000000000 --- a/lib/lufa/Projects/Webserver/Lib/DHCPClientApp.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 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 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 - 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 DHCPClientApp.c. - */ - -#ifndef _DHCPCLIENT_APP_H_ -#define _DHCPCLIENT_APP_H_ - - /* Includes: */ - #include <stdio.h> - - #include <uip.h> - - #include "Config/AppConfig.h" - #include "../Webserver.h" - #include "DHCPCommon.h" - - /* Enums: */ - /** States for each DHCP connection to a DHCP client. */ - enum DHCP_Client_States_t - { - DHCP_STATE_SendDiscover, /**< Send DISCOVER packet to retrieve DHCP lease offers */ - DHCP_STATE_WaitForOffer, /**< Waiting for OFFER packet giving available DHCP leases */ - DHCP_STATE_SendRequest, /**< Send REQUEST packet to request a DHCP lease */ - DHCP_STATE_WaitForACK, /**< Wait for ACK packet to complete the DHCP lease */ - DHCP_STATE_AddressLeased, /**< DHCP address has been leased from a DHCP server */ - }; - - /* Function Prototypes: */ - void DHCPClientApp_Init(void); - void DHCPClientApp_Callback(void); - - #if defined(INCLUDE_FROM_DHCPCLIENTAPP_C) - static uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* const DHCPHeader, - const uint8_t DHCPMessageType, - uip_udp_appstate_t* const AppState); - #endif -#endif - diff --git a/lib/lufa/Projects/Webserver/Lib/DHCPCommon.c b/lib/lufa/Projects/Webserver/Lib/DHCPCommon.c deleted file mode 100644 index 6d80f65cae..0000000000 --- a/lib/lufa/Projects/Webserver/Lib/DHCPCommon.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 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 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 - 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 - * - * Common DHCP routines to manage DHCP packet data. - */ - -#include "DHCPCommon.h" - -#if defined(ENABLE_DHCP_CLIENT) || defined(ENABLE_DHCP_SERVER) || defined(__DOXYGEN__) - -/** 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 \c true if the option was found in the DHCP packet's options list, \c 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 - diff --git a/lib/lufa/Projects/Webserver/Lib/DHCPCommon.h b/lib/lufa/Projects/Webserver/Lib/DHCPCommon.h deleted file mode 100644 index 8f54c16717..0000000000 --- a/lib/lufa/Projects/Webserver/Lib/DHCPCommon.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 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 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 - 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 "Config/AppConfig.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 - diff --git a/lib/lufa/Projects/Webserver/Lib/DHCPServerApp.c b/lib/lufa/Projects/Webserver/Lib/DHCPServerApp.c deleted file mode 100644 index fea54ddb0e..0000000000 --- a/lib/lufa/Projects/Webserver/Lib/DHCPServerApp.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2017. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -*/ - -/* - Copyright 2017 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 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 - 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 - * - * 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" - -#if defined(ENABLE_DHCP_SERVER) || defined(__DOXYGEN__) - -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; - - /* Only process when new data arrives - don't retransmit lost packets */ - if (uip_newdata()) - { - /* Get the DHCP message type (if present), otherwise early-abort */ - uint8_t DHCPMessageType; - if (!(DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &DHCPMessageType))) - return; - - uip_ipaddr_t Netmask, GatewayIPAddress, PreferredClientIP; - struct uip_eth_addr RemoteMACAddress; - uint32_t TransactionID; - - /* Get configured network mask, gateway IP and extract out DHCP transaction ID and remote IP */ - uip_getnetmask(&Netmask); - uip_getdraddr(&GatewayIPAddress); - memcpy(&RemoteMACAddress, &AppData->ClientHardwareAddress, sizeof(struct uip_eth_addr)); - TransactionID = AppData->TransactionID; - - /* Try to extract out the client's preferred IP address if it is indicated in the packet */ - if (!(DHCPCommon_GetOption(AppData->Options, DHCP_OPTION_REQ_IPADDR, &PreferredClientIP))) - memcpy(&PreferredClientIP, &uip_all_zeroes_addr, sizeof(uip_ipaddr_t)); - - switch (DHCPMessageType) - { - case DHCP_DISCOVER: - /* If no preference was made or the preferred IP is already taken, find a new address */ - if (DHCPServerApp_CheckIfIPLeased(&PreferredClientIP)) - DHCPServerApp_GetUnleasedIP(&PreferredClientIP); - - /* Create a new DHCP OFFER packet with the offered IP address */ - AppDataSize += DHCPServerApp_FillDHCPHeader(AppData, DHCP_OFFER, &RemoteMACAddress, &PreferredClientIP, TransactionID); - - /* Add network mask and router information to the list of DHCP OFFER packet options */ - 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 */ |