diff options
Diffstat (limited to 'lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib')
22 files changed, 0 insertions, 3233 deletions
| diff --git a/lib/lufa b/lib/lufa new file mode 160000 +Subproject ce10f7642b0459e409839b23cc91498945119b4 diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.c deleted file mode 100644 index 24008705c1..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.c +++ /dev/null @@ -1,87 +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 - * - *  Address Resolution Protocol (ARP) packet handling routines. This protocol handles the - *  conversion of physical MAC addresses to protocol IP addresses between the host and the - *  device. - */ - -#include "ARP.h" - -/** Processes an ARP packet inside an Ethernet frame, and writes the appropriate response - *  to the output Ethernet frame if the host is requesting the IP or MAC address of the - *  virtual server device on the network. - * - *  \param[in] InDataStart    Pointer to the start of the incoming packet's ARP header - *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's ARP header - * - *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise - */ -int16_t ARP_ProcessARPPacket(void* InDataStart, -                             void* OutDataStart) -{ -	DecodeARPHeader(InDataStart); - -	ARP_Header_t* ARPHeaderIN  = (ARP_Header_t*)InDataStart; -	ARP_Header_t* ARPHeaderOUT = (ARP_Header_t*)OutDataStart; - -	/* Ensure that the ARP request is a IPv4 request packet */ -	if ((SwapEndian_16(ARPHeaderIN->ProtocolType) == ETHERTYPE_IPV4) && -	    (SwapEndian_16(ARPHeaderIN->Operation) == ARP_OPERATION_REQUEST)) -	{ -		/* If the ARP packet is requesting the MAC or IP of the virtual webserver, return the response */ -		if (IP_COMPARE(&ARPHeaderIN->TPA, &ServerIPAddress) || -		    MAC_COMPARE(&ARPHeaderIN->THA, &ServerMACAddress)) -		{ -			/* Fill out the ARP response header */ -			ARPHeaderOUT->HardwareType = ARPHeaderIN->HardwareType; -			ARPHeaderOUT->ProtocolType = ARPHeaderIN->ProtocolType; -			ARPHeaderOUT->HLEN         = ARPHeaderIN->HLEN; -			ARPHeaderOUT->PLEN         = ARPHeaderIN->PLEN; -			ARPHeaderOUT->Operation    = SwapEndian_16(ARP_OPERATION_REPLY); - -			/* Copy over the sender MAC/IP to the target fields for the response */ -			ARPHeaderOUT->THA = ARPHeaderIN->SHA; -			ARPHeaderOUT->TPA = ARPHeaderIN->SPA; - -			/* Copy over the new sender MAC/IP - MAC and IP addresses of the virtual webserver */ -			ARPHeaderOUT->SHA = ServerMACAddress; -			ARPHeaderOUT->SPA = ServerIPAddress; - -			/* Return the size of the response so far */ -			return sizeof(ARP_Header_t); -		} -	} - -	return NO_RESPONSE; -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.h deleted file mode 100644 index c809cbf44a..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ARP.h +++ /dev/null @@ -1,78 +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 ARP.c. - */ - -#ifndef _ARP_H_ -#define _ARP_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <string.h> - -		#include <LUFA/Drivers/USB/USB.h> - -		#include "EthernetProtocols.h" -		#include "Ethernet.h" -		#include "ProtocolDecoders.h" - -	/* Macros: */ -		/** ARP header operation constant, indicating a request from a host for an address translation. */ -		#define ARP_OPERATION_REQUEST            1 - -		/** ARP header operation constant, indicating a reply from a host giving an address translation. */ -		#define ARP_OPERATION_REPLY              2 - -	/* Type Defines: */ -		/** Type define for an ARP packet inside an Ethernet frame. */ -		typedef struct -		{ -			uint16_t      HardwareType; /**< Hardware type constant, indicating the hardware used */ -			uint16_t      ProtocolType; /**< Protocol being resolved, usually ETHERTYPE_IPV4 */ - -			uint8_t       HLEN; /**< Length in bytes of the source/destination hardware addresses */ -			uint8_t       PLEN; /**< Length in bytes of the source/destination protocol addresses */ -			uint16_t      Operation; /**< Type of operation, either ARP_OPERATION_REQUEST or ARP_OPERATION_REPLY */ - -			MAC_Address_t SHA; /**< Sender's hardware address */ -			IP_Address_t  SPA; /**< Sender's protocol address */ -			MAC_Address_t THA; /**< Target's hardware address */ -			IP_Address_t  TPA; /**< Target's protocol address */ -		} ARP_Header_t; - -	/* Function Prototypes: */ -		int16_t ARP_ProcessARPPacket(void* InDataStart, -		                             void* OutDataStart); - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.c deleted file mode 100644 index 6f7b40af69..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.c +++ /dev/null @@ -1,129 +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 - * - *  Dynamic Host Configuration Protocol (DHCP) packet handling routines. This protocol - *  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 - *  to the output Ethernet frame if the host is requesting or accepting an IP address. - * - *  \param[in] IPHeaderInStart      Pointer to the start of the incoming packet's IP header - *  \param[in] DHCPHeaderInStart    Pointer to the start of the incoming packet's DHCP header - *  \param[out] DHCPHeaderOutStart  Pointer to the start of the outgoing packet's DHCP header - * - *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise - */ -int16_t DHCP_ProcessDHCPPacket(void* IPHeaderInStart, -                               void* DHCPHeaderInStart, -                               void* DHCPHeaderOutStart) -{ -	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)); - -	DecodeDHCPHeader(DHCPHeaderInStart); - -	/* 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 */ -	DHCPHeaderOUT->HardwareType          = DHCPHeaderIN->HardwareType; -	DHCPHeaderOUT->Operation             = DHCP_OP_BOOTREPLY; -	DHCPHeaderOUT->HardwareAddressLength = DHCPHeaderIN->HardwareAddressLength; -	DHCPHeaderOUT->Hops                  = 0; -	DHCPHeaderOUT->TransactionID         = DHCPHeaderIN->TransactionID; -	DHCPHeaderOUT->ElapsedSeconds        = 0; -	DHCPHeaderOUT->Flags                 = DHCPHeaderIN->Flags; -	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; -	IPHeaderIN->DestinationAddress = ServerIPAddress; - -	/* 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) -		{ -			if ((DHCPOptionsINStart[2] == DHCP_MESSAGETYPE_DISCOVER) || (DHCPOptionsINStart[2] == DHCP_MESSAGETYPE_REQUEST)) -			{ -				/* Fill out the response DHCP packet options for a DHCP OFFER or ACK response */ - -				*(DHCPOptionsOUTStart++) = DHCP_OPTION_MESSAGETYPE; -				*(DHCPOptionsOUTStart++) = 1; -				*(DHCPOptionsOUTStart++) = (DHCPOptionsINStart[2] == DHCP_MESSAGETYPE_DISCOVER) ? DHCP_MESSAGETYPE_OFFER -																								: DHCP_MESSAGETYPE_ACK; - -				*(DHCPOptionsOUTStart++) = DHCP_OPTION_SUBNETMASK; -				*(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) + 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; -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.h deleted file mode 100644 index 5ef78469ec..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/DHCP.h +++ /dev/null @@ -1,131 +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 DHCP.c. - */ - -#ifndef _DHCP_H_ -#define _DHCP_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <string.h> - -		#include "EthernetProtocols.h" -		#include "Ethernet.h" -		#include "ProtocolDecoders.h" - -	/* Macros: */ -		/** DHCP operation constant, indicating a request from a host to a DHCP server. */ -		#define DHCP_OP_BOOTREQUEST       0x01 - -		/** DHCP operation constant, indicating a reply from a DHCP server to a host. */ -		#define DHCP_OP_BOOTREPLY         0x02 - -		/** Hardware type constant, indicating Ethernet as a carrier. */ -		#define DHCP_HTYPE_ETHERNET       0x01 - -		/** Magic boot protocol "cookie", inserted into all BOOTP packets (BOOTP is the carrier of DHCP). */ -		#define DHCP_MAGIC_COOKIE         0x63825363 - -		/** DHCP option list entry header, indicating that a subnet mask will follow. */ -		#define DHCP_OPTION_SUBNETMASK    1 - -		/** DHCP option list entry header, indicating that the Lease Time will follow. */ -		#define DHCP_OPTION_LEASETIME     51 - -		/** DHCP option list entry header, indicating that the DHCP message type constant will follow. */ -		#define DHCP_OPTION_MESSAGETYPE   53 - -		/** DHCP option list entry header, indicating that the IP address of the DHCP server will follow. */ -		#define DHCP_OPTION_DHCPSERVER    54 - -		/** DHCP option list entry header, used to pad out option data. */ -		#define DHCP_OPTION_PAD           0 - -		/** DHCP option list entry header, indicating the end of option data. */ -		#define DHCP_OPTION_END           255 - -		/** Message type constant, used in the DHCP option data field, requesting that a DHCP server offer an IP address. */ -		#define DHCP_MESSAGETYPE_DISCOVER 1 - -		/** Message type constant, used in the DHCP option data field, indicating that a DHCP server is offering an IP address. */ -		#define DHCP_MESSAGETYPE_OFFER    2 - -		/** Message type constant, used in the DHCP option data field, requesting that a DHCP server lease a given IP address. */ -		#define DHCP_MESSAGETYPE_REQUEST  3 - -		/** Message type constant, used in the DHCP option data field, declining an offered DHCP server IP address lease. */ -		#define DHCP_MESSAGETYPE_DECLINE  4 - -		/** Message type constant, used in the DHCP option data field, ACKing a host IP lease request. */ -		#define DHCP_MESSAGETYPE_ACK      5 - -		/** Message type constant, used in the DHCP option data field, NACKing a host IP lease request. */ -		#define DHCP_MESSAGETYPE_NACK     6 - -		/** Message type constant, used in the DHCP option data field, indicating that a host is releasing a leased IP address. */ -		#define DHCP_MESSAGETYPE_RELEASE  7 - -	/* 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 */ - -			IP_Address_t ClientIP; /**< Client IP address, if already leased an IP */ -			IP_Address_t YourIP; /**< Client IP address */ -			IP_Address_t NextServerIP; /**< Legacy BOOTP protocol field, unused for DHCP */ -			IP_Address_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 */ -		} DHCP_Header_t; - -	/* Function Prototypes: */ -		int16_t DHCP_ProcessDHCPPacket(void* IPHeaderInStart, -		                               void* DHCPHeaderInStart, -		                               void* DHCPHeaderOutStart); - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.c deleted file mode 100644 index a48de2c717..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.c +++ /dev/null @@ -1,136 +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 - * - *  Ethernet frame packet handling routines. This protocol handles the processing of raw Ethernet - *  frames sent and received, deferring the processing of sub-packet protocols to the appropriate - *  protocol handlers, such as DHCP or ARP. - */ - -#include "Ethernet.h" - -/** Ethernet Frame buffer structure, to hold the incoming Ethernet frame from the host. */ -Ethernet_Frame_Info_t FrameIN; - -/** Ethernet Frame buffer structure, to hold the outgoing Ethernet frame to the host. */ -Ethernet_Frame_Info_t FrameOUT; - -/** Constant for convenience when checking against or setting a MAC address to the virtual server MAC address. */ -const MAC_Address_t ServerMACAddress    = {SERVER_MAC_ADDRESS}; - -/** Constant for convenience when checking against or setting an IP address to the virtual server IP address. */ -const IP_Address_t  ServerIPAddress     = {SERVER_IP_ADDRESS}; - -/** Constant for convenience when checking against or setting a MAC address to the broadcast MAC address. */ -const MAC_Address_t BroadcastMACAddress = {BROADCAST_MAC_ADDRESS}; - -/** Constant for convenience when checking against or setting a IP address to the broadcast IP address. */ -const IP_Address_t  BroadcastIPAddress  = {BROADCAST_IP_ADDRESS}; - -/** Constant for convenience when checking against or setting an IP address to the client (host) IP address. */ -const IP_Address_t  ClientIPAddress     = {CLIENT_IP_ADDRESS}; - - -/** Processes an incoming Ethernet frame, and writes the appropriate response to the output Ethernet - *  frame buffer if the sub protocol handlers create a valid response. - */ -void Ethernet_ProcessPacket(void) -{ -	DecodeEthernetFrameHeader(FrameIN.FrameData); - -	/* Cast the incoming Ethernet frame to the Ethernet header type */ -	Ethernet_Frame_Header_t* FrameINHeader  = (Ethernet_Frame_Header_t*)&FrameIN.FrameData; -	Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&FrameOUT.FrameData; - -	int16_t                  RetSize        = NO_RESPONSE; - -	/* Ensure frame is addressed to either all (broadcast) or the virtual webserver, and is a type II frame */ -	if ((MAC_COMPARE(&FrameINHeader->Destination, &ServerMACAddress) || -	     MAC_COMPARE(&FrameINHeader->Destination, &BroadcastMACAddress)) && -		(SwapEndian_16(FrameIN.FrameLength) > ETHERNET_VER2_MINSIZE)) -	{ -		/* Process the packet depending on its protocol */ -		switch (SwapEndian_16(FrameINHeader->EtherType)) -		{ -			case ETHERTYPE_ARP: -				RetSize = ARP_ProcessARPPacket(&FrameIN.FrameData[sizeof(Ethernet_Frame_Header_t)], -				                               &FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)]); -				break; -			case ETHERTYPE_IPV4: -				RetSize = IP_ProcessIPPacket(&FrameIN.FrameData[sizeof(Ethernet_Frame_Header_t)], -				                             &FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)]); -				break; -		} - -		/* Protocol processing routine has filled a response, complete the ethernet frame header */ -		if (RetSize > 0) -		{ -			/* Fill out the response Ethernet frame header */ -			FrameOUTHeader->Source          = ServerMACAddress; -			FrameOUTHeader->Destination     = FrameINHeader->Source; -			FrameOUTHeader->EtherType       = FrameINHeader->EtherType; - -			/* Set the response length in the buffer and indicate that a response is ready to be sent */ -			FrameOUT.FrameLength            = (sizeof(Ethernet_Frame_Header_t) + RetSize); -		} -	} - -	/* Check if the packet was processed */ -	if (RetSize != NO_PROCESS) -	{ -		/* Clear the frame buffer */ -		FrameIN.FrameLength = 0; -	} -} - -/** Calculates the appropriate ethernet checksum, consisting of the addition of the one's - *  compliment of each word, complimented. - * - *  \param[in] Data   Pointer to the packet buffer data whose checksum must be calculated - *  \param[in] Bytes  Number of bytes in the data buffer to process - * - *  \return A 16-bit Ethernet checksum value - */ -uint16_t Ethernet_Checksum16(void* Data, -                             uint16_t Bytes) -{ -	uint16_t* Words    = (uint16_t*)Data; -	uint32_t  Checksum = 0; - -	for (uint16_t CurrWord = 0; CurrWord < (Bytes >> 1); CurrWord++) -	  Checksum += Words[CurrWord]; - -	while (Checksum & 0xFFFF0000) -	  Checksum = ((Checksum & 0xFFFF) + (Checksum >> 16)); - -	return ~Checksum; -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h deleted file mode 100644 index 8eaf64080b..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Ethernet.h +++ /dev/null @@ -1,111 +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 Ethernet.c. - */ - -#ifndef _ETHERNET_H_ -#define _ETHERNET_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <string.h> - -		#include "Config/AppConfig.h" - -		#include "EthernetProtocols.h" -		#include "ProtocolDecoders.h" -		#include "ICMP.h" -		#include "TCP.h" -		#include "UDP.h" -		#include "DHCP.h" -		#include "ARP.h" -		#include "IP.h" - -	/* Macros: */ -		/** Physical MAC address of the network broadcast address. */ -		#define BROADCAST_MAC_ADDRESS            {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} - -		/** Performs a comparison between two MAC addresses, indicating if they are identical. -		 * -		 *  \param[in] MAC1  First MAC address -		 *  \param[in] MAC2  Second MAC address -		 * -		 *  \return True if the addresses match, \c false otherwise -		 */ -		#define MAC_COMPARE(MAC1, MAC2)          (memcmp(MAC1, MAC2, sizeof(MAC_Address_t)) == 0) - -		/** Maximum size of an incoming or outgoing Ethernet frame in bytes. */ -		#define ETHERNET_FRAME_SIZE_MAX          1500 - -		/** Minimum size of an Ethernet packet in bytes, to conform to the Ethernet V2 packet standard. */ -		#define ETHERNET_VER2_MINSIZE            0x0600 - -		/** Return value for all sub protocol handling routines, indicating that no response packet has been generated. */ -		#define NO_RESPONSE                      0 - -		/** Return value for all sub protocol handling routines, indicating that the packet has not yet been handled. */ -		#define NO_PROCESS                       -1 - -	/* Type Defines: */ -		/** Type define for an Ethernet frame buffer data and information structure. */ -		typedef struct -		{ -			uint8_t  FrameData[ETHERNET_FRAME_SIZE_MAX]; /**< Ethernet frame contents. */ -			uint16_t FrameLength; /**< Length in bytes of the Ethernet frame stored in the buffer. */ -		} Ethernet_Frame_Info_t; - -		/** Type define for an Ethernet frame header. */ -		typedef struct -		{ -			MAC_Address_t Destination; /**< Physical MAC address of the packet recipient */ -			MAC_Address_t Source; /**< Physics MAC address of the packet source */ -			uint16_t      EtherType; /**< Ethernet packet sub-protocol type, for Ethernet V2 packets */ -		} Ethernet_Frame_Header_t; - -	/* External Variables: */ -		extern Ethernet_Frame_Info_t FrameIN; -		extern Ethernet_Frame_Info_t FrameOUT; - -		extern const MAC_Address_t ServerMACAddress; -		extern const IP_Address_t  ServerIPAddress; -		extern const MAC_Address_t BroadcastMACAddress; -		extern const IP_Address_t  BroadcastIPAddress; -		extern const IP_Address_t  ClientIPAddress; - -	/* Function Prototypes: */ -		void     Ethernet_ProcessPacket(void); -		uint16_t Ethernet_Checksum16(void* Data, -		                             uint16_t Bytes); - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/EthernetProtocols.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/EthernetProtocols.h deleted file mode 100644 index ca738cd0db..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/EthernetProtocols.h +++ /dev/null @@ -1,88 +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 - * - *  General Ethernet protocol constants and type defines, for use by - *  all network protocol portions of the TCP/IP stack. - */ - -#ifndef _ETHERNET_PROTOCOLS_H_ -#define _ETHERNET_PROTOCOLS_H_ - -	/* Macros: */ -		#define ETHERTYPE_IPV4                   0x0800 -		#define ETHERTYPE_ARP                    0x0806 -		#define ETHERTYPE_RARP                   0x8035 -		#define ETHERTYPE_APPLETALK              0x809b -		#define ETHERTYPE_APPLETALKARP           0x80f3 -		#define ETHERTYPE_IEEE8021Q              0x8100 -		#define ETHERTYPE_NOVELLIPX              0x8137 -		#define ETHERTYPE_NOVELL                 0x8138 -		#define ETHERTYPE_IPV6                   0x86DD -		#define ETHERTYPE_COBRANET               0x8819 -		#define ETHERTYPE_PROVIDERBRIDGING       0x88a8 -		#define ETHERTYPE_MPLSUNICAST            0x8847 -		#define ETHERTYPE_MPLSMULTICAST          0x8848 -		#define ETHERTYPE_PPPoEDISCOVERY         0x8863 -		#define ETHERTYPE_PPPoESESSION           0x8864 -		#define ETHERTYPE_EAPOVERLAN             0x888E -		#define ETHERTYPE_HYPERSCSI              0x889A -		#define ETHERTYPE_ATAOVERETHERNET        0x88A2 -		#define ETHERTYPE_ETHERCAT               0x88A4 -		#define ETHERTYPE_SERCOSIII              0x88CD -		#define ETHERTYPE_CESoE                  0x88D8 -		#define ETHERTYPE_MACSECURITY            0x88E5 -		#define ETHERTYPE_FIBRECHANNEL           0x8906 -		#define ETHERTYPE_QINQ                   0x9100 -		#define ETHERTYPE_VLLT                   0xCAFE - -		#define PROTOCOL_ICMP                    1 -		#define PROTOCOL_IGMP                    2 -		#define PROTOCOL_TCP                     6 -		#define PROTOCOL_UDP                     17 -		#define PROTOCOL_OSPF                    89 -		#define PROTOCOL_SCTP                    132 - -	/* Type Defines: */ -		/** Type define for a physical MAC address of a device on a network. */ -		typedef struct -		{ -			uint8_t       Octets[6]; /**< Individual bytes of a MAC address */ -		} RNDIS_MAC_Address_t; - -		/** Type define for a protocol IP address of a device on a network. */ -		typedef struct -		{ -			uint8_t       Octets[4]; /**< Individual bytes of an IP address */ -		} IP_Address_t; - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c deleted file mode 100644 index b144c4c517..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.c +++ /dev/null @@ -1,81 +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 - * - *  Internet Control Message Protocol (ICMP) packet handling routines. This protocol handles - *  Echo requests from the host, to indicate a successful network connection between the host - *  and the virtual server. - */ - -#include "ICMP.h" - -/** Processes an ICMP packet inside an Ethernet frame, and writes the appropriate response - *  to the output Ethernet frame if the host is issuing a ICMP ECHO request. - * - *  \param[in] InDataStart    Pointer to the start of the incoming packet's ICMP header - *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's ICMP header - * - *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise - */ -int16_t ICMP_ProcessICMPPacket(void* InDataStart, -                               void* OutDataStart) -{ -	ICMP_Header_t* ICMPHeaderIN  = (ICMP_Header_t*)InDataStart; -	ICMP_Header_t* ICMPHeaderOUT = (ICMP_Header_t*)OutDataStart; - -	DecodeICMPHeader(InDataStart); - -	/* Determine if the ICMP packet is an echo request (ping) */ -	if (ICMPHeaderIN->Type == ICMP_TYPE_ECHOREQUEST) -	{ -		/* Fill out the ICMP response packet */ -		ICMPHeaderOUT->Type     = ICMP_TYPE_ECHOREPLY; -		ICMPHeaderOUT->Code     = 0; -		ICMPHeaderOUT->Checksum = 0; -		ICMPHeaderOUT->Id       = ICMPHeaderIN->Id; -		ICMPHeaderOUT->Sequence = ICMPHeaderIN->Sequence; - -		intptr_t DataSize = FrameIN.FrameLength - ((((intptr_t)InDataStart + sizeof(ICMP_Header_t)) - (intptr_t)FrameIN.FrameData)); - -		/* Copy the remaining payload to the response - echo requests should echo back any sent data */ -		memmove(&((uint8_t*)OutDataStart)[sizeof(ICMP_Header_t)], -		        &((uint8_t*)InDataStart)[sizeof(ICMP_Header_t)], -			    DataSize); - -		ICMPHeaderOUT->Checksum = Ethernet_Checksum16(ICMPHeaderOUT, (DataSize + sizeof(ICMP_Header_t))); - -		/* Return the size of the response so far */ -		return (DataSize + sizeof(ICMP_Header_t)); -	} - -	return NO_RESPONSE; -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.h deleted file mode 100644 index e8039da3e0..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ICMP.h +++ /dev/null @@ -1,82 +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 ICMP.c. - */ - -#ifndef _ICMP_H_ -#define _ICMP_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <string.h> - -		#include "EthernetProtocols.h" -		#include "Ethernet.h" -		#include "ProtocolDecoders.h" - -	/* Macros: */ -		/** ICMP message type constant, indicating an ICMP ECHO Reply message. */ -		#define ICMP_TYPE_ECHOREPLY              0 - -		/** ICMP message type constant, indicating a packet destination is unreachable. */ -		#define ICMP_TYPE_DESTINATIONUNREACHABLE 3 - -		/** ICMP message type constant, indicating an ICMP Source Quench message. */ -		#define ICMP_TYPE_SOURCEQUENCH           4 - -		/** ICMP message type constant, indicating an ICMP Redirect message. */ -		#define ICMP_TYPE_REDIRECTMESSAGE        5 - -		/** ICMP message type constant, indicating an ICMP ECHO Request message. */ -		#define ICMP_TYPE_ECHOREQUEST            8 - -		/** ICMP message type constant, indicating an ICMP Time Exceeded message. */ -		#define ICMP_TYPE_TIMEEXCEEDED           11 - -	/* Type Defines: */ -		/** Type define for an ICMP message header. */ -		typedef struct -		{ -			uint8_t       Type; /**< ICMP message type, an \c ICMP_TYPE_* constant */ -			uint8_t       Code; /**< ICMP message code, indicating the message value */ -			uint16_t      Checksum; /**< Ethernet checksum of the ICMP message */ -			uint16_t      Id; /**< Id of the ICMP message */ -			uint16_t      Sequence; /**< Sequence number of the ICMP message, to link together message responses */ -		} ICMP_Header_t; - -	/* Function Prototypes: */ -		int16_t ICMP_ProcessICMPPacket(void* InDataStart, -		                               void* OutDataStart); - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.c deleted file mode 100644 index dfa583b853..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.c +++ /dev/null @@ -1,113 +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 - * - *  Internet Protocol (IP) packet handling routines. This protocol handles IP packets from the - *  host which typically encapsulate other protocols such as ICMP, UDP and TCP. - */ - -#include "IP.h" - -/** Processes an IP packet inside an Ethernet frame, and writes the appropriate response - *  to the output Ethernet frame if one is created by a sub-protocol handler. - * - *  \param[in] InDataStart    Pointer to the start of the incoming packet's IP header - *  \param[out] OutDataStart  Pointer to the start of the outgoing packet's IP header - * - *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE if no - *           response was generated, NO_PROCESS if the packet processing was deferred until the - *           next Ethernet packet handler iteration - */ -int16_t IP_ProcessIPPacket(void* InDataStart, -                           void* OutDataStart) -{ -	DecodeIPHeader(InDataStart); - -	IP_Header_t* IPHeaderIN  = (IP_Header_t*)InDataStart; -	IP_Header_t* IPHeaderOUT = (IP_Header_t*)OutDataStart; - -	/* Header length is specified in number of longs in the packet header, convert to bytes */ -	uint16_t HeaderLengthBytes = (IPHeaderIN->HeaderLength * sizeof(uint32_t)); - -	int16_t  RetSize = NO_RESPONSE; - -	/* Check to ensure the IP packet is addressed to the virtual webserver's IP or the broadcast IP address */ -	if (!(IP_COMPARE(&IPHeaderIN->DestinationAddress, &ServerIPAddress)) && -	    !(IP_COMPARE(&IPHeaderIN->DestinationAddress, &BroadcastIPAddress))) -	{ -		return NO_RESPONSE; -	} - -	/* Pass off the IP payload to the appropriate protocol processing routine */ -	switch (IPHeaderIN->Protocol) -	{ -		case PROTOCOL_ICMP: -			RetSize = ICMP_ProcessICMPPacket(&((uint8_t*)InDataStart)[HeaderLengthBytes], -			                                 &((uint8_t*)OutDataStart)[sizeof(IP_Header_t)]); -			break; -		case PROTOCOL_TCP: -			RetSize = TCP_ProcessTCPPacket(InDataStart, -			                               &((uint8_t*)InDataStart)[HeaderLengthBytes], -			                               &((uint8_t*)OutDataStart)[sizeof(IP_Header_t)]); -			break; -		case PROTOCOL_UDP: -			RetSize = UDP_ProcessUDPPacket(InDataStart, -			                               &((uint8_t*)InDataStart)[HeaderLengthBytes], -			                               &((uint8_t*)OutDataStart)[sizeof(IP_Header_t)]); -			break; -	} - -	/* Check to see if the protocol processing routine has filled out a response */ -	if (RetSize > 0) -	{ -		/* Fill out the response IP packet header */ -		IPHeaderOUT->TotalLength        = SwapEndian_16(sizeof(IP_Header_t) + RetSize); -		IPHeaderOUT->TypeOfService      = 0; -		IPHeaderOUT->HeaderLength       = (sizeof(IP_Header_t) / sizeof(uint32_t)); -		IPHeaderOUT->Version            = 4; -		IPHeaderOUT->Flags              = 0; -		IPHeaderOUT->FragmentOffset     = 0; -		IPHeaderOUT->Identification     = 0; -		IPHeaderOUT->HeaderChecksum     = 0; -		IPHeaderOUT->Protocol           = IPHeaderIN->Protocol; -		IPHeaderOUT->TTL                = DEFAULT_TTL; -		IPHeaderOUT->SourceAddress      = IPHeaderIN->DestinationAddress; -		IPHeaderOUT->DestinationAddress = IPHeaderIN->SourceAddress; - -		IPHeaderOUT->HeaderChecksum     = Ethernet_Checksum16(IPHeaderOUT, sizeof(IP_Header_t)); - -		/* Return the size of the response so far */ -		return (sizeof(IP_Header_t) + RetSize); -	} - -	return RetSize; -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.h deleted file mode 100644 index 48f2c9086f..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/IP.h +++ /dev/null @@ -1,92 +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 IP.c. - */ - -#ifndef _IP_H_ -#define _IP_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <string.h> - -		#include "EthernetProtocols.h" -		#include "Ethernet.h" -		#include "ProtocolDecoders.h" -		#include "Config/AppConfig.h" - -	/* Macros: */ -		/** Protocol IP address of the broadcast address. */ -		#define BROADCAST_IP_ADDRESS             {0xFF, 0xFF, 0xFF, 0xFF} - -		/** Default Time To Live (TTL) value for sent packets, indicating the maximum allowable hops until their destination -		 *  is reached. -		 */ -		#define DEFAULT_TTL                      128 - -		/** Performs a comparison between two IP addresses, indicating if they are identical. -		 * -		 *  \param[in] IP1  First IP address -		 *  \param[in] IP2  Second IP address -		 * -		 *  \return True if the addresses match, \c false otherwise -		 */ -		#define IP_COMPARE(IP1, IP2)             (memcmp(IP1, IP2, sizeof(IP_Address_t)) == 0) - -	/* Type Defines: */ -		/** Type define of an IP packet header. */ -		typedef struct -		{ -			unsigned     HeaderLength   : 4; /**< Total length of the packet header, in 4-byte blocks */ -			unsigned     Version        : 4; /**< IP protocol version */ -			uint8_t      TypeOfService; /**< Special service type identifier, indicating delay/throughput/reliability levels */ -			uint16_t     TotalLength; /**< Total length of the IP packet, in bytes */ - -			uint16_t     Identification; /**< Identification value for identifying fragmented packets */ -			unsigned     FragmentOffset : 13; /**< Offset of this IP fragment */ -			unsigned     Flags          : 3; /**< Fragment flags, to indicate if a packet is fragmented */ - -			uint8_t      TTL; /**< Maximum allowable number of hops to reach the packet destination */ -			uint8_t      Protocol; /**< Encapsulated protocol type */ -			uint16_t     HeaderChecksum; /**< Ethernet checksum of the IP header */ - -			IP_Address_t SourceAddress; /**< Source protocol IP address of the packet */ -			IP_Address_t DestinationAddress; /**< Destination protocol IP address of the packet */ -		} IP_Header_t; - -	/* Function Prototypes: */ -		int16_t IP_ProcessIPPacket(void* InDataStart, -		                           void* OutDataStart); - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c deleted file mode 100644 index 90d678bf4b..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.c +++ /dev/null @@ -1,276 +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. -*/ - -/* Protocol decoders for Ethernet, TCP, IP, ICMP and ARP. Each of these routines -   accepts a header to the appropriate protocol and prints out pertinent information -   on the packet through the serial port. - -   To disable printing of a specific protocol, define the token NO_DECODE_{Protocol} -   in the project makefile, and pass it to the compiler using the -D switch. -*/ - -/** \file - * - *  Protocol decoding routines, for the plain-text decoding of Ethernet frames for debugging purposes. - *  Enabled protocol decoders will print incoming Ethernet frame contents through the USART in a human - *  readable format. - * - *  Note that the USART is a slow transmission medium, and will slow down packet processing considerably. - *  Packet decoding routines can be disabled by defining NO_DECODE_{Protocol Name} in the project makefile - *  and passing it to the compiler via the -D switch. - */ - -#include "ProtocolDecoders.h" - -/** Decodes an Ethernet frame header and prints its contents to through the USART in a human readable format. - * - *  \param[in] InDataStart  Pointer to the start of an Ethernet frame header - */ -void DecodeEthernetFrameHeader(void* InDataStart) -{ -	#if !defined(NO_DECODE_ETHERNET) -	Ethernet_Frame_Header_t* FrameHeader = (Ethernet_Frame_Header_t*)InDataStart; - -	printf_P(PSTR("\r\n")); - -	printf_P(PSTR("  ETHERNET\r\n")); - -	if (!(MAC_COMPARE(&FrameHeader->Destination, &ServerMACAddress)) && -	    !(MAC_COMPARE(&FrameHeader->Destination, &BroadcastMACAddress))) -	{ -		printf_P(PSTR("  + NOT ADDRESSED TO DEVICE\r\n")); -		return; -	} - -	printf_P(PSTR("  + MAC Source : %02X:%02X:%02X:%02X:%02X:%02X\r\n"), FrameHeader->Source.Octets[0], -	                                                                     FrameHeader->Source.Octets[1], -	                                                                     FrameHeader->Source.Octets[2], -	                                                                     FrameHeader->Source.Octets[3], -	                                                                     FrameHeader->Source.Octets[4], -	                                                                     FrameHeader->Source.Octets[5]); - -	printf_P(PSTR("  + MAC Dest: %02X:%02X:%02X:%02X:%02X:%02X\r\n"),    FrameHeader->Destination.Octets[0], -	                                                                     FrameHeader->Destination.Octets[1], -	                                                                     FrameHeader->Destination.Octets[2], -	                                                                     FrameHeader->Destination.Octets[3], -	                                                                     FrameHeader->Destination.Octets[4], -	                                                                     FrameHeader->Destination.Octets[5]); - -	printf_P(PSTR("  + Protocol: 0x%04x\r\n"), SwapEndian_16(FrameHeader->EtherType)); -	#endif -} - -/** Decodes an ARP header and prints its contents to through the USART in a human readable format. - * - *  \param[in] InDataStart  Pointer to the start of an ARP packet header - */ -void DecodeARPHeader(void* InDataStart) -{ -	#if !defined(NO_DECODE_ARP) -	ARP_Header_t* ARPHeader = (ARP_Header_t*)InDataStart; - -	printf_P(PSTR("   \\\r\n    ARP\r\n")); - -	if (!(IP_COMPARE(&ARPHeader->TPA, &ServerIPAddress)) && -	    !(MAC_COMPARE(&ARPHeader->THA, &ServerMACAddress))) -	{ -		printf_P(PSTR("    + NOT ADDRESSED TO DEVICE\r\n")); -		return; -	} - -	printf_P(PSTR("    + Protocol: %x\r\n"), SwapEndian_16(ARPHeader->ProtocolType)); -	printf_P(PSTR("    + Operation: %u\r\n"), SwapEndian_16(ARPHeader->Operation)); - -	if (SwapEndian_16(ARPHeader->ProtocolType) == ETHERTYPE_IPV4) -	{ -		printf_P(PSTR("    + SHA MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n"), ARPHeader->SHA.Octets[0], -		                                                                   ARPHeader->SHA.Octets[1], -		                                                                   ARPHeader->SHA.Octets[2], -		                                                                   ARPHeader->SHA.Octets[3], -		                                                                   ARPHeader->SHA.Octets[4], -		                                                                   ARPHeader->SHA.Octets[5]); - -		printf_P(PSTR("    + SPA IP: %u.%u.%u.%u\r\n"), ARPHeader->SPA.Octets[0], -		                                                ARPHeader->SPA.Octets[1], -		                                                ARPHeader->SPA.Octets[2], -		                                                ARPHeader->SPA.Octets[3]); - -		printf_P(PSTR("    + THA MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n"), ARPHeader->THA.Octets[0], -		                                                                   ARPHeader->THA.Octets[1], -		                                                                   ARPHeader->THA.Octets[2], -		                                                                   ARPHeader->THA.Octets[3], -		                                                                   ARPHeader->THA.Octets[4], -		                                                                   ARPHeader->THA.Octets[5]); - -		printf_P(PSTR("    + TPA IP: %u.%u.%u.%u\r\n"), ARPHeader->TPA.Octets[0], -		                                                ARPHeader->TPA.Octets[1], -		                                                ARPHeader->TPA.Octets[2], -		                                                ARPHeader->TPA.Octets[3]); -	} -	#endif -} - -/** Decodes an IP header and prints its contents to through the USART in a human readable format. - * - *  \param[in] InDataStart  Pointer to the start of an IP packet header - */ -void DecodeIPHeader(void* InDataStart) -{ -	#if !defined(NO_DECODE_IP) -	IP_Header_t* IPHeader  = (IP_Header_t*)InDataStart; - -	uint16_t HeaderLengthBytes = (IPHeader->HeaderLength * sizeof(uint32_t)); - -	printf_P(PSTR("   \\\r\n    IP\r\n")); - -	if (!(IP_COMPARE(&IPHeader->DestinationAddress, &ServerIPAddress))) -	{ -		printf_P(PSTR("    + NOT ADDRESSED TO DEVICE\r\n")); -		return; -	} - -	printf_P(PSTR("    + Header Length: %u Bytes\r\n"), HeaderLengthBytes); -	printf_P(PSTR("    + Packet Version: %u\r\n"), IPHeader->Version); -	printf_P(PSTR("    + Total Length: %u\r\n"), SwapEndian_16(IPHeader->TotalLength)); - -	printf_P(PSTR("    + Protocol: %u\r\n"), IPHeader->Protocol); -	printf_P(PSTR("    + TTL: %u\r\n"), IPHeader->TTL); - -	printf_P(PSTR("    + IP Src: %u.%u.%u.%u\r\n"), IPHeader->SourceAddress.Octets[0], -	                                                IPHeader->SourceAddress.Octets[1], -	                                                IPHeader->SourceAddress.Octets[2], -	                                                IPHeader->SourceAddress.Octets[3]); - -	printf_P(PSTR("    + IP Dst: %u.%u.%u.%u\r\n"), IPHeader->DestinationAddress.Octets[0], -	                                                IPHeader->DestinationAddress.Octets[1], -	                                                IPHeader->DestinationAddress.Octets[2], -	                                                IPHeader->DestinationAddress.Octets[3]); -	#endif -} - -/** Decodes an ICMP header and prints its contents to through the USART in a human readable format. - * - *  \param[in] InDataStart  Pointer to the start of an ICMP packet header - */ -void DecodeICMPHeader(void* InDataStart) -{ -	#if !defined(NO_DECODE_ICMP) -	ICMP_Header_t* ICMPHeader  = (ICMP_Header_t*)InDataStart; - -	printf_P(PSTR("    \\\r\n     ICMP\r\n")); - -	printf_P(PSTR("     + Type: %u\r\n"), ICMPHeader->Type); -	printf_P(PSTR("     + Code: %u\r\n"), ICMPHeader->Code); -	#endif -} - -/** Decodes a TCP header and prints its contents to through the USART in a human readable format. - * - *  \param[in] InDataStart  Pointer to the start of a TCP packet header - */ -void DecodeTCPHeader(void* InDataStart) -{ -	#if !defined(NO_DECODE_TCP) -	TCP_Header_t* TCPHeader  = (TCP_Header_t*)InDataStart; - -	uint16_t               HeaderLengthBytes = (TCPHeader->DataOffset * sizeof(uint32_t)); - -	printf_P(PSTR("    \\\r\n     TCP\r\n")); - -	printf_P(PSTR("     + Header Length: %u Bytes\r\n"), HeaderLengthBytes); - -	printf_P(PSTR("     + Source Port: %u\r\n"), SwapEndian_16(TCPHeader->SourcePort)); -	printf_P(PSTR("     + Destination Port: %u\r\n"), SwapEndian_16(TCPHeader->DestinationPort)); - -	printf_P(PSTR("     + Sequence Number: %lu\r\n"), SwapEndian_32(TCPHeader->SequenceNumber)); -	printf_P(PSTR("     + Acknowledgment Number: %lu\r\n"), SwapEndian_32(TCPHeader->AcknowledgmentNumber)); - -	printf_P(PSTR("     + Flags: 0x%02X\r\n"), TCPHeader->Flags); - -	if (TCP_GetPortState(TCPHeader->DestinationPort) == TCP_Port_Closed) -	  printf_P(PSTR("     + NOT LISTENING ON DESTINATION PORT\r\n")); -	#endif -} - -/** Decodes an UDP header and prints its contents to through the USART in a human readable format. - * - *  \param[in] InDataStart  Pointer to the start of a UDP packet header - */ -void DecodeUDPHeader(void* InDataStart) -{ -	#if !defined(NO_DECODE_UDP) -	UDP_Header_t* UDPHeader = (UDP_Header_t*)InDataStart; - -	printf_P(PSTR("    \\\r\n     UDP\r\n")); - -	printf_P(PSTR("     + Source Port: %u\r\n"), SwapEndian_16(UDPHeader->SourcePort)); -	printf_P(PSTR("     + Destination Port: %u\r\n"), SwapEndian_16(UDPHeader->DestinationPort)); - -	printf_P(PSTR("     + Data Length: %d\r\n"), SwapEndian_16(UDPHeader->Length)); -	#endif -} - -/** Decodes an DHCP header and prints its contents to through the USART in a human readable format. - * - *  \param[in] InDataStart  Pointer to the start of a DHCP packet header - */ -void DecodeDHCPHeader(void* InDataStart) -{ -	#if !defined(NO_DECODE_DHCP) -	uint8_t* DHCPOptions = ((uint8_t*)InDataStart + sizeof(DHCP_Header_t)); - -	printf_P(PSTR("     \\\r\n      DHCP\r\n")); - -	while (DHCPOptions[0] != DHCP_OPTION_END) -	{ -		if (DHCPOptions[0] == DHCP_OPTION_MESSAGETYPE) -		{ -			switch (DHCPOptions[2]) -			{ -				case DHCP_MESSAGETYPE_DISCOVER: -					printf_P(PSTR("      + DISCOVER\r\n")); -					break; -				case DHCP_MESSAGETYPE_REQUEST: -					printf_P(PSTR("      + REQUEST\r\n")); -					break; -				case DHCP_MESSAGETYPE_RELEASE: -					printf_P(PSTR("      + RELEASE\r\n")); -					break; -				case DHCP_MESSAGETYPE_DECLINE: -					printf_P(PSTR("      + DECLINE\r\n")); -					break; -			} -		} - -		DHCPOptions += ((DHCPOptions[0] == DHCP_OPTION_PAD) ? 1 : (DHCPOptions[1] + 2)); -	} -	#endif -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.h deleted file mode 100644 index 77a50f02f4..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/ProtocolDecoders.h +++ /dev/null @@ -1,60 +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 ProtocolDecoders.c. - */ - -#ifndef _PROTOCOL_DECODERS_H_ -#define _PROTOCOL_DECODERS_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <avr/pgmspace.h> -		#include <stdio.h> - -		#include <LUFA/Drivers/Peripheral/Serial.h> - -		#include "EthernetProtocols.h" -		#include "Ethernet.h" -		#include "Config/AppConfig.h" - -	/* Function Prototypes: */ -		void DecodeEthernetFrameHeader(void* InDataStart); -		void DecodeARPHeader(void* InDataStart); -		void DecodeIPHeader(void* InDataStart); -		void DecodeICMPHeader(void* InDataStart); -		void DecodeTCPHeader(void* InDataStart); -		void DecodeUDPHeader(void* InDataStart); -		void DecodeDHCPHeader(void* InDataStart); - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.c deleted file mode 100644 index 00052ed39d..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.c +++ /dev/null @@ -1,394 +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 - * - *  RNDIS command handler functions. This handles RNDIS commands according to - *  the Microsoft RNDIS specification, creating a USB Ethernet network adapter. - */ - -#define  INCLUDE_FROM_RNDIS_C -#include "RNDIS.h" - -/** Physical MAC address of the network adapter, which becomes the MAC address of the host for packets sent to the adapter. */ -static const MAC_Address_t PROGMEM AdapterMACAddress     = {ADAPTER_MAC_ADDRESS}; - -/** Vendor description of the adapter. This is overridden by the INF file required to install the appropriate RNDIS drivers for - *  the device, but may still be used by the OS in some circumstances. - */ -static const char PROGMEM AdapterVendorDescription[]     = "LUFA RNDIS Adapter"; - -/** List of RNDIS OID commands supported by this adapter. */ -static const uint32_t PROGMEM AdapterSupportedOIDList[]  = -							{ -								OID_GEN_SUPPORTED_LIST, -								OID_GEN_PHYSICAL_MEDIUM, -								OID_GEN_HARDWARE_STATUS, -								OID_GEN_MEDIA_SUPPORTED, -								OID_GEN_MEDIA_IN_USE, -								OID_GEN_MAXIMUM_FRAME_SIZE, -								OID_GEN_MAXIMUM_TOTAL_SIZE, -								OID_GEN_LINK_SPEED, -								OID_GEN_TRANSMIT_BLOCK_SIZE, -								OID_GEN_RECEIVE_BLOCK_SIZE, -								OID_GEN_VENDOR_ID, -								OID_GEN_VENDOR_DESCRIPTION, -								OID_GEN_CURRENT_PACKET_FILTER, -								OID_GEN_MAXIMUM_TOTAL_SIZE, -								OID_GEN_MEDIA_CONNECT_STATUS, -								OID_GEN_XMIT_OK, -								OID_GEN_RCV_OK, -								OID_GEN_XMIT_ERROR, -								OID_GEN_RCV_ERROR, -								OID_GEN_RCV_NO_BUFFER, -								OID_802_3_PERMANENT_ADDRESS, -								OID_802_3_CURRENT_ADDRESS, -								OID_802_3_MULTICAST_LIST, -								OID_802_3_MAXIMUM_LIST_SIZE, -								OID_802_3_RCV_ERROR_ALIGNMENT, -								OID_802_3_XMIT_ONE_COLLISION, -								OID_802_3_XMIT_MORE_COLLISIONS, -							}; - -/** Buffer for RNDIS messages (as distinct from Ethernet frames sent through the adapter. This must be big enough to hold the entire - *  Supported OID list, plus the response header. The buffer is half-duplex, and is written to as it is read to save on SRAM - for this - *  reason, care must be taken when constructing RNDIS responses that unread data is not overwritten when writing in responses. - */ -uint8_t                 RNDISMessageBuffer[sizeof(AdapterSupportedOIDList) + sizeof(RNDIS_Query_Complete_t)]; - -/** Pointer to the RNDIS message header at the top of the RNDIS message buffer, for convenience. */ -RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISMessageBuffer; - -/** Indicates if a RNDIS message response is ready to be sent back to the host. */ -bool                    ResponseReady               = false; - -/** Current RNDIS adapter state, a value from the \c RNDIS_States_t enum. */ -uint8_t                 CurrRNDISState              = RNDIS_Uninitialized; - -/** Current Ethernet packet filter mask. This is non-zero when the adapter is initialized, or zero when disabled. */ -uint32_t                CurrPacketFilter            = 0; - - -/** Processes the RNDIS message received by the host and stored in the RNDISMessageBuffer global buffer. If a response is - *  created, the ResponseReady global is updated so that the response is written back to the host upon request. - */ -void ProcessRNDISControlMessage(void) -{ -	/* Note: Only a single buffer is used for both the received message and its response to save SRAM. Because of -	         this, response bytes should be filled in order so that they do not clobber unread data in the buffer. */ - -	switch (MessageHeader->MessageType) -	{ -		case REMOTE_NDIS_INITIALIZE_MSG: -			/* Initialize the adapter - return information about the supported RNDIS version and buffer sizes */ - -			ResponseReady = true; - -			RNDIS_Initialize_Message_t*  INITIALIZE_Message  = (RNDIS_Initialize_Message_t*)&RNDISMessageBuffer; -			RNDIS_Initialize_Complete_t* INITIALIZE_Response = (RNDIS_Initialize_Complete_t*)&RNDISMessageBuffer; - -			INITIALIZE_Response->MessageType           = REMOTE_NDIS_INITIALIZE_CMPLT; -			INITIALIZE_Response->MessageLength         = sizeof(RNDIS_Initialize_Complete_t); -			INITIALIZE_Response->RequestId             = INITIALIZE_Message->RequestId; -			INITIALIZE_Response->Status                = REMOTE_NDIS_STATUS_SUCCESS; - -			INITIALIZE_Response->MajorVersion          = REMOTE_NDIS_VERSION_MAJOR; -			INITIALIZE_Response->MinorVersion          = REMOTE_NDIS_VERSION_MINOR; -			INITIALIZE_Response->DeviceFlags           = REMOTE_NDIS_DF_CONNECTIONLESS; -			INITIALIZE_Response->Medium                = REMOTE_NDIS_MEDIUM_802_3; -			INITIALIZE_Response->MaxPacketsPerTransfer = 1; -			INITIALIZE_Response->MaxTransferSize       = (sizeof(RNDIS_Packet_Message_t) + ETHERNET_FRAME_SIZE_MAX); -			INITIALIZE_Response->PacketAlignmentFactor = 0; -			INITIALIZE_Response->AFListOffset          = 0; -			INITIALIZE_Response->AFListSize            = 0; - -			CurrRNDISState = RNDIS_Initialized; - -			break; -		case REMOTE_NDIS_HALT_MSG: -			/* Halt the adapter, reset the adapter state - note that no response should be returned when completed */ - -			ResponseReady = false; -			MessageHeader->MessageLength = 0; - -			CurrRNDISState = RNDIS_Uninitialized; - -			break; -		case REMOTE_NDIS_QUERY_MSG: -			/* Request for information about a parameter about the adapter, specified as an OID token */ - -			ResponseReady = true; - -			RNDIS_Query_Message_t*  QUERY_Message  = (RNDIS_Query_Message_t*)&RNDISMessageBuffer; -			RNDIS_Query_Complete_t* QUERY_Response = (RNDIS_Query_Complete_t*)&RNDISMessageBuffer; -			uint32_t                Query_Oid      = QUERY_Message->Oid; - -			void*     QueryData                 = &RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) + -			                                                          QUERY_Message->InformationBufferOffset]; -			void*     ResponseData              = &RNDISMessageBuffer[sizeof(RNDIS_Query_Complete_t)]; -			uint16_t  ResponseSize; - -			QUERY_Response->MessageType         = REMOTE_NDIS_QUERY_CMPLT; -			QUERY_Response->MessageLength       = sizeof(RNDIS_Query_Complete_t); - -			if (ProcessNDISQuery(Query_Oid, QueryData, QUERY_Message->InformationBufferLength, -			                     ResponseData, &ResponseSize)) -			{ -				QUERY_Response->Status                  = REMOTE_NDIS_STATUS_SUCCESS; -				QUERY_Response->MessageLength          += ResponseSize; - -				QUERY_Response->InformationBufferLength = ResponseSize; -				QUERY_Response->InformationBufferOffset = (sizeof(RNDIS_Query_Complete_t) - sizeof(RNDIS_Message_Header_t)); -			} -			else -			{ -				QUERY_Response->Status                  = REMOTE_NDIS_STATUS_NOT_SUPPORTED; - -				QUERY_Response->InformationBufferLength = 0; -				QUERY_Response->InformationBufferOffset = 0; -			} - -			break; -		case REMOTE_NDIS_SET_MSG: -			/* Request to set a parameter of the adapter, specified as an OID token */ - -			ResponseReady = true; - -			RNDIS_Set_Message_t*  SET_Message  = (RNDIS_Set_Message_t*)&RNDISMessageBuffer; -			RNDIS_Set_Complete_t* SET_Response = (RNDIS_Set_Complete_t*)&RNDISMessageBuffer; -			uint32_t              SET_Oid      = SET_Message->Oid; - -			SET_Response->MessageType       = REMOTE_NDIS_SET_CMPLT; -			SET_Response->MessageLength     = sizeof(RNDIS_Set_Complete_t); -			SET_Response->RequestId         = SET_Message->RequestId; - -			void* SetData                   = &RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) + -			                                                      SET_Message->InformationBufferOffset]; - -			if (ProcessNDISSet(SET_Oid, SetData, SET_Message->InformationBufferLength)) -			  SET_Response->Status        = REMOTE_NDIS_STATUS_SUCCESS; -			else -			  SET_Response->Status        = REMOTE_NDIS_STATUS_NOT_SUPPORTED; - -			break; -		case REMOTE_NDIS_RESET_MSG: -			/* Soft reset the adapter */ - -			ResponseReady = true; - -			RNDIS_Reset_Complete_t* RESET_Response = (RNDIS_Reset_Complete_t*)&RNDISMessageBuffer; - -			RESET_Response->MessageType         = REMOTE_NDIS_RESET_CMPLT; -			RESET_Response->MessageLength       = sizeof(RNDIS_Reset_Complete_t); -			RESET_Response->Status              = REMOTE_NDIS_STATUS_SUCCESS; -			RESET_Response->AddressingReset     = 0; - -			break; -		case REMOTE_NDIS_KEEPALIVE_MSG: -			/* Keep alive message sent to the adapter every 5 seconds when idle to ensure it is still responding */ - -			ResponseReady = true; - -			RNDIS_KeepAlive_Message_t*  KEEPALIVE_Message  = (RNDIS_KeepAlive_Message_t*)&RNDISMessageBuffer; -			RNDIS_KeepAlive_Complete_t* KEEPALIVE_Response = (RNDIS_KeepAlive_Complete_t*)&RNDISMessageBuffer; - -			KEEPALIVE_Response->MessageType     = REMOTE_NDIS_KEEPALIVE_CMPLT; -			KEEPALIVE_Response->MessageLength   = sizeof(RNDIS_KeepAlive_Complete_t); -			KEEPALIVE_Response->RequestId       = KEEPALIVE_Message->RequestId; -			KEEPALIVE_Response->Status          = REMOTE_NDIS_STATUS_SUCCESS; - -			break; -	} -} - -/** Processes RNDIS query commands, retrieving information from the adapter and reporting it back to the host. The requested - *  parameter is given as an OID value. - * - *  \param[in] OId            OId value of the parameter being queried - *  \param[in] QueryData      Pointer to any extra query data being sent by the host to the device inside the RNDIS message buffer - *  \param[in] QuerySize      Size in bytes of the extra query data being sent by the host - *  \param[out] ResponseData  Pointer to the start of the query response inside the RNDIS message buffer - *  \param[out] ResponseSize  Pointer to the size in bytes of the response data being sent to the host - * - *  \return Boolean \c true if the query was handled, \c false otherwise - */ -static bool ProcessNDISQuery(const uint32_t OId, void* QueryData, uint16_t QuerySize, -                             void* ResponseData, uint16_t* ResponseSize) -{ -	/* Handler for REMOTE_NDIS_QUERY_MSG messages */ - -	switch (OId) -	{ -		case OID_GEN_SUPPORTED_LIST: -			*ResponseSize = sizeof(AdapterSupportedOIDList); - -			/* Copy the list of supported NDIS OID tokens to the response buffer */ -			memcpy_P(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList)); - -			return true; -		case OID_GEN_PHYSICAL_MEDIUM: -			*ResponseSize = sizeof(uint32_t); - -			/* Indicate that the device is a true ethernet link */ -			*((uint32_t*)ResponseData) = 0; - -			return true; -		case OID_GEN_HARDWARE_STATUS: -			*ResponseSize = sizeof(uint32_t); - -			/* Always indicate hardware ready */ -			*((uint32_t*)ResponseData) = NDIS_HardwareStatus_Ready; - -			return true; -		case OID_GEN_MEDIA_SUPPORTED: -		case OID_GEN_MEDIA_IN_USE: -			*ResponseSize = sizeof(uint32_t); - -			/* Indicate 802.3 (Ethernet) supported by the adapter */ -			*((uint32_t*)ResponseData) = REMOTE_NDIS_MEDIUM_802_3; - -			return true; -		case OID_GEN_VENDOR_ID: -			*ResponseSize = sizeof(uint32_t); - -			/* Vendor ID 0x0xFFFFFF is reserved for vendors who have not purchased a NDIS VID */ -			*((uint32_t*)ResponseData) = 0x00FFFFFF; - -			return true; -		case OID_GEN_MAXIMUM_FRAME_SIZE: -		case OID_GEN_TRANSMIT_BLOCK_SIZE: -		case OID_GEN_RECEIVE_BLOCK_SIZE: -			*ResponseSize = sizeof(uint32_t); - -			/* Indicate that the maximum frame size is the size of the ethernet frame buffer */ -			*((uint32_t*)ResponseData) = ETHERNET_FRAME_SIZE_MAX; - -			return true; -		case OID_GEN_VENDOR_DESCRIPTION: -			*ResponseSize = sizeof(AdapterVendorDescription); - -			/* Copy vendor description string to the response buffer */ -			memcpy_P(ResponseData, AdapterVendorDescription, sizeof(AdapterVendorDescription)); - -			return true; -		case OID_GEN_MEDIA_CONNECT_STATUS: -			*ResponseSize = sizeof(uint32_t); - -			/* Always indicate that the adapter is connected to a network */ -			*((uint32_t*)ResponseData) = REMOTE_NDIS_MEDIA_STATE_CONNECTED; - -			return true; -		case OID_GEN_LINK_SPEED: -			*ResponseSize = sizeof(uint32_t); - -			/* Indicate 10Mb/s link speed */ -			*((uint32_t*)ResponseData) = 100000; - -			return true; -		case OID_802_3_PERMANENT_ADDRESS: -		case OID_802_3_CURRENT_ADDRESS: -			*ResponseSize = sizeof(MAC_Address_t); - -			/* Copy over the fixed adapter MAC to the response buffer */ -			memcpy_P(ResponseData, &AdapterMACAddress, sizeof(MAC_Address_t)); - -			return true; -		case OID_802_3_MAXIMUM_LIST_SIZE: -			*ResponseSize = sizeof(uint32_t); - -			/* Indicate only one multicast address supported */ -			*((uint32_t*)ResponseData) = 1; - -			return true; -		case OID_GEN_CURRENT_PACKET_FILTER: -			*ResponseSize = sizeof(uint32_t); - -			/* Indicate the current packet filter mask */ -			*((uint32_t*)ResponseData) = CurrPacketFilter; - -			return true; -		case OID_GEN_XMIT_OK: -		case OID_GEN_RCV_OK: -		case OID_GEN_XMIT_ERROR: -		case OID_GEN_RCV_ERROR: -		case OID_GEN_RCV_NO_BUFFER: -		case OID_802_3_RCV_ERROR_ALIGNMENT: -		case OID_802_3_XMIT_ONE_COLLISION: -		case OID_802_3_XMIT_MORE_COLLISIONS: -			*ResponseSize = sizeof(uint32_t); - -			/* Unused statistic OIDs - always return 0 for each */ -			*((uint32_t*)ResponseData) = 0; - -			return true; -		case OID_GEN_MAXIMUM_TOTAL_SIZE: -			*ResponseSize = sizeof(uint32_t); - -			/* Indicate maximum overall buffer (Ethernet frame and RNDIS header) the adapter can handle */ -			*((uint32_t*)ResponseData) = (sizeof(RNDISMessageBuffer) + ETHERNET_FRAME_SIZE_MAX); - -			return true; -		default: -			return false; -	} -} - -/** Processes RNDIS set commands, setting adapter parameters to values given by the host. The requested parameter is given - *  as an OID value. - * - *  \param[in] OId      OId value of the parameter being set - *  \param[in] SetData  Pointer to the parameter value in the RNDIS message buffer - *  \param[in] SetSize  Size in bytes of the parameter value being sent by the host - * - *  \return Boolean \c true if the set was handled, \c false otherwise - */ -static bool ProcessNDISSet(uint32_t OId, void* SetData, uint16_t SetSize) -{ -	/* Handler for REMOTE_NDIS_SET_MSG messages */ - -	switch (OId) -	{ -		case OID_GEN_CURRENT_PACKET_FILTER: -			/* Save the packet filter mask in case the host queries it again later */ -			CurrPacketFilter = *((uint32_t*)SetData); - -			/* Set the RNDIS state to initialized if the packet filter is non-zero */ -			CurrRNDISState = ((CurrPacketFilter) ? RNDIS_Data_Initialized : RNDIS_Initialized); - -			return true; -		case OID_802_3_MULTICAST_LIST: -			/* Do nothing - throw away the value from the host as it is unused */ - -			return true; -		default: -			return false; -	} -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.h deleted file mode 100644 index bea97f79df..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/RNDIS.h +++ /dev/null @@ -1,67 +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 RNDIS.c. - */ - -#ifndef _RNDIS_H_ -#define _RNDIS_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <stdbool.h> - -		#include "../RNDISEthernet.h" -		#include "Ethernet.h" - -	/* External Variables: */ -		extern uint8_t                 RNDISMessageBuffer[]; -		extern RNDIS_Message_Header_t* MessageHeader; -		extern bool                    ResponseReady; -		extern uint8_t                 CurrRNDISState; - -	/* Function Prototypes: */ -		void ProcessRNDISControlMessage(void); - -		#if defined(INCLUDE_FROM_RNDIS_C) -			static bool ProcessNDISQuery(const uint32_t OId, -			                             void* QueryData, -			                             uint16_t QuerySize, -			                             void* ResponseData, -			                             uint16_t* ResponseSize); -			static bool ProcessNDISSet(const uint32_t OId, -			                           void* SetData, -			                           uint16_t SetSize); -		#endif - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c deleted file mode 100644 index a6f1f6adfc..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c +++ /dev/null @@ -1,631 +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 - * - *  Transmission Control Protocol (TCP) packet handling routines. This protocol handles the reliable in-order transmission - *  and reception of packets to and from devices on a network, to "ports" on the device. It is used in situations where data - *  delivery must be reliable and correct, e.g. HTTP, TELNET and most other non-streaming protocols. - */ - -#define  INCLUDE_FROM_TCP_C -#include "TCP.h" - -/** Port state table array. This contains the current status of TCP ports in the device. To save on space, only open ports are - *  stored - closed ports may be overwritten at any time, and the system will assume any ports not present in the array are closed. This - *  allows for MAX_OPEN_TCP_PORTS to be less than the number of ports used by the application if desired. - */ -TCP_PortState_t        PortStateTable[MAX_OPEN_TCP_PORTS]; - -/** Connection state table array. This contains the current status of TCP connections in the device. To save on space, only active - *  (non-closed) connections are stored - closed connections may be overwritten at any time, and the system will assume any connections - *  not present in the array are closed. - */ -TCP_ConnectionState_t  ConnectionStateTable[MAX_TCP_CONNECTIONS]; - - -/** Task to handle the calling of each registered application's callback function, to process and generate TCP packets at the application - *  level. If an application produces a response, this task constructs the appropriate Ethernet frame and places it into the Ethernet OUT - *  buffer for later transmission. - */ -void TCP_Task(void) -{ -	/* Run each application in sequence, to process incoming and generate outgoing packets */ -	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++) -	{ -		/* Find the corresponding port entry in the port table */ -		for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++) -		{ -			/* Run the application handler for the port */ -			if ((PortStateTable[PTableEntry].Port  == ConnectionStateTable[CSTableEntry].Port) && -			    (PortStateTable[PTableEntry].State == TCP_Port_Open)) -			{ -				PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry], -				                                               &ConnectionStateTable[CSTableEntry].Info.Buffer); -			} -		} -	} - -	/* Bail out early if there is already a frame waiting to be sent in the Ethernet OUT buffer */ -	if (FrameOUT.FrameLength) -	  return; - -	/* Send response packets from each application as the TCP packet buffers are filled by the applications */ -	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++) -	{ -		/* For each completely received packet, pass it along to the listening application */ -		if ((ConnectionStateTable[CSTableEntry].Info.Buffer.Direction == TCP_PACKETDIR_OUT) && -		    (ConnectionStateTable[CSTableEntry].Info.Buffer.Ready)) -		{ -			Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&FrameOUT.FrameData; -			IP_Header_t*             IPHeaderOUT    = (IP_Header_t*)&FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)]; -			TCP_Header_t*            TCPHeaderOUT   = (TCP_Header_t*)&FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) + -			                                                                             sizeof(IP_Header_t)]; -			void*                    TCPDataOUT     = &FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) + -			                                                              sizeof(IP_Header_t) + -			                                                              sizeof(TCP_Header_t)]; - -			uint16_t PacketSize = ConnectionStateTable[CSTableEntry].Info.Buffer.Length; - -			/* Fill out the TCP data */ -			TCPHeaderOUT->SourcePort           = ConnectionStateTable[CSTableEntry].Port; -			TCPHeaderOUT->DestinationPort      = ConnectionStateTable[CSTableEntry].RemotePort; -			TCPHeaderOUT->SequenceNumber       = SwapEndian_32(ConnectionStateTable[CSTableEntry].Info.SequenceNumberOut); -			TCPHeaderOUT->AcknowledgmentNumber = SwapEndian_32(ConnectionStateTable[CSTableEntry].Info.SequenceNumberIn); -			TCPHeaderOUT->DataOffset           = (sizeof(TCP_Header_t) / sizeof(uint32_t)); -			TCPHeaderOUT->WindowSize           = SwapEndian_16(TCP_WINDOW_SIZE); - -			TCPHeaderOUT->Flags                = TCP_FLAG_ACK; -			TCPHeaderOUT->UrgentPointer        = 0; -			TCPHeaderOUT->Checksum             = 0; -			TCPHeaderOUT->Reserved             = 0; - -			memcpy(TCPDataOUT, ConnectionStateTable[CSTableEntry].Info.Buffer.Data, PacketSize); - -			ConnectionStateTable[CSTableEntry].Info.SequenceNumberOut += PacketSize; - -			TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, &ServerIPAddress, -			                                                    &ConnectionStateTable[CSTableEntry].RemoteAddress, -			                                                    (sizeof(TCP_Header_t) + PacketSize)); - -			PacketSize += sizeof(TCP_Header_t); - -			/* Fill out the response IP header */ -			IPHeaderOUT->TotalLength        = SwapEndian_16(sizeof(IP_Header_t) + PacketSize); -			IPHeaderOUT->TypeOfService      = 0; -			IPHeaderOUT->HeaderLength       = (sizeof(IP_Header_t) / sizeof(uint32_t)); -			IPHeaderOUT->Version            = 4; -			IPHeaderOUT->Flags              = 0; -			IPHeaderOUT->FragmentOffset     = 0; -			IPHeaderOUT->Identification     = 0; -			IPHeaderOUT->HeaderChecksum     = 0; -			IPHeaderOUT->Protocol           = PROTOCOL_TCP; -			IPHeaderOUT->TTL                = DEFAULT_TTL; -			IPHeaderOUT->SourceAddress      = ServerIPAddress; -			IPHeaderOUT->DestinationAddress = ConnectionStateTable[CSTableEntry].RemoteAddress; - -			IPHeaderOUT->HeaderChecksum     = Ethernet_Checksum16(IPHeaderOUT, sizeof(IP_Header_t)); - -			PacketSize += sizeof(IP_Header_t); - -			/* Fill out the response Ethernet frame header */ -			FrameOUTHeader->Source          = ServerMACAddress; -			FrameOUTHeader->Destination     = (MAC_Address_t){{0x02, 0x00, 0x02, 0x00, 0x02, 0x00}}; -			FrameOUTHeader->EtherType       = SwapEndian_16(ETHERTYPE_IPV4); - -			PacketSize += sizeof(Ethernet_Frame_Header_t); - -			/* Set the response length in the buffer and indicate that a response is ready to be sent */ -			FrameOUT.FrameLength            = PacketSize; - -			ConnectionStateTable[CSTableEntry].Info.Buffer.Ready = false; - -			break; -		} -	} -} - -/** Initializes the TCP protocol handler, clearing the port and connection state tables. This must be called before TCP packets are - *  processed. - */ -void TCP_Init(void) -{ -	/* Initialize the port state table with all CLOSED entries */ -	for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++) -	  PortStateTable[PTableEntry].State = TCP_Port_Closed; - -	/* Initialize the connection table with all CLOSED entries */ -	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++) -	  ConnectionStateTable[CSTableEntry].State = TCP_Connection_Closed; -} - -/** Sets the state and callback handler of the given port, specified in big endian to the given state. - * - *  \param[in] Port     Port whose state and callback function to set, specified in big endian - *  \param[in] State    New state of the port, a value from the \ref TCP_PortStates_t enum - *  \param[in] Handler  Application callback handler for the port - * - *  \return Boolean \c true if the port state was set, \c false otherwise (no more space in the port state table) - */ -bool TCP_SetPortState(const uint16_t Port, -                      const uint8_t State, -                      void (*Handler)(TCP_ConnectionState_t*, TCP_ConnectionBuffer_t*)) -{ -	/* Note, Port number should be specified in BIG endian to simplify network code */ - -	/* Check to see if the port entry is already in the port state table */ -	for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++) -	{ -		/* Find existing entry for the port in the table, update it if found */ -		if (PortStateTable[PTableEntry].Port == Port) -		{ -			PortStateTable[PTableEntry].State = State; -			PortStateTable[PTableEntry].ApplicationHandler = Handler; -			return true; -		} -	} - -	/* Check if trying to open the port -- if so we need to find an unused (closed) entry and replace it */ -	if (State == TCP_Port_Open) -	{ -		for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++) -		{ -			/* Find a closed port entry in the table, change it to the given port and state */ -			if (PortStateTable[PTableEntry].State == TCP_Port_Closed) -			{ -				PortStateTable[PTableEntry].Port  = Port; -				PortStateTable[PTableEntry].State = State; -				PortStateTable[PTableEntry].ApplicationHandler = Handler; -				return true; -			} -		} - -		/* Port not in table and no room to add it, return failure */ -		return false; -	} -	else -	{ -		/* Port not in table but trying to close it, so operation successful */ -		return true; -	} -} - -/** Retrieves the current state of a given TCP port, specified in big endian. - * - *  \param[in] Port  TCP port whose state is to be retrieved, given in big-endian - * - *  \return A value from the \ref TCP_PortStates_t enum - */ -uint8_t TCP_GetPortState(const uint16_t Port) -{ -	/* Note, Port number should be specified in BIG endian to simplify network code */ - -	for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++) -	{ -		/* Find existing entry for the port in the table, return the port status if found */ -		if (PortStateTable[PTableEntry].Port == Port) -		  return PortStateTable[PTableEntry].State; -	} - -	/* Port not in table, assume closed */ -	return TCP_Port_Closed; -} - -/** Sets the connection state of the given port, remote address and remote port to the given TCP connection state. If the - *  connection exists in the connection state table it is updated, otherwise it is created if possible. - * - *  \param[in] Port           TCP port of the connection on the device, specified in big endian - *  \param[in] RemoteAddress  Remote protocol IP address of the connected device - *  \param[in] RemotePort     TCP port of the remote device in the connection, specified in big endian - *  \param[in] State          TCP connection state, a value from the \ref TCP_ConnectionStates_t enum - * - *  \return Boolean \c true if the connection was updated or created, \c false otherwise (no more space in the connection state table) - */ -bool TCP_SetConnectionState(const uint16_t Port, -                            const IP_Address_t* RemoteAddress, -                            const uint16_t RemotePort, -                            const uint8_t State) -{ -	/* Note, Port number should be specified in BIG endian to simplify network code */ - -	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++) -	{ -		/* Find port entry in the table */ -		if ((ConnectionStateTable[CSTableEntry].Port == Port) && -		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) && -			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort) -		{ -			ConnectionStateTable[CSTableEntry].State = State; -			return true; -		} -	} - -	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++) -	{ -		/* Find empty entry in the table */ -		if (ConnectionStateTable[CSTableEntry].State == TCP_Connection_Closed) -		{ -			ConnectionStateTable[CSTableEntry].Port          = Port; -			ConnectionStateTable[CSTableEntry].RemoteAddress = *RemoteAddress; -			ConnectionStateTable[CSTableEntry].RemotePort    = RemotePort; -			ConnectionStateTable[CSTableEntry].State         = State; -			return true; -		} -	} - -	return false; -} - -/** Retrieves the current state of a given TCP connection to a host. - * - *  \param[in] Port           TCP port on the device in the connection, specified in big endian - *  \param[in] RemoteAddress  Remote protocol IP address of the connected host - *  \param[in] RemotePort     Remote TCP port of the connected host, specified in big endian - * - *  \return A value from the \ref TCP_ConnectionStates_t enum - */ -uint8_t TCP_GetConnectionState(const uint16_t Port, -                               const IP_Address_t* RemoteAddress, -                               const uint16_t RemotePort) -{ -	/* Note, Port number should be specified in BIG endian to simplify network code */ - -	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++) -	{ -		/* Find port entry in the table */ -		if ((ConnectionStateTable[CSTableEntry].Port == Port) && -		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) && -			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort) - -		{ -			return ConnectionStateTable[CSTableEntry].State; -		} -	} - -	return TCP_Connection_Closed; -} - -/** Retrieves the connection info structure of a given connection to a host. - * - *  \param[in] Port           TCP port on the device in the connection, specified in big endian - *  \param[in] RemoteAddress  Remote protocol IP address of the connected host - *  \param[in] RemotePort     Remote TCP port of the connected host, specified in big endian - * - *  \return ConnectionInfo structure of the connection if found, NULL otherwise - */ -TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port, -                                            const IP_Address_t* RemoteAddress, -                                            const uint16_t RemotePort) -{ -	/* Note, Port number should be specified in BIG endian to simplify network code */ - -	for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++) -	{ -		/* Find port entry in the table */ -		if ((ConnectionStateTable[CSTableEntry].Port == Port) && -		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) && -			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort) -		{ -			return &ConnectionStateTable[CSTableEntry].Info; -		} -	} - -	return NULL; -} - -/** Processes a TCP packet inside an Ethernet frame, and writes the appropriate response - *  to the output Ethernet frame if one is created by a application handler. - * - *  \param[in] IPHeaderInStart     Pointer to the start of the incoming packet's IP header - *  \param[in] TCPHeaderInStart    Pointer to the start of the incoming packet's TCP header - *  \param[out] TCPHeaderOutStart  Pointer to the start of the outgoing packet's TCP header - * - *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE if no - *           response was generated, NO_PROCESS if the packet processing was deferred until the - *           next Ethernet packet handler iteration - */ -int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, -                             void* TCPHeaderInStart, -                             void* TCPHeaderOutStart) -{ -	IP_Header_t*  IPHeaderIN   = (IP_Header_t*)IPHeaderInStart; -	TCP_Header_t* TCPHeaderIN  = (TCP_Header_t*)TCPHeaderInStart; -	TCP_Header_t* TCPHeaderOUT = (TCP_Header_t*)TCPHeaderOutStart; - -	TCP_ConnectionInfo_t* ConnectionInfo; - -	DecodeTCPHeader(TCPHeaderInStart); - -	bool PacketResponse = false; - -	/* Check if the destination port is open and allows incoming connections */ -	if (TCP_GetPortState(TCPHeaderIN->DestinationPort) == TCP_Port_Open) -	{ -		/* Detect SYN from host to start a connection */ -		if (TCPHeaderIN->Flags & TCP_FLAG_SYN) -		  TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort, TCP_Connection_Listen); - -		/* Detect RST from host to abort existing connection */ -		if (TCPHeaderIN->Flags & TCP_FLAG_RST) -		{ -			if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -			                           TCPHeaderIN->SourcePort, TCP_Connection_Closed)) -			{ -				TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK); -				PacketResponse = true; -			} -		} -		else -		{ -			/* Process the incoming TCP packet based on the current connection state for the sender and port */ -			switch (TCP_GetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort)) -			{ -				case TCP_Connection_Listen: -					if (TCPHeaderIN->Flags == TCP_FLAG_SYN) -					{ -						/* SYN connection starts a connection with a peer */ -						if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -						                           TCPHeaderIN->SourcePort, TCP_Connection_SYNReceived)) -						{ -							TCPHeaderOUT->Flags = (TCP_FLAG_SYN | TCP_FLAG_ACK); - -							ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort); - -							ConnectionInfo->SequenceNumberIn  = (SwapEndian_32(TCPHeaderIN->SequenceNumber) + 1); -							ConnectionInfo->SequenceNumberOut = 0; -							ConnectionInfo->Buffer.InUse      = false; -						} -						else -						{ -							TCPHeaderOUT->Flags = TCP_FLAG_RST; -						} - -						PacketResponse      = true; -					} - -					break; -				case TCP_Connection_SYNReceived: -					if (TCPHeaderIN->Flags == TCP_FLAG_ACK) -					{ -						/* ACK during the connection process completes the connection to a peer */ - -						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -											   TCPHeaderIN->SourcePort, TCP_Connection_Established); - -						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -															   TCPHeaderIN->SourcePort); - -						ConnectionInfo->SequenceNumberOut++; -					} - -					break; -				case TCP_Connection_Established: -					if (TCPHeaderIN->Flags == (TCP_FLAG_FIN | TCP_FLAG_ACK)) -					{ -						/* FIN ACK when connected to a peer starts the finalization process */ - -						TCPHeaderOUT->Flags = (TCP_FLAG_FIN | TCP_FLAG_ACK); -						PacketResponse      = true; - -						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -											   TCPHeaderIN->SourcePort, TCP_Connection_CloseWait); - -						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -															   TCPHeaderIN->SourcePort); - -						ConnectionInfo->SequenceNumberIn++; -						ConnectionInfo->SequenceNumberOut++; -					} -					else if ((TCPHeaderIN->Flags == TCP_FLAG_ACK) || (TCPHeaderIN->Flags == (TCP_FLAG_ACK | TCP_FLAG_PSH))) -					{ -						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -															   TCPHeaderIN->SourcePort); - -						/* Check if the buffer is currently in use either by a buffered data to send, or receive */ -						if ((ConnectionInfo->Buffer.InUse == false) && (ConnectionInfo->Buffer.Ready == false)) -						{ -							ConnectionInfo->Buffer.Direction = TCP_PACKETDIR_IN; -							ConnectionInfo->Buffer.InUse     = true; -							ConnectionInfo->Buffer.Length    = 0; -						} - -						/* Check if the buffer has been claimed by us to read in data from the peer */ -						if ((ConnectionInfo->Buffer.Direction == TCP_PACKETDIR_IN) && -							(ConnectionInfo->Buffer.Length != TCP_WINDOW_SIZE)) -						{ -							uint16_t IPOffset   = (IPHeaderIN->HeaderLength * sizeof(uint32_t)); -							uint16_t TCPOffset  = (TCPHeaderIN->DataOffset * sizeof(uint32_t)); -							uint16_t DataLength = (SwapEndian_16(IPHeaderIN->TotalLength) - IPOffset - TCPOffset); - -							/* Copy the packet data into the buffer */ -							memcpy(&ConnectionInfo->Buffer.Data[ConnectionInfo->Buffer.Length], -								   &((uint8_t*)TCPHeaderInStart)[TCPOffset], -								   DataLength); - -							ConnectionInfo->SequenceNumberIn += DataLength; -							ConnectionInfo->Buffer.Length    += DataLength; - -							/* Check if the buffer is full or if the PSH flag is set, if so indicate buffer ready */ -							if ((!(TCP_WINDOW_SIZE - ConnectionInfo->Buffer.Length)) || (TCPHeaderIN->Flags & TCP_FLAG_PSH)) -							{ -								ConnectionInfo->Buffer.InUse = false; -								ConnectionInfo->Buffer.Ready = true; - -								TCPHeaderOUT->Flags = TCP_FLAG_ACK; -								PacketResponse      = true; -							} -						} -						else -						{ -							/* Buffer is currently in use by the application, defer processing of the incoming packet */ -							return NO_PROCESS; -						} -					} - -					break; -				case TCP_Connection_Closing: -						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -															   TCPHeaderIN->SourcePort); - -						TCPHeaderOUT->Flags = (TCP_FLAG_ACK | TCP_FLAG_FIN); -						PacketResponse      = true; - -						ConnectionInfo->Buffer.InUse = false; - -						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -											   TCPHeaderIN->SourcePort, TCP_Connection_FINWait1); - -					break; -				case TCP_Connection_FINWait1: -					if (TCPHeaderIN->Flags == (TCP_FLAG_FIN | TCP_FLAG_ACK)) -					{ -						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -															   TCPHeaderIN->SourcePort); - -						TCPHeaderOUT->Flags = TCP_FLAG_ACK; -						PacketResponse      = true; - -						ConnectionInfo->SequenceNumberIn++; -						ConnectionInfo->SequenceNumberOut++; - -						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -											   TCPHeaderIN->SourcePort, TCP_Connection_Closed); -					} -					else if (TCPHeaderIN->Flags == TCP_FLAG_ACK) -					{ -						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -											   TCPHeaderIN->SourcePort, TCP_Connection_FINWait2); -					} - -					break; -				case TCP_Connection_FINWait2: -					if (TCPHeaderIN->Flags == (TCP_FLAG_FIN | TCP_FLAG_ACK)) -					{ -						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -															   TCPHeaderIN->SourcePort); - -						TCPHeaderOUT->Flags = TCP_FLAG_ACK; -						PacketResponse      = true; - -						ConnectionInfo->SequenceNumberIn++; -						ConnectionInfo->SequenceNumberOut++; - -						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -											   TCPHeaderIN->SourcePort, TCP_Connection_Closed); -					} - -					break; -				case TCP_Connection_CloseWait: -					if (TCPHeaderIN->Flags == TCP_FLAG_ACK) -					{ -						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -											   TCPHeaderIN->SourcePort, TCP_Connection_Closed); -					} - -					break; -			} -		} -	} -	else -	{ -		/* Port is not open, indicate via a RST/ACK response to the sender */ -		TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK); -		PacketResponse      = true; -	} - -	/* Check if we need to respond to the sent packet */ -	if (PacketResponse) -	{ -		ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, -		                                       TCPHeaderIN->SourcePort); - -		TCPHeaderOUT->SourcePort           = TCPHeaderIN->DestinationPort; -		TCPHeaderOUT->DestinationPort      = TCPHeaderIN->SourcePort; -		TCPHeaderOUT->SequenceNumber       = SwapEndian_32(ConnectionInfo->SequenceNumberOut); -		TCPHeaderOUT->AcknowledgmentNumber = SwapEndian_32(ConnectionInfo->SequenceNumberIn); -		TCPHeaderOUT->DataOffset           = (sizeof(TCP_Header_t) / sizeof(uint32_t)); - -		if (!(ConnectionInfo->Buffer.InUse)) -		  TCPHeaderOUT->WindowSize         = SwapEndian_16(TCP_WINDOW_SIZE); -		else -		  TCPHeaderOUT->WindowSize         = SwapEndian_16(TCP_WINDOW_SIZE - ConnectionInfo->Buffer.Length); - -		TCPHeaderOUT->UrgentPointer        = 0; -		TCPHeaderOUT->Checksum             = 0; -		TCPHeaderOUT->Reserved             = 0; - -		TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, &IPHeaderIN->DestinationAddress, -		                                                    &IPHeaderIN->SourceAddress, sizeof(TCP_Header_t)); - -		return sizeof(TCP_Header_t); -	} - -	return NO_RESPONSE; -} - -/** Calculates the appropriate TCP checksum, consisting of the addition of the one's compliment of each word, - *  complimented. - * - *  \param[in] TCPHeaderOutStart   Pointer to the start of the packet's outgoing TCP header - *  \param[in] SourceAddress       Source protocol IP address of the outgoing IP header - *  \param[in] DestinationAddress  Destination protocol IP address of the outgoing IP header - *  \param[in] TCPOutSize          Size in bytes of the TCP data header and payload - * - *  \return A 16-bit TCP checksum value - */ -static uint16_t TCP_Checksum16(void* TCPHeaderOutStart, -                               const IP_Address_t* SourceAddress, -                               const IP_Address_t* DestinationAddress, -                               uint16_t TCPOutSize) -{ -	uint32_t Checksum = 0; - -	/* TCP/IP checksums are the addition of the one's compliment of each word including the IP pseudo-header, -	   complimented */ - -	Checksum += ((uint16_t*)SourceAddress)[0]; -	Checksum += ((uint16_t*)SourceAddress)[1]; -	Checksum += ((uint16_t*)DestinationAddress)[0]; -	Checksum += ((uint16_t*)DestinationAddress)[1]; -	Checksum += SwapEndian_16(PROTOCOL_TCP); -	Checksum += SwapEndian_16(TCPOutSize); - -	for (uint16_t CurrWord = 0; CurrWord < (TCPOutSize >> 1); CurrWord++) -	  Checksum += ((uint16_t*)TCPHeaderOutStart)[CurrWord]; - -	if (TCPOutSize & 0x01) -	  Checksum += (((uint16_t*)TCPHeaderOutStart)[TCPOutSize >> 1] & 0x00FF); - -	while (Checksum & 0xFFFF0000) -	  Checksum = ((Checksum & 0xFFFF) + (Checksum >> 16)); - -	return ~Checksum; -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h deleted file mode 100644 index ce8a9a2d0f..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h +++ /dev/null @@ -1,260 +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 TCP.c. - */ - -#ifndef _TCP_H_ -#define _TCP_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <stdbool.h> - -		#include "EthernetProtocols.h" -		#include "Ethernet.h" -		#include "ProtocolDecoders.h" - -	/* Macros: */ -		/** Maximum number of TCP ports which can be open at the one time. */ -		#define MAX_OPEN_TCP_PORTS              1 - -		/** Maximum number of TCP connections which can be sustained at the one time. */ -		#define MAX_TCP_CONNECTIONS             3 - -		/** TCP window size, giving the maximum number of bytes which can be buffered at the one time. */ -		#define TCP_WINDOW_SIZE                 512 - -		/** Port number for HTTP transmissions. */ -		#define TCP_PORT_HTTP                   SwapEndian_16(80) - -		/** Data direction indicator for a TCP application buffer, indicating data from host-to-device. */ -		#define TCP_PACKETDIR_IN                false - -		/** Data direction indicator for a TCP application buffer, indicating data from device-to-host. */ -		#define TCP_PACKETDIR_OUT               true - -		/** Congestion Window Reduced TCP flag mask. */ -		#define TCP_FLAG_CWR                    (1 << 7) - -		/** Explicit Congestion Notification TCP flag mask. */ -		#define TCP_FLAG_ECE                    (1 << 6) - -		/** Urgent TCP flag mask. */ -		#define TCP_FLAG_URG                    (1 << 5) - -		/** Data Acknowledge TCP flag mask. */ -		#define TCP_FLAG_ACK                    (1 << 4) - -		/** Data Push TCP flag mask. */ -		#define TCP_FLAG_PSH                    (1 << 3) - -		/** Reset TCP flag mask. */ -		#define TCP_FLAG_RST                    (1 << 2) - -		/** Synchronize TCP flag mask. */ -		#define TCP_FLAG_SYN                    (1 << 1) - -		/** Connection Finalize TCP flag mask. */ -		#define TCP_FLAG_FIN                    (1 << 0) - -		/** Application macro: Determines if the given application buffer contains a packet received from the host -		 * -		 *  \param[in] Buffer  Application buffer to check -		 * -		 *  \return Boolean \c true if the buffer contains a packet from the host, \c false otherwise -		 */ -		#define TCP_APP_HAS_RECEIVED_PACKET(Buffer)  (Buffer->Ready && (Buffer->Direction == TCP_PACKETDIR_IN)) - -		/** Application macro: Indicates if the application buffer is currently locked by the application for device-to-host transfers. -		 * -		 *  \param[in] Buffer  Application buffer to check -		 * -		 *  \return Boolean \c true if the buffer has been captured by the application for device-to-host transmissions, \c false otherwise -		 */ -		#define TCP_APP_HAVE_CAPTURED_BUFFER(Buffer) (!(Buffer->Ready) && Buffer->InUse && \ -		                                              (Buffer->Direction == TCP_PACKETDIR_OUT)) - -		/** Application macro: Indicates if the application can lock the buffer for multiple continued device-to-host transmissions. -		 * -		 *  \param[in] Buffer  Application buffer to check -		 * -		 *  \return Boolean \c true if the buffer may be captured by the application for device-to-host transmissions, \c false otherwise -		 */ -		#define TCP_APP_CAN_CAPTURE_BUFFER(Buffer)   Buffer->InUse - -		/** Application macro: Captures the application buffer, locking it for device-to-host transmissions only. This should be -		 *  performed when the application needs to transmit several packets worth of data in succession with no interruptions from the host. -		 * -		 *  \pre The application must check that the buffer can be locked first using TCP_APP_CAN_CAPTURE_BUFFER(). -		 * -		 *  \param[in] Buffer  Application buffer to lock -		 */ -		#define TCP_APP_CAPTURE_BUFFER(Buffer)       do { Buffer->Direction = TCP_PACKETDIR_OUT; Buffer->InUse = true; } while (0) - -		/** Application macro: Releases a captured application buffer, allowing for host-to-device packets to be received. -		 * -		 *  \param[in] Buffer  Application buffer to release -		 */ -		#define TCP_APP_RELEASE_BUFFER(Buffer)       do { Buffer->InUse = false; } while (0) - -		/** Application macro: Sends the contents of the given application buffer to the host. -		 * -		 *  \param[in] Buffer  Application buffer to send -		 *  \param[in] Len     Length of data contained in the buffer -		 */ -		#define TCP_APP_SEND_BUFFER(Buffer, Len)     do { Buffer->Direction = TCP_PACKETDIR_OUT; Buffer->Length = Len; Buffer->Ready = true; } while (0) - -		/** Application macro: Clears the application buffer, ready for a packet to be written to it. -		 * -		 *  \param[in] Buffer  Application buffer to clear -		 */ -		#define TCP_APP_CLEAR_BUFFER(Buffer)         do { Buffer->Ready = false; Buffer->Length = 0; } while (0) - -		/** Application macro: Closes an open connection to a host. -		 * -		 *  \param[in] Connection  Open TCP connection to close -		 */ -		#define TCP_APP_CLOSECONNECTION(Connection)  do { Connection->State = TCP_Connection_Closing;  } while (0) - -	/* Enums: */ -		/** Enum for possible TCP port states. */ -		enum TCP_PortStates_t -		{ -			TCP_Port_Closed            = 0, /**< TCP port closed, no connections to a host may be made on this port. */ -			TCP_Port_Open              = 1, /**< TCP port open, connections to a host may be made on this port. */ -		}; - -		/** Enum for possible TCP connection states. */ -		enum TCP_ConnectionStates_t -		{ -			TCP_Connection_Listen      = 0, /**< Listening for a connection from a host */ -			TCP_Connection_SYNSent     = 1, /**< Unused */ -			TCP_Connection_SYNReceived = 2, /**< SYN received, waiting for ACK */ -			TCP_Connection_Established = 3, /**< Connection established in both directions */ -			TCP_Connection_FINWait1    = 4, /**< Closing, waiting for ACK */ -			TCP_Connection_FINWait2    = 5, /**< Closing, waiting for FIN ACK */ -			TCP_Connection_CloseWait   = 6, /**< Closing, waiting for ACK */ -			TCP_Connection_Closing     = 7, /**< Unused */ -			TCP_Connection_LastACK     = 8, /**< Unused */ -			TCP_Connection_TimeWait    = 9, /**< Unused */ -			TCP_Connection_Closed      = 10, /**< Connection closed in both directions */ -		}; - -	/* Type Defines: */ -		/** Type define for a TCP connection buffer structure, including size, data and direction. */ -		typedef struct -		{ -			uint16_t               Length; /**< Length of data in the TCP application buffer */ -			uint8_t                Data[TCP_WINDOW_SIZE]; /**< TCP application data buffer */ -			bool                   Direction; /**< Buffer transmission direction, either TCP_PACKETDIR_IN  or TCP_PACKETDIR_OUT */ -			bool                   Ready; /**< If data from host, indicates buffer ready to be read, otherwise indicates -			                               *   buffer ready to be sent to the host -			                               */ -			bool                   InUse; /**< Indicates if the buffer is locked to to the current direction, and cannot be changed */ -		} TCP_ConnectionBuffer_t; - -		/** Type define for a TCP connection information structure. */ -		typedef struct -		{ -			uint32_t               SequenceNumberIn; /**< Current TCP sequence number for host-to-device */ -			uint32_t               SequenceNumberOut; /**< Current TCP sequence number for device-to-host */ -			TCP_ConnectionBuffer_t Buffer; /**< Connection application data buffer */ -		} TCP_ConnectionInfo_t; - -		/** Type define for a complete TCP connection state. */ -		typedef struct -		{ -			uint16_t               Port; /**< Connection port number on the device */ -			uint16_t               RemotePort; /**< Connection port number on the host */ -			IP_Address_t           RemoteAddress; /**< Connection protocol IP address of the host */ -			TCP_ConnectionInfo_t   Info; /**< Connection information, including application buffer */ -			uint8_t                State; /**< Current connection state, a value from the \ref TCP_ConnectionStates_t enum */ -		} TCP_ConnectionState_t; - -		/** Type define for a TCP port state. */ -		typedef struct -		{ -			uint16_t               Port; /**< TCP port number on the device */ -			uint8_t                State; /**< Current port state, a value from the \ref TCP_PortStates_t enum */ -			void                   (*ApplicationHandler) (TCP_ConnectionState_t* ConnectionState, -			                                              TCP_ConnectionBuffer_t* Buffer); /**< Port application handler */ -		} TCP_PortState_t; - -		/** Type define for a TCP packet header. */ -		typedef struct -		{ -			uint16_t               SourcePort; /**< Source port of the TCP packet */ -			uint16_t               DestinationPort; /**< Destination port of the TCP packet */ - -			uint32_t               SequenceNumber; /**< Data sequence number of the packet */ -			uint32_t               AcknowledgmentNumber; /**< Data acknowledgment number of the packet */ - -			unsigned               Reserved   : 4; /**< Reserved, must be all 0 */ -			unsigned               DataOffset : 4; /**< Offset of the data from the start of the header, in 4 byte chunks */ -			uint8_t                Flags; /**< TCP packet flags */ -			uint16_t               WindowSize; /**< Current data window size (bytes remaining in reception buffer) */ - -			uint16_t               Checksum; /**< TCP checksum */ -			uint16_t               UrgentPointer; /**< Urgent data pointer */ -		} TCP_Header_t; - -	/* Function Prototypes: */ -		void                  TCP_Init(void); -		void                  TCP_Task(void); -		bool                  TCP_SetPortState(const uint16_t Port, -		                                       const uint8_t State, -		                                       void (*Handler)(TCP_ConnectionState_t*, TCP_ConnectionBuffer_t*)); -		uint8_t               TCP_GetPortState(const uint16_t Port); -		bool                  TCP_SetConnectionState(const uint16_t Port, -		                                             const IP_Address_t* RemoteAddress, -		                                             const uint16_t RemotePort, -		                                             const uint8_t State); -		uint8_t               TCP_GetConnectionState(const uint16_t Port, -		                                             const IP_Address_t* RemoteAddress, -		                                             const uint16_t RemotePort); -		TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port, -		                                            const IP_Address_t* RemoteAddress, -		                                            const uint16_t RemotePort); -		int16_t               TCP_ProcessTCPPacket(void* IPHeaderInStart, -		                                           void* TCPHeaderInStart, -		                                           void* TCPHeaderOutStart); - -		#if defined(INCLUDE_FROM_TCP_C) -			static uint16_t TCP_Checksum16(void* TCPHeaderOutStart, -			                               const IP_Address_t* SourceAddress, -			                               const IP_Address_t* DestinationAddress, -			                               uint16_t TCPOutSize); -		#endif - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c deleted file mode 100644 index 03c19e00ed..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.c +++ /dev/null @@ -1,84 +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 - * - *  User Datagram Protocol (UDP) packet handling routines. This protocol handles high throughput, low - *  reliability packets which are typically used to encapsulate streaming data. - */ - -#define  INCLUDE_FROM_UDP_C -#include "UDP.h" - -/** Processes a UDP packet inside an Ethernet frame, and writes the appropriate response - *  to the output Ethernet frame if a sub-protocol handler has created a response packet. - * - *  \param[in] IPHeaderInStart     Pointer to the start of the incoming packet's IP header - *  \param[in] UDPHeaderInStart    Pointer to the start of the incoming packet's UDP header - *  \param[out] UDPHeaderOutStart  Pointer to the start of the outgoing packet's UDP header - * - *  \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE otherwise - */ -int16_t UDP_ProcessUDPPacket(void* IPHeaderInStart, -                             void* UDPHeaderInStart, -                             void* UDPHeaderOutStart) -{ -	UDP_Header_t* UDPHeaderIN  = (UDP_Header_t*)UDPHeaderInStart; -	UDP_Header_t* UDPHeaderOUT = (UDP_Header_t*)UDPHeaderOutStart; - -	int16_t RetSize = NO_RESPONSE; - -	DecodeUDPHeader(UDPHeaderInStart); - -	switch (SwapEndian_16(UDPHeaderIN->DestinationPort)) -	{ -		case UDP_PORT_DHCP_REQUEST: -			RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart, -			                                 &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)], -		                                     &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]); -			break; -	} - -	/* Check to see if the protocol processing routine has filled out a response */ -	if (RetSize > 0) -	{ -		/* Fill out the response UDP packet header */ -		UDPHeaderOUT->SourcePort      = UDPHeaderIN->DestinationPort; -		UDPHeaderOUT->DestinationPort = UDPHeaderIN->SourcePort; -		UDPHeaderOUT->Checksum        = 0; -		UDPHeaderOUT->Length          = SwapEndian_16(sizeof(UDP_Header_t) + RetSize); - -		/* Return the size of the response so far */ -		return (sizeof(UDP_Header_t) + RetSize); -	} - -	return NO_RESPONSE; -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.h deleted file mode 100644 index d008cb8ed8..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/UDP.h +++ /dev/null @@ -1,73 +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 UDP.c. - */ - -#ifndef _UDP_H_ -#define _UDP_H_ - -	/* Includes: */ -		#include <avr/io.h> - -		#include "EthernetProtocols.h" -		#include "Ethernet.h" -		#include "ProtocolDecoders.h" -		#include "DHCP.h" - -	/* Macros: */ -		/** Source UDP port for a DHCP request. */ -		#define UDP_PORT_DHCP_REQUEST 67 - -		/** Destination UDP port for a DHCP reply. */ -		#define UDP_PORT_DHCP_REPLY   68 - -		/** Source UDP port for a DNS request/response. */ -		#define UDP_PORT_DNS          53 - -	/* Type Defines: */ -		/** Type define for a UDP packet header. */ -		typedef struct -		{ -			uint16_t SourcePort; /**< Packet source port */ -			uint16_t DestinationPort; /**< Packet destination port */ -			uint16_t Length; /**< Total packet length, in bytes */ -			uint16_t Checksum; /**< Optional UDP packet checksum */ -		} UDP_Header_t; - -	/* Function Prototypes: */ -		int16_t UDP_ProcessUDPPacket(void* IPHeaderInStart, -		                             void* UDPHeaderInStart, -		                             void* UDPHeaderOutStart); - -#endif - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c deleted file mode 100644 index e0d9e36473..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.c +++ /dev/null @@ -1,203 +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 - * - *  Simple webserver application for demonstrating the RNDIS demo and TCP/IP stack. This - *  application will serve up a static HTTP webpage when requested by the host. - */ - -#include "Webserver.h" - -/** HTTP server response header, for transmission before the page contents. This indicates to the host that a page exists at the - *  given location, and gives extra connection information. - */ -const char PROGMEM HTTP200Header[] = "HTTP/1.1 200 OK\r\n" -                                     "Server: LUFA RNDIS\r\n" -                                     "Content-type: text/html\r\n" -                                     "Connection: close\r\n\r\n"; - -/** HTTP server response header, for transmission before a resource not found error. This indicates to the host that the given - *  given URL is invalid, and gives extra error information. - */ -const char PROGMEM HTTP404Header[] = "HTTP/1.1 404 Not Found\r\n" -                                     "Server: LUFA RNDIS\r\n" -                                     "Connection: close\r\n\r\n"; - -/** HTTP page to serve to the host when a HTTP request is made. This page is too long for a single response, thus it is automatically - *  broken up into smaller blocks and sent as a series of packets each time the webserver application callback is run. - */ -const char PROGMEM HTTPPage[]   = -		"<html>" -		"	<head>" -		"		<title>" -		"			LUFA Webserver Demo" -		"		</title>" -		"	</head>" -		"	<body>" -		"		<h1>Hello from your USB AVR!</h1>" -		"		<p>" -		"			Hello! Welcome to the LUFA RNDIS Demo Webserver test page, running on your USB AVR via the LUFA library. This demonstrates the HTTP webserver, TCP/IP stack and RNDIS demo all running atop the LUFA USB stack." -		"			<br /><br />" -		"			<small>Project Information: <a href=\"http://www.lufa-lib.org\">http://www.lufa-lib.org</a>.</small>" -		"			<hr />" -		"			<i>LUFA Version: </i>" LUFA_VERSION_STRING -		"		</p>" -		"	</body>" -		"</html>"; - - -/** Initializes the Webserver application, opening the appropriate HTTP port in the TCP handler and registering the application - *  callback routine for packets sent to the HTTP protocol port. - */ -void Webserver_Init(void) -{ -	/* Open the HTTP port in the TCP protocol so that HTTP connections to the device can be established */ -	TCP_SetPortState(TCP_PORT_HTTP, TCP_Port_Open, Webserver_ApplicationCallback); -} - -/** Indicates if a given request equals the given HTTP command. - * - *  \param[in] RequestHeader  HTTP request made by the host - *  \param[in] Command        HTTP command to compare the request to - * - *  \return Boolean \c true if the command matches the request, \c false otherwise - */ -static bool IsHTTPCommand(uint8_t* RequestHeader, -                          char* Command) -{ -	/* Returns true if the non null terminated string in RequestHeader matches the null terminated string Command */ -	return (strncmp((char*)RequestHeader, Command, strlen(Command)) == 0); -} - -/** Application callback routine, executed each time the TCP processing task runs. This callback determines what request - *  has been made (if any), and serves up appropriate responses. - * - *  \param[in] ConnectionState  Pointer to a TCP Connection State structure giving connection information - *  \param[in,out] Buffer       Pointer to the application's send/receive packet buffer - */ -void Webserver_ApplicationCallback(TCP_ConnectionState_t* const ConnectionState, -                                   TCP_ConnectionBuffer_t* const Buffer) -{ -	char*          BufferDataStr = (char*)Buffer->Data; -	static uint8_t PageBlock     = 0; - -	/* Check to see if a packet has been received on the HTTP port from a remote host */ -	if (TCP_APP_HAS_RECEIVED_PACKET(Buffer)) -	{ -		if (IsHTTPCommand(Buffer->Data, "GET")) -		{ -			if (IsHTTPCommand(Buffer->Data, "GET / ")) -			{ -				PageBlock = 0; - -				/* Copy the HTTP 200 response header into the packet buffer */ -				strcpy_P(BufferDataStr, HTTP200Header); - -				/* Send the buffer contents to the host */ -				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr)); - -				/* Lock the buffer to Device->Host transmissions only while we send the page contents */ -				TCP_APP_CAPTURE_BUFFER(Buffer); -			} -			else -			{ -				/* Copy the HTTP 404 response header into the packet buffer */ -				strcpy_P(BufferDataStr, HTTP404Header); - -				/* Send the buffer contents to the host */ -				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr)); - -				/* All data sent, close the connection */ -				TCP_APP_CLOSECONNECTION(ConnectionState); -			} -		} -		else if (IsHTTPCommand(Buffer->Data, "HEAD")) -		{ -			if (IsHTTPCommand(Buffer->Data, "HEAD / ")) -			{ -				/* Copy the HTTP response header into the packet buffer */ -				strcpy_P(BufferDataStr, HTTP200Header); - -				/* Send the buffer contents to the host */ -				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr)); -			} -			else -			{ -				/* Copy the HTTP response header into the packet buffer */ -				strcpy_P(BufferDataStr, HTTP404Header); - -				/* Send the buffer contents to the host */ -				TCP_APP_SEND_BUFFER(Buffer, strlen(BufferDataStr)); -			} - -			/* All data sent, close the connection */ -			TCP_APP_CLOSECONNECTION(ConnectionState); -		} -		else if (IsHTTPCommand(Buffer->Data, "TRACE")) -		{ -			/* Echo the host's query back to the host */ -			TCP_APP_SEND_BUFFER(Buffer, Buffer->Length); - -			/* All data sent, close the connection */ -			TCP_APP_CLOSECONNECTION(ConnectionState); -		} -		else -		{ -			/* Unknown request, just clear the buffer (drop the packet) */ -			TCP_APP_CLEAR_BUFFER(Buffer); -		} -	} -	else if (TCP_APP_HAVE_CAPTURED_BUFFER(Buffer)) -	{ -		uint16_t RemLength = strlen_P(&HTTPPage[PageBlock * HTTP_REPLY_BLOCK_SIZE]); -		uint16_t Length; - -		/* Determine the length of the loaded block */ -		Length = MIN(RemLength, HTTP_REPLY_BLOCK_SIZE); - -		/* Copy the next buffer sized block of the page to the packet buffer */ -		strncpy_P(BufferDataStr, &HTTPPage[PageBlock * HTTP_REPLY_BLOCK_SIZE], Length); - -		/* Send the buffer contents to the host */ -		TCP_APP_SEND_BUFFER(Buffer, Length); - -		/* Check to see if the entire page has been sent */ -		if (PageBlock++ == (sizeof(HTTPPage) / HTTP_REPLY_BLOCK_SIZE)) -		{ -			/* Unlock the buffer so that the host can fill it with future packets */ -			TCP_APP_RELEASE_BUFFER(Buffer); - -			/* Close the connection to the host */ -			TCP_APP_CLOSECONNECTION(ConnectionState); -		} -	} -} - diff --git a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.h b/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.h deleted file mode 100644 index a73bd33384..0000000000 --- a/lib/lufa/Demos/Device/LowLevel/RNDISEthernet/Lib/Webserver.h +++ /dev/null @@ -1,57 +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 Webserver.c. - */ - -#ifndef _WEBSERVER_H_ -#define _WEBSERVER_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <avr/pgmspace.h> - -		#include <LUFA/Version.h> - -		#include "TCP.h" - -	/* Macros: */ -		/** Maximum size of a HTTP response per transmission */ -		#define  HTTP_REPLY_BLOCK_SIZE     128 - -	/* Function Prototypes: */ -		void Webserver_Init(void); -		void Webserver_ApplicationCallback(TCP_ConnectionState_t* const ConnectionState, -		                                   TCP_ConnectionBuffer_t* const Buffer); - -#endif - | 
