Oops: Really disable building of Projects/Host/ClassDriver directory in the Projects...
[pub/USBasp.git] / Demos / Device / ClassDriver / RNDISEthernet / Lib / TCP.c
index 6746433..2a626e9 100644 (file)
@@ -58,25 +58,27 @@ TCP_ConnectionState_t  ConnectionStateTable[MAX_TCP_CONNECTIONS];
  */\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
@@ -86,13 +88,13 @@ void TCP_TCPTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
                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
@@ -145,8 +147,8 @@ void TCP_TCPTask(USB_ClassInfo_RNDIS_Device_t* RNDISInterfaceInfo)
                        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
@@ -367,11 +369,12 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, void* TCPHeaderInStart, void
                /* 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
@@ -381,19 +384,24 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart, void* TCPHeaderInStart, void
                                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