Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
52:fbc5a46b5e16
Parent:
49:1a6336f2b3f9
Child:
54:84ef2b29cf7e
diff -r 007bd938f2c3 -r fbc5a46b5e16 tcp/tcp.cpp
--- a/tcp/tcp.cpp	Fri Nov 03 18:14:06 2017 +0000
+++ b/tcp/tcp.cpp	Wed Nov 08 20:46:36 2017 +0000
@@ -10,6 +10,8 @@
 
 #define MAX_MSS 536 //This is 576 - 20 - 20
 
+bool TcpTrace = false;
+
 __packed struct header
 {
     uint16_t srcPort;
@@ -23,20 +25,6 @@
     uint16_t urgent;
 };
 
-uint32_t now = 0;
-static void ticked()
-{
-    now++;
-    TcbReap(now);
-}
-static Ticker ticker;
-
-void TcpInit()
-{
-    ticker.attach(&ticked, 1);
-    TcbInit();
-}
-
 //Header variables
     
 static    uint16_t    srcPort;
@@ -61,7 +49,15 @@
 static    void*    pData;
 static    int      dataLength;
 static    uint16_t mss;
-
+static void logFlags()
+{
+    if (URG) Log(" URG");
+    if (ACK) Log(" ACK");
+    if (PSH) Log(" PSH");
+    if (RST) Log(" RST");
+    if (SYN) Log(" SYN");
+    if (FIN) Log(" FIN");
+}
 void TcpLogHeader(uint16_t calculatedChecksum)
 {
     if (NetTraceVerbose)
@@ -72,14 +68,7 @@
         LogF("  Sequence number  %u\r\n",    seqnum);
         LogF("  Ack number       %u\r\n",    acknum);
         LogF("  Header size      %u\r\n",    headersize);
-        LogF("  Flags            %02X",      flags);
-        if (URG) LogF("    URG");
-        if (ACK) LogF("    ACK");
-        if (PSH) LogF("    PSH");
-        if (RST) LogF("    RST");
-        if (SYN) LogF("    SYN");
-        if (FIN) LogF("    FIN");
-        LogF("\r\n");
+        Log ("  Flags           "); logFlags(); Log("\r\n");
         LogF("  Window           %hu\r\n",   window);
         LogF("  Checksum (hex)   %04hX\r\n", checksum);
         LogF("  Calculated (hex) %04hX\r\n", calculatedChecksum);
@@ -90,13 +79,8 @@
     else
     {
         LogF("TCP   header %hu >>> %hu", srcPort, dstPort);
-        if (URG) Log(" URG");
-        if (ACK) Log(" ACK");
-        if (PSH) Log(" PSH");
-        if (RST) Log(" RST");
-        if (SYN) Log(" SYN");
-        if (FIN) Log(" FIN");
-        LogF("\r\n");
+        logFlags();
+        Log("\r\n");
     }
 }
 void TcpAddChecksum(void* pPacket, uint16_t checksum)
@@ -201,15 +185,14 @@
     }
     
     readOptions();                 //Get the MSS
-    pTcb->mss    = mss;
-    
-    pTcb->state  = TCB_SYN_RECEIVED;
-    pTcb->timer  = now;
-    pTcb->port   = srcPort;
-    pTcb->locIsn = TcbGetIsn();
-    pTcb->locSeq = pTcb->locIsn;  
-    pTcb->remIsn = seqnum;
-    pTcb->remSeq = pTcb->remIsn;
+    pTcb->mss     = mss;
+    pTcb->state   = TCB_SYN_RECEIVED;
+    pTcb->elapsed = TcbElapsed;
+    pTcb->port    = srcPort;
+    pTcb->locIsn  = TcbGetIsn();
+    pTcb->locSeq  = pTcb->locIsn;  
+    pTcb->remIsn  = seqnum;
+    pTcb->remSeq  = pTcb->remIsn;
     
     pTcb->remSeq += 1;             //Add one to acknowledge the SYN
     acknum = pTcb->remSeq;
@@ -236,9 +219,9 @@
     if (dataLength) LogTimeF("%d bytes data received before TCB established\r\n", dataLength);
     if (ACK)
     {
-        pTcb->state = TCB_ESTABLISHED;
-        pTcb->timer = now;
-        pTcb->tag = 0;
+        pTcb->state   = TCB_ESTABLISHED;
+        pTcb->elapsed = TcbElapsed;
+        pTcb->tag     = 0;
     }
     return 0;
 }
@@ -278,7 +261,7 @@
         pTcb->state = TCB_CLOSING;  //Start closing
     }
 
-    pTcb->timer = now;
+    pTcb->elapsed = TcbElapsed;
     return 1;
 }
 static int stateClosing(struct tcb* pTcb)
@@ -309,7 +292,15 @@
 {
     struct tcb* pTcb = TcbGetExisting(srcPort);
     if (!pTcb)  pTcb = TcbGetEmpty();
-    if (!pTcb) return DO_NOTHING; //Bomb out if no more tcbs are available
+    if (!pTcb)
+    {
+        if (TcpTrace)
+        {
+            LogTime("TCP no more tcbs are available\r\n");
+            traceback(); //This will already include the TCP header
+        }
+        return DO_NOTHING; //Bomb out if no more tcbs are available
+    }
 
     if (RST)
     {
@@ -317,18 +308,40 @@
         return DO_NOTHING;         //Bomb out
     }
 
+    //Filter out unwanted links
     switch (dstPort)
     {
         case 80: break;
-        default: return DO_NOTHING; //This needs to become a reset
+        default:
+            if (TcpTrace)
+            {
+                LogTimeF("TCP unknown port %d\r\n", dstPort);
+                traceback(); //This will already include the TCP header
+            }
+            return DO_NOTHING; //This needs to become a reset
     }
     
+    if (TcpTrace)
+    {
+        if (!SYN && (int32_t)(seqnum - pTcb->remSeq))
+        {
+            LogTime("TCP");
+            logFlags();
+            LogF(" off=%d seq num=%u expected=%u packet length %d from port %u\r\n", (int32_t)(seqnum - pTcb->remSeq), seqnum, pTcb->remSeq, *pSize, srcPort);
+        }
+    }
     //Drop duplicate packets
-    //if (!TCB_CLOSED && (int32_t)(seqnum - pTcb->remSeq) < 0)
-    //{
-    //    LogTimeF("Dropped duplicate seq num=%d expected=%d packet length %d from port %u\r\n", seqnum, pTcb->remSeq, size, srcPort);
-    //    return IP4_DO_NOTHING;
-    //}
+    /*
+    if (!TCB_CLOSED && (int32_t)(seqnum - pTcb->remSeq) < 0)
+    {
+        if (TcpTrace)
+        {
+            LogTimeF("TCP Dropped duplicate seq num=%d expected=%d packet length %d from port %u\r\n", seqnum, pTcb->remSeq, *pSize, srcPort);
+            traceback();
+        }
+        return DO_NOTHING;
+    }
+    */
 
     switch (pTcb->state)
     {