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
tcp/tcb.c
- Committer:
- andrewboyson
- Date:
- 2018-10-29
- Revision:
- 74:c3756bfa960e
- Parent:
- 66:18a10c0b6d93
- Child:
- 78:9d8fc88df405
File content as of revision 74:c3756bfa960e:
#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->remPort == 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; } struct tcb* TcbGetNext() { static struct tcb* pTcbNext = tcbs; struct tcb* pTcbThis = pTcbNext++; if (pTcbNext >= tcbs + TCB_COUNT) pTcbNext = tcbs; return pTcbThis; } 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_CLOSE_FIN_WAIT: limit = TIMEOUT_CLOSING; break; case TCB_CLOSE_ACK_WAIT: limit = TIMEOUT_CLOSING; break; } if (TcbElapsed - pTcb->lastSendTime > limit) { if (TcpTrace) LogTimeF("Reaping TCB %d port %d\r\n", pTcb - tcbs, pTcb->remPort); 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; }