Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: oldheating gps motorhome heating
Diff: tcp/tcp.cpp
- Revision:
- 52:fbc5a46b5e16
- Parent:
- 49:1a6336f2b3f9
- Child:
- 54:84ef2b29cf7e
--- 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)
{