* level. If an application produces a response, this task constructs the appropriate Ethernet frame and places it into the Ethernet OUT\r
* buffer for later transmission.\r
*/\r
-void TCP_TCPTask(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo)\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->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->FrameOUT.FrameData;\r
- IP_Header_t* IPHeaderOUT = (IP_Header_t*)&RNDISInterfaceInfo->FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t)];\r
- TCP_Header_t* TCPHeaderOUT = (TCP_Header_t*)&RNDISInterfaceInfo->FrameOUT.FrameData[sizeof(Ethernet_Frame_Header_t) +\r
- sizeof(IP_Header_t)]; \r
- void* TCPDataOUT = &RNDISInterfaceInfo->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->FrameOUT.FrameLength = PacketSize;\r
- RNDISInterfaceInfo->FrameOUT.FrameInBuffer = true;\r
+ FrameOUT->FrameLength = PacketSize;\r
+ FrameOUT->FrameInBuffer = true;\r
\r
ConnectionStateTable[CSTableEntry].Info.Buffer.Ready = false;\r
\r
\r
/** Sets the state and callback handler of the given port, specified in big endian to the given state.\r
*\r
- * \param Port Port whose state and callback function to set, specified in big endian\r
- * \param State New state of the port, a value from the TCP_PortStates_t enum\r
- * \param Handler Application callback handler for the port\r
+ * \param[in] Port Port whose state and callback function to set, specified in big endian\r
+ * \param[in] State New state of the port, a value from the TCP_PortStates_t enum\r
+ * \param[in] Handler Application callback handler for the port\r
*\r
* \return Boolean true if the port state was set, false otherwise (no more space in the port state table)\r
*/\r
\r
/** Retrieves the current state of a given TCP port, specified in big endian.\r
*\r
- * \param Port TCP port whose state is to be retrieved, given in big-endian\r
+ * \param[in] Port TCP port whose state is to be retrieved, given in big-endian\r
*\r
* \return A value from the TCP_PortStates_t enum\r
*/\r
/** Sets the connection state of the given port, remote address and remote port to the given TCP connection state. If the\r
* connection exists in the connection state table it is updated, otherwise it is created if possible.\r
*\r
- * \param Port TCP port of the connection on the device, specified in big endian\r
- * \param RemoteAddress Remote protocol IP address of the connected device\r
- * \param RemotePort TCP port of the remote device in the connection, specified in big endian\r
- * \param State TCP connection state, a value from the TCP_ConnectionStates_t enum\r
+ * \param[in] Port TCP port of the connection on the device, specified in big endian\r
+ * \param[in] RemoteAddress Remote protocol IP address of the connected device\r
+ * \param[in] RemotePort TCP port of the remote device in the connection, specified in big endian\r
+ * \param[in] State TCP connection state, a value from the TCP_ConnectionStates_t enum\r
*\r
* \return Boolean true if the connection was updated or created, false otherwise (no more space in the connection state table)\r
*/\r
\r
/** Retrieves the current state of a given TCP connection to a host.\r
*\r
- * \param Port TCP port on the device in the connection, specified in big endian\r
- * \param RemoteAddress Remote protocol IP address of the connected host\r
- * \param RemotePort Remote TCP port of the connected host, specified in big endian\r
+ * \param[in] Port TCP port on the device in the connection, specified in big endian\r
+ * \param[in] RemoteAddress Remote protocol IP address of the connected host\r
+ * \param[in] RemotePort Remote TCP port of the connected host, specified in big endian\r
*\r
* \return A value from the TCP_ConnectionStates_t enum\r
*/\r
\r
/** Retrieves the connection info structure of a given connection to a host.\r
*\r
- * \param Port TCP port on the device in the connection, specified in big endian\r
- * \param RemoteAddress Remote protocol IP address of the connected host\r
- * \param RemotePort Remote TCP port of the connected host, specified in big endian\r
+ * \param[in] Port TCP port on the device in the connection, specified in big endian\r
+ * \param[in] RemoteAddress Remote protocol IP address of the connected host\r
+ * \param[in] RemotePort Remote TCP port of the connected host, specified in big endian\r
*\r
* \return ConnectionInfo structure of the connection if found, NULL otherwise\r
*/\r
/** Processes a TCP packet inside an Ethernet frame, and writes the appropriate response\r
* to the output Ethernet frame if one is created by a application handler.\r
*\r
- * \param IPHeaderInStart Pointer to the start of the incoming packet's IP header\r
- * \param TCPHeaderInStart Pointer to the start of the incoming packet's TCP header\r
- * \param TCPHeaderOutStart Pointer to the start of the outgoing packet's TCP header\r
+ * \param[in] IPHeaderInStart Pointer to the start of the incoming packet's IP header\r
+ * \param[in] TCPHeaderInStart Pointer to the start of the incoming packet's TCP header\r
+ * \param[out] TCPHeaderOutStart Pointer to the start of the outgoing packet's TCP header\r
*\r
* \return The number of bytes written to the out Ethernet frame if any, NO_RESPONSE if no\r
* response was generated, NO_PROCESS if the packet processing was deferred until the\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
case TCP_Connection_Listen:\r
if (TCPHeaderIN->Flags == TCP_FLAG_SYN)\r
{\r
- /* SYN connection when closed starts a connection with a peer */\r
+ /* SYN connection starts a connection with a peer */\r
+ if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,\r
+ TCPHeaderIN->SourcePort, TCP_Connection_SYNReceived))\r
+ {\r
+ TCPHeaderOUT->Flags = (TCP_FLAG_SYN | TCP_FLAG_ACK); \r
\r
- TCPHeaderOUT->Flags = (TCP_FLAG_SYN | TCP_FLAG_ACK); \r
- PacketResponse = true;\r
- \r
- TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort,\r
- TCP_Connection_SYNReceived);\r
- \r
- ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort);\r
+ ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort);\r
\r
- ConnectionInfo->SequenceNumberIn = (SwapEndian_32(TCPHeaderIN->SequenceNumber) + 1);\r
- ConnectionInfo->SequenceNumberOut = 0;\r
- ConnectionInfo->Buffer.InUse = false;\r
+ ConnectionInfo->SequenceNumberIn = (SwapEndian_32(TCPHeaderIN->SequenceNumber) + 1);\r
+ ConnectionInfo->SequenceNumberOut = 0;\r
+ ConnectionInfo->Buffer.InUse = false;\r
+ }\r
+ else\r
+ {\r
+ TCPHeaderOUT->Flags = TCP_FLAG_RST;\r
+ }\r
+ \r
+ PacketResponse = true;\r
}\r
\r
break;\r
/** Calculates the appropriate TCP checksum, consisting of the addition of the one's compliment of each word,\r
* complimented.\r
*\r
- * \param TCPHeaderOutStart Pointer to the start of the packet's outgoing TCP header\r
- * \param SourceAddress Source protocol IP address of the outgoing IP header\r
- * \param DestinationAddress DestinationAddress protocol IP address of the outgoing IP header\r
- * \param 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