A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.
Dependents: oldheating gps motorhome heating
Diff: tcp/tcb.c
- Revision:
- 61:aad055f1b0d1
- Parent:
- 57:e0fb648acf48
- Child:
- 65:37acccf2752f
diff -r 1d8c7a1e7483 -r aad055f1b0d1 tcp/tcb.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcp/tcb.c Thu Jan 11 17:38:21 2018 +0000 @@ -0,0 +1,75 @@ +#include <stdint.h> + +#include "log.h" +#include "tcp.h" +#include "tcb.h" +#include "clock.h" + +#define TCB_COUNT 10 + +#define TIMEOUT_SYN_RECEIVED 2 +#define TIMEOUT_ESTABLISHED 20 +#define TIMEOUT_CLOSING 2 + +struct tcb tcbs[TCB_COUNT]; + +uint32_t TcbGetIsn() +{ + static uint32_t isn = 0; + isn += 100000; //Gives each tcb 100,000 packets and won't repeat before 42,940 tcbs. + return isn; +} +struct tcb* TcbGetExisting(uint16_t port) +{ + for (int i = 0; i < TCB_COUNT; i++) + { + struct tcb* pTcb = tcbs + i; + if (pTcb->state != TCB_EMPTY && pTcb->port == port) return pTcb; + } + return NULL; +} +struct tcb* TcbGetEmpty() +{ + for (int i = 0; i < TCB_COUNT; i++) + { + struct tcb* pTcb = tcbs + i; + if (pTcb->state == TCB_EMPTY) return pTcb; + } + return NULL; +} + +uint32_t TcbElapsed = 0; +static void reap() +{ + static struct tcb* pTcb = tcbs; + + if (pTcb->state == TCB_EMPTY) return; + + uint32_t limit; + switch (pTcb->state) + { + case TCB_SYN_RECEIVED: limit = TIMEOUT_SYN_RECEIVED; break; + case TCB_ESTABLISHED: limit = TIMEOUT_ESTABLISHED; break; + case TCB_FIN_WAIT: limit = TIMEOUT_CLOSING; break; + case TCB_ACK_WAIT: limit = TIMEOUT_CLOSING; break; + } + + if (TcbElapsed - pTcb->elapsed > limit) + { + if (TcpTrace) LogTimeF("Reaping TCB %d port %d\r\n", pTcb - tcbs, pTcb->port); + pTcb->state = TCB_EMPTY; + } + + pTcb++; + if (pTcb >= tcbs + TCB_COUNT) pTcb = tcbs; +} + +void TcbMain() +{ + if (ClockTicked) TcbElapsed++; + reap(); +} +void TcbInit() +{ + for (int i = 0; i < TCB_COUNT; i++) tcbs[i].state = TCB_EMPTY; +}