Revert change to Template_Endpoint_Control_R.c, which broke control stream reads.
Remove uneeded ADC.h include in the class driver AudioOutput demo.
#include <LUFA/Version.h>\r
#include <LUFA/Drivers/Board/LEDs.h>\r
#include <LUFA/Drivers/Board/Joystick.h>\r
- #include <LUFA/Drivers/Peripheral/ADC.h>\r
#include <LUFA/Drivers/USB/USB.h>\r
#include <LUFA/Drivers/USB/Class/Audio.h>\r
\r
*/\r
void Ethernet_ProcessPacket(Ethernet_Frame_Info_t* FrameIN, Ethernet_Frame_Info_t* FrameOUT)\r
{\r
- DecodeEthernetFrameHeader(FrameIN->FrameData);\r
+ DecodeEthernetFrameHeader(FrameIN);\r
\r
/* Cast the incoming Ethernet frame to the Ethernet header type */\r
Ethernet_Frame_Header_t* FrameINHeader = (Ethernet_Frame_Header_t*)&FrameIN->FrameData;\r
\r
/* Ensure frame is addressed to either all (broadcast) or the virtual webserver, and is a type II frame */\r
if ((MAC_COMPARE(&FrameINHeader->Destination, &ServerMACAddress) ||\r
- MAC_COMPARE(&FrameINHeader->Destination, &BroadcastMACAddress)))\r
+ MAC_COMPARE(&FrameINHeader->Destination, &BroadcastMACAddress)) &&\r
+ (SwapEndian_16(FrameIN->FrameLength) > ETHERNET_VER2_MINSIZE))\r
{\r
/* Process the packet depending on its protocol */\r
switch (SwapEndian_16(FrameINHeader->EtherType))\r
\r
/* Macros: */\r
/** Physical MAC address of the USB RNDIS network adapter */\r
- #define ADAPTER_MAC_ADDRESS {0x00, 0x02, 0x00, 0x02, 0x00, 0x02} \r
+ #define ADAPTER_MAC_ADDRESS {0x02, 0x00, 0x02, 0x00, 0x02, 0x00}\r
\r
/** Physical MAC address of the virtual server on the network */\r
#define SERVER_MAC_ADDRESS {0x00, 0x01, 0x00, 0x01, 0x00, 0x01} \r
*/\r
#define MAC_COMPARE(MAC1, MAC2) (memcmp(MAC1, MAC2, sizeof(MAC_Address_t)) == 0)\r
\r
+ /** Minimum size of an Ethernet packet in bytes, to conform to the Ethernet V2 packet standard */\r
+ #define ETHERNET_VER2_MINSIZE 0x0600\r
+\r
/** Return value for all sub protocol handling routines, indicating that no response packet has been generated */\r
#define NO_RESPONSE 0 \r
\r
*\r
* \param[in] InDataStart Pointer to the start of an Ethernet frame header\r
*/\r
-void DecodeEthernetFrameHeader(void* InDataStart)\r
+void DecodeEthernetFrameHeader(Ethernet_Frame_Info_t* FrameINData)\r
{\r
#if !defined(NO_DECODE_ETHERNET)\r
- Ethernet_Frame_Header_t* FrameHeader = (Ethernet_Frame_Header_t*)InDataStart;\r
+ Ethernet_Frame_Header_t* FrameHeader = (Ethernet_Frame_Header_t*)FrameINData->FrameData;\r
\r
printf_P(PSTR("\r\n"));\r
\r
printf_P(PSTR(" ETHERNET\r\n"));\r
- printf_P(PSTR(" + Frame Size: %u\r\n"), FrameIN.FrameLength);\r
+ printf_P(PSTR(" + Frame Size: %u\r\n"), FrameINData->FrameLength);\r
\r
if (!(MAC_COMPARE(&FrameHeader->Destination, &ServerMACAddress)) &&\r
!(MAC_COMPARE(&FrameHeader->Destination, &BroadcastMACAddress)))\r
FrameHeader->Destination.Octets[4],\r
FrameHeader->Destination.Octets[5]);\r
\r
- if (SwapEndian_16(FrameIN.FrameLength) > ETHERNET_VER2_MINSIZE)\r
+ if (SwapEndian_16(FrameINData->FrameLength) > ETHERNET_VER2_MINSIZE)\r
printf_P(PSTR(" + Protocol: 0x%04x\r\n"), SwapEndian_16(FrameHeader->EtherType));\r
else\r
printf_P(PSTR(" + Protocol: UNKNOWN E1\r\n"));\r
/* Includes: */\r
#include <avr/io.h>\r
\r
+ #include <LUFA/Drivers/USB/Class/RNDIS.h>\r
#include <LUFA/Drivers/Peripheral/SerialStream.h>\r
\r
#include "EthernetProtocols.h"\r
#include "Ethernet.h"\r
\r
/* Function Prototypes: */\r
- void DecodeEthernetFrameHeader(void* InDataStart);\r
+ void DecodeEthernetFrameHeader(Ethernet_Frame_Info_t* FrameINData);\r
void DecodeARPHeader(void* InDataStart);\r
void DecodeIPHeader(void* InDataStart);\r
void DecodeICMPHeader(void* InDataStart);\r
*/\r
void TCP_TCPTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)\r
{\r
- /* Task to hand off TCP packets to and from the listening applications. */\r
-\r
/* Run each application in sequence, to process incoming and generate outgoing packets */\r
for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++)\r
{\r
/* Find the corresponding port entry in the port table */\r
- for (uint8_t PTableEntry = 0; PTableEntry < MAX_TCP_CONNECTIONS; PTableEntry++)\r
+ for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++)\r
{\r
/* Run the application handler for the port */\r
if ((PortStateTable[PTableEntry].Port == ConnectionStateTable[CSTableEntry].Port) && \r
(PortStateTable[PTableEntry].State == TCP_Port_Open))\r
{\r
- PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry], &ConnectionStateTable[CSTableEntry].Info.Buffer);\r
+ PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry],\r
+ &ConnectionStateTable[CSTableEntry].Info.Buffer);\r
}\r
}\r
}\r
\r
+ /* Get pointer to the output frame info struct for convenience */\r
+ Ethernet_Frame_Info_t* FrameOUT = (Ethernet_Frame_Info_t*)&RNDISInterfaceInfo->State.FrameOUT;\r
+ \r
/* Bail out early if there is already a frame waiting to be sent in the Ethernet OUT buffer */\r
- if (RNDISInterfaceInfo->State.FrameOUT.FrameInBuffer)\r
+ if (FrameOUT->FrameInBuffer)\r
return;\r
\r
/* Send response packets from each application as the TCP packet buffers are filled by the applications */\r
if ((ConnectionStateTable[CSTableEntry].Info.Buffer.Direction == TCP_PACKETDIR_OUT) &&\r
(ConnectionStateTable[CSTableEntry].Info.Buffer.Ready))\r
{\r
- Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&RNDISInterfaceInfo->State.FrameOUT.FrameData;\r
- IP_Header_t* IPHeaderOUT = (IP_Header_t*)&RNDISInterfaceInfo->State.FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)];\r
- TCP_Header_t* TCPHeaderOUT = (TCP_Header_t*)&RNDISInterfaceInfo->State.FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +\r
- sizeof(IP_Header_t)]; \r
- void* TCPDataOUT = &RNDISInterfaceInfo->State.FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +\r
- sizeof(IP_Header_t) +\r
- sizeof(TCP_Header_t)];\r
+ Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&FrameOUT->FrameData;\r
+ IP_Header_t* IPHeaderOUT = (IP_Header_t*)&FrameOUT->FrameData[sizeof(Ethernet_Frame_Header_t)];\r
+ TCP_Header_t* TCPHeaderOUT = (TCP_Header_t*)&FrameOUT->FrameData[sizeof(Ethernet_Frame_Header_t) +\r
+ sizeof(IP_Header_t)];\r
+ void* TCPDataOUT = &FrameOUT->FrameData[sizeof(Ethernet_Frame_Header_t) +\r
+ sizeof(IP_Header_t) +\r
+ sizeof(TCP_Header_t)];\r
\r
uint16_t PacketSize = ConnectionStateTable[CSTableEntry].Info.Buffer.Length;\r
\r
PacketSize += sizeof(Ethernet_Frame_Header_t);\r
\r
/* Set the response length in the buffer and indicate that a response is ready to be sent */\r
- RNDISInterfaceInfo->State.FrameOUT.FrameLength = PacketSize;\r
- RNDISInterfaceInfo->State.FrameOUT.FrameInBuffer = true;\r
+ FrameOUT->FrameLength = PacketSize;\r
+ FrameOUT->FrameInBuffer = true;\r
\r
ConnectionStateTable[CSTableEntry].Info.Buffer.Ready = false;\r
\r
/* Detect RST from host to abort existing connection */\r
if (TCPHeaderIN->Flags & TCP_FLAG_RST)\r
{\r
- TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK); \r
- PacketResponse = true;\r
- \r
- TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,\r
- TCPHeaderIN->SourcePort, TCP_Connection_Closed); \r
+ if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,\r
+ TCPHeaderIN->SourcePort, TCP_Connection_Closed))\r
+ {\r
+ TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK); \r
+ PacketResponse = true; \r
+ }\r
}\r
else\r
{\r
\r
DecodeUDPHeader(UDPHeaderInStart);\r
\r
- /* Check to see if the UDP packet is a DHCP packet */\r
- if (SwapEndian_16(UDPHeaderIN->DestinationPort) == UDP_PORT_DHCP_REQUEST)\r
+ switch (SwapEndian_16(UDPHeaderIN->DestinationPort))\r
{\r
- RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,\r
- &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],\r
- &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);\r
+ case UDP_PORT_DHCP_REQUEST:\r
+ RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,\r
+ &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],\r
+ &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);\r
+ break;\r
}\r
\r
/* Check to see if the protocol processing routine has filled out a response */\r
#include "EthernetProtocols.h"\r
#include "Ethernet.h"\r
#include "ProtocolDecoders.h"\r
+ #include "DHCP.h"\r
\r
/* Macros: */\r
/** Source UDP port for a DHCP request */\r
\r
/** Destination UDP port for a DHCP reply */\r
#define UDP_PORT_DHCP_REPLY 68\r
- \r
+\r
/* Type Defines: */\r
/** Type define for a UDP packet header */\r
typedef struct\r
\r
# Place -D or -U options here for C sources\r
CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) $(LUFA_OPTS)\r
-CDEFS += -DNO_DECODE_ETHERNET -DNO_DECODE_ARP -DNO_DECODE_ICMP -DNO_DECODE_IP -DNO_DECODE_TCP -DNO_DECODE_UDP -DNO_DECODE_DHCP\r
+CDEFS += -DNO_DECODE_ETHERNET -DNO_DECODE_ARP -DNO_DECODE_ICMP\r
+CDEFS += -DNO_DECODE_IP -DNO_DECODE_TCP -DNO_DECODE_UDP -DNO_DECODE_DHCP -DNO_DECODE_DNS\r
\r
\r
# Place -D or -U options here for ASM sources\r
#include "IP.h"\r
\r
/* Macros: */\r
+ /** Physical MAC address of the USB RNDIS network adapter */\r
+ #define ADAPTER_MAC_ADDRESS {0x02, 0x00, 0x02, 0x00, 0x02, 0x00}\r
+ \r
/** Physical MAC address of the virtual server on the network */\r
#define SERVER_MAC_ADDRESS {0x00, 0x01, 0x00, 0x01, 0x00, 0x01} \r
\r
\r
DHCPOptions += ((DHCPOptions[0] == DHCP_OPTION_PAD) ? 1 : (DHCPOptions[1] + 2));\r
}\r
-\r
#endif\r
}\r
#include "Ethernet.h"\r
\r
/* Macros: */\r
- /** Physical MAC Address of the USB network adapter */\r
- #define ADAPTER_MAC_ADDRESS {0x02, 0x00, 0x02, 0x00, 0x02, 0x00}\r
- \r
/** Implemented RNDIS Version Major */\r
#define REMOTE_NDIS_VERSION_MAJOR 0x01\r
\r
*/\r
void TCP_Task(void)\r
{\r
- /* Task to hand off TCP packets to and from the listening applications. */\r
-\r
/* Run each application in sequence, to process incoming and generate outgoing packets */\r
for (uint8_t CSTableEntry = 0; CSTableEntry < MAX_TCP_CONNECTIONS; CSTableEntry++)\r
{\r
/* Find the corresponding port entry in the port table */\r
- for (uint8_t PTableEntry = 0; PTableEntry < MAX_TCP_CONNECTIONS; PTableEntry++)\r
+ for (uint8_t PTableEntry = 0; PTableEntry < MAX_OPEN_TCP_PORTS; PTableEntry++)\r
{\r
/* Run the application handler for the port */\r
if ((PortStateTable[PTableEntry].Port == ConnectionStateTable[CSTableEntry].Port) && \r
(PortStateTable[PTableEntry].State == TCP_Port_Open))\r
{\r
- PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry], &ConnectionStateTable[CSTableEntry].Info.Buffer);\r
+ PortStateTable[PTableEntry].ApplicationHandler(&ConnectionStateTable[CSTableEntry],\r
+ &ConnectionStateTable[CSTableEntry].Info.Buffer);\r
}\r
}\r
}\r
Ethernet_Frame_Header_t* FrameOUTHeader = (Ethernet_Frame_Header_t*)&FrameOUT.FrameData;\r
IP_Header_t* IPHeaderOUT = (IP_Header_t*)&FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)];\r
TCP_Header_t* TCPHeaderOUT = (TCP_Header_t*)&FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +\r
- sizeof(IP_Header_t)]; \r
+ sizeof(IP_Header_t)];\r
void* TCPDataOUT = &FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +\r
sizeof(IP_Header_t) +\r
sizeof(TCP_Header_t)];\r
/* Detect RST from host to abort existing connection */\r
if (TCPHeaderIN->Flags & TCP_FLAG_RST)\r
{\r
- TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK); \r
- PacketResponse = true;\r
- \r
- TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,\r
- TCPHeaderIN->SourcePort, TCP_Connection_Closed); \r
+ if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,\r
+ TCPHeaderIN->SourcePort, TCP_Connection_Closed))\r
+ {\r
+ TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK); \r
+ PacketResponse = true; \r
+ }\r
}\r
else\r
{\r
/** Calculates the appropriate TCP checksum, consisting of the addition of the one's compliment of each word,\r
* complimented.\r
*\r
- * \param[in] TCPHeaderOutStart Pointer to the start of the packet's outgoing TCP header\r
- * \param[in] SourceAddress Source protocol IP address of the outgoing IP header\r
- * \param[in] DestinationAddress Destination protocol IP address of the outgoing IP header\r
- * \param[in] TCPOutSize Size in bytes of the TCP data header and payload\r
+ * \param[in] TCPHeaderOutStart Pointer to the start of the packet's outgoing TCP header\r
+ * \param[in] SourceAddress Source protocol IP address of the outgoing IP header\r
+ * \param[in] DestinationAddress Destination protocol IP address of the outgoing IP header\r
+ * \param[in] TCPOutSize Size in bytes of the TCP data header and payload\r
*\r
* \return A 16-bit TCP checksum value\r
*/\r
\r
DecodeUDPHeader(UDPHeaderInStart);\r
\r
- /* Check to see if the UDP packet is a DHCP packet */\r
- if (SwapEndian_16(UDPHeaderIN->DestinationPort) == UDP_PORT_DHCP_REQUEST)\r
+ switch (SwapEndian_16(UDPHeaderIN->DestinationPort))\r
{\r
- RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,\r
- &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],\r
- &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);\r
+ case UDP_PORT_DHCP_REQUEST:\r
+ RetSize = DHCP_ProcessDHCPPacket(IPHeaderInStart,\r
+ &((uint8_t*)UDPHeaderInStart)[sizeof(UDP_Header_t)],\r
+ &((uint8_t*)UDPHeaderOutStart)[sizeof(UDP_Header_t)]);\r
+ break;\r
}\r
\r
/* Check to see if the protocol processing routine has filled out a response */\r
#include "EthernetProtocols.h"\r
#include "Ethernet.h"\r
#include "ProtocolDecoders.h"\r
+ #include "DHCP.h"\r
\r
/* Macros: */\r
/** Source UDP port for a DHCP request */\r
\r
/** Destination UDP port for a DHCP reply */\r
#define UDP_PORT_DHCP_REPLY 68\r
- \r
+\r
+ /** Source UDP port for a DNS request/response */\r
+ #define UDP_PORT_DNS 53\r
+\r
/* Type Defines: */\r
/** Type define for a UDP packet header */\r
typedef struct\r
uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length)\r
{\r
- uint8_t* DataStream = (uint8_t*)(Buffer + TEMPLATE_BUFFER_OFFSET(Length));\r
- bool LastPacketFull = false;\r
+ uint8_t* DataStream = (uint8_t*)(Buffer + TEMPLATE_BUFFER_OFFSET(Length));\r
\r
- if (Length > USB_ControlRequest.wLength)\r
- Length = USB_ControlRequest.wLength;\r
-\r
- while (Length || LastPacketFull)\r
+ while (Length)\r
{\r
if (Endpoint_IsSETUPReceived())\r
return ENDPOINT_RWCSTREAM_HostAborted;\r
\r
if (Endpoint_IsOUTReceived())\r
{\r
- LastPacketFull = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);\r
- \r
while (Length && Endpoint_BytesInEndpoint())\r
{\r
TEMPLATE_TRANSFER_BYTE(DataStream);\r
}\r
\r
Endpoint_ClearOUT();\r
- \r
- if (!(LastPacketFull))\r
- Length = 0;\r
} \r
}\r
\r